11Modulo 11

Proyecto Final

60 min

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

CriterioOpción AOpción BOpción C
ComplejidadMediaAltaMuy Alta
Conocimientos previosClaude Code básicoCI/CD + Claude CodeNode.js + Claude Code
Tiempo estimado8-12h12-16h16-20h
EnfoqueConfiguraciónAutomatizaciónDesarrollo
ResultadoSetup listo para usarPipeline completoHerramienta distribuible
AplicabilidadInmediataEquipos/proyectosReutilizable
Creatividad requeridaMediaAltaMuy 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:

  1. Analizar tu situación actual
  2. Diseñar la solución ideal
  3. Planificar la implementación paso a paso
  4. 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:

  1. Repositorio (GitHub, GitLab u otro)

    • Código completo
    • Documentación
    • Ejemplos de uso
  2. README principal con:

    • Descripción del proyecto
    • Instrucciones de instalación/uso
    • Enlaces a documentación adicional
    • Screenshots o demos (si aplica)
  3. Video demo (opcional pero muy recomendado)

    • 3-5 minutos mostrando el proyecto funcionando
    • Explicación de componentes clave
    • Demostración de uso real
  4. Reflexión personal (breve documento)

    • Qué aprendiste
    • Desafíos enfrentados
    • Próximos pasos o mejoras futuras

Próximos pasos

  1. Lee cuidadosamente las guías de las tres opciones
  2. Elige la opción que mejor se adapte a ti
  3. Revisa los templates y ejemplos
  4. Planifica tu proyecto
  5. 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 Winston

Ejemplo 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íticas

Convenciones de código

Ejemplo TypeScript/JavaScript:

## Convenciones de código
 
### Naming conventions
 
