elsabro 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +268 -0
- package/agents/elsabro-analyst.md +176 -0
- package/agents/elsabro-debugger.md +293 -0
- package/agents/elsabro-executor.md +477 -0
- package/agents/elsabro-orchestrator.md +426 -0
- package/agents/elsabro-planner.md +278 -0
- package/agents/elsabro-qa.md +273 -0
- package/agents/elsabro-quick-dev.md +309 -0
- package/agents/elsabro-scrum-master.md +217 -0
- package/agents/elsabro-tech-writer.md +347 -0
- package/agents/elsabro-ux-designer.md +278 -0
- package/agents/elsabro-verifier.md +295 -0
- package/agents/elsabro-yolo-dev.md +322 -0
- package/bin/install.js +497 -0
- package/commands/elsabro/add-phase.md +114 -0
- package/commands/elsabro/add-todo.md +158 -0
- package/commands/elsabro/audit-milestone.md +147 -0
- package/commands/elsabro/check-todos.md +192 -0
- package/commands/elsabro/complete-milestone.md +138 -0
- package/commands/elsabro/debug.md +153 -0
- package/commands/elsabro/discuss-phase.md +160 -0
- package/commands/elsabro/execute.md +299 -0
- package/commands/elsabro/help.md +102 -0
- package/commands/elsabro/insert-phase.md +117 -0
- package/commands/elsabro/list-phase-assumptions.md +129 -0
- package/commands/elsabro/map-codebase.md +108 -0
- package/commands/elsabro/new-milestone.md +128 -0
- package/commands/elsabro/new.md +230 -0
- package/commands/elsabro/pause-work.md +261 -0
- package/commands/elsabro/plan-milestone-gaps.md +129 -0
- package/commands/elsabro/plan.md +272 -0
- package/commands/elsabro/progress.md +187 -0
- package/commands/elsabro/quick.md +99 -0
- package/commands/elsabro/remove-phase.md +136 -0
- package/commands/elsabro/research-phase.md +174 -0
- package/commands/elsabro/resume-work.md +288 -0
- package/commands/elsabro/set-profile.md +216 -0
- package/commands/elsabro/settings.md +185 -0
- package/commands/elsabro/start.md +204 -0
- package/commands/elsabro/update.md +71 -0
- package/commands/elsabro/verify-work.md +269 -0
- package/commands/elsabro/verify.md +207 -0
- package/hooks/dist/.gitkeep +2 -0
- package/package.json +45 -0
- package/references/error-handling-instructions.md +312 -0
- package/references/source-hierarchy.md +150 -0
- package/references/token-optimization.md +225 -0
- package/skills/api-setup.md +315 -0
- package/skills/auth-setup.md +180 -0
- package/skills/database-setup.md +238 -0
- package/skills/expo-app.md +261 -0
- package/skills/nextjs-app.md +206 -0
- package/skills/payments-setup.md +421 -0
- package/skills/sentry-setup.md +295 -0
- package/templates/error-handling-config.json +138 -0
- package/templates/session-state.json +69 -0
- package/templates/starters/.gitkeep +2 -0
- package/workflows/.gitkeep +2 -0
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: source-hierarchy
|
|
3
|
+
description: Referencia que define la prioridad de fuentes de información (Context7 > Docs > WebSearch > Training)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Jerarquía de Fuentes
|
|
7
|
+
|
|
8
|
+
Esta referencia define el orden de prioridad para buscar información antes de planificar o implementar.
|
|
9
|
+
|
|
10
|
+
## Regla de Oro
|
|
11
|
+
|
|
12
|
+
**NUNCA confiar solo en el conocimiento de entrenamiento de Claude para APIs específicas, versiones, o sintaxis.**
|
|
13
|
+
|
|
14
|
+
El conocimiento de Claude puede tener 6-18 meses de antigüedad. Las librerías cambian constantemente.
|
|
15
|
+
|
|
16
|
+
## Jerarquía de Confianza
|
|
17
|
+
|
|
18
|
+
| Prioridad | Fuente | Confianza | Cuándo Usar |
|
|
19
|
+
|-----------|--------|-----------|-------------|
|
|
20
|
+
| 1 | **Context7** | HIGH | Cualquier librería/framework conocido |
|
|
21
|
+
| 2 | **Documentación oficial** (WebFetch) | MEDIUM-HIGH | Si Context7 no tiene cobertura |
|
|
22
|
+
| 3 | **WebSearch** | MEDIUM | Tendencias, comparaciones, problemas comunes |
|
|
23
|
+
| 4 | **Training Data** | LOW | Solo como último recurso, marcar como "no verificado" |
|
|
24
|
+
|
|
25
|
+
## Uso de Context7
|
|
26
|
+
|
|
27
|
+
### Cuándo SIEMPRE usar
|
|
28
|
+
|
|
29
|
+
- Sintaxis de API de cualquier librería
|
|
30
|
+
- Configuración de frameworks
|
|
31
|
+
- Patrones recomendados
|
|
32
|
+
- Versiones actuales
|
|
33
|
+
- Breaking changes recientes
|
|
34
|
+
|
|
35
|
+
### Cómo usar
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
1. Resolver librería:
|
|
39
|
+
mcp__plugin_context7_context7__resolve-library-id
|
|
40
|
+
Input: nombre de librería (ej: "next.js", "prisma", "tailwindcss")
|
|
41
|
+
Output: ID exacto con versión
|
|
42
|
+
|
|
43
|
+
2. Buscar documentación:
|
|
44
|
+
mcp__plugin_context7_context7__query-docs
|
|
45
|
+
Input: ID de librería + consulta específica
|
|
46
|
+
Output: Chunks de documentación + ejemplos
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Ejemplo
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
// Mal: Asumir sintaxis
|
|
53
|
+
const router = useRouter(); // ¿Es correcto para Next.js 15?
|
|
54
|
+
|
|
55
|
+
// Bien: Verificar primero
|
|
56
|
+
1. resolve-library-id("next.js") → /vercel/next.js/v15.0.3
|
|
57
|
+
2. query-docs(id, "useRouter app router") → [documentación actual]
|
|
58
|
+
3. Usar sintaxis verificada
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Uso de WebSearch
|
|
62
|
+
|
|
63
|
+
### Cuándo usar
|
|
64
|
+
|
|
65
|
+
- Comparar opciones (ej: "Prisma vs Drizzle 2026")
|
|
66
|
+
- Encontrar soluciones a errores específicos
|
|
67
|
+
- Verificar tendencias actuales
|
|
68
|
+
- Buscar artículos recientes
|
|
69
|
+
|
|
70
|
+
### Cómo usar
|
|
71
|
+
|
|
72
|
+
- SIEMPRE incluir el año actual en búsquedas
|
|
73
|
+
- Verificar hallazgos con Context7 o docs oficiales
|
|
74
|
+
- Marcar como MEDIUM confidence
|
|
75
|
+
|
|
76
|
+
### Ejemplo
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
WebSearch: "best authentication library nextjs 2026"
|
|
80
|
+
→ Encuentra: "NextAuth v5 es el estándar"
|
|
81
|
+
→ Verificar: Context7 query-docs para NextAuth v5
|
|
82
|
+
→ Usar: Información verificada
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Marcado de Confianza
|
|
86
|
+
|
|
87
|
+
En RESEARCH.md y PLAN.md, siempre indicar:
|
|
88
|
+
|
|
89
|
+
```markdown
|
|
90
|
+
## Stack Verificado
|
|
91
|
+
|
|
92
|
+
| Librería | Versión | Fuente | Confianza |
|
|
93
|
+
|----------|---------|--------|-----------|
|
|
94
|
+
| next.js | 15.0.3 | Context7 | HIGH |
|
|
95
|
+
| prisma | 5.20.0 | Context7 | HIGH |
|
|
96
|
+
| stripe | 14.0.0 | WebSearch + Context7 | HIGH |
|
|
97
|
+
| custom-lib | 1.0.0 | GitHub README | MEDIUM |
|
|
98
|
+
| otra-cosa | ? | Training data | LOW - VERIFICAR |
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Anti-Patrones
|
|
102
|
+
|
|
103
|
+
### ❌ No hacer
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
// Asumir sin verificar
|
|
107
|
+
"Usa el patrón estándar de Next.js..."
|
|
108
|
+
|
|
109
|
+
// Inventar APIs
|
|
110
|
+
"La función createUser() acepta..."
|
|
111
|
+
|
|
112
|
+
// Mezclar versiones
|
|
113
|
+
"En Next.js puedes usar getServerSideProps..."
|
|
114
|
+
(Esto es Pages Router, no App Router)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### ✅ Hacer
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
// Verificar primero
|
|
121
|
+
"Según Context7 (Next.js v15.0.3), el patrón actual es..."
|
|
122
|
+
|
|
123
|
+
// Citar fuente
|
|
124
|
+
"De acuerdo a la documentación oficial de Prisma 5.20..."
|
|
125
|
+
|
|
126
|
+
// Especificar versión
|
|
127
|
+
"Para Next.js 15 con App Router, usa Server Components..."
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Proceso de Investigación
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
1. ¿Es sobre una librería/framework?
|
|
134
|
+
SÍ → Context7 primero
|
|
135
|
+
NO → Continuar
|
|
136
|
+
|
|
137
|
+
2. ¿Context7 tiene información?
|
|
138
|
+
SÍ → Usar como fuente principal
|
|
139
|
+
NO → WebFetch a docs oficiales
|
|
140
|
+
|
|
141
|
+
3. ¿Necesito comparar opciones?
|
|
142
|
+
SÍ → WebSearch con año actual
|
|
143
|
+
NO → Continuar
|
|
144
|
+
|
|
145
|
+
4. ¿La información es reciente?
|
|
146
|
+
SÍ → Marcar confianza apropiada
|
|
147
|
+
NO → Buscar fuente más reciente
|
|
148
|
+
|
|
149
|
+
5. Documentar fuente y confianza
|
|
150
|
+
```
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: token-optimization
|
|
3
|
+
description: Estrategias para usar el contexto de Claude eficientemente (regla del 50%, lazy loading, waves)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Optimización de Tokens
|
|
7
|
+
|
|
8
|
+
Esta referencia define estrategias para usar el contexto de Claude de forma eficiente, manteniendo calidad.
|
|
9
|
+
|
|
10
|
+
## El Problema
|
|
11
|
+
|
|
12
|
+
Claude tiene una ventana de contexto limitada (~200K tokens). Cuando se llena:
|
|
13
|
+
- La calidad de respuestas degrada
|
|
14
|
+
- El modelo "olvida" instrucciones anteriores
|
|
15
|
+
- Aumentan las alucinaciones
|
|
16
|
+
|
|
17
|
+
## Solución: Context Budgeting
|
|
18
|
+
|
|
19
|
+
### Regla del 50%
|
|
20
|
+
|
|
21
|
+
**Cada plan debe poder ejecutarse usando máximo 50% del contexto.**
|
|
22
|
+
|
|
23
|
+
¿Por qué 50%?
|
|
24
|
+
- Deja espacio para el código generado
|
|
25
|
+
- Deja espacio para errores y correcciones
|
|
26
|
+
- Mantiene calidad consistente
|
|
27
|
+
|
|
28
|
+
Si un plan necesita más:
|
|
29
|
+
- Dividirlo en múltiples planes
|
|
30
|
+
- Ejecutar en waves separadas
|
|
31
|
+
|
|
32
|
+
### Presupuesto por Componente
|
|
33
|
+
|
|
34
|
+
| Componente | Budget Máximo | Notas |
|
|
35
|
+
|------------|---------------|-------|
|
|
36
|
+
| PROJECT.md | 5% | Resumen del proyecto |
|
|
37
|
+
| REQUIREMENTS.md | 5% | Lista de requisitos |
|
|
38
|
+
| RESEARCH.md | 10% | Solo hallazgos relevantes |
|
|
39
|
+
| PLAN.md | 15% | El plan actual |
|
|
40
|
+
| Código existente | 10% | Solo archivos relevantes |
|
|
41
|
+
| **Buffer** | 5% | Para imprevistos |
|
|
42
|
+
| **Total en entrada** | ~50% | Dejar 50% para output |
|
|
43
|
+
|
|
44
|
+
## Estrategias de Optimización
|
|
45
|
+
|
|
46
|
+
### 1. Lazy Loading
|
|
47
|
+
|
|
48
|
+
**NO hacer:**
|
|
49
|
+
```
|
|
50
|
+
Cargar TODO el codebase al inicio
|
|
51
|
+
Cargar TODA la documentación
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**SÍ hacer:**
|
|
55
|
+
```
|
|
56
|
+
Cargar solo archivos relevantes para ESTA tarea
|
|
57
|
+
Cargar solo secciones de docs necesarias
|
|
58
|
+
Usar @references que se resuelven on-demand
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 2. Compresión de Artifacts
|
|
62
|
+
|
|
63
|
+
**RESEARCH.md debe ser:**
|
|
64
|
+
```markdown
|
|
65
|
+
## Stack: Next.js 15 + Prisma 5
|
|
66
|
+
|
|
67
|
+
### Auth
|
|
68
|
+
- Usar NextAuth v5
|
|
69
|
+
- Patrón: middleware + session
|
|
70
|
+
|
|
71
|
+
### Pitfalls
|
|
72
|
+
- No usar jsonwebtoken (CommonJS issues)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**NO debe ser:**
|
|
76
|
+
```markdown
|
|
77
|
+
## Investigación Exhaustiva de Opciones de Autenticación
|
|
78
|
+
|
|
79
|
+
Después de analizar múltiples opciones incluyendo
|
|
80
|
+
Passport.js, Auth0, Clerk, y NextAuth, hemos determinado
|
|
81
|
+
que para este proyecto específico considerando los
|
|
82
|
+
requisitos de escalabilidad y facilidad de implementación...
|
|
83
|
+
[300 líneas más]
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 3. Referencias, No Copias
|
|
87
|
+
|
|
88
|
+
**NO hacer:**
|
|
89
|
+
```markdown
|
|
90
|
+
## Contexto
|
|
91
|
+
[Copiar todo PROJECT.md aquí]
|
|
92
|
+
[Copiar todo REQUIREMENTS.md aquí]
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**SÍ hacer:**
|
|
96
|
+
```markdown
|
|
97
|
+
## Contexto
|
|
98
|
+
@.planning/PROJECT.md
|
|
99
|
+
@.planning/REQUIREMENTS.md
|
|
100
|
+
|
|
101
|
+
Solo estos puntos relevantes:
|
|
102
|
+
- Requisito R3: Autenticación
|
|
103
|
+
- Decisión D2: Usar NextAuth
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 4. Agentes con Contexto Fresco
|
|
107
|
+
|
|
108
|
+
**Patrón:** Spawnnear agentes especializados
|
|
109
|
+
|
|
110
|
+
Cada agente obtiene ~200K tokens frescos.
|
|
111
|
+
El orquestador mantiene solo el estado mínimo.
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
Orquestador (30% contexto):
|
|
115
|
+
- Coordina
|
|
116
|
+
- Mantiene estado
|
|
117
|
+
- Agrega resultados
|
|
118
|
+
|
|
119
|
+
Agente 1 (100% fresco):
|
|
120
|
+
- Investiga tema A
|
|
121
|
+
- Retorna resumen
|
|
122
|
+
|
|
123
|
+
Agente 2 (100% fresco):
|
|
124
|
+
- Investiga tema B
|
|
125
|
+
- Retorna resumen
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 5. Waves para Paralelización
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
Wave 1: [Planes independientes]
|
|
132
|
+
Plan 1: Contexto fresco
|
|
133
|
+
Plan 2: Contexto fresco
|
|
134
|
+
|
|
135
|
+
Wave 2: [Dependen de Wave 1]
|
|
136
|
+
Plan 3: Contexto fresco + summaries de Wave 1
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Métricas de Salud
|
|
140
|
+
|
|
141
|
+
### Señales de Contexto Sano
|
|
142
|
+
|
|
143
|
+
- Respuestas coherentes y completas
|
|
144
|
+
- Sigue instrucciones correctamente
|
|
145
|
+
- No repite información
|
|
146
|
+
- No "olvida" decisiones anteriores
|
|
147
|
+
|
|
148
|
+
### Señales de Contexto Saturado
|
|
149
|
+
|
|
150
|
+
- Respuestas vagas o incompletas
|
|
151
|
+
- Olvida instrucciones recientes
|
|
152
|
+
- Mezcla información de diferentes partes
|
|
153
|
+
- Aumentan alucinaciones
|
|
154
|
+
|
|
155
|
+
### Acción si Saturado
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
1. STOP - No seguir agregando contexto
|
|
159
|
+
2. Crear nuevo plan más pequeño
|
|
160
|
+
3. Spawnnear agente fresco
|
|
161
|
+
4. Resumir lo hecho y continuar en nueva sesión
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Templates Optimizados
|
|
165
|
+
|
|
166
|
+
### PLAN.md Optimizado
|
|
167
|
+
|
|
168
|
+
```markdown
|
|
169
|
+
---
|
|
170
|
+
phase: 1
|
|
171
|
+
plan: 1
|
|
172
|
+
wave: 1
|
|
173
|
+
must_haves:
|
|
174
|
+
truths: ["User can login"]
|
|
175
|
+
artifacts: [{path: "src/app/login/page.tsx"}]
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
# Login Page
|
|
179
|
+
|
|
180
|
+
## Contexto
|
|
181
|
+
@.planning/RESEARCH.md#auth
|
|
182
|
+
|
|
183
|
+
## Tareas
|
|
184
|
+
|
|
185
|
+
<task>
|
|
186
|
+
<name>Create login form</name>
|
|
187
|
+
<files>src/app/login/page.tsx</files>
|
|
188
|
+
<action>Form with email/password, NextAuth signIn()</action>
|
|
189
|
+
<verify>npm run build</verify>
|
|
190
|
+
</task>
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Nota:** Solo referencias, no copias. Solo lo necesario.
|
|
194
|
+
|
|
195
|
+
### SUMMARY.md Optimizado
|
|
196
|
+
|
|
197
|
+
```markdown
|
|
198
|
+
# Summary: Login (01-01)
|
|
199
|
+
|
|
200
|
+
## Done
|
|
201
|
+
- [x] Login form created
|
|
202
|
+
- [x] NextAuth configured
|
|
203
|
+
|
|
204
|
+
## Files
|
|
205
|
+
- src/app/login/page.tsx
|
|
206
|
+
- src/lib/auth.ts
|
|
207
|
+
|
|
208
|
+
## Verify
|
|
209
|
+
- [x] Build passes
|
|
210
|
+
- [ ] User test: can login
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Nota:** Bullets, no prosa. Solo hechos.
|
|
214
|
+
|
|
215
|
+
## Checklist Pre-Ejecución
|
|
216
|
+
|
|
217
|
+
Antes de ejecutar un plan, verificar:
|
|
218
|
+
|
|
219
|
+
- [ ] ¿El plan cabe en 50% del contexto?
|
|
220
|
+
- [ ] ¿Las referencias son específicas (no "todo el archivo")?
|
|
221
|
+
- [ ] ¿El research está resumido?
|
|
222
|
+
- [ ] ¿Hay espacio para el código a generar?
|
|
223
|
+
- [ ] ¿Puedo dividir en partes más pequeñas?
|
|
224
|
+
|
|
225
|
+
Si cualquiera falla → Optimizar antes de ejecutar.
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-setup
|
|
3
|
+
description: Skill para crear APIs y endpoints. Usa este skill cuando el usuario quiere crear una API, backend, o endpoints.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Skill: Setup de API/Backend
|
|
7
|
+
|
|
8
|
+
<when_to_use>
|
|
9
|
+
Usar cuando el usuario menciona:
|
|
10
|
+
- "API"
|
|
11
|
+
- "backend"
|
|
12
|
+
- "endpoints"
|
|
13
|
+
- "servidor"
|
|
14
|
+
- "REST"
|
|
15
|
+
- "GraphQL"
|
|
16
|
+
- "rutas" (en contexto de backend)
|
|
17
|
+
</when_to_use>
|
|
18
|
+
|
|
19
|
+
<before_starting>
|
|
20
|
+
## Investigación Obligatoria
|
|
21
|
+
|
|
22
|
+
**ANTES de crear la API, entender el contexto:**
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
1. Detectar tipo de proyecto:
|
|
26
|
+
- ¿Ya tiene Next.js? → API Routes
|
|
27
|
+
- ¿Ya tiene Expo? → Necesita backend separado
|
|
28
|
+
- ¿Proyecto nuevo? → Sugerir opciones
|
|
29
|
+
|
|
30
|
+
2. Preguntar al usuario:
|
|
31
|
+
- ¿Qué datos va a manejar la API?
|
|
32
|
+
- ¿Necesita autenticación?
|
|
33
|
+
- ¿Va a ser pública o privada?
|
|
34
|
+
|
|
35
|
+
3. Buscar en Context7:
|
|
36
|
+
mcp__plugin_context7_context7__resolve-library-id("hono")
|
|
37
|
+
mcp__plugin_context7_context7__query-docs(id, "getting started")
|
|
38
|
+
```
|
|
39
|
+
</before_starting>
|
|
40
|
+
|
|
41
|
+
<options_by_context>
|
|
42
|
+
## Opciones por Contexto
|
|
43
|
+
|
|
44
|
+
### Ya tiene Next.js → API Routes
|
|
45
|
+
|
|
46
|
+
**Pros:**
|
|
47
|
+
- No necesita servidor adicional
|
|
48
|
+
- Comparte tipos con frontend
|
|
49
|
+
- Deploy junto con la app
|
|
50
|
+
|
|
51
|
+
**Ubicación:**
|
|
52
|
+
```
|
|
53
|
+
src/app/api/[endpoint]/route.ts
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Proyecto nuevo → Hono (Recomendado)
|
|
57
|
+
|
|
58
|
+
**Pros:**
|
|
59
|
+
- Ligero y rápido
|
|
60
|
+
- TypeScript nativo
|
|
61
|
+
- Funciona en edge, Node, Deno, Bun
|
|
62
|
+
- Similar a Express pero moderno
|
|
63
|
+
|
|
64
|
+
**Setup:**
|
|
65
|
+
```bash
|
|
66
|
+
npm create hono@latest my-api
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Alternativas
|
|
70
|
+
|
|
71
|
+
| Opción | Cuándo Usar |
|
|
72
|
+
|--------|-------------|
|
|
73
|
+
| Express | Equipo ya lo conoce |
|
|
74
|
+
| Fastify | Necesita máximo rendimiento |
|
|
75
|
+
| tRPC | Frontend y backend TypeScript |
|
|
76
|
+
| GraphQL | Queries complejas, múltiples clientes |
|
|
77
|
+
</options_by_context>
|
|
78
|
+
|
|
79
|
+
<nextjs_api_setup>
|
|
80
|
+
## API Routes en Next.js
|
|
81
|
+
|
|
82
|
+
### Paso 1: Crear endpoint
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
// src/app/api/users/route.ts
|
|
86
|
+
// VERIFICAR con Context7 para sintaxis actual
|
|
87
|
+
|
|
88
|
+
import { NextResponse } from 'next/server'
|
|
89
|
+
|
|
90
|
+
export async function GET() {
|
|
91
|
+
// Tu lógica aquí
|
|
92
|
+
return NextResponse.json({ users: [] })
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function POST(request: Request) {
|
|
96
|
+
const body = await request.json()
|
|
97
|
+
// Crear usuario
|
|
98
|
+
return NextResponse.json({ success: true })
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Paso 2: Endpoint con parámetros
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// src/app/api/users/[id]/route.ts
|
|
106
|
+
|
|
107
|
+
import { NextResponse } from 'next/server'
|
|
108
|
+
|
|
109
|
+
export async function GET(
|
|
110
|
+
request: Request,
|
|
111
|
+
{ params }: { params: { id: string } }
|
|
112
|
+
) {
|
|
113
|
+
const id = params.id
|
|
114
|
+
// Buscar usuario por id
|
|
115
|
+
return NextResponse.json({ user: { id } })
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Paso 3: Validación con Zod
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
// src/app/api/users/route.ts
|
|
123
|
+
import { z } from 'zod'
|
|
124
|
+
import { NextResponse } from 'next/server'
|
|
125
|
+
|
|
126
|
+
const createUserSchema = z.object({
|
|
127
|
+
email: z.string().email(),
|
|
128
|
+
name: z.string().min(2),
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
export async function POST(request: Request) {
|
|
132
|
+
const body = await request.json()
|
|
133
|
+
|
|
134
|
+
const result = createUserSchema.safeParse(body)
|
|
135
|
+
if (!result.success) {
|
|
136
|
+
return NextResponse.json(
|
|
137
|
+
{ error: result.error.flatten() },
|
|
138
|
+
{ status: 400 }
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Crear usuario con result.data
|
|
143
|
+
return NextResponse.json({ success: true })
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
</nextjs_api_setup>
|
|
147
|
+
|
|
148
|
+
<hono_setup>
|
|
149
|
+
## Setup Hono (Standalone API)
|
|
150
|
+
|
|
151
|
+
### Paso 1: Crear proyecto
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
npm create hono@latest my-api
|
|
155
|
+
# Seleccionar: nodejs
|
|
156
|
+
cd my-api
|
|
157
|
+
npm install
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Paso 2: Estructura básica
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// src/index.ts
|
|
164
|
+
// VERIFICAR con Context7
|
|
165
|
+
|
|
166
|
+
import { Hono } from 'hono'
|
|
167
|
+
import { cors } from 'hono/cors'
|
|
168
|
+
|
|
169
|
+
const app = new Hono()
|
|
170
|
+
|
|
171
|
+
// Middleware
|
|
172
|
+
app.use('/*', cors())
|
|
173
|
+
|
|
174
|
+
// Rutas
|
|
175
|
+
app.get('/', (c) => c.json({ message: 'API funcionando' }))
|
|
176
|
+
|
|
177
|
+
app.get('/users', (c) => {
|
|
178
|
+
return c.json({ users: [] })
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
app.post('/users', async (c) => {
|
|
182
|
+
const body = await c.req.json()
|
|
183
|
+
return c.json({ success: true })
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
export default app
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Paso 3: Validación con Zod
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
import { Hono } from 'hono'
|
|
193
|
+
import { zValidator } from '@hono/zod-validator'
|
|
194
|
+
import { z } from 'zod'
|
|
195
|
+
|
|
196
|
+
const app = new Hono()
|
|
197
|
+
|
|
198
|
+
const createUserSchema = z.object({
|
|
199
|
+
email: z.string().email(),
|
|
200
|
+
name: z.string().min(2),
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
app.post(
|
|
204
|
+
'/users',
|
|
205
|
+
zValidator('json', createUserSchema),
|
|
206
|
+
async (c) => {
|
|
207
|
+
const data = c.req.valid('json')
|
|
208
|
+
// data está tipado y validado
|
|
209
|
+
return c.json({ success: true })
|
|
210
|
+
}
|
|
211
|
+
)
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Paso 4: Ejecutar
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
npm run dev
|
|
218
|
+
```
|
|
219
|
+
</hono_setup>
|
|
220
|
+
|
|
221
|
+
<verification>
|
|
222
|
+
## Verificación
|
|
223
|
+
|
|
224
|
+
### Automática
|
|
225
|
+
```bash
|
|
226
|
+
# Probar endpoint GET
|
|
227
|
+
curl http://localhost:3000/api/users
|
|
228
|
+
|
|
229
|
+
# Probar endpoint POST
|
|
230
|
+
curl -X POST http://localhost:3000/api/users \
|
|
231
|
+
-H "Content-Type: application/json" \
|
|
232
|
+
-d '{"email":"test@example.com","name":"Test"}'
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Manual (para usuario)
|
|
236
|
+
```
|
|
237
|
+
Para ti (Usuario):
|
|
238
|
+
|
|
239
|
+
1. Abre tu navegador
|
|
240
|
+
2. Ve a: http://localhost:3000/api/users
|
|
241
|
+
3. Deberías ver una respuesta JSON
|
|
242
|
+
|
|
243
|
+
¿Ves datos JSON?
|
|
244
|
+
- SÍ → La API está funcionando
|
|
245
|
+
- NO → Verifica que el servidor esté corriendo
|
|
246
|
+
```
|
|
247
|
+
</verification>
|
|
248
|
+
|
|
249
|
+
<common_patterns>
|
|
250
|
+
## Patrones Comunes
|
|
251
|
+
|
|
252
|
+
### Middleware de autenticación
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
// middleware/auth.ts
|
|
256
|
+
import { createMiddleware } from 'hono/factory'
|
|
257
|
+
|
|
258
|
+
export const authMiddleware = createMiddleware(async (c, next) => {
|
|
259
|
+
const token = c.req.header('Authorization')?.replace('Bearer ', '')
|
|
260
|
+
|
|
261
|
+
if (!token) {
|
|
262
|
+
return c.json({ error: 'No autorizado' }, 401)
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Verificar token
|
|
266
|
+
// c.set('user', decodedUser)
|
|
267
|
+
|
|
268
|
+
await next()
|
|
269
|
+
})
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Manejo de errores
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
app.onError((err, c) => {
|
|
276
|
+
console.error(err)
|
|
277
|
+
return c.json(
|
|
278
|
+
{ error: 'Error interno del servidor' },
|
|
279
|
+
500
|
|
280
|
+
)
|
|
281
|
+
})
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Rate limiting
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
import { rateLimiter } from 'hono-rate-limiter'
|
|
288
|
+
|
|
289
|
+
app.use(
|
|
290
|
+
rateLimiter({
|
|
291
|
+
windowMs: 15 * 60 * 1000, // 15 minutos
|
|
292
|
+
limit: 100, // 100 requests por ventana
|
|
293
|
+
message: { error: 'Demasiadas solicitudes' },
|
|
294
|
+
})
|
|
295
|
+
)
|
|
296
|
+
```
|
|
297
|
+
</common_patterns>
|
|
298
|
+
|
|
299
|
+
<common_issues>
|
|
300
|
+
## Problemas Comunes
|
|
301
|
+
|
|
302
|
+
### "CORS error"
|
|
303
|
+
- Agregar middleware de CORS
|
|
304
|
+
- Verificar origin permitido
|
|
305
|
+
- En Next.js: configurar headers en next.config.js
|
|
306
|
+
|
|
307
|
+
### "404 Not Found"
|
|
308
|
+
- Verificar ruta del archivo
|
|
309
|
+
- En Next.js: debe estar en app/api/
|
|
310
|
+
- Verificar nombre del archivo (route.ts)
|
|
311
|
+
|
|
312
|
+
### "Method not allowed"
|
|
313
|
+
- Exportar la función con el nombre correcto (GET, POST, etc.)
|
|
314
|
+
- Verificar que el método existe en el archivo
|
|
315
|
+
</common_issues>
|