claude-code-arcane 1.0.1 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/agents/engineering/e2e-tester.md +65 -0
  3. package/agents/engineering/nestjs-engineer.md +74 -0
  4. package/agents/engineering/nextjs-engineer.md +72 -0
  5. package/agents/engineering/nextjs-reviewer.md +40 -0
  6. package/hooks/statusline.sh +57 -31
  7. package/package.json +1 -1
  8. package/profiles/backend-nestjs.yaml +58 -0
  9. package/profiles/backend-nextjs.yaml +56 -0
  10. package/rules/nestjs-code.md +73 -0
  11. package/rules/nextjs-code.md +60 -0
  12. package/rules/react-perf.md +59 -0
  13. package/skills/ai-sdk-setup/SKILL.md +82 -0
  14. package/skills/nestjs-best-practices/SKILL.md +70 -0
  15. package/skills/nestjs-best-practices/references/api-design.md +34 -0
  16. package/skills/nestjs-best-practices/references/architecture.md +53 -0
  17. package/skills/nestjs-best-practices/references/database.md +37 -0
  18. package/skills/nestjs-best-practices/references/dependency-injection.md +45 -0
  19. package/skills/nestjs-best-practices/references/error-handling.md +43 -0
  20. package/skills/nestjs-best-practices/references/microservices-devops.md +41 -0
  21. package/skills/nestjs-best-practices/references/performance.md +32 -0
  22. package/skills/nestjs-best-practices/references/security.md +50 -0
  23. package/skills/nestjs-best-practices/references/testing.md +32 -0
  24. package/skills/nestjs-scaffold/SKILL.md +75 -0
  25. package/skills/nextjs-best-practices/SKILL.md +64 -0
  26. package/skills/nextjs-best-practices/references/advanced.md +21 -0
  27. package/skills/nextjs-best-practices/references/bundle-size.md +32 -0
  28. package/skills/nextjs-best-practices/references/client-fetching.md +20 -0
  29. package/skills/nextjs-best-practices/references/javascript.md +47 -0
  30. package/skills/nextjs-best-practices/references/rendering.md +46 -0
  31. package/skills/nextjs-best-practices/references/rerender.md +55 -0
  32. package/skills/nextjs-best-practices/references/server.md +47 -0
  33. package/skills/nextjs-best-practices/references/waterfalls.md +41 -0
  34. package/skills/nextjs-scaffold/SKILL.md +76 -0
  35. package/skills/pgvector-search/SKILL.md +67 -0
  36. package/skills/seo-nextjs/SKILL.md +81 -0
@@ -0,0 +1,59 @@
1
+ ---
2
+ paths:
3
+ - "**/*.tsx"
4
+ - "**/*.jsx"
5
+ - "src/components/**"
6
+ - "src/hooks/**"
7
+ - "components/**"
8
+ - "hooks/**"
9
+ ---
10
+
11
+ # React Performance Rules
12
+
13
+ Reglas de re-render, rendering y micro-optimización JS para React. Ordenadas por impacto. Catálogo completo (64 reglas) + ejemplos: skill `nextjs-best-practices`.
14
+
15
+ ## HIGH — Estructura de componentes
16
+
17
+ - **No definir componentes dentro de componentes.** Definir a nivel módulo o extraer; definirlos inline los remonta en cada render (pierde estado, mata performance).
18
+ - **`content-visibility: auto`** para listas largas — difiere render y paint de lo que está off-screen.
19
+ - **`defer`/`async` en `<script>`** para no bloquear el render durante el parsing.
20
+ - **Resource hints de React DOM** (`preload`, `preconnect`, `prefetchDNS`) para recursos críticos.
21
+
22
+ ## MEDIUM — Re-render optimization
23
+
24
+ - **Calcular derived state durante el render**, no guardarlo en `useState` (se desincroniza y genera renders extra).
25
+ - **Leer state dinámico en el callback**, no suscribirse en render time cuando solo se usa en un handler.
26
+ - **Functional `setState`** (`setX(prev => ...)`) para operar sobre el último valor y crear callbacks estables.
27
+ - **Lazy state init**: pasar función a `useState(() => expensive())` para no recomputar en cada render.
28
+ - **`useTransition` para updates no urgentes**; `useDeferredValue` para mantener inputs responsivos durante cómputo pesado.
29
+ - **`useRef` para valores transitorios** (no-UI) que cambian seguido y no deben disparar render.
30
+ - **Extraer defaults no-primitivos** de componentes memoizados a constantes a nivel módulo (preserva la memoización).
31
+ - **Side effects de interacción van en event handlers**, no en `useEffect`.
32
+ - **Dependencias de effect primitivas y estrechas**, no objetos enteros.
33
+
34
+ ## LOW-MEDIUM — useMemo / JS
35
+
36
+ - **No envolver expresiones simples en `useMemo`** — el overhead del hook supera el cómputo.
37
+ - **Index maps (`Map`) para lookups repetidos** en vez de `.find()`/`.includes()` en loops → O(1).
38
+ - **`.flatMap()`** en lugar de `.map().filter(Boolean)`; combinar iteraciones múltiples de array en un solo loop.
39
+ - **Hoist de `RegExp`** a nivel módulo (no recrear en cada render).
40
+ - **Early return** cuando el resultado ya está determinado; chequear `length` antes de operaciones caras (sort).
41
+ - **`.toSorted()`** en vez de `.sort()` para inmutabilidad.
42
+
43
+ ## Hydration
44
+
45
+ - Evitar mismatch sin flicker con scripts inline síncronos cuando se actualiza el DOM antes de hidratar.
46
+ - `suppressHydrationWarning` solo para diferencias server/client intencionales (fechas, IDs).
47
+ - Conditional rendering explícito con ternario, no `&&` (evita renderizar `0` u otros falsy).
48
+
49
+ ## Anti-Patterns
50
+
51
+ - Componentes definidos dentro del render de otro componente
52
+ - `useMemo`/`useCallback` por default "por las dudas" sin medir
53
+ - `useEffect` para lógica que pertenece a un event handler
54
+ - Guardar en state lo que se puede derivar de props/state existentes
55
+ - `.find()` dentro de `.map()` (O(n²)) sobre listas grandes
56
+
57
+ ---
58
+
59
+ _Derivado de [vercel-labs/agent-skills](https://github.com/vercel-labs/agent-skills) (react-best-practices, MIT). Condensado al formato Arcane._
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: ai-sdk-setup
3
+ description: "Integrar features de IA en Next.js con el Vercel AI SDK: streaming de chat, tool calling, structured output, agents y RAG. Default a modelos Claude. Usar al agregar chat, generación o agentes a una app Next/Node."
4
+ category: "ai"
5
+ argument-hint: "[chat|stream|tools|structured|agent|rag]"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Bash, Write, Edit, Task
8
+ ---
9
+ # ai-sdk-setup — Vercel AI SDK con Claude
10
+
11
+ ## MANDATORY WORKFLOW
12
+
13
+ > **Antes de codear features LLM, leer la skill `claude-api`** para model IDs vigentes, params y pricing. No asumir de memoria.
14
+
15
+ ### Step 0: Gather Requirements
16
+ 1. **Caso:** chat / generación one-shot / extracción structured / agente con tools / RAG
17
+ 2. **Streaming** al cliente o respuesta completa
18
+ 3. **Modelo:** Opus 4.8 (`claude-opus-4-8`, razonamiento) / Sonnet 4.6 (`claude-sonnet-4-6`, balance) / Haiku 4.5 (`claude-haiku-4-5-20251001`, rápido/barato)
19
+ 4. ¿Necesita tool calling / structured output / RAG (ver skill `pgvector-search`)?
20
+
21
+ ### Step 1: Instalar
22
+ ```bash
23
+ pnpm add ai @ai-sdk/anthropic zod
24
+ # env: ANTHROPIC_API_KEY (validar con Zod en src/lib/env.ts, nunca hardcodear)
25
+ ```
26
+
27
+ ### Step 2: Chat con streaming (Route Handler)
28
+ ```ts
29
+ // app/api/chat/route.ts
30
+ import { anthropic } from '@ai-sdk/anthropic';
31
+ import { streamText, convertToModelMessages } from 'ai';
32
+
33
+ export async function POST(req: Request) {
34
+ const { messages } = await req.json();
35
+ const result = streamText({
36
+ model: anthropic('claude-sonnet-4-6'),
37
+ messages: convertToModelMessages(messages),
38
+ });
39
+ return result.toUIMessageStreamResponse();
40
+ }
41
+ ```
42
+ Cliente: `useChat()` de `@ai-sdk/react`.
43
+
44
+ ### Step 3: Structured output (Zod)
45
+ ```ts
46
+ const { object } = await generateObject({
47
+ model: anthropic('claude-sonnet-4-6'),
48
+ schema: z.object({ sentiment: z.enum(['pos','neg','neutral']), score: z.number() }),
49
+ prompt: text,
50
+ });
51
+ ```
52
+
53
+ ### Step 4: Tool calling / agente
54
+ ```ts
55
+ const result = await generateText({
56
+ model: anthropic('claude-opus-4-8'),
57
+ tools: {
58
+ search: tool({
59
+ description: 'Buscar docs', inputSchema: z.object({ q: z.string() }),
60
+ execute: async ({ q }) => searchDocs(q),
61
+ }),
62
+ },
63
+ stopWhen: stepCountIs(5), // loop multi-step controlado
64
+ prompt,
65
+ });
66
+ ```
67
+
68
+ ### Step 5: Buenas prácticas
69
+ - **Server-only** la API key — nunca exponer al cliente
70
+ - Auth en el route handler (como cualquier API route — ver rule `nextjs-code`)
71
+ - Rate limiting en endpoints de IA (costo $)
72
+ - Prompt caching para system prompts grandes (ver skill `claude-api`)
73
+ - Manejar errores de stream y abort (`AbortController`)
74
+ - Validar/parsear toda salida structured con Zod antes de usarla
75
+
76
+ ## Cierre
77
+
78
+ Probar el endpoint con streaming real, verificar manejo de errores/abort y que la API key nunca llega al cliente. Endpoint funcionando + key server-only → integración **READY**. Confirmar el approach con el usuario antes de escribir código. Siguiente paso: skill `claude-api` para tuning de modelo/caching, o `pgvector-search` para RAG.
79
+
80
+ ---
81
+
82
+ _Inspirado en las skills de AI SDK de [laguagu/claude-code-nextjs-skills](https://github.com/laguagu/claude-code-nextjs-skills). Adaptado al formato Arcane y a modelos Claude. Verificar API/SDK contra la skill `claude-api`._
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: nestjs-best-practices
3
+ description: "NestJS production best practices: 40 reglas en 10 categorías (arquitectura, DI, errores, seguridad, performance, testing, DB/ORM, API, microservicios, devops) priorizadas por impacto. Usar al escribir/revisar código NestJS."
4
+ category: "backend"
5
+ argument-hint: "[architecture|di|security|performance|testing|database|api|all]"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Bash, Write, Edit, Task
8
+ ---
9
+ # nestjs-best-practices — Guía priorizada por impacto
10
+
11
+ 40 reglas para aplicaciones NestJS production-ready, organizadas en 10 categorías y priorizadas de **CRITICAL** a **LOW-MEDIUM**. Cada regla del catálogo (en `references/`) trae impacto, ejemplo incorrecto, ejemplo correcto y link a docs.
12
+
13
+ ## MANDATORY WORKFLOW
14
+
15
+ **No aplicar las 40 reglas a ciegas. Diagnosticar primero, priorizar por impacto.**
16
+
17
+ ### Step 0: Determinar scope
18
+
19
+ 1. **¿Código nuevo o auditoría de existente?** Si es auditoría, leer primero el módulo/servicio objetivo.
20
+ 2. **¿Qué categoría aplica?** Mapear el área del problema (ver tabla) o usar `all` para review completa.
21
+ 3. **¿Hay síntomas concretos?** (crashes, lentitud, N+1, leaks) → ir directo a la categoría relevante.
22
+
23
+ ### Step 1: Priorizar por impacto
24
+
25
+ Aplicar en este orden — no bajar de nivel hasta resolver el anterior:
26
+
27
+ | Prioridad | Categoría | Impacto | Reference |
28
+ |-----------|-----------|---------|-----------|
29
+ | 1 | Architecture | CRITICAL | `references/architecture.md` |
30
+ | 2 | Dependency Injection | CRITICAL | `references/dependency-injection.md` |
31
+ | 3 | Error Handling | HIGH | `references/error-handling.md` |
32
+ | 4 | Security | HIGH | `references/security.md` |
33
+ | 5 | Performance | HIGH | `references/performance.md` |
34
+ | 6 | Database & ORM | MEDIUM-HIGH | `references/database.md` |
35
+ | 7 | Testing | MEDIUM-HIGH | `references/testing.md` |
36
+ | 8 | API Design | MEDIUM | `references/api-design.md` |
37
+ | 9 | Microservices | MEDIUM | `references/microservices-devops.md` |
38
+ | 10 | DevOps & Deployment | LOW-MEDIUM | `references/microservices-devops.md` |
39
+
40
+ ### Step 2: Aplicar + verificar
41
+
42
+ Para cada regla relevante: leer el ejemplo correcto en el reference, aplicarlo, y verificar contra el checklist de cierre.
43
+
44
+ ### Step 3: Checklist de cierre
45
+
46
+ - [ ] Sin dependencias circulares (`madge --circular` o equivalente)
47
+ - [ ] Constructor injection en todos los providers; cero `ModuleRef.get()` en runtime
48
+ - [ ] `ValidationPipe` global + DTOs decorados en todos los endpoints
49
+ - [ ] Guards declarativos para auth/authz (no checks manuales)
50
+ - [ ] Sin N+1 (eager loading / joins donde corresponde)
51
+ - [ ] Migraciones versionadas, `synchronize: false` en prod
52
+ - [ ] Graceful shutdown (SIGTERM) + health checks
53
+ - [ ] Structured logging (JSON)
54
+
55
+ Si todo el checklist pasa → código **COMPLIANT**. Antes de escribir cambios significativos, confirmar el approach con el usuario (Question → Decision → Approval).
56
+
57
+ ## Tabla de mapeo síntoma → categoría
58
+
59
+ | Síntoma | Categoría |
60
+ |---------|-----------|
61
+ | Crash al arrancar / módulos no resuelven | Architecture, DI |
62
+ | Lentitud en endpoints, muchas queries | Performance, Database |
63
+ | Errores 500 inconsistentes / leaks de stack traces | Error Handling |
64
+ | Endpoints expuestos / brute force / data sensible | Security |
65
+ | Tests frágiles o que llaman servicios reales | Testing |
66
+ | Respuestas inconsistentes / circular refs | API Design |
67
+
68
+ ---
69
+
70
+ _Adaptado de [kadajett/agent-nestjs-skills](https://github.com/kadajett/agent-nestjs-skills). El repo original compila reglas atómicas (`rules/*.md`) a un `AGENTS.md` vía build script; acá se reorganizó al formato skill+references de Arcane._
@@ -0,0 +1,34 @@
1
+ # 8. API Design (MEDIUM)
2
+
3
+ ## 8.1 Use DTOs and Serialization for Responses — MEDIUM
4
+
5
+ Transformar entidades antes de retornar → controlar exposición, evitar referencias circulares, consistencia.
6
+ ```ts
7
+ export class UserResponseDto {
8
+ @Expose() id: string;
9
+ @Expose() email: string;
10
+ @Exclude() password: string; // nunca sale
11
+ }
12
+ // @UseInterceptors(ClassSerializerInterceptor)
13
+ ```
14
+
15
+ ## 8.2 Use Interceptors for Cross-Cutting Concerns — MEDIUM
16
+
17
+ Logging, transformación, formato de respuesta uniforme (`{ data, meta }`) vía interceptors, no repetido en cada handler.
18
+
19
+ ## 8.3 Use Pipes for Input Transformation — MEDIUM
20
+
21
+ Pipes built-in (`ParseIntPipe`, `ParseUUIDPipe`) y custom para validar/transformar input.
22
+ ```ts
23
+ @Get(':id') findOne(@Param('id', ParseUUIDPipe) id: string) {}
24
+ ```
25
+
26
+ ## 8.4 Use API Versioning for Breaking Changes — MEDIUM
27
+
28
+ Versionar endpoints para mantener compatibilidad.
29
+ ```ts
30
+ app.enableVersioning({ type: VersioningType.URI }); // /v1/users
31
+ @Controller({ path: 'users', version: '1' })
32
+ ```
33
+
34
+ _Ref: https://docs.nestjs.com/techniques/serialization · https://docs.nestjs.com/techniques/versioning_
@@ -0,0 +1,53 @@
1
+ # 1. Architecture (CRITICAL)
2
+
3
+ ## 1.1 Avoid Circular Dependencies — CRITICAL
4
+
5
+ Causa #1 de crashes en runtime. `forwardRef()` es un parche, no una solución.
6
+
7
+ **Incorrecto** — A importa B, B importa A:
8
+ ```ts
9
+ // users.service.ts → inyecta OrdersService
10
+ // orders.service.ts → inyecta UsersService ⇒ ciclo
11
+ ```
12
+ **Correcto** — extraer lo compartido a un tercer módulo o usar eventos:
13
+ ```ts
14
+ // Mover la lógica común a SharedModule, o emitir un evento
15
+ this.eventEmitter.emit('order.created', payload);
16
+ ```
17
+
18
+ ## 1.2 Organize by Feature Modules — CRITICAL
19
+
20
+ Estructurar por feature, no por capa técnica → desarrollo 3-5x más rápido.
21
+
22
+ ```
23
+ src/
24
+ users/ { users.module.ts, users.controller.ts, users.service.ts, dto/ }
25
+ orders/ { orders.module.ts, ... }
26
+ ```
27
+ No: `controllers/`, `services/`, `repositories/` globales.
28
+
29
+ ## 1.3 Proper Module Sharing — CRITICAL
30
+
31
+ Exportar servicios desde un módulo dedicado garantiza instancia singleton.
32
+
33
+ **Correcto:**
34
+ ```ts
35
+ @Module({ providers: [UsersService], exports: [UsersService] })
36
+ export class UsersModule {}
37
+ // Otro módulo: imports: [UsersModule] → reusa la MISMA instancia
38
+ ```
39
+ Re-declarar el provider en otro módulo crea una instancia nueva → estado inconsistente.
40
+
41
+ ## 1.4 Single Responsibility for Services — CRITICAL
42
+
43
+ Un servicio = un concepto de dominio. +40% testabilidad. Si un servicio hace auth + email + billing, separarlo.
44
+
45
+ ## 1.5 Event-Driven Architecture for Decoupling — MEDIUM-HIGH
46
+
47
+ Emitir eventos de dominio (`@nestjs/event-emitter`) para desacoplar módulos y permitir procesamiento async sin dependencias directas.
48
+
49
+ ## 1.6 Repository Pattern for Data Access — HIGH
50
+
51
+ Encapsular queries en repositorios; separar lógica de negocio de la persistencia. El servicio depende de una abstracción `UserRepository`, no del ORM directamente.
52
+
53
+ _Ref: https://docs.nestjs.com/modules · https://docs.nestjs.com/fundamentals/circular-dependency_
@@ -0,0 +1,37 @@
1
+ # 7. Database & ORM (MEDIUM-HIGH)
2
+
3
+ ## 7.1 Avoid N+1 Query Problems — HIGH
4
+
5
+ El asesino silencioso de performance. Eager loading con relations o joins.
6
+
7
+ **Incorrecto** — 1 query + N queries en loop:
8
+ ```ts
9
+ const orders = await this.orderRepo.find();
10
+ for (const o of orders) o.user = await this.userRepo.findOne(o.userId); // N+1
11
+ ```
12
+ **Correcto:**
13
+ ```ts
14
+ // Prisma
15
+ prisma.order.findMany({ include: { user: true } });
16
+ // TypeORM
17
+ this.orderRepo.find({ relations: ['user'] });
18
+ ```
19
+
20
+ ## 7.3 Use Transactions for Multi-Step Operations — MEDIUM-HIGH
21
+
22
+ Operaciones dependientes en una transacción → consistencia ante fallos.
23
+ ```ts
24
+ await this.prisma.$transaction(async (tx) => {
25
+ await tx.account.update({ where: { id: from }, data: { balance: { decrement: amt } } });
26
+ await tx.account.update({ where: { id: to }, data: { balance: { increment: amt } } });
27
+ });
28
+ ```
29
+
30
+ ## 7.2 Use Database Migrations — MEDIUM-HIGH
31
+
32
+ Versionar cambios de schema con migraciones. **Nunca `synchronize: true` en producción** (puede borrar datos).
33
+ ```ts
34
+ TypeOrmModule.forRoot({ synchronize: false, migrationsRun: true });
35
+ ```
36
+
37
+ _Ref: https://docs.nestjs.com/techniques/database · https://www.prisma.io/docs/orm/prisma-migrate_
@@ -0,0 +1,45 @@
1
+ # 2. Dependency Injection (CRITICAL)
2
+
3
+ ## 2.4 Prefer Constructor Injection — CRITICAL
4
+
5
+ Visibilidad, type safety y testabilidad. Siempre.
6
+ ```ts
7
+ @Injectable()
8
+ export class OrdersService {
9
+ constructor(private readonly users: UsersService) {}
10
+ }
11
+ ```
12
+
13
+ ## 2.1 Avoid Service Locator Anti-Pattern — HIGH
14
+
15
+ **Incorrecto:**
16
+ ```ts
17
+ const svc = this.moduleRef.get(UsersService); // dependencia oculta, no testeable
18
+ ```
19
+ **Correcto:** inyectar por constructor (2.4). `ModuleRef` solo para casos dinámicos justificados.
20
+
21
+ ## 2.5 Understand Provider Scopes — CRITICAL
22
+
23
+ `DEFAULT` (singleton) por defecto. `REQUEST` scope tiene costo de performance (instancia por request) → usar solo cuando se necesita contexto de request real.
24
+ ```ts
25
+ @Injectable({ scope: Scope.REQUEST }) // solo si es necesario
26
+ ```
27
+
28
+ ## 2.6 Use Injection Tokens for Interfaces — HIGH
29
+
30
+ Las interfaces de TS no existen en runtime → no se pueden inyectar. Usar símbolo o abstract class como token.
31
+ ```ts
32
+ export const USER_REPO = Symbol('USER_REPO');
33
+ @Module({ providers: [{ provide: USER_REPO, useClass: PrismaUserRepository }] })
34
+ // constructor(@Inject(USER_REPO) private repo: UserRepository) {}
35
+ ```
36
+
37
+ ## 2.2 Interface Segregation — HIGH
38
+
39
+ Interfaces chicas y enfocadas, no "fat interfaces" que fuerzan dependencias sin usar.
40
+
41
+ ## 2.3 Liskov Substitution — HIGH
42
+
43
+ Toda implementación de una interfaz honra el contrato idéntico → intercambiables sin romper consumidores.
44
+
45
+ _Ref: https://docs.nestjs.com/fundamentals/custom-providers · https://docs.nestjs.com/fundamentals/injection-scopes_
@@ -0,0 +1,43 @@
1
+ # 3. Error Handling (HIGH)
2
+
3
+ ## 3.2 Throw HTTP Exceptions from Services — HIGH
4
+
5
+ Los servicios lanzan excepciones, no retornan objetos de error.
6
+
7
+ **Incorrecto:**
8
+ ```ts
9
+ return { error: 'not found' }; // el controller tiene que adivinar
10
+ ```
11
+ **Correcto:**
12
+ ```ts
13
+ throw new NotFoundException(`User ${id} not found`);
14
+ ```
15
+
16
+ ## 3.1 Handle Async Errors Properly — HIGH
17
+
18
+ Fire-and-forget y background tasks deben atrapar errores → si no, unhandled rejection puede tumbar el proceso.
19
+
20
+ **Incorrecto:**
21
+ ```ts
22
+ this.mailer.send(email); // floating promise, error perdido
23
+ ```
24
+ **Correcto:**
25
+ ```ts
26
+ void this.mailer.send(email).catch(err => this.logger.error('mail failed', err));
27
+ ```
28
+
29
+ ## 3.3 Use Exception Filters — HIGH
30
+
31
+ Filtro global para formato de respuesta de error consistente y centralizado.
32
+ ```ts
33
+ @Catch()
34
+ export class AllExceptionsFilter implements ExceptionFilter {
35
+ catch(exception: unknown, host: ArgumentsHost) {
36
+ // shape único: { statusCode, message, timestamp, path }
37
+ }
38
+ }
39
+ // app.useGlobalFilters(new AllExceptionsFilter());
40
+ ```
41
+ Nunca filtrar stack traces crudos al cliente en producción.
42
+
43
+ _Ref: https://docs.nestjs.com/exception-filters_
@@ -0,0 +1,41 @@
1
+ # 9. Microservices (MEDIUM) & 10. DevOps (LOW-MEDIUM)
2
+
3
+ ## 9.1 Implement Health Checks — MEDIUM
4
+
5
+ Endpoints readiness/liveness con `@nestjs/terminus` para que el orquestador maneje la salud del servicio.
6
+ ```ts
7
+ @Get('health') @HealthCheck()
8
+ check() { return this.health.check([() => this.db.pingCheck('db')]); }
9
+ ```
10
+
11
+ ## 9.2 Message and Event Patterns Correctly — MEDIUM
12
+
13
+ Distinguir request-response (`@MessagePattern`) de event-based (`@EventPattern`). Usar el patrón correcto según si se espera respuesta.
14
+
15
+ ## 9.3 Use Message Queues for Background Jobs — MEDIUM
16
+
17
+ Offload de tareas largas a colas (`@nestjs/bull` / BullMQ) → no bloquear handlers de request.
18
+ ```ts
19
+ await this.reportQueue.add('generate', { userId }); // responde rápido, procesa async
20
+ ```
21
+
22
+ ## 10.1 Implement Graceful Shutdown — MEDIUM
23
+
24
+ Escuchar SIGTERM, completar requests in-flight antes de salir.
25
+ ```ts
26
+ app.enableShutdownHooks();
27
+ // onModuleDestroy() { await this.drainConnections(); }
28
+ ```
29
+
30
+ ## 10.2 Use ConfigModule for Environment Config — MEDIUM
31
+
32
+ Config por entorno vía `ConfigModule`, validada al boot. Nada hardcodeado.
33
+ ```ts
34
+ ConfigModule.forRoot({ validationSchema: Joi.object({ DATABASE_URL: Joi.string().required() }) });
35
+ ```
36
+
37
+ ## 10.3 Use Structured Logging — LOW-MEDIUM
38
+
39
+ Logging JSON consistente (pino/winston) con `request_id`, `trace_id` para parseo/filtrado en producción.
40
+
41
+ _Ref: https://docs.nestjs.com/recipes/terminus · https://docs.nestjs.com/microservices/basics · https://docs.nestjs.com/techniques/configuration_
@@ -0,0 +1,32 @@
1
+ # 5. Performance (HIGH)
2
+
3
+ ## 5.3 Optimize Database Queries — HIGH
4
+
5
+ Seleccionar solo columnas necesarias, índices apropiados, no over-fetch de relaciones.
6
+ ```ts
7
+ // Prisma: select explícito en vez de traer la fila entera + relaciones
8
+ prisma.user.findMany({ select: { id: true, email: true } });
9
+ ```
10
+
11
+ ## 5.4 Use Caching Strategically — HIGH
12
+
13
+ Cachear operaciones caras con TTL apropiado e invalidación basada en eventos.
14
+ ```ts
15
+ @UseInterceptors(CacheInterceptor)
16
+ @CacheTTL(30)
17
+ @Get('stats') getStats() { /* ... */ }
18
+ ```
19
+
20
+ ## 5.1 Async Lifecycle Hooks Correctly — HIGH
21
+
22
+ Retornar promesas de hooks async; constructores síncronos (no bloquear el arranque).
23
+ ```ts
24
+ async onModuleInit() { await this.warmupCache(); } // ✓
25
+ // constructor(){ await ... } ✗ no se puede / bloquea
26
+ ```
27
+
28
+ ## 5.2 Lazy Loading for Large Modules — MEDIUM
29
+
30
+ Diferir inicialización de módulos poco usados con `LazyModuleLoader` → menor tiempo de arranque y memoria.
31
+
32
+ _Ref: https://docs.nestjs.com/techniques/caching · https://docs.nestjs.com/fundamentals/lazy-loading-modules_
@@ -0,0 +1,50 @@
1
+ # 4. Security (HIGH)
2
+
3
+ ## 4.1 Secure JWT Authentication — CRITICAL
4
+
5
+ Tokens de vida corta (15m) + refresh tokens. Secreto en env/secret manager. Nunca data sensible en el payload.
6
+ ```ts
7
+ JwtModule.register({
8
+ secret: process.env.JWT_SECRET, // nunca hardcodeado
9
+ signOptions: { expiresIn: '15m' },
10
+ });
11
+ // payload: { sub: userId, role } ← nada de passwords, emails completos, PII
12
+ ```
13
+
14
+ ## 4.5 Validate All Input with DTOs and Pipes — HIGH
15
+
16
+ `ValidationPipe` global + DTOs decorados. Rechazar input malformado antes de procesarlo.
17
+ ```ts
18
+ app.useGlobalPipes(new ValidationPipe({
19
+ whitelist: true, // descarta props no declaradas
20
+ forbidNonWhitelisted: true, // 400 si vienen props extra
21
+ transform: true,
22
+ }));
23
+
24
+ export class CreateUserDto {
25
+ @IsEmail() email: string;
26
+ @MinLength(8) password: string;
27
+ }
28
+ ```
29
+
30
+ ## 4.4 Use Guards for AuthN/AuthZ — HIGH
31
+
32
+ Guards declarativos, no checks manuales en cada handler.
33
+ ```ts
34
+ @UseGuards(JwtAuthGuard, RolesGuard)
35
+ @Roles('admin')
36
+ @Get('users') findAll() { /* ... */ }
37
+ ```
38
+
39
+ ## 4.2 Rate Limiting — HIGH
40
+
41
+ `@nestjs/throttler`, límites por endpoint (login más estricto que lecturas).
42
+ ```ts
43
+ @Throttle({ default: { limit: 5, ttl: 60000 } }) // 5/min en /login
44
+ ```
45
+
46
+ ## 4.3 Sanitize Output to Prevent XSS — HIGH
47
+
48
+ Sanitizar contenido generado por usuario antes de almacenar; `Content-Type` correcto en respuestas.
49
+
50
+ _Ref: https://docs.nestjs.com/security/authentication · https://docs.nestjs.com/security/rate-limiting_
@@ -0,0 +1,32 @@
1
+ # 6. Testing (MEDIUM-HIGH)
2
+
3
+ ## 6.3 Use Testing Module for Unit Tests — HIGH
4
+
5
+ Entorno aislado con `Test.createTestingModule` y dependencias mockeadas.
6
+ ```ts
7
+ const moduleRef = await Test.createTestingModule({
8
+ providers: [
9
+ OrdersService,
10
+ { provide: UserRepository, useValue: mockUserRepo },
11
+ ],
12
+ }).compile();
13
+ const service = moduleRef.get(OrdersService);
14
+ ```
15
+
16
+ ## 6.2 Mock External Services in Tests — HIGH
17
+
18
+ Nunca llamar APIs o DBs reales en tests. Mockear todas las dependencias externas con escenarios realistas (éxito, error, timeout).
19
+
20
+ ## 6.1 Use Supertest for E2E Testing — HIGH
21
+
22
+ Probar el ciclo completo request/response incluyendo middleware, guards y pipes. Setup/teardown apropiados.
23
+ ```ts
24
+ const app = moduleRef.createNestApplication();
25
+ await app.init();
26
+ await request(app.getHttpServer())
27
+ .post('/users').send({ email: 'a@b.com', password: 'secret123' })
28
+ .expect(201);
29
+ await app.close();
30
+ ```
31
+
32
+ _Ref: https://docs.nestjs.com/fundamentals/testing_
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: nestjs-scaffold
3
+ description: "Scaffold de API NestJS production-ready con módulos por feature, DI, ValidationPipe global, Prisma/Drizzle, guards de auth y testing. Usar para iniciar un backend NestJS nuevo."
4
+ category: "backend"
5
+ argument-hint: "[project-name]"
6
+ user-invocable: true
7
+ allowed-tools: Read, Glob, Grep, Bash, Write, Edit, Task
8
+ ---
9
+ # nestjs-scaffold — NestJS API Scaffolder
10
+
11
+ ## MANDATORY WORKFLOW
12
+
13
+ **Antes de generar cualquier código, completar estos pasos en orden.**
14
+
15
+ ### Step 0: Gather Requirements
16
+ 1. **Nombre del servicio** (kebab-case)
17
+ 2. **Transport:** REST (default) / GraphQL / microservicio
18
+ 3. **ORM:** Prisma (default) / Drizzle / TypeORM
19
+ 4. **DB:** PostgreSQL (default) / MySQL
20
+ 5. **Auth:** JWT + refresh (default) / OAuth / ninguna
21
+ 6. **Deploy:** Docker (default) / Railway / AWS ECS
22
+
23
+ ### Step 1: Crear base
24
+ ```bash
25
+ npm i -g @nestjs/cli
26
+ nest new <name> --package-manager pnpm
27
+ cd <name>
28
+ nest g module users && nest g controller users && nest g service users
29
+ ```
30
+
31
+ ### Step 2: Estructura (feature modules — NO por capa)
32
+ ```
33
+ src/
34
+ users/ { users.module.ts, users.controller.ts, users.service.ts, dto/, entities/ }
35
+ auth/ { auth.module.ts, jwt.strategy.ts, guards/, decorators/ }
36
+ common/ { filters/, interceptors/, pipes/ }
37
+ config/ { config.module.ts, env.validation.ts }
38
+ main.ts
39
+ ```
40
+
41
+ ### Step 3: Bootstrap no negociable (`main.ts`)
42
+ ```ts
43
+ app.useGlobalPipes(new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true }));
44
+ app.useGlobalFilters(new AllExceptionsFilter());
45
+ app.enableShutdownHooks(); // graceful shutdown
46
+ app.enableVersioning({ type: VersioningType.URI });
47
+ ```
48
+
49
+ ### Step 4: Defaults
50
+ - Constructor injection siempre; cero `ModuleRef.get()` en runtime
51
+ - DTOs decorados (`class-validator`) en todos los endpoints
52
+ - Guards declarativos para auth/authz
53
+ - `ConfigModule` con validación de env (Joi/Zod) al boot
54
+ - Migraciones versionadas, `synchronize: false`
55
+ - Health check (`@nestjs/terminus`) + structured logging (pino)
56
+ - Tests: `Test.createTestingModule` (unit) + supertest (e2e)
57
+
58
+ ### Step 5: Verificar
59
+ `npm run build` + `npm run test`. Revisar contra la rule `nestjs-code` y el skill `nestjs-best-practices`. Build + tests verdes → scaffold **READY**.
60
+
61
+ ## Stack Defaults
62
+
63
+ | Componente | Default |
64
+ |------------|---------|
65
+ | Framework | NestJS 10+ |
66
+ | ORM | Prisma |
67
+ | DB | PostgreSQL |
68
+ | Auth | JWT + refresh tokens |
69
+ | Validación | class-validator + ValidationPipe |
70
+ | Testing | Jest + supertest |
71
+ | Deploy | Docker |
72
+
73
+ ---
74
+
75
+ _Inspirado en las skills NestJS de [kadajett/agent-nestjs-skills](https://github.com/kadajett/agent-nestjs-skills) y [giuseppe-trisciuoglio/developer-kit](https://github.com/giuseppe-trisciuoglio/developer-kit). Adaptado al formato Arcane._