1. **Variables y funciones**: camelCase
   ```typescript
   const userProfile = { ... }
   function calculateTotal() { ... }
  1. Clases e Interfaces: PascalCase

    class UserService { ... }
    interface IUserRepository { ... }
    type TAuthToken = string;
  2. Constantes: UPPER_SNAKE_CASE

    const MAX_RETRY_ATTEMPTS = 3;
    const API_BASE_URL = process.env.API_URL;
  3. Archivos

    • Componentes: PascalCase (UserProfile.tsx)
    • Utilidades: camelCase (formatDate.ts)
    • Tipos: camelCase con .types.ts (user.types.ts)

Reglas de TypeScript

  • ❌ NUNCA usar any, usar unknown si es necesario
  • ✅ Siempre tipar returns de funciones explícitamente
  • ✅ Preferir interface sobre type para objetos
  • ✅ Usar Readonly para 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 describe para 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(): ...
  1. Clases: PascalCase

    class UserService:
        pass
  2. 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/ refleja src/)
 
---
 
#### 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+ lugares

Ejemplo 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 seeds

Linting 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 TypeScript

Build y deploy

npm run build             # Build de producción
npm run start             # Inicia servidor en modo producción
npm run docker:up         # Levanta contenedor local

Pre-commit

npm run pre-commit        # Ejecuta: lint, type-check, test

IMPORTANTE: 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 tests

5. 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 yarn

Python:

"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.md

4.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
    """
    pass

Qué 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

  1. Schema en app/schemas/
  2. Route en app/routes/
  3. Service en app/services/
  4. 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
  1. 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
  2. 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

ComandoDescripciónUso
/commitGenera mensaje de commit/commit
/testGenera tests para archivo/test src/services/user.ts
/reviewCode review/review src/controllers/task.ts
/docAñade documentación/doc src/utils/validation.ts
/componentGenera 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
> /commit

2. Bug fix

claude
 
> Analiza el error: [pega stack trace]
> Propón solución
> Implementa la solución
> /test [archivo modificado]
> /commit

3. Refactor

claude
 
> /review src/services/oldService.ts
> Refactoriza oldService.ts aplicando las sugerencias
> /test src/services/oldService.ts
> /commit

Permisos configurados

✅ Permitido

  • Leer cualquier archivo del proyecto
  • Escribir/editar archivos de código
  • Ejecutar: git, npm, npx, node
  • Ejecutar tests

❌ Denegado

  • Modificar .env files
  • Modificar package.json directamente
  • 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:

  1. Prettier - Formateo de código
  2. ESLint - Linting (con auto-fix)
  3. 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 opus

Sesiones enfocadas

  • Una tarea principal por sesión
  • Usa /compact cada 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.ts

Troubleshooting

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 hooks

Claude 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-permissions

Recursos

Mantenimiento

Actualizar configuración

Cuando el proyecto evolucione, actualiza:

  1. .claude/CLAUDE.md - Si cambia arquitectura o convenciones
  2. .claude/settings.json - Si necesitas nuevos permisos o hooks
  3. 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-code

2. Autenticar

claude login
# Sigue las instrucciones en el navegador

3. Primer uso

cd /ruta/a/este/proyecto
claude

Te 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 DB

Implementar feature

> Necesito añadir paginación al endpoint GET /tasks
> [Claude propone cambios]
> Implementa la solución
> /test src/controllers/taskController.ts
> /review staged
> /commit

Debugging

> Este es el error que estoy teniendo: [pega stack trace]
> [Claude analiza y propone causa]
> ¿Cómo lo arreglo?
> [Claude propone solución]
> Impleméntalo

Code review

# Antes de hacer commit
> /review staged
 
# O de un archivo específico
> /review src/services/paymentService.ts

Comandos ú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 /compact en 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

  1. ✅ Instala Claude Code
  2. ✅ Lee este documento
  3. ✅ Lee .claude/CLAUDE.md del proyecto
  4. ✅ Prueba con una tarea pequeña (ej: añadir log, fix typo)
  5. ✅ 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 proyecto

Validar:

  • 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.ts

Validar:

  • 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 .env

Validar:

  • 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
> /commit

Validar:

  • 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 Code

Criterios 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

  1. ✅ Analiza tu proyecto
  2. ✅ Crea CLAUDE.md
  3. ✅ Configura settings.json
  4. ✅ Desarrolla 5 skills
  5. ✅ Escribe documentación
  6. ✅ Prueba y valida
  7. ✅ 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
                   └── Deploy

Paso 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.ps1

2.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.sh

Windows:

.\scripts\setup-claude.ps1

Qué hace el script

  1. ✓ Verifica Node.js
  2. ✓ Instala/actualiza Claude Code
  3. ✓ Configura API key
  4. ✓ Instala dependencias del proyecto
  5. ✓ Verifica configuración de Claude
  6. ✓ Trustea el directorio
  7. ✓ Verifica herramientas de desarrollo
  8. ✓ Configura git hooks (opcional)
  9. ✓ 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 login

Error: "Permisos denegados"

# Linux/macOS
chmod +x scripts/setup-claude.sh
 
# Windows (ejecutar PowerShell como admin)
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Desinstalació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
          fi

Template 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 1

3.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
          fi

Paso 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.yml

Paso 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:

  1. SettingsBranchesAdd rule
  2. Branch name pattern: main
  3. 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 GitHub

El 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:

  1. P1 (Críticos): DEBE corregirse antes de merge
  2. P2 (Altos): Fuertemente recomendado corregir
  3. 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áticamente

Breaking Changes

Si tu PR introduce breaking changes:

  1. El bot añadirá label breaking-change
  2. Debes actualizar el título del PR: BREAKING: descripción
  3. 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 test

Configuració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.txt

Ajustar 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.md

2.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/workflows

2.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:watch

Coverage 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-agent

Uso

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 --verbose

Como 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ónDescripciónDefault
-k, --api-keyAPI key de Anthropic$ANTHROPIC_API_KEY
-m, --modelModelo de Claudeclaude-sonnet-4-20250514
-v, --verboseOutput detalladofalse
--dry-runSimular sin cambiosfalse

Ejemplos

Migrar proyecto completo

ts-migration-agent ./my-app

Antes:

// 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 build

Contribuir

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:

NombreTipoRequeridoDescripción
config.apiKeystringAPI key de Anthropic
config.modelstringModelo de Claude (default: sonnet-4)
config.maxTokensnumberMax tokens por request (default: 4096)
config.verbosebooleanLogging 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:

NombreTipoDescripción
targetPathstringRuta 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:

  • Error si la ruta no existe
  • Error si no hay permisos de escritura
  • Error si 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): ICodeAnalysis

Analiza 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 public

Versioning:

# 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 major

6.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.exe

6.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:latest

Uso:

docker run -v $(pwd):/project yourname/ts-migration-agent /project

6.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: false

Paso 7: Promoción y mantenimiento

7.1 README badges

Añade badges al README:

[![npm version](https://badge.fury.io/js/%40yourname%2Fts-migration-agent.svg)](https://www.npmjs.com/package/@yourname/ts-migration-agent)
[![Tests](https://github.com/yourname/ts-migration-agent/workflows/Tests/badge.svg)](https://github.com/yourname/ts-migration-agent/actions)
[![Coverage](https://codecov.io/gh/yourname/ts-migration-agent/branch/main/graph/badge.svg)](https://codecov.io/gh/yourname/ts-migration-agent)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

7.2 Promoción

Dónde compartir:

  1. Reddit

    • r/typescript
    • r/javascript
    • r/programming
  2. Twitter/X

    • Tweet con demo
    • Tag @AnthropicAI
  3. Dev.to

    • Artículo explicando cómo lo construiste
  4. Hacker News

    • Show HN: [nombre del proyecto]
  5. 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
└── .npmignore

Criterios 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

  1. ✅ Valida tu idea de agente
  2. ✅ Inicializa el proyecto
  3. ✅ Implementa el core del agente
  4. ✅ Escribe tests (>70% coverage)
  5. ✅ Documenta completamente
  6. ✅ Prepara para distribución
  7. ✅ Publica y promociona
  8. ✅ 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 →