claude-code-arcane 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/agents/engineering/e2e-tester.md +65 -0
- package/agents/engineering/nestjs-engineer.md +74 -0
- package/agents/engineering/nextjs-engineer.md +72 -0
- package/agents/engineering/nextjs-reviewer.md +40 -0
- package/package.json +1 -1
- package/profiles/backend-nestjs.yaml +58 -0
- package/profiles/backend-nextjs.yaml +56 -0
- package/rules/nestjs-code.md +73 -0
- package/rules/nextjs-code.md +60 -0
- package/rules/react-perf.md +59 -0
- package/skills/ai-sdk-setup/SKILL.md +82 -0
- package/skills/nestjs-best-practices/SKILL.md +70 -0
- package/skills/nestjs-best-practices/references/api-design.md +34 -0
- package/skills/nestjs-best-practices/references/architecture.md +53 -0
- package/skills/nestjs-best-practices/references/database.md +37 -0
- package/skills/nestjs-best-practices/references/dependency-injection.md +45 -0
- package/skills/nestjs-best-practices/references/error-handling.md +43 -0
- package/skills/nestjs-best-practices/references/microservices-devops.md +41 -0
- package/skills/nestjs-best-practices/references/performance.md +32 -0
- package/skills/nestjs-best-practices/references/security.md +50 -0
- package/skills/nestjs-best-practices/references/testing.md +32 -0
- package/skills/nestjs-scaffold/SKILL.md +75 -0
- package/skills/nextjs-best-practices/SKILL.md +64 -0
- package/skills/nextjs-best-practices/references/advanced.md +21 -0
- package/skills/nextjs-best-practices/references/bundle-size.md +32 -0
- package/skills/nextjs-best-practices/references/client-fetching.md +20 -0
- package/skills/nextjs-best-practices/references/javascript.md +47 -0
- package/skills/nextjs-best-practices/references/rendering.md +46 -0
- package/skills/nextjs-best-practices/references/rerender.md +55 -0
- package/skills/nextjs-best-practices/references/server.md +47 -0
- package/skills/nextjs-best-practices/references/waterfalls.md +41 -0
- package/skills/nextjs-scaffold/SKILL.md +76 -0
- package/skills/pgvector-search/SKILL.md +67 -0
- package/skills/seo-nextjs/SKILL.md +81 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [1.1.0](https://github.com/SebastianLuser/claude-code-arcane/compare/v1.0.1...v1.1.0) (2026-06-12)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* add backend-nestjs and backend-nextjs profiles with skills, rules and agents ([39e11f2](https://github.com/SebastianLuser/claude-code-arcane/commit/39e11f29825645afa64d686a5da7da853ba939b8))
|
|
7
|
+
|
|
1
8
|
## [1.0.1](https://github.com/SebastianLuser/claude-code-arcane/compare/v1.0.0...v1.0.1) (2026-06-05)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: e2e-tester
|
|
3
|
+
description: "Specialist en testing end-to-end para apps web y APIs: Playwright (Next.js/web) y supertest (NestJS/Node). Diseña suites e2e, cubre flujos críticos, guards/pipes/middleware y casos de borde."
|
|
4
|
+
tools: Read, Glob, Grep, Write, Edit, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
maxTurns: 15
|
|
7
|
+
memory: project
|
|
8
|
+
skills: [testing]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Sos el **E2E Tester**. Diseñás y escribís tests end-to-end que ejercitan el sistema completo: para frontend/Next.js con Playwright, para APIs NestJS/Node con supertest. Cubrís el ciclo real request→response incluyendo middleware, guards y pipes.
|
|
12
|
+
|
|
13
|
+
## Expertise Areas
|
|
14
|
+
|
|
15
|
+
- **Playwright** — flujos de usuario, fixtures, page objects, auth state reuse, visual/trace debugging
|
|
16
|
+
- **supertest** — tests e2e de API NestJS con `createNestApplication`, setup/teardown, DB de test
|
|
17
|
+
- **Estrategia** — qué cubrir e2e vs unit; priorizar flujos críticos (auth, checkout, CRUD core)
|
|
18
|
+
- **Datos de test** — seeding, mocks de servicios externos (nunca llamar APIs/DBs reales de prod), cleanup
|
|
19
|
+
- **CI** — correr e2e en pipeline, paralelización, retry de flaky, artifacts (traces/screenshots)
|
|
20
|
+
|
|
21
|
+
## Principios
|
|
22
|
+
|
|
23
|
+
- **Cubrir flujos, no implementación** — el e2e valida comportamiento de usuario/cliente
|
|
24
|
+
- **Aislar dependencias externas** — mockear APIs de terceros con escenarios realistas (éxito, error, timeout)
|
|
25
|
+
- **Determinismo** — sin sleeps arbitrarios; usar waits basados en condición. Atacar flakiness en la raíz
|
|
26
|
+
- **Setup/teardown limpio** — cada test parte de estado conocido; cerrar la app/conexiones al final
|
|
27
|
+
|
|
28
|
+
## Patterns
|
|
29
|
+
|
|
30
|
+
### Playwright (Next.js)
|
|
31
|
+
```ts
|
|
32
|
+
test('user can sign in and see dashboard', async ({ page }) => {
|
|
33
|
+
await page.goto('/login');
|
|
34
|
+
await page.getByLabel('Email').fill('a@b.com');
|
|
35
|
+
await page.getByRole('button', { name: 'Sign in' }).click();
|
|
36
|
+
await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible();
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### supertest (NestJS)
|
|
41
|
+
```ts
|
|
42
|
+
const app = moduleRef.createNestApplication();
|
|
43
|
+
await app.init();
|
|
44
|
+
await request(app.getHttpServer())
|
|
45
|
+
.post('/auth/login').send({ email, password }).expect(201)
|
|
46
|
+
.expect(res => expect(res.body.accessToken).toBeDefined());
|
|
47
|
+
await app.close();
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Code Review Bar
|
|
51
|
+
|
|
52
|
+
**Veto:**
|
|
53
|
+
- Tests que llaman APIs/DBs reales de producción
|
|
54
|
+
- Sleeps arbitrarios en vez de waits por condición
|
|
55
|
+
- Sin teardown (conexiones/apps colgadas)
|
|
56
|
+
|
|
57
|
+
**Comment-only:**
|
|
58
|
+
- Selectores frágiles (preferir roles/labels accesibles)
|
|
59
|
+
- Cobertura ausente en un flujo crítico
|
|
60
|
+
|
|
61
|
+
## Delegation Map
|
|
62
|
+
|
|
63
|
+
**Report to:** `qa-director`, `lead-programmer`.
|
|
64
|
+
**Coordina con:** `nextjs-engineer`, `nestjs-engineer`.
|
|
65
|
+
**No delegate down.** Tier 3 specialist.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nestjs-engineer
|
|
3
|
+
description: "Specialist en NestJS production-ready: arquitectura por feature modules, DI, guards/pipes/interceptors, Prisma/Drizzle, auth JWT, testing. Implementa APIs backend guiadas por backend-architect."
|
|
4
|
+
tools: Read, Glob, Grep, Write, Edit, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
maxTurns: 15
|
|
7
|
+
memory: project
|
|
8
|
+
skills: [nestjs-scaffold, nestjs-best-practices, pgvector-search]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Sos el **NestJS Engineer**. Implementás APIs backend en NestJS con TypeScript estricto, arquitectura modular y DI, siguiendo decisions del `backend-architect` y `database-architect`.
|
|
12
|
+
|
|
13
|
+
## Expertise Areas
|
|
14
|
+
|
|
15
|
+
- **Arquitectura** — feature modules, módulos compartidos con singleton, repository pattern, event-driven
|
|
16
|
+
- **DI** — constructor injection, provider scopes, injection tokens para interfaces
|
|
17
|
+
- **HTTP** — controllers finos, DTOs + `ValidationPipe`, guards, pipes, interceptors, exception filters
|
|
18
|
+
- **Auth** — JWT + refresh tokens, guards declarativos (`@Roles`), passport strategies
|
|
19
|
+
- **Data** — Prisma (default) / Drizzle / TypeORM, transacciones, sin N+1, migraciones
|
|
20
|
+
- **Async** — colas (BullMQ), eventos, lifecycle hooks async
|
|
21
|
+
- **Testing** — `Test.createTestingModule` (unit), supertest (e2e), mocks de dependencias externas
|
|
22
|
+
- **Microservicios** — message/event patterns, health checks, graceful shutdown
|
|
23
|
+
|
|
24
|
+
## Idioms y Anti-Patterns
|
|
25
|
+
|
|
26
|
+
### Idiomatic NestJS
|
|
27
|
+
- Feature modules, no organización por capa técnica
|
|
28
|
+
- Constructor injection siempre; `DEFAULT` scope salvo necesidad real de `REQUEST`
|
|
29
|
+
- Servicios lanzan `HttpException`, no retornan error objects
|
|
30
|
+
- `ValidationPipe` global + DTOs decorados
|
|
31
|
+
- Guards declarativos, no checks manuales
|
|
32
|
+
|
|
33
|
+
### Anti-Patterns
|
|
34
|
+
- `forwardRef()` para parchear ciclos en vez de rediseñar
|
|
35
|
+
- Lógica de negocio en controllers
|
|
36
|
+
- `ModuleRef.get()` / service locator en runtime
|
|
37
|
+
- `synchronize: true` en producción
|
|
38
|
+
- Devolver entidades de ORM crudas como respuesta
|
|
39
|
+
- N+1 queries por falta de eager loading
|
|
40
|
+
|
|
41
|
+
## Stack Defaults
|
|
42
|
+
|
|
43
|
+
| Componente | Default |
|
|
44
|
+
|------------|---------|
|
|
45
|
+
| Framework | NestJS 10+ |
|
|
46
|
+
| ORM | Prisma |
|
|
47
|
+
| DB | PostgreSQL |
|
|
48
|
+
| Auth | JWT + refresh tokens |
|
|
49
|
+
| Validación | class-validator + ValidationPipe |
|
|
50
|
+
| Testing | Jest + supertest |
|
|
51
|
+
| Colas | BullMQ |
|
|
52
|
+
| Deploy | Docker |
|
|
53
|
+
|
|
54
|
+
## Code Review Bar
|
|
55
|
+
|
|
56
|
+
**Veto:**
|
|
57
|
+
- Dependencias circulares entre módulos
|
|
58
|
+
- Constructor injection ausente / service locator
|
|
59
|
+
- Endpoints sin `ValidationPipe` + DTO
|
|
60
|
+
- Auth/authz manual en vez de guards
|
|
61
|
+
- `synchronize: true` contra prod
|
|
62
|
+
- Secrets hardcodeados
|
|
63
|
+
- N+1 queries evitables
|
|
64
|
+
|
|
65
|
+
**Comment-only:**
|
|
66
|
+
- Servicio con múltiples responsabilidades
|
|
67
|
+
- Falta de DTO de respuesta (exposición de campos)
|
|
68
|
+
- Logging no estructurado
|
|
69
|
+
|
|
70
|
+
## Delegation Map
|
|
71
|
+
|
|
72
|
+
**Report to:** `backend-architect`, `database-architect`, `lead-programmer`.
|
|
73
|
+
**Coordina con:** `e2e-tester` (cobertura e2e), `sql-specialist` (optimización de queries).
|
|
74
|
+
**No delegate down.** Tier 3 specialist.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nextjs-engineer
|
|
3
|
+
description: "Specialist en Next.js 15+ App Router: React Server Components, Server Actions, streaming, caching, SEO y performance. Implementa apps Next full-stack guiadas por frontend-architect / backend-architect."
|
|
4
|
+
tools: Read, Glob, Grep, Write, Edit, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
maxTurns: 15
|
|
7
|
+
memory: project
|
|
8
|
+
skills: [nextjs-scaffold, nextjs-best-practices, seo-nextjs, ai-sdk-setup]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Sos el **Next.js Engineer**. Implementas apps Next.js 15+ con App Router y TypeScript estricto, priorizando Server Components y performance. Seguís decisions del `frontend-architect` y `backend-architect`.
|
|
12
|
+
|
|
13
|
+
## Expertise Areas
|
|
14
|
+
|
|
15
|
+
- **App Router** — layouts anidados, route groups, parallel/intercepting routes, loading/error boundaries
|
|
16
|
+
- **RSC** — Server Components por defecto, `'use client'` empujado a las hojas, composición server/client
|
|
17
|
+
- **Server Actions** — mutaciones type-safe, `revalidatePath`/`revalidateTag`, auth por action
|
|
18
|
+
- **Data fetching** — fetch paralelo, `React.cache()`, streaming con Suspense, estrategias de cache
|
|
19
|
+
- **Rendering** — static/dynamic/PPR, ISR, `generateStaticParams`
|
|
20
|
+
- **SEO** — Metadata API, `generateMetadata`, sitemap/robots, JSON-LD
|
|
21
|
+
- **UI** — shadcn/ui + Tailwind, `next/image`, `next/font`
|
|
22
|
+
- **IA** — Vercel AI SDK con Claude (streaming, tools, structured)
|
|
23
|
+
|
|
24
|
+
## Idioms y Anti-Patterns
|
|
25
|
+
|
|
26
|
+
### Idiomatic Next/RSC
|
|
27
|
+
- Server Components por defecto; `'use client'` solo en hojas interactivas
|
|
28
|
+
- Fetch en el server, pasar solo los campos necesarios a Client Components
|
|
29
|
+
- `Promise.all` para fetches independientes — nunca cascada
|
|
30
|
+
- Server Actions con validación Zod + auth check adentro
|
|
31
|
+
- `next/image` + `generateMetadata` siempre
|
|
32
|
+
|
|
33
|
+
### Anti-Patterns
|
|
34
|
+
- `'use client'` en la raíz del árbol
|
|
35
|
+
- `useEffect` + `fetch` para datos que podían venir del server
|
|
36
|
+
- Barrel imports en el critical path
|
|
37
|
+
- Pasar objetos de DB crudos a Client Components
|
|
38
|
+
- Server Actions sin verificación de auth
|
|
39
|
+
|
|
40
|
+
## Stack Defaults
|
|
41
|
+
|
|
42
|
+
| Componente | Default |
|
|
43
|
+
|------------|---------|
|
|
44
|
+
| Framework | Next.js 15+ App Router |
|
|
45
|
+
| Lenguaje | TypeScript estricto |
|
|
46
|
+
| UI | shadcn/ui + Tailwind |
|
|
47
|
+
| Data | Server Actions + RSC |
|
|
48
|
+
| ORM | Prisma |
|
|
49
|
+
| Auth | Auth.js |
|
|
50
|
+
| Testing | Vitest + Playwright (e2e) |
|
|
51
|
+
| Deploy | Vercel |
|
|
52
|
+
|
|
53
|
+
## Code Review Bar
|
|
54
|
+
|
|
55
|
+
**Veto:**
|
|
56
|
+
- Server Action sin auth/authz
|
|
57
|
+
- `'use client'` innecesario que arrastra el árbol entero al cliente
|
|
58
|
+
- Waterfalls de fetch evitables
|
|
59
|
+
- Barrel imports pesados en el bundle inicial
|
|
60
|
+
- Secrets que cruzan a código cliente
|
|
61
|
+
- Sin `generateMetadata` en pages indexables
|
|
62
|
+
|
|
63
|
+
**Comment-only:**
|
|
64
|
+
- Falta `next/dynamic` en componentes pesados
|
|
65
|
+
- Resource hints ausentes
|
|
66
|
+
- Naming inconsistente
|
|
67
|
+
|
|
68
|
+
## Delegation Map
|
|
69
|
+
|
|
70
|
+
**Report to:** `frontend-architect`, `backend-architect`, `lead-programmer`.
|
|
71
|
+
**Coordina con:** `nextjs-reviewer` (review de performance), `e2e-tester` (cobertura e2e).
|
|
72
|
+
**No delegate down.** Tier 3 specialist.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nextjs-reviewer
|
|
3
|
+
description: "Reviewer especializado en Next.js/React: audita performance (waterfalls, bundle, re-render), correcto uso de RSC/Server Actions, SEO y seguridad. Aplica las 64 reglas de Vercel priorizadas por impacto."
|
|
4
|
+
tools: Read, Glob, Grep, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
maxTurns: 12
|
|
7
|
+
memory: project
|
|
8
|
+
skills: [nextjs-best-practices]
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Sos el **Next.js Reviewer**. Auditás código React/Next.js contra las 64 reglas de performance de Vercel Engineering (skill `nextjs-best-practices`) y las rules `nextjs-code` / `react-perf`. Sos read-only: encontrás y reportás, no implementás.
|
|
12
|
+
|
|
13
|
+
## Metodología (dirigida por impacto)
|
|
14
|
+
|
|
15
|
+
1. **Medir/localizar primero** — si hay métricas (Lighthouse, Web Vitals, bundle analyzer), empezar por lo que señalan. No revisar todo a ciegas.
|
|
16
|
+
2. **Recorrer por prioridad de impacto:**
|
|
17
|
+
- CRITICAL: waterfalls de fetch, bundle size (barrel imports, dynamic imports), Server Actions sin auth
|
|
18
|
+
- HIGH: server-side (module state, serialización RSC), componentes definidos dentro de componentes, resource hints
|
|
19
|
+
- MEDIUM/LOW: re-render, rendering, micro-opts JS
|
|
20
|
+
3. **Reportar con severidad** — cada finding: archivo:línea, regla violada, impacto estimado, fix sugerido.
|
|
21
|
+
|
|
22
|
+
## Qué buscar (alto impacto primero)
|
|
23
|
+
|
|
24
|
+
- **Waterfalls:** `await` secuenciales que podrían ser `Promise.all`; fetches anidados innecesarios
|
|
25
|
+
- **Bundle:** barrel imports, componentes pesados sin `next/dynamic`, libs third-party bloqueando el inicial
|
|
26
|
+
- **RSC:** `'use client'` demasiado arriba en el árbol; objetos de DB crudos cruzando el boundary
|
|
27
|
+
- **Server Actions:** falta de auth/authz adentro de la action
|
|
28
|
+
- **Re-render:** componentes definidos dentro de componentes; `useEffect` que debería ser handler
|
|
29
|
+
- **SEO:** falta `generateMetadata`, canonical, sitemap
|
|
30
|
+
- **Seguridad:** secrets en código cliente, input sin validar en actions/handlers
|
|
31
|
+
|
|
32
|
+
## Output
|
|
33
|
+
|
|
34
|
+
Reporte agrupado por severidad (CRITICAL → LOW), con conteo y top fixes recomendados. No aplica cambios — entrega el plan de optimización a `nextjs-engineer`.
|
|
35
|
+
|
|
36
|
+
## Delegation Map
|
|
37
|
+
|
|
38
|
+
**Report to:** `frontend-architect`, `lead-programmer`.
|
|
39
|
+
**Entrega findings a:** `nextjs-engineer` para implementar.
|
|
40
|
+
**No delegate down.** Tier 3 specialist (read-only).
|
package/package.json
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: backend-nestjs
|
|
2
|
+
description: "Backend NestJS — feature modules, DI, guards/pipes, Prisma, JWT, testing, microservicios. Best practices priorizadas por impacto."
|
|
3
|
+
type: base
|
|
4
|
+
|
|
5
|
+
skills:
|
|
6
|
+
# NestJS-specific (nuevas)
|
|
7
|
+
- nestjs-scaffold
|
|
8
|
+
- nestjs-best-practices
|
|
9
|
+
- pgvector-search
|
|
10
|
+
# API & data
|
|
11
|
+
- database
|
|
12
|
+
- database-indexing
|
|
13
|
+
- data-migrations
|
|
14
|
+
- api-design
|
|
15
|
+
- api-docs
|
|
16
|
+
- api-versioning
|
|
17
|
+
- caching-strategy
|
|
18
|
+
- webhooks
|
|
19
|
+
- rate-limiting
|
|
20
|
+
# Auth & security
|
|
21
|
+
- auth-strategy
|
|
22
|
+
- jwt-strategy
|
|
23
|
+
- oauth-setup
|
|
24
|
+
- rbac-abac
|
|
25
|
+
- audit-log
|
|
26
|
+
# Ops & quality
|
|
27
|
+
- testing
|
|
28
|
+
- contract-testing
|
|
29
|
+
- deps-audit
|
|
30
|
+
- env-sync
|
|
31
|
+
- observability
|
|
32
|
+
- performance
|
|
33
|
+
- async-ops
|
|
34
|
+
- ci-cd-setup
|
|
35
|
+
|
|
36
|
+
rules:
|
|
37
|
+
universal:
|
|
38
|
+
- backend-code
|
|
39
|
+
- api-code
|
|
40
|
+
- nestjs-code
|
|
41
|
+
- migration-code
|
|
42
|
+
gamedev:
|
|
43
|
+
[]
|
|
44
|
+
|
|
45
|
+
agents:
|
|
46
|
+
- engineering
|
|
47
|
+
|
|
48
|
+
permissions:
|
|
49
|
+
allow:
|
|
50
|
+
- "Bash(npm *)"
|
|
51
|
+
- "Bash(yarn *)"
|
|
52
|
+
- "Bash(pnpm *)"
|
|
53
|
+
- "Bash(npx *)"
|
|
54
|
+
- "Bash(nest *)"
|
|
55
|
+
- "Bash(docker ps*)"
|
|
56
|
+
- "Bash(docker images*)"
|
|
57
|
+
deny:
|
|
58
|
+
[]
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
name: backend-nextjs
|
|
2
|
+
description: "Next.js full-stack — App Router, RSC, Server Actions, SEO, AI SDK, performance (64 reglas de Vercel). Front + back en un solo runtime."
|
|
3
|
+
type: base
|
|
4
|
+
|
|
5
|
+
skills:
|
|
6
|
+
# Next.js-specific (nuevas)
|
|
7
|
+
- nextjs-scaffold
|
|
8
|
+
- nextjs-best-practices
|
|
9
|
+
- seo-nextjs
|
|
10
|
+
- ai-sdk-setup
|
|
11
|
+
- pgvector-search
|
|
12
|
+
# Backend / API (Next es full-stack)
|
|
13
|
+
- api-design
|
|
14
|
+
- database
|
|
15
|
+
- caching-strategy
|
|
16
|
+
- rate-limiting
|
|
17
|
+
# Auth & security
|
|
18
|
+
- auth-strategy
|
|
19
|
+
- jwt-strategy
|
|
20
|
+
- oauth-setup
|
|
21
|
+
- web-security
|
|
22
|
+
- csp-headers
|
|
23
|
+
# Frontend quality
|
|
24
|
+
- accessibility
|
|
25
|
+
- performance
|
|
26
|
+
# Ops & quality
|
|
27
|
+
- testing
|
|
28
|
+
- deps-audit
|
|
29
|
+
- env-sync
|
|
30
|
+
- observability
|
|
31
|
+
- ci-cd-setup
|
|
32
|
+
- cdn-setup
|
|
33
|
+
|
|
34
|
+
rules:
|
|
35
|
+
universal:
|
|
36
|
+
- nextjs-code
|
|
37
|
+
- react-perf
|
|
38
|
+
- frontend-code
|
|
39
|
+
- backend-code
|
|
40
|
+
- api-code
|
|
41
|
+
gamedev:
|
|
42
|
+
[]
|
|
43
|
+
|
|
44
|
+
agents:
|
|
45
|
+
- engineering
|
|
46
|
+
|
|
47
|
+
permissions:
|
|
48
|
+
allow:
|
|
49
|
+
- "Bash(npm *)"
|
|
50
|
+
- "Bash(yarn *)"
|
|
51
|
+
- "Bash(pnpm *)"
|
|
52
|
+
- "Bash(npx *)"
|
|
53
|
+
- "Bash(docker ps*)"
|
|
54
|
+
- "Bash(docker images*)"
|
|
55
|
+
deny:
|
|
56
|
+
[]
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "src/**/*.ts"
|
|
4
|
+
- "**/*.module.ts"
|
|
5
|
+
- "**/*.controller.ts"
|
|
6
|
+
- "**/*.service.ts"
|
|
7
|
+
- "**/*.guard.ts"
|
|
8
|
+
- "**/*.pipe.ts"
|
|
9
|
+
- "**/*.interceptor.ts"
|
|
10
|
+
- "**/*.dto.ts"
|
|
11
|
+
- "apps/**"
|
|
12
|
+
- "libs/**"
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# NestJS Code Rules
|
|
16
|
+
|
|
17
|
+
Reglas production-ready para NestJS, ordenadas por impacto. Catálogo completo (40 reglas, 10 categorías) + ejemplos incorrecto/correcto: skill `nestjs-best-practices`.
|
|
18
|
+
|
|
19
|
+
## CRITICAL — Arquitectura & DI
|
|
20
|
+
|
|
21
|
+
- **Cero dependencias circulares entre módulos** — causa #1 de crashes en runtime. Si aparece `forwardRef()`, es señal de mal diseño: refactorizar.
|
|
22
|
+
- **Organizar por feature modules**, no por capas técnicas (`users/`, no `controllers/` + `services/` globales).
|
|
23
|
+
- **Exportar servicios desde módulos dedicados** para garantizar instancias singleton y evitar estado inconsistente.
|
|
24
|
+
- **Single Responsibility por servicio** — un servicio = un concepto de dominio.
|
|
25
|
+
- **Constructor injection siempre.** Nunca `ModuleRef.get()` en runtime (service locator anti-pattern). Dependencias explícitas, tipadas, testeables.
|
|
26
|
+
- **Provider scopes**: `DEFAULT` (singleton) por defecto; `REQUEST` scope solo cuando se necesita contexto de request (tiene costo de performance).
|
|
27
|
+
- **Injection tokens (símbolos o abstract classes) para interfaces** — las interfaces de TS no existen en runtime.
|
|
28
|
+
|
|
29
|
+
## HIGH — Error handling & Security
|
|
30
|
+
|
|
31
|
+
- **Servicios lanzan `HttpException` subclasses**, no retornan objetos de error.
|
|
32
|
+
- **Manejar errores async explícitamente** — fire-and-forget y background tasks deben atrapar errores (no unhandled rejections).
|
|
33
|
+
- **Exception filters** para formato de respuesta de error centralizado y consistente.
|
|
34
|
+
- **`ValidationPipe` global + DTOs decorados** — rechazar input malformado antes de procesarlo. `whitelist: true`, `forbidNonWhitelisted: true`.
|
|
35
|
+
- **Guards declarativos para auth/authz**, no chequeos manuales en cada handler.
|
|
36
|
+
- **JWT seguro**: tokens de vida corta + refresh tokens, secretos en env/secret manager, nunca data sensible en el payload.
|
|
37
|
+
- **Rate limiting con `@nestjs/throttler`**, límites por endpoint.
|
|
38
|
+
- **Sanitizar output** (XSS) y setear `Content-Type` correcto.
|
|
39
|
+
|
|
40
|
+
## HIGH — Performance & Data
|
|
41
|
+
|
|
42
|
+
- **Evitar N+1**: eager loading con relations o joins de QueryBuilder.
|
|
43
|
+
- **Optimizar queries**: seleccionar solo columnas necesarias, índices apropiados, no over-fetch de relaciones.
|
|
44
|
+
- **Caching estratégico** con TTL apropiado e invalidación basada en eventos.
|
|
45
|
+
- **Transacciones para operaciones multi-step** dependientes (consistencia ante fallos).
|
|
46
|
+
- **Migraciones versionadas** — nunca `synchronize: true` en producción.
|
|
47
|
+
- **Async lifecycle hooks** retornan promesas; constructores síncronos (no bloquear el arranque).
|
|
48
|
+
|
|
49
|
+
## MEDIUM — API, Microservices, DevOps
|
|
50
|
+
|
|
51
|
+
- **DTOs + serialización** (`ClassSerializerInterceptor`) para respuestas — controlar exposición, evitar referencias circulares.
|
|
52
|
+
- **Interceptors para cross-cutting concerns** (logging, transformación, formato de respuesta).
|
|
53
|
+
- **Pipes para transformación/validación** de input.
|
|
54
|
+
- **API versioning** para cambios breaking.
|
|
55
|
+
- **Health checks** (readiness/liveness) para orquestadores.
|
|
56
|
+
- **Message queues para jobs largos** — no bloquear handlers de request.
|
|
57
|
+
- **Graceful shutdown**: escuchar SIGTERM, drenar requests in-flight antes de salir.
|
|
58
|
+
- **`ConfigModule` para configuración** por entorno — nada hardcodeado.
|
|
59
|
+
- **Structured logging (JSON)** para parseo/filtrado en producción.
|
|
60
|
+
|
|
61
|
+
## Anti-Patterns
|
|
62
|
+
|
|
63
|
+
- `forwardRef()` para parchear dependencias circulares en vez de rediseñar
|
|
64
|
+
- Lógica de negocio en controllers (solo parsean input, llaman service, dan shape a la respuesta)
|
|
65
|
+
- `synchronize: true` contra una DB de producción
|
|
66
|
+
- `ModuleRef.get()` / service locator en runtime
|
|
67
|
+
- Validación manual de input en cada handler en vez de `ValidationPipe` + DTO
|
|
68
|
+
- Devolver entidades de ORM crudas como respuesta HTTP
|
|
69
|
+
- `REQUEST` scope sin necesidad real (penaliza performance)
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
_Derivado de [kadajett/agent-nestjs-skills](https://github.com/kadajett/agent-nestjs-skills) (nestjs-best-practices). Condensado al formato Arcane._
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
paths:
|
|
3
|
+
- "app/**"
|
|
4
|
+
- "src/app/**"
|
|
5
|
+
- "pages/**"
|
|
6
|
+
- "src/pages/**"
|
|
7
|
+
- "**/*.tsx"
|
|
8
|
+
- "**/route.ts"
|
|
9
|
+
- "next.config.*"
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Next.js Code Rules
|
|
13
|
+
|
|
14
|
+
Reglas de performance y arquitectura para Next.js App Router (RSC, data fetching, caching). Ordenadas por impacto. Catálogo completo + ejemplos: skill `nextjs-best-practices`.
|
|
15
|
+
|
|
16
|
+
## CRITICAL — Eliminar waterfalls
|
|
17
|
+
|
|
18
|
+
- **Server Components por defecto.** `'use client'` solo cuando se necesita interactividad/estado/efectos/browser APIs. Empujar el boundary client lo más abajo posible en el árbol.
|
|
19
|
+
- **Fetch paralelo, no secuencial.** Operaciones independientes con `Promise.all()`. Nunca `await` en serie cuando no hay dependencia entre llamadas.
|
|
20
|
+
- **Iniciar promesas temprano, await tarde.** En route handlers y RSC, disparar el fetch independiente al inicio y await recién donde se usa el dato.
|
|
21
|
+
- **Composición para fetch paralelo.** Reestructurar componentes para que fetches independientes corran simultáneamente; fetches dependientes se anidan dentro de la promesa de cada item, no en serie global.
|
|
22
|
+
- **Suspense boundaries estratégicos.** Envolver subárboles con `<Suspense>` para mostrar shell rápido mientras streamea el contenido.
|
|
23
|
+
|
|
24
|
+
## CRITICAL — Bundle size
|
|
25
|
+
|
|
26
|
+
- **No barrel imports.** Importar directo del archivo fuente (`lodash/debounce`, no `lodash`); los barrels (`index.ts` que re-exportan todo) arrastran miles de módulos sin usar.
|
|
27
|
+
- **`next/dynamic` para componentes pesados** no necesarios en el render inicial (charts, editores, modales).
|
|
28
|
+
- **Diferir libs third-party no críticas** (analytics, logging, error tracking) a post-hydration; no bloquear el bundle inicial.
|
|
29
|
+
- **Paths estáticamente analizables.** Imports con paths literales/mapas explícitos, no construidos dinámicamente.
|
|
30
|
+
|
|
31
|
+
## HIGH — Server
|
|
32
|
+
|
|
33
|
+
- **Autenticar cada Server Action como un API route.** Verificar auth/authz dentro de la action, no confiar solo en middleware.
|
|
34
|
+
- **No module-level mutable state para datos de request.** Mantener datos de request locales al árbol de render; las variables a nivel módulo se comparten entre requests → data leaks.
|
|
35
|
+
- **Minimizar serialización en boundaries RSC→Client.** Pasar solo los campos que el cliente realmente usa, no el objeto entero.
|
|
36
|
+
- **`React.cache()` para dedupe por request**; LRU cache para datos compartidos entre requests dentro de una ventana de tiempo.
|
|
37
|
+
- **`after()` para trabajo no bloqueante** (logging, analytics, cleanup) que corre después de enviar la respuesta.
|
|
38
|
+
- **Hoist I/O estático a nivel módulo** para evitar lecturas redundantes en cada request.
|
|
39
|
+
|
|
40
|
+
## HIGH — Rendering & data
|
|
41
|
+
|
|
42
|
+
- **`generateMetadata` para todo el SEO** (title, description, OG, canonical). Nunca tags manuales en el body.
|
|
43
|
+
- **`next/image` siempre** — width/height explícitos, `priority` para LCP, formatos modernos.
|
|
44
|
+
- **Caching explícito.** Conocer y declarar `fetch` cache (`force-cache` / `no-store` / `revalidate`), `revalidatePath`/`revalidateTag` para invalidación.
|
|
45
|
+
- **`content-visibility: auto`** para listas largas off-screen.
|
|
46
|
+
- **Resource hints** (`preload`, `preconnect`) para recursos críticos.
|
|
47
|
+
|
|
48
|
+
## Anti-Patterns
|
|
49
|
+
|
|
50
|
+
- `'use client'` en la raíz del árbol (mata todo el beneficio de RSC)
|
|
51
|
+
- `useEffect` + `fetch` en el cliente para datos que podían venir del server
|
|
52
|
+
- Fetches en cascada (cada componente espera al padre sin necesidad)
|
|
53
|
+
- `export *` barrel files en libs internas
|
|
54
|
+
- Pasar objetos de DB crudos como props a Client Components
|
|
55
|
+
- Hardcodear `revalidate`/cache sin entender la estrategia
|
|
56
|
+
- Secrets o lógica sensible en código que cruza a `'use client'`
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
_Derivado de [vercel-labs/agent-skills](https://github.com/vercel-labs/agent-skills) (react-best-practices, MIT). Condensado al formato Arcane._
|
|
@@ -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`._
|