Subagentes y Paralelismo
Objetivo
Comprender qué son los subagentes en Claude Code, cuándo usarlos y cómo aprovechan la especialización y separación de contextos para tareas complejas.
Introducción
Cuando trabajas con Claude Code en una conversación interactiva normal, estás interactuando con un agente principal. Este agente mantiene todo el contexto de la conversación: tus instrucciones, los archivos que ha leído, las operaciones que ha realizado, etc.
Pero ¿qué pasa cuando necesitas:
- Delegar una tarea específica sin contaminar el contexto principal?
- Usar un modelo diferente para una subtarea (Opus para arquitectura, Haiku para tareas simples)?
- Especializar el comportamiento de Claude para un tipo de trabajo concreto?
- Ejecutar tareas en paralelo?
Aquí es donde entran los subagentes.
¿Qué es un subagente?
Un subagente es una instancia separada e independiente de Claude que:
- Tiene su propio contexto aislado: No comparte el historial de conversación con el agente principal
- Puede usar un modelo diferente: Puedes invocar un subagente con Opus mientras tu sesión principal usa Sonnet
- Está especializado para una tarea: Puede tener instrucciones y comportamiento específicos
- Devuelve resultados al agente principal: Una vez completada su tarea, entrega el resultado y se cierra
Analogía
Piensa en el agente principal como un gerente de proyecto y los subagentes como especialistas del equipo:
- El gerente (agente principal) coordina el proyecto completo
- Cuando necesita un diseño técnico, llama a un arquitecto (subagente especializado)
- Cuando necesita código revisado, llama a un revisor (subagente especializado)
- Cada especialista trabaja de forma independiente y devuelve su resultado
¿Cuándo usar subagentes?
✅ Casos de uso ideales
1. Tareas que requieren especialización
# En tu conversación principal
> Necesito que revises este código en busca de vulnerabilidades de seguridadClaude puede invocar un subagente especializado en security review con instrucciones y conocimientos específicos de seguridad.
2. Separar contextos para ahorrar tokens
Si estás trabajando en una feature compleja y necesitas documentar una función específica:
# Sin subagente (contamina el contexto principal)
> Ahora documenta esta función auxiliar en detalle...
# El contexto principal se llena con detalles de documentación
# Con subagente (contexto limpio)
> Usa un subagente para documentar esta función
# El subagente hace su trabajo, devuelve el resultado, y tu contexto principal sigue limpio3. Usar diferentes modelos según la tarea
# Arquitectura compleja → Opus (más inteligente)
> Diseña la arquitectura de este sistema distribuido
# Refactor simple → Haiku (más rápido y económico)
> Renombra estas variables siguiendo las convenciones4. Ejecutar tareas en paralelo
# Múltiples subagentes trabajando simultáneamente
claude -p "Refactoriza módulo A" &
claude -p "Refactoriza módulo B" &
claude -p "Refactoriza módulo C" &
wait❌ Cuándo NO usar subagentes
- Tareas simples que no requieren especialización: Si solo necesitas leer un archivo o hacer una edición básica
- Cuando el contexto compartido es importante: Si la subtarea necesita conocer todo lo que has hecho antes
- Para ahorrar costos en tareas triviales: El overhead de invocar un subagente puede no valer la pena
Tipos de subagentes en Claude Code
Claude Code incluye varios subagentes especializados integrados:
| Subagente | Especialización | Cuándo usarlo |
|---|---|---|
| Explore | Exploración de codebase | Búsqueda rápida de archivos, análisis de estructura |
| Plan | Diseño de arquitectura | Planificar implementación antes de ejecutar |
| Bash | Ejecución de comandos | Operaciones complejas de terminal (git, npm, docker) |
| General-purpose | Tareas complejas multi-paso | Investigación, búsquedas iterativas |
Ejemplo: Subagente Explore
# En tu conversación principal
> Encuentra todos los archivos que manejan autenticación
# Claude puede invocar internamente un subagente Explore que:
# 1. Busca patrones como "auth", "login", "jwt"
# 2. Analiza la estructura del proyecto
# 3. Devuelve la lista de archivos relevantesVentaja: El agente Explore es rápido y eficiente para búsquedas, sin llenar tu contexto principal con resultados intermedios.
Cómo funcionan internamente
Cuando Claude decide usar un subagente:
1. [Agente Principal] Identifica que necesita ayuda especializada
↓
2. [Agente Principal] Invoca un subagente con instrucciones específicas
↓
3. [Subagente] Se crea con su propio contexto aislado
↓
4. [Subagente] Ejecuta la tarea (puede usar herramientas: Read, Grep, Bash, etc.)
↓
5. [Subagente] Devuelve el resultado al agente principal
↓
6. [Agente Principal] Recibe el resultado y continúaDiagrama de flujo
┌─────────────────────┐
│ Agente Principal │
│ │
│ "Encuentra bugs" │
└──────────┬──────────┘
│
│ Invoca subagente
↓
┌─────────────────────┐
│ Subagente │
│ (Reviewer) │
│ │
│ - Lee código │
│ - Analiza │
│ - Encuentra issues │
└──────────┬──────────┘
│
│ Devuelve resultado
↓
┌─────────────────────┐
│ Agente Principal │
│ │
│ Recibe lista de │
│ bugs encontrados │
└─────────────────────┘Beneficios de los subagentes
1. Ahorro de tokens
El contexto principal no se llena con información irrelevante:
# Sin subagente
Tu contexto: [Tarea principal] + [500 líneas de código explorado] + [resultados de búsquedas]
Tokens usados: 15,000
# Con subagente
Tu contexto: [Tarea principal] + [Resultado final del subagente]
Tokens usados: 3,0002. Especialización
Cada subagente puede estar optimizado para su tarea:
- Security auditor: Conoce OWASP, patrones de vulnerabilidades
- Performance analyzer: Sabe identificar cuellos de botella
- Test generator: Experto en frameworks de testing
3. Paralelismo
Múltiples subagentes pueden trabajar simultáneamente:
# Tres tareas en paralelo
claude -p "Analiza rendimiento de módulo A" &
claude -p "Analiza rendimiento de módulo B" &
claude -p "Analiza rendimiento de módulo C" &
wait
echo "Análisis completo"4. Flexibilidad de modelos
# Agente principal: Sonnet (balance)
# Subagente de arquitectura: Opus (máxima capacidad)
# Subagente de renombrado: Haiku (velocidad)Ejemplo práctico completo
Escenario: Refactorizar un módulo legacy
# Conversación con el agente principal
Usuario: Necesito refactorizar el módulo de pagos en src/payments/
Claude: Voy a ayudarte con eso. Primero, déjame explorar el módulo.
[Claude invoca un subagente Explore]
→ Subagente busca archivos en src/payments/
→ Analiza dependencias
→ Identifica patrones
→ Devuelve: "5 archivos, 1200 líneas, patrón MVC"
Claude: He encontrado 5 archivos con patrón MVC. Voy a crear un plan de refactor.
[Claude invoca un subagente Plan]
→ Subagente diseña arquitectura mejorada
→ Propone pasos de migración
→ Identifica riesgos
→ Devuelve: Plan detallado
Claude: Aquí está el plan propuesto [muestra plan]. ¿Apruebas?
Usuario: Sí, adelante
Claude: Comenzando refactor...
[Ejecuta cambios en el agente principal]
Claude: Refactor completo. Ahora ejecuto los tests...
[Claude invoca subagente Bash]
→ Subagente ejecuta: npm test
→ Devuelve: "Tests passed"
Claude: ✅ Refactor completado, tests pasando.Ventaja: Cada fase usó el subagente apropiado, manteniendo el contexto principal limpio y enfocado.
Transparencia vs control
Uso transparente (automático)
Claude decide internamente cuándo usar subagentes:
> Analiza este proyecto y encuentra code smellsClaude puede invocar automáticamente:
- Subagente Explore para buscar archivos
- Subagente especializado para análisis de código
Tú no necesitas saber que usó subagentes, simplemente recibes el resultado.
Uso explícito (manual)
En algunos casos, puedes invocar subagentes manualmente:
# Modo plan explícito
claude --plan "Implementa sistema de autenticación"
# Background agent
claude --background "Migra todos los archivos a TypeScript"Tips y mejores prácticas
✅ Buenas prácticas
- Confía en Claude para decidir: En modo interactivo, Claude sabe cuándo usar subagentes
- Usa background agents para tareas largas: No bloqueas tu terminal
- Combina modelos según necesidad: Opus para planear, Sonnet para implementar, Haiku para tareas rápidas
⚠️ Consideraciones
- Overhead de invocación: Crear un subagente tiene un pequeño costo de tiempo
- Contexto aislado: El subagente NO ve tu historial de conversación
- Comunicación limitada: El subagente devuelve un resultado final, no es interactivo
Diferencia con otros conceptos
| Concepto | Qué es | Diferencia con subagentes |
|---|---|---|
| Sesión | Tu conversación principal | Los subagentes son invocados dentro de una sesión |
| Plan Mode | Modo de planificación | Es un tipo específico de subagente |
| Background Agent | Tarea en segundo plano | Subagente que se ejecuta sin bloquear |
| MCP | Extensión de capacidades | MCP da herramientas; subagentes son instancias de Claude |
Resumen
Los subagentes son instancias especializadas de Claude que:
- ✅ Tienen contexto aislado
- ✅ Pueden usar diferentes modelos
- ✅ Están optimizados para tareas específicas
- ✅ Ahorran tokens en el agente principal
- ✅ Permiten paralelismo
Cuándo usarlos:
- Tareas que requieren especialización
- Separar contextos para eficiencia
- Ejecutar operaciones en paralelo
- Usar diferentes modelos según la subtarea
En el siguiente punto (7.2) veremos casos de uso específicos y ejemplos prácticos de cada tipo de subagente.
Verificación de comprensión
Antes de continuar, asegúrate de entender:
- Qué es un subagente y en qué se diferencia del agente principal
- Cuándo es útil usar un subagente vs. continuar en la conversación principal
- Cómo los subagentes ayudan a ahorrar tokens
- La diferencia entre uso transparente (automático) y explícito (manual)
7.2 Casos de uso
Objetivo
Conocer los casos de uso prácticos más comunes de subagentes en Claude Code y aprender a identificar cuándo cada tipo de subagente es la mejor opción para tu tarea.
Introducción
En el punto anterior aprendimos qué son los subagentes. Ahora vamos a ver cuándo y cómo usarlos en situaciones reales de desarrollo.
Claude Code incluye diferentes tipos de subagentes especializados, cada uno optimizado para tareas específicas. En este punto exploraremos los casos de uso más valiosos.
1. Reviewer — Code Review y detección de bugs
¿Qué hace?
El subagente Reviewer está especializado en:
- Encontrar bugs y errores lógicos
- Identificar vulnerabilidades de seguridad
- Detectar problemas de rendimiento
- Verificar cumplimiento de convenciones
- Sugerir mejoras de código
Cuándo usarlo
✅ Úsalo cuando:
- Quieras una segunda opinión sobre código
- Necesites encontrar bugs antes de hacer commit
- Revises código de otros desarrolladores
- Audites seguridad de una feature
- Prepares código para producción
Ejemplo 1: Revisión de función crítica
// src/services/payment.ts
export async function processPayment(userId: string, amount: number) {
const user = await db.users.findById(userId);
const balance = user.balance - amount;
await db.users.update(userId, { balance });
await db.transactions.create({
userId,
amount,
timestamp: Date.now()
});
return { success: true };
}Conversación:
Usuario: Revisa la función processPayment en src/services/payment.ts
Claude: Voy a revisar esta función en busca de problemas.
[Claude invoca subagente Reviewer especializado en seguridad y lógica]
Claude: He encontrado varios problemas críticos:
🔴 P1 - CRÍTICO: Race condition
- Si dos transacciones ocurren simultáneamente, el balance puede quedar inconsistente
- Solución: Usar una transacción de base de datos
🔴 P1 - CRÍTICO: Falta validación
- No verifica si el usuario tiene fondos suficientes
- Permite balances negativos
- Solución: Validar balance >= amount antes de procesar
🟡 P2 - ALTO: Sin manejo de errores
- Si db.transactions.create() falla, el balance ya fue debitado
- Solución: Envolver en try-catch o usar transacción
🟡 P2 - ALTO: Falta logging
- No hay auditoría de transacciones fallidas
- Dificulta debugging en producción
🟢 P3 - MEDIO: Tipo de retorno inconsistente
- Retorna { success: true } siempre, pero puede fallar
- Considerar retornar el objeto de transacción creado
¿Quieres que implemente las correcciones?Ejemplo 2: Auditoría de seguridad
Usuario: Audita seguridad del módulo de autenticación en src/auth/
Claude: Iniciando auditoría de seguridad...
[Claude invoca subagente Security Reviewer]
Claude: Reporte de seguridad:
🔴 CRÍTICO - SQL Injection en auth/login.ts:42
→ query = `SELECT * FROM users WHERE email='${email}'`
→ Usar prepared statements
🔴 CRÍTICO - Passwords en plain text en auth/register.ts:28
→ No hay hash de contraseñas
→ Implementar bcrypt
🟡 ALTO - JWT sin expiración en auth/token.ts:15
→ Tokens válidos indefinidamente
→ Añadir expiresIn
🟡 ALTO - CORS demasiado permisivo en auth/middleware.ts:8
→ Allow-Origin: *
→ Restringir a dominios específicos
🟢 MEDIO - Rate limiting ausente
→ Vulnerable a brute force
→ Implementar express-rate-limit
Total: 2 críticos, 2 altos, 1 medioVentajas del subagente Reviewer
- Conocimiento especializado en patrones de bugs comunes
- Clasificación por severidad (P1-P4)
- Contexto limpio en tu sesión principal
- Puede analizar múltiples archivos sin contaminar tu historial
2. Architect — Diseño de sistemas y decisiones técnicas
¿Qué hace?
El subagente Architect está especializado en:
- Diseñar arquitecturas de software
- Proponer patrones de diseño
- Evaluar trade-offs técnicos
- Planificar migraciones complejas
- Decidir entre tecnologías
Cuándo usarlo
✅ Úsalo cuando:
- Inicies un proyecto nuevo
- Necesites refactorizar un sistema legacy
- Evalúes diferentes aproximaciones técnicas
- Diseñes una feature compleja
- Tomes decisiones arquitectónicas importantes
Ejemplo 1: Diseño de nueva feature
Usuario: Necesito añadir un sistema de notificaciones en tiempo real a mi app.
Tengo backend en Node.js y frontend en React.
Claude: Voy a diseñar la arquitectura para este sistema.
[Claude invoca subagente Architect con modelo Opus para máxima capacidad]
Claude: He diseñado tres aproximaciones posibles:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPCIÓN 1: WebSockets con Socket.io
Arquitectura:
┌─────────┐ WebSocket ┌─────────┐
│ React │ ←─────────────────────→ │ Node.js │
│ Client │ Socket.io client │ Server │
└─────────┘ └────┬────┘
│
┌────▼────┐
│ Redis │
│ Pub/Sub │
└─────────┘
Pros:
✅ Bidireccional nativo
✅ Socket.io maneja reconexión automática
✅ Broadcast fácil a múltiples clientes
✅ Soporte de rooms para notificaciones por usuario
Contras:
❌ Requiere conexión persistente (+ recursos)
❌ Más complejo de escalar horizontalmente
❌ No funciona detrás de ciertos proxies
Complejidad: MEDIA
Costo operacional: MEDIO-ALTO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPCIÓN 2: Server-Sent Events (SSE)
Arquitectura:
┌─────────┐ SSE stream ┌─────────┐
│ React │ ←───────────────────────── │ Node.js │
│ Client │ EventSource API │ Server │
└─────────┘ └────┬────┘
│
┌────▼────┐
│ Redis │
│ Pub/Sub │
└─────────┘
Pros:
✅ Más simple que WebSockets
✅ Reconexión automática nativa
✅ Funciona sobre HTTP normal
✅ Ideal para notificaciones unidireccionales (server → client)
Contras:
❌ Solo unidireccional
❌ Limitación de 6 conexiones en HTTP/1.1
Complejidad: BAJA
Costo operacional: BAJO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPCIÓN 3: Polling + Firebase Cloud Messaging (híbrido)
Arquitectura:
┌─────────┐ Polling cada 30s ┌─────────┐
│ React │ ───────────────────→ │ Node.js │
│ Client │ │ Server │
└────┬────┘ └────┬────┘
│ │
│ Push para notificaciones │
│ urgentes via FCM │
│ │
└──────────────┬──────────────────┘
│
┌────▼────┐
│ Firebase│
│ FCM │
└─────────┘
Pros:
✅ Funciona en todos los escenarios
✅ Push notifications nativas en móvil
✅ Polling ligero para updates no urgentes
✅ Muy escalable
Contras:
❌ Dependencia de servicio externo (Firebase)
❌ Latencia mayor para updates (hasta 30s)
❌ Más complejo de implementar
Complejidad: MEDIA-ALTA
Costo operacional: BAJO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
RECOMENDACIÓN:
Para tu caso (notificaciones en tiempo real, Node.js + React):
🎯 OPCIÓN 2 (SSE) si:
- Las notificaciones son solo server → client
- No esperas más de 10K usuarios concurrentes
- Quieres implementación rápida
🎯 OPCIÓN 1 (WebSockets) si:
- Necesitas comunicación bidireccional
- Planeas features tipo "usuario X está escribiendo..."
- Tienes recursos para escalar Redis Pub/Sub
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
¿Qué opción prefieres? Puedo generar el código de implementación.Ejemplo 2: Migración de arquitectura
Usuario: Mi monolito en Express se está volviendo difícil de mantener.
¿Debería migrar a microservicios?
Claude: Voy a analizar tu situación y proponer opciones.
[Claude invoca subagente Architect]
Claude: Análisis de migración:
SITUACIÓN ACTUAL (detectada):
- Monolito Express: ~35K líneas
- 12 módulos principales
- 4 desarrolladores en el equipo
- Deploy semanal
- Sin problemas críticos de rendimiento
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPCIÓN 1: Mantener monolito modularizado ⭐ RECOMENDADO
Arquitectura:
/src
/modules
/auth → Módulo independiente
/users → Módulo independiente
/payments → Módulo independiente
/shared
/db
/logger
Esfuerzo: 2-3 semanas
Riesgo: BAJO
ROI: ALTO
Pros:
✅ Simple de mantener con equipo pequeño
✅ Deploy atómico
✅ Sin complejidad de red
✅ Debugging más fácil
Cuándo reconsiderar:
- Equipo crece a +10 personas
- Necesitas escalar módulos independientemente
- Diferentes módulos en diferentes lenguajes
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OPCIÓN 2: Microservicios
Esfuerzo: 4-6 meses
Riesgo: ALTO
ROI: BAJO (para tu caso actual)
⚠️ NO RECOMENDADO porque:
❌ Complejidad operacional (Kubernetes, service mesh)
❌ Debugging distribuido complejo
❌ Latencia de red entre servicios
❌ Overhead de DevOps
Solo considerar si:
- Escala masiva (millones de usuarios)
- Equipos independientes por dominio
- Requerimientos específicos de tecnología
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
RECOMENDACIÓN FINAL:
1. Modulariza tu monolito actual (Opción 1)
2. Implementa boundaries claros entre módulos
3. Si en el futuro necesitas escalar, extrae módulos uno por uno
"No uses microservicios para solucionar problemas de organización de código"Ventajas del subagente Architect
- Usa modelo Opus para decisiones complejas (si está configurado)
- Analiza trade-offs de forma exhaustiva
- Proporciona contexto visual (diagramas en ASCII)
- Considera tu contexto específico (stack, equipo, escala)
3. Tester — Generación y análisis de tests
¿Qué hace?
El subagente Tester está especializado en:
- Generar tests unitarios
- Crear tests de integración
- Identificar casos edge
- Proponer estrategias de testing
- Calcular cobertura necesaria
Cuándo usarlo
✅ Úsalo cuando:
- Implementes nueva funcionalidad (TDD)
- Heredes código sin tests
- Necesites aumentar cobertura
- Debuggees un caso específico
- Diseñes estrategia de testing
Ejemplo 1: TDD con subagente
Usuario: Voy a implementar una función calculateDiscount(price, discountCode).
Usa TDD: primero los tests.
Claude: Voy a generar tests completos antes de implementar.
[Claude invoca subagente Tester]
Claude: Tests generados para calculateDiscount:
// tests/calculateDiscount.test.ts
import { calculateDiscount } from '../src/calculateDiscount';
describe('calculateDiscount', () => {
describe('Casos válidos', () => {
test('aplica 10% de descuento con código SAVE10', () => {
expect(calculateDiscount(100, 'SAVE10')).toBe(90);
});
test('aplica 20% de descuento con código SAVE20', () => {
expect(calculateDiscount(100, 'SAVE20')).toBe(80);
});
test('precio de 0 con cualquier código retorna 0', () => {
expect(calculateDiscount(0, 'SAVE10')).toBe(0);
});
});
describe('Casos inválidos', () => {
test('código desconocido no aplica descuento', () => {
expect(calculateDiscount(100, 'INVALID')).toBe(100);
});
test('código vacío no aplica descuento', () => {
expect(calculateDiscount(100, '')).toBe(100);
});
});
describe('Casos edge', () => {
test('precio negativo lanza error', () => {
expect(() => calculateDiscount(-10, 'SAVE10'))
.toThrow('Price cannot be negative');
});
test('descuento no puede resultar en precio negativo', () => {
expect(calculateDiscount(5, 'SAVE20')).toBe(4); // 20% de 5 = 1
});
test('código case-insensitive', () => {
expect(calculateDiscount(100, 'save10')).toBe(90);
expect(calculateDiscount(100, 'SAVE10')).toBe(90);
});
});
describe('Tipos', () => {
test('price debe ser número', () => {
expect(() => calculateDiscount('100' as any, 'SAVE10'))
.toThrow('Price must be a number');
});
test('discountCode debe ser string', () => {
expect(() => calculateDiscount(100, 123 as any))
.toThrow('Discount code must be a string');
});
});
describe('Precisión decimal', () => {
test('maneja decimales correctamente', () => {
expect(calculateDiscount(99.99, 'SAVE10')).toBe(89.99);
});
test('redondea a 2 decimales', () => {
expect(calculateDiscount(99.99, 'SAVE20')).toBe(79.99);
});
});
});
Total: 14 tests cubriendo:
✅ Happy paths
✅ Edge cases
✅ Validación de tipos
✅ Manejo de errores
✅ Precisión numérica
Ahora ejecuta los tests (deben fallar) y luego implementa la función.Ejemplo 2: Tests para código legacy
Usuario: Este módulo no tiene tests. Genera cobertura completa.
[Adjunta código de módulo legacy]
Claude: Analizando código y generando suite de tests...
[Claude invoca subagente Tester]
Claude: He generado 28 tests con cobertura del 95%:
📊 Resumen de cobertura:
✅ Functions: 95% (19/20)
✅ Branches: 92% (34/37)
✅ Lines: 94% (156/166)
Tests generados:
- 8 tests unitarios para funciones puras
- 6 tests de integración para flujos principales
- 9 tests de casos edge
- 5 tests de manejo de errores
⚠️ Cobertura faltante:
- validateEmail.ts:45 → Rama de error de DNS no alcanzada
- utils.ts:89 → Función deprecada (considerar eliminar)
¿Quieres ver los tests completos o ejecutarlos primero?Ventajas del subagente Tester
- Identifica casos edge que podrías pasar por alto
- Genera tests siguiendo convenciones de tu proyecto
- Calcula cobertura necesaria
- No contamina tu contexto con tests largos
4. Documenter — Documentación y explicaciones
¿Qué hace?
El subagente Documenter está especializado en:
- Generar documentación técnica
- Explicar código complejo
- Crear READMEs y guías
- Documentar APIs
- Generar comentarios JSDoc/TSDoc
Cuándo usarlo
✅ Úsalo cuando:
- Necesites documentar un módulo completo
- Generes documentación de API
- Expliques código a nuevos developers
- Crees guías de onboarding
- Documentes decisiones arquitectónicas
Ejemplo 1: Documentar API REST
Usuario: Documenta la API en src/api/routes/
Claude: Voy a generar documentación completa de tu API.
[Claude invoca subagente Documenter]
Claude: Documentación generada:
# API Documentation
## Authentication
### POST /api/auth/login
Autentica un usuario y devuelve un token JWT.
**Request:**
```json
{
"email": "user@example.com",
"password": "secretPassword123"
}Response (200):
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "user_123",
"email": "user@example.com",
"name": "John Doe"
}
}Errors:
400 Bad Request: Email o password faltante401 Unauthorized: Credenciales inválidas429 Too Many Requests: Rate limit excedido
Rate Limit: 5 requests/minuto
POST /api/auth/register
Crea una nueva cuenta de usuario.
Request:
{
"email": "newuser@example.com",
"password": "securePassword123",
"name": "Jane Doe"
}Response (201):
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "user_124",
"email": "newuser@example.com",
"name": "Jane Doe"
}
}Errors:
400 Bad Request: Datos faltantes o formato inválido409 Conflict: Email ya registrado
[... continúa con todos los endpoints]
Total: 24 endpoints documentados Formato: OpenAPI 3.0 compatible
### Ejemplo 2: Explicar código complejo
Usuario: Explica cómo funciona el algoritmo en src/core/scheduler.ts
Claude: Voy a analizar y explicar este algoritmo.
[Claude invoca subagente Documenter]
Claude: Explicación del algoritmo de scheduling:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Task Scheduler con Priority Queue
Resumen
Este algoritmo implementa un scheduler de tareas con prioridades usando un heap binario (min-heap) para garantizar O(log n) en inserciones y O(1) en lectura del siguiente elemento de mayor prioridad.
Flujo principal
-
Encolar tarea (addTask) ┌─────────────┐ │ Nueva tarea│ └──────┬──────┘ │ ┌──────▼──────────────────────┐ │ Inserta en heap con priority│ │ (menor número = mayor prior)│ └──────┬──────────────────────┘ │ ┌──────▼──────────┐ │ Heapify up O(log│ │ n) │ └─────────────────┘
-
Procesar siguiente tarea (processNext) ┌─────────────────┐ │ Peek heap (O(1))│ └────────┬────────┘ │ ┌────────▼────────────┐ │ Verificar timestamp │ │ (¿es momento?) │ └────────┬────────────┘ │ ┌─────┴─────┐ │ │ SI│ │NO │ │ ┌──▼──┐ ┌──▼───────┐ │Pop │ │Wait hasta│ │heap │ │timestamp │ └──┬──┘ └──────────┘ │ ┌──▼──────────┐ │Execute task │ └─────────────┘
Estructuras de datos
interface Task {
id: string;
priority: number; // 1-10 (1 = más alta)
timestamp: number; // Cuándo ejecutar
fn: () => Promise<void>;
}
class MinHeap {
private heap: Task[] = [];
// ...
}Complejidad
| Operación | Complejidad |
|---|---|
| addTask | O(log n) |
| processNext | O(log n) |
| peek | O(1) |
Casos edge manejados
✅ Múltiples tareas con la misma prioridad → Usa timestamp como tiebreaker
✅ Tarea que falla durante ejecución → Captura error, logea, continúa con siguiente
✅ Heap vacío → processNext() retorna null
✅ Timestamp futuro → Espera hasta ese momento antes de ejecutar
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
### Ventajas del subagente Documenter
- **Genera documentación estructurada** siguiendo estándares
- **Explica con diagramas** cuando es útil
- **Identifica patrones** y los documenta
- **No llena tu contexto** con documentación larga
---
## 5. Explore — Exploración rápida de codebase
### ¿Qué hace?
El subagente **Explore** está especializado en:
- Búsqueda rápida de archivos
- Análisis de estructura de proyecto
- Grep inteligente de código
- Identificación de patrones
- Mapeo de dependencias
### Cuándo usarlo
✅ **Úsalo cuando:**
- Explores un proyecto nuevo
- Busques dónde se implementa algo
- Analices la estructura del codebase
- Encuentres todos los usos de una función
- Identifiques módulos relacionados
### Ejemplo: Onboarding a proyecto nuevo
Usuario: Acabo de clonar este repo. Ayúdame a entenderlo.
Claude: Voy a explorar el proyecto para darte un mapa completo.
[Claude invoca subagente Explore con thoroughness: "very thorough"]
Claude: Análisis completo del proyecto:
📁 ESTRUCTURA
proyecto/ ├── frontend/ → React 18 + TypeScript │ ├── src/ │ │ ├── components/ (42 componentes) │ │ ├── pages/ (12 páginas) │ │ ├── hooks/ (18 custom hooks) │ │ ├── services/ (8 servicios API) │ │ └── utils/ (15 utilidades) │ └── tests/ (Coverage: 78%) │ ├── backend/ → Node.js + Express + PostgreSQL │ ├── src/ │ │ ├── routes/ (6 grupos de rutas) │ │ ├── controllers/ (12 controladores) │ │ ├── models/ (8 modelos Sequelize) │ │ ├── middleware/ (5 middlewares) │ │ └── services/ (10 servicios) │ └── tests/ (Coverage: 65%) │ └── shared/ → Tipos TypeScript compartidos └── types/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 PUNTOS DE ENTRADA
-
Frontend: frontend/src/App.tsx → React Router con 12 rutas → Redux Toolkit para estado global
-
Backend: backend/src/server.ts → Express app en puerto 3001 → 6 grupos de rutas montados
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔐 AUTENTICACIÓN
Implementada en:
- backend/src/middleware/auth.ts
- backend/src/services/authService.ts
- frontend/src/hooks/useAuth.ts
Flujo:
- Login → JWT generado (expiración: 24h)
- Token almacenado en localStorage
- Middleware verifica token en cada request protegido
- Refresh token: backend/src/routes/auth.ts:45
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 DEPENDENCIAS PRINCIPALES
Frontend:
- react: 18.2.0
- @reduxjs/toolkit: 1.9.5
- axios: 1.4.0
- react-router-dom: 6.14.0
Backend:
- express: 4.18.2
- sequelize: 6.32.1
- pg: 8.11.1
- jsonwebtoken: 9.0.1
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🚀 COMANDOS ÚTILES
npm run dev:frontend → Desarrollo frontend (puerto 3000) npm run dev:backend → Desarrollo backend (puerto 3001) npm run test → Tests completos npm run build → Build de producción npm run migrate → Migraciones de DB
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📝 CONVENCIONES DETECTADAS
- Componentes React: PascalCase
- Hooks: useCamelCase
- Variables: camelCase
- Constantes: UPPER_SNAKE_CASE
- Tests: *.test.ts / *.test.tsx
- Prettier + ESLint configurados
¿Sobre qué parte quieres profundizar?
### Ventajas del subagente Explore
- **Extremadamente rápido** para búsquedas
- **No contamina contexto** con resultados intermedios
- **Puede buscar en múltiples lugares** simultáneamente
- **Identifica patrones** automáticamente
---
## 6. Plan — Planificación antes de implementar
### ¿Qué hace?
El subagente **Plan** está especializado en:
- Diseñar plan de implementación paso a paso
- Identificar archivos críticos
- Evaluar trade-offs
- Proponer orden de ejecución
- Detectar riesgos antes de empezar
### Cuándo usarlo
✅ **Úsalo cuando:**
- La tarea es compleja (múltiples archivos, features grandes)
- Quieres alineación antes de implementar
- No estás seguro del mejor enfoque
- La tarea puede tener efectos secundarios
- Trabajas en producción
### Ejemplo: Plan para feature compleja
Usuario: Necesito implementar reset de contraseña vía email
Claude: Esta es una feature con múltiples partes. Voy a crear un plan detallado.
[Claude entra en Plan Mode - subagente Plan]
Claude:
═══════════════════════════════════════════════════════════════ PLAN: Implementar Password Reset vía Email ═══════════════════════════════════════════════════════════════
📋 PASOS
1️⃣ Backend: Endpoint POST /api/auth/forgot-password Archivos: - backend/src/routes/auth.ts (añadir ruta) - backend/src/controllers/authController.ts (nueva función)
Tareas: ✓ Recibir email ✓ Verificar que usuario existe ✓ Generar token único (crypto.randomBytes) ✓ Guardar token en DB con expiración (1 hora) ✓ Enviar email con link
2️⃣ Backend: Servicio de email Archivos: - backend/src/services/emailService.ts (nuevo)
Decisiones: ❓ ¿Qué servicio de email usar? a) Nodemailer + SMTP → Más control, gratis b) SendGrid → Más confiable, $ c) AWS SES → Económico, requiere AWS setup
💡 Recomiendo: SendGrid (fácil setup, tier gratuito 100/día)3️⃣ Backend: Modelo para reset tokens Archivos: - backend/src/models/PasswordReset.ts (nuevo)
Schema: - userId (FK a User) - token (string, único) - expiresAt (timestamp) - used (boolean)
4️⃣ Backend: Endpoint POST /api/auth/reset-password Archivos: - backend/src/routes/auth.ts - backend/src/controllers/authController.ts
Tareas: ✓ Recibir token + nueva contraseña ✓ Verificar token existe y no expiró ✓ Verificar token no fue usado ✓ Hash nueva contraseña (bcrypt) ✓ Actualizar contraseña usuario ✓ Marcar token como usado
5️⃣ Frontend: Página "Forgot Password" Archivos: - frontend/src/pages/ForgotPassword.tsx (nuevo)
UI: - Input de email - Botón "Send Reset Link" - Mensaje de confirmación
6️⃣ Frontend: Página "Reset Password" Archivos: - frontend/src/pages/ResetPassword.tsx (nuevo)
UI: - Lee token de URL (?token=...) - Input de nueva contraseña - Input de confirmación - Validación de fuerza - Botón "Reset Password"
7️⃣ Testing Archivos: - backend/tests/auth/passwordReset.test.ts (nuevo) - frontend/tests/pages/ForgotPassword.test.tsx (nuevo)
Tests: - Happy path completo - Token expirado - Token inválido - Token ya usado - Email no existe
8️⃣ Seguridad Tareas: ✓ Rate limiting en /forgot-password (max 3/hora por IP) ✓ No revelar si email existe (mismo mensaje siempre) ✓ Tokens criptográficamente seguros ✓ HTTPS obligatorio en producción
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ RIESGOS IDENTIFICADOS
-
MEDIO: Email delivery puede fallar → Implementar retry logic en emailService → Logging exhaustivo de envíos
-
BAJO: Tokens pueden acumularse en DB → Crear cronjob para limpiar tokens expirados
-
ALTO: Sin rate limiting, vulnerable a spam → DEBE implementarse rate limiting
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⏱️ ORDEN DE IMPLEMENTACIÓN RECOMENDADO
- Modelo PasswordReset (5 min)
- Servicio de email (15 min)
- Endpoint forgot-password (20 min)
- Endpoint reset-password (20 min)
- Frontend ForgotPassword (15 min)
- Frontend ResetPassword (15 min)
- Tests (30 min)
- Rate limiting (10 min)
Total estimado: 2-3 horas
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
❓ DECISIONES PENDIENTES
- ¿Qué servicio de email usar? (SendGrid recomendado)
- ¿Tiempo de expiración del token? (sugiero 1 hora)
- ¿Límite de rate limit? (sugiero 3 intentos/hora)
¿Apruebas este plan o quieres ajustar algo?
### Ventajas del subagente Plan
- **Previene errores** al pensar antes de actuar
- **Identifica riesgos** proactivamente
- **Da visibilidad** del alcance completo
- **Permite feedback** antes de escribir código
---
## Comparación de subagentes
| Subagente | Cuándo usar | Modelo recomendado | Duración típica |
|-----------|-------------|-------------------|-----------------|
| **Reviewer** | Code review, bugs | Sonnet | 30s - 2min |
| **Architect** | Diseño, decisiones | Opus | 1min - 5min |
| **Tester** | Generar tests | Sonnet | 30s - 3min |
| **Documenter** | Documentación | Sonnet | 1min - 5min |
| **Explore** | Búsqueda rápida | Haiku | 10s - 1min |
| **Plan** | Planificación | Opus/Sonnet | 1min - 10min |
---
## Resumen
Los subagentes especializados te permiten:
✅ **Delegar tareas específicas** a expertos virtuales
✅ **Mantener contexto limpio** en tu sesión principal
✅ **Usar modelos apropiados** para cada tarea (Opus para arquitectura, Haiku para búsqueda)
✅ **Ahorrar tiempo y tokens** al separar responsabilidades
**En el siguiente punto (7.3)** aprenderemos sobre el **Plan Mode**, un subagente especial que te ayuda a planificar tareas complejas antes de ejecutarlas.
---
## Verificación de comprensión
Antes de continuar:
- [ ] Identificas cuándo usar cada tipo de subagente
- [ ] Entiendes las ventajas de especialización
- [ ] Sabes qué modelo es mejor para cada tipo de tarea
- [ ] Comprendes cómo los subagentes ahorran tokens
---
# 7.3 Plan Mode
## Objetivo
Dominar el uso de Plan Mode para obtener alineación y validación antes de ejecutar tareas complejas, reduciendo errores y asegurando que Claude entiende correctamente tus requerimientos.
---
## Introducción
Imagina este escenario:
Tú: Refactoriza el módulo de pagos para usar Stripe en lugar de PayPal
Claude: [Empieza a modificar archivos inmediatamente] [Después de 15 minutos y 20 archivos modificados...]
Tú: ¡Espera! Quería mantener PayPal como opción, solo añadir Stripe. Además, no toques el código de subscripciones, eso está bien así.
Claude: Oh... ya modifiqué todo. Tendrás que revertir cambios.
**Frustrante, ¿verdad?**
**Plan Mode** soluciona este problema: Claude te muestra su plan **antes** de ejecutar, tú lo apruebas o corriges, y solo entonces implementa.
---
## ¿Qué es Plan Mode?
**Plan Mode** es un modo de operación de Claude Code donde:
1. **📋 Claude planifica primero**: Analiza tu solicitud y crea un plan detallado
2. **👀 Tú revisas**: Ves exactamente qué hará, qué archivos tocará, qué decisiones tomará
3. **✅ Apruebas o corriges**: Das feedback, ajustas el plan
4. **⚙️ Claude ejecuta**: Solo cuando apruebes, implementa paso a paso
### Analogía
Es como trabajar con un **arquitecto**:
- No te traen una casa ya construida
- Primero te muestran los planos
- Puedes pedir cambios antes de empezar
- Una vez aprobados, construyen según el plan
---
## ¿Cuándo usar Plan Mode?
### ✅ Usa Plan Mode cuando:
#### 1. La tarea es compleja o afecta múltiples archivos
❌ Sin Plan Mode:
Migra toda la app de JavaScript a TypeScript
[Claude empieza a convertir archivos...] [Tú descubres después que usó "any" en muchos lugares] [O que no migró los tests]
✅ Con Plan Mode:
Migra toda la app de JavaScript a TypeScript
[Claude crea plan:]
- Estrategia de migración incremental
- Archivos a migrar en orden (core primero, UI después)
- Cómo manejar dependencias sin tipos
- Migración de tests incluida
[Tú revisas y corriges: "No uses 'any', crea interfaces proper"] [Claude ajusta el plan] [Ahora sí, ejecuta]
#### 2. No estás 100% seguro de cómo pedir lo que quieres
Mejora el rendimiento de la app
[Demasiado vago. ¿Qué significa "mejorar"?]
Con Plan Mode:
- Claude propone qué optimizar (lazy loading, memoization, etc.)
- Tú eliges qué optimizaciones quieres
- Se evita trabajo innecesario
#### 3. Trabajas en producción o código crítico
Actualiza la lógica de cálculo de precios
[Si algo sale mal, afecta dinero real]
Con Plan Mode:
- Revisas el plan completo
- Verificas que mantenga compatibilidad
- Identificas casos edge antes de implementar
#### 4. Quieres aprender el enfoque de Claude
Con Plan Mode puedes ver:
- Cómo Claude descompone problemas
- Qué patrones elige
- Qué orden de implementación usa
Es educativo, no solo productivo.
### ❌ No uses Plan Mode cuando:
- **Tareas triviales**: "Añade console.log aquí"
- **Instrucciones muy específicas**: Ya sabes exactamente qué hacer
- **Exploraciones**: "¿Qué hace este código?" (usa modo normal)
---
## Cómo activar Plan Mode
### Opción 1: Configuración global
```bash
# Activar para todas las sesiones
claude /configEn el menú de configuración:
→ Plan mode
[ ] Disabled
[x] EnabledAhora todas tus conversaciones usarán Plan Mode por defecto.
Opción 2: Configuración en settings.json
{
"planMode": true
}Puedes configurarlo:
- Globalmente:
~/.claude/settings.json - Por proyecto:
.claude/settings.json - Localmente:
.claude/settings.local.json
Opción 3: Por conversación
# Solo esta sesión usará Plan Mode
claude --planOpción 4: Solicitud explícita
# Dentro de una conversación normal
> /plan Refactoriza el módulo de autenticaciónFlujo de Plan Mode
┌─────────────────────────────────────────────────────────┐
│ 1. SOLICITUD │
│ Usuario: "Implementa sistema de notificaciones" │
└───────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 2. EXPLORACIÓN (opcional) │
│ Claude lee archivos relevantes para entender contexto │
└───────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 3. PLANIFICACIÓN │
│ Claude genera plan detallado: │
│ - Pasos a seguir │
│ - Archivos a modificar/crear │
│ - Decisiones técnicas │
│ - Riesgos identificados │
└───────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 4. PRESENTACIÓN DEL PLAN │
│ Claude muestra el plan y pregunta: │
│ "¿Apruebas este plan?" │
└───────────────────────┬─────────────────────────────────┘
│
┌─────────┴─────────┐
│ │
RECHAZAR APROBAR
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ 5a. AJUSTES │ │ 5b. EJECUCIÓN │
│ Usuario da │ │ Claude ejecuta │
│ feedback │ │ paso a paso │
└────┬─────────────┘ └──────────────────┘
│
└─────► Vuelve a paso 3 (nuevo plan)Ejemplo completo: Plan Mode en acción
Solicitud inicial
Usuario: Implementa autenticación con Google OAuth en mi app Express + ReactFase 1: Exploración
Claude: Voy a explorar tu proyecto para crear un plan apropiado.
[Claude lee:]
- package.json (frontend y backend)
- Estructura de carpetas
- Código de autenticación actual (si existe)
- Variables de entorno (.env.example)Fase 2: Plan generado
Claude:
═══════════════════════════════════════════════════════════════
PLAN: Implementar Google OAuth
═══════════════════════════════════════════════════════════════
📋 RESUMEN
Implementaré autenticación con Google OAuth 2.0 usando:
- Backend: passport.js + passport-google-oauth20
- Frontend: Botón "Sign in with Google"
- Flujo: OAuth2 con redirect
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📝 PASOS DETALLADOS
BACKEND
-------
1. Instalar dependencias
Comando: npm install passport passport-google-oauth20 express-session
Archivos: backend/package.json
2. Configurar Passport
Archivo: backend/src/config/passport.ts (NUEVO)
Tareas:
✓ Configurar GoogleStrategy
✓ Callback para obtener perfil de Google
✓ Serializar/deserializar usuario
✓ Usar variables de entorno para credenciales
3. Crear rutas de autenticación
Archivo: backend/src/routes/auth.ts (MODIFICAR)
Rutas nuevas:
GET /api/auth/google → Inicia OAuth
GET /api/auth/google/callback → Callback de Google
GET /api/auth/logout → Cierra sesión
GET /api/auth/user → Info usuario actual
4. Middleware de sesión
Archivo: backend/src/server.ts (MODIFICAR)
Tareas:
✓ Configurar express-session
✓ Inicializar Passport
✓ Configurar CORS apropiadamente
5. Modelo de usuario (si no existe)
Archivo: backend/src/models/User.ts (MODIFICAR o NUEVO)
Campos necesarios:
- googleId (único)
- email
- name
- avatar
FRONTEND
--------
6. Botón de login
Archivo: frontend/src/components/GoogleLoginButton.tsx (NUEVO)
Funcionalidad:
→ Redirige a /api/auth/google
→ Maneja estado de "loading"
7. Context de autenticación
Archivo: frontend/src/contexts/AuthContext.tsx (NUEVO o MODIFICAR)
Estado:
- user (null | User)
- loading (boolean)
- login() → Redirige a OAuth
- logout() → Llama a /api/auth/logout
8. Protected routes
Archivo: frontend/src/components/ProtectedRoute.tsx (NUEVO o MODIFICAR)
Funcionalidad:
→ Verifica si usuario autenticado
→ Redirige a login si no
CONFIGURACIÓN
-------------
9. Variables de entorno
Archivo: .env.example (MODIFICAR)
Nuevas variables:
GOOGLE_CLIENT_ID=tu_client_id
GOOGLE_CLIENT_SECRET=tu_client_secret
GOOGLE_CALLBACK_URL=http://localhost:3001/api/auth/google/callback
SESSION_SECRET=random_secret_key
10. Documentación
Archivo: docs/AUTH.md (NUEVO)
Contenido:
- Cómo obtener credenciales de Google Cloud
- Setup de OAuth consent screen
- Configuración local vs producción
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🎯 DECISIONES TÉCNICAS
1. ¿Session-based o JWT?
→ ELEGIDO: Session-based (más simple con Passport)
→ Alternativa: Podría usar JWT si prefieres stateless
2. ¿Dónde guardar sesiones?
→ ELEGIDO: express-session con memoria (desarrollo)
→ RECOMENDADO: Redis para producción (¿implemento?)
3. ¿Permitir otros métodos de login?
→ DETECTADO: No tienes login tradicional actualmente
→ ¿Mantengo solo Google o añado email/password también?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ RIESGOS Y CONSIDERACIONES
1. MEDIO: CORS debe estar correctamente configurado
→ De lo contrario, callback de Google fallará
→ Verificaré configuración
2. BAJO: Sesiones en memoria se pierden al reiniciar
→ Aceptable para desarrollo
→ Para producción, necesitas Redis
3. MEDIO: Callback URL debe coincidir EXACTAMENTE con Google Console
→ Documentaré claramente
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📂 ARCHIVOS AFECTADOS
NUEVOS (6):
✨ backend/src/config/passport.ts
✨ frontend/src/components/GoogleLoginButton.tsx
✨ frontend/src/contexts/AuthContext.tsx
✨ frontend/src/components/ProtectedRoute.tsx
✨ docs/AUTH.md
✨ backend/src/models/User.ts (si no existe)
MODIFICADOS (4):
📝 backend/package.json
📝 backend/src/routes/auth.ts
📝 backend/src/server.ts
📝 .env.example
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
❓ PREGUNTAS ANTES DE CONTINUAR
1. ¿Prefieres sessions o JWT para los tokens?
(Recomiendo sessions para simplicidad)
2. ¿Implemento Redis para sessions desde ya o solo memoria?
(Memoria para dev está bien, Redis para producción)
3. ¿Solo Google OAuth o también quieres email/password tradicional?
4. ¿Qué hacer si un email ya existe con otro método de login?
(Vincular cuentas o error?)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ APROBAR PLAN | ✏️ AJUSTAR | ❌ CANCELAR
¿Cómo quieres proceder?Fase 3: Feedback del usuario
Usuario: Perfecto, pero:
1. Usa JWT en lugar de sessions (prefiero stateless)
2. Solo Google por ahora, no email/password
3. Si el email ya existe, vincular cuentas automáticamente
4. No necesito documentación en docs/, solo README.mdFase 4: Plan ajustado
Claude: Entendido. Plan actualizado:
CAMBIOS:
❌ Removido: express-session, passport sessions
✅ Añadido: jsonwebtoken para JWT
✅ Cambio: Callback retorna JWT en lugar de crear sesión
✅ Cambio: Frontend guarda JWT en localStorage
✅ Cambio: Middleware verifica JWT en requests
✅ Cambio: Si email existe, vincula googleId al usuario existente
❌ Removido: docs/AUTH.md
✅ Añadido: Sección de OAuth en README.md
Archivos afectados ahora: 8 (2 menos que antes)
¿Apruebas este plan actualizado?Fase 5: Aprobación y ejecución
Usuario: Aprobado, adelante
Claude: ✅ Plan aprobado. Comenzando implementación...
[Paso 1/8] Instalando dependencias...
✓ Instaladas: passport, passport-google-oauth20, jsonwebtoken
[Paso 2/8] Creando configuración de Passport...
✓ Creado: backend/src/config/passport.ts
[Paso 3/8] Implementando rutas de autenticación...
✓ Modificado: backend/src/routes/auth.ts
[Paso 4/8] Configurando middleware JWT...
✓ Modificado: backend/src/server.ts
✓ Creado: backend/src/middleware/auth.ts
[Paso 5/8] Actualizando modelo de Usuario...
✓ Modificado: backend/src/models/User.ts
- Añadido campo googleId
- Añadido índice único en googleId
[Paso 6/8] Creando componente de login en React...
✓ Creado: frontend/src/components/GoogleLoginButton.tsx
[Paso 7/8] Implementando context de autenticación...
✓ Creado: frontend/src/contexts/AuthContext.tsx
✓ Creado: frontend/src/hooks/useAuth.ts
[Paso 8/8] Actualizando documentación...
✓ Modificado: README.md
- Añadida sección "Google OAuth Setup"
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ Implementación completada
SIGUIENTES PASOS:
1. Obtén credenciales en Google Cloud Console:
https://console.cloud.google.com/apis/credentials
2. Configura variables de entorno en .env:
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...
JWT_SECRET=... (genera uno seguro)
3. Reinicia los servidores:
npm run dev
4. Prueba el flujo de login
¿Quieres que te ayude con alguno de estos pasos?Ventajas de Plan Mode
1. Alineación temprana
Sin Plan Mode:
Implementa → Descubres que no era lo que querías → Reviertes → Reimplementa
Tiempo perdido: 30 min - 2 horas
Con Plan Mode:
Plan → Corriges expectativas → Implementa correctamente la primera vez
Tiempo ahorrado: 80%2. Aprendizaje
Ves cómo Claude descompone problemas:
- Qué orden de implementación elige
- Qué patrones aplica
- Qué casos edge considera
- Qué decisiones técnicas toma
3. Prevención de errores
Claude en plan:
"Voy a modificar la función calculatePrice en pricing.ts:45"
Tú:
"¡Espera! Esa función es usada por el billing automático en producción.
Mejor crea una nueva función y migra gradualmente."
Claude:
"Buen punto. Ajusto el plan para no tocar la función existente."4. Transparencia
Sabes exactamente:
- Qué archivos se modificarán
- Qué se instalará
- Qué decisiones se tomarán
- Qué riesgos existen
5. Control granular
Claude: "Voy a instalar estas 5 dependencias..."
Tú: "No instales lodash, ya usamos Ramda en el proyecto"
Claude: "Ajustado, usaré Ramda"Diferencias entre Plan Mode y ejecución directa
| Aspecto | Sin Plan Mode | Con Plan Mode |
|---|---|---|
| Velocidad inicial | Rápido (empieza de inmediato) | Más lento (planifica primero) |
| Riesgo de error | Alto (puede malinterpretar) | Bajo (alineación antes de actuar) |
| Control | Reactivo (corriges después) | Proactivo (apruebas antes) |
| Aprendizaje | Bajo (solo ves resultado) | Alto (ves proceso de pensamiento) |
| Ideal para | Tareas simples y claras | Tareas complejas o ambiguas |
Tips para usar Plan Mode efectivamente
✅ Buenas prácticas
1. Sé específico en tu solicitud inicial
❌ Malo:
"Mejora el código"
✅ Bueno:
"Refactoriza el módulo de pagos para:
- Separar lógica de Stripe de la de PayPal
- Hacer más fácil añadir nuevos procesadores
- Mantener compatibilidad con código existente"2. Revisa el plan cuidadosamente
No apruebas automáticamente. Verifica:
- Archivos correctos
- Decisiones técnicas apropiadas
- No toca código que no debería
- Considera casos edge de tu negocio
3. Haz preguntas durante la revisión
Tú: "¿Por qué propones usar Redis para el cache?"
Claude: "Porque vi que ya lo usas para sessions.
Podemos usar el mismo servidor.
Alternativa: podría usar cache en memoria"
Tú: "Ah sí, tiene sentido. Aprobado."4. Pide ajustes incrementales
Claude: [Plan con 15 pasos]
Tú: "Muy ambicioso. Empecemos solo con los pasos 1-5.
Cuando funcionen, continuamos con el resto."
Claude: "Buen punto. Plan reducido a primeros 5 pasos..."⚠️ Evita
1. No uses Plan Mode para TODO
# Esto NO necesita Plan Mode:
> Añade un console.log en la línea 42
# Esto SÍ:
> Refactoriza todo el módulo de autenticación2. No apruebes sin leer
Claude: [Plan detallado de 100 líneas]
Tú: "Aprobado" ← ❌ Malo
Tú: [Lee cuidadosamente, hace 2 preguntas, ajusta 1 decisión] ← ✅ Bueno3. No des feedback vago
❌ Malo:
Tú: "No me gusta el plan, hazlo diferente"
✅ Bueno:
Tú: "No uses MongoDB para el cache, prefiero Redis.
Y en lugar de crear nuevos archivos, modifica los existentes."Plan Mode vs otros enfoques
Plan Mode vs Modo normal
Modo Normal:
→ Útil para: Tareas simples, exploraciones, preguntas
→ Ejemplo: "¿Qué hace este código?"
Plan Mode:
→ Útil para: Implementaciones complejas, refactors grandes
→ Ejemplo: "Migra la app a Next.js 14"Plan Mode vs Prompt detallado
Prompt super detallado (sin Plan Mode):
> "Crea un endpoint POST /api/users que:
- Valide email y password
- Hash password con bcrypt
- Guarde en DB
- Retorne JWT
- Maneje errores de duplicados"
→ Claude implementa directamente
→ No ves el plan
→ No puedes corregir antes
Plan Mode (con prompt conciso):
> "Crea endpoint de registro de usuarios"
→ Claude genera plan detallado
→ Propone validaciones, hash, JWT, etc.
→ Tú corriges lo que haga falta
→ Entonces implementaComandos útiles en Plan Mode
Durante la fase de planificación:
# Aprobar el plan
> aprobado
> adelante
> sí, continúa
# Pedir ajustes
> Ajusta el plan: no uses Redis, usa memoria
> Cambia el paso 3 para usar TypeScript estricto
# Cancelar
> cancela
> no, mejor déjalo
# Pedir explicación
> ¿Por qué elegiste este enfoque?
> Explica el paso 4 con más detalle
# Solicitar alternativas
> ¿Qué otras opciones hay para el paso 2?Ejemplo: Cuándo Plan Mode te salva
Escenario: Refactor de base de datos
Usuario: Migra de MongoDB a PostgreSQL
Sin Plan Mode:
→ Claude empieza a cambiar código
→ Después de 1 hora, descubres que:
- No migró los datos existentes
- Cambió esquemas incompatibles con producción
- Rompió tests que dependían de MongoDB
→ Tienes que revertir todo
Con Plan Mode:
→ Claude genera plan:
1. Script de migración de datos
2. Nuevos modelos con Sequelize
3. Migración gradual (dual-write por un tiempo)
4. Tests actualizados
5. Rollback plan si algo falla
→ Tú revisas y añades:
"Antes del paso 1, haz backup de la DB de producción"
"En el paso 3, mantén MongoDB corriendo 1 semana más"
→ Claude ajusta el plan
→ Implementa con tu feedback
→ Resultado: migración exitosa sin downtimeResumen
Plan Mode es tu mejor aliado para tareas complejas:
✅ Alineación antes de ejecutar → Menos tiempo perdido ✅ Transparencia completa → Sabes qué pasará ✅ Control proactivo → Corriges antes de implementar ✅ Aprendizaje → Ves cómo Claude piensa ✅ Prevención de errores → Detectas problemas temprano
Actívalo para:
- Refactors grandes
- Features complejas
- Migraciones de tecnología
- Cambios en producción
- Cuando no estás 100% seguro de lo que quieres
No lo uses para:
- Tareas triviales
- Exploraciones
- Cambios de 1 línea
En el siguiente punto (7.4) aprenderemos sobre Background Agents, que te permiten ejecutar tareas largas sin bloquear tu terminal.
Verificación de comprensión
Antes de continuar:
- Entiendes qué es Plan Mode y cuándo usarlo
- Sabes cómo activarlo (global, por proyecto, por sesión)
- Comprendes el flujo: plan → revisión → ajustes → ejecución
- Identificas las ventajas vs ejecución directa
- Sabes cómo dar feedback efectivo durante la revisión del plan
7.4 Background Agents
Objetivo
Aprender a ejecutar tareas largas en segundo plano con Claude Code, liberando tu terminal para continuar trabajando mientras Claude procesa tareas que requieren mucho tiempo.
Introducción
Imagina este escenario:
Tú: Claude, refactoriza todos los componentes de React para usar TypeScript estricto
Claude: [Empieza a procesar...]
[5 minutos después, sigue procesando archivo 12 de 50...]
[Tu terminal está bloqueada...]
[No puedes hacer nada más...]
[15 minutos después, aún procesando...]
Tú: 😴 [Esperando...]¿Frustrante? Absolutamente.
Background Agents resuelven este problema: Claude trabaja en segundo plano mientras tú continúas con otras tareas.
¿Qué es un Background Agent?
Un Background Agent es una instancia de Claude Code que:
- 🔄 Ejecuta en segundo plano: No bloquea tu terminal
- 📝 Guarda progreso en archivo: Puedes ver el progreso cuando quieras
- 🔔 Notifica cuando termina: Te avisa al completar
- 🎯 Independiente: Tiene su propio contexto y no interfiere con otras sesiones
Analogía
Es como delegar trabajo a un asistente:
Tú: "Organiza estos 1000 archivos en carpetas por fecha"
Asistente tradicional (síncrono):
→ Tú esperas ahí parado mientras lo hace
→ No puedes hacer nada más
→ Pierdes tiempo
Asistente en background (asíncrono):
→ Le das la tarea
→ Él trabaja solo
→ Tú continúas con otras cosas
→ Te avisa cuando termina¿Cuándo usar Background Agents?
✅ Úsalos cuando:
1. Tareas largas (>5 minutos)
# Migración masiva
claude --background "Migra todos los archivos JS a TypeScript"
# Mientras tanto, puedes:
# - Revisar PRs
# - Escribir documentación
# - Hacer code review
# - Tomar café ☕2. Refactors masivos
# Actualizar 100+ archivos
claude --background "Actualiza todos los imports para usar la nueva estructura de carpetas"
# O renombrados masivos
claude --background "Renombra oldAPICall a newAPICall en todo el proyecto"3. Generación de contenido extenso
# Documentación completa
claude --background "Genera documentación JSDoc para todos los archivos en src/"
# Tests exhaustivos
claude --background "Genera tests unitarios para todos los módulos en src/services/"4. Análisis exhaustivos
# Auditoría de seguridad
claude --background "Audita todo el código en busca de vulnerabilidades de seguridad"
# Análisis de rendimiento
claude --background "Identifica todos los cuellos de botella de rendimiento en la app"5. Operaciones repetitivas
# Optimización de imágenes
claude --background "Optimiza todas las imágenes en assets/ y actualiza referencias"
# Limpieza de código
claude --background "Elimina todo el código comentado y console.logs del proyecto"❌ NO uses Background Agents cuando:
- Tareas rápidas (<1 min): Overhead no vale la pena
- Necesitas interacción: Background agents no son interactivos
- Tareas exploratorias: "¿Qué hace este código?" requiere conversación
- Debugging iterativo: Necesitas ver resultados y ajustar
Cómo usar Background Agents
Sintaxis básica
claude --background "Tu tarea aquí"
# O la forma corta
claude -b "Tu tarea aquí"Ejemplo 1: Refactor en background
# Iniciar tarea en background
claude --background "Refactoriza todos los componentes en src/components/ para usar React hooks en lugar de class components"
# Output:
Background task started
Task ID: bg_1234567890
Output file: /home/user/.claude/outputs/bg_1234567890.txt
You can:
- Check progress: tail -f /home/user/.claude/outputs/bg_1234567890.txt
- View tasks: /tasks
- Continue working in your terminalAhora tu terminal está libre y Claude trabaja en segundo plano.
Ejemplo 2: Monitorear progreso
# Ver progreso en tiempo real
tail -f ~/.claude/outputs/bg_1234567890.txtOutput:
[11:23:45] Background task started: Refactorizar componentes a hooks
[11:23:46] Analyzing project structure...
[11:23:48] Found 23 class components to refactor
[11:23:50] [1/23] Refactoring UserProfile.tsx...
[11:24:02] ✓ UserProfile.tsx refactored successfully
[11:24:03] [2/23] Refactoring Dashboard.tsx...
[11:24:15] ✓ Dashboard.tsx refactored successfully
[11:24:16] [3/23] Refactoring Settings.tsx...
...Ejemplo 3: Listar tareas en background
# Ver todas las tareas en background
/tasksOutput:
Background Tasks:
ID Status Started Task
─────────────────────────────────────────────────────────────────
bg_1234567890 Running 11:23 AM Refactorizar componentes
bg_0987654321 Completed 10:15 AM Generar documentación
bg_5555555555 Failed 09:30 AM Migrar base de datos
Use /task <id> to view detailsEjemplo 4: Ver detalles de una tarea
# Ver output completo de una tarea específica
/task bg_1234567890Ejemplo 5: Cancelar tarea en background
# Detener una tarea que está corriendo
/cancel bg_1234567890Flujo completo de Background Agent
1. INICIO
┌──────────────────────────────────────┐
│ claude --background "Tarea larga" │
└────────────────┬─────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ Sistema crea background agent │
│ - Asigna ID único │
│ - Crea archivo de output │
│ - Inicia proceso separado │
└────────────────┬─────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ Tu terminal queda LIBRE │
│ Puedes continuar trabajando │
└──────────────────────────────────────┘
2. DURANTE EJECUCIÓN
┌──────────────────────────────────────┐
│ Background agent trabaja │
│ - Lee archivos │
│ - Hace modificaciones │
│ - Ejecuta comandos │
│ - Escribe progreso en archivo │
└────────────────┬─────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ Tú (opcional): │
│ - Monitoreas con tail -f │
│ - O ignoras y haces otras cosas │
└──────────────────────────────────────┘
3. FINALIZACIÓN
┌──────────────────────────────────────┐
│ Agent termina (éxito o error) │
└────────────────┬─────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ Notificación (si configurado) │
│ "Task bg_xxx completed" │
└────────────────┬─────────────────────┘
│
↓
┌──────────────────────────────────────┐
│ Revisas resultado │
│ - Lee output file │
│ - Verifica cambios │
│ - Ejecuta tests │
└──────────────────────────────────────┘Ejemplo práctico completo
Escenario: Migración masiva de archivos
Tienes 150 archivos JavaScript que quieres migrar a TypeScript.
Paso 1: Iniciar background agent
claude --background "Migra todos los archivos .js en src/ a TypeScript:
- Convierte a .ts o .tsx según corresponda
- Añade tipos apropiados (no uses 'any')
- Actualiza imports
- Ejecuta tsc para verificar que compila
- Reporta cualquier archivo problemático"Output:
✓ Background task started
Task ID: bg_ts_migration_001
Output: ~/.claude/outputs/bg_ts_migration_001.txt
Monitor with: tail -f ~/.claude/outputs/bg_ts_migration_001.txtPaso 2: Continuar trabajando
# Tu terminal está libre, puedes hacer otras cosas:
# Revisar un PR
gh pr review 123
# Trabajar en otra feature
git checkout feature/new-auth
# O iniciar otra sesión de Claude
claude
> Ayúdame a diseñar la API para notificacionesPaso 3: Monitorear progreso (opcional)
tail -f ~/.claude/outputs/bg_ts_migration_001.txtOutput:
[14:20:12] Starting TypeScript migration
[14:20:13] Found 150 JavaScript files
[14:20:14] Creating migration plan...
[14:20:20] [1/150] Migrating src/components/Button.js...
[14:20:25] ✓ src/components/Button.tsx created
[14:20:25] - Added Props interface
[14:20:25] - Converted to functional component
[14:20:25] - All types inferred correctly
[14:20:26] [2/150] Migrating src/utils/validator.js...
[14:20:30] ✓ src/utils/validator.ts created
[14:20:30] - Added function signatures
[14:20:30] - Return types explicit
[14:20:31] [3/150] Migrating src/services/api.js...
[14:20:40] ⚠ src/services/api.ts - Type warnings
[14:20:40] - Line 45: Implicit any in response
[14:20:40] - Line 78: Possible null reference
[14:20:41] - FIXED: Added proper types
...
[14:45:23] [150/150] Migrating src/index.js...
[14:45:28] ✓ src/index.ts created
[14:45:30] Running TypeScript compiler...
[14:45:35] ✓ Compilation successful (0 errors)
[14:45:36] MIGRATION COMPLETE
─────────────────────────────────────
Total files: 150
Migrated: 150
Errors: 0
Warnings: 12 (all fixed)
Time: 25 minutes
NEXT STEPS:
1. Review changes: git diff
2. Run tests: npm test
3. Delete old .js files if satisfied
4. Update tsconfig.json if neededPaso 4: Revisar resultados
# Ver el resumen
cat ~/.claude/outputs/bg_ts_migration_001.txt | tail -20
# Ver cambios en git
git status
git diff
# Ejecutar tests
npm testBackground Agents con hooks
Puedes configurar hooks que se ejecuten cuando un background agent termina:
Configuración en settings.json
{
"hooks": {
"Notification": [
{
"matcher": "BackgroundTaskComplete",
"hooks": [
{
"type": "command",
"command": "notify-send 'Claude Code' 'Background task $TASK_ID completed'"
}
]
}
]
}
}Ahora recibirás una notificación del sistema cuando termine.
Manejo de errores en Background Agents
¿Qué pasa si algo falla?
# Inicias tarea
claude --background "Tarea compleja"
# Output después de un tiempo:
[15:30:45] [ERROR] Task failed
[15:30:45] Reason: Permission denied writing to /protected/file.txt
[15:30:45] Files modified before error: 15
[15:30:45] Rollback available: Yes
[15:30:45]
[15:30:45] Options:
[15:30:45] 1. Fix permission issue and retry
[15:30:45] 2. Rollback changes (git reset)
[15:30:45] 3. Continue from file 16Estrategias para manejar errores
1. Checkpoints automáticos
claude --background "Tarea con checkpoints cada 10 archivos"Si falla en el archivo 35, puede retomar desde el checkpoint 30.
2. Modo transaccional
claude --background --transactional "Tarea crítica"Si falla, automáticamente revierte todos los cambios.
3. Dry-run primero
# Primero: simulación
claude --background --dry-run "Tarea riesgosa"
# Si la simulación es buena:
claude --background "Tarea riesgosa"Background Agents vs Parallel Scripts
Background Agent
claude --background "Refactoriza todos los componentes"Características:
- ✅ Claude maneja todo el flujo
- ✅ Decisiones inteligentes en cada archivo
- ✅ Manejo de errores automático
- ❌ Más lento (1 archivo a la vez)
Parallel Script (punto 7.5)
#!/bin/bash
for file in src/components/*.tsx; do
claude -p "Refactoriza $file para usar hooks" &
done
waitCaracterísticas:
- ✅ Muy rápido (múltiples archivos simultáneamente)
- ❌ Requieres escribir el script
- ❌ Menos inteligente (cada instancia es independiente)
- ✅ Más control granular
Cuándo usar cada uno:
| Escenario | Recomendación |
|---|---|
| Archivos con contexto compartido | Background Agent |
| Archivos independientes | Parallel Script |
| Tareas complejas con decisiones | Background Agent |
| Tareas repetitivas simples | Parallel Script |
| Necesitas máxima velocidad | Parallel Script |
| Necesitas máxima inteligencia | Background Agent |
Comandos útiles para Background Agents
# Iniciar background task
claude --background "Tarea"
claude -b "Tarea"
# Listar todas las tasks
/tasks
# Ver detalles de una task
/task <task_id>
# Monitorear en tiempo real
tail -f ~/.claude/outputs/<task_id>.txt
# Cancelar task en ejecución
/cancel <task_id>
# Ver últimas 50 líneas del output
tail -50 ~/.claude/outputs/<task_id>.txt
# Buscar en el output
grep "error" ~/.claude/outputs/<task_id>.txt
# Ver tasks completadas hoy
/tasks --today
# Limpiar tasks antiguas
/tasks --cleanConfiguración avanzada
Timeout personalizado
Por defecto, background agents tienen timeout de 1 hora.
{
"backgroundAgents": {
"timeout": 7200000 // 2 horas en ms
}
}Límite de agents concurrentes
{
"backgroundAgents": {
"maxConcurrent": 3 // Máximo 3 background agents simultáneos
}
}Prioridad de tasks
# Alta prioridad (usa más recursos)
claude --background --priority high "Tarea urgente"
# Baja prioridad (background real, usa recursos sobrantes)
claude --background --priority low "Tarea no urgente"Casos de uso reales
1. Migración de framework
claude --background "Migra toda la app de Create React App a Vite:
- Actualiza configuración
- Cambia imports de archivos estáticos
- Actualiza scripts en package.json
- Actualiza documentación
- Verifica que build funciona"2. Optimización de bundle
claude --background "Optimiza el tamaño del bundle:
- Encuentra dependencias no usadas
- Implementa code splitting donde sea útil
- Optimiza imports (tree shaking)
- Comprime assets
- Genera reporte de tamaño"3. Actualización de dependencias
claude --background "Actualiza todas las dependencias a sus últimas versiones:
- Actualiza package.json
- Ejecuta npm install
- Ejecuta tests
- Reporta breaking changes
- Sugiere fixes para tests que fallan"4. Generación de tests faltantes
claude --background "Genera tests para todos los archivos que no tienen coverage:
- Identifica archivos sin tests
- Genera tests unitarios apropiados
- Verifica que los tests pasen
- Reporta coverage final"5. Limpieza de código legacy
claude --background "Limpia código legacy:
- Elimina funciones no usadas
- Elimina imports no usados
- Elimina código comentado
- Elimina console.logs
- Actualiza sintaxis obsoleta a ES6+
- Reporta cambios realizados"Mejores prácticas
✅ Hazlo
-
Sé específico en la tarea
✅ Bueno: claude -b "Migra componentes a TypeScript, usa tipos explícitos, no uses 'any'" ❌ Malo: claude -b "Mejora el código" -
Incluye validación en la tarea
claude -b "Refactor y luego ejecuta 'npm test' para verificar" -
Pide reportes detallados
claude -b "... y al final genera un resumen de cambios realizados" -
Usa git antes de tareas riesgosas
git commit -am "Checkpoint antes de background task" claude -b "Tarea riesgosa"
⚠️ Evita
-
No uses para tareas interactivas
❌ Malo: claude -b "Ayúdame a diseñar la arquitectura" # Background agents no son interactivos -
No dejes múltiples agents desatendidos
# Si lanzas 5 background agents, al menos monitorea uno -
No uses para tareas críticas sin supervisión
❌ Riesgoso: claude -b "Migra base de datos de producción" # Mejor hazlo supervisado
Debugging de Background Agents
Ver logs completos
# Ver todo el output
cat ~/.claude/outputs/bg_xxx.txt
# Ver solo errores
grep -i "error\|fail\|warning" ~/.claude/outputs/bg_xxx.txt
# Ver progreso
grep "✓\|✗" ~/.claude/outputs/bg_xxx.txtReintentar task fallida
# Si una task falló, puedes ajustar y reintentar
claude --background --resume bg_xxx "Continúa desde donde fallaste"Resumen
Background Agents son perfectos para tareas largas que no requieren interacción:
✅ Libera tu terminal para continuar trabajando ✅ Tareas largas (refactors, migraciones, análisis) ✅ Progreso monitoreable en archivo de output ✅ Notificaciones cuando termina ✅ Independiente de tu sesión principal
Úsalos para:
- Refactors masivos (+50 archivos)
- Migraciones de tecnología
- Generación de tests/documentación
- Auditorías exhaustivas
- Operaciones repetitivas
NO los uses para:
- Tareas rápidas (<1 min)
- Trabajo interactivo
- Debugging iterativo
- Exploración de código
En el siguiente punto (7.5) aprenderemos sobre Massive Parallel Scripting, que combina background agents con paralelismo para máxima velocidad.
Verificación de comprensión
Antes de continuar:
- Entiendes qué es un background agent y cuándo usarlo
- Sabes cómo iniciar tareas en background
- Puedes monitorear el progreso de una tarea
- Conoces los comandos para listar y cancelar tasks
- Comprendes la diferencia entre background agents y parallel scripting
7.5 Massive Parallel Scripting
Objetivo
Dominar técnicas de paralelización masiva para ejecutar múltiples instancias de Claude Code simultáneamente, reduciendo drásticamente el tiempo de ejecución en tareas repetitivas a gran escala.
Introducción
Imagina que tienes 100 archivos que necesitan el mismo tipo de refactor:
# Enfoque secuencial tradicional
Para cada archivo en 100 archivos:
Claude procesa el archivo (30 segundos promedio)
Tiempo total: 100 × 30s = 50 minutosAhora imagina esto:
# Enfoque paralelo
Lanzas 10 instancias de Claude simultáneamente
Cada una procesa 10 archivos
Tiempo total: 10 × 30s = 5 minutos10x más rápido con el mismo resultado.
Esto es Massive Parallel Scripting.
¿Qué es Massive Parallel Scripting?
Massive Parallel Scripting es:
- Ejecutar múltiples instancias de Claude simultáneamente
- Cada instancia trabaja en una porción independiente de la tarea
- Usando scripts bash o herramientas de orquestación
- Para lograr reducción dramática del tiempo total
No es:
- ❌ Background agents (esos son secuenciales)
- ❌ Un solo Claude trabajando en múltiples archivos
- ❌ Magia automática de Claude Code
Es:
- ✅ Tú orquestando múltiples Claudes
- ✅ Scripts bash que lanzan procesos en paralelo
- ✅ División manual de trabajo
- ✅ Control total sobre el paralelismo
Comparación: Secuencial vs Paralelo
Enfoque Secuencial
# Un solo Claude procesa todo
claude -p "Refactoriza todos los archivos en src/"Claude: [Procesando archivo 1...] ████░░░░░░░░░░░░░░░░ 5%
[Procesando archivo 2...] ████████░░░░░░░░░░░░ 10%
[Procesando archivo 3...] ████████████░░░░░░░░ 15%
...
[Procesando archivo 100...] ████████████████████ 100%
Tiempo: 50 minutosEnfoque Paralelo
# 10 Claudes procesando simultáneamente
for file in src/*.ts; do
claude -p "Refactoriza $file" &
done
waitClaude 1: [Archivo 1] ████████████████████ 100%
Claude 2: [Archivo 2] ████████████████████ 100%
Claude 3: [Archivo 3] ████████████████████ 100%
Claude 4: [Archivo 4] ████████████████████ 100%
Claude 5: [Archivo 5] ████████████████████ 100%
Claude 6: [Archivo 6] ████████████████████ 100%
Claude 7: [Archivo 7] ████████████████████ 100%
Claude 8: [Archivo 8] ████████████████████ 100%
Claude 9: [Archivo 9] ████████████████████ 100%
Claude 10: [Archivo 10] ████████████████████ 100%
... (todos al mismo tiempo)
Tiempo: 5 minutosReducción: 90% del tiempo
Cuándo usar Massive Parallel Scripting
✅ Casos ideales
1. Archivos completamente independientes
# Cada archivo puede procesarse sin conocer los demás
for file in src/components/*.tsx; do
claude -p "Añade PropTypes a $file" &
done
wait2. Operaciones repetitivas idénticas
# La misma transformación en muchos archivos
find src/ -name "*.test.ts" | xargs -P 8 -I {} \
claude -p "Migra {} de Jest a Vitest"3. Gran volumen de archivos (50+)
Con 5 archivos → Secuencial está bien (2-3 min)
Con 50 archivos → Paralelo ahorra 40 min
Con 500 archivos → Paralelo ahorra 6-7 horas4. No hay dependencias entre archivos
# ✅ Bueno: cada componente es independiente
for component in components/*.tsx; do
claude -p "Optimiza $component" &
done
# ❌ Malo: archivos con dependencias
# Si A depende de B, hay que procesar B primero❌ NO uses paralelismo cuando:
-
Archivos tienen dependencias entre sí
Si modificas interfaz en A, y B usa A, B debe procesarse DESPUÉS de A -
Necesitas decisiones contextuales
"Refactoriza la arquitectura completa" → Requiere visión holística, no fragmentada -
Tareas que requieren estado compartido
"Renombra todas las variables con el patrón X" → Necesitas consistencia entre archivos -
Pocos archivos (<10)
Overhead de paralelizar > beneficio
Técnicas básicas de paralelización
Técnica 1: Loop con background jobs
#!/bin/bash
# parallel-refactor.sh
for file in src/**/*.ts; do
claude -p "Refactoriza $file para usar async/await" &
done
# Espera a que todos terminen
wait
echo "✅ Todos los archivos procesados"Ventajas:
- ✅ Simple de entender
- ✅ Funciona en cualquier shell
Desventajas:
- ❌ Lanza TODOS los procesos de golpe (puede saturar)
- ❌ Sin límite de concurrencia
Técnica 2: xargs con paralelismo controlado
#!/bin/bash
# parallel-xargs.sh
# -P 8 = máximo 8 procesos en paralelo
find src/ -name "*.tsx" | xargs -P 8 -I {} \
claude -p "Añade tipos TypeScript estrictos a {}"Ventajas:
- ✅ Controla concurrencia (no satura el sistema)
- ✅ Distribuye trabajo automáticamente
- ✅ Built-in en Unix/Linux
Desventajas:
- ❌ Sintaxis menos intuitiva
Técnica 3: GNU Parallel (más poderoso)
#!/bin/bash
# parallel-gnu.sh
# Instalar: sudo apt install parallel (Linux) o brew install parallel (Mac)
find src/ -name "*.ts" | \
parallel -j 8 --bar \
claude -p "Optimiza {}"
# -j 8 = 8 jobs en paralelo
# --bar = muestra barra de progresoVentajas:
- ✅ Control total de concurrencia
- ✅ Barra de progreso visual
- ✅ Manejo avanzado de errores
- ✅ Reintentos automáticos
- ✅ Logging por job
Desventajas:
- ❌ Requiere instalación
Ejemplo completo: Migración masiva
Escenario
Tienes 200 archivos JavaScript que quieres migrar a TypeScript.
Script secuencial (lento)
#!/bin/bash
# migrate-sequential.sh
echo "Iniciando migración secuencial..."
start_time=$(date +%s)
for file in src/**/*.js; do
echo "Migrando $file..."
claude -p "Migra $file a TypeScript con tipos explícitos"
done
end_time=$(date +%s)
duration=$((end_time - start_time))
echo "✅ Migración completada en $duration segundos"Tiempo estimado: ~100 minutos (30s por archivo × 200 archivos)
Script paralelo (rápido)
#!/bin/bash
# migrate-parallel.sh
echo "Iniciando migración paralela..."
start_time=$(date +%s)
# Función para migrar un archivo
migrate_file() {
local file=$1
local ts_file="${file%.js}.ts"
echo "Migrando $file..."
claude -p "Migra $file a TypeScript:
- Usa tipos explícitos (no 'any')
- Convierte a $ts_file
- Mantén la misma funcionalidad
- Añade interfaces para objetos complejos" > /tmp/migrate_$(basename "$file").log 2>&1
if [ $? -eq 0 ]; then
echo "✅ $file migrado exitosamente"
else
echo "❌ Error migrando $file" >&2
return 1
fi
}
export -f migrate_file
# Ejecutar en paralelo (8 a la vez)
find src/ -name "*.js" | \
parallel -j 8 --bar migrate_file {}
end_time=$(date +%s)
duration=$((end_time - start_time))
echo ""
echo "✅ Migración completada en $duration segundos"
echo "Logs disponibles en /tmp/migrate_*.log"Tiempo estimado: ~15 minutos (30s por archivo ÷ 8 procesos paralelos)
Reducción: 85% del tiempo
Orquestación avanzada en fases
Para tareas muy complejas, puedes combinar fases secuenciales y paralelas.
Ejemplo: Modernización completa de codebase
#!/bin/bash
# modernize-codebase.sh
set -e # Exit on error
echo "🚀 Iniciando modernización de codebase"
echo ""
# ═════════════════════════════════════════════════════════════
# FASE 1: Análisis (secuencial)
# ═════════════════════════════════════════════════════════════
echo "📊 FASE 1: Análisis del proyecto"
claude -p "Analiza la estructura del proyecto y lista:
- Archivos que usan sintaxis obsoleta
- Dependencias desactualizadas
- Patrones anti-patrón comunes
Guarda resultado en /tmp/analysis.json" > /tmp/analysis.log
echo "✅ Análisis completado"
echo ""
# ═════════════════════════════════════════════════════════════
# FASE 2: Actualización de dependencias (secuencial)
# ═════════════════════════════════════════════════════════════
echo "📦 FASE 2: Actualizando dependencias"
claude -p "Basándote en /tmp/analysis.json:
- Actualiza package.json con últimas versiones
- Ejecuta npm install
- Verifica que no haya breaking changes
- Reporta cambios necesarios" > /tmp/deps.log
echo "✅ Dependencias actualizadas"
echo ""
# ═════════════════════════════════════════════════════════════
# FASE 3: Migración de sintaxis (PARALELO)
# ═════════════════════════════════════════════════════════════
echo "⚡ FASE 3: Migrando sintaxis (paralelo)"
migrate_syntax() {
local file=$1
claude -p "Moderniza $file:
- Convierte var → const/let
- Convierte callbacks → async/await
- Usa destructuring donde sea apropiado
- Usa template literals
- Arrow functions donde sea apropiado" > /tmp/syntax_$(basename "$file").log 2>&1
}
export -f migrate_syntax
find src/ -name "*.js" | parallel -j 10 --bar migrate_syntax {}
echo "✅ Sintaxis migrada"
echo ""
# ═════════════════════════════════════════════════════════════
# FASE 4: Optimización (PARALELO)
# ═════════════════════════════════════════════════════════════
echo "🔧 FASE 4: Optimizando componentes (paralelo)"
optimize_component() {
local file=$1
claude -p "Optimiza $file:
- Implementa React.memo donde sea útil
- Usa useMemo/useCallback apropiadamente
- Lazy loading de componentes pesados
- Code splitting si es necesario" > /tmp/optimize_$(basename "$file").log 2>&1
}
export -f optimize_component
find src/ -name "*.tsx" -o -name "*.jsx" | \
parallel -j 8 --bar optimize_component {}
echo "✅ Componentes optimizados"
echo ""
# ═════════════════════════════════════════════════════════════
# FASE 5: Tests (PARALELO)
# ═════════════════════════════════════════════════════════════
echo "🧪 FASE 5: Generando tests (paralelo)"
generate_tests() {
local file=$1
claude -p "Genera tests completos para $file:
- Casos happy path
- Casos edge
- Casos de error
- Coverage mínimo 80%" > /tmp/test_$(basename "$file").log 2>&1
}
export -f generate_tests
find src/ -name "*.ts" -o -name "*.tsx" | \
grep -v ".test." | \
parallel -j 6 --bar generate_tests {}
echo "✅ Tests generados"
echo ""
# ═════════════════════════════════════════════════════════════
# FASE 6: Verificación final (secuencial)
# ═════════════════════════════════════════════════════════════
echo "✔️ FASE 6: Verificación final"
claude -p "Ejecuta verificación final:
- npm run build (verifica que compile)
- npm test (verifica que tests pasen)
- npm run lint (verifica linting)
- Genera reporte de cobertura
Guarda resultado en /tmp/final-report.md" > /tmp/verification.log
echo "✅ Verificación completada"
echo ""
# ═════════════════════════════════════════════════════════════
# RESUMEN
# ═════════════════════════════════════════════════════════════
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "🎉 MODERNIZACIÓN COMPLETADA"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
cat /tmp/final-report.md
echo ""
echo "Logs detallados disponibles en /tmp/"Flujo visual
SECUENCIAL PARALELO SECUENCIAL
↓ ↓ ↓
┌─────────┐ ┌──────────────┐ ┌──────────┐
│Análisis │ → │ 10 Claudes │ → │Verificar │
│ (1 min) │ │ migrando │ │ (2 min) │
└─────────┘ │ sintaxis │ └──────────┘
│ (5 min) │
┌─────────┐ └──────────────┘
│Deps │ → ┌──────────────┐
│ (2 min) │ │ 8 Claudes │
└─────────┘ │ optimizando │
│ (4 min) │
└──────────────┘
↓
┌──────────────┐
│ 6 Claudes │
│ generando │
│ tests │
│ (6 min) │
└──────────────┘
Tiempo total: ~20 minutos
(vs 200+ minutos secuencial)Control de concurrencia
¿Cuántos procesos en paralelo?
# Regla general:
# Número de CPUs × 1.5
# En Linux/Mac:
CPUS=$(nproc) # o $(sysctl -n hw.ncpu) en Mac
JOBS=$((CPUS * 3 / 2))
parallel -j $JOBS ...Consideraciones
| CPUs | Claude instances | Razonamiento |
|---|---|---|
| 4 | 6 | No saturar, dejar recursos para sistema |
| 8 | 12 | Balance óptimo |
| 16 | 24 | Máximo aprovechamiento |
Más no siempre es mejor:
- Cada Claude consume memoria (~500MB)
- Demasiados procesos = thrashing
- Rate limits de API pueden aplicar
Manejo de errores en paralelo
Problema: Un archivo falla, ¿qué hacer?
Estrategia 1: Continuar con los demás
#!/bin/bash
process_file() {
local file=$1
if claude -p "Procesa $file" 2>&1 | tee /tmp/log_$file.txt; then
echo "✅ $file OK"
else
echo "❌ $file FAILED" >> /tmp/failures.txt
# No retornar error, continuar con otros
fi
}
export -f process_file
find src/ -name "*.ts" | parallel -j 8 process_file {}
# Al final, revisar fallos
if [ -f /tmp/failures.txt ]; then
echo "⚠️ Algunos archivos fallaron:"
cat /tmp/failures.txt
fiEstrategia 2: Reintentar fallos
#!/bin/bash
# Primera pasada
find src/ -name "*.ts" | \
parallel -j 8 --joblog /tmp/joblog.txt \
claude -p "Procesa {}"
# Reintentar solo los que fallaron
parallel -j 8 --retry-failed --joblog /tmp/joblog.txtEstrategia 3: Detener todo si uno falla
#!/bin/bash
# --halt soon,fail=1 = detiene si 1 job falla
find src/ -name "*.ts" | \
parallel -j 8 --halt soon,fail=1 \
claude -p "Procesa {}"Logging y monitoreo
Logs separados por archivo
#!/bin/bash
process_file() {
local file=$1
local logfile="/tmp/logs/$(basename $file).log"
{
echo "═══════════════════════════════════════"
echo "Procesando: $file"
echo "Inicio: $(date)"
echo "═══════════════════════════════════════"
claude -p "Procesa $file"
echo ""
echo "Fin: $(date)"
} > "$logfile" 2>&1
echo "✅ $file → $logfile"
}
export -f process_file
mkdir -p /tmp/logs
find src/ -name "*.ts" | parallel -j 8 process_file {}
echo ""
echo "Todos los logs en: /tmp/logs/"Dashboard en tiempo real
#!/bin/bash
# Terminal 1: Ejecutar procesamiento
find src/ -name "*.ts" | \
parallel -j 8 --bar --joblog /tmp/jobs.log \
claude -p "Procesa {}"
# Terminal 2: Monitorear progreso
watch -n 1 'cat /tmp/jobs.log | tail -20'Resumen final automático
#!/bin/bash
# ... (procesamiento paralelo)
# Al final, generar resumen
claude -p "Lee todos los logs en /tmp/logs/ y genera un resumen:
- Total de archivos procesados
- Archivos exitosos vs fallidos
- Tipos de errores comunes
- Tiempo total aproximado
- Recomendaciones
Guarda en /tmp/summary.md"
cat /tmp/summary.mdCasos de uso avanzados
1. Pipeline de CI/CD paralelo
#!/bin/bash
# ci-parallel.sh
echo "🔄 CI Pipeline con paralelización"
# Fase 1: Tests en paralelo por módulo
echo "Ejecutando tests..."
ls src/modules/ | parallel -j 8 \
"claude -p 'Ejecuta tests para módulo {} y reporta coverage'"
# Fase 2: Builds en paralelo
echo "Builds..."
parallel -j 4 ::: \
"claude -p 'Build frontend para producción'" \
"claude -p 'Build backend para producción'" \
"claude -p 'Build mobile para Android'" \
"claude -p 'Build mobile para iOS'"
# Fase 3: Security scans en paralelo
echo "Security scans..."
parallel -j 3 ::: \
"claude -p 'Ejecuta npm audit y reporta vulnerabilidades'" \
"claude -p 'Ejecuta OWASP dependency check'" \
"claude -p 'Escanea código con SonarQube'"
echo "✅ CI completado"2. Migración multi-framework
#!/bin/bash
# multi-framework-migration.sh
# Migrar diferentes partes del monorepo en paralelo
parallel -j 4 ::: \
"claude -p 'Migra packages/web de Webpack a Vite'" \
"claude -p 'Migra packages/api de Express a Fastify'" \
"claude -p 'Migra packages/mobile de RN 0.69 a 0.73'" \
"claude -p 'Migra packages/shared de JS a TS'"3. Generación masiva de contenido
#!/bin/bash
# generate-docs.sh
# Generar documentación para cada módulo en paralelo
find src/ -type d -name "module-*" | \
parallel -j 6 \
"claude -p 'Genera README.md completo para {} con:
- Descripción del módulo
- API documentation
- Ejemplos de uso
- Diagramas de arquitectura (en Mermaid)'"4. Refactor masivo con patrón específico
#!/bin/bash
# refactor-pattern.sh
# Aplicar patrón Repository en todos los services
find src/services/ -name "*.service.ts" | \
parallel -j 8 \
"claude -p 'Refactoriza {} para usar patrón Repository:
- Separa lógica de acceso a datos
- Crea interfaz IRepository
- Implementa cache layer
- Mantén tests actualizados'"Mejores prácticas
✅ Hazlo
-
Divide el trabajo en chunks independientes
# Cada archivo puede procesarse sin conocer otros for file in src/*.ts; do claude -p "Procesa $file" & done wait -
Controla la concurrencia
# No lances 1000 procesos simultáneamente parallel -j 8 ... # Límite razonable -
Logea todo
# Cada proceso guarda su log claude -p "..." > /tmp/log_$i.txt 2>&1 -
Verifica al final
# Después del paralelismo, verifica integridad claude -p "Verifica que todos los archivos compilen" npm test -
Haz backup antes
git commit -am "Checkpoint antes de procesamiento masivo" # Ahora sí, paraleliza
⚠️ Evita
-
No paralelices archivos con dependencias
❌ Malo: Si A importa B, pueden procesarse en orden incorrecto -
No satures el sistema
❌ Malo: Lanzar 100 Claude instances en laptop de 4 CPUs -
No ignores errores
❌ Malo: Continuar sin revisar si algunos jobs fallaron -
No uses para tareas que requieren contexto compartido
❌ Malo: "Rediseña la arquitectura" → requiere visión holística
Comparación final
| Criterio | Secuencial | Background Agent | Parallel Scripting |
|---|---|---|---|
| Velocidad | Lento | Medio | Muy rápido |
| Complejidad | Bajo | Bajo | Medio-Alto |
| Control | Alto | Medio | Muy alto |
| Uso de recursos | Bajo | Bajo-Medio | Alto |
| Mejor para | Tareas simples | Tareas largas | Volumen masivo |
| Dependencias | Sí puede manejar | Sí puede manejar | No, solo independientes |
| Interactividad | Sí | No | No |
Resumen
Massive Parallel Scripting es la técnica más poderosa para:
✅ Máxima velocidad en tareas repetitivas ✅ Gran volumen de archivos (50+, 100+, 1000+) ✅ Archivos independientes sin dependencias ✅ Reducción 80-95% del tiempo de ejecución
Úsalo para:
- Migraciones masivas (JS → TS, framework changes)
- Refactors a escala (cambiar patrones en 100+ archivos)
- Generación de contenido (docs, tests para todo el proyecto)
- Optimizaciones (todos los componentes, todas las imágenes)
NO lo uses para:
- Archivos con dependencias entre sí
- Tareas que requieren visión holística
- Pocos archivos (<10)
- Decisiones arquitectónicas
Herramientas clave:
¶ background jobsxargs -Ppara paralelismo simpleGNU parallelpara máximo control
Próximo paso: En la práctica del módulo, combinarás todas las técnicas aprendidas (subagentes, Plan Mode, Background Agents, Parallel Scripting) en un proyecto real.
Verificación de comprensión
Antes de continuar:
- Entiendes la diferencia entre secuencial, background y paralelo
- Sabes cuándo usar paralelización masiva
- Conoces las herramientas básicas (xargs, parallel)
- Comprendes cómo controlar la concurrencia
- Puedes identificar tareas aptas para paralelización
- Sabes manejar errores en procesamiento paralelo
Práctica del Módulo 7: Subagentes y Paralelismo
Objetivo
Aplicar todos los conceptos aprendidos sobre subagentes, Plan Mode, Background Agents y Massive Parallel Scripting en un proyecto real de migración y modernización de codebase.
Contexto del proyecto
Has heredado un proyecto legacy con las siguientes características:
proyecto-legacy/
├── src/
│ ├── components/ (50 componentes en class components)
│ ├── services/ (20 servicios con callbacks)
│ ├── utils/ (15 archivos con var y sintaxis ES5)
│ └── pages/ (12 páginas sin optimizar)
├── tests/ (Cobertura: 30%)
└── docs/ (Documentación desactualizada)Problemas detectados:
- ❌ Componentes React en class components (deben migrar a hooks)
- ❌ Código con callbacks (debe migrar a async/await)
- ❌ Sintaxis ES5 (var, function, etc.)
- ❌ Sin tipos TypeScript
- ❌ Tests insuficientes
- ❌ Documentación inexistente o desactualizada
- ❌ Sin optimizaciones de rendimiento
Tu misión: Modernizar completamente este proyecto usando las técnicas de subagentes y paralelismo aprendidas.
Ejercicio 1: Planificación con Plan Mode ⭐
Objetivo: Usar Plan Mode para diseñar la estrategia de modernización.
Tarea
-
Activa Plan Mode:
claude --plan -
Pide a Claude que cree un plan completo de modernización:
Necesito modernizar un proyecto legacy React. El proyecto tiene: - 50 componentes en class components - 20 servicios con callbacks - 15 archivos utils con sintaxis ES5 - 12 páginas sin optimizar - Cobertura de tests del 30% Crea un plan detallado de modernización que incluya: - Orden de fases - Qué hacer en cada fase - Archivos afectados - Riesgos identificados - Estimación de complejidad -
Revisa el plan generado y haz ajustes:
- ¿Faltan consideraciones?
- ¿El orden es correcto?
- ¿Hay riesgos no identificados?
-
Guarda el plan aprobado en un archivo:
# Copia el plan a un archivo code plan-modernizacion.md
Criterios de éxito
- Plan tiene fases claras y secuenciales
- Identifica archivos específicos a modificar
- Menciona riesgos y mitigaciones
- Incluye fase de validación/testing
- Has hecho al menos 2 ajustes al plan original
Entregable
plan-modernizacion.mdcon el plan completo aprobado
Ejercicio 2: Exploración con subagente Explore ⭐⭐
Objetivo: Usar el subagente Explore para analizar el proyecto en profundidad.
Tarea
En tu sesión de Claude, pide:
Explora completamente el proyecto y genera un reporte que incluya:
1. Estructura de carpetas y archivos
2. Lista completa de dependencias
3. Patrones de código detectados (buenos y malos)
4. Archivos que usan sintaxis obsoleta
5. Componentes sin tests
6. Código duplicado o similar
7. Oportunidades de optimizaciónClaude invocará automáticamente el subagente Explore para esto.
Criterios de éxito
- Reporte identifica al menos 10 archivos con sintaxis obsoleta
- Lista componentes sin tests
- Detecta patrones anti-patrón
- Identifica código duplicado
- Propone optimizaciones específicas
Entregable
reporte-exploracion.mdcon el análisis completo
Ejercicio 3: Migración secuencial con subagente especializado ⭐
Objetivo: Usar subagentes especializados para tareas específicas.
Tarea 1: Code Review con subagente Reviewer
Selecciona 3 archivos críticos del proyecto y pide:
Audita estos archivos en busca de:
- Vulnerabilidades de seguridad
- Bugs potenciales
- Problemas de rendimiento
- Violaciones de mejores prácticas
Archivos:
- src/services/authService.js
- src/components/UserProfile.jsx
- src/utils/apiClient.jsTarea 2: Generación de tests con subagente Tester
Para los mismos 3 archivos:
Genera tests completos con:
- Casos happy path
- Casos edge
- Casos de error
- Mocks apropiados
- Coverage mínimo 80%Criterios de éxito
- Code review identifica al menos 5 problemas (total)
- Tests generados cubren casos principales
- Tests son ejecutables (sin errores de sintaxis)
- Se usan mocks apropiadamente
Entregables
code-review-results.mdcon hallazgos- Tests generados en archivos
.test.js
Ejercicio 4: Background Agent para tarea larga ⭐⭐
Objetivo: Usar Background Agent para una tarea que toma tiempo.
Tarea
Genera documentación completa para todos los servicios en background:
claude --background "Genera documentación JSDoc completa para todos los archivos en src/services/:
- Descripción de cada función
- Parámetros con tipos
- Valores de retorno
- Ejemplos de uso
- Posibles errores
Guarda la documentación dentro de cada archivo"Mientras el background agent trabaja
-
Monitorea el progreso:
# Anota el Task ID que te dieron tail -f ~/.claude/outputs/<task_id>.txt -
Continúa con otra tarea (Ejercicio 5) mientras esto corre
-
Al terminar, revisa los resultados:
/task <task_id>
Criterios de éxito
- Background agent completó sin errores
- Todos los archivos en src/services/ tienen JSDoc
- JSDoc incluye ejemplos de uso
- Pudiste trabajar en otra cosa mientras corría
Entregable
- Captura de pantalla o log del background agent completado
- Al menos 2 archivos de servicios con JSDoc generado
Ejercicio 5: Massive Parallel Scripting ⭐⭐⭐
Objetivo: Usar paralelización masiva para refactorizar múltiples archivos.
Tarea 1: Migrar componentes a hooks (en paralelo)
Crea un script que migre todos los class components a hooks en paralelo:
#!/bin/bash
# migrate-to-hooks.sh
echo "🚀 Migrando componentes a hooks en paralelo"
migrate_component() {
local file=$1
local logfile="/tmp/migrate_$(basename $file).log"
echo "Migrando $file..."
claude -p "Migra $file de class component a hooks:
- Convierte a functional component
- Usa useState, useEffect, etc.
- Mantén la misma funcionalidad
- Preserva PropTypes o añade TypeScript types
- Asegura que compile sin errores" > "$logfile" 2>&1
if [ $? -eq 0 ]; then
echo "✅ $file migrado"
else
echo "❌ $file falló" >&2
fi
}
export -f migrate_component
# Ejecutar en paralelo (8 a la vez)
find src/components/ -name "*.jsx" -o -name "*.js" | \
parallel -j 8 --bar migrate_component {}
echo "✅ Migración completada"
echo "Logs en /tmp/migrate_*.log"Tarea 2: Modernizar sintaxis en utils (en paralelo)
#!/bin/bash
# modernize-utils.sh
echo "⚡ Modernizando sintaxis en utils"
modernize_file() {
local file=$1
claude -p "Moderniza $file:
- Convierte var → const/let
- Convierte function → arrow functions donde sea apropiado
- Usa destructuring
- Usa template literals
- Usa spread operator
- Convierte callbacks a async/await si aplica" > /tmp/modernize_$(basename $file).log 2>&1
echo "✅ $file modernizado"
}
export -f modernize_file
find src/utils/ -name "*.js" | parallel -j 8 modernize_file {}
echo "✅ Modernización completada"Tarea 3: Script maestro con fases
Crea un script que orqueste todo el proceso:
#!/bin/bash
# modernize-all.sh
set -e
echo "🎯 MODERNIZACIÓN COMPLETA DEL PROYECTO"
echo ""
# Backup
echo "📦 Creando backup..."
git add -A
git commit -m "Checkpoint antes de modernización automática"
# FASE 1: Análisis (secuencial)
echo "📊 FASE 1: Analizando proyecto..."
claude -p "Analiza el proyecto y guarda hallazgos en /tmp/analysis.json" > /tmp/analysis.log
# FASE 2: Componentes (paralelo)
echo "⚡ FASE 2: Migrando componentes a hooks (paralelo)..."
bash migrate-to-hooks.sh
# FASE 3: Utils (paralelo)
echo "⚡ FASE 3: Modernizando utils (paralelo)..."
bash modernize-utils.sh
# FASE 4: Verificación (secuencial)
echo "✔️ FASE 4: Verificando cambios..."
npm run build
npm test
echo ""
echo "🎉 MODERNIZACIÓN COMPLETADA"Criterios de éxito
- Script
migrate-to-hooks.shfunciona y migra al menos 5 componentes - Script
modernize-utils.shfunciona y moderniza al menos 3 archivos - Usas
paralleloxargs -Ppara paralelización - Script maestro ejecuta fases en orden correcto
- Al menos 8 procesos corriendo simultáneamente
Entregables
migrate-to-hooks.shmodernize-utils.shmodernize-all.sh- Captura de pantalla mostrando múltiples procesos en paralelo
- Reporte de tiempo: ¿cuánto tardó paralelo vs estimación secuencial?
Ejercicio 6: Orquestación completa ⭐⭐⭐⭐
Objetivo: Combinar todas las técnicas en un flujo completo.
Tarea
Crea un pipeline completo que:
- Usa Plan Mode para definir estrategia
- Usa Explore para análisis inicial
- Usa Reviewer para auditar archivos críticos
- Usa Background Agent para documentación
- Usa Parallel Scripting para migración masiva
- Verifica con tests al final
Script de orquestación
#!/bin/bash
# full-modernization-pipeline.sh
set -e
echo "═══════════════════════════════════════════════════════"
echo " PIPELINE COMPLETO DE MODERNIZACIÓN"
echo "═══════════════════════════════════════════════════════"
echo ""
# ═══════════════════════════════════════════════════════
# PASO 1: PLANIFICACIÓN
# ═══════════════════════════════════════════════════════
echo "📋 PASO 1: Generando plan de modernización..."
claude --plan <<EOF
Crea un plan detallado para modernizar este proyecto:
- 50 componentes React class → hooks
- 20 servicios callbacks → async/await
- 15 utils ES5 → ES6+
- Mejorar coverage de tests
- Generar documentación
Guarda el plan en plan.md
EOF
read -p "¿Aprobar plan y continuar? (y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Pipeline cancelado"
exit 1
fi
# ═══════════════════════════════════════════════════════
# PASO 2: ANÁLISIS
# ═══════════════════════════════════════════════════════
echo ""
echo "📊 PASO 2: Análisis exhaustivo del proyecto..."
claude -p "Explora el proyecto completamente y genera reporte en analysis-report.md"
# ═══════════════════════════════════════════════════════
# PASO 3: AUDITORÍA DE SEGURIDAD
# ═══════════════════════════════════════════════════════
echo ""
echo "🔒 PASO 3: Auditoría de seguridad..."
claude -p "Audita seguridad de:
- src/services/authService.js
- src/services/apiClient.js
- src/utils/tokenManager.js
Genera security-report.md"
# ═══════════════════════════════════════════════════════
# PASO 4: BACKUP
# ═══════════════════════════════════════════════════════
echo ""
echo "💾 PASO 4: Creando backup..."
git add -A
git commit -m "Pre-modernization checkpoint - $(date)"
# ═══════════════════════════════════════════════════════
# PASO 5: DOCUMENTACIÓN EN BACKGROUND
# ═══════════════════════════════════════════════════════
echo ""
echo "📚 PASO 5: Generando documentación (background)..."
TASK_ID=$(claude --background "Genera JSDoc para todos los archivos en src/" | grep "Task ID:" | awk '{print $3}')
echo "Background task iniciado: $TASK_ID"
# ═══════════════════════════════════════════════════════
# PASO 6: MIGRACIÓN PARALELA
# ═══════════════════════════════════════════════════════
echo ""
echo "⚡ PASO 6: Migración masiva en paralelo..."
# Sub-paso 6a: Componentes
echo " 6a. Migrando componentes a hooks..."
find src/components/ -name "*.jsx" | \
parallel -j 8 --bar \
"claude -p 'Migra {} a hooks' > /tmp/component_{#}.log 2>&1"
# Sub-paso 6b: Servicios
echo " 6b. Convirtiendo callbacks a async/await..."
find src/services/ -name "*.js" | \
parallel -j 6 --bar \
"claude -p 'Convierte callbacks a async/await en {}' > /tmp/service_{#}.log 2>&1"
# Sub-paso 6c: Utils
echo " 6c. Modernizando sintaxis ES6+..."
find src/utils/ -name "*.js" | \
parallel -j 8 --bar \
"claude -p 'Moderniza sintaxis en {}' > /tmp/util_{#}.log 2>&1"
# ═══════════════════════════════════════════════════════
# PASO 7: GENERACIÓN DE TESTS (PARALELO)
# ═══════════════════════════════════════════════════════
echo ""
echo "🧪 PASO 7: Generando tests faltantes..."
find src/ -name "*.js" -o -name "*.jsx" | \
grep -v ".test." | \
parallel -j 6 --bar \
"claude -p 'Genera tests para {}' > /tmp/test_{#}.log 2>&1"
# ═══════════════════════════════════════════════════════
# PASO 8: VERIFICACIÓN
# ═══════════════════════════════════════════════════════
echo ""
echo "✅ PASO 8: Verificación final..."
echo " - Instalando dependencias..."
npm install
echo " - Ejecutando linter..."
npm run lint --fix || echo "⚠️ Warnings de linter (revisar)"
echo " - Compilando..."
npm run build || {
echo "❌ Build falló. Revisar errores."
exit 1
}
echo " - Ejecutando tests..."
npm test || {
echo "⚠️ Algunos tests fallaron. Revisar."
}
# ═══════════════════════════════════════════════════════
# PASO 9: ESPERAR BACKGROUND TASK
# ═══════════════════════════════════════════════════════
echo ""
echo "⏳ PASO 9: Esperando documentación en background..."
while /task $TASK_ID | grep -q "Running"; do
echo " Aún generando documentación..."
sleep 10
done
echo "✅ Documentación completada"
# ═══════════════════════════════════════════════════════
# PASO 10: REPORTE FINAL
# ═══════════════════════════════════════════════════════
echo ""
echo "📊 PASO 10: Generando reporte final..."
claude -p "Genera reporte final de la modernización:
- Archivos modificados
- Mejoras realizadas
- Problemas encontrados
- Coverage de tests actual
- Próximos pasos recomendados
Guarda en MODERNIZATION-REPORT.md"
# ═══════════════════════════════════════════════════════
# RESUMEN
# ═══════════════════════════════════════════════════════
echo ""
echo "═══════════════════════════════════════════════════════"
echo " ✅ PIPELINE COMPLETADO"
echo "═══════════════════════════════════════════════════════"
echo ""
echo "📁 Archivos generados:"
echo " - plan.md"
echo " - analysis-report.md"
echo " - security-report.md"
echo " - MODERNIZATION-REPORT.md"
echo ""
echo "📊 Logs de migración:"
echo " - /tmp/component_*.log"
echo " - /tmp/service_*.log"
echo " - /tmp/util_*.log"
echo " - /tmp/test_*.log"
echo ""
echo "🔍 Próximos pasos:"
echo " 1. Revisar MODERNIZATION-REPORT.md"
echo " 2. Revisar tests que fallaron (si hubo)"
echo " 3. Hacer commit de cambios"
echo " 4. Crear PR para review"
echo ""Criterios de éxito
- Pipeline ejecuta todos los pasos sin errores críticos
- Usa Plan Mode al inicio
- Usa subagente Explore para análisis
- Ejecuta migración en paralelo (múltiples archivos simultáneos)
- Background task completa exitosamente
- Verifica con build y tests al final
- Genera reportes en cada fase
- Tiempo total < 30 minutos (vs 3-4 horas secuencial estimado)
Entregable
full-modernization-pipeline.shfuncional- Captura de pantalla de ejecución
MODERNIZATION-REPORT.mdgenerado- Cálculo de tiempo ahorrado (paralelo vs secuencial estimado)
Ejercicio 7: Reflexión y análisis ⭐
Objetivo: Reflexionar sobre lo aprendido y optimizar el proceso.
Preguntas
-
¿Cuándo usaste cada tipo de subagente?
- Documenta qué subagente usaste para cada tarea y por qué
-
¿Qué ventajas encontraste en Plan Mode?
- ¿Te ahorró tiempo?
- ¿Evitó errores?
- ¿Cuándo lo usarías en proyectos reales?
-
Background Agents vs Parallel Scripting:
- ¿Cuándo preferirías uno sobre otro?
- ¿Hubo casos donde uno fue claramente mejor?
-
Optimización del paralelismo:
- ¿Cuántos procesos en paralelo usaste?
- ¿Fue el número óptimo?
- ¿Qué pasó si intentaste con más/menos?
-
Errores y aprendizajes:
- ¿Qué errores encontraste?
- ¿Cómo los resolviste?
- ¿Qué harías diferente la próxima vez?
Entregable
reflexion.mdcon respuestas detalladas a las 5 preguntas
Criterios de evaluación general
| Criterio | Peso | Descripción |
|---|---|---|
| Planificación | 15% | Uso efectivo de Plan Mode |
| Exploración | 10% | Análisis exhaustivo con Explore |
| Subagentes especializados | 15% | Uso correcto de Reviewer/Tester |
| Background Agents | 15% | Tarea larga ejecutada correctamente |
| Parallel Scripting | 25% | Scripts paralelos funcionales |
| Orquestación | 15% | Pipeline completo que integra todo |
| Reflexión | 5% | Análisis y aprendizajes documentados |
Entregables finales
Al completar la práctica, debes tener:
practica-modulo-7/
├── plan-modernizacion.md
├── reporte-exploracion.md
├── code-review-results.md
├── tests/
│ ├── authService.test.js
│ ├── UserProfile.test.jsx
│ └── apiClient.test.js
├── scripts/
│ ├── migrate-to-hooks.sh
│ ├── modernize-utils.sh
│ ├── modernize-all.sh
│ └── full-modernization-pipeline.sh
├── reportes/
│ ├── analysis-report.md
│ ├── security-report.md
│ └── MODERNIZATION-REPORT.md
├── capturas/
│ ├── background-agent.png
│ ├── parallel-execution.png
│ └── pipeline-complete.png
└── reflexion.mdRecursos adicionales
Proyecto de ejemplo
Si no tienes un proyecto legacy a mano, puedes crear uno de prueba:
# Clonar proyecto legacy de ejemplo
git clone https://github.com/example/legacy-react-project
cd legacy-react-project
# O crear uno simple con Create React App (versión vieja)
npx create-react-app@4 my-legacy-project
cd my-legacy-project
# Añadir componentes class para practicarComandos útiles de referencia
# Plan Mode
claude --plan
# Background Agent
claude --background "Tarea"
/tasks
/task <id>
# Parallel con xargs
find . -name "*.js" | xargs -P 8 -I {} claude -p "Procesa {}"
# Parallel con GNU Parallel
find . -name "*.js" | parallel -j 8 claude -p "Procesa {}"
# Monitorear background
tail -f ~/.claude/outputs/<task_id>.txtTips para el éxito
- Empieza pequeño: Prueba primero con 3-5 archivos antes de escalar a 50
- Guarda logs: Siempre redirige output a archivos para debugging
- Haz backups: Git commit antes de cada fase importante
- Monitorea recursos: Vigila CPU/RAM al correr en paralelo
- Itera: Si un enfoque no funciona, ajusta y reintenta
- Documenta: Anota decisiones y aprendizajes mientras trabajas
¿Listo para el desafío?
Esta práctica integra todo lo aprendido en el módulo. Al completarla, habrás:
✅ Dominado Plan Mode para planificación ✅ Usado subagentes especializados efectivamente ✅ Ejecutado tareas largas en background ✅ Implementado paralelización masiva ✅ Orquestado flujos complejos ✅ Reducido tiempos de ejecución en 80-90%
¡Manos a la obra! 🚀