Proyecto Final
Objetivo del módulo
Has llegado al punto culminante del curso. En este módulo aplicarás todo lo aprendido en un proyecto integral que demostrará tu dominio de Claude Code.
A diferencia de los módulos anteriores donde practicabas conceptos específicos, aquí integrarás:
- ✅ Configuración avanzada (CLAUDE.md y settings.json)
- ✅ Gestión de permisos y seguridad
- ✅ Skills personalizadas
- ✅ Hooks de automatización
- ✅ Integración con MCP (si aplica)
- ✅ Flujos de trabajo profesionales
- ✅ Gestión de contexto y optimización
El proyecto final tiene tres opciones diseñadas para diferentes contextos y objetivos profesionales. Puedes elegir la que mejor se adapte a tus necesidades.
Las tres opciones
Opción A: Configuración completa de proyecto
Crea un setup profesional de Claude Code para un proyecto real
Ideal para:
- Desarrolladores que quieren optimizar su workflow personal
- Tech leads configurando Claude para su equipo
- Consultores implementando Claude en proyectos cliente
Qué construirás:
- CLAUDE.md completo y bien estructurado
- settings.json con permisos, hooks y automatización
- 5 skills personalizadas para tu stack
- Documentación de onboarding
Tiempo estimado: 8-12 horas
Opción B: Pipeline de desarrollo automatizado
Construye un sistema CI/CD que integra Claude Code
Ideal para:
- DevOps engineers
- Equipos que buscan automatización con IA
- Proyectos que necesitan code review automático
Qué construirás:
- Script de setup para nuevos desarrolladores
- Workflows de CI/CD (GitHub Actions u otro)
- Code review automático en PRs
- Generación de changelogs
- Detección de breaking changes
- Sistema de agentes especializados
Tiempo estimado: 12-16 horas
Opción C: Agente personalizado
Desarrolla un agente con Claude Code SDK para resolver un problema específico
Ideal para:
- Desarrolladores que quieren crear herramientas distribuibles
- Equipos con necesidades muy específicas
- Quienes quieren contribuir a la comunidad open source
Qué construirás:
- Agente especializado usando el SDK
- Tests con >70% de cobertura
- Documentación completa (README, API, ejemplos)
- Package publicable (npm, binario, Docker)
Ejemplos de agentes:
- Migrador de JavaScript a TypeScript
- Generador automático de documentación
- Auditor de seguridad de código
- Refactorizador con patrones específicos
Tiempo estimado: 16-20 horas
Comparación de opciones
| Criterio | Opción A | Opción B | Opción C |
|---|---|---|---|
| Complejidad | Media | Alta | Muy Alta |
| Conocimientos previos | Claude Code básico | CI/CD + Claude Code | Node.js + Claude Code |
| Tiempo estimado | 8-12h | 12-16h | 16-20h |
| Enfoque | Configuración | Automatización | Desarrollo |
| Resultado | Setup listo para usar | Pipeline completo | Herramienta distribuible |
| Aplicabilidad | Inmediata | Equipos/proyectos | Reutilizable |
| Creatividad requerida | Media | Alta | Muy Alta |
| Valor para portfolio | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
¿Cómo elegir la opción adecuada?
Responde este cuestionario para identificar cuál opción se alinea mejor con tus objetivos:
1. ¿Cuál es tu objetivo principal?
- A) Optimizar mi workflow de desarrollo diario
- B) Automatizar procesos de mi equipo
- C) Crear una herramienta reutilizable
2. ¿Cuánto tiempo puedes dedicar?
- A) 8-12 horas durante 1-2 semanas
- B) 12-16 horas durante 2-3 semanas
- C) 16-20 horas durante 3-4 semanas
3. ¿Qué te emociona más?
- A) Tener un proyecto perfectamente configurado
- B) Ver procesos automáticos funcionando
- C) Construir algo desde cero que otros puedan usar
4. ¿Tienes experiencia con...?
- A) Configuración de herramientas de desarrollo
- B) CI/CD y automatización
- C) Desarrollo de librerías o CLIs
5. ¿Qué te gustaría mostrar en tu portfolio?
- A) "Así configuro proyectos profesionalmente"
- B) "Implementé automatización IA en producción"
- C) "Creé una herramienta open source con X descargas"
Resultado:
- Mayoría A → Opción A: Configuración completa
- Mayoría B → Opción B: Pipeline automatizado
- Mayoría C → Opción C: Agente personalizado
Checklist de conocimientos previos
Antes de empezar tu proyecto final, asegúrate de dominar estos conceptos:
Para todas las opciones:
- Crear y estructurar archivos CLAUDE.md
- Configurar settings.json con permisos y modelo
- Entender el sistema de permisos (allow/deny)
- Usar comandos slash nativos (
/config,/context,/compact) - Leer y entender logs de Claude Code
Adicionales para Opción A:
- Crear skills personalizadas con frontmatter YAML
- Configurar hooks (PostToolUse, PreToolUse)
- Usar variables en hooks (
$file,$dir,$ext) - Documentar configuraciones para equipos
Adicionales para Opción B:
- Conocimientos básicos de CI/CD (GitHub Actions, GitLab CI, etc.)
- Scripts de bash o PowerShell
- Manejo de secrets y variables de entorno
- Integración de herramientas externas
- Uso de Claude Code en modo programático (
-p)
Adicionales para Opción C:
- JavaScript/TypeScript intermedio
- Node.js y manejo de paquetes (npm/yarn)
- Testing (Jest, Vitest o similar)
- Estructura de proyectos Node.js
- Publicación de paquetes o distribución de binarios
- Uso del Claude Code SDK
Si falta algún punto, revisa el módulo correspondiente antes de continuar.
Recursos de apoyo
Durante el desarrollo de tu proyecto final tendrás acceso a:
📝 Templates
Cada opción incluye plantillas listas para usar que puedes personalizar:
- Opción A: Templates de CLAUDE.md, settings.json y skills
- Opción B: Templates de workflows, scripts de setup, agentes
- Opción C: Templates de agente, tests, documentación
💡 Ejemplos completos
Proyectos de referencia totalmente funcionales:
- Opción A: Setup para E-commerce REST API (Node.js + TypeScript)
- Opción B: Pipeline para React App con GitHub Actions
- Opción C: TypeScript Migration Agent publicable
📚 Documentación
Guías detalladas paso a paso para cada opción con:
- Explicaciones de cada componente
- Mejores prácticas
- Errores comunes a evitar
- Tips de optimización
✅ Rúbricas de evaluación
Criterios claros y objetivos para saber si tu proyecto cumple los estándares:
- Desglose de puntos por componente
- Ejemplos de excelencia
- Auto-evaluación
Consejos antes de empezar
1. Elige el proyecto base adecuado
Para Opción A:
- Usa un proyecto real (personal o de trabajo)
- Si no tienes uno, usa el ejemplo que proporcionamos
- Evita proyectos demasiado simples (no aprovecharás Claude)
Para Opción B:
- Necesitas un repositorio con CI/CD configurado
- GitHub Actions es la opción más documentada
- Comienza con workflows sencillos antes de los complejos
Para Opción C:
- Identifica un problema que resuelvas manualmente a menudo
- Valida que sea automatizable con IA
- No elijas algo demasiado ambicioso para empezar
2. Planifica antes de ejecutar
No te lances directo a configurar. Dedica tiempo a:
- Analizar tu situación actual
- Diseñar la solución ideal
- Planificar la implementación paso a paso
- Ejecutar con iteraciones pequeñas
3. Itera y mejora
No busques la perfección en el primer intento:
- Empieza con una versión básica funcional
- Prueba y obtén feedback
- Itera y mejora incrementalmente
- La versión 1.0 no tiene que ser perfecta
4. Documenta desde el principio
- Escribe la documentación mientras construyes
- Es más fácil documentar en el momento que al final
- Tu "yo del futuro" te lo agradecerá
5. Pide ayuda cuando la necesites
- Consulta la documentación oficial de Claude Code
- Revisa los ejemplos proporcionados
- No dudes en experimentar y probar cosas nuevas
Evaluación del proyecto final
Cada opción se evalúa sobre 100 puntos distribuidos en diferentes criterios:
Opción A (100 puntos)
- CLAUDE.md completo y útil (25 pts)
- settings.json bien configurado (25 pts)
- 5 skills personalizadas funcionales (30 pts)
- Documentación clara (20 pts)
Opción B (100 puntos)
- Script de setup reproducible (20 pts)
- Pipeline de CI/CD funcional (35 pts)
- Sistema de agentes efectivo (30 pts)
- Documentación del sistema (15 pts)
Opción C (100 puntos)
- Código del agente robusto (40 pts)
- Tests con >70% coverage (25 pts)
- Documentación completa (25 pts)
- Distribución/publicación (10 pts)
Las rúbricas detalladas están en el documento 11.4-evaluacion.md
Formato de entrega
Cuando completes tu proyecto, deberás entregar:
-
Repositorio (GitHub, GitLab u otro)
- Código completo
- Documentación
- Ejemplos de uso
-
README principal con:
- Descripción del proyecto
- Instrucciones de instalación/uso
- Enlaces a documentación adicional
- Screenshots o demos (si aplica)
-
Video demo (opcional pero muy recomendado)
- 3-5 minutos mostrando el proyecto funcionando
- Explicación de componentes clave
- Demostración de uso real
-
Reflexión personal (breve documento)
- Qué aprendiste
- Desafíos enfrentados
- Próximos pasos o mejoras futuras
Próximos pasos
- Lee cuidadosamente las guías de las tres opciones
- Elige la opción que mejor se adapte a ti
- Revisa los templates y ejemplos
- Planifica tu proyecto
- Empieza y disfruta el proceso
¡Mucha suerte! Este es tu momento de brillar. 🚀
Navegación
- Siguiente: Elige tu opción
- 11.1 Opción A: Configuración completa
- 11.2 Opción B: Pipeline automatizado
- 11.3 Opción C: Agente personalizado
- 11.4 Evaluación y entrega
- Volver al programa del curso
11.1 Opción A: Configuración completa de proyecto
Visión general
En esta opción crearás una configuración profesional y completa de Claude Code para un proyecto real. El objetivo es que cualquier desarrollador que llegue al proyecto pueda aprovechar al máximo Claude Code desde el primer día.
Al finalizar tendrás:
- ✅ CLAUDE.md completo que documenta arquitectura y convenciones
- ✅ settings.json optimizado con permisos y hooks
- ✅ 5 skills personalizadas que automatizan tareas comunes
- ✅ Documentación para onboarding de nuevos desarrolladores
Paso 1: Preparación y análisis
1.1 Elige tu proyecto base
Tienes tres opciones:
Opción 1: Proyecto personal o de trabajo existente ⭐ RECOMENDADO
Ventajas:
- Configuración inmediatamente útil
- Conoces bien el contexto
- Aplicación real directa
Criterios para elegir el proyecto:
- Tiene al menos 10 archivos de código
- Usa un stack moderno (no legacy extremo)
- Lo mantendrás activamente los próximos meses
- Tiene convenciones o patrones definidos (o necesita definirlos)
Opción 2: Proyecto open source que usas o contribuyes
Ventajas:
- Contribuyes a la comunidad
- Puedes hacer PR con la configuración
- Gran para portfolio
Criterios:
- El proyecto acepta este tipo de contribuciones
- Tiene documentación de contribución
- Es un proyecto activo
Opción 3: Usar nuestro proyecto de ejemplo
Ventajas:
- No necesitas proyecto propio
- Ejemplo completo proporcionado
- Puedes enfocarte en aprender
Proyecto ejemplo: E-commerce REST API (Node.js + TypeScript + Prisma + Jest)
- Ver en:
modulos/11-proyecto-final/recursos/ejemplos/opcion-a-ejemplo-completo/
1.2 Analiza las necesidades del proyecto
Antes de configurar nada, dedica 30-60 minutos a analizar:
Arquitectura y stack
Preguntas clave:
1. ¿Qué lenguajes/frameworks se usan?
- Principales:
- Secundarios:
2. ¿Qué herramientas de build existen?
- Build:
- Test:
- Lint:
- Format:
3. ¿Cómo está organizado el código?
- Estructura de carpetas:
- Patrones arquitectónicos:
- Naming conventions:
4. ¿Qué comandos ejecuta el equipo frecuentemente?
- Desarrollo:
- Testing:
- Deploy:
- Mantenimiento:Convenciones actuales
Documenta:
1. Estilo de código
- Prettier/ESLint configurado: Sí/No
- Reglas específicas:
- Excepciones:
2. Patrones de diseño
- Patrones usados:
- Anti-patrones a evitar:
3. Testing
- Framework:
- Coverage objetivo:
- Dónde van los tests:
4. Git workflow
- Branching strategy:
- Formato de commits:
- PR requirements:Tareas repetitivas que podrían automatizarse
Lista:
1. Escribir boilerplate de componentes/clases/tests
2. Generar documentación
3. Formatear/lint antes de commits
4. Ejecutar tests relacionados
5. Generar mensajes de commit
6. Code review checklist
7. ... (añade las tuyas)✏️ Ejercicio: Crea un documento analisis-proyecto.md con tus respuestas antes de continuar.
Paso 2: Crear CLAUDE.md
El CLAUDE.md es el corazón de tu configuración. Claude lo leerá automáticamente cada vez que trabajes en el proyecto.
2.1 Estructura recomendada
# Proyecto: [Nombre]
## Descripción
[Descripción breve del proyecto en 2-3 líneas]
## Arquitectura
[Stack tecnológico y decisiones arquitectónicas principales]
## Convenciones de código
[Reglas de estilo, naming, patrones]
## Estructura de carpetas
[Mapa de directorios con descripción]
## Comandos importantes
[Scripts npm, make targets, etc.]
## Reglas específicas
[Cosas importantes que Claude debe saber]
## Gotchas y trampas comunes
[Problemas conocidos, workarounds]2.2 Sección por sección
Encabezado y descripción
# Proyecto: TaskFlow API
## Descripción
API REST para gestión de tareas y proyectos. Backend del producto TaskFlow,
usado por +10K usuarios activos. Stack: Node.js + TypeScript + Prisma + PostgreSQL.Tips:
- Sé conciso pero informativo
- Menciona el propósito del proyecto
- Indica el stack principal
Arquitectura
Ejemplo básico:
## Arquitectura
### Stack tecnológico
- **Runtime**: Node.js 20.x
- **Lenguaje**: TypeScript 5.3 (modo strict)
- **Framework**: Express 4.x
- **ORM**: Prisma 5.x
- **Base de datos**: PostgreSQL 16
- **Testing**: Jest + Supertest
- **Documentación**: OpenAPI 3.0 (Swagger)
### Decisiones arquitectónicas
1. **Arquitectura en capas**
- Controllers: Manejo de HTTP, validación de entrada
- Services: Lógica de negocio
- Repositories: Acceso a datos (Prisma)
2. **Autenticación**
- JWT con refresh tokens
- Tokens firmados con RS256
- Expiración: 15min (access), 7 días (refresh)
3. **Manejo de errores**
- Errores custom heredan de AppError
- Middleware global de error handling
- Logs estructurados con WinstonEjemplo avanzado (React App):
## Arquitectura
### Stack tecnológico
- **Framework**: React 18 + TypeScript
- **Build**: Vite 5.x
- **Estado**: Zustand + React Query
- **Routing**: React Router v6
- **UI**: Tailwind CSS + shadcn/ui
- **Forms**: React Hook Form + Zod
- **Testing**: Vitest + Testing Library
### Patrones de diseño
1. **Composición de componentes**
- Componentes atómicos en `/components/ui`
- Componentes de negocio en `/components/features`
- Páginas solo orquestan componentes
2. **Estado**
- Estado global: Zustand (auth, theme, config)
- Estado servidor: React Query (cache, refetch)
- Estado local: useState solo cuando no se puede evitar
3. **Data fetching**
- useQuery para lecturas
- useMutation para escrituras
- Optimistic updates en operaciones críticasConvenciones de código
Ejemplo TypeScript/JavaScript:
## Convenciones de código
### Naming conventions
1. **Variables y funciones**: camelCase
```typescript
const userProfile = { ... }
function calculateTotal() { ... }-
Clases e Interfaces: PascalCase
class UserService { ... } interface IUserRepository { ... } type TAuthToken = string; -
Constantes: UPPER_SNAKE_CASE
const MAX_RETRY_ATTEMPTS = 3; const API_BASE_URL = process.env.API_URL; -
Archivos
- Componentes: PascalCase (
UserProfile.tsx) - Utilidades: camelCase (
formatDate.ts) - Tipos: camelCase con
.types.ts(user.types.ts)
- Componentes: PascalCase (
Reglas de TypeScript
- ❌ NUNCA usar
any, usarunknownsi es necesario - ✅ Siempre tipar returns de funciones explícitamente
- ✅ Preferir
interfacesobretypepara objetos - ✅ Usar
Readonlypara props de React - ❌ No usar
!(non-null assertion) sin comentario justificando
Imports
Orden de imports (automático con ESLint):
// 1. React y frameworks
import { useState } from 'react';
// 2. Librerías externas
import { z } from 'zod';
// 3. Absolute imports del proyecto
import { Button } from '@/components/ui/button';
// 4. Relative imports
import { userSchema } from './schemas';
// 5. Tipos
import type { IUser } from './types';Testing
- ✅ Todo componente nuevo DEBE tener tests
- ✅ Coverage mínimo: 80% en services y utils
- ✅ Usar
describepara agrupar tests relacionados - ✅ Nombres descriptivos:
it('should return error when email is invalid') - ❌ No testear implementación, testear comportamiento
Comments y documentación
// ✅ BUENO: Explica el "por qué", no el "qué"
// Usamos debounce aquí porque la API tiene rate limit de 10 req/s
const debouncedSearch = debounce(search, 300);
// ❌ MALO: Repite lo que el código ya dice
// Crea una variable llamada debouncedSearch
const debouncedSearch = debounce(search, 300);
// ✅ BUENO: JSDoc para funciones públicas
/**
* Calcula el precio total incluyendo impuestos y descuentos.
* @param items - Array de items del carrito
* @param discountCode - Código de descuento opcional
* @returns Precio total en centavos
*/
export function calculateTotal(items: ICartItem[], discountCode?: string): number {
// ...
}
**Ejemplo Python:**
```markdown
## Convenciones de código
### Naming conventions
1. **Variables y funciones**: snake_case
```python
user_profile = {...}
def calculate_total(): ...-
Clases: PascalCase
class UserService: pass -
Constantes: UPPER_SNAKE_CASE
MAX_RETRY_ATTEMPTS = 3 API_BASE_URL = os.getenv("API_URL")
Estilo
- Seguir PEP 8 estrictamente
- Usar Black para formateo (line length: 100)
- Type hints en todas las funciones
- Docstrings en formato Google style
Testing
- pytest como framework
- Coverage mínimo: 85%
- Fixtures en
conftest.py - Tests en estructura de espejo (
tests/reflejasrc/)
---
#### Estructura de carpetas
**Ejemplo API Node.js:**
```markdown
## Estructura de carpetas
/src /controllers → Handlers de rutas HTTP /services → Lógica de negocio (reusable) /repositories → Acceso a datos (Prisma) /middlewares → Express middlewares (auth, validation, error) /routes → Definición de rutas /types → Tipos TypeScript compartidos /utils → Funciones auxiliares puras /config → Configuración (DB, env, etc.) /validators → Schemas de validación (Zod) /prisma /migrations → Migraciones de DB (NO editar manualmente) schema.prisma → Schema de la base de datos /tests /integration → Tests de APIs completas /unit → Tests de funciones aisladas /fixtures → Datos de prueba
**Ubicación de nuevos archivos:**
- Nuevo endpoint: Controller → Service → Repository
- Nuevo modelo: Primero en `schema.prisma`, después generar tipos
- Nueva utilidad: En `/utils` solo si es reusable en 3+ lugaresEjemplo React App:
## Estructura de carpetas
/src /components /ui → Componentes base reutilizables (Button, Input, Card) /features → Componentes de funcionalidad específica /layout → Layout components (Header, Sidebar, Footer) /pages → Componentes de página (uno por ruta) /hooks → Custom hooks (useAuth, useDebounce, etc.) /lib → Configuración de librerías externas /services → Llamadas a API (usando fetch/axios) /stores → Zustand stores /types → TypeScript types/interfaces globales /utils → Funciones auxiliares puras /styles → CSS global (Tailwind config está en raíz)
**Reglas:**
- Componentes de UI no deben hacer fetching
- Páginas solo orquestan, lógica en components/features
- Un hook custom por archivo
- Services agrupados por entidad (`services/users.ts`, `services/tasks.ts`)Comandos importantes
## Comandos importantes
### Desarrollo
```bash
npm run dev # Inicia servidor en modo desarrollo (port 3000)
npm run dev:debug # Igual pero con inspector de Node.js
npm run db:studio # Abre Prisma Studio (GUI para ver la DB)Testing
npm run test # Ejecuta todos los tests
npm run test:watch # Tests en modo watch
npm run test:coverage # Genera reporte de coverage
npm run test:integration # Solo integration tests (requiere DB)Base de datos
npm run db:migrate # Crea y aplica migración
npm run db:reset # Resetea DB y aplica seeds
npm run db:seed # Solo ejecuta seedsLinting y formateo
npm run lint # Ejecuta ESLint
npm run lint:fix # Auto-fix de ESLint
npm run format # Formatea con Prettier
npm run type-check # Verifica tipos TypeScriptBuild y deploy
npm run build # Build de producción
npm run start # Inicia servidor en modo producción
npm run docker:up # Levanta contenedor localPre-commit
npm run pre-commit # Ejecuta: lint, type-check, testIMPORTANTE: Siempre ejecutar npm run pre-commit antes de hacer commit.
---
#### Reglas específicas
Aquí documenta las cosas que quieres que Claude **siempre** respete:
```markdown
## Reglas específicas
### Modificación de archivos
1. **NO modificar archivos generados**
- ❌ `/prisma/migrations/*` (generado por Prisma)
- ❌ `/src/generated/*` (generado por codegen)
- ❌ `package-lock.json` (modificar package.json y regenerar)
2. **Pedir confirmación antes de:**
- Modificar `schema.prisma` (requiere migración)
- Cambiar archivos de configuración raíz (`.env`, `tsconfig.json`)
- Eliminar funciones públicas (puede haber dependientes)
### Testing obligatorio
- ✅ TODO service nuevo DEBE tener tests unitarios
- ✅ TODO endpoint nuevo DEBE tener test de integración
- ✅ Ejecutar tests relacionados antes de marcar tarea como completa
### Seguridad
- ❌ NUNCA loggear información sensible (passwords, tokens, PII)
- ❌ NUNCA exponer stack traces en respuestas de producción
- ✅ Siempre validar inputs con Zod antes de procesar
- ✅ Sanitizar outputs de base de datos (omitir `password`, `refreshToken`)
### Performance
- ✅ Usar índices en queries frecuentes (añadir en schema.prisma)
- ✅ Paginar resultados de listas (default: 20 items)
- ⚠️ Queries N+1: Usar `include` de Prisma en lugar de queries en loops
### Commits
- Usar conventional commits: `feat:`, `fix:`, `docs:`, `refactor:`
- Formato: `tipo(scope): descripción breve`
- Ejemplos:
- `feat(auth): add password reset endpoint`
- `fix(tasks): prevent duplicate task creation`
- `docs(readme): update installation instructions`Gotchas y trampas comunes
## Gotchas y trampas comunes
### 1. Prisma y relaciones
**Problema:** Al actualizar una relación, Prisma no la elimina automáticamente.
```typescript
// ❌ INCORRECTO: No elimina tags viejos
await prisma.task.update({
where: { id },
data: {
tags: { connect: newTagIds.map(id => ({ id })) }
}
});
// ✅ CORRECTO: Primero desconecta, después conecta
await prisma.task.update({
where: { id },
data: {
tags: {
set: [], // Desconecta todos
connect: newTagIds.map(id => ({ id })) // Conecta nuevos
}
}
});2. Rate limiting de la API externa
La API de notificaciones tiene rate limit de 10 requests/segundo.
Solución: Usar cola de jobs con BullMQ (ya configurado en src/queues/notifications.ts)
// ❌ NO hacer esto en loops
for (const user of users) {
await sendNotification(user.email);
}
// ✅ Hacer esto
for (const user of users) {
await notificationQueue.add('send-email', { userId: user.id });
}3. Manejo de zona horaria
IMPORTANTE: La DB guarda timestamps en UTC, pero los usuarios los ven en su zona.
// ✅ Siempre usar luxon para fechas
import { DateTime } from 'luxon';
// Almacenar
const utcDate = DateTime.utc().toISO();
// Mostrar
const userDate = DateTime.fromISO(utcDate).setZone(user.timezone);4. Tests con base de datos
IMPORTANTE: Los integration tests usan una DB separada.
// El setup ya lo hace, pero ten en cuenta:
// - Cada test suite hace un reset de DB
// - Seeds están en tests/fixtures/seeds.ts
// - NO usar DB de desarrollo para tests5. Variables de entorno
# En desarrollo local se usan .env files
# En producción se usan secrets de Kubernetes
# NUNCA commitear:
- .env
- .env.local
- .env.production
# Sí commitear (con valores de ejemplo):
- .env.example
---
### 2.3 Template completo
Descarga el template base aquí:
- CLAUDE.md.template
O crea el tuyo siguiendo la estructura de esta sección.
---
## Paso 3: Configurar settings.json
### 3.1 Ubicación
Crea: `.claude/settings.json` en la raíz del proyecto.
**⚠️ IMPORTANTE:**
- Este archivo SÍ se commitea (es configuración del equipo)
- Secrets van en `.claude/settings.local.json` (gitignored)
### 3.2 Estructura base
```json
{
"model": "claude-sonnet-4-20250514",
"maxTokens": 4096,
"permissions": {
"allowedTools": [],
"deny": []
},
"hooks": {
"PostToolUse": []
}
}3.3 Configurar modelo
Opciones:
{
"model": "claude-sonnet-4-20250514", // Balance perfecto (RECOMENDADO)
"model": "claude-opus-4-5-20251101", // Tareas complejas, arquitectura
"model": "claude-haiku-4-20250514", // Tareas rápidas, alto volumen
}Regla general:
- Proyectos complejos: Sonnet o Opus
- Scripts/automatización: Haiku
- Duda: Sonnet
3.4 Configurar permisos
Sigue el principio de mínimo privilegio: solo permite lo necesario.
Paso 1: Permite herramientas base
{
"permissions": {
"allowedTools": [
"Read",
"Write",
"Edit"
]
}
}Paso 2: Permite comandos bash específicos
{
"permissions": {
"allowedTools": [
"Read",
"Write",
"Edit",
"Bash(git *)",
"Bash(npm *)",
"Bash(npx *)"
]
}
}Ejemplos por stack:
Node.js/JavaScript:
"Bash(git *)",
"Bash(npm *)",
"Bash(npx *)",
"Bash(node *)",
"Bash(pnpm *)", // Si usas pnpm
"Bash(yarn *)" // Si usas yarnPython:
"Bash(git *)",
"Bash(python *)",
"Bash(pip *)",
"Bash(poetry *)", // Si usas poetry
"Bash(pytest *)"Go:
"Bash(git *)",
"Bash(go *)"Rust:
"Bash(git *)",
"Bash(cargo *)"Paso 3: Deniega accesos sensibles
{
"permissions": {
"deny": [
// Secrets
"Read(./.env)",
"Read(./.env.*)",
"Write(./.env)",
"Write(./.env.*)",
// Configuración sensible
"Write(./package.json)", // Solo editar con confirmación
"Write(./tsconfig.json)",
// Archivos generados
"Write(./prisma/migrations/*)",
"Write(./src/generated/*)",
// Comandos peligrosos
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(chmod *)",
"Bash(npm publish)", // Evitar publicaciones accidentales
// Deploy
"Bash(kubectl *)",
"Bash(terraform *)",
"Bash(aws *)" // Añadir excepción específica si necesitas
]
}
}3.5 Configurar hooks
Los hooks automatizan tareas después de que Claude modifica archivos.
Hook 1: Auto-formateo
TypeScript/JavaScript:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write(*.ts)",
"hooks": [
{
"type": "command",
"command": "npx prettier --write $file"
}
]
},
{
"matcher": "Write(*.tsx)",
"hooks": [
{
"type": "command",
"command": "npx prettier --write $file"
}
]
}
]
}
}Python:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write(*.py)",
"hooks": [
{
"type": "command",
"command": "python -m black $file && python -m isort $file"
}
]
}
]
}
}Hook 2: Linting automático
TypeScript/JavaScript:
{
"matcher": "Write(*.ts)",
"hooks": [
{
"type": "command",
"command": "npx eslint --fix $file || true"
}
]
}Nota: El || true evita que el hook falle si hay errores de lint que no se pueden auto-fix.
Hook 3: Ejecutar tests relacionados
{
"matcher": "Write(src/**/*.ts)",
"hooks": [
{
"type": "command",
"command": "npm test -- --findRelatedTests $file --passWithNoTests --silent"
}
]
}Banderas explicadas:
--findRelatedTests: Solo tests relacionados con el archivo--passWithNoTests: No falla si no hay tests--silent: Menos output
Hook 4: Type checking después de editar tipos
{
"matcher": "Write(**/*.types.ts)",
"hooks": [
{
"type": "command",
"command": "npx tsc --noEmit"
}
]
}Configuración completa de hooks
Ejemplo completo (TypeScript project):
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write(*.{ts,tsx})",
"hooks": [
{
"type": "command",
"command": "npx prettier --write $file"
},
{
"type": "command",
"command": "npx eslint --fix $file || true"
}
]
},
{
"matcher": "Write(src/**/*.ts)",
"hooks": [
{
"type": "command",
"command": "npm test -- --findRelatedTests $file --passWithNoTests --silent"
}
]
},
{
"matcher": "Write(**/*.types.ts)",
"hooks": [
{
"type": "command",
"command": "npx tsc --noEmit"
}
]
}
]
}
}3.6 settings.json completo
Ejemplo para proyecto Node.js + TypeScript:
{
"model": "claude-sonnet-4-20250514",
"maxTokens": 4096,
"permissions": {
"allowedTools": [
"Read",
"Write",
"Edit",
"Bash(git *)",
"Bash(npm *)",
"Bash(npx *)",
"Bash(node *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Write(./.env)",
"Write(./.env.*)",
"Write(./package.json)",
"Write(./tsconfig.json)",
"Write(./prisma/migrations/*)",
"Write(./src/generated/*)",
"Bash(rm -rf *)",
"Bash(sudo *)",
"Bash(npm publish)"
]
},
"hooks": {
"PostToolUse": [
{
"matcher": "Write(*.{ts,tsx})",
"hooks": [
{
"type": "command",
"command": "npx prettier --write $file"
},
{
"type": "command",
"command": "npx eslint --fix $file || true"
}
]
},
{
"matcher": "Write(src/**/*.ts)",
"hooks": [
{
"type": "command",
"command": "npm test -- --findRelatedTests $file --passWithNoTests --silent"
}
]
}
]
}
}Más ejemplos por stack:
- settings.json para Python
- settings.json para Go
- settings.json para Rust
Paso 4: Crear 5 skills personalizadas
Las skills son comandos slash personalizados que automatizan tareas específicas de tu proyecto.
4.1 Ubicación
.claude/
skills/
commit/
SKILL.md
test/
SKILL.md
review/
SKILL.md
doc/
SKILL.md
[tu-skill-específica]/
SKILL.md4.2 Skill 1: /commit - Mensajes de commit estandarizados
Archivo: .claude/skills/commit/SKILL.md
---
name: commit
description: Genera mensaje de commit siguiendo conventional commits
disable-model-invocation: false
argument-hint: "[mensaje opcional]"
allowed-tools: Read, Bash(git *)
---
# Generador de mensajes de commit
Analiza los cambios staged en git y genera un mensaje de commit siguiendo la convención del proyecto.
## Formato
Usamos **Conventional Commits**:
tipo(scope): descripción breve
[Cuerpo opcional con más detalles]
[Footer opcional: breaking changes, referencias a issues]
## Tipos permitidos
- `feat`: Nueva funcionalidad
- `fix`: Corrección de bug
- `docs`: Solo documentación
- `style`: Cambios de formato (no afectan lógica)
- `refactor`: Refactorización de código
- `test`: Añadir o modificar tests
- `chore`: Cambios en build, dependencias, etc.
## Proceso
1. Ejecuta `git diff --cached` para ver cambios staged
2. Analiza los cambios y determina:
- El tipo de commit más apropiado
- El scope (módulo/componente afectado)
- Una descripción clara y concisa
3. Si los cambios son complejos, añade cuerpo con detalles
4. Si hay breaking changes, inclúyelos en el footer
5. Muestra el mensaje propuesto
6. Pregunta si desea hacer el commit con ese mensaje
## Argumentos
Si se proporciona `$ARGUMENTS`, úsalo como base para el mensaje pero valida que siga el formato.
## Ejemplo
```bash
$ /commit
Cambios detectados:
- Nuevo endpoint POST /api/tasks
- Tests para el endpoint
- Actualización de OpenAPI schema
Mensaje propuesto:
---
feat(tasks): add create task endpoint
- Implementa POST /api/tasks con validación
- Añade tests de integración
- Actualiza documentación OpenAPI
---
¿Deseas hacer commit con este mensaje? (sí/no)
---
### 4.3 Skill 2: `/test` - Generar tests
**Archivo:** `.claude/skills/test/SKILL.md`
```markdown
---
name: test
description: Genera tests para código existente
argument-hint: "<archivo>"
allowed-tools: Read, Write
---
# Generador de tests
Genera tests completos para un archivo de código siguiendo las convenciones del proyecto.
## Proceso
1. Lee el archivo especificado en `$ARGUMENTS`
2. Identifica funciones/clases públicas a testear
3. Genera tests siguiendo la estructura del proyecto:
- Framework: Jest
- Ubicación: archivo paralelo con sufijo `.test.ts`
- Coverage: Casos felices + edge cases + errores
4. Crea el archivo de tests
5. Ejecuta los tests para validar
## Estructura de tests
```typescript
import { describe, it, expect, beforeEach } from '@jest/globals';
import { nombreFuncion } from './archivo';
describe('nombreFuncion', () => {
describe('cuando recibe inputs válidos', () => {
it('should return expected result', () => {
// Arrange
const input = ...;
// Act
const result = nombreFuncion(input);
// Assert
expect(result).toBe(...);
});
});
describe('cuando recibe inputs inválidos', () => {
it('should throw error for null input', () => {
expect(() => nombreFuncion(null)).toThrow();
});
});
});Cobertura mínima
- ✅ Happy path (caso exitoso típico)
- ✅ Edge cases (límites, vacíos, extremos)
- ✅ Error handling (inputs inválidos, excepciones)
- ✅ Mock dependencies externas (APIs, DB, etc.)
Ejemplo
$ /test src/services/userService.ts
Analizando src/services/userService.ts...
Funciones detectadas:
1. createUser(data: ICreateUserDTO): Promise<IUser>
2. getUserById(id: string): Promise<IUser>
3. updateUser(id: string, data: IUpdateUserDTO): Promise<IUser>
4. deleteUser(id: string): Promise<void>
Generando tests en src/services/userService.test.ts...
Tests creados:
- ✅ 12 test cases
- ✅ Mocks de repositorio
- ✅ Casos de error incluidos
Ejecutando tests...
✓ All tests passed (12/12)
---
### 4.4 Skill 3: `/review` - Code review
**Archivo:** `.claude/skills/review/SKILL.md`
```markdown
---
name: review
description: Realiza code review de un archivo o cambios
argument-hint: "[archivo o 'staged']"
allowed-tools: Read, Bash(git *)
---
# Code reviewer
Realiza un code review detallado siguiendo los estándares del proyecto.
## Proceso
1. Si `$ARGUMENTS` es "staged": analiza cambios en `git diff --cached`
2. Si `$ARGUMENTS` es un archivo: analiza ese archivo completo
3. Si no hay argumentos: analiza los archivos modificados (`git diff --name-only`)
## Criterios de review
### 🔴 Crítico (P1) - Debe corregirse
- Bugs que causan crashes o corrupción de datos
- Vulnerabilidades de seguridad
- Memory leaks o problemas de performance severos
- Violaciones de principios SOLID
### 🟠 Alto (P2) - Fuertemente recomendado
- Bugs funcionales no críticos
- Code smells evidentes
- Falta de manejo de errores
- Tests insuficientes o faltantes
### 🟡 Medio (P3) - Recomendado
- Mejoras de legibilidad
- Oportunidades de refactor
- Documentación faltante
- Nombres poco claros
### ⚪ Bajo (P4) - Sugerencia
- Preferencias de estilo
- Optimizaciones menores
- Sugerencias de mejora
## Formato del reporte
```markdown
# Code Review: [archivo]
## Resumen
- Archivos revisados: X
- Issues encontrados: Y (P1: a, P2: b, P3: c, P4: d)
- Estado general: ✅ Aprobado / ⚠️ Aprobado con comentarios / ❌ Requiere cambios
## Issues
### 🔴 Crítico (P1)
#### [archivo.ts:línea] Descripción del problema
**Problema:**
[Descripción detallada]
**Impacto:**
[Qué puede salir mal]
**Solución sugerida:**
```typescript
// Código sugerido🟠 Alto (P2)
...
Positivos
- ✅ [Cosas bien hechas]
Recomendaciones generales
[Sugerencias de mejora]
## Ejemplo
```bash
$ /review src/controllers/taskController.ts
# Code Review: taskController.ts
## Resumen
- Archivos revisados: 1
- Issues encontrados: 5 (P1: 1, P2: 2, P3: 1, P4: 1)
- Estado general: ⚠️ Aprobado con comentarios
## Issues
### 🔴 Crítico (P1)
#### [taskController.ts:45] Falta validación de input
**Problema:**
La función `createTask` no valida el input antes de pasarlo al service.
**Impacto:**
Posible inyección SQL o datos corruptos en DB.
**Solución sugerida:**
```typescript
const validated = taskSchema.parse(req.body);
const task = await taskService.create(validated);...
4.5 Skill 4: /doc - Documentar código
Archivo: .claude/skills/doc/SKILL.md
---
name: doc
description: Genera documentación para código
argument-hint: "<archivo>"
allowed-tools: Read, Edit
---
# Generador de documentación
Añade o actualiza documentación en código siguiendo el estilo del proyecto.
## Proceso
1. Lee el archivo especificado en `$ARGUMENTS`
2. Identifica funciones/clases sin documentación o con documentación incompleta
3. Genera documentación apropiada:
- JSDoc para TypeScript/JavaScript
- Docstrings para Python
- Doc comments para Go/Rust
4. Actualiza el archivo añadiendo la documentación
## Formato TypeScript/JavaScript (JSDoc)
```typescript
/**
* Descripción clara de qué hace la función.
*
* @param paramName - Descripción del parámetro
* @param optionalParam - Descripción (opcional)
* @returns Descripción de qué retorna
* @throws {ErrorType} Cuándo lanza este error
*
* @example
* ```typescript
* const result = functionName('input');
* console.log(result); // Output esperado
* ```
*/
export function functionName(
paramName: string,
optionalParam?: number
): ReturnType {
// ...
}Formato Python (Google style)
def function_name(param_name: str, optional_param: int = None) -> ReturnType:
"""Descripción clara de qué hace la función.
Args:
param_name: Descripción del parámetro
optional_param: Descripción (opcional)
Returns:
Descripción de qué retorna
Raises:
ValueError: Cuándo lanza este error
Example:
>>> result = function_name('input')
>>> print(result)
Expected output
"""
passQué documentar
✅ Siempre:
- Funciones/métodos públicos
- Clases y sus responsabilidades
- Tipos complejos
⚠️ A veces:
- Funciones privadas si la lógica es compleja
- Constantes importantes
❌ Nunca:
- Getters/setters triviales
- Funciones auto-explicativas de 1-2 líneas
Ejemplo
$ /doc src/utils/validation.ts
Analizando src/utils/validation.ts...
Funciones sin documentación:
1. isValidEmail(email: string): boolean
2. sanitizeInput(input: string): string
3. validatePassword(password: string): IValidationResult
Añadiendo documentación...
✅ Documentación añadida a 3 funciones
---
### 4.6 Skill 5: Skill específica de tu stack
Crea una skill personalizada para tu stack o workflow específico.
**Ejemplos por stack:**
#### React: `/component` - Generar componente
```markdown
---
name: component
description: Genera componente React con tests
argument-hint: "<nombre>"
allowed-tools: Read, Write
---
# Generador de componente React
Genera un componente React completo con:
- Componente TypeScript
- Props interface
- Test básico
- Storybook story (si existe)
## Proceso
1. Parsea el nombre del componente de `$ARGUMENTS`
2. Crea estructura en `src/components/[nombre]/`
3. Genera archivos:
- `[Nombre].tsx` - Componente
- `[Nombre].types.ts` - Props interface
- `[Nombre].test.tsx` - Tests
- `index.ts` - Barrel export
## Template del componente
```typescript
import type { I[Nombre]Props } from './[Nombre].types';
export function [Nombre]({ prop1, prop2 }: I[Nombre]Props) {
return (
<div>
{/* Implementación */}
</div>
);
}Ejemplo
$ /component UserCard
Generando componente UserCard...
Estructura creada:
src/components/UserCard/
├── UserCard.tsx
├── UserCard.types.ts
├── UserCard.test.tsx
└── index.ts
✅ Componente generado exitosamente
#### Python/FastAPI: `/endpoint` - Generar endpoint
```markdown
---
name: endpoint
description: Genera endpoint completo de API
argument-hint: "<método> <ruta>"
allowed-tools: Read, Write
---
# Generador de endpoint FastAPI
Genera un endpoint completo con:
- Route handler
- Pydantic schemas
- Service layer
- Tests
## Uso
```bash
/endpoint POST /users
/endpoint GET /users/{id}Genera
- Schema en
app/schemas/ - Route en
app/routes/ - Service en
app/services/ - Tests en
tests/
...
#### Node.js/Express: `/api` - Generar recurso REST
```markdown
---
name: api
description: Genera CRUD completo para un recurso
argument-hint: "<nombre-recurso>"
allowed-tools: Read, Write
---
# Generador de recurso REST
Genera CRUD completo:
- Controller con endpoints CRUD
- Service con lógica de negocio
- Repository con queries
- Validadores Zod
- Tests integration
## Ejemplo
```bash
$ /api task
Generando recurso 'task'...
Archivos creados:
- src/controllers/taskController.ts
- src/services/taskService.ts
- src/repositories/taskRepository.ts
- src/validators/taskValidators.ts
- src/routes/taskRoutes.ts
- tests/integration/tasks.test.ts
✅ Endpoints generados:
- GET /api/tasks
- GET /api/tasks/:id
- POST /api/tasks
- PUT /api/tasks/:id
- DELETE /api/tasks/:id
**Elige la que tenga más sentido para tu proyecto o crea una totalmente personalizada.**
---
### 4.7 Resumen de skills
Deberías tener estas 5 skills:
1. ✅ `/commit` - Mensajes de commit estandarizados
2. ✅ `/test` - Generar tests
3. ✅ `/review` - Code review
4. ✅ `/doc` - Documentar código
5. ✅ `/[tu-skill]` - Específica de tu stack
**Templates completos disponibles en:**
- recursos/templates/opcion-a/skills/
---
## Paso 5: Documentación
Crea documentación para que otros desarrolladores (o tú en el futuro) sepan usar la configuración.
### 5.1 README de configuración
**Archivo:** `docs/claude-code-setup.md`
```markdown
# Configuración de Claude Code
Este proyecto está optimizado para trabajar con Claude Code.
## Prerequisitos
- Claude Code instalado: `npm install -g @anthropic-ai/claude-code`
- API key configurada (Claude Pro/Max o API key)
## Setup inicial
1. **Instalar Claude Code** (si no lo tienes):
```bash
npm install -g @anthropic-ai/claude-code
claude --version-
Configurar API key:
# Opción 1: Login con cuenta Claude claude login # Opción 2: API key directa export ANTHROPIC_API_KEY=tu-api-key -
Trustear el directorio (primera vez):
cd /ruta/al/proyecto claude # Acepta el trust dialog
Configuración del proyecto
Este proyecto incluye:
📄 CLAUDE.md
Contexto automático sobre arquitectura y convenciones del proyecto.
- Ubicación:
.claude/CLAUDE.md - Se carga automáticamente en cada sesión
⚙️ settings.json
Configuración de permisos, modelo y hooks.
- Ubicación:
.claude/settings.json - Modelo: Sonnet 4.5
- Hooks configurados:
- Auto-formateo con Prettier
- Auto-lint con ESLint
- Tests automáticos al modificar código
🔧 Skills personalizadas
| Comando | Descripción | Uso |
|---|---|---|
/commit | Genera mensaje de commit | /commit |
/test | Genera tests para archivo | /test src/services/user.ts |
/review | Code review | /review src/controllers/task.ts |
/doc | Añade documentación | /doc src/utils/validation.ts |
/component | Genera componente React | /component UserProfile |
Flujo de trabajo recomendado
1. Nueva feature
# Inicia sesión
claude
# Crea branch
> Crea branch feature/user-authentication
# Desarrolla
> Implementa login endpoint con JWT
# Tests
> /test src/controllers/authController.ts
# Review
> /review staged
# Commit
> /commit2. Bug fix
claude
> Analiza el error: [pega stack trace]
> Propón solución
> Implementa la solución
> /test [archivo modificado]
> /commit3. Refactor
claude
> /review src/services/oldService.ts
> Refactoriza oldService.ts aplicando las sugerencias
> /test src/services/oldService.ts
> /commitPermisos configurados
✅ Permitido
- Leer cualquier archivo del proyecto
- Escribir/editar archivos de código
- Ejecutar:
git,npm,npx,node - Ejecutar tests
❌ Denegado
- Modificar
.envfiles - Modificar
package.jsondirectamente - Modificar archivos generados (
/prisma/migrations/*,/src/generated/*) - Ejecutar comandos peligrosos (
rm -rf,sudo) - Publicar paquetes (
npm publish)
Si necesitas hacer algo denegado, edita .claude/settings.json.
Hooks automáticos
Después de cada modificación de archivo, se ejecuta automáticamente:
- Prettier - Formateo de código
- ESLint - Linting (con auto-fix)
- Tests - Solo tests relacionados con el archivo modificado
Esto asegura que el código siempre esté formateado y los tests pasen.
Tips
Optimizar contexto
# Ver contexto actual
> /context
# Compactar conversación larga
> /compact
# Cambiar modelo temporalmente
> /model opusSesiones enfocadas
- Una tarea principal por sesión
- Usa
/compactcada 20-30 mensajes - Nueva sesión para temas no relacionados
Aprovechar skills
En lugar de:
> Lee userService.ts, genera tests con Jest, asegúrate de cubrir
casos felices y errores, usa mocks para el repository...Simplemente:
> /test src/services/userService.tsTroubleshooting
Hooks no se ejecutan
# Verifica que las herramientas estén instaladas
npx prettier --version
npx eslint --version
npm test -- --version
# Verifica permisos en settings.json
cat .claude/settings.json | grep -A 20 hooksClaude no respeta CLAUDE.md
# Verifica que existe
ls -la .claude/CLAUDE.md
# Pregunta directamente
> ¿Qué dice el CLAUDE.md sobre [tema específico]?Permisos denegados constantemente
# Edita settings.json para permitir lo necesario
vi .claude/settings.json
# O usa modo peligroso temporalmente (con cuidado)
claude --dangerously-skip-permissionsRecursos
- Documentación oficial de Claude Code
- CLAUDE.md del proyecto
- Settings del proyecto
Mantenimiento
Actualizar configuración
Cuando el proyecto evolucione, actualiza:
.claude/CLAUDE.md- Si cambia arquitectura o convenciones.claude/settings.json- Si necesitas nuevos permisos o hooks- Skills - Si cambian workflows
Compartir con el equipo
Esta configuración está commiteada en el repo. Nuevos devs solo necesitan:
npm install -g @anthropic-ai/claude-code
claude login
cd proyecto
claude # Y trustear el directorio¿Preguntas? Consulta este documento o pregunta en el canal del equipo.
---
### 5.2 Guía de onboarding
**Archivo:** `docs/onboarding-claude.md`
```markdown
# Onboarding: Trabajar con Claude Code
Bienvenido al equipo. Este proyecto usa Claude Code como herramienta de desarrollo.
## ¿Qué es Claude Code?
Claude Code es un agente de IA que:
- Entiende todo el codebase
- Puede leer, escribir y editar código
- Ejecuta comandos y tests
- Se integra con git
**No es Copilot:** No autocompleta mientras escribes. Es un asistente conversacional que hace cambios más amplios.
## Setup (5 minutos)
### 1. Instalar
```bash
npm install -g @anthropic-ai/claude-code2. Autenticar
claude login
# Sigue las instrucciones en el navegador3. Primer uso
cd /ruta/a/este/proyecto
claudeTe pedirá trustear el directorio. Revisa los archivos de configuración antes de aceptar:
.claude/CLAUDE.md- Contexto del proyecto.claude/settings.json- Permisos y hooks
Casos de uso
Entender el codebase (primer día)
> Explica la arquitectura general del proyecto
> ¿Cómo funciona la autenticación?
> ¿Dónde están los tests y cómo se ejecutan?
> Muéstrame el flujo de crear una tarea desde la UI hasta la DBImplementar feature
> Necesito añadir paginación al endpoint GET /tasks
> [Claude propone cambios]
> Implementa la solución
> /test src/controllers/taskController.ts
> /review staged
> /commitDebugging
> Este es el error que estoy teniendo: [pega stack trace]
> [Claude analiza y propone causa]
> ¿Cómo lo arreglo?
> [Claude propone solución]
> ImpleméntaloCode review
# Antes de hacer commit
> /review staged
# O de un archivo específico
> /review src/services/paymentService.tsComandos útiles
Skills personalizadas del proyecto
/commit- Genera mensaje de commit conventional/test <archivo>- Genera tests/review [archivo|staged]- Code review/doc <archivo>- Añade documentación/component <nombre>- Genera componente React (solo frontend)
Comandos nativos
/model [opus|sonnet|haiku]- Cambiar modelo/context- Ver contexto actual/compact- Compactar conversación/help- Ayuda completa
Mejores prácticas
✅ DO
- Pide explicaciones antes de cambios grandes
- Usa skills del proyecto (
/commit,/test, etc.) - Revisa cambios antes de aceptar
- Una tarea por sesión
- Haz
/compacten sesiones largas
❌ DON'T
- No pidas cambios sin entender qué hará
- No aceptes cambios sin revisar
- No mezcles múltiples tareas en una sesión
- No olvides hacer commit de los cambios
FAQ
P: ¿Claude puede romper el código?
R: Tiene permisos limitados por settings.json. No puede modificar .env, package.json, ni ejecutar comandos peligrosos.
P: ¿Cuánto cuesta? R: Con suscripción Claude Pro/Max es ilimitado. Con API pagas por tokens.
P: ¿Debo commitear todo lo que Claude hace? R: No. Revisa siempre los cambios. Claude es un asistente, tú decides qué commitear.
P: ¿Puedo usar mi propio CLAUDE.md?
R: Sí, crea ~/.claude/CLAUDE.md para preferencias personales globales.
P: ¿Los hooks son obligatorios?
R: Están en settings.json del proyecto, pero puedes sobrescribirlos en .claude/settings.local.json.
Siguientes pasos
- ✅ Instala Claude Code
- ✅ Lee este documento
- ✅ Lee
.claude/CLAUDE.mddel proyecto - ✅ Prueba con una tarea pequeña (ej: añadir log, fix typo)
- ✅ Experimenta con las skills (
/commit,/test, etc.)
¡Listo para trabajar! 🚀
---
## Paso 6: Testing y validación
### 6.1 Checklist de validación
Antes de dar por terminado tu proyecto, valida:
#### CLAUDE.md
- [ ] Documenta arquitectura del stack
- [ ] Lista convenciones de código
- [ ] Mapea estructura de carpetas
- [ ] Incluye comandos importantes
- [ ] Tiene reglas específicas del proyecto
- [ ] Documenta gotchas o trampas comunes
#### settings.json
- [ ] Modelo apropiado configurado
- [ ] Permisos siguen principio de mínimo privilegio
- [ ] Comandos bash necesarios permitidos
- [ ] Archivos sensibles (.env) denegados
- [ ] Hook de formateo funciona
- [ ] Hook de linting funciona
- [ ] Hook de tests funciona (si aplica)
#### Skills
- [ ] 5 skills creadas
- [ ] Cada skill tiene frontmatter YAML válido
- [ ] `/commit` genera mensajes conventional commits
- [ ] `/test` genera tests funcionales
- [ ] `/review` da feedback útil
- [ ] `/doc` añade documentación apropiada
- [ ] Skill específica resuelve problema real
#### Documentación
- [ ] `docs/claude-code-setup.md` existe y está completo
- [ ] `docs/onboarding-claude.md` para nuevos devs
- [ ] Instrucciones claras de instalación
- [ ] Troubleshooting incluido
- [ ] Ejemplos de uso
---
### 6.2 Pruebas prácticas
#### Prueba 1: Nueva sesión limpia
```bash
# Cierra claude si está abierto
exit
# Nueva sesión
claude
# Pregunta sobre el proyecto
> Explica la arquitectura del proyectoValidar:
- Claude menciona información de CLAUDE.md
- Respuesta es coherente y precisa
Prueba 2: Modificar un archivo y verificar hooks
> Añade un comentario en src/index.tsValidar:
- Hook de Prettier se ejecuta
- Hook de ESLint se ejecuta
- Archivo queda formateado correctamente
Prueba 3: Usar cada skill
> /commit
> /test src/utils/helper.ts
> /review src/services/userService.ts
> /doc src/utils/validation.ts
> /[tu-skill-especifica] [argumentos]Validar:
- Cada skill se ejecuta sin errores
- Output es útil y correcto
- Genera archivos/cambios apropiados
Prueba 4: Permisos funcionan
> Lee el archivo .envValidar:
- Claude indica que no tiene permiso
- No puede leer el archivo
> Ejecuta "sudo rm -rf /"Validar:
- Claude rechaza la petición
- Explica por qué está bloqueado
Prueba 5: Flujo completo de feature
> Crea una nueva función "saludar" en src/utils/greeter.ts que retorne "Hola [nombre]"
> /test src/utils/greeter.ts
> /doc src/utils/greeter.ts
> /review staged
> /commitValidar:
- Función se crea correctamente
- Tests se generan y pasan
- Documentación se añade
- Review da feedback (o aprueba si está bien)
- Commit se genera con mensaje apropiado
6.3 Optimizaciones finales
Después de las pruebas, optimiza:
1. CLAUDE.md
- Elimina información redundante
- Añade cosas que Claude preguntó repetidamente
- Asegura que ejemplos de código sean correctos
2. settings.json
- Ajusta permisos si fueron muy restrictivos o permisivos
- Optimiza hooks que sean muy lentos
- Añade comandos bash que necesitaste
3. Skills
- Mejora mensajes de error
- Añade validación de argumentos
- Optimiza prompts para mejor output
Entregables finales
Tu proyecto debe incluir:
proyecto/
├── .claude/
│ ├── CLAUDE.md ← Contexto del proyecto
│ ├── settings.json ← Configuración base
│ └── skills/
│ ├── commit/SKILL.md ← Skill 1
│ ├── test/SKILL.md ← Skill 2
│ ├── review/SKILL.md ← Skill 3
│ ├── doc/SKILL.md ← Skill 4
│ └── [tu-skill]/SKILL.md ← Skill 5
├── docs/
│ ├── claude-code-setup.md ← Setup y uso
│ └── onboarding-claude.md ← Guía para nuevos devs
└── README.md ← Mencionar Claude CodeCriterios de evaluación
Tu proyecto se evaluará sobre 100 puntos:
CLAUDE.md (25 puntos)
- Arquitectura clara (5 pts): Stack, decisiones arquitectónicas documentadas
- Convenciones bien definidas (5 pts): Naming, patterns, style guides
- Estructura mapeada (5 pts): Carpetas explicadas, ubicación de nuevos archivos
- Comandos documentados (5 pts): Scripts npm, comandos importantes
- Reglas específicas útiles (5 pts): Gotchas, restricciones, best practices
settings.json (25 puntos)
- Permisos apropiados (10 pts): Mínimo privilegio, allows y denys correctos
- Hooks funcionales (10 pts): Formateo, linting, tests automáticos
- Configuración de modelo (5 pts): Modelo apropiado para el proyecto
Skills (30 puntos)
- 5 skills funcionales (15 pts): Todas ejecutan sin errores
- Documentación clara (10 pts): Frontmatter correcto, instrucciones claras
- Resuelven problemas reales (5 pts): Útiles para el workflow del proyecto
Documentación (20 puntos)
- README completo (10 pts): Setup, uso, troubleshooting
- Guía de onboarding (5 pts): Para nuevos desarrolladores
- Ejemplos de uso (5 pts): Casos de uso documentados
Rúbrica detallada en: 11.4-evaluacion.md
Recursos
Templates
- CLAUDE.md.template
- settings.json.template
- Skill templates
Ejemplos completos
- E-commerce API (Node.js + TypeScript)
Documentación
Próximos pasos
- ✅ Analiza tu proyecto
- ✅ Crea CLAUDE.md
- ✅ Configura settings.json
- ✅ Desarrolla 5 skills
- ✅ Escribe documentación
- ✅ Prueba y valida
- ✅ Entrega el proyecto
¡Mucha suerte! 🚀
Navegación
- ← Volver a Introducción
- Ver Opción B: Pipeline automatizado →
- Ver Opción C: Agente personalizado →
- Evaluación y entrega →
11.2 Opción B: Pipeline de desarrollo automatizado
Visión general
En esta opción construirás un sistema completo de automatización que integra Claude Code en el workflow de desarrollo del equipo mediante CI/CD.
Al finalizar tendrás:
- ✅ Script de setup para nuevos desarrolladores
- ✅ Pipeline de CI/CD con GitHub Actions (u otro)
- ✅ Code review automático en pull requests
- ✅ Generación automática de changelogs
- ✅ Detección de breaking changes
- ✅ Sistema de agentes especializados
- ✅ Documentación completa del sistema
Prerequisitos
Antes de empezar esta opción, asegúrate de tener:
- Conocimientos de CI/CD (GitHub Actions, GitLab CI, o similar)
- Experiencia con scripts bash o PowerShell
- Proyecto con repositorio git
- Acceso para configurar CI/CD en el repositorio
- API key de Claude (para usar en CI)
Paso 1: Análisis y planificación
1.1 Elige la plataforma CI/CD
Esta guía usa GitHub Actions como ejemplo principal, pero los conceptos aplican a:
- GitHub Actions ⭐ (RECOMENDADO - más documentado)
- GitLab CI/CD
- Jenkins
- CircleCI
- Azure DevOps
- Bitbucket Pipelines
Si usas otra plataforma, adapta los workflows a su sintaxis.
1.2 Define qué automatizar
Analiza tu workflow actual y identifica qué puede automatizarse:
Tareas comunes a automatizar:
Durante desarrollo:
- Setup del entorno (Claude Code + deps)
- Formateo de código
- Linting
- Tests
En pull requests:
- Code review automático
- Detección de breaking changes
- Verificación de tests
- Validación de commits
En merges/releases:
- Generación de changelog
- Actualización de versión
- Creación de release notes
- Deploy automático
Mantenimiento:
- Actualización de dependencias
- Generación de documentación
- Análisis de código legacy
Ejercicio: Haz una lista de las 5-10 tareas más repetitivas de tu equipo.
1.3 Arquitectura del pipeline
┌─────────────────────────────────────────────────────────────┐
│ WORKFLOW DE DESARROLLO │
└─────────────────────────────────────────────────────────────┘
┌──────────────┐
│ Nuevo Dev │
│ se une │
└──────┬───────┘
│
├─────────> Script de Setup
│ - Instala Claude Code
│ - Configura API key
│ - Instala deps
│ - Valida instalación
│
▼
┌──────────────┐
│ Desarrollo │
│ local │
└──────┬───────┘
│
├─────────> Hooks locales (pre-commit, pre-push)
│ - Formateo
│ - Linting
│ - Tests
│
▼
┌──────────────┐
│ Crea PR │
└──────┬───────┘
│
├─────────> GitHub Actions Workflow
│ ├── AI Code Review
│ ├── Breaking Changes Detection
│ ├── Test Suite
│ └── Comment on PR
│
▼
┌──────────────┐
│ Merge PR │
└──────┬───────┘
│
├─────────> Post-merge Workflow
│ ├── Generate Changelog
│ ├── Update Docs
│ └── Notify team
│
▼
┌──────────────┐
│ Release │
└──────┬───────┘
│
└─────────> Release Workflow
├── Create Release Notes
├── Tag version
└── DeployPaso 2: Script de setup
El script de setup automatiza la configuración inicial para nuevos desarrolladores.
2.1 Requisitos del script
Debe ser:
- ✅ Idempotente: Puede ejecutarse múltiples veces sin problemas
- ✅ Cross-platform: Funciona en Linux, macOS y Windows
- ✅ Validado: Verifica cada paso
- ✅ Informativo: Muestra progreso claramente
- ✅ Seguro: Maneja secrets correctamente
2.2 Script para Linux/macOS (Bash)
Archivo: scripts/setup-claude.sh
#!/bin/bash
set -e # Exit on error
# Colors para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Funciones auxiliares
print_step() {
echo -e "${BLUE}▶ $1${NC}"
}
print_success() {
echo -e "${GREEN}✓ $1${NC}"
}
print_error() {
echo -e "${RED}✗ $1${NC}"
}
print_warning() {
echo -e "${YELLOW}⚠ $1${NC}"
}
# Header
echo "================================================"
echo " Claude Code Setup Script"
echo " Proyecto: $(basename $(pwd))"
echo "================================================"
echo ""
# 1. Verificar Node.js
print_step "Verificando Node.js..."
if ! command -v node &> /dev/null; then
print_error "Node.js no está instalado"
echo "Instala Node.js desde: https://nodejs.org/"
exit 1
fi
NODE_VERSION=$(node --version)
print_success "Node.js instalado: $NODE_VERSION"
# 2. Instalar Claude Code
print_step "Instalando Claude Code..."
if command -v claude &> /dev/null; then
CLAUDE_VERSION=$(claude --version 2>&1 | head -n 1)
print_warning "Claude Code ya está instalado: $CLAUDE_VERSION"
read -p "¿Deseas actualizar a la última versión? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
npm install -g @anthropic-ai/claude-code@latest
print_success "Claude Code actualizado"
fi
else
npm install -g @anthropic-ai/claude-code
print_success "Claude Code instalado"
fi
# Verificar instalación
if ! command -v claude &> /dev/null; then
print_error "Error al instalar Claude Code"
exit 1
fi
CLAUDE_VERSION=$(claude --version 2>&1 | head -n 1)
print_success "Claude Code version: $CLAUDE_VERSION"
# 3. Configurar API Key
print_step "Configurando API Key..."
# Verificar si ya está configurado
if [ -n "$ANTHROPIC_API_KEY" ]; then
print_success "API key ya configurada (variable de entorno)"
elif [ -f "$HOME/.claude/config" ]; then
print_success "API key ya configurada (archivo config)"
else
echo ""
echo "Necesitas una API key de Claude."
echo "Opciones:"
echo " 1) Tengo Claude Pro/Max (login con cuenta)"
echo " 2) Tengo API key de Anthropic"
echo ""
read -p "Elige opción (1/2): " API_OPTION
case $API_OPTION in
1)
print_step "Iniciando login con Claude..."
claude login
print_success "Login completado"
;;
2)
read -sp "Ingresa tu API key: " API_KEY
echo ""
export ANTHROPIC_API_KEY="$API_KEY"
# Guardar en shell config
SHELL_RC=""
if [ -f "$HOME/.bashrc" ]; then
SHELL_RC="$HOME/.bashrc"
elif [ -f "$HOME/.zshrc" ]; then
SHELL_RC="$HOME/.zshrc"
fi
if [ -n "$SHELL_RC" ]; then
if ! grep -q "ANTHROPIC_API_KEY" "$SHELL_RC"; then
echo "" >> "$SHELL_RC"
echo "# Claude Code API Key" >> "$SHELL_RC"
echo "export ANTHROPIC_API_KEY=\"$API_KEY\"" >> "$SHELL_RC"
print_success "API key guardada en $SHELL_RC"
fi
fi
;;
*)
print_error "Opción inválida"
exit 1
;;
esac
fi
# 4. Instalar dependencias del proyecto
print_step "Instalando dependencias del proyecto..."
if [ -f "package.json" ]; then
if [ -f "package-lock.json" ]; then
npm ci
else
npm install
fi
print_success "Dependencias de npm instaladas"
elif [ -f "requirements.txt" ]; then
if command -v python3 &> /dev/null; then
python3 -m pip install -r requirements.txt
print_success "Dependencias de Python instaladas"
else
print_error "Python3 no está instalado"
exit 1
fi
elif [ -f "go.mod" ]; then
go mod download
print_success "Dependencias de Go descargadas"
elif [ -f "Cargo.toml" ]; then
cargo fetch
print_success "Dependencias de Rust descargadas"
fi
# 5. Verificar configuración de Claude
print_step "Verificando configuración de Claude Code..."
if [ ! -f ".claude/CLAUDE.md" ]; then
print_warning "No se encontró .claude/CLAUDE.md"
else
print_success "CLAUDE.md encontrado"
fi
if [ ! -f ".claude/settings.json" ]; then
print_warning "No se encontró .claude/settings.json"
else
print_success "settings.json encontrado"
fi
# 6. Trustear el directorio
print_step "Trusteando directorio actual..."
echo ""
echo "Cuando se abra Claude, acepta el trust dialog."
echo "Revisa los archivos de configuración antes de aceptar:"
echo " - .claude/CLAUDE.md"
echo " - .claude/settings.json"
echo ""
read -p "Presiona Enter para continuar..."
# Iniciar Claude en modo interactivo brevemente
timeout 5s claude || true
# 7. Instalar herramientas adicionales
print_step "Verificando herramientas de desarrollo..."
# Prettier (si es proyecto JS/TS)
if [ -f "package.json" ]; then
if ! npm list prettier &> /dev/null; then
print_warning "Prettier no está instalado (recomendado para formateo)"
else
print_success "Prettier instalado"
fi
if ! npm list eslint &> /dev/null; then
print_warning "ESLint no está instalado (recomendado para linting)"
else
print_success "ESLint instalado"
fi
fi
# 8. Setup de git hooks (opcional)
print_step "Configurando git hooks..."
if [ -d ".git" ]; then
read -p "¿Deseas instalar git hooks? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
if command -v husky &> /dev/null || npm list husky &> /dev/null; then
npx husky install
print_success "Git hooks configurados con Husky"
else
print_warning "Husky no está disponible"
fi
fi
fi
# 9. Validación final
print_step "Ejecutando validación final..."
echo ""
echo "Probando Claude Code..."
CLAUDE_TEST=$(claude -p "responde solo: OK" 2>&1 || echo "ERROR")
if echo "$CLAUDE_TEST" | grep -qi "ok"; then
print_success "Claude Code funciona correctamente"
else
print_error "Claude Code no respondió correctamente"
echo "Output: $CLAUDE_TEST"
exit 1
fi
# Resumen final
echo ""
echo "================================================"
echo -e "${GREEN}✓ Setup completado exitosamente${NC}"
echo "================================================"
echo ""
echo "Próximos pasos:"
echo " 1. Lee la documentación: docs/claude-code-setup.md"
echo " 2. Familiarízate con los comandos: claude --help"
echo " 3. Prueba: claude"
echo ""
echo "Comandos útiles:"
echo " claude - Modo interactivo"
echo " claude -p \"...\" - Prompt directo"
echo " /help - Ayuda de comandos"
echo ""
echo "Skills disponibles en este proyecto:"
if [ -d ".claude/skills" ]; then
ls -1 .claude/skills/ | sed 's/^/ \//'
fi
echo ""2.3 Script para Windows (PowerShell)
Archivo: scripts/setup-claude.ps1
# Setup script para Claude Code en Windows
# Ejecutar con: powershell -ExecutionPolicy Bypass -File .\scripts\setup-claude.ps1
# Configuración
$ErrorActionPreference = "Stop"
# Funciones auxiliares
function Print-Step {
param($Message)
Write-Host "▶ $Message" -ForegroundColor Blue
}
function Print-Success {
param($Message)
Write-Host "✓ $Message" -ForegroundColor Green
}
function Print-Error {
param($Message)
Write-Host "✗ $Message" -ForegroundColor Red
}
function Print-Warning {
param($Message)
Write-Host "⚠ $Message" -ForegroundColor Yellow
}
# Header
Write-Host "================================================"
Write-Host " Claude Code Setup Script (Windows)"
Write-Host " Proyecto: $(Split-Path -Leaf (Get-Location))"
Write-Host "================================================"
Write-Host ""
# 1. Verificar Node.js
Print-Step "Verificando Node.js..."
try {
$nodeVersion = node --version
Print-Success "Node.js instalado: $nodeVersion"
} catch {
Print-Error "Node.js no está instalado"
Write-Host "Instala Node.js desde: https://nodejs.org/"
exit 1
}
# 2. Instalar Claude Code
Print-Step "Instalando Claude Code..."
try {
$claudeVersion = claude --version 2>&1 | Select-Object -First 1
Print-Warning "Claude Code ya está instalado: $claudeVersion"
$update = Read-Host "¿Deseas actualizar a la última versión? (y/n)"
if ($update -eq "y") {
npm install -g @anthropic-ai/claude-code@latest
Print-Success "Claude Code actualizado"
}
} catch {
npm install -g @anthropic-ai/claude-code
Print-Success "Claude Code instalado"
}
# Verificar instalación
try {
$claudeVersion = claude --version 2>&1 | Select-Object -First 1
Print-Success "Claude Code version: $claudeVersion"
} catch {
Print-Error "Error al instalar Claude Code"
exit 1
}
# 3. Configurar API Key
Print-Step "Configurando API Key..."
if ($env:ANTHROPIC_API_KEY) {
Print-Success "API key ya configurada (variable de entorno)"
} elseif (Test-Path "$env:USERPROFILE\.claude\config") {
Print-Success "API key ya configurada (archivo config)"
} else {
Write-Host ""
Write-Host "Necesitas una API key de Claude."
Write-Host "Opciones:"
Write-Host " 1) Tengo Claude Pro/Max (login con cuenta)"
Write-Host " 2) Tengo API key de Anthropic"
Write-Host ""
$apiOption = Read-Host "Elige opción (1/2)"
switch ($apiOption) {
"1" {
Print-Step "Iniciando login con Claude..."
claude login
Print-Success "Login completado"
}
"2" {
$apiKey = Read-Host "Ingresa tu API key" -AsSecureString
$apiKeyPlain = [Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($apiKey)
)
[Environment]::SetEnvironmentVariable("ANTHROPIC_API_KEY", $apiKeyPlain, "User")
$env:ANTHROPIC_API_KEY = $apiKeyPlain
Print-Success "API key configurada"
}
default {
Print-Error "Opción inválida"
exit 1
}
}
}
# 4. Instalar dependencias del proyecto
Print-Step "Instalando dependencias del proyecto..."
if (Test-Path "package.json") {
if (Test-Path "package-lock.json") {
npm ci
} else {
npm install
}
Print-Success "Dependencias de npm instaladas"
}
# 5. Verificar configuración de Claude
Print-Step "Verificando configuración de Claude Code..."
if (-not (Test-Path ".claude\CLAUDE.md")) {
Print-Warning "No se encontró .claude\CLAUDE.md"
} else {
Print-Success "CLAUDE.md encontrado"
}
if (-not (Test-Path ".claude\settings.json")) {
Print-Warning "No se encontró .claude\settings.json"
} else {
Print-Success "settings.json encontrado"
}
# 6. Validación final
Print-Step "Ejecutando validación final..."
Write-Host ""
Write-Host "Probando Claude Code..."
try {
$claudeTest = claude -p "responde solo: OK" 2>&1
if ($claudeTest -match "OK") {
Print-Success "Claude Code funciona correctamente"
} else {
Print-Error "Claude Code no respondió correctamente"
Write-Host "Output: $claudeTest"
exit 1
}
} catch {
Print-Error "Error al probar Claude Code"
Write-Host $_.Exception.Message
exit 1
}
# Resumen final
Write-Host ""
Write-Host "================================================"
Write-Host "✓ Setup completado exitosamente" -ForegroundColor Green
Write-Host "================================================"
Write-Host ""
Write-Host "Próximos pasos:"
Write-Host " 1. Lee la documentación: docs\claude-code-setup.md"
Write-Host " 2. Familiarízate con los comandos: claude --help"
Write-Host " 3. Prueba: claude"
Write-Host ""
Write-Host "Skills disponibles:"
if (Test-Path ".claude\skills") {
Get-ChildItem ".claude\skills" -Directory | ForEach-Object {
Write-Host " /$($_.Name)"
}
}
Write-Host ""2.4 Hacer ejecutables los scripts
# Linux/macOS
chmod +x scripts/setup-claude.sh
# Ejecutar
./scripts/setup-claude.sh# Windows
# Ejecutar con PowerShell como admin
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# Ejecutar
.\scripts\setup-claude.ps12.5 README del script
Archivo: scripts/README.md
# Scripts de Setup
## setup-claude.sh / setup-claude.ps1
Automatiza la instalación y configuración de Claude Code para nuevos desarrolladores.
### Uso
**Linux/macOS:**
```bash
./scripts/setup-claude.shWindows:
.\scripts\setup-claude.ps1Qué hace el script
- ✓ Verifica Node.js
- ✓ Instala/actualiza Claude Code
- ✓ Configura API key
- ✓ Instala dependencias del proyecto
- ✓ Verifica configuración de Claude
- ✓ Trustea el directorio
- ✓ Verifica herramientas de desarrollo
- ✓ Configura git hooks (opcional)
- ✓ Valida que todo funcione
Requisitos
- Node.js 18+ instalado
- Cuenta Claude Pro/Max o API key
- Git (si usas git hooks)
Troubleshooting
Error: "comando no encontrado: claude"
# Verifica que npm bin global esté en PATH
echo $PATH | grep npm
# En algunos sistemas necesitas añadir a PATH manualmente
export PATH="$PATH:$(npm root -g)/bin"Error: "ANTHROPIC_API_KEY no configurada"
# Opción 1: Variable de entorno
export ANTHROPIC_API_KEY="tu-api-key"
# Opción 2: Login con cuenta
claude loginError: "Permisos denegados"
# Linux/macOS
chmod +x scripts/setup-claude.sh
# Windows (ejecutar PowerShell como admin)
Set-ExecutionPolicy -ExecutionPolicy RemoteSignedDesinstalación
npm uninstall -g @anthropic-ai/claude-code
rm -rf ~/.claude
---
## Paso 3: Pipeline de CI/CD
### 3.1 Configurar secrets
Primero, configura los secrets necesarios en tu plataforma CI/CD.
#### GitHub Actions
1. Ve a tu repositorio → **Settings** → **Secrets and variables** → **Actions**
2. Añade estos secrets:
| Secret | Valor | Uso |
|--------|-------|-----|
| `ANTHROPIC_API_KEY` | Tu API key de Claude | Para ejecutar Claude en CI |
| `GH_TOKEN` | GitHub Personal Access Token | Para comentar en PRs |
#### GitLab CI/CD
1. Ve a tu proyecto → **Settings** → **CI/CD** → **Variables**
2. Añade las mismas variables marcando "Masked" y "Protected"
---
### 3.2 Workflow 1: AI Code Review en PRs
Este workflow ejecuta un code review automático cada vez que se crea o actualiza un PR.
**Archivo:** `.github/workflows/ai-review.yml`
```yaml
name: AI Code Review
on:
pull_request:
types: [opened, synchronize, reopened]
branches:
- main
- develop
# Evita ejecuciones concurrentes en el mismo PR
concurrency:
group: ai-review-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
ai-review:
name: AI Code Review
runs-on: ubuntu-latest
# Solo ejecutar en PRs de ramas del mismo repo (no forks)
if: github.event.pull_request.head.repo.full_name == github.repository
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # Necesario para git diff
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Install Claude Code
run: |
npm install -g @anthropic-ai/claude-code
claude --version
- name: Get changed files
id: changed-files
run: |
echo "files<<EOF" >> $GITHUB_OUTPUT
git diff --name-only origin/${{ github.base_ref }}...HEAD >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Run AI Code Review
id: review
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
# Crear directorio temporal para el reporte
mkdir -p /tmp/review
# Ejecutar review de los cambios
claude --dangerously-skip-permissions -p "
Analiza los cambios en este PR y genera un code review detallado.
Archivos modificados:
${{ steps.changed-files.outputs.files }}
Ejecuta: git diff origin/${{ github.base_ref }}...HEAD
Genera un reporte en formato markdown con:
1. Resumen ejecutivo
2. Issues críticos (P1)
3. Issues importantes (P2)
4. Mejoras sugeridas (P3)
5. Aspectos positivos
6. Veredicto final (APROBADO/CAMBIOS REQUERIDOS)
Guarda el reporte en /tmp/review/report.md
" > /tmp/review/output.log 2>&1
# Verificar que el reporte fue generado
if [ ! -f /tmp/review/report.md ]; then
echo "Error: No se generó el reporte de review"
cat /tmp/review/output.log
exit 1
fi
- name: Post review as comment
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
const fs = require('fs');
const report = fs.readFileSync('/tmp/review/report.md', 'utf8');
const comment = `## 🤖 AI Code Review
${report}
---
<sub>Generated by Claude Code • [View workflow run](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})</sub>
`;
// Buscar comentario anterior del bot
const { data: comments } = await github.rest.issues.listComments({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
});
const botComment = comments.find(comment =>
comment.user.type === 'Bot' &&
comment.body.includes('🤖 AI Code Review')
);
// Actualizar o crear comentario
if (botComment) {
await github.rest.issues.updateComment({
owner: context.repo.owner,
repo: context.repo.repo,
comment_id: botComment.id,
body: comment
});
} else {
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: comment
});
}
- name: Upload review report
uses: actions/upload-artifact@v4
if: always()
with:
name: ai-review-report
path: /tmp/review/
retention-days: 30
- name: Check for critical issues
run: |
# Verificar si hay issues P1 (críticos)
if grep -q "🔴.*P1" /tmp/review/report.md; then
echo "⚠️ Se encontraron issues críticos (P1)"
echo "critical_issues=true" >> $GITHUB_OUTPUT
# No fallar el workflow, solo advertir
fiTemplate del reporte generado:
El prompt está diseñado para que Claude genere reportes como este:
# Code Review
## 📊 Resumen
| Métrica | Valor |
|---------|-------|
| Archivos revisados | 5 |
| Líneas modificadas | +245, -87 |
| Issues encontrados | 3 |
| Distribución | 🔴 P1: 0, 🟠 P2: 1, 🟡 P3: 2 |
**Veredicto:** ⚠️ APROBADO CON COMENTARIOS
## 🔍 Issues encontrados
### 🟠 P2 - Alto
#### src/services/userService.ts:45 - Falta manejo de errores
**Problema:**
La función `createUser` no maneja el caso donde el email ya existe.
**Solución:**
```typescript
if (await this.userExists(email)) {
throw new DuplicateEmailError(email);
}🟡 P3 - Medio
src/controllers/authController.ts:120 - Función larga
Sugerencia: Extraer validación de password en función separada.
✅ Aspectos positivos
- Excelente cobertura de tests (95%)
- Documentación clara en funciones públicas
- Uso correcto de TypeScript strict mode
💡 Veredicto final
Buen trabajo en general. Corregir el issue P2 antes de merge. Los issues P3 pueden abordarse en un refactor futuro.
---
### 3.3 Workflow 2: Detección de Breaking Changes
Detecta cambios que pueden romper la API pública o compatibilidad.
**Archivo:** `.github/workflows/breaking-changes.yml`
```yaml
name: Detect Breaking Changes
on:
pull_request:
types: [opened, synchronize]
branches:
- main
jobs:
detect-breaking-changes:
name: Detect Breaking Changes
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Checkout PR branch
uses: actions/checkout@v4
with:
path: current
- name: Checkout base branch
uses: actions/checkout@v4
with:
ref: ${{ github.base_ref }}
path: base
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Detect breaking changes
id: detect
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
cd current
claude --dangerously-skip-permissions -p "
Analiza los cambios entre la rama base y el PR para detectar breaking changes.
Compara:
- Base: ../base
- Current: .
Busca breaking changes en:
1. **API pública** (exported functions, classes, types)
- Funciones/métodos eliminados
- Parámetros eliminados o cambiados
- Returns types modificados
- Interfaces/types modificados
2. **Configuración**
- Variables de entorno requeridas nuevas
- Cambios en formato de configuración
3. **Base de datos** (si aplica)
- Migraciones que eliminan columnas
- Cambios en schemas
4. **Dependencias**
- Major version bumps
- Dependencias eliminadas
Genera reporte en /tmp/breaking-changes.md con formato:
# Breaking Changes Report
## ⚠️ Breaking Changes Detected: [YES/NO]
[Si hay breaking changes, listar cada uno con:]
### [Categoría]: [Descripción breve]
**Impact:** [Descripción del impacto]
**Migration:**
\`\`\`
[Código o pasos para migrar]
\`\`\`
**Files affected:**
- [archivo:línea]
---
[Si NO hay breaking changes:]
✅ No se detectaron breaking changes.
" > /tmp/detection.log 2>&1
# Verificar resultado
if [ -f /tmp/breaking-changes.md ]; then
cat /tmp/breaking-changes.md
# Detectar si hay breaking changes
if grep -q "Breaking Changes Detected: YES" /tmp/breaking-changes.md; then
echo "has_breaking_changes=true" >> $GITHUB_OUTPUT
else
echo "has_breaking_changes=false" >> $GITHUB_OUTPUT
fi
fi
- name: Add label if breaking changes
if: steps.detect.outputs.has_breaking_changes == 'true'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
labels: ['breaking-change']
});
- name: Comment on PR
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
const fs = require('fs');
let report = '';
if (fs.existsSync('/tmp/breaking-changes.md')) {
report = fs.readFileSync('/tmp/breaking-changes.md', 'utf8');
} else {
report = '✅ No se detectaron breaking changes.';
}
const comment = `## 🔍 Breaking Changes Analysis
${report}
---
<sub>Automated by Claude Code</sub>
`;
github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: comment
});
- name: Fail if breaking changes without confirmation
if: steps.detect.outputs.has_breaking_changes == 'true'
run: |
# Verificar si el PR tiene el label "breaking-change-approved"
# o si el título contiene "BREAKING:"
PR_TITLE="${{ github.event.pull_request.title }}"
if echo "$PR_TITLE" | grep -qi "BREAKING:"; then
echo "✓ Breaking change reconocido en el título"
exit 0
fi
# Si no está aprobado, fallar
echo "⚠️ Breaking changes detectados"
echo "Para aprobar:"
echo " 1. Añade 'BREAKING:' al título del PR, o"
echo " 2. Añade el label 'breaking-change-approved'"
exit 13.4 Workflow 3: Generación de Changelog
Genera changelog automático cuando se hace merge a main.
Archivo: .github/workflows/changelog.yml
name: Generate Changelog
on:
push:
branches:
- main
workflow_dispatch: # Permite ejecución manual
jobs:
generate-changelog:
name: Generate Changelog
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0 # Necesario para todo el historial
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Claude Code
run: npm install -g @anthropic-ai/claude-code
- name: Get last release tag
id: last-release
run: |
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$LAST_TAG" ]; then
echo "tag=" >> $GITHUB_OUTPUT
echo "range=HEAD" >> $GITHUB_OUTPUT
else
echo "tag=$LAST_TAG" >> $GITHUB_OUTPUT
echo "range=$LAST_TAG..HEAD" >> $GITHUB_OUTPUT
fi
- name: Generate changelog
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
claude --dangerously-skip-permissions -p "
Genera un changelog para los commits desde ${{ steps.last-release.outputs.range }}
Ejecuta: git log ${{ steps.last-release.outputs.range }} --pretty=format:'%h %s (%an)' --no-merges
Agrupa los commits por tipo (conventional commits):
- ✨ Features (feat:)
- 🐛 Bug Fixes (fix:)
- 📚 Documentation (docs:)
- ♻️ Refactoring (refactor:)
- ✅ Tests (test:)
- 🔧 Chores (chore:)
- ⚡ Performance (perf:)
- 💥 Breaking Changes (BREAKING:)
Genera en formato:
# Changelog
## [Unreleased]
### ✨ Features
- [commit msg] ([hash](link))
### 🐛 Bug Fixes
- [commit msg] ([hash](link))
[etc...]
### Contributors
- @username
Guarda en CHANGELOG.md PREPENDING al archivo existente (no sobrescribir).
Si no existe CHANGELOG.md, créalo.
Formato de links: https://github.com/${{ github.repository }}/commit/{hash}
" > /tmp/changelog-gen.log 2>&1
- name: Commit changelog
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
if git diff --quiet CHANGELOG.md; then
echo "No changes to changelog"
else
git add CHANGELOG.md
git commit -m "docs: update CHANGELOG.md [skip ci]"
git push
fiPaso 4: Sistema de agentes especializados
Crea agentes que ejecutan tareas específicas de forma autónoma.
4.1 Agente de documentación
Archivo: scripts/agents/documentation-agent.sh
#!/bin/bash
# Agente que genera/actualiza documentación automáticamente
set -e
DOCS_DIR="docs"
SRC_DIR="src"
echo "🤖 Documentation Agent"
echo "======================"
echo ""
# 1. Generar API docs desde código
echo "📚 Generando documentación de API..."
claude --dangerously-skip-permissions -p "
Analiza todos los archivos en $SRC_DIR/ y genera documentación de API.
Para cada módulo/servicio público:
1. Lee el código
2. Extrae funciones/clases públicas
3. Documenta:
- Propósito
- Parámetros
- Returns
- Ejemplos de uso
- Errores posibles
Estructura en docs/api/:
- docs/api/services.md
- docs/api/controllers.md
- docs/api/utils.md
Usa formato markdown con:
- Table of contents
- Anchors para navegación
- Code examples
- Links cruzados entre módulos
"
echo "✓ API docs generados"
# 2. Actualizar README si es necesario
echo "📝 Verificando README..."
claude --dangerously-skip-permissions -p "
Lee el README.md actual y el código del proyecto.
Verifica que README incluya:
1. Descripción actualizada del proyecto
2. Instalación
3. Uso básico
4. API reference (link a docs/api/)
5. Contribución
6. License
Si falta algo o está desactualizado, actualiza el README.md
"
echo "✓ README verificado"
# 3. Generar changelog si hay commits nuevos
echo "📋 Actualizando changelog..."
COMMITS_SINCE_LAST=$(git log --oneline -n 20 | wc -l)
if [ "$COMMITS_SINCE_LAST" -gt 0 ]; then
claude --dangerously-skip-permissions -p "
Actualiza CHANGELOG.md con los últimos commits.
Ejecuta: git log -20 --pretty=format:'%h %s'
Agrupa por tipo (feat, fix, docs, etc.)
"
echo "✓ Changelog actualizado"
else
echo "⊘ No hay commits nuevos"
fi
echo ""
echo "✅ Documentation Agent completado"4.2 Agente de testing
Archivo: scripts/agents/test-agent.sh
#!/bin/bash
# Agente que identifica código sin tests y los genera
set -e
echo "🤖 Test Generation Agent"
echo "========================"
echo ""
# 1. Identificar archivos sin tests
echo "🔍 Buscando archivos sin tests..."
claude --dangerously-skip-permissions -p "
Analiza el proyecto y encuentra archivos de código sin tests correspondientes.
Busca en src/ archivos .ts/.js/.py que NO tengan:
- Archivo .test.ts/.test.js/.test.py correspondiente
- Archivo .spec.ts/.spec.js
Genera reporte en /tmp/missing-tests.txt con:
- Ruta del archivo
- Complejidad estimada (líneas de código)
- Prioridad (alta si es service/controller, media si es util)
Formato:
src/services/paymentService.ts | 250 líneas | ALTA
"
if [ ! -f /tmp/missing-tests.txt ]; then
echo "✓ Todos los archivos tienen tests"
exit 0
fi
MISSING_COUNT=$(wc -l < /tmp/missing-tests.txt)
echo "⚠️ Encontrados $MISSING_COUNT archivos sin tests"
echo ""
# 2. Generar tests para archivos prioritarios
echo "✅ Generando tests..."
# Leer archivos de alta prioridad
HIGH_PRIORITY=$(grep "ALTA" /tmp/missing-tests.txt | cut -d'|' -f1 | tr -d ' ')
for file in $HIGH_PRIORITY; do
if [ -f "$file" ]; then
echo " Generando tests para: $file"
claude --dangerously-skip-permissions -p "
Genera tests completos para $file
Lee el archivo y crea tests con:
- Happy paths
- Edge cases
- Error handling
- Mocking de dependencias
Guarda en la ubicación estándar de tests del proyecto.
Ejecuta los tests para verificar que pasan.
"
fi
done
echo ""
echo "✅ Test Agent completado"
echo "Tests generados para archivos de alta prioridad"4.3 Agente de migración
Archivo: scripts/agents/migration-agent.sh
#!/bin/bash
# Agente que migra código legacy o deprecated
set -e
echo "🤖 Migration Agent"
echo "=================="
echo ""
# Configurable
OLD_PATTERN="${1:-}"
NEW_PATTERN="${2:-}"
if [ -z "$OLD_PATTERN" ] || [ -z "$NEW_PATTERN" ]; then
echo "Uso: $0 <patrón-viejo> <patrón-nuevo>"
echo ""
echo "Ejemplos:"
echo " $0 'var ' 'const ' # var → const"
echo " $0 'require(' 'import ' # CommonJS → ESM"
exit 1
fi
echo "Migrando: '$OLD_PATTERN' → '$NEW_PATTERN'"
echo ""
# 1. Buscar ocurrencias
echo "🔍 Buscando ocurrencias..."
FILES_WITH_PATTERN=$(grep -rl "$OLD_PATTERN" src/ || echo "")
if [ -z "$FILES_WITH_PATTERN" ]; then
echo "✓ No se encontraron ocurrencias"
exit 0
fi
FILE_COUNT=$(echo "$FILES_WITH_PATTERN" | wc -l)
echo "📝 Encontrados $FILE_COUNT archivos con el patrón"
echo ""
# 2. Migrar cada archivo
echo "🔄 Migrando archivos..."
echo "$FILES_WITH_PATTERN" | while read -r file; do
if [ -f "$file" ]; then
echo " Migrando: $file"
claude --dangerously-skip-permissions -p "
Migra $file de '$OLD_PATTERN' a '$NEW_PATTERN'
Pasos:
1. Lee el archivo
2. Reemplaza todas las ocurrencias de '$OLD_PATTERN' con '$NEW_PATTERN'
3. Asegúrate de que la sintaxis siga siendo válida
4. Si hay imports/requires afectados, ajústalos
5. Guarda el archivo
6. Ejecuta tests relacionados (si existen)
Si los tests fallan, revierte el cambio y reporta el error.
"
# Verificar que el archivo sigue siendo válido
if command -v node &> /dev/null && [[ "$file" =~ \.(js|ts)$ ]]; then
node --check "$file" 2>&1 || echo "⚠️ Syntax error en $file"
fi
fi
done
echo ""
echo "✅ Migration Agent completado"
echo "Archivos migrados: $FILE_COUNT"
echo ""
echo "Siguiente paso: Revisar cambios y ejecutar test suite completo"4.4 Orquestador de agentes
Archivo: scripts/run-agents.sh
#!/bin/bash
# Orquestador que ejecuta múltiples agentes
set -e
AGENTS_DIR="scripts/agents"
echo "🤖 Agent Orchestrator"
echo "===================="
echo ""
# Función para ejecutar agente
run_agent() {
local agent=$1
local agent_path="$AGENTS_DIR/$agent"
if [ ! -f "$agent_path" ]; then
echo "❌ Agente no encontrado: $agent"
return 1
fi
echo "▶ Ejecutando: $agent"
echo "─────────────────────────────────────"
if bash "$agent_path"; then
echo "✓ $agent completado"
else
echo "✗ $agent falló"
return 1
fi
echo ""
}
# Mostrar menú si no hay argumentos
if [ $# -eq 0 ]; then
echo "Agentes disponibles:"
ls -1 "$AGENTS_DIR"/*.sh | xargs -n 1 basename | sed 's/^/ - /'
echo ""
echo "Uso:"
echo " $0 <agente> - Ejecuta un agente"
echo " $0 all - Ejecuta todos los agentes"
echo ""
exit 0
fi
# Ejecutar agente específico o todos
if [ "$1" = "all" ]; then
for agent_file in "$AGENTS_DIR"/*.sh; do
agent=$(basename "$agent_file")
run_agent "$agent" || true # Continúa aunque falle
done
else
run_agent "$1"
fi
echo "✅ Orquestación completada"Uso:
# Ejecutar un agente específico
./scripts/run-agents.sh documentation-agent.sh
# Ejecutar todos los agentes
./scripts/run-agents.sh all
# En CI/CD (ejecutar diariamente)
# Añadir a .github/workflows/nightly.ymlPaso 5: Integración completa
5.1 Workflow completo de PR
Combina todos los checks en un workflow maestro.
Archivo: .github/workflows/pr-checks.yml
name: PR Checks
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
# Job 1: Linting & Tests
lint-and-test:
name: Lint & Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npm test
# Job 2: AI Code Review
ai-review:
name: AI Code Review
needs: lint-and-test # Solo si pasan lint y tests
uses: ./.github/workflows/ai-review.yml
secrets: inherit
# Job 3: Breaking Changes
breaking-changes:
name: Breaking Changes Detection
needs: lint-and-test
uses: ./.github/workflows/breaking-changes.yml
secrets: inherit
# Job 4: Security Scan (opcional)
security:
name: Security Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm audit --production
# Status check final
all-checks-passed:
name: All Checks Passed
runs-on: ubuntu-latest
needs: [lint-and-test, ai-review, breaking-changes, security]
if: always()
steps:
- name: Check if all jobs succeeded
run: |
if [ "${{ needs.lint-and-test.result }}" != "success" ] || \
[ "${{ needs.ai-review.result }}" != "success" ] || \
[ "${{ needs.breaking-changes.result }}" != "success" ] || \
[ "${{ needs.security.result }}" != "success" ]; then
echo "❌ Algunos checks fallaron"
exit 1
fi
echo "✅ Todos los checks pasaron"5.2 Configuración de branch protection
Configura reglas en GitHub para hacer obligatorios los checks:
- Settings → Branches → Add rule
- Branch name pattern:
main - Activa:
- ✅ Require status checks to pass before merging
- ✅ Require branches to be up to date before merging
- ✅ Select:
All Checks Passed - ✅ Require pull request reviews
- ✅ Dismiss stale reviews
Paso 6: Documentación del pipeline
6.1 Guía de uso para el equipo
Archivo: docs/ci-cd-guide.md
# Guía de CI/CD con Claude Code
## Overview
Nuestro pipeline automatiza code review, testing y deployment usando Claude Code.
## Workflows automáticos
### En cada Pull Request
Cuando creas o actualizas un PR, se ejecutan automáticamente:
1. **Lint & Tests** - Verifica calidad de código
2. **AI Code Review** - Claude analiza cambios y comenta en el PR
3. **Breaking Changes** - Detecta cambios que rompen compatibilidad
4. **Security Scan** - Auditoría de vulnerabilidades
**Tiempo estimado:** 3-5 minutos
### Después de merge a main
Cuando se hace merge:
1. **Changelog** - Se actualiza automáticamente
2. **Documentation** - Se regeneran docs de API
3. **Deploy** - (si está configurado)
## Cómo usar
### Crear un PR
```bash
git checkout -b feature/my-feature
# ... hacer cambios ...
git commit -m "feat: add new feature"
git push origin feature/my-feature
# Crear PR en GitHubEl bot comentará con:
- Code review detallado
- Issues encontrados (P1, P2, P3)
- Sugerencias de mejora
- Breaking changes (si hay)
Responder al review
Si Claude encuentra issues:
- P1 (Críticos): DEBE corregirse antes de merge
- P2 (Altos): Fuertemente recomendado corregir
- P3 (Medios): Opcional, puede hacerse en PR futuro
Para corregir:
# Hacer los cambios sugeridos
git add .
git commit -m "fix: address review comments"
git push
# El bot actualizará el review automáticamenteBreaking Changes
Si tu PR introduce breaking changes:
- El bot añadirá label
breaking-change - Debes actualizar el título del PR:
BREAKING: descripción - Añade sección "Migration Guide" en la descripción del PR
Ejemplo:
## Migration Guide
### Before
\`\`\`typescript
const user = await getUser(id);
\`\`\`
### After
\`\`\`typescript
const user = await userService.findById(id);
\`\`\`Troubleshooting
"AI Review falló"
Verifica:
- API key configurada correctamente
- No hay archivos binarios grandes en el PR
- El diff no es demasiado grande (>1000 líneas)
Solución: Divide el PR en varios más pequeños
"Breaking Changes detection falló"
Puede ser falso positivo. Revisa manualmente y si es seguro:
- Añade
BREAKING:al título del PR para confirmar - O añade label
breaking-change-approved
"Tests pasan localmente pero fallan en CI"
Causas comunes:
- Variables de entorno faltantes
- Diferencias de versión (Node, deps)
- Tests dependientes de tiempo/zona horaria
Debug:
# Ejecutar tests como en CI
npm ci # En lugar de npm install
npm testConfiguración avanzada
Deshabilitar review en archivos específicos
Edita .github/workflows/ai-review.yml:
# Excluir ciertos archivos del review
- name: Filter files
run: |
echo "${{ steps.changed-files.outputs.files }}" | \
grep -v "package-lock.json" | \
grep -v ".svg$" > /tmp/files-to-review.txtAjustar severidad de issues
El prompt del review puede customizarse en el workflow. Contacta al equipo de DevOps para cambios.
FAQ
P: ¿El bot reemplaza code review humano? R: No. Es una primera pasada. El review humano sigue siendo necesario.
P: ¿Puedo hacer bypass de los checks? R: Solo con permisos de admin y en casos excepcionales.
P: ¿El bot tiene acceso a secrets? R: No. El bot solo ve código y no puede acceder a secrets del repo.
P: ¿Cuánto cuesta ejecutar el bot? R: ~$0.01-0.05 por PR, dependiendo del tamaño.
Contacto
Problemas con el pipeline: #devops-support
Sugerencias de mejora: Crear issue con label ci-cd
---
## Entregables finales
Tu proyecto debe incluir:
proyecto/ ├── .github/ │ └── workflows/ │ ├── ai-review.yml ← Code review automático │ ├── breaking-changes.yml ← Detección de breaking changes │ ├── changelog.yml ← Generación de changelog │ └── pr-checks.yml ← Workflow maestro ├── scripts/ │ ├── setup-claude.sh ← Setup para Linux/macOS │ ├── setup-claude.ps1 ← Setup para Windows │ ├── run-agents.sh ← Orquestador de agentes │ ├── agents/ │ │ ├── documentation-agent.sh ← Generación de docs │ │ ├── test-agent.sh ← Generación de tests │ │ └── migration-agent.sh ← Migración de código │ └── README.md ← Documentación de scripts ├── docs/ │ ├── ci-cd-guide.md ← Guía de uso del pipeline │ ├── setup-guide.md ← Guía de setup inicial │ └── troubleshooting.md ← Solución de problemas └── README.md ← Mencionar el pipeline
---
## Criterios de evaluación
Tu proyecto se evaluará sobre **100 puntos**:
### Script de Setup (20 puntos)
- **Reproducible (10 pts)**: Funciona en múltiples sistemas
- **Manejo de errores (5 pts)**: Valida cada paso, mensajes claros
- **Documentado (5 pts)**: README claro con troubleshooting
### Pipeline de CI/CD (35 puntos)
- **Code review funcional (15 pts)**: Comenta en PRs con análisis útil
- **Changelog automático (10 pts)**: Genera changelog correcto
- **Breaking changes detection (10 pts)**: Detecta cambios correctamente
### Sistema de Agentes (30 puntos)
- **3 agentes funcionales (20 pts)**: Ejecutan sin errores
- **Casos de uso reales (10 pts)**: Resuelven problemas del proyecto
### Documentación (15 puntos)
- **Arquitectura clara (5 pts)**: Diagrama y explicación del pipeline
- **Guía de uso (5 pts)**: Instrucciones para el equipo
- **Troubleshooting (5 pts)**: Problemas comunes y soluciones
**Rúbrica detallada en: 11.4-evaluacion.md**
---
## Recursos
### Templates
- setup.sh.template
- ai-review.yml.template
- Agent templates
### Ejemplos completos
- Pipeline React App
### Documentación
- [GitHub Actions Docs](https://docs.github.com/en/actions)
- [Claude Code CI/CD Guide](https://code.claude.com/docs/en/guides/ci-cd)
---
## Próximos pasos
1. ✅ Analiza tu proyecto y workflow
2. ✅ Crea script de setup
3. ✅ Implementa workflow de AI review
4. ✅ Añade detección de breaking changes
5. ✅ Configura changelog automático
6. ✅ Desarrolla 3 agentes especializados
7. ✅ Documenta todo
8. ✅ Prueba el pipeline completo
9. ✅ Entrega el proyecto
**¡Mucha suerte! 🚀**
---
## Navegación
- ← Volver a Introducción
- ← Ver Opción A: Configuración completa
- Ver Opción C: Agente personalizado →
- Evaluación y entrega →
---
# 11.3 Opción C: Agente personalizado
## Visión general
En esta opción desarrollarás un **agente especializado** usando el Claude Code SDK que resuelve un problema específico de forma autónoma y puede ser distribuido como herramienta reutilizable.
**Al finalizar tendrás:**
- ✅ Agente funcional con lógica especializada
- ✅ Tests con >70% de cobertura
- ✅ Documentación completa (README, API, ejemplos)
- ✅ Package publicable (npm, binario, o Docker)
- ✅ Proyecto open source listo para compartir
---
## Prerequisitos
Antes de empezar esta opción, asegúrate de tener:
- [ ] Conocimientos sólidos de JavaScript/TypeScript
- [ ] Experiencia con Node.js y npm/yarn
- [ ] Familiaridad con testing (Jest, Vitest, Mocha, etc.)
- [ ] Comprensión de programación orientada a objetos
- [ ] Git y GitHub para publicación
- [ ] (Opcional) Experiencia publicando paquetes npm
**Nivel recomendado:** Intermedio-Avanzado
---
## Paso 1: Ideación y planificación
### 1.1 Identifica un problema a resolver
Un buen agente resuelve un problema específico que:
- Es repetitivo y tedioso hacer manualmente
- Requiere consistencia en la ejecución
- Puede beneficiar a otros desarrolladores
- Es automatizable con IA
#### Categorías de agentes populares
**1. Migración de código**
- JavaScript → TypeScript
- CommonJS → ESM
- Class components → Functional components
- REST → GraphQL
**2. Generación de código**
- Tests automáticos avanzados
- Documentación completa de APIs
- Schemas de validación (Zod, Yup)
- Mocks y fixtures
**3. Análisis y auditoría**
- Security vulnerabilities
- Performance bottlenecks
- Accessibility issues
- Best practices compliance
**4. Refactoring**
- Extract patterns (hooks, utilities)
- Apply design patterns
- Optimize imports
- Remove dead code
**5. Mantenimiento**
- Update dependencies
- Fix deprecated APIs
- Normalize code style
- Generate changelogs
---
### 1.2 Valida tu idea
Antes de comenzar, responde:
**Pregunta 1: ¿Es automatizable?**
- ✅ Sí: Tiene reglas claras y patrones identificables
- ❌ No: Requiere demasiado contexto humano o juicio creativo
**Pregunta 2: ¿Ya existe una solución?**
- Busca en npm, GitHub, Claude Code community
- Si existe pero no es exactamente lo que necesitas: ✅ Puedes mejorarla
- Si no existe: ✅ Hay demanda potencial
**Pregunta 3: ¿Tiene valor reutilizable?**
- ✅ Otros desarrolladores tendrían el mismo problema
- ❌ Es demasiado específico de tu proyecto
**Pregunta 4: ¿Es manejable en scope?**
- ✅ Puedes construir MVP en 16-20 horas
- ❌ Requiere meses de desarrollo
---
### 1.3 Ejemplos de ideas validadas
#### Ejemplo 1: TypeScript Migration Agent ⭐
**Problema:**
Migrar proyectos grandes de JavaScript a TypeScript es tedioso y propenso a errores.
**Solución:**
Agente que:
1. Analiza código JavaScript
2. Infiere tipos basándose en uso
3. Convierte a TypeScript
4. Añade interfaces y tipos
5. Valida con tsc
**Valor:** Miles de proyectos necesitan migrar a TypeScript
---
#### Ejemplo 2: API Documentation Generator
**Problema:**
Documentar endpoints de API manualmente se desactualiza rápido.
**Solución:**
Agente que:
1. Lee código de routes/controllers
2. Extrae endpoints, parámetros, responses
3. Genera OpenAPI/Swagger spec
4. Crea ejemplos de uso
5. Mantiene sincronizado con código
**Valor:** Todo proyecto con API necesita documentación
---
#### Ejemplo 3: Test Coverage Booster
**Problema:**
Proyectos con baja cobertura de tests necesitan alcanzar >80%.
**Solución:**
Agente que:
1. Identifica archivos con <80% coverage
2. Analiza código no cubierto
3. Genera tests específicos para esas líneas
4. Ejecuta y valida tests
5. Itera hasta alcanzar objetivo
**Valor:** Equipos con deuda técnica en testing
---
#### Ejemplo 4: Security Audit Agent
**Problema:**
Detectar vulnerabilidades requiere conocimiento especializado.
**Solución:**
Agente que:
1. Escanea código buscando patrones inseguros
2. Detecta: SQL injection, XSS, CSRF, secrets expuestos
3. Genera reporte con severidad
4. Propone fixes automáticos
5. Valida que los fixes funcionen
**Valor:** Todos los proyectos necesitan seguridad
---
### 1.4 Define el alcance de tu agente
Usa este template para definir tu agente:
```markdown
# [Nombre del Agente]
## Problema
[Descripción del problema en 2-3 líneas]
## Solución
[Qué hace el agente en 2-3 líneas]
## Características principales
1. [Feature 1]
2. [Feature 2]
3. [Feature 3]
4. [Feature 4]
5. [Feature 5]
## No incluido (fuera de scope)
- [Cosa que NO hará el agente]
- [Otra cosa que NO hará]
## Tecnologías
- Lenguaje: TypeScript
- Runtime: Node.js 18+
- Testing: Vitest
- CLI: Commander.js
- SDK: Claude Code SDK
## Usuarios objetivo
[Quién usará esto]
## Métricas de éxito
- [Cómo medir que funciona bien]
## MVP (Minimum Viable Product)
[Qué debe funcionar en la v1.0]Ejercicio: Crea este documento para tu idea antes de continuar.
Paso 2: Setup del proyecto
2.1 Estructura del proyecto
my-agent/
├── src/
│ ├── index.ts # Entry point
│ ├── cli.ts # CLI interface
│ ├── agent.ts # Core agent logic
│ ├── analyzer.ts # Code analysis
│ ├── transformer.ts # Code transformation
│ ├── validator.ts # Validation logic
│ └── utils/
│ ├── logger.ts # Logging utilities
│ ├── fileSystem.ts # File operations
│ └── config.ts # Configuration
├── tests/
│ ├── unit/
│ │ ├── agent.test.ts
│ │ ├── analyzer.test.ts
│ │ └── transformer.test.ts
│ ├── integration/
│ │ └── e2e.test.ts
│ └── fixtures/
│ └── sample-code/ # Test files
├── examples/
│ └── basic-usage.md # Usage examples
├── docs/
│ ├── api.md # API documentation
│ └── development.md # Development guide
├── .github/
│ └── workflows/
│ └── ci.yml # CI/CD
├── package.json
├── tsconfig.json
├── vitest.config.ts
├── README.md
├── LICENSE
└── CHANGELOG.md2.2 Inicializar proyecto
# Crear directorio
mkdir my-agent
cd my-agent
# Inicializar npm
npm init -y
# Configurar TypeScript
npm install --save-dev typescript @types/node
npx tsc --init
# Instalar dependencias de desarrollo
npm install --save-dev \
vitest \
@vitest/coverage-v8 \
@types/jest \
eslint \
prettier
# Instalar dependencias de producción
npm install \
commander \
chalk \
ora \
@anthropic-ai/sdk
# Crear estructura
mkdir -p src/{utils} tests/{unit,integration,fixtures} examples docs .github/workflows2.3 Configurar TypeScript
Archivo: tsconfig.json
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"lib": ["ES2022"],
"moduleResolution": "node",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"declaration": true,
"declarationMap": true,
"sourceMap": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "tests"]
}2.4 Configurar Vitest
Archivo: vitest.config.ts
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
globals: true,
environment: 'node',
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html'],
exclude: [
'node_modules/',
'dist/',
'tests/',
'**/*.test.ts',
'**/*.config.ts',
],
lines: 70,
functions: 70,
branches: 70,
statements: 70,
},
},
});2.5 Configurar package.json
Archivo: package.json
{
"name": "@yourname/my-agent",
"version": "0.1.0",
"description": "Claude Code agent for [your use case]",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
"bin": {
"my-agent": "./dist/cli.js"
},
"scripts": {
"build": "tsc",
"dev": "tsc --watch",
"test": "vitest run",
"test:watch": "vitest",
"test:coverage": "vitest run --coverage",
"lint": "eslint src/**/*.ts",
"format": "prettier --write src/**/*.ts",
"prepublishOnly": "npm run build && npm test"
},
"keywords": [
"claude-code",
"ai",
"automation",
"your-keywords"
],
"author": "Your Name",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/yourname/my-agent"
},
"engines": {
"node": ">=18.0.0"
},
"files": [
"dist",
"README.md",
"LICENSE"
]
}Paso 3: Implementar el agente
3.1 Core Agent (ejemplo: TypeScript Migration Agent)
Archivo: src/agent.ts
import Anthropic from '@anthropic-ai/sdk';
import { Logger } from './utils/logger';
import { FileSystem } from './utils/fileSystem';
import { Analyzer } from './analyzer';
import { Transformer } from './transformer';
import { Validator } from './validator';
export interface IAgentConfig {
apiKey: string;
model?: string;
maxTokens?: number;
verbose?: boolean;
}
export interface IAgentResult {
success: boolean;
filesProcessed: number;
errors: string[];
summary: string;
}
export class TypeScriptMigrationAgent {
private client: Anthropic;
private logger: Logger;
private fs: FileSystem;
private analyzer: Analyzer;
private transformer: Transformer;
private validator: Validator;
constructor(private config: IAgentConfig) {
this.client = new Anthropic({
apiKey: config.apiKey,
});
this.logger = new Logger(config.verbose || false);
this.fs = new FileSystem();
this.analyzer = new Analyzer();
this.transformer = new Transformer(this.client, config.model);
this.validator = new Validator();
}
/**
* Ejecuta la migración de JavaScript a TypeScript
* @param targetPath - Ruta del proyecto a migrar
* @returns Resultado de la migración
*/
async migrate(targetPath: string): Promise<IAgentResult> {
this.logger.info(`Iniciando migración de: ${targetPath}`);
const result: IAgentResult = {
success: true,
filesProcessed: 0,
errors: [],
summary: '',
};
try {
// Paso 1: Analizar proyecto
this.logger.step('Analizando proyecto...');
const jsFiles = await this.analyzer.findJavaScriptFiles(targetPath);
this.logger.info(`Encontrados ${jsFiles.length} archivos JavaScript`);
if (jsFiles.length === 0) {
result.summary = 'No se encontraron archivos JavaScript para migrar';
return result;
}
// Paso 2: Crear tsconfig.json si no existe
if (!await this.fs.exists(`${targetPath}/tsconfig.json`)) {
this.logger.step('Creando tsconfig.json...');
await this.fs.createTsConfig(targetPath);
}
// Paso 3: Migrar cada archivo
this.logger.step(`Migrando ${jsFiles.length} archivos...`);
for (const file of jsFiles) {
try {
await this.migrateFile(file);
result.filesProcessed++;
this.logger.success(`✓ ${file}`);
} catch (error) {
const errorMsg = `✗ ${file}: ${error.message}`;
result.errors.push(errorMsg);
this.logger.error(errorMsg);
}
}
// Paso 4: Validar con TypeScript compiler
this.logger.step('Validando con TypeScript compiler...');
const validationResult = await this.validator.validateProject(targetPath);
if (!validationResult.success) {
result.success = false;
result.errors.push(...validationResult.errors);
}
// Paso 5: Generar resumen
result.summary = this.generateSummary(result);
return result;
} catch (error) {
result.success = false;
result.errors.push(`Error fatal: ${error.message}`);
result.summary = 'La migración falló';
return result;
}
}
/**
* Migra un archivo individual de JS a TS
*/
private async migrateFile(filePath: string): Promise<void> {
// Leer archivo JavaScript
const jsCode = await this.fs.readFile(filePath);
// Analizar dependencias y tipos usados
const analysis = this.analyzer.analyzeCode(jsCode);
// Transformar a TypeScript usando Claude
const tsCode = await this.transformer.transformToTypeScript(
jsCode,
analysis
);
// Guardar como .ts
const tsPath = filePath.replace(/\.js$/, '.ts');
await this.fs.writeFile(tsPath, tsCode);
// Eliminar archivo .js original
await this.fs.deleteFile(filePath);
}
/**
* Genera resumen del resultado
*/
private generateSummary(result: IAgentResult): string {
const total = result.filesProcessed + result.errors.length;
const successRate = ((result.filesProcessed / total) * 100).toFixed(1);
return `
Migración completada:
- Archivos procesados: ${result.filesProcessed}/${total} (${successRate}%)
- Errores: ${result.errors.length}
- Estado: ${result.success ? '✅ Exitoso' : '❌ Falló'}
`.trim();
}
}3.2 Transformer (usa Claude para conversión)
Archivo: src/transformer.ts
import Anthropic from '@anthropic-ai/sdk';
import type { ICodeAnalysis } from './analyzer';
export class Transformer {
constructor(
private client: Anthropic,
private model: string = 'claude-sonnet-4-20250514'
) {}
/**
* Transforma código JavaScript a TypeScript
*/
async transformToTypeScript(
jsCode: string,
analysis: ICodeAnalysis
): Promise<string> {
const prompt = this.buildPrompt(jsCode, analysis);
const message = await this.client.messages.create({
model: this.model,
max_tokens: 4096,
messages: [
{
role: 'user',
content: prompt,
},
],
});
// Extraer código del response
const tsCode = this.extractCode(message.content);
return tsCode;
}
/**
* Construye el prompt para Claude
*/
private buildPrompt(jsCode: string, analysis: ICodeAnalysis): string {
return `
Convierte el siguiente código JavaScript a TypeScript.
Análisis del código:
- Funciones exportadas: ${analysis.exports.join(', ')}
- Dependencias: ${analysis.imports.join(', ')}
- Usa clases: ${analysis.usesClasses ? 'Sí' : 'No'}
- Usa async/await: ${analysis.usesAsync ? 'Sí' : 'No'}
Reglas:
1. Infiere tipos basándote en el uso
2. Añade interfaces para objetos complejos
3. Usa tipos específicos, no 'any'
4. Añade JSDoc a funciones públicas
5. Mantén la lógica exactamente igual
6. Preserva comentarios existentes
Código JavaScript:
\`\`\`javascript
${jsCode}
\`\`\`
Responde SOLO con el código TypeScript, sin explicaciones.
Formato:
\`\`\`typescript
[código aquí]
\`\`\`
`.trim();
}
/**
* Extrae código de la respuesta de Claude
*/
private extractCode(content: any[]): string {
// Buscar bloque de código en la respuesta
const textContent = content.find((c) => c.type === 'text');
if (!textContent) {
throw new Error('No se recibió código en la respuesta');
}
const text = textContent.text;
const match = text.match(/```typescript\n([\s\S]*?)\n```/);
if (!match) {
throw new Error('No se encontró bloque de código TypeScript en la respuesta');
}
return match[1];
}
}3.3 Analyzer
Archivo: src/analyzer.ts
import * as path from 'path';
import { glob } from 'glob';
export interface ICodeAnalysis {
exports: string[];
imports: string[];
usesClasses: boolean;
usesAsync: boolean;
}
export class Analyzer {
/**
* Encuentra todos los archivos JavaScript en un proyecto
*/
async findJavaScriptFiles(targetPath: string): Promise<string[]> {
const pattern = `${targetPath}/**/*.js`;
const files = await glob(pattern, {
ignore: ['**/node_modules/**', '**/dist/**', '**/build/**'],
});
return files;
}
/**
* Analiza código JavaScript para extraer metadata
*/
analyzeCode(code: string): ICodeAnalysis {
return {
exports: this.extractExports(code),
imports: this.extractImports(code),
usesClasses: /\bclass\s+\w+/.test(code),
usesAsync: /\basync\s+function/.test(code) || /\bawait\s+/.test(code),
};
}
/**
* Extrae exports del código
*/
private extractExports(code: string): string[] {
const exports: string[] = [];
// export function foo()
const funcExports = code.match(/export\s+function\s+(\w+)/g);
if (funcExports) {
exports.push(
...funcExports.map((e) => e.replace(/export\s+function\s+/, ''))
);
}
// export class Foo
const classExports = code.match(/export\s+class\s+(\w+)/g);
if (classExports) {
exports.push(
...classExports.map((e) => e.replace(/export\s+class\s+/, ''))
);
}
// export const foo
const constExports = code.match(/export\s+const\s+(\w+)/g);
if (constExports) {
exports.push(
...constExports.map((e) => e.replace(/export\s+const\s+/, ''))
);
}
return exports;
}
/**
* Extrae imports del código
*/
private extractImports(code: string): string[] {
const imports: string[] = [];
// import ... from 'package'
const importMatches = code.match(/import\s+.*\s+from\s+['"](.+)['"]/g);
if (importMatches) {
imports.push(
...importMatches.map((imp) => {
const match = imp.match(/from\s+['"](.+)['"]/);
return match ? match[1] : '';
})
);
}
// require('package')
const requireMatches = code.match(/require\(['"](.+)['"]\)/g);
if (requireMatches) {
imports.push(
...requireMatches.map((req) => {
const match = req.match(/require\(['"](.+)['"]\)/);
return match ? match[1] : '';
})
);
}
return [...new Set(imports)].filter(Boolean);
}
}3.4 CLI Interface
Archivo: src/cli.ts
#!/usr/bin/env node
import { Command } from 'commander';
import chalk from 'chalk';
import ora from 'ora';
import { TypeScriptMigrationAgent } from './agent';
const program = new Command();
program
.name('ts-migration-agent')
.description('Migra proyectos JavaScript a TypeScript usando IA')
.version('0.1.0');
program
.argument('<path>', 'Ruta del proyecto a migrar')
.option('-k, --api-key <key>', 'API key de Anthropic')
.option('-m, --model <model>', 'Modelo de Claude a usar', 'claude-sonnet-4-20250514')
.option('-v, --verbose', 'Output detallado')
.option('--dry-run', 'Simular sin hacer cambios')
.action(async (targetPath, options) => {
// Validar API key
const apiKey = options.apiKey || process.env.ANTHROPIC_API_KEY;
if (!apiKey) {
console.error(chalk.red('Error: API key requerida'));
console.error('Usa --api-key o configura ANTHROPIC_API_KEY');
process.exit(1);
}
// Crear agente
const agent = new TypeScriptMigrationAgent({
apiKey,
model: options.model,
verbose: options.verbose,
});
// Ejecutar migración
const spinner = ora('Migrando proyecto...').start();
try {
const result = await agent.migrate(targetPath);
if (result.success) {
spinner.succeed(chalk.green('Migración completada'));
} else {
spinner.fail(chalk.red('Migración completada con errores'));
}
console.log('\n' + result.summary);
if (result.errors.length > 0) {
console.log(chalk.yellow('\nErrores:'));
result.errors.forEach((err) => console.log(chalk.red(` - ${err}`)));
}
process.exit(result.success ? 0 : 1);
} catch (error) {
spinner.fail(chalk.red('Error fatal'));
console.error(chalk.red(error.message));
process.exit(1);
}
});
program.parse();Paso 4: Testing
4.1 Tests unitarios
Archivo: tests/unit/analyzer.test.ts
import { describe, it, expect } from 'vitest';
import { Analyzer } from '../../src/analyzer';
describe('Analyzer', () => {
const analyzer = new Analyzer();
describe('analyzeCode', () => {
it('should detect exported functions', () => {
const code = `
export function foo() {}
export function bar() {}
`;
const result = analyzer.analyzeCode(code);
expect(result.exports).toContain('foo');
expect(result.exports).toContain('bar');
});
it('should detect exported classes', () => {
const code = `
export class MyClass {}
`;
const result = analyzer.analyzeCode(code);
expect(result.exports).toContain('MyClass');
expect(result.usesClasses).toBe(true);
});
it('should detect async usage', () => {
const code = `
async function fetchData() {
const data = await api.get();
return data;
}
`;
const result = analyzer.analyzeCode(code);
expect(result.usesAsync).toBe(true);
});
it('should extract imports', () => {
const code = `
import express from 'express';
import { Router } from 'express';
const fs = require('fs');
`;
const result = analyzer.analyzeCode(code);
expect(result.imports).toContain('express');
expect(result.imports).toContain('fs');
});
});
});4.2 Tests de integración
Archivo: tests/integration/e2e.test.ts
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import * as fs from 'fs/promises';
import * as path from 'path';
import { TypeScriptMigrationAgent } from '../../src/agent';
describe('TypeScript Migration Agent - E2E', () => {
const testDir = path.join(__dirname, '../fixtures/test-project');
const apiKey = process.env.ANTHROPIC_API_KEY || 'test-key';
beforeAll(async () => {
// Crear proyecto de test
await fs.mkdir(testDir, { recursive: true });
// Crear archivo JavaScript de ejemplo
await fs.writeFile(
path.join(testDir, 'index.js'),
`
function add(a, b) {
return a + b;
}
module.exports = { add };
`.trim()
);
});
afterAll(async () => {
// Limpiar
await fs.rm(testDir, { recursive: true, force: true });
});
it('should migrate JavaScript file to TypeScript', async () => {
const agent = new TypeScriptMigrationAgent({
apiKey,
verbose: false,
});
const result = await agent.migrate(testDir);
// Verificar que se procesó el archivo
expect(result.filesProcessed).toBeGreaterThan(0);
// Verificar que se creó el archivo .ts
const tsFile = path.join(testDir, 'index.ts');
const tsExists = await fs
.access(tsFile)
.then(() => true)
.catch(() => false);
expect(tsExists).toBe(true);
// Verificar que el archivo .js fue eliminado
const jsFile = path.join(testDir, 'index.js');
const jsExists = await fs
.access(jsFile)
.then(() => true)
.catch(() => false);
expect(jsExists).toBe(false);
// Leer y verificar contenido TypeScript
const tsContent = await fs.readFile(tsFile, 'utf-8');
expect(tsContent).toContain('function add');
expect(tsContent).toMatch(/:\s*number/); // Debe tener type annotations
}, 30000); // 30s timeout para llamada a API
});4.3 Fixtures para testing
Archivo: tests/fixtures/sample-code/simple.js
// Fixture para tests
function greet(name) {
return `Hello, ${name}!`;
}
class User {
constructor(name, email) {
this.name = name;
this.email = email;
}
getInfo() {
return `${this.name} (${this.email})`;
}
}
module.exports = { greet, User };4.4 Ejecutar tests
# Tests unitarios
npm test
# Tests con coverage
npm run test:coverage
# Tests en modo watch
npm run test:watchCoverage mínimo requerido: 70%
Paso 5: Documentación
5.1 README completo
Archivo: README.md
# TypeScript Migration Agent
🤖 Agente de IA que migra automáticamente proyectos JavaScript a TypeScript usando Claude.
## Características
- ✅ Conversión automática de JS a TS
- ✅ Inferencia inteligente de tipos
- ✅ Generación de interfaces y tipos
- ✅ Preservación de lógica y comentarios
- ✅ Validación con TypeScript compiler
- ✅ Soporte para CommonJS y ESM
## Instalación
```bash
npm install -g @yourname/ts-migration-agentUso
Básico
# Migrar proyecto
ts-migration-agent ./my-project
# Con API key específica
ts-migration-agent ./my-project --api-key sk-ant-...
# Modo verbose
ts-migration-agent ./my-project --verboseComo librería
import { TypeScriptMigrationAgent } from '@yourname/ts-migration-agent';
const agent = new TypeScriptMigrationAgent({
apiKey: process.env.ANTHROPIC_API_KEY,
verbose: true,
});
const result = await agent.migrate('./my-project');
console.log(result.summary);Configuración
Variables de entorno
export ANTHROPIC_API_KEY="sk-ant-..."Opciones CLI
| Opción | Descripción | Default |
|---|---|---|
-k, --api-key | API key de Anthropic | $ANTHROPIC_API_KEY |
-m, --model | Modelo de Claude | claude-sonnet-4-20250514 |
-v, --verbose | Output detallado | false |
--dry-run | Simular sin cambios | false |
Ejemplos
Migrar proyecto completo
ts-migration-agent ./my-appAntes:
// src/utils/math.js
function add(a, b) {
return a + b;
}
module.exports = { add };Después:
// src/utils/math.ts
export function add(a: number, b: number): number {
return a + b;
}Proyecto con clases
Antes:
class UserService {
constructor(db) {
this.db = db;
}
async getUser(id) {
return this.db.users.findById(id);
}
}Después:
interface IUser {
id: string;
name: string;
email: string;
}
class UserService {
constructor(private db: any) {}
async getUser(id: string): Promise<IUser> {
return this.db.users.findById(id);
}
}Requisitos
- Node.js >= 18
- API key de Anthropic (Claude Pro/Max o API key)
Limitaciones
- Proyectos muy grandes (>10,000 archivos) pueden tardar
- Tipos muy complejos pueden requerir ajuste manual
- No maneja tipos de librerías externas sin @types
Troubleshooting
Error: "API key requerida"
export ANTHROPIC_API_KEY="tu-api-key"Error de validación TypeScript
El agente genera código válido, pero puede necesitar ajustes en:
- Configuración de
tsconfig.json - Instalación de
@types/*packages
Tests fallan después de migración
Normal. Los tests también necesitan migrarse a TypeScript.
Desarrollo
# Clonar
git clone https://github.com/yourname/ts-migration-agent
cd ts-migration-agent
# Instalar
npm install
# Desarrollo
npm run dev
# Tests
npm test
npm run test:coverage
# Build
npm run buildContribuir
Contribuciones bienvenidas. Ver CONTRIBUTING.md.
License
MIT © [Your Name]
Créditos
Construido con:
---
### 5.2 Documentación de API
**Archivo:** `docs/api.md`
```markdown
# API Documentation
## TypeScriptMigrationAgent
Clase principal del agente.
### Constructor
```typescript
constructor(config: IAgentConfig)Parámetros:
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
| config.apiKey | string | ✅ | API key de Anthropic |
| config.model | string | ❌ | Modelo de Claude (default: sonnet-4) |
| config.maxTokens | number | ❌ | Max tokens por request (default: 4096) |
| config.verbose | boolean | ❌ | Logging detallado (default: false) |
Ejemplo:
const agent = new TypeScriptMigrationAgent({
apiKey: 'sk-ant-...',
model: 'claude-sonnet-4-20250514',
verbose: true,
});migrate()
Ejecuta la migración de un proyecto.
async migrate(targetPath: string): Promise<IAgentResult>Parámetros:
| Nombre | Tipo | Descripción |
|---|---|---|
| targetPath | string | Ruta absoluta o relativa al proyecto |
Returns:
interface IAgentResult {
success: boolean; // Si la migración fue exitosa
filesProcessed: number; // Archivos convertidos
errors: string[]; // Errores encontrados
summary: string; // Resumen en texto
}Ejemplo:
const result = await agent.migrate('./my-project');
if (result.success) {
console.log('✅ Migración exitosa');
console.log(`Archivos procesados: ${result.filesProcessed}`);
} else {
console.error('❌ Migración falló');
result.errors.forEach(err => console.error(err));
}Throws:
Errorsi la ruta no existeErrorsi no hay permisos de escrituraErrorsi la API key es inválida
Analyzer
Analiza código JavaScript.
findJavaScriptFiles()
async findJavaScriptFiles(targetPath: string): Promise<string[]>Encuentra todos los archivos .js en un directorio, excluyendo node_modules.
analyzeCode()
analyzeCode(code: string): ICodeAnalysisAnaliza código y extrae metadata.
Returns:
interface ICodeAnalysis {
exports: string[]; // Funciones/clases exportadas
imports: string[]; // Dependencias importadas
usesClasses: boolean; // Si usa clases
usesAsync: boolean; // Si usa async/await
}Transformer
Transforma código JS a TS usando Claude.
transformToTypeScript()
async transformToTypeScript(
jsCode: string,
analysis: ICodeAnalysis
): Promise<string>Convierte código JavaScript a TypeScript.
Ejemplo:
const transformer = new Transformer(client, 'claude-sonnet-4-20250514');
const tsCode = await transformer.transformToTypeScript(jsCode, analysis);Validator
Valida código TypeScript.
validateProject()
async validateProject(targetPath: string): Promise<IValidationResult>Ejecuta tsc --noEmit para validar el proyecto.
Returns:
interface IValidationResult {
success: boolean;
errors: string[];
}
---
## Paso 6: Distribución
### 6.1 Preparar para publicación
**Checklist:**
- [ ] Tests pasan con >70% coverage
- [ ] README completo
- [ ] LICENSE file
- [ ] CHANGELOG.md
- [ ] .npmignore configurado
- [ ] Version en package.json
- [ ] Repository URL en package.json
---
### 6.2 Opción 1: Publicar en npm
```bash
# 1. Login en npm
npm login
# 2. Verificar que todo está bien
npm run prepublishOnly
# 3. Publicar
npm publish --access public
# Si es scoped package (@yourname/package)
npm publish --access publicVersioning:
# Patch (0.1.0 → 0.1.1)
npm version patch
# Minor (0.1.0 → 0.2.0)
npm version minor
# Major (0.1.0 → 1.0.0)
npm version major6.3 Opción 2: Binario standalone
Usa pkg para crear ejecutables:
npm install -g pkg
# Build binarios para todas las plataformas
pkg . --targets node18-linux-x64,node18-macos-x64,node18-win-x64
# Resultado:
# - ts-migration-agent-linux
# - ts-migration-agent-macos
# - ts-migration-agent-win.exe6.4 Opción 3: Docker image
Archivo: Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY dist ./dist
ENTRYPOINT ["node", "dist/cli.js"]Build y push:
docker build -t yourname/ts-migration-agent:latest .
docker push yourname/ts-migration-agent:latestUso:
docker run -v $(pwd):/project yourname/ts-migration-agent /project6.5 GitHub Release
Archivo: .github/workflows/release.yml
name: Release
on:
push:
tags:
- 'v*'
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'
- run: npm ci
- run: npm test
- run: npm run build
- name: Publish to npm
run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Create GitHub Release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: falsePaso 7: Promoción y mantenimiento
7.1 README badges
Añade badges al README:
[](https://www.npmjs.com/package/@yourname/ts-migration-agent)
[](https://github.com/yourname/ts-migration-agent/actions)
[](https://codecov.io/gh/yourname/ts-migration-agent)
[](https://opensource.org/licenses/MIT)7.2 Promoción
Dónde compartir:
-
Reddit
- r/typescript
- r/javascript
- r/programming
-
Twitter/X
- Tweet con demo
- Tag @AnthropicAI
-
Dev.to
- Artículo explicando cómo lo construiste
-
Hacker News
- Show HN: [nombre del proyecto]
-
Claude Community
- Foro oficial de Claude Code
7.3 Mantenimiento
Checklist mensual:
- Actualizar dependencias
- Revisar y responder issues
- Merge PRs de contribuidores
- Actualizar CHANGELOG
- Publicar nueva version si hay cambios
Entregables finales
Tu proyecto debe incluir:
ts-migration-agent/
├── src/
│ ├── index.ts
│ ├── cli.ts
│ ├── agent.ts
│ ├── analyzer.ts
│ ├── transformer.ts
│ ├── validator.ts
│ └── utils/
├── tests/
│ ├── unit/
│ ├── integration/
│ └── fixtures/
├── docs/
│ ├── api.md
│ └── development.md
├── examples/
│ └── basic-usage.md
├── .github/
│ └── workflows/
│ ├── ci.yml
│ └── release.yml
├── README.md ← Completo con ejemplos
├── CHANGELOG.md ← Historial de versiones
├── LICENSE ← MIT o similar
├── package.json
├── tsconfig.json
├── vitest.config.ts
└── .npmignoreCriterios de evaluación
Tu proyecto se evaluará sobre 100 puntos:
Código del agente (40 puntos)
- Funcionalidad core (20 pts): Resuelve el problema planteado
- Arquitectura limpia (10 pts): Separación de responsabilidades, SOLID
- Manejo de errores (5 pts): Try/catch, validaciones, mensajes claros
- Código limpio (5 pts): TypeScript estricto, sin any, bien documentado
Tests (25 puntos)
- Coverage >70% (15 pts): Tests unitarios e integración
- Tests significativos (10 pts): Casos de uso reales, no triviales
Documentación (25 puntos)
- README completo (10 pts): Instalación, uso, ejemplos, troubleshooting
- API docs (10 pts): Todas las clases y métodos públicos documentados
- Ejemplos funcionales (5 pts): Al menos 3 ejemplos de uso
Distribución (10 puntos)
- Publicable (5 pts): Package.json correcto, build funciona
- CI/CD (5 pts): Tests automáticos, release workflow
Rúbrica detallada en: 11.4-evaluacion.md
Recursos
Templates
- Agent template completo
- Test templates
- GitHub workflows
Ejemplos completos
- TypeScript Migration Agent
Documentación
Próximos pasos
- ✅ Valida tu idea de agente
- ✅ Inicializa el proyecto
- ✅ Implementa el core del agente
- ✅ Escribe tests (>70% coverage)
- ✅ Documenta completamente
- ✅ Prepara para distribución
- ✅ Publica y promociona
- ✅ Entrega el proyecto
¡Mucha suerte! Este es el proyecto más desafiante pero también el más gratificante. 🚀
Navegación
- ← Volver a Introducción
- ← Ver Opción A: Configuración completa
- ← Ver Opción B: Pipeline automatizado
- Evaluación y entrega →