Category: Angular

  • Implementación efectiva de Angular Aria para accesibilidad en UI

    Implementación efectiva de Angular Aria para accesibilidad en UI

    Angular Aria — nueva librería de accesibilidad

    Tiempo estimado de lectura: 4 min

    • Ideas clave:
    • Angular Aria ofrece primitivas “headless” que implementan patrones APG para teclado, foco y lectores de pantalla.
    • Diferencia con Material y CDK: Material provee UI completa, CDK utilidades low‑level, Aria patrones sin estilo.
    • Beneficios: reduce deuda técnica, mejora consistencia y facilita cumplimiento de auditorías WCAG.
    • Riesgos: API inicial puede cambiar; requiere disciplina de integración con el Design System.

    Introducción

    Angular Aria — nueva librería de accesibilidad llega para resolver lo que suele hacerse mal una y otra vez: la lógica de interacción accesible. En las primeras líneas: no es un tema de añadir atributos; es una capa de comportamiento (gestión de foco, navegación por teclado, anuncios a lectores de pantalla) que ahora Angular ofrece como primitivas headless, complementando Angular Material y el CDK.

    Resumen rápido (lectores con prisa)

    Qué es: Colección de patrones UI headless que implementan prácticas APG para accesibilidad.

    Cuándo usarlo: Cuando necesitas control visual propio y comportamiento accesible consistente.

    Por qué importa: Reduce errores de interacción al estandarizar foco, teclado y anuncios a lectores de pantalla.

    Cómo encaja: Primitivas headless que exponen estado y handlers; tú aplicas estilos desde tu Design System.

    Qué es Angular Aria — nueva librería de accesibilidad y por qué importa

    Angular Aria es una colección de patrones de UI “headless” diseñada para implementar las prácticas recomendadas de WAI-ARIA (APG) sin imponer estilos. La idea es separar semántica y comportamiento de la capa visual: tú pones los estilos, Angular Aria se encarga de que el componente responda correctamente a teclado, foco y tecnologías asistivas.

    Documentación relevante:

    ¿Por qué importa? Porque los errores de accesibilidad no son solo reputacionales ni legales: son errores de interacción. Un Combobox mal implementado deja fuera a usuarios con teclado o lectores de pantalla. La complejidad real no está en el atributo aria-label; está en coordinar foco, roles, aria-live, y atajos de teclado en todas las plataformas.

    Diferencias claras: Angular Material vs CDK vs Angular Aria

    Angular Material

    Componentes completos con estilo y accesibilidad integrada. Ideal si aceptas Material Design y quieres velocidad.

    Docs: Docs

    Angular CDK

    Utilidades de bajo nivel (Overlays, FocusMonitor, LiveAnnouncer). Es la caja de herramientas para construir componentes.

    CDK a11y: CDK a11y

    Angular Aria

    Patrones de componentes sin estilo (Accordion, Dialog, Combobox, Menu, etc.) con semántica ARIA y gestión de interacción resuelta. Tú aplicas CSS.

    Piensa en Aria como la “implementación canónica” de las APG para Angular: reduce la deuda técnica y la variabilidad entre implementaciones de distintos equipos.

    Ejemplo conceptual (cómo encaja en un Design System)

    No entraré a nombrar APIs finales —las convenciones pueden evolucionar—, pero un flujo habitual sería:

    1. Importas la primitiva headless (p. ej. DialogBehavior).
    2. Montas el markup semántico y enlazas directivas/servicios que exponen estado y handlers.
    3. Aplicas estilos desde tu sistema (Tailwind, Sass, CSS Modules).

    Pseudocódigo conceptual:

    <app-dialog *ariaDialog>
      <div ariaDialogTrigger>Abrir diálogo</div>
      <div ariaDialogContent>
        <!-- foco gestionado, escape cierra, roles y aria-hidden se aplican automáticamente -->
      </div>
    </app-dialog>

    Resultado: el comportamiento accesible ya está cubierto; el equipo sólo diseña la apariencia.

    Impacto en equipos y auditorías de accesibilidad

    • Time to Market: menor, porque no rehaces la lógica de interacción en cada componente.
    • Consistencia: menos variaciones entre módulos y menos fallos en auditorías WCAG 2.1 AA.
    • Mantenibilidad: actualizaciones de patrones centralizadas en la librería oficial reducen riesgo técnico.

    Si tu organización debe pasar auditorías (WCAG, EN 301 549), Angular Aria reduce la superficie de riesgo técnico al ofrecer implementaciones alineadas con APG.

    Riesgos, limitaciones y puntos de decisión

    • Estabilidad de API: siendo lanzamiento reciente, algunas APIs pueden cambiar. Revisa changelogs antes de adopciones masivas.
    • Superposición con CDK a11y: es probable que parte del CDK siga existiendo como utilidades de bajo nivel; Aria levantará patrones completos.
    • Integración visual: necesitas disciplina en el Design System para unir las primitivas headless con tokens y utilidades de estilos.

    Criterio técnico para la adopción (resumen accionable)

    Adopta Angular Aria si:

    • Estás construyendo un Design System white‑label o con identidad visual propia.
    • Tu equipo usa CSS utilitario (Tailwind) o quiere control total sobre la apariencia.
    • Tienes requisitos normativos o usuarios con necesidades de accesibilidad.

    No es prioritaria si:

    • Estás plenamente integrado con Angular Material y aceptas su estética.
    • Tu proyecto es un prototipo o MVP donde la prioridad es velocidad visual sin personalización.

    Checklist de integración mínima:

    • Añade pruebas de accesibilidad automatizadas (axe, Pa11y) en CI.
    • Mantén lockfiles y revisa cambios en dependencias a nivel de PR.
    • Planifica migración por componentes: empezar por Dialogs/Comboboxes reduce riesgo.

    Conclusión

    Angular Aria no es “otro paquete” más; es la pieza que permite a Angular competir en el terreno del Headless UI con garantías de accesibilidad. Para equipos que construyen componentes a medida, representa una inversión de tiempo recuperable en forma de consistencia, cumplimiento y reducción de deuda técnica. Implementa pruebas y políticas de adopción por fases, y usa Aria para que la accesibilidad deje de ser un añadido y pase a ser la base del comportamiento de tus interfaces.

    FAQ

    ¿Qué es Angular Aria?

    Una colección de patrones UI headless para implementar prácticas WAI-ARIA (APG) en Angular, separando comportamiento accesible de la capa visual.

    ¿En qué se diferencia de Angular Material?

    Material ofrece componentes completos con estilo; Angular Aria ofrece patrones sin estilo que gestionan interacción y semántica accesible.

    ¿Tengo que dejar de usar CDK a11y?

    No necesariamente. CDK seguirá siendo útil como utilidades de bajo nivel; Angular Aria ofrece patrones completos construidos sobre prácticas APG.

    ¿Qué beneficios trae para auditorías WCAG?

    Reduce la superficie de riesgo técnico al proporcionar implementaciones alineadas con APG, lo que ayuda a pasar auditorías WCAG 2.1 AA y otras normativas.

    ¿Cuáles son los riesgos al adoptar Angular Aria ahora?

    La API puede cambiar en etapas tempranas; es recomendable revisar changelogs y planificar migraciones por componentes para mitigar riesgo.

    ¿Dónde puedo leer las prácticas y ejemplos relacionados?

    Revisa la WAI-ARIA Authoring Practices Guide y la documentación oficial de Angular. También hay ejemplos en React Aria y Radix UI.

  • Implementación de Hexagonal Architecture en Angular para una mejor estructura

    Implementación de Hexagonal Architecture en Angular para una mejor estructura

    Hexagonal Architecture con Angular: Guía práctica y criterio técnico

    Hexagonal Architecture con Angular no es una moda bonita para poner en un README. Es la forma de evitar que tu aplicación se convierta en un Frankenstein atado al framework. Aquí te explico por qué, cómo y cuándo aplicarla sin volverte un fanático de la abstracción.

    Tiempo estimado de lectura: 3 min

    • Aislamiento claro: separa la lógica de negocio (TypeScript puro) de Angular y la infraestructura usando puertos y adaptadores.
    • Pruebas fiables: casos de uso sin TestBed permiten tests rápidos y menos fragilidad en CI.
    • Control del cambio: abstrae donde hay probable evolución; evita sobreingeniería y abuso de interfaces.
    • Arquitectura práctica: estructura por responsabilidad para facilitar reemplazos de adaptadores (Http, WebSocket, NgRx).

    ¿Qué es, en una línea? Aislar la lógica de negocio (TypeScript puro) del mundo exterior (Angular, Http, storage), usando puertos (contratos) y adaptadores (implementaciones).

    Resumen rápido (lectores con prisa)

    Patrón que separa dominio, aplicación e infraestructura para mantener la lógica de negocio independiente del framework. Útil cuando hay lógica cliente significativa y se busca testeo rápido. Implementación con puertos (contratos) y adaptadores (implementaciones concretas).

    Hexagonal Architecture con Angular: las capas y el contrato de dependencia

    Dominio (core)

    Entidades y reglas. Nada de Angular, nada de RxJS. Tipo puro.

    Aplicación

    Casos de uso y puertos. Orquestan el dominio y definen contratos (interfaces o clases abstractas).

    Infraestructura

    Adaptadores concretos (HttpClient, NgRx, components). Aquí vive Angular.

    Regla de oro: las capas exteriores conocen a las interiores; las interiores no conocen a las exteriores.

    Referencia conceptual: Alistair Cockburn — Ports and Adapters (hexagonal)

    Ejemplo mínimo y realista

    Dominio puro

    // domain/user.entity.ts
    export class User {
      constructor(public id: string, public email: string, public role: 'admin' | 'user') {}
      isAdmin() { return this.role === 'admin'; }
    }
      

    Puerto (aplicación)

    // application/ports/user.repository.port.ts
    export abstract class UserRepositoryPort {
      abstract findById(id: string): Promise;
      abstract save(user: User): Promise;
    }
      

    Adaptador (infraestructura – Angular)

    // infrastructure/adapters/http-user.repository.ts
    @Injectable()
    export class HttpUserRepository implements UserRepositoryPort {
      constructor(private http: HttpClient) {}
      findById(id: string) { return firstValueFrom(this.http.get(`/api/users/${id}`)); }
      save(user: User) { return firstValueFrom(this.http.post('/api/users', user)); }
    }
      

    Inyección con Angular (config)

    // app.config.ts
    providers: [
      { provide: UserRepositoryPort, useClass: HttpUserRepository },
      GetUserUseCase
    ]
      

    Angular DI hace el puente. Más sobre DI en la doc oficial: Angular Dependency Injection

    Testing: la ganancia real

    Cuando los casos de uso son TypeScript puro, los tests son instantáneos y sin TestBed. No más correr un microclima Angular solo para comprobar una regla de negocio.

    it('devuelve usuario por id', async () => {
      const mockRepo = { findById: jest.fn().mockResolvedValue(fakeUser) };
      const useCase = new GetUserUseCase(mockRepo as any);
      expect(await useCase.execute('123')).toEqual(fakeUser);
    });
      

    Resultado: CI más rápido, menos fragilidad y menos magia negra en los tests.

    Estructura recomendada (simple y práctica)

    Mantén carpetas por responsabilidad, no por tecnología:

    src/
    ├── domain/
    ├── application/
    │   ├── ports/
    │   └── use-cases/
    └── infrastructure/
        ├── adapters/
        └── ui/
      

    Esto hace que mover o substituir adaptadores (pasar de Http a WebSocket, o de NgRx a Signals) sea una tarea controlada, no una reescritura.

    Cuándo aplicarla (criterio técnico)

    Aplica Hexagonal Architecture con Angular si:

    • Tienes lógica importante en cliente (cálculos, reglas offline, validaciones complejas).
    • Quieres tests rápidos y confiables.
    • El producto vive años y el equipo crece.
    • Necesitas desarrollar en paralelo con mocks estables.

    No la apliques si

    • Es un CRUD simple que solo pinta el backend.
    • La prioridad es lanzar rápido con un equipo pequeño.
    • El dominio todavía está cambiando cada sprint (prototipado extremo).

    El patrón no te hace bueno; te sirve si resuelves un problema claro. Forzarlo es sobreingeniería.

    Puntos de atención y antipatterns

    • No conviertas cada función en una interfaz por paranoia. Aplica abstracción donde hay cambio probable.
    • Evita traer RxJS al dominio para “beneficiarte” del stream — eso es acoplamiento. Usa adaptadores para transformar observables a promesas o tipos puros.
    • No escondas lógica en componentes; los componentes deben orquestar, no contener reglas.

    Cierre con acción

    Si quieres, en el próximo artículo preparo:

    • Un scaffold de proyecto Angular con carpeta hexagonal lista.
    • Un checklist de decisiones (qué abstraer, cuándo usar InjectionToken vs clase abstracta).

    Apúntate al newsletter de Dominicode para recibirlo y el starter con ejemplos de tests en Jest.

    Esto no termina aquí. Si tu código se está volviendo difícil de probar o de migrar, la arquitectura es la palanca—y saber cuándo usarla es criterio.

    FAQ

    ¿Qué es Hexagonal Architecture?

    Patrón que aísla la lógica de negocio en el centro y separa las dependencias externas mediante puertos (contratos) y adaptadores (implementaciones concretas).

    ¿Por qué aplicarla con Angular?

    Permite mantener TypeScript puro en el dominio, reducir acoplamiento al framework y facilitar tests rápidos y menos frágiles.

    ¿Cómo se implementan los puertos y adaptadores?

    Los puertos son interfaces o clases abstractas en la capa de aplicación; los adaptadores son implementaciones concretas en infraestructura (por ejemplo, un repositorio HTTP usando HttpClient).

    ¿Cómo mejora el testing?

    Los casos de uso escritos en TypeScript puro no requieren TestBed ni dependencias Angular para ejecutarlos, lo que hace los tests más rápidos y confiables.

    ¿Cuándo no debería aplicarse?

    No conviene para CRUDs simples, equipos pequeños que priorizan velocidad de entrega, o durante prototipado extremo donde el dominio cambia constantemente.

    ¿Dónde encontrar referencias adicionales?

    Referencia conceptual: Alistair Cockburn — Ports and Adapters (hexagonal). Para DI en Angular: Angular Dependency Injection.

  • Implementación de Selectorless Components en Angular para mejorar la DX

    Implementación de Selectorless Components en Angular para mejorar la DX

    Selectorless Components: usar la clase en templates sin selectores CSS

    Selectorless Components permite referenciar directamente la clase de un componente en el template sin depender de un selector CSS —solo un import en TypeScript en lugar de dos pasos. Es una propuesta que reduce boilerplate, mejora refactorización y alinea Angular con patrones modernos de DX, pero implica cambios técnicos importantes en el compilador y en la compatibilidad con Web Components.

    Resumen rápido (lectores con prisa)

    Selectorless Components elimina la necesidad de declarar un selector string en HTML al permitir que la etiqueta del template corresponda directamente a la clase importada. Es relevante cuando se busca mejorar la seguridad de refactorización, la resolución por módulos y la integración con Standalone Components. Requiere cambios en el parser/compilador, en el Language Service y en la interoperabilidad con Web Components.

    Tiempo estimado de lectura

    Tiempo estimado de lectura: 4 min

    Ideas clave

    • Elimina el doble vínculo TypeScript vs selector string en templates.
    • Mejora la refactorización y el soporte del Language Service.
    • Requiere cambios en el compilador, lexer/parser y compatibilidad con Web Components.
    • Prepararse hoy: migrar a Standalone Components y estandarizar nombres y tests.

    Tabla de contenidos

    Introducción

    Hoy, usar un componente en Angular implica: (1) importar la clase en el array imports, y (2) escribir su selector string (ej. <app-card>) en el HTML. Ese doble vínculo —TypeScript vs string en HTML— crea fricción: refactors rotos, búsquedas difíciles y colisiones de selectores en monorepos.

    Selectorless Components propone eliminar el string: la etiqueta del template corresponde directamente a la clase importada, tal como en JSX. Las ventajas inmediatas incluyen refactorización segura (IDE-friendly), resolución de nombres por el sistema de módulos (evita prefijos) y un enlace unívoco entre vista y lógica (mejor soporte del Language Service).

    La discusión oficial puede seguirse en el repositorio de Angular. Para contexto sobre Standalone Components (requisito técnico probable), ver: Standalone Components. Sobre Angular Elements y Web Components: Angular Elements y Using custom elements (MDN).

    Qué son los Selectorless Components y por qué importan

    Actualmente, el flujo estándar exige declarar tanto la importación de la clase como el selector string en el template. Este doble requerimiento introduce fricción en flujos de trabajo reales: refactors que rompen templates, dificultad para buscar usos reales del componente y riesgo de colisiones de selectores en grandes monorepos.

    Los Selectorless Components eliminan la necesidad de declarar el selector string en el HTML: en su lugar, la etiqueta del template coincide con la clase importada. Esto aporta varios beneficios técnicos y de DX ya mencionados.

    Cómo funcionaría (ejemplo conceptual)

    En lugar de:

    <app-user-profile [user]="user"></app-user-profile>

    y un import separado en NgModule, el flujo sería:

    import { UserProfile } from './user-profile.component';
    
    @Component({
      imports: [UserProfile],
      template: `<UserProfile [user]="user" />`
    })
    export class DashboardComponent {}

    El compilador (Ivy) resolvería <UserProfile> buscando en el scope de clases importadas. La etiqueta y la clase serían la misma entidad semántica.

    Implicaciones técnicas y retos

    Implementarlo no es sólo una mejora estética; exige cambios en varias capas del stack. A continuación se detallan los puntos técnicos más relevantes.

    Parser / compilador

    HTML estándar no acepta etiquetas PascalCase por convención. El analizador de templates de Angular (Ivy) tendría que adaptar el lexer/parser para reconocer y mapear identificadores de clase a nodos del AST del template.

    Integración con Web Components

    Los Custom Elements requieren nombre en kebab-case (ej. my-element). Un componente “sin selector” complica su exportación como Angular Element. Es necesario definir reglas para derivar un selector kebab-case cuando se necesite compatibilidad con customElements.define().

    Language Service y tooling

    El Angular Language Service y los linters deben entender la relación import → tag para ofrecer autocompletado, go-to-definition y refactors automáticos en templates. Esto exige mejoras en el AST y en las capacidades del Language Service.

    Retrocompatibilidad

    La transición debe ser aditiva: todos los selectores existentes deben seguir funcionando. Cualquier migración automática (schematics) necesita ser robusta para evitar romper bases de código grandes.

    Criterio práctico para Tech Leads: cómo prepararse hoy

    Selectorless Components no estará listo de la noche a la mañana. Pero puedes minimizar el trabajo futuro con pasos concretos:

    • Migra a Standalone Components. La indirección de NgModules complica el scope necesario para resolución por clase. Tutorial: Standalone Components.
    • Estandariza selectores y nombres de clase. Haz que el selector derive del nombre de la clase (kebab-case). Facilita búsquedas y herramientas de migración.
    • Encapsula lógica fuera del decorador. Mantén validadores, transformaciones y efectos en servicios o utilidades puras. Esto hace los componentes triviales de reemplazar o regenerar.
    • Automatiza tests que cubran refactors. Añade pruebas E2E y unitarias que detecten fallos en templates tras renombrados.
    • Evalúa integraciones con Angular Elements sólo donde sean necesarias; documenta cómo se exportará el selector cuando exista una estrategia selectorless.

    Riesgos reales a considerar

    • Cambios en el parser pueden introducir bugs de compatibilidad con herramientas que asumen HTML estándar.
    • Exportar como Web Component podría requerir reintroducir selectores o convenciones automáticas.
    • Ecosistemas y librerías externas esperan selectores; la convivencia debe ser ordenada.

    Conclusión: menos ruido, más control — pero con cuidado

    Selectorless Components es coherente con la dirección de Angular: Standalone Components, Signals y Zoneless —todas reducen capas de indirección. La propuesta promete mejor DX, refactors más seguros y menos naming friction en monorepos. Pero su coste técnico es real: cambios en compilador, Language Service y compatibilidad con Web Components.

    Si lideras un equipo, actúa hoy en dos frentes: adopta Standalone Components y endurece convenciones de nombre y testing. Cuando Angular decida estabilizar la propuesta, tu migración será cuestión de ejecutar schematics bien preparados —no de rehacer medio proyecto.

    FAQ

    ¿Qué son exactamente los Selectorless Components?

    Son una propuesta para permitir que la etiqueta en el template corresponda directamente a la clase importada en TypeScript, eliminando la necesidad de declarar un selector string en HTML.

    ¿Cuándo debería empezar a prepararme?

    Empieza hoy enfocándote en migrar a Standalone Components, estandarizar nombres de clase/selector y reforzar testing para detectar fallos en refactors.

    ¿Afecta esto a los Web Components y Angular Elements?

    Sí. Los Custom Elements requieren kebab-case; la propuesta complicaría la exportación directa como Angular Element y exige reglas para derivar selectores kebab cuando sea necesario.

    ¿Necesito migrar todos los componentes a Standalone?

    No inmediatamente, pero la indirección de NgModules complica la resolución por clase. Migrar a Standalone reduce la fricción para adoptar selectorless cuando esté disponible.

    ¿Qué cambios requiere el Language Service?

    Debe entender la relación import→tag para ofrecer autocompletado, go-to-definition y refactors en templates; esto implica mejoras en el AST y en las capacidades del servicio.

    ¿Cómo se manejarán las colisiones de nombres en monorepos?

    La propuesta aprovecha la resolución por módulos para evitar prefijos, pero la coordinación de nombres y convenciones sigue siendo necesaria para evitar conflictos en grandes repositorios.

    ¿Qué herramientas de migración se esperan?

    Se esperan schematics y migraciones automáticas que sean robustas; su calidad será crucial para evitar romper bases de código grandes durante la transición.

  • Cómo utilizar Angular MCP Tools Read-Only para mejorar tu flujo de trabajo

    Cómo utilizar Angular MCP Tools Read-Only para mejorar tu flujo de trabajo

    Angular MCP Tools: Read-Only RAG e Inspectors

    Tiempo estimado de lectura: 4 min

    • Inspección primero: agentes que leen y razonan antes de proponer cambios.
    • Read-Only RAG: evita escrituras automáticas y exige trazabilidad técnica.
    • Inspectors prácticos: seis herramientas diseñadas para entender monorepos Angular y recomendar con contexto.
    • Flujo recomendado: list_projects → get_best_practices → search_documentation antes de aceptar PRs.

    Introducción

    ¿Quieres que un agente de IA deje de romper tu repo y empiece a trabajar como un colega inteligente? Entonces presta atención: las Angular MCP Tools no son un juguete, son el sentido común aplicado a la colaboración entre LLMs y bases de código Angular.

    Resumen rápido (lectores con prisa)

    MCP (Model Context Protocol) para Angular: agentes que inspeccionan repos antes de proponer cambios. El subconjunto Read-Only RAG & Inspectors viene activado por defecto: lee, razona y recomienda, sin escribir. Úsalo para obtener recomendaciones trazables y alineadas con la versión del proyecto.

    Qué es esto en una línea

    MCP (Model Context Protocol) + herramientas específicas para Angular = agentes que primero leen y entienden tu proyecto antes de proponer código. El subconjunto Read-Only RAG & Inspectors viene activado por defecto: lee, razona, recomienda. No escribe nada sin permiso.

    Por qué importa

    Porque los LLMs bien entrenados siguen fallando cuando no entienden topologías reales: monorepos, versiones mezcladas, patrones legacy. Aquí no se trata de velocidad, sino de coherencia y seguridad. En vez de “generar y rezar”, el agente inspecciona y explica sus sugerencias con referencias trazables.

    La suite Read-Only: Inspectors

    La suite de inspectores Read-Only incluye seis herramientas prácticas. Úsalas en orden o según la necesidad. Todas buscan hacer que la IA actúe como un ingeniero senior que conoce tu repo.

    1) list_projects — Descubre la topología del monorepo

    Qué hace: mapea apps, librerías y fronteras del workspace (Nx, Angular CLI, etc.).

    Por qué importa: evita que la IA proponga cambios en la librería equivocada o que recomiende imports que rompen dependencias.

    Práctica: pídele al agente “list_projects” y revisa el mapa antes de aceptar cualquier PR sugerido.

    Docs útiles: nx.dev, angular.io

    2) get_best_practices — Inyecta reglas alineadas a la versión

    Qué hace: detecta la versión de Angular y carga reglas (p. ej. cuándo usar Standalone Components vs NgModules).

    Por qué importa: previene que te sugieran patrones obsoletos.

    Práctica: ejecuta get_best_practices antes de aceptar snippets generados.

    3) search_documentation — Consultas en vivo contra angular.dev

    Qué hace: realiza búsquedas en la documentación oficial en tiempo real y adjunta referencias.

    Por qué importa: elimina alucinaciones técnicas del modelo.

    Práctica: exige que cualquier recomendación venga con el enlace a la sección de la doc (p. ej. angular.io o angular.dev).

    4) find_examples — Base de ejemplos modernos y validados

    Qué hace: recupera patrones de implementación contemporáneos (Signals, reactive forms modernos, composición con inject()).

    Por qué importa: evita soluciones “copy-paste” de 2016.

    Práctica: pide ejemplos concretos y compara con tu arquitectura antes de adaptar código.

    5) ai_tutor — Personas de coaching con RAG

    Qué hace: arranca un “persona” contextual: mentor junior, code reviewer, o arquitecto.

    Por qué importa: adapta la profundidad de la explicación según quien pregunte.

    Práctica: usa ai_tutor para onboarding técnico: deja que el tutor genere una mini guía de cambios antes de ejecutarlos.

    6) onpush_zoneless_migration — Analiza compatibilidad zoneless

    Qué hace: inspecciona componentes para detectar riesgos al migrar fuera de zone.js (ChangeDetectionStrategy, suscripciones, side effects).

    Por qué importa: la migración zoneless puede romper renderizado en bordes finos; conviene planear.

    Práctica: ejecuta este inspector y revisa los hallazgos con un dev senior. Referencia: github.com/angular/zone.js

    Un flujo práctico de trabajo (mini checklist)

    • 1) list_projects: entiende el repo.
    • 2) get_best_practices: fija reglas por versión.
    • 3) search_documentation: valida APIs oficiales.
    • 4) find_examples: trae patrones comprobados.
    • 5) ai_tutor: genera explicación para tu equipo.
    • 6) onpush_zoneless_migration: si planeas ir zoneless, ejecuta auditoría.

    Consejos de criterio técnico (no obviedades)

    • No des permisos de escritura hasta que el agente haya corrido list_projects y get_best_practices.
    • No confíes ciegamente en migraciones zoneless: son útiles, pero experimentalidad y casos límite existen.
    • Exige trazabilidad: cada recomendación debe traer el fragmento de doc o ejemplo (URL incluido).
    • Integra estas herramientas en pipelines de revisión (p. ej. n8n.io o flujos de CI) para mantener trazabilidad y auditoría.

    Qué ganarás realmente

    Velocidad no es la métrica. Ganarás coherencia entre código y arquitectura, menos deuda técnica introducida por sugerencias automáticas y mayor confianza para delegar revisiones automáticas en la IA —siempre con controles.

    No es magia, es disciplina

    El Read-Only RAG no limita a la IA: la pone en su lugar. Primero inspecciona, luego propone. Tu trabajo es aplicar criterio humano en la etapa final. Si lo haces, el agente deja de ser un generador de snippets y se convierte en un asistente técnico con contexto real.

    Haz esto ahora

    En tu siguiente sesión con el agente, obliga este orden: list_projects → get_best_practices → search_documentation. Si quieres, pásame el resultado y te devuelvo un plan de migración o un checklist de PRs. Apúntalo: la IA que entiende tu repo es la que te ahorra horas y noches de debugging.

    Dominicode Labs

    Si integras estas herramientas en flujos de automatización y revisión, puede ser útil explorar recursos y experimentos continuos en Dominicode Labs. Considera Dominicode Labs como una continuación lógica para prototipado de pipelines y auditorías técnicas.

    FAQ

    ¿Qué hace exactamente list_projects?

    list_projects mapea apps, librerías y fronteras del workspace (por ejemplo Nx o Angular CLI) para mostrar la topología del monorepo y prevenir cambios en lugares incorrectos.

    ¿Cuándo debo ejecutar get_best_practices?

    Ejecuta get_best_practices al inicio de una auditoría o antes de aceptar snippets generados para alinear recomendaciones a la versión de Angular y evitar patrones obsoletos.

    ¿Cómo evita search_documentation las alucinaciones?

    Realiza búsquedas en la documentación oficial en tiempo real y adjunta referencias verificables (por ejemplo angular.io), lo que obliga al agente a justificar sus sugerencias.

    ¿Qué tipos de ejemplos trae find_examples?

    Recupera patrones modernos y validados, como uso de Signals, formularios reactivos modernos y composición con inject(), para evitar soluciones anticuadas.

    ¿Para qué sirve ai_tutor en un equipo?

    ai_tutor crea una persona contextual (mentor, code reviewer, arquitecto) que adapta la profundidad de la explicación y puede generar guías de cambios para onboarding o revisiones.

    ¿Qué riesgos detecta onpush_zoneless_migration?

    Analiza compatibilidad zoneless y detecta riesgos relacionados con ChangeDetectionStrategy, suscripciones y efectos secundarios que pueden romper renderizado fuera de zone.js. Referencia: github.com/angular/zone.js

  • Implementación de Agent Skills para proyectos Angular

    Implementación de Agent Skills para proyectos Angular

    Hacer post sobre los Agent Skills de angular: guía práctica para arquitectos y equipos

    Tiempo estimado de lectura: 3 min

    • Agent Skills son capacidades automatizadas para leer, analizar y proponer cambios en código Angular respetando arquitectura y límites.
    • Prioridad ahora: Standalone Components, Signals, inject() y Zoneless requieren que la IA entienda contexto antes de tocar código.
    • Flujo operativo: discovery read‑only → auditorías estáticas → propuestas mecánicas en rama con PR y revisión humana.
    • Governance: integrar skills en CI, playbooks y dashboards para trazabilidad y control de riesgos.

    Hacer post sobre los Agent Skills de angular no es levantar hype ni repetir buzzwords; es ordenar una pieza crítica del puzzle: cómo convertimos agentes de IA en revisores técnicos y refactorizadores seguros para proyectos Angular. Si tu equipo opera con monorepos, Signals y rutas lazy, necesitas que la IA entienda topología, prácticas y riesgo antes de tocar una línea de código.

    Resumen rápido (lectores con prisa)

    Agent Skills son capacidades programáticas para que un agente automatizado lea, analice y proponga cambios en un repo Angular respetando arquitectura. Úsalos para discovery read‑only, auditorías estáticas y para generar propuestas en ramas con revisión humana. Integrar skills en CI y playbooks es clave para trazabilidad y control de riesgo.

    Qué son los Agent Skills de Angular (y por qué importan)

    Los Agent Skills son capacidades programáticas que permiten a un agente automatizado leer, analizar y —con límites— transformar código Angular respetando la arquitectura del proyecto. No hablamos de completados contextuales: hablamos de habilidades concretas para mapear workspaces, auditar patrones reactivos, detectar fugas de memoria y proponer refactorizaciones alineadas con la versión del framework.

    Por qué ahora

    Angular cambió. Standalone Components, Signals, inject() y la tendencia Zoneless hacen que un snippet bien formado pueda ser, en contexto, una regresión. El objetivo de los Agent Skills es cerrar la brecha entre lo que el modelo “sabe” y lo que el repo “es”.

    Categorías de Agent Skills (práctico y accionable)

    1) Descubrimiento y topología (Read‑Only)

    Mapeo de workspace

    Mapeo de workspace: lee angular.json / project.json y detecta apps, librerías y fronteras de dominio. Referencia: Nx.

    Árbol de dependencias

    Árbol de dependencias: construye el grafo de importaciones para detectar fronteras violadas o riesgos de dependencia circular.

    Regla de oro: siempre en modo solo lectura. Ejecutar antes de cualquier propuesta.

    2) Auditoría y análisis estático (reportes)

    Detección de fugas

    Detección de fugas: localizar suscripciones sin cleanup (ngOnDestroy, takeUntilDestroyed()), event listeners no removidos o timers persistentes.

    Change detection check

    Change detection check: validar OnPush vs mutaciones por referencia que rompen el rendering.

    Compatibilidad Zoneless

    Compatibilidad Zoneless: identificar patrones que dependen de la detección implícita de zone.js. Referencia: zone.js.

    Resultado: un informe accionable con líneas de riesgo, prioridad y referencia documental.

    3) Modernización y refactorización (propuestas con revisión humana)

    Migración a Standalone

    Migración a Standalone: extraer un componente de un NgModule, aplicar standalone: true y actualizar rutas lazy.

    Refactor inject()

    Refactor inject(): reemplazar inyección por constructor cuando el patrón lo permita.

    RxJS → Signals

    RxJS → Signals: transformar estados locales sincronizados (BehaviorSubject) a signal()/computed() cuando no haya flujos asíncronos complejos.

    Nota: estas operaciones deben proponerse en PRs, nunca aplicarse directamente en main sin revisión.

    Ejemplo de flujo mínimo (adoptable hoy)

    1. PR abierto → webhook dispara workflow.
    2. Ejecutar skills Read‑Only: mapea workspace + análisis de dependencias.
    3. Ejecutar auditorías: fugas, OnPush, Zoneless. Adjuntar report con URLs de documentación (angular.dev).
    4. Si todo OK, ejecutar propuestas mecánicas (migración Standalone o inject()) en una rama de trabajo y abrir PR automático con checklist y pruebas.

    Este flujo es orquestable con n8n o runners CI que disparen agentes y persistan resultados para trazabilidad.

    Criterio técnico (lo que no debes automatizar sin control)

    • No otorgues permisos de escritura globales hasta que el agente haya corrido los skills de descubrimiento y get_best_practices.
    • Tratar la migración Zoneless como diagnóstico, no como parche automático: los efectos secundarios en tiempo de ejecución y librerías externas pueden romper producción.
    • No convertir RxJS → Signals de forma indiscriminada; define reglas: solo estado local sincronizable y sin operadores complejos.
    • Exige trazabilidad: cada recomendación viene con fragmento de doc y URL a la sección relevante de angular.dev.

    Integración con gobernanza y equipos

    Los Agent Skills dejan de ser experimentales cuando se integran en:

    • Pipelines de CI que registran outputs de los inspectores junto al PR.
    • Playbooks de revisión que establecen qué skills pueden autocorregir en ramas de feature y cuáles requieren aprobación de un Senior.
    • Dashboards de deuda técnica que priorizan hallazgos del agente (fugas, violaciones de fronteras, patrones Zoneless).

    Qué ganas — y cuánto riesgo evitas

    Implementar Agent Skills bien definidos reduce regresiones arquitectónicas, acelera migraciones repetitivas y convierte a la IA en un revisor que aporta contexto (no solo snippets). El retorno real es tiempo de arquitecto liberado para decisiones complejas y menos deuda introducida por cambios automáticos mal contextualizados.

    Cierre práctico

    1. Añadir un skill de mapeo de workspace en tu pipeline.
    2. Automatizar la auditoría de fugas por cada PR.
    3. Pilotar migraciones Standalone en ramas feature con revisión humana.

    Con eso pones la IA a trabajar para tu arquitectura, no contra ella.

    Si quieres integrar estos workflows en tus pipelines y experimentos, considera explorar recursos y experiments en Dominicode Labs. Es una continuación natural para llevar skills de inspección y orquestación a pipelines con trazabilidad y playbooks.

    FAQ

    ¿Qué son exactamente los Agent Skills en Angular?

    Son capacidades programáticas que permiten a un agente automatizado leer, analizar y, con límites, transformar código Angular respetando la arquitectura del proyecto. Incluyen discovery, auditoría estática y generación de propuestas para revisión humana.

    ¿Cuándo debo ejecutar los skills en un PR?

    El flujo recomendado es: al abrir un PR, disparar skills Read‑Only (mapeo de workspace y análisis de dependencias) y luego las auditorías (fugas, OnPush, Zoneless). Solo después de pasar estos pasos se generan propuestas mecánicas en una rama separada.

    ¿Puede el agente aplicar cambios directamente en main?

    No. Las operaciones de modificación deben proponerse en PRs y revisarse. No otorgues permisos de escritura globales hasta validar discovery y mejores prácticas. Las transformaciones automatizadas requieren trazabilidad y aprobación.

    ¿Cómo integro los reports en CI?

    Orquesta el flujo con webhooks o runners CI: al abrir PR disparas agentes que persisten los resultados junto al PR. Puedes usar herramientas como n8n para orquestación y almacenar informes para dashboards de deuda técnica.

    ¿Qué precauciones con Zoneless?

    Trata la migración Zoneless como diagnóstico, no como parche automático. Identifica patrones que dependen de zone.js y evalúa efectos secundarios en tiempo de ejecución y librerías externas antes de proponer cambios.

    ¿Cómo asegurar trazabilidad de recomendaciones?

    Cada recomendación debe incluir fragmentos de doc y un enlace a la sección relevante de angular.dev, junto con el contexto del repo (archivo, línea, grafo de dependencias) y el historial del agente que generó la sugerencia.

  • Cómo usar httpResource() en Angular para manejar peticiones HTTP

    Cómo usar httpResource() en Angular para manejar peticiones HTTP

    httpResource() — Resource API para HTTP: Peticiones Reactivas con Signals

    ¿Te imaginas definir una petición HTTP como si fuera una variable y olvidarte de orquestar cancelaciones, estados y subscriptions? Eso es lo que propone httpResource() — Resource API para HTTP: defines los parámetros como señales y el recurso se actualiza solo cuando cambian las señales dependientes.

    Tiempo estimado de lectura: 3 min

    • Convierte llamadas de red en estado reactivo accesible desde Signals.
    • Automatiza cancelaciones y recargas cuando las señales dependientes cambian.
    • Reduce boilerplate respecto al patrón Observable + suscripción para patrones “estado → petición”.
    • No reemplaza a RxJS para orquestaciones temporales o streams continuos.

    Introducción

    httpResource() convierte llamadas de red en estado reactivo. Si trabajas con Angular y Signals, esto no es una mejora cosmética: es una forma distinta de pensar la carga de datos. En lugar de construir Observables, suscribirte y gestionar cancelaciones manuales, consumes estado.

    Resumen rápido (lectores con prisa)

    Definición: httpResource() expone peticiones HTTP como señales reactivas que actualizan automáticamente su estado al cambiar dependencias.

    Cuándo usarlo: Para cargas impulsadas por estado (filtros, rutas, paginación).

    Por qué importa: Simplifica cancelaciones automáticas, estados y recargas sin boilerplate.

    Limitación clave: No sustituye a RxJS para orquestación temporal o streams continuos.

    httpResource() — Resource API para HTTP: qué es y por qué importa

    La Resource API expone operaciones asíncronas como señales. httpResource() es la implementación para peticiones HTTP: envuelve la llamada y te devuelve señales listas para consumir (value, loading, error, status y un método reload).

    Angular documenta el enfoque reactividad en su guía oficial (ver Reactive primitives). El HttpClient sigue siendo el motor de la petición; httpResource() es la interfaz que lo conecta con Signals.

    Actualmente la API está en Developer Preview en las versiones recientes, por lo que conviene probar con criterio en proyectos que puedan tolerar cambios en la firma antes de que se estabilice.

    Cómo funciona, sin demasiada magia

    Piensa en httpResource() como un computed() que hace fetch. Definís una función que lee señales. Angular registra dependencias. Cuando cualquiera cambia:

    • la petición anterior se aborta si aún está en curso,
    • se lanza una nueva petición con los parámetros actualizados,
    • las señales (value, isLoading, error, status) reflejan el ciclo de vida automáticamente.

    Ejemplo mínimo

    readonly userId = signal(1);
    
    readonly userResource = httpResource(() => ({
      url: `/api/users/${this.userId()}`,
      method: 'GET'
    }));

    Cambia userId() y el recurso hace el resto. No hay switchMap, no hay takeUntil, no hay memoria de suscripciones.

    Qué recibes “de serie” y por qué eso importa

    Al usar httpResource() obtienes señales listas para consumir en la plantilla o en lógica reactiva:

    • .value() — datos resueltos.
    • .isLoading() — booleano para spinners/skeletons.
    • .error() — información del fallo.
    • .status()idle | loading | resolved | error.
    • .reload() — fuerza una re-ejecución.

    Esto elimina mucho boilerplate: ya no necesitas declarar isLoading, data, error y actualizar cada uno en handlers separados.

    Race conditions: ya no es una preocupación recurrente

    Las condiciones de carrera eran el talón de Aquiles cuando el usuario cambiaba filtros rápido y una respuesta tardía pisaba datos nuevos. Con httpResource() la cancelación es automática: si la señal que define la petición cambia, las peticiones intermedias se abortan. Resultado: datos consistentes y menos código defensivo.

    Eso no significa que el problema desaparezca en todos los contextos, pero sí que desaparece en el patrón más común: “estado cambia → cargar datos para la vista”.

    Cuándo usarlo — y cuándo no

    Usos recomendados

    • La obtención de datos está impulsada por estado (filtros, ruta, paginación).
    • Quieres minimizar boilerplate y unificar el modelo mental del equipo en Signals.
    • Buscas evitar errores por manejo manual de cancelaciones.

    Cuándo no usarlo

    • Necesitas orquestación compleja de eventos (WebSockets, SSE, streams continuos).
    • Requieres transformaciones temporales avanzadas (debounceTime, windowing, combinaciones complejas).
    • Estás construyendo pipelines de datos que dependen del tiempo y eventos más que del estado.

    RxJS sigue siendo la herramienta correcta para flujos de eventos; httpResource() es la herramienta correcta para “estado → petición” limpio y declarativo.

    Impacto arquitectónico real

    El cambio más importante no es técnico: es mental. Cuando el equipo compra la narrativa Signals-first, los componentes y su testing se vuelven más simples. Menos suscripciones olvidadas. Menos efectos colaterales. Mejor onboarding para quien llega nuevo al repo.

    No es magia: es coherencia. httpResource() reduce superficie para errores y acelera decisiones arquitectónicas sobre dónde debe vivir la lógica de carga de datos.

    Recursos y siguientes pasos

    Angular Reactivity Guide

    HttpClient (persistencia del motor)

    Si estás en Angular 19+ y ya trabajas con Signals, empieza por prototipar una pantalla con httpResource() y compara la legibilidad, tests y bugs con la versión RxJS/HttpClient. No lo adoptes por moda: mídelo. Y si en el prototipo funciona, lo siguiente es reescribir un flujo real y ver cuántas líneas de código desaparecen.

    Esto no acaba aquí: hay decisiones de testing, caching y error handling que merecen otra pieza. Si querés, escribo la segunda parte con patrones de testing y estrategias de cache para httpResource().

    FAQ

    ¿Qué es exactamente httpResource()?

    Es una implementación de la Resource API para peticiones HTTP que expone el resultado y el estado de la petición como señales reactivas. Envuelve el mecanismo del HttpClient y ofrece .value(), .isLoading(), .error(), .status() y .reload().

    ¿Cómo se integra con HttpClient?

    El HttpClient sigue siendo el motor que efectúa las peticiones. httpResource() actúa como la interfaz declarativa que lee señales y delega la ejecución y cancelación al HttpClient.

    ¿Qué señales ofrece por defecto?

    Provee .value() (datos), .isLoading() (booleano), .error() (detalle del fallo), .status() (idle | loading | resolved | error) y .reload().

    ¿El API cancela peticiones automáticamente?

    Sí. Si la señal que define la petición cambia mientras una petición está en curso, la petición anterior se aborta automáticamente para evitar condiciones de carrera comunes.

    ¿Cuándo debo seguir usando RxJS?

    Cuando necesitas orquestación compleja de eventos, streams continuos (WebSockets, SSE) o transformaciones temporales avanzadas (debounceTime, windowing, combinaciones complejas), RxJS sigue siendo la herramienta adecuada.

    ¿Es estable la API en producción?

    La API estaba en Developer Preview en versiones recientes; conviene probar con criterio en proyectos que puedan tolerar cambios en la firma antes de adoptarla ampliamente en producción.

  • Aprende sobre el nuevo Authoring Format en Angular y Signals

    Aprende sobre el nuevo Authoring Format en Angular y Signals

    Nuevo Authoring Format (Signal Components): qué es y cómo prepararte

    Tiempo estimado de lectura: 3 min

    Ideas clave

    • Nuevo Authoring Format: replantea la autoría de componentes para hacer la reactividad nativa en la sintaxis.
    • Dos enfoques: funciones con Signals vs Single File Components (SFC).
    • Impactos: cambia Language Service, compilador, tooling, ciclos de vida y compatibilidad con Web Components.
    • Recomendación práctica: migrar a Standalone Components, adoptar Signals y desacoplar lógica.

    Introducción

    El término Nuevo Authoring Format (Signal Components) aparece cada vez más en las discusiones oficiales de Angular. En las primeras líneas: el Nuevo Authoring Format (Signal Components) propone cambiar cómo se escriben los componentes, pasando de clases y decoradores a formatos más funcionales—ya sea funciones con Signals o Single File Components tipo Vue/Svelte. Esto no es un capricho sintáctico: tiene consecuencias profundas en compilador, tooling y arquitectura de aplicaciones.

    Resumen rápido (lectores con prisa)

    Qué es: Un nuevo formato de autoría para componentes de Angular que prioriza la reactividad nativa (Signals) y alternativas sintácticas funcionales o SFC.

    Cuándo usarlo: Es una dirección en discusión; hoy, adopta Standalone Components y Signals para prepararte.

    Por qué importa: Afecta inferencia de tipos, tooling, rendimiento y compatibilidad con Web Components.

    Cómo funciona (alto nivel): Componentes como funciones crean Signals y devuelven representación; SFC agrupa lógica y template en un archivo.

    Nuevo Authoring Format (Signal Components): qué está en juego

    Angular lleva años evolucionando: Signals, Zoneless y Standalone Components han sido el preludio. El siguiente paso es replantear la autoría de componentes para que la reactividad sea nativa en la sintaxis, no un patrón insertado dentro de clases. El equipo mantiene discusiones públicas (ver RFCs y hilos) y la dirección es clara aunque no definitiva.

    ¿Por qué importa? Porque cambiar la forma de autoría impacta en:

    • Inferencia de tipos y Language Service.
    • Minificación, tree-shaking y rendimiento del bundle.
    • Ergonomía del desarrollador (DX) y curva de aprendizaje.
    • Compatibilidad con Web Components y herramientas del ecosistema.

    Referencias útiles:

    Dos enfoques en discusión

    El equipo de Angular evalúa principalmente dos caminos. Ninguno está finalizado; pueden mezclarse o descartar ambos.

    Funciones con Signals

    • El componente es una función que crea Signals y devuelve la representación (o templates vinculados).
    • Elimina el contexto this, favorece closures y composición.
    • Ejemplo conceptual:
    export const UserCard = component(() => {
      const name = signal('Ada');
      const greeting = computed(() => `Hola, ${name()}`);
      return html`<p>${greeting()}</p>`;
    });

    Beneficios: compresión mejor por bundlers, composición natural, menos errores por binding de contexto.

    Single File Components (SFC)

    • Un archivo con bloques <script> y <template> (estilo .vue/.svelte).
    • Separación visual lógica/template sin el decorador @Component.
    • Mejora la legibilidad y facilita la adopción por desarrolladores nuevos.
    • Ejemplo conceptual:
    <script>
      const count = signal(0);
      const double = computed(() => count() * 2);
    </script>
    
    <template>
      <button (click)="count.set(count() + 1)">{{ double() }}</button>
    </template>

    Beneficios: DX clara, flujo secuencial, herramientas de análisis más directas.

    Impactos técnicos que debes considerar

    Language Service y tooling

    • Sin decoradores opacos, el Language Service puede ofrecer autocompletado y detección de errores más precisos en templates.
    • Requiere cambios en el análisis estático y en la forma en que el compilador Ivy mapea lógica y vista.

    Ciclos de vida y hooks

    • ngOnInit y ngOnDestroy podrían migrar a hooks funcionales reutilizables (p. ej. onMount, onDestroy), que facilitan testing y composición.

    Compatibilidad con Web Components

    • Web Components exigen kebab-case en nombres (p. ej. my-element). Un formato sin selector obliga a definir reglas para exportación como custom elements o mecanismos automáticos de derivación de selectores.

    Retrocompatibilidad

    • Angular tenderá a mantener convivencia entre modelos: las clases seguirán funcionando durante varias versiones, y la migración se hará mediante schematics y herramientas.

    Qué hacer hoy (criterio práctico para Tech Leads)

    No bloquees desarrollo ni intentes replicar experimentalmente la sintaxis en producción. Haz esto en su lugar:

    1. Migra a Standalone Components. Es el requisito técnico más claro para cualquier nuevo formato.
    2. Adopta Signals en tus componentes actuales: signal, computed, effect. Esto reduce la brecha conceptual entre hoy y el nuevo formato.
    3. Extrae lógica de negocio a funciones puras o servicios. Mantén la presentación lo más delgada posible. Así la migración será principalmente sintáctica.
    4. Mejora la cobertura de tests (unit + E2E) en formularios y flujos críticos; los cambios en autoría pueden exponer fricciones en bindings y hooks.
    5. Establece convenciones de naming y scripts de codemods para renombrados masivos: facilita que un futuro schematic haga el trabajo fino.

    Conclusión

    El Nuevo Authoring Format (Signal Components) no es solo una reforma estética: es la pieza que permite a Angular consolidar Signals como primer ciudadano del framework. La opción final (funciones vs SFC) aún no está cerrada, pero la dirección estratégica es evidente: menos decoradores, mejor inferencia, DX más directa y componentes concebidos para la reactividad desde el primer token.

    Prepara tu base de código: adopta Standalone Components, usa Signals y desacopla la lógica. Cuando Angular estabilice la sintaxis, no querrás estar rehaciendo arquitectura; querrás ejecutar schematics y seguir adelante.

    FAQ

    ¿Qué es el Nuevo Authoring Format (Signal Components)?

    Es una propuesta para cambiar la forma de escribir componentes en Angular, priorizando la reactividad nativa mediante Signals y alternativas sintácticas como componentes basados en funciones o Single File Components.

    ¿Cuáles son los enfoques que se están evaluando?

    Principalmente dos: componentes como funciones que crean Signals y devuelven la representación, y Single File Components (SFC) con bloques separados de <script> y <template>, al estilo .vue/.svelte.

    ¿Por qué afecta al Language Service y al tooling?

    Porque remover decoradores opacos y usar patrones funcionales implica cambios en el análisis estático. El Language Service puede ofrecer autocompletado y detección de errores más precisos si el compilador y mapeos entre lógica y vista se ajustan a la nueva sintaxis.

    ¿Cómo debo preparar mi código hoy?

    Migra a Standalone Components, adopta Signals (signal, computed, effect), extrae lógica de negocio a funciones puras o servicios y mejora la cobertura de tests para formularios y flujos críticos.

    ¿Qué pasa con la compatibilidad con Web Components?

    Hay que definir reglas de exportación y naming: Web Components exigen kebab-case en nombres (p. ej. my-element), por lo que un formato sin selector debe ofrecer mecanismos automáticos o convenciones para generar selectores compatibles.

    ¿Se mantendrán las clases y decoradores actuales?

    Sí. Angular tenderá a mantener convivencia entre modelos durante varias versiones y facilitará migraciones mediante schematics y herramientas; las clases seguirán funcionando mientras se realiza la transición.

  • Implementación del Model Context Protocol en Angular 21

    Implementación del Model Context Protocol en Angular 21

    Hacer post sobre los MCPs de angular 21

    Tiempo estimado de lectura: 6 min

    • MCP estandariza cómo los agentes de IA leen, razonan y proponen cambios en repositorios Angular 21.
    • Orden de inspectores (list_projects → get_best_practices → search_documentation → find_examples → onpush_zoneless_migration) minimiza cambios destructivos.
    • MCP exige trazabilidad: cada recomendación debe incluir referencia a la documentación oficial y reglas del proyecto.
    • Integración práctica: CI/pipelines y IDEs deben ejecutar inspectores antes de ofrecer o aplicar cambios.
    • Riesgos reales: reduce alucinaciones pero no elimina límites del análisis estático; requiere revisión humana.

    Introducción

    Hacer post sobre los MCPs de angular 21 empieza por entender que no hablamos de una feature menor: hablamos de cómo los agentes de IA leerán, razonan y propondrán cambios en tu código sin romper la arquitectura. En Angular 21, donde Signals, Standalone Components y la migración zoneless son la norma, el Model Context Protocol (MCP) pasa de ser un extra a una herramienta de gobernanza técnica indispensable.

    Resumen rápido (lectores con prisa)

    Qué es: Un protocolo que estandariza cómo los modelos de lenguaje interactúan con repositorios para descubrir topología, consultar documentación y aplicar reglas antes de sugerir cambios.

    Cuándo usarlo: En monorepos, pipelines automatizados y entornos donde agentes de IA pueden proponer cambios en código base (migraciones, refactors, PRs).

    Por qué importa: Evita propuestas que compilan pero introducen deuda técnica; garantiza trazabilidad y reglas específicas por versión.

    Cómo funciona (resumen): Ejecuta inspectores en orden (list_projects → get_best_practices → search_documentation → find_examples → onpush_zoneless_migration) y adjunta referencias oficiales a cada recomendación.

    Por qué importa ahora

    Angular 21 consolida patrones que rompen supuestos antiguos: la inyección por constructor deja paso a inject(), la reactividad local se orienta a Signals y zone.js tiende a desaparecer. Un LLM no contextualizado propondrá soluciones que compilan pero introducen deuda técnica. El MCP asegura que el agente primero lea la topología y las reglas del proyecto y luego proponga —no al revés.

    Componentes del flujo MCP en Angular 21

    • Descubrimiento de topología: el agente usa Nx para mapear aplicaciones, librerías y dependencias mediante list_projects.
    • Inyección de prácticas por versión: get_best_practices detecta la versión y aplica reglas (p. ej. evitar NgModules cuando no proceden).
    • Validación documental en tiempo real: search_documentation consulta angular.dev antes de afirmar APIs o signaturas.
    • Ejemplos concretos y actualizados: find_examples recupera implementaciones modernas (Signals, inject(), formularios reactivos).
    • Coaching contextual: ai_tutor ajusta el nivel técnico según el rol del usuario.
    • Auditoría zoneless: onpush_zoneless_migration analiza compatibilidad al eliminar zone.js.

    Ejemplo práctico (flujo mínimo aplicable)

    1) Ejecuta list_projects: el agente devuelve el mapa del monorepo con apps y librerías.

    2) Ejecuta get_best_practices: se cargan reglas específicas para Angular 21 (uso de Signals, restricciones sobre RxJS local).

    3) Pide search_documentation para la API concreta (p. ej. Signals API).

    4) Solicita find_examples para ver implementaciones validadas.

    5) Si el objetivo es migrar, corre onpush_zoneless_migration y compila la lista de refactorizaciones.

    Este orden evita que el agente proponga cambios destructivos en zonas equivocadas del repo.

    Casos de uso concretos y recomendaciones

    • Revisiones automáticas de PR: integra MCP en pipelines de CI para que el agente haga una pre-auditoría. Usa n8n o tu runner de CI para ejecutar los inspectores en cada PR.
    • Onboarding y documentación viva: ai_tutor puede generar guías de cambios y checklist de migración adaptados al repositorio. Útil para equipos nuevos que deben adoptar Signals y patrones zoneless.
    • Auditorías zoneless: no confíes en una única ejecución. Los detectores estáticos identifican patrones vulnerables (suscripciones sin limpieza, efectos colaterales) pero requieren revisión humana en casos límite.

    Criterio técnico que debes aplicar

    • Nunca concedas permisos de escritura antes de ejecutar list_projects y get_best_practices.
    • Exige trazabilidad: cada recomendación debe venir con la referencia a la documentación oficial (angular.dev).
    • Valida migraciones zoneless con pruebas E2E y monitoreo en staging; los cambios en detección de cambios pueden aparecer solo en escenarios complejos.
    • Mantén una “zona de seguridad” en la que la IA puede proponer cambios no destructivos (documentación, tests, refactorizaciones no críticas) y otra donde solo humanos aprueban (cambios en librerías compartidas, infraestructuras críticas).

    Integración con herramientas (práctico)

    • IDEs con IA: plug-ins que implementen MCP deben ejecutar inspectores antes de ofrecer snippets.
    • Automatización: orquesta inspectores con n8n para que cada PR dispare una auditoría RAG (Read-Only).
    • Registro y auditoría: guarda outputs de inspectores (mapa de topología, reglas aplicadas, fragmentos de doc) junto al PR para trazabilidad histórica.

    Riesgos y límites reales

    MCP reduce alucinaciones, no las elimina totalmente. Hay límites del análisis estático: efectos en tiempo de ejecución, race conditions y casos complejos de detección de cambios pueden escapar. Además, dar permisos de escritura sin límites en monorepos empresariales sigue siendo una superficie de riesgo alta.

    Conclusión (lo que ganas)

    Hacer post sobre los MCPs de angular 21 no es solo hablar de una integración técnica; es establecer un contrato de confianza entre IA y equipo. Con MCP, los agentes dejan de ser generadores indiscriminados y pasan a ser asistentes que conocen tu repo, tus reglas y tus límites. Implementados con disciplina (orden de inspectores, trazabilidad y revisión humana), los MCPs reducen deuda técnica, aceleran migraciones y convierten la IA en parte fiable del flujo de desarrollo.

    Dominicode Labs

    Para equipos que orquestan agentes y pipelines, una referencia práctica de investigación y experimentación es Dominicode Labs. Integrar MCP con flujos de trabajo y pruebas reproducibles ayuda a mantener trazabilidad y mejorar la adopción de prácticas zoneless.

    FAQ

    ¿Qué es exactamente un MCP?

    Un Model Context Protocol (MCP) es un conjunto de inspectores y flujos estandarizados que permiten a modelos de lenguaje interactuar con un repositorio de forma gobernada: descubrir topología, cargar reglas de práctica por versión y validar documentación antes de generar cambios.

    ¿Cuándo debo ejecutar inspectores en mi flujo?

    Siempre antes de conceder permisos de escritura a un agente: al menos ejecutar list_projects y get_best_practices. Para migraciones, añadir search_documentation, find_examples y onpush_zoneless_migration.

    ¿Cómo garantiza el MCP que no se rompa la arquitectura?

    No lo garantiza por completo, pero reduce riesgos al exigir que el agente conozca la topología y las reglas específicas del proyecto antes de proponer cambios. Además obliga a adjuntar referencias y un plan de refactorización verificable.

    ¿Qué referencias documentales se deben adjuntar a las recomendaciones?

    Las referencias deben ser enlaces a la documentación oficial pertinente en angular.dev (por ejemplo la Signals API) y, cuando corresponda, recursos técnicos como repositorios oficiales (p. ej. zone.js).

    ¿Puede un MCP eliminar la necesidad de revisión humana?

    No. MCP reduce alucinaciones y añade trazabilidad, pero las decisiones críticas (cambios en librerías compartidas, infraestructuras) deben seguir pasando por revisión humana.

    ¿Cómo integrar MCP en CI con n8n?

    Orquesta los inspectores como pasos en la pipeline: cada PR dispara un flujo de RAG (Read-Only) en el que list_projects y get_best_practices se ejecutan primero, seguidos por validaciones documentales y generación de un reporte adjunto al PR. Una opción práctica es usar n8n para encadenar esos inspectores.

    ¿Qué precauciones tomar en migraciones zoneless?

    Validar compatibilidad con onpush_zoneless_migration, ejecutar pruebas E2E en staging y monitorizar cambios en detección de cambios. No confiar exclusivamente en análisis estático: casos de race conditions y efectos en tiempo de ejecución requieren supervisión humana.

  • Cómo diagnosticar errores CORS en Angular con responseType

    Cómo diagnosticar errores CORS en Angular con responseType

    responseType en HttpResponse: diagnóstico programático de CORS y Fetch API en Angular

    Tiempo estimado de lectura: 3 min

    • Diagnóstico preciso: responseType expone la clasificación de Fetch (basic, cors, opaque, error, opaqueredirect) para convertir status: 0 en información accionable.
    • Observabilidad: Usar interceptores para registrar fetchType permite distinguir fallos de red, bloqueos CORS y respuestas opacas.
    • Estrategia de reintentos: No aplicar reintentos genéricos; combinar responseType con límites y circuit breakers.
    • Compatibilidad: Habilitar Fetch con provideHttpClient(withFetch()) para acceder a esta propiedad; XHR no la expone.

    Introducción

    responseType en HttpResponse es la nueva propiedad que Angular expone en HttpResponse y HttpErrorResponse para reflejar el tipo de respuesta de la Fetch API (‘basic’, ‘cors’, ‘opaque’, ‘error’, ‘opaqueredirect’). En las primeras líneas: esto permite diagnosticar programáticamente fallos de red y bloqueos de CORS sin depender de DevTools ni de mensajes genéricos con status: 0.

    Resumen rápido (lectores con prisa)

    Qué es: una propiedad en HttpResponse/HttpErrorResponse que refleja Response.type de la Fetch API.

    Cuándo usarlo: cuando uses Fetch como motor en Angular (provideHttpClient(withFetch())).

    Por qué importa: convierte status: 0 en señales accionables (p. ej. distinguir ‘opaque’ de ‘error’).

    Cómo funciona: el navegador categoriza la respuesta (basic/cors/opaque/error/opaqueredirect) y Angular la expone en HttpResponse/HttpErrorResponse.

    responseType en HttpResponse: qué es y por qué importa

    La propiedad es la representación de Response.type de la Fetch API (documentada en MDN). Angular la hace accesible cuando el HttpClient usa Fetch como motor (activar con provideHttpClient(withFetch())). Si tu app sigue con XHR, no tendrás esta clasificación semántica porque XHR no expone esos metadatos.

    No confundas esto con la opción de petición responseType que define ‘json’|’blob’|’text’, ni con HttpEventType. Aquí hablamos de cómo el navegador trató la respuesta desde la perspectiva de seguridad/origen.

    Fuentes:

    Valores y significado práctico

    basic

    ‘basic’ — Same-origin. No hay CORS. Acceso completo a cabeceras y cuerpo.

    cors

    ‘cors’ — Cross-origin aprobado; el servidor ha respondido con las cabeceras CORS correctas.

    opaque

    ‘opaque’ — Petición cross-origin en modo no-cors: el navegador ejecuta la petición pero oculta cuerpo y cabeceras (respuesta inaccesible).

    error

    ‘error’ — Falla de red total: DNS, conexión rechazada o bloqueo de CORS severo que impidió la entrega.

    opaqueredirect

    ‘opaqueredirect’ — Redirección cross-origin en modo manual.

    Interpretar correctamente evita reintentos inútiles y mejora observabilidad: un ‘opaque’ no se arregla reintentando; es probable que la petición haya sido enviada en modo incorrecto o que falten cabeceras CORS.

    Implementación práctica: interceptor de diagnóstico

    Un interceptor global es el lugar natural para enriquecer logs y tomar decisiones automáticas:

    import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';
    import { catchError, throwError } from 'rxjs';
    
    export const corsDiagnosticInterceptor: HttpInterceptorFn = (req, next) => {
      return next(req).pipe(
        catchError((error: HttpErrorResponse) => {
          if (error.status === 0) {
            // En versiones antiguas puede requerirse "as any" si no está tipado aún
            const fetchType = (error as any).responseType as string | undefined;
    
            if (fetchType === 'opaque' || fetchType === 'error') {
              // Log estructurado para observabilidad
              const payload = {
                tag: 'network:cors',
                fetchType,
                url: req.url,
                method: req.method,
                timestamp: new Date().toISOString()
              };
              // Ej: enviar a Sentry/Datadog/YourLogger
              console.error('[Network/CORS]', payload);
            }
          }
          return throwError(() => error);
        })
      );
    };

    Detalles prácticos: añade contexto (userAgent, entorno, versiones) y evita logs verbosos en clientes con alto tráfico. Etiqueta adecuadamente para filtrar incidentes de red en tu SIEM.

    Decisiones automáticas y recomendaciones

    Cómo actuar según responseType:

    • ‘error’ + status 0: marcar como fallo de infraestructura; no reintentar automáticamente; alertar al equipo infra.
    • ‘opaque’: auditar la configuración de la petición (¿se envía mode: ‘no-cors’ accidentalmente?), revisar proxies y CDN que puedan transformar la petición.
    • ‘cors’ con payload inválido: tratar como error de backend normal y aplicar reintentos controlados si procede.
    • ‘basic’: investigar conectividad local u origen compartido.

    Evita políticas de reintento genérico: una estrategia inteligente combina responseType con límites de reintentos y circuit breakers.

    Requisitos, tipado y compatibilidad

    • Habilita Fetch: provideHttpClient(withFetch()). (Ver: Angular HttpClient)
    • Tipado: en versiones intermedias de Angular puede ser necesario castear (error as any). Revisa las notas de versión si la propiedad aún no aparece en .d.ts.
    • Testing: en E2E/Browsers reales verifica valores de Response.type. En unit tests, simula HttpErrorResponse con responseType para validar rutas de logging.

    Observabilidad y tiempo de resolución

    La granularidad que aporta responseType reduce el time-to-detect y time-to-resolve. En entornos donde integras APIs de terceros, proxies corporativos o autenticación centralizada (OAuth), distinguir entre ‘opaque’ y ‘error’ te ahorra reproducir errores en local y te deja respuestas accionables en dashboards.

    Conclusión

    responseType en HttpResponse no es solo un campo más; es una palanca para convertir errores opacos en señales operativas. Si manejas integraciones cross-origin en producción, habilitar Fetch y aprovechar esta propiedad en interceptores y pipelines de observabilidad es una mejora tangible en resiliencia y diagnóstico.

    FAQ

    ¿Qué es exactamente responseType en HttpResponse?

    Es la representación de Response.type de la Fetch API expuesta por Angular en HttpResponse y HttpErrorResponse cuando HttpClient usa Fetch como motor.

    ¿Necesito cambiar a Fetch para verlo?

    Sí. Habilita Fetch con provideHttpClient(withFetch()). Si tu app sigue con XHR, esa clasificación no estará disponible.

    ¿Cómo distingue ‘opaque’ de ‘error’?

    ‘opaque’ indica una petición cross-origin en modo no-cors con cuerpo y cabeceras ocultas; ‘error’ indica una falla de red total (DNS, conexión rechazada o bloqueo severo de CORS).

    ¿Debo reintentar cuando veo status 0?

    No automáticamente. Usa responseType para decidir: por ejemplo, no reintentar en ‘error’ y auditar la configuración en ‘opaque’.

    ¿Dónde conviene registrar fetchType?

    En un interceptor global, con logs estructurados que incluyan contexto (userAgent, entorno, versiones) y etiquetas para filtrar en tu SIEM.

    ¿Cómo pruebo esto en tests?

    En E2E y navegadores reales verifica Response.type. En unit tests simula HttpErrorResponse con responseType para validar rutas de logging y comportamiento del interceptor.

  • Cómo Vitest se convierte en el test runner por defecto en Angular 21

    Cómo Vitest se convierte en el test runner por defecto en Angular 21

    Vitest como test runner por defecto en Angular 21

    Tiempo estimado de lectura: 3 min

    • Ideas clave:
    • Angular 21 define a Vitest como runner de tests por defecto, unificando pipeline con Vite/esbuild.
    • Ventajas técnicas: pipeline unificado, ESM-first, feedback más rápido en –watch, menos dependencias puente.
    • Riesgos a validar: compatibilidad con TestBed, zone.js, elección de entorno DOM y migración incremental en monorepos.
    • Estrategia recomendada: probar en branch, alinear vite.config.ts, migrar por iteraciones y mantener Karma/Jest hasta completar la transición.

    Vitest como test runner por defecto cambia algo más que un paquete en package.json: alinea el pipeline de pruebas con el mismo motor que compila y sirve tu aplicación (Vite/esbuild). En las primeras líneas: esto reduce discrepancias entre entorno de desarrollo y entorno de tests, acelera el feedback en modo watch y simplifica la gestión de módulos ESM. Angular 21 fija Vitest por defecto; Karma y Jest siguen soportados, pero la dirección es clara.

    Resumen rápido (lectores con prisa)

    Vitest es un runner sobre Vite optimizado para ESM y esbuild.

    Significa un pipeline unificado entre dev y tests, menos transformaciones duplicadas y feedback más rápido en –watch.

    Valida TestBed, zone.js y entornos DOM (jsdom vs happy-dom) antes de migrar.

    Migración recomendada por fases; mantener Karma/Jest hasta completar la cobertura en Vitest.

    Vitest como test runner por defecto: qué significa para tu arquitectura

    Vitest es un runner construido sobre Vite y optimizado para flujos ESM y esbuild. Al adoptar Vitest por defecto, Angular deja de tener dos pipelines distintos (uno para build/serve y otro para tests), lo que elimina una fuente frecuente de errores: transforms distintos, alias no replicados o compatibilidades ESM que “se rompen” solo en CI.

    Ventajas técnicas (no marketing)

    Pipeline unificado

    Same toolchain para dev y tests. Menos config duplicada = menos fallos de integración.

    ESM-first

    Vitest trata paquetes ESM nativos sin hacks; adiós a transformIgnorePatterns interminables.

    Feedback más rápido en –watch

    Vite conoce el grafo de módulos y re-ejecuta solo lo necesario, reduciendo tiempos de feedback en desarrollo.

    Menos “glue” y dependencias puente

    Menos presets y adaptadores como los que Jest requería en proyectos Angular.

    Cuando la herramienta de testing comparte transformaciones exactas con tu dev server, tus tests reflejan la realidad del runtime.

    Ejemplo mínimo de integración y scripts

    Un ejemplo práctico de lo que cambias en un proyecto Angular:

    package.json (scripts)

    {
      "scripts": {
        "test": "vitest",
        "test:watch": "vitest --watch",
        "test:ci": "vitest --run"
      }
    }

    vite.config.ts (fragmento)

    import { defineConfig } from 'vite';
    import { angular } from '@analogjs/vite-plugin-angular'; // ejemplo de integración si aplica
    
    export default defineConfig({
      test: {
        environment: 'happy-dom', // o 'jsdom' según tus necesidades
        globals: true
      }
    });

    Estos archivos muestran la convergencia: tu vite.config.ts puede centralizar transformaciones y alias que antes había que duplicar para Jest o Karma.

    Riesgos y puntos a validar antes de migrar

    • TestBed y APIs específicas de Angular: sigue funcionando, pero revisa utilidades que dependan de polyfills o zone.js. Algunas configuraciones de test legacy pueden requerir ajustes.
    • Entornos DOM: Vitest soporta jsdom y happy-dom; valida cuál reproduce mejor tu suite (render tests, componentes con animaciones, etc.).
    • Monorepos y grandes bases de tests: migrar toda la suite puede ser costoso de golpe; planifica migraciones por paquetes o por dominios funcionales.
    • Cold starts en CI: aunque Vitest suele ser rápido, en suites masivas el rendimiento en cold start depende mucho de la configuración y del entorno del runner (compara con tus números reales).

    Estrategia práctica de migración (tech-lead friendly)

    1. Probar en un branch: instala Vitest y configura un ejemplo mínimo (un módulo o paquete).
    2. Alinear vite.config.ts: centraliza las transformaciones que usas en dev (alias, plugins).
    3. Comparar modos: ejecutar la suite en modo watch y en CI (run) para comparar tiempos y fallos.
    4. Migración por iteraciones: migrar grupos de tests por feature o carpeta, ajustando mocks y environment según sea necesario.
    5. Mantener Karma/Jest activos: mantenerlos durante la transición; eliminar cuando el 100% de tests pasen en Vitest y la monitorización confirme estabilidad.

    Si quieres una herramienta rápida para estimar el impacto, mide:

    • Tiempo total de test en CI antes/después.
    • Tasa de falsos negativos/positivos detectados por cambio de runner.
    • Tiempo medio de feedback en dev (–watch).

    CI/CD: ganancias reales

    En CI obtendrás beneficios prácticos:

    • Menor complejidad en runners (menos paquetes, menos instalación).
    • Startup más rápido y menor consumo de memoria en contenedores.
    • Pipeline más predecible al usar el mismo empaquetador que en dev.

    Ejemplo breve (GitHub Actions step):

    - name: Run tests
      run: npm ci && npm run test:ci

    Sin Webpack en la ecuación, la instalación y ejecución suelen ser más ágiles.

    Cuándo no migrar aún

    • Si tienes una suite de tests con integración muy fina en Jest (configuraciones Nx o monorepos con dependencias internas) y el coste de migración supera el beneficio inmediato.
    • Si dependes de plugins de Jest que no tienen equivalentes en Vitest y que son críticos para tu flujo.

    En esos casos, planifica la migración como iniciativa de medio plazo: arranca con nuevos proyectos y módulos para ganar experiencia.

    Conclusión

    Vitest como test runner por defecto en Angular 21 no es solo una nueva opción: es la consolidación de una decisión de coherencia técnica. Para proyectos nuevos, adopta Vitest. Para proyectos con Karma, planifica la migración cuanto antes. Para entornos Jest maduros, valora ROI y migra por fases. La apuesta central aquí es menos complejidad operativa, menos errores por discrepancias de herramientas y tests que realmente reflejan el comportamiento en producción.

    Lecturas y recursos:

    FAQ

    Respuesta: Vitest es un test runner construido sobre Vite, optimizado para flujos ESM y esbuild. Comparte transformaciones con el dev server de Vite, lo que reduce discrepancias entre desarrollo y tests.

    Respuesta: Angular 21 fija Vitest por defecto para alinear pipelines, reducir duplicación de configuración y mejorar la coherencia entre runtime de desarrollo y entorno de tests.

    Respuesta: Validar compatibilidad de TestBed y APIs específicas de Angular, dependencia en zone.js o polyfills, y elegir el entorno DOM adecuado (jsdom vs happy-dom).

    Respuesta: Depende de tu suite. jsdom puede ser más completo en APIs DOM; happy-dom suele ser más ligero. Probar ambos según componentes y animaciones es la vía correcta.

    Respuesta: Migrar por paquetes o dominios funcionales, no todo de golpe. Medir impacto en cada iteración y mantener herramientas legacy activas hasta validar cobertura completa en Vitest.

    Respuesta: Sí. Mantener Jest o Karma durante la transición es recomendable. Eliminar solo cuando todos los tests pasen en Vitest y la monitorización confirme estabilidad.

    Respuesta: Medir tiempo total de test en CI antes/después, tasa de falsos negativos/positivos por cambio de runner y tiempo medio de feedback en dev (–watch).