10Modulo 10

Claude Code SDK

40 min

Claude Code no es solo una herramienta CLI interactiva. También funciona como un SDK (Software Development Kit) que puedes usar para construir tus propios agentes, automatizaciones y herramientas personalizadas.


Dos caras de Claude Code

CLI Interactivo (lo que has usado hasta ahora)

claude
 
> Implementa autenticación JWT
[Conversación interactiva]

Características:

  • Conversación humano-agente
  • Modo interactivo en terminal
  • Respuestas en tiempo real
  • Ideal para desarrollo manual

SDK Programático (lo que aprenderás ahora)

import { ClaudeCode } from '@anthropic-ai/claude-code';
 
const agent = new ClaudeCode({
  model: 'claude-sonnet-4-20250514'
});
 
const result = await agent.run('Analiza este código');

Características:

  • Automatización completa
  • Integración en scripts y aplicaciones
  • Orquestación de múltiples agentes
  • Ideal para pipelines y workflows

¿Por qué usar Claude Code como SDK?

1. Automatización de tareas repetitivas

En lugar de ejecutar manualmente la misma tarea múltiples veces:

❌ Manualmente (repetitivo):

# Terminal 1
claude
> Refactoriza src/auth/login.ts
 
# Terminal 2
claude
> Refactoriza src/auth/register.ts
 
# Terminal 3
claude
> Refactoriza src/auth/logout.ts

✅ Con SDK (automatizado):

const files = ['login.ts', 'register.ts', 'logout.ts'];
 
for (const file of files) {
  await agent.run(`Refactoriza src/auth/${file}`);
}

2. Integración en pipelines CI/CD

// En GitHub Actions, GitLab CI, etc.
const codeReview = await agent.run('Revisa los cambios del PR');
await postComment(codeReview);

3. Agentes especializados

Crear agentes con comportamiento específico:

const securityAuditor = new ClaudeCode({
  systemPrompt: 'Eres un experto en seguridad. Busca vulnerabilidades OWASP.',
  model: 'claude-opus-4-5-20251101' // Modelo más potente
});
 
const performanceAnalyzer = new ClaudeCode({
  systemPrompt: 'Analiza rendimiento y sugiere optimizaciones.',
  model: 'claude-sonnet-4-20250514'
});

4. Workflows complejos

Combinar múltiples agentes para tareas complejas:

// 1. Planning
const plan = await planningAgent.run('Diseña arquitectura de auth');
 
// 2. Implementation
const code = await codeAgent.run(`Implementa según: ${plan}`);
 
// 3. Review
const review = await reviewAgent.run(`Revisa: ${code}`);
 
// 4. Testing
const tests = await testAgent.run('Genera tests');

Instalación y configuración

Instalación

# Como dependencia de proyecto
npm install @anthropic-ai/claude-code
 
# O global
npm install -g @anthropic-ai/claude-code

Configuración de API key

El SDK necesita acceso a la API de Anthropic.

Opción 1: Variable de entorno

export ANTHROPIC_API_KEY="tu-api-key-aqui"

Opción 2: Archivo .env

# .env
ANTHROPIC_API_KEY=tu-api-key-aqui
import dotenv from 'dotenv';
dotenv.config();

Opción 3: Configuración directa

const agent = new ClaudeCode({
  apiKey: process.env.ANTHROPIC_API_KEY,
  model: 'claude-sonnet-4-20250514'
});

API básica

Crear agente

import { ClaudeCode } from '@anthropic-ai/claude-code';
 
const agent = new ClaudeCode({
  // Modelo a usar
  model: 'claude-sonnet-4-20250514',
 
  // System prompt (personaliza comportamiento)
  systemPrompt: 'Eres un experto en TypeScript y Node.js',
 
  // Tools disponibles
  tools: ['Read', 'Write', 'Edit', 'Bash', 'Grep', 'Glob'],
 
  // Configuración adicional
  maxTokens: 4096,
  temperature: 0.7
});

Ejecutar tarea

// Ejecución simple
const result = await agent.run('Analiza src/index.ts');
 
console.log(result.output);
// "Este archivo es el punto de entrada de la aplicación..."
 
// Ejecución con contexto
const result = await agent.run('Implementa validateEmail', {
  context: {
    files: ['src/utils/validators.ts'],
    CLAUDE_MD: './CLAUDE.md'
  }
});

Ejecución con opciones

const result = await agent.run('Genera reporte de cobertura', {
  // Working directory
  cwd: '/path/to/project',
 
  // Timeout (ms)
  timeout: 300000, // 5 minutos
 
  // Streaming de respuesta
  stream: true,
  onChunk: (chunk) => {
    process.stdout.write(chunk);
  }
});

Configuración de agentes

System Prompt

El system prompt define el comportamiento y expertise del agente.

Ejemplo: Agente de refactoring

const refactorAgent = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Eres un experto en refactoring de código.
 
    Principios que sigues:
    - DRY (Don't Repeat Yourself)
    - SOLID
    - Nombres descriptivos
    - Funciones pequeñas y enfocadas
 
    Siempre:
    - Explica qué cambios hiciste y por qué
    - Mantén los tests pasando
    - Prioriza legibilidad sobre brevedad
  `
});

Ejemplo: Agente de documentación

const docAgent = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Generas documentación técnica clara y completa.
 
    Formato:
    - Markdown
    - Ejemplos de código funcionales
    - Casos de uso
    - Errores comunes y soluciones
 
    Audiencia: Desarrolladores con experiencia intermedia
  `
});

Tools disponibles

Puedes limitar qué herramientas puede usar el agente:

// Agente solo lectura
const readOnlyAgent = new ClaudeCode({
  tools: ['Read', 'Grep', 'Glob'],
  // NO puede usar Write, Edit, Bash
});
 
// Agente con permisos completos
const fullAgent = new ClaudeCode({
  tools: ['Read', 'Write', 'Edit', 'Bash', 'Grep', 'Glob']
});
 
// Agente de análisis (no modifica código)
const analyzerAgent = new ClaudeCode({
  tools: ['Read', 'Grep', 'Glob', 'Bash(git *)']
  // Puede leer y ejecutar git, pero no modificar archivos
});

Configuración de modelo

Elige el modelo según la complejidad de la tarea:

// Tareas complejas: Opus
const complexAgent = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  maxTokens: 8192
});
 
// Tareas estándar: Sonnet
const standardAgent = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  maxTokens: 4096
});
 
// Tareas simples y rápidas: Haiku
const quickAgent = new ClaudeCode({
  model: 'claude-haiku-4-20250514',
  maxTokens: 2048
});

Manejo de resultados

Estructura del resultado

const result = await agent.run('Analiza src/auth/login.ts');
 
console.log(result);
/*
{
  output: "Análisis del archivo...",
  toolsUsed: [
    { tool: 'Read', args: { file_path: 'src/auth/login.ts' } },
    { tool: 'Grep', args: { pattern: 'function.*login' } }
  ],
  filesModified: [],
  tokensUsed: 1250,
  duration: 3200, // ms
  success: true
}
*/

Verificar éxito

const result = await agent.run('Implementa feature X');
 
if (result.success) {
  console.log('✅ Tarea completada');
  console.log(`Archivos modificados: ${result.filesModified.length}`);
} else {
  console.error('❌ Error:', result.error);
}

Procesar archivos modificados

const result = await agent.run('Refactoriza módulo de auth');
 
if (result.filesModified.length > 0) {
  console.log('Archivos modificados:');
  result.filesModified.forEach(file => {
    console.log(`  - ${file}`);
  });
 
  // Ejecutar tests
  const testResult = await agent.run('Ejecuta tests relacionados');
}

Ejemplos prácticos

Ejemplo 1: Migración masiva

Migrar todos los archivos JavaScript a TypeScript:

import { ClaudeCode } from '@anthropic-ai/claude-code';
import { glob } from 'glob';
 
const migrationAgent = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: 'Experto en migración de JavaScript a TypeScript'
});
 
// Encontrar todos los archivos .js
const jsFiles = await glob('src/**/*.js');
 
console.log(`Migrando ${jsFiles.length} archivos...`);
 
for (const file of jsFiles) {
  console.log(`Migrando ${file}...`);
 
  const result = await migrationAgent.run(
    `Convierte ${file} a TypeScript. Mantén la funcionalidad exacta.`
  );
 
  if (result.success) {
    console.log(`  ✅ ${file} migrado`);
  } else {
    console.error(`  ❌ Error en ${file}:`, result.error);
  }
}
 
console.log('Migración completada');

Ejemplo 2: Code review automático

import { ClaudeCode } from '@anthropic-ai/claude-code';
import { execSync } from 'child_process';
 
const reviewer = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Eres un code reviewer experimentado.
    Busca:
    - Bugs potenciales
    - Problemas de seguridad
    - Code smells
    - Violaciones de mejores prácticas
 
    Clasifica hallazgos como P1 (crítico), P2 (alto), P3 (medio), P4 (bajo)
  `
});
 
// Obtener archivos cambiados en el branch actual
const changedFiles = execSync('git diff --name-only main...HEAD')
  .toString()
  .trim()
  .split('\n')
  .filter(f => f.endsWith('.ts') || f.endsWith('.js'));
 
console.log(`Revisando ${changedFiles.length} archivos...`);
 
const reviews = [];
 
for (const file of changedFiles) {
  const result = await reviewer.run(`
    Revisa los cambios en ${file}
    Enfócate en issues de severidad P1 y P2
  `);
 
  reviews.push({
    file,
    review: result.output
  });
}
 
// Generar reporte
console.log('\n=== CODE REVIEW REPORT ===\n');
reviews.forEach(({ file, review }) => {
  console.log(`\n## ${file}\n`);
  console.log(review);
});

Ejemplo 3: Generación de tests

const testGenerator = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: 'Generas tests exhaustivos usando Vitest con patrón AAA'
});
 
const sourceFiles = await glob('src/**/*.ts', {
  ignore: ['**/*.test.ts', '**/*.spec.ts']
});
 
for (const sourceFile of sourceFiles) {
  // Verificar si ya tiene tests
  const testFile = sourceFile.replace('.ts', '.test.ts');
 
  if (fs.existsSync(testFile)) {
    console.log(`⏭️  ${sourceFile} ya tiene tests`);
    continue;
  }
 
  console.log(`Generando tests para ${sourceFile}...`);
 
  const result = await testGenerator.run(`
    Lee ${sourceFile} y genera tests completos en ${testFile}
 
    Incluye tests para:
    - Casos normales (happy path)
    - Casos edge
    - Manejo de errores
    - Validaciones
  `);
 
  if (result.success) {
    console.log(`  ✅ Tests generados en ${testFile}`);
  }
}

Ejemplo 4: Actualización de dependencias

const depUpdater = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  tools: ['Read', 'Write', 'Bash']
});
 
const result = await depUpdater.run(`
  1. Lee package.json
  2. Identifica dependencias desactualizadas con npm outdated
  3. Para cada dependencia:
     - Busca breaking changes en changelog
     - Si no hay breaking changes, actualiza
     - Si hay breaking changes, anota para revisión manual
  4. Genera reporte de qué se actualizó y qué necesita revisión
`);
 
console.log(result.output);

Diferencias con el CLI

CLI interactivo

claude
 
> Implementa login
[Claude responde]
 
> Ahora añade validación
[Claude responde basándose en contexto anterior]
 
> Genera tests
[Claude responde con contexto de toda la conversación]

Características:

  • Contexto conversacional
  • Iteración interactiva
  • Decisiones humanas en cada paso

SDK programático

// Cada ejecución es independiente (sin contexto conversacional)
await agent.run('Implementa login');
await agent.run('Añade validación'); // No recuerda el login anterior
await agent.run('Genera tests'); // No recuerda nada anterior

Para mantener contexto entre llamadas:

// Opción 1: Llamada única con todos los pasos
const result = await agent.run(`
  1. Implementa login
  2. Añade validación
  3. Genera tests
`);
 
// Opción 2: Pasar contexto explícito
const step1 = await agent.run('Implementa login');
 
const step2 = await agent.run('Añade validación', {
  context: {
    previousStep: step1.output,
    files: step1.filesModified
  }
});

Cuándo usar CLI vs SDK

Usa CLI cuando:

✅ Desarrollo interactivo ✅ Exploración de código ✅ Debugging ✅ Aprendizaje y experimentación ✅ Necesitas iterar con feedback humano

Usa SDK cuando:

✅ Automatización de tareas repetitivas ✅ CI/CD pipelines ✅ Procesamiento batch de archivos ✅ Orquestación de múltiples agentes ✅ Integración en aplicaciones


Limitaciones y consideraciones

1. Costos

Cada ejecución consume tokens de la API:

// Esto puede ser costoso en batch grandes
for (let i = 0; i < 1000; i++) {
  await agent.run(`Procesa archivo ${i}`);
}

Solución: Agrupa tareas cuando sea posible:

await agent.run(`
  Procesa estos archivos en batch:
  ${files.slice(0, 100).join('\n')}
`);

2. Rate limits

La API tiene límites de tasa:

// ❌ Puede exceder rate limits
const promises = files.map(f => agent.run(`Procesa ${f}`));
await Promise.all(promises);
 
// ✅ Mejor: Controla concurrencia
import pLimit from 'p-limit';
const limit = pLimit(5); // Max 5 concurrentes
 
const promises = files.map(f =>
  limit(() => agent.run(`Procesa ${f}`))
);
await Promise.all(promises);

3. Timeouts

Tareas largas pueden exceder timeout:

const result = await agent.run('Refactoriza todo el proyecto', {
  timeout: 600000 // 10 minutos
});

4. Determinismo

Los LLMs no son deterministas:

// Misma tarea puede dar resultados ligeramente diferentes
const result1 = await agent.run('Implementa login');
const result2 = await agent.run('Implementa login');
 
// result1.output !== result2.output (probablemente)

Para mayor determinismo:

const agent = new ClaudeCode({
  temperature: 0.0, // Menos aleatorio
  // Pero nunca 100% determinista
});

Resumen

Claude Code como SDK te permite:

Automatizar tareas repetitivas ✅ Integrar Claude en tus pipelines y aplicaciones ✅ Crear agentes especializados ✅ Orquestar workflows complejos ✅ Escalar el uso de Claude más allá del CLI

API básica:

import { ClaudeCode } from '@anthropic-ai/claude-code';
 
const agent = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: 'Comportamiento personalizado',
  tools: ['Read', 'Write', 'Bash']
});
 
const result = await agent.run('Tu tarea aquí');

Casos de uso principales:

  • Migración masiva de código
  • Code review automático
  • Generación de tests
  • CI/CD integration
  • Workflows multi-agente

En los siguientes puntos aprenderás casos de uso específicos y técnicas avanzadas de orquestación.


10.2 Casos de uso no-coding

Claude Code SDK no es solo para programación. Puede automatizar una amplia variedad de tareas de conocimiento, investigación, documentación y organización. En este punto descubrirás cómo usar agentes para tareas no relacionadas con código.


Filosofía

"Claude Code puede automatizar cualquier tarea que involucre leer, analizar, sintetizar o generar información en formato texto"

No necesitas ser programador para beneficiarte del SDK. Cualquiera que trabaje con información puede automatizar partes de su flujo de trabajo.


Caso 1: Investigador y sintetizador de información

Problema

Necesitas investigar un tema, leer múltiples fuentes y generar un resumen ejecutivo.

Solución con Claude Code

import { ClaudeCode } from '@anthropic-ai/claude-code';
 
const researcher = new ClaudeCode({
  model: 'claude-opus-4-5-20251101', // Modelo más capaz
  systemPrompt: `
    Eres un investigador senior experto en sintetizar información.
 
    Tu proceso:
    1. Leer todas las fuentes proporcionadas
    2. Extraer puntos clave
    3. Identificar patrones y tendencias
    4. Generar síntesis clara y estructurada
 
    Formato de salida:
    - Resumen ejecutivo (3-5 párrafos)
    - Puntos clave (bullets)
    - Fuentes citadas
  `
});
 
const result = await researcher.run(`
  Investiga el estado actual de WebAssembly en 2026.
 
  Fuentes a consultar:
  - docs/wasm/intro.md
  - docs/wasm/performance.md
  - docs/wasm/use-cases.md
  - research/wasm-benchmarks.csv
 
  Genera reporte ejecutivo en docs/reports/wasm-2026.md
`);
 
console.log('✅ Reporte generado:', result.filesModified[0]);

Resultado

# Estado de WebAssembly en 2026
 
## Resumen Ejecutivo
 
WebAssembly ha alcanzado madurez en 2026 con adopción mainstream...
[Síntesis completa]
 
## Puntos Clave
 
- Rendimiento 50% mejor que JavaScript en tareas CPU-intensive
- Soporte nativo en todos los navegadores modernos
- 73% de aplicaciones enterprise usan WASM para módulos críticos
 
## Fuentes
 
- docs/wasm/intro.md
- docs/wasm/performance.md
- ...

Caso 2: Generador de documentación

Problema

Tienes reuniones, notas dispersas y necesitas generar documentación estructurada.

Solución

const documentor = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Generas documentación técnica clara, estructurada y útil.
 
    Principios:
    - Estructura lógica (introducción → desarrollo → conclusión)
    - Ejemplos concretos
    - Lenguaje claro sin jerga innecesaria
    - Formato Markdown
  `
});
 
// Generar documentación desde notas de reunión
await documentor.run(`
  Lee estas notas de reuniones:
  - meetings/2026-01-15-product-planning.md
  - meetings/2026-01-16-tech-discussion.md
  - meetings/2026-01-17-design-review.md
 
  Genera documento consolidado: docs/Q1-2026-product-roadmap.md
 
  Estructura:
  1. Visión general del producto
  2. Features prioritarias Q1
  3. Decisiones técnicas
  4. Próximos pasos
`);

Caso 3: Organizador de archivos

Problema

Tienes cientos de archivos desorganizados que necesitas clasificar y estructurar.

Solución

const organizer = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Organizas archivos de forma lógica y mantenible.
 
    Criterios de organización:
    - Por tipo de contenido
    - Por fecha cuando es relevante
    - Por proyecto/categoría
    - Nomenclatura consistente
  `
});
 
await organizer.run(`
  Analiza todos los archivos en downloads/
 
  Organízalos en:
  - documents/work/ (archivos laborales)
  - documents/personal/ (archivos personales)
  - media/images/ (imágenes)
  - media/videos/ (videos)
  - archives/ (archivos antiguos >1 año)
 
  Criterios:
  - Infiere categoría por nombre y contenido
  - Mantén estructura por año/mes si es relevante
  - Renombra archivos con nombres descriptivos
  - Genera reporte de qué moviste donde
`);

Caso 4: Analizador de datos

Problema

Tienes CSVs, JSONs o logs que necesitas analizar y generar insights.

Solución

const dataAnalyzer = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Analizas datos y generas insights accionables.
 
    Proceso:
    1. Explorar estructura de datos
    2. Identificar patrones y anomalías
    3. Calcular estadísticas relevantes
    4. Generar visualizaciones (scripts Python/R si es necesario)
    5. Presentar findings de forma clara
  `
});
 
await dataAnalyzer.run(`
  Analiza datos/ventas-2025.csv
 
  Genera reporte en reportes/analisis-ventas-2025.md con:
  1. Resumen estadístico (totales, promedios, máximos, mínimos)
  2. Tendencias temporales
  3. Productos más vendidos
  4. Anomalías o outliers
  5. Recomendaciones basadas en datos
 
  Si necesitas scripts de análisis, créalos en scripts/
`);

Resultado:

# Análisis de Ventas 2025
 
## Resumen Estadístico
 
- Total ventas: $2,450,000
- Promedio mensual: $204,166
- Mes más alto: Diciembre ($340,000)
- Mes más bajo: Enero ($125,000)
 
## Tendencias
 
!Gráfico de tendencia
 
- Crecimiento constante 12% YoY
- Picos en Q4 (temporada navideña)
- Caída en Q1 (patrón histórico)
 
## Recomendaciones
 
1. Aumentar inventario para Q4
2. Promociones agresivas en Q1 para compensar caída
3. Investigar por qué Producto X bajó 20% en ventas

Caso 5: Generador de presentaciones

Problema

Necesitas crear presentaciones a partir de información dispersa.

Solución

const presentationMaker = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: `
    Creas presentaciones impactantes y bien estructuradas.
 
    Principios:
    - Una idea clave por slide
    - Títulos descriptivos y accionables
    - Bullets concisos (max 5 por slide)
    - Storytelling: problema → solución → impacto
  `
});
 
await presentationMaker.run(`
  Crea presentación para inversores basada en:
  - business/business-plan.md
  - data/financial-projections.csv
  - research/market-analysis.md
 
  Genera: presentations/investor-deck-Q1-2026.md
 
  Estructura (10-12 slides):
  1. Problema que resolvemos
  2. Nuestra solución
  3. Mercado (TAM/SAM/SOM)
  4. Modelo de negocio
  5. Tracción actual
  6. Proyecciones financieras
  7. Equipo
  8. Competencia
  9. Ask (cuánto buscamos, para qué)
  10. Próximos hitos
 
  Formato: Markdown compatible con Marp o reveal.js
`);

Caso 6: Asistente de escritura

Problema

Necesitas mejorar textos, ajustar tono, corregir gramática.

Solución

const editor = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Editas y mejoras textos profesionales.
 
    Tareas:
    - Corregir gramática y ortografía
    - Mejorar claridad y estructura
    - Ajustar tono según audiencia
    - Sugerir mejoras de estilo
  `
});
 
// Mejorar email profesional
await editor.run(`
  Lee drafts/email-to-client.txt
 
  Mejora el email:
  - Tono: Profesional pero amigable
  - Claridad: Mensaje directo y claro
  - Estructura: Intro → Contexto → Request → Cierre
  - Correcciones: Gramática y estilo
 
  Guarda versión mejorada en drafts/email-to-client-final.txt
  Genera diff mostrando cambios en drafts/email-changes.md
`);
 
// Adaptar documento a diferentes audiencias
await editor.run(`
  Lee technical-spec.md
 
  Genera 3 versiones:
  1. Executive summary (para C-level)
  2. Technical deep-dive (para ingenieros)
  3. User-facing docs (para usuarios finales)
 
  Guarda en docs/audiences/
`);

Caso 7: Generador de contenido

Problema

Crear contenido para blog, marketing, social media.

Solución

const contentCreator = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Generas contenido engaging y optimizado para cada canal.
 
    Conoces:
    - SEO best practices
    - Estructura de blog posts efectivos
    - Longitud óptima por canal
    - Call-to-actions efectivos
  `
});
 
// Generar serie de blog posts
await contentCreator.run(`
  Basándote en research/product-features.md
 
  Genera 5 blog posts en blog/posts/:
  1. "Introducción a [Producto]: Lo que necesitas saber" (1000 palabras)
  2. "Cómo [Producto] resuelve [Problema común]" (800 palabras)
  3. "Guía paso a paso: Tu primer [Acción con producto]" (1200 palabras)
  4. "5 casos de uso reales de [Producto]" (900 palabras)
  5. "[Producto] vs Alternativas: Comparación completa" (1500 palabras)
 
  Cada post debe incluir:
  - Meta description (SEO)
  - Headings estructurados (H2, H3)
  - CTA al final
  - Keywords relevantes
`);
 
// Adaptar contenido para redes sociales
await contentCreator.run(`
  Lee blog/posts/product-launch.md
 
  Genera contenido para redes sociales en social-media/:
  - Twitter: 5 tweets (thread)
  - LinkedIn: Post profesional (300 palabras)
  - Instagram: Caption + 10 hashtags
  - Facebook: Post casual (200 palabras)
 
  Mantén mensaje central pero adapta tono a cada plataforma
`);

Caso 8: Automatizador de tareas administrativas

Problema

Tareas repetitivas que consumen tiempo: responder emails, llenar formularios, generar reportes.

Solución

const adminAssistant = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: 'Automatizas tareas administrativas con precisión y eficiencia'
});
 
// Responder emails rutinarios
await adminAssistant.run(`
  Lee carpeta inbox/support-requests/
 
  Para cada email sin responder:
  1. Clasifica el tipo de request
  2. Si es FAQ común (consulta kb/faqs.md), genera respuesta
  3. Si requiere investigación, marca para revisión manual
  4. Genera drafts en inbox/draft-responses/
 
  Mantén tono amigable y profesional
`);
 
// Generar reportes semanales
await adminAssistant.run(`
  Genera reporte semanal basado en:
  - data/timesheets.csv (horas trabajadas)
  - data/tasks-completed.json (tareas completadas)
  - data/metrics.csv (métricas clave)
 
  Formato: reports/weekly-report-YYYY-MM-DD.md
 
  Incluye:
  - Resumen ejecutivo
  - Logros de la semana
  - Métricas clave
  - Blockers/issues
  - Plan para próxima semana
`);

Caso 9: Curador de conocimiento

Problema

Acumulas muchos artículos, PDFs, notas que nunca organizas ni revisitas.

Solución

const curator = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: `
    Organizas y sintetizas conocimiento para fácil consulta.
 
    Creas:
    - Resúmenes ejecutivos
    - Tag system coherente
    - Relaciones entre conceptos
    - Knowledge base estructurado
  `
});
 
await curator.run(`
  Procesa todo en reading-list/:
 
  Para cada documento:
  1. Lee y extrae:
     - Idea principal
     - Conceptos clave (max 10)
     - Insights accionables
     - Citas destacadas
 
  2. Clasifica por:
     - Tema (tecnología, negocios, personal, etc.)
     - Tipo (tutorial, research, opinion, case study)
     - Nivel (beginner, intermediate, advanced)
 
  3. Genera knowledge base en kb/:
     - Estructura por tema/subtema
     - Índice searchable
     - Links cruzados entre contenido relacionado
 
  4. Crea kb/README.md con:
     - Cómo navegar el knowledge base
     - Índice por tema
     - Documentos más valiosos (top 10)
`);

Caso 10: Planificador y organizador personal

Problema

Necesitas planificar proyectos, organizar tareas, hacer seguimiento de objetivos.

Solución

const planner = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Ayudas a planificar y organizar proyectos y vida personal.
 
    Principios:
    - Metas SMART (Specific, Measurable, Achievable, Relevant, Time-bound)
    - Priorización (Eisenhower matrix)
    - Breakdown en tareas accionables
  `
});
 
// Planificación trimestral
await planner.run(`
  Basándote en goals/2026-annual-goals.md
 
  Crea plan detallado para Q1 2026:
 
  1. Desglose de objetivos anuales en metas trimestrales
  2. Para cada meta trimestral:
     - Milestones mensuales
     - Tareas semanales accionables
     - Métricas de éxito
     - Recursos necesarios
 
  3. Calendario de revisiones:
     - Review semanal (qué hacer)
     - Review mensual (qué hacer)
 
  Genera en plans/Q1-2026-plan.md
`);
 
// Organizar semana
await planner.run(`
  Lee:
  - calendar/meetings-this-week.ics
  - tasks/pending-tasks.md
  - goals/Q1-goals.md
 
  Genera schedule optimizado en plans/week-plan.md:
 
  - Bloques de tiempo para deep work
  - Preparación para meetings
  - Tareas según prioridad
  - Buffer time para imprevistos
  - Balance trabajo/vida
 
  Sugiere qué delegar o eliminar si hay sobrecarga
`);

Patrones comunes en todos los casos

1. System prompt especializado

const agent = new ClaudeCode({
  systemPrompt: 'Define expertise y comportamiento específico'
});

2. Instrucciones claras y estructuradas

await agent.run(`
  1. Lee fuentes X, Y, Z
  2. Analiza según criterio A
  3. Genera output en formato B
  4. Guarda en ubicación C
`);

3. Output estructurado

Siempre especifica formato deseado:

  • Markdown para documentos
  • CSV/JSON para datos
  • Ubicación de archivos generados

4. Iteración si es necesario

const draft = await agent.run('Genera primer borrador');
 
const improved = await agent.run(`
  Basándote en ${draft.filesModified[0]},
  mejora según feedback: ${userFeedback}
`);

Beneficios del enfoque no-coding

1. Automatización sin programación

No necesitas saber programar para beneficiarte:

// Script simple que cualquiera puede usar
const researcher = new ClaudeCode({ /* config */ });
await researcher.run('Tu tarea en lenguaje natural');

2. Escalabilidad

// Procesar 100 documentos con el mismo esfuerzo que 1
for (const doc of documents) {
  await agent.run(`Procesa ${doc}`);
}

3. Consistencia

El agente aplica los mismos criterios siempre:

// Mismo formato, mismo estándar de calidad
await curator.run('Procesa todos los artículos de la semana');

4. Ahorro de tiempo

Tareas que tomarían horas → minutos.


Limitaciones

1. Creatividad limitada

Para tareas muy creativas (diseño, arte), los humanos siguen siendo superiores.

2. Contexto y criterio

El agente no tiene contexto implícito que un humano tendría.

Solución: Proporciona contexto explícito en el prompt.

3. Verificación necesaria

Siempre revisa el output antes de usarlo en producción.


Resumen

Claude Code SDK es útil para:

✅ Investigación y síntesis ✅ Generación de documentación ✅ Organización de archivos ✅ Análisis de datos ✅ Creación de contenido ✅ Tareas administrativas ✅ Curación de conocimiento ✅ Planificación personal

Patrón general:

const agent = new ClaudeCode({
  systemPrompt: 'Define expertise',
  model: 'claude-sonnet-4-20250514'
});
 
await agent.run(`
  1. Lee [fuentes]
  2. Procesa según [criterio]
  3. Genera [output]
`);

Beneficios:

  • Automatización sin código complejo
  • Escalabilidad
  • Consistencia
  • Ahorro de tiempo

En el siguiente punto aprenderás a crear agentes de planning personalizados para diseñar arquitecturas y soluciones complejas.


10.3 Crear agente de planning personalizado

Un agente de planning es fundamental para diseñar arquitecturas y soluciones antes de implementar. En este punto aprenderás a crear agentes especializados en planificación técnica.


¿Qué es un agente de planning?

Un agente de planning analiza requisitos, diseña soluciones y genera planes detallados de implementación antes de escribir código.

Ciclo tradicional (sin planning)

Usuario: Implementa autenticación JWT

Claude implementa directamente

Problemas aparecen durante implementación

Refactoring y cambios de diseño

Ciclo con agente de planning

Usuario: Implementa autenticación JWT

Planning Agent: Diseña arquitectura

Usuario revisa y aprueba plan

Implementation Agent: Implementa según plan

Menos problemas, mejor arquitectura

Crear agente de planning básico

Configuración

import { ClaudeCode } from '@anthropic-ai/claude-code';
 
const planningAgent = new ClaudeCode({
  model: 'claude-opus-4-5-20251101', // Modelo más capaz para planning
  systemPrompt: `
    Eres un arquitecto de software senior con 15 años de experiencia.
 
    Tu rol es diseñar soluciones técnicas antes de la implementación.
 
    Proceso que sigues:
    1. Analizar requisitos y restricciones
    2. Considerar múltiples enfoques
    3. Evaluar trade-offs
    4. Proponer arquitectura óptima
    5. Identificar riesgos y mitigaciones
    6. Crear plan de implementación detallado
 
    Principios que aplicas:
    - SOLID
    - DRY
    - KISS (Keep It Simple)
    - YAGNI (You Aren't Gonna Need It)
    - Separation of Concerns
 
    Output esperado:
    - Documento de diseño técnico
    - Diagrama de arquitectura (texto/mermaid)
    - Plan de implementación paso a paso
    - Identificación de riesgos
  `,
  tools: ['Read', 'Grep', 'Glob'] // Solo lectura, no implementa
});

Uso básico

const plan = await planningAgent.run(`
  Requisito: Sistema de autenticación JWT para API REST
 
  Contexto:
  - Backend: Node.js + Express
  - Base de datos: PostgreSQL
  - Frontend: React
 
  Restricciones:
  - Debe soportar refresh tokens
  - Tokens expiran en 15 minutos
  - Refresh tokens expiran en 7 días
  - Debe ser stateless
 
  Genera plan de arquitectura completo
`);
 
console.log(plan.output);

Estructura del plan generado

Un buen agente de planning debe generar:

1. Resumen ejecutivo

## Resumen Ejecutivo
 
Sistema de autenticación basado en JWT con refresh tokens para API REST.
Arquitectura stateless usando Redis para blacklist de tokens invalidados.

2. Decisiones arquitectónicas

## Decisiones Arquitectónicas
 
### JWT vs Sessions
**Decisión:** JWT
**Razón:** Requisito de stateless, escalabilidad horizontal
 
### Almacenamiento de refresh tokens
**Decisión:** PostgreSQL con índice en user_id
**Razón:** Ya tenemos PostgreSQL, no justifica añadir Redis solo para esto
 
### Blacklist de tokens
**Decisión:** Redis con TTL
**Razón:** Alta performance para verificación rápida, expira automáticamente

3. Arquitectura propuesta

## Arquitectura
 
┌─────────────┐
│   Cliente   │
└──────┬──────┘

       │ 1. POST /auth/login

┌─────────────────────────────────────┐
│         API Gateway                  │
│  ┌─────────────────────────────┐   │
│  │  Middleware de autenticación │   │
│  └─────────────────────────────┘   │
└──────┬───────────────────┬──────────┘
       │                   │
       │ 2. Valida JWT     │ 3. Si inválido,
       │                   │    verifica refresh
       ▼                   ▼
┌──────────┐         ┌────────────┐
│  Redis   │         │ PostgreSQL │
│ (Blacklist)       │  (Refresh  │
└──────────┘         │   Tokens)  │
                     └────────────┘

4. Componentes y responsabilidades

## Componentes
 
### 1. AuthController
**Responsabilidad:** Endpoints de autenticación
**Métodos:**
- POST /auth/login → Genera access + refresh token
- POST /auth/refresh → Genera nuevo access token
- POST /auth/logout → Invalida tokens
 
### 2. TokenService
**Responsabilidad:** Generación y validación de tokens
**Métodos:**
- generateAccessToken(userId)
- generateRefreshToken(userId)
- validateAccessToken(token)
- validateRefreshToken(token)
- invalidateToken(token)
 
### 3. AuthMiddleware
**Responsabilidad:** Proteger rutas
**Funcionalidad:**
- Extraer token de header
- Validar token
- Verificar blacklist
- Adjuntar user a request

5. Plan de implementación

## Plan de Implementación
 
### Fase 1: Configuración base (1-2 horas)
- [ ] Instalar dependencias (jsonwebtoken, bcrypt)
- [ ] Configurar variables de entorno (JWT_SECRET, etc.)
- [ ] Crear tabla refresh_tokens en DB
- [ ] Configurar conexión a Redis
 
### Fase 2: Token Service (2-3 horas)
- [ ] Implementar generateAccessToken()
- [ ] Implementar generateRefreshToken()
- [ ] Implementar validateAccessToken()
- [ ] Implementar validateRefreshToken()
- [ ] Implementar invalidateToken()
- [ ] Tests unitarios
 
### Fase 3: Auth Controller (2-3 horas)
- [ ] Endpoint POST /auth/login
- [ ] Endpoint POST /auth/refresh
- [ ] Endpoint POST /auth/logout
- [ ] Validación de inputs
- [ ] Manejo de errores
- [ ] Tests de integración
 
### Fase 4: Middleware (1-2 horas)
- [ ] Implementar authMiddleware
- [ ] Verificación de blacklist
- [ ] Tests
 
### Fase 5: Integración (1 hora)
- [ ] Proteger rutas existentes
- [ ] Tests end-to-end
- [ ] Documentación de API

6. Riesgos e identificados

## Riesgos
 
### Alto
- **Riesgo:** JWT_SECRET comprometido
  **Impacto:** Cualquiera puede generar tokens válidos
  **Mitigación:** Usar secreto fuerte, rotar periódicamente, guardar en secrets manager
 
### Medio
- **Riesgo:** Redis down = no se puede verificar blacklist
  **Impacto:** Tokens invalidados podrían ser usados
  **Mitigación:** Fallback a PostgreSQL, monitoreo de Redis
 
### Bajo
- **Riesgo:** Refresh tokens robados
  **Impacto:** Acceso prolongado no autorizado
  **Mitigación:** Detectar uso desde IPs diferentes, invalidar todos los tokens del usuario

Agente de planning avanzado

Con contexto del proyecto

const advancedPlanningAgent = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: `
    Eres un arquitecto de software senior especializado en ${TECH_STACK}.
 
    SIEMPRE lees primero:
    - CLAUDE.md del proyecto (convenciones y arquitectura)
    - Código existente relacionado
    - Documentación de arquitectura
 
    Tu diseño debe:
    - Ser coherente con la arquitectura existente
    - Seguir las convenciones del proyecto
    - Reutilizar componentes existentes cuando sea posible
    - Minimizar cambios disruptivos
 
    NO propongas tecnologías nuevas a menos que sea absolutamente necesario.
  `
});
 
const contextualPlan = await advancedPlanningAgent.run(`
  Requisito: ${requirement}
 
  IMPORTANTE: Antes de diseñar, lee:
  1. CLAUDE.md
  2. Archivos en src/auth/ (para ver patterns existentes)
  3. docs/architecture.md
 
  Diseña solución que sea consistente con lo existente.
`);

Con plantillas de output

const templateBasedAgent = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: `
    Generas planes siguiendo el formato de Technical Design Doc de la empresa.
 
    Plantilla a seguir:
    1. Resumen (3-5 líneas)
    2. Contexto y problema
    3. Objetivos y no-objetivos
    4. Diseño propuesto
       4.1. Arquitectura
       4.2. Componentes
       4.3. APIs
       4.4. Data model
    5. Alternativas consideradas
    6. Riesgos y mitigación
    7. Plan de implementación
    8. Métricas de éxito
    9. Preguntas abiertas
 
    Usa formato Markdown con headings apropiados.
  `
});

Casos de uso

Caso 1: Diseño de nueva feature

const featureDesigner = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: 'Diseñas features completas desde producto hasta implementación'
});
 
const featurePlan = await featureDesigner.run(`
  Feature: Sistema de notificaciones multi-canal
 
  Requisitos de producto:
  - Usuarios pueden recibir notificaciones por email, SMS, push
  - Usuarios configuran preferencias por tipo de notificación
  - Sistema debe ser extensible (agregar canales fácilmente)
  - Debe manejar 10,000 notificaciones/minuto
 
  Diseña:
  1. Arquitectura técnica
  2. Data model
  3. APIs necesarias
  4. Plan de implementación
  5. Estrategia de testing
  6. Plan de rollout (cómo desplegarlo gradualmente)
 
  Guarda plan en docs/designs/notifications-system.md
`);

Caso 2: Refactoring de módulo legacy

const refactorPlanner = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: 'Diseñas estrategias de refactoring minimizando riesgo'
});
 
await refactorPlanner.run(`
  Módulo a refactorizar: src/legacy/payment-processor/
 
  Problemas actuales:
  - Código spagueti (funciones de 500+ líneas)
  - Sin tests
  - Dependencias hardcodeadas
  - Difícil de mantener
 
  Lee todo el módulo y diseña plan de refactoring que:
  1. Identifique responsabilidades actuales
  2. Proponga nueva arquitectura modular
  3. Defina estrategia de migración incremental
  4. Minimice riesgo (cómo refactorizar sin romper producción)
  5. Plan de testing
  6. Métricas para validar que refactor fue exitoso
 
  Guarda en docs/designs/payment-processor-refactor.md
`);

Caso 3: Evaluación de tecnologías

const techEvaluator = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: 'Evalúas tecnologías objetivamente considerando trade-offs'
});
 
await techEvaluator.run(`
  Decisión: Elegir ORM para nuevo proyecto
 
  Opciones:
  - Prisma
  - TypeORM
  - Sequelize
  - Kysely (query builder)
 
  Evalúa cada opción en:
  1. Type safety
  2. Performance
  3. Developer experience
  4. Ecosistema y soporte
  5. Curva de aprendizaje
  6. Casos de uso óptimos
 
  Genera comparación en docs/evaluations/orm-comparison.md
 
  Incluye:
  - Tabla comparativa
  - Recomendación con justificación
  - POC sugerido para validar decisión
`);

Integración con implementación

Flujo completo: Planning → Implementation

import { ClaudeCode } from '@anthropic-ai/claude-code';
 
// Agente 1: Planning
const planner = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: 'Arquitecto de software senior',
  tools: ['Read', 'Grep', 'Glob']
});
 
// Agente 2: Implementation
const implementer = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: 'Implementas código siguiendo diseños técnicos al pie de la letra',
  tools: ['Read', 'Write', 'Edit', 'Bash']
});
 
// Paso 1: Generar plan
console.log('📋 Generando plan de arquitectura...');
const plan = await planner.run(`
  Requisito: ${requirement}
 
  Genera plan técnico completo en docs/designs/feature-x.md
`);
 
console.log('✅ Plan generado:', plan.filesModified[0]);
 
// Paso 2: Revisión humana
console.log('\n⏸️  Revisa el plan antes de continuar...');
await waitForUserApproval();
 
// Paso 3: Implementar según plan
console.log('\n🔨 Implementando según plan...');
const implementation = await implementer.run(`
  Lee el plan en ${plan.filesModified[0]}
 
  Implementa TODO lo descrito en el plan.
 
  Sigue el plan EXACTAMENTE:
  - Mismos nombres de archivos/componentes
  - Misma arquitectura
  - Mismo orden de implementación
 
  Ejecuta tests después de cada fase
`);
 
console.log('✅ Implementación completa');
console.log('Archivos creados/modificados:', implementation.filesModified);

Mejores prácticas

1. Planning Agent NO implementa

// ❌ Mal: Planning agent con acceso a Write
const planner = new ClaudeCode({
  tools: ['Read', 'Write', 'Edit'] // Puede implementar
});
 
// ✅ Bien: Solo lectura
const planner = new ClaudeCode({
  tools: ['Read', 'Grep', 'Glob'] // Solo analiza
});

2. Usa modelo potente para planning

// Planning es tarea compleja → Opus
const planner = new ClaudeCode({
  model: 'claude-opus-4-5-20251101'
});
 
// Implementation puede usar Sonnet
const implementer = new ClaudeCode({
  model: 'claude-sonnet-4-20250514'
});

3. Genera documentación del plan

await planner.run(`
  Genera plan Y guárdalo en docs/designs/
 
  Formato Markdown, bien estructurado.
 
  El plan debe ser comprensible sin contexto adicional.
`);

4. Revisión humana obligatoria

const plan = await planner.run(task);
 
// SIEMPRE revisar antes de implementar
console.log('Plan generado. Por favor revisa antes de continuar.');
await askUserToReview(plan.filesModified[0]);
 
// Solo después de aprobación
const implementation = await implementer.run(`Implementa ${plan.filesModified[0]}`);

Plantilla de system prompt para planning

const PLANNING_AGENT_PROMPT = `
Eres [ROLE: arquitecto senior / tech lead / especialista en X].
 
## Tu proceso de planning:
1. [PASO 1: ej. Analizar requisitos]
2. [PASO 2: ej. Revisar código existente]
3. [PASO 3: ej. Considerar alternativas]
4. [PASO 4: ej. Proponer solución óptima]
5. [PASO 5: ej. Identificar riesgos]
 
## Principios que aplicas:
- [PRINCIPIO 1: ej. SOLID]
- [PRINCIPIO 2: ej. Keep it simple]
- [PRINCIPIO 3: ej. Consider scalability]
 
## Output esperado:
1. [SECCIÓN 1: ej. Resumen ejecutivo]
2. [SECCIÓN 2: ej. Arquitectura propuesta]
3. [SECCIÓN 3: ej. Plan de implementación]
4. [SECCIÓN 4: ej. Riesgos]
 
## Formato:
- Markdown estructurado
- Diagramas en Mermaid/ASCII cuando sea útil
- Guarda en [UBICACIÓN]
 
## Restricciones:
- [RESTRICCIÓN 1: ej. NO implementes, solo diseña]
- [RESTRICCIÓN 2: ej. Mantén consistencia con código existente]
`;
 
const planner = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: PLANNING_AGENT_PROMPT
});

Resumen

Agente de planning:

  • Diseña antes de implementar
  • Analiza requisitos y propone arquitectura
  • Identifica riesgos y trade-offs
  • Genera plan detallado de implementación

Configuración clave:

const planner = new ClaudeCode({
  model: 'claude-opus-4-5-20251101', // Modelo potente
  systemPrompt: 'Arquitecto senior...', // Define expertise
  tools: ['Read', 'Grep', 'Glob'] // Solo lectura
});

Flujo recomendado:

  1. Planning Agent → Genera plan
  2. Revisión humana → Aprueba/ajusta
  3. Implementation Agent → Implementa según plan
  4. Tests → Valida implementación

Beneficios:

  • Mejor arquitectura
  • Menos refactoring
  • Riesgos identificados temprano
  • Plan claro para implementación

En el siguiente punto aprenderás a orquestar múltiples agentes trabajando juntos en workflows complejos.


10.4 Orquestación de múltiples agentes

La verdadera potencia del SDK aparece cuando orquestas múltiples agentes especializados trabajando juntos. En este punto aprenderás patrones de orquestación para workflows complejos.


Filosofía

"Un agente generalista vs. Múltiples agentes especializados = Orquesta vs. Solista"

Cada agente es un experto en su dominio. La orquestación los coordina para lograr objetivos complejos.


Patrón 1: Pipeline secuencial

Agentes ejecutándose uno después del otro, cada uno usa el output del anterior.

Ejemplo: Feature completa desde cero

import { ClaudeCode } from '@anthropic-ai/claude-code';
 
// Agente 1: Planning
const planner = new ClaudeCode({
  model: 'claude-opus-4-5-20251101',
  systemPrompt: 'Arquitecto de software senior',
  tools: ['Read', 'Grep', 'Glob']
});
 
// Agente 2: Implementation
const implementer = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: 'Implementas código de producción con tests',
  tools: ['Read', 'Write', 'Edit', 'Bash']
});
 
// Agente 3: Code Reviewer
const reviewer = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: 'Reviewer estricto enfocado en bugs y security',
  tools: ['Read', 'Grep']
});
 
// Agente 4: Test Generator
const tester = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: 'Generas tests exhaustivos',
  tools: ['Read', 'Write', 'Bash']
});
 
async function buildFeatureWithPipeline(requirement) {
  console.log('🎯 Iniciando pipeline para:', requirement);
 
  // Paso 1: Planning
  console.log('\n📋 Fase 1: Planning');
  const planResult = await planner.run(`
    Diseña arquitectura para: ${requirement}
    Guarda plan en docs/designs/feature-plan.md
  `);
  console.log('✅ Plan generado');
 
  // Paso 2: Implementation
  console.log('\n🔨 Fase 2: Implementation');
  const implResult = await implementer.run(`
    Lee el plan en ${planResult.filesModified[0]}
    Implementa según el plan exactamente
  `);
  console.log('✅ Implementación completa');
 
  // Paso 3: Code Review
  console.log('\n🔍 Fase 3: Code Review');
  const reviewResult = await reviewer.run(`
    Revisa los archivos modificados:
    ${implResult.filesModified.join('\n')}
 
    Busca:
    - Bugs potenciales (P1)
    - Vulnerabilidades de seguridad (P1)
    - Code smells (P2)
 
    Guarda reporte en reviews/feature-review.md
  `);
  console.log('✅ Review completado');
 
  // Paso 4: Generar tests
  console.log('\n🧪 Fase 4: Tests');
  const testResult = await tester.run(`
    Para cada archivo implementado:
    ${implResult.filesModified.join('\n')}
 
    Genera tests completos siguiendo TDD best practices
  `);
  console.log('✅ Tests generados');
 
  // Paso 5: Ejecutar tests
  console.log('\n✓ Fase 5: Ejecutar tests');
  const testRunResult = await tester.run('Ejecuta npm test');
 
  if (testRunResult.output.includes('FAIL')) {
    console.log('❌ Tests fallaron, aplicando fixes...');
 
    const fixResult = await implementer.run(`
      Los tests fallaron con este output:
      ${testRunResult.output}
 
      Arregla los problemas y vuelve a ejecutar tests
    `);
  } else {
    console.log('✅ Todos los tests pasan');
  }
 
  console.log('\n🎉 Pipeline completado exitosamente');
 
  return {
    plan: planResult.filesModified[0],
    implementation: implResult.filesModified,
    review: reviewResult.filesModified[0],
    tests: testResult.filesModified
  };
}
 
// Uso
const result = await buildFeatureWithPipeline(
  'Sistema de notificaciones por email con templates'
);

Patrón 2: Parallel execution

Múltiples agentes trabajando en paralelo para acelerar el proceso.

Ejemplo: Code review paralelo

async function parallelCodeReview(files) {
  // Crear agentes especializados
  const securityReviewer = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Experto en seguridad, busca vulnerabilidades OWASP'
  });
 
  const performanceReviewer = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Experto en performance, identifica optimizaciones'
  });
 
  const styleReviewer = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Experto en clean code, revisa legibilidad y mantenibilidad'
  });
 
  console.log('🔍 Ejecutando reviews en paralelo...');
 
  // Ejecutar todos en paralelo
  const [securityReport, perfReport, styleReport] = await Promise.all([
    securityReviewer.run(`Revisa seguridad de ${files.join(', ')}`),
    performanceReviewer.run(`Analiza performance de ${files.join(', ')}`),
    styleReviewer.run(`Revisa clean code en ${files.join(', ')}`)
  ]);
 
  console.log('✅ Reviews completados');
 
  return {
    security: securityReport.output,
    performance: perfReport.output,
    style: styleReport.output
  };
}
 
// Uso
const reports = await parallelCodeReview([
  'src/auth/login.ts',
  'src/auth/register.ts'
]);
 
console.log('📊 Reportes generados:');
console.log('Security issues:', reports.security);
console.log('Performance issues:', reports.performance);
console.log('Style issues:', reports.style);

Patrón 3: Maestro-trabajadores

Un agente maestro coordina múltiples agentes trabajadores.

Ejemplo: Refactor masivo

class RefactorOrchestrator {
  constructor() {
    // Maestro: coordina y toma decisiones
    this.master = new ClaudeCode({
      model: 'claude-opus-4-5-20251101',
      systemPrompt: 'Coordinas refactoring, tomas decisiones de alto nivel',
      tools: ['Read', 'Grep', 'Glob']
    });
 
    // Trabajadores: ejecutan tareas específicas
    this.workers = {
      analyzer: new ClaudeCode({
        model: 'claude-sonnet-4-20250514',
        systemPrompt: 'Analizas código y detectas code smells'
      }),
      refactorer: new ClaudeCode({
        model: 'claude-sonnet-4-20250514',
        systemPrompt: 'Refactorizas código manteniendo funcionalidad'
      }),
      tester: new ClaudeCode({
        model: 'claude-sonnet-4-20250514',
        systemPrompt: 'Verificas que tests sigan pasando'
      })
    };
  }
 
  async refactorModule(modulePath) {
    console.log(`🔄 Refactoring module: ${modulePath}`);
 
    // Maestro analiza y crea plan
    console.log('\n📋 Maestro: Analizando módulo...');
    const plan = await this.master.run(`
      Analiza ${modulePath} y crea plan de refactoring:
      1. Lista archivos a refactorizar (en orden de dependencias)
      2. Para cada archivo, identifica qué refactorizar
      3. Define orden de ejecución
    `);
 
    const filesToRefactor = this.parseFilesFromPlan(plan.output);
 
    // Ejecutar refactoring archivo por archivo
    for (const file of filesToRefactor) {
      console.log(`\n🔨 Refactoring ${file}...`);
 
      // Worker 1: Analizar
      const analysis = await this.workers.analyzer.run(
        `Analiza ${file} y sugiere refactorings`
      );
 
      // Worker 2: Refactorizar
      const refactored = await this.workers.refactorer.run(`
        Refactoriza ${file} según estas sugerencias:
        ${analysis.output}
      `);
 
      // Worker 3: Verificar tests
      const testResult = await this.workers.tester.run(
        `Ejecuta tests relacionados a ${file}`
      );
 
      if (testResult.output.includes('FAIL')) {
        console.log('❌ Tests fallaron, revirtiendo...');
        // Lógica de rollback
        continue;
      }
 
      console.log(`✅ ${file} refactorizado exitosamente`);
    }
 
    console.log('\n🎉 Refactoring completado');
  }
 
  parseFilesFromPlan(planOutput) {
    // Lógica para extraer lista de archivos del plan
    // Simplificado para el ejemplo
    return ['file1.ts', 'file2.ts', 'file3.ts'];
  }
}
 
// Uso
const orchestrator = new RefactorOrchestrator();
await orchestrator.refactorModule('src/legacy/payment');

Patrón 4: Iterativo con feedback

Agentes iterando hasta lograr resultado satisfactorio.

Ejemplo: Code quality improvement

async function improveCodeQuality(file, targetQuality = 90) {
  const analyzer = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Analizas calidad de código y asignas score 0-100'
  });
 
  const improver = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Mejoras código priorizando máximo impacto'
  });
 
  let currentScore = 0;
  let iteration = 0;
  const maxIterations = 5;
 
  console.log(`🎯 Objetivo: Calidad ${targetQuality}/100`);
 
  while (currentScore < targetQuality && iteration < maxIterations) {
    iteration++;
    console.log(`\n🔄 Iteración ${iteration}`);
 
    // Analizar calidad actual
    const analysis = await analyzer.run(`
      Analiza ${file}
 
      Califica (0-100) en:
      - Legibilidad
      - Mantenibilidad
      - Testabilidad
      - Performance
      - Security
 
      Identifica los 3 problemas más críticos
    `);
 
    currentScore = this.extractScore(analysis.output);
    console.log(`📊 Score actual: ${currentScore}/100`);
 
    if (currentScore >= targetQuality) {
      console.log('✅ Objetivo alcanzado');
      break;
    }
 
    // Mejorar basándose en análisis
    console.log('🔨 Aplicando mejoras...');
    await improver.run(`
      Mejora ${file} enfocándote en los 3 problemas críticos identificados:
      ${analysis.output}
 
      Prioriza mejoras con mayor impacto en el score
    `);
 
    // Verificar tests
    const testResult = await improver.run('Ejecuta tests');
    if (testResult.output.includes('FAIL')) {
      console.log('❌ Mejoras rompieron tests, revirtiendo...');
      break;
    }
  }
 
  console.log(`\n🏁 Final score: ${currentScore}/100 en ${iteration} iteraciones`);
}

Patrón 5: Especialización por dominio

Agentes expertos en diferentes áreas trabajando en el mismo proyecto.

Ejemplo: Full-stack feature

const agents = {
  frontend: new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Experto en React, TypeScript, CSS. Creas componentes reutilizables'
  }),
 
  backend: new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Experto en Node.js, Express, PostgreSQL. Creas APIs RESTful'
  }),
 
  database: new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'DBA experto. Diseñas schemas optimizados con índices apropiados'
  }),
 
  devops: new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Experto en CI/CD, Docker, deployment automation'
  })
};
 
async function buildFullStackFeature(feature) {
  console.log(`🚀 Building full-stack feature: ${feature}`);
 
  // 1. Database schema
  console.log('\n💾 Database layer');
  const dbSchema = await agents.database.run(`
    Diseña schema de DB para ${feature}
    Crea migration en migrations/
  `);
 
  // 2. Backend API
  console.log('\n⚙️  Backend API');
  const api = await agents.backend.run(`
    Implementa API endpoints para ${feature}
    Usa el schema: ${dbSchema.filesModified[0]}
  `);
 
  // 3. Frontend components
  console.log('\n🎨 Frontend');
  const frontend = await agents.frontend.run(`
    Implementa componentes React para ${feature}
    Consume estos endpoints: ${api.filesModified.join(', ')}
  `);
 
  // 4. DevOps configuration
  console.log('\n🔧 DevOps');
  const devops = await agents.devops.run(`
    Configura deployment para ${feature}:
    - Docker compose para local dev
    - GitHub Actions workflow para CI/CD
  `);
 
  console.log('\n✅ Full-stack feature completado');
 
  return {
    database: dbSchema.filesModified,
    backend: api.filesModified,
    frontend: frontend.filesModified,
    devops: devops.filesModified
  };
}

Patrón 6: Consensus-based

Múltiples agentes proponen soluciones y se elige la mejor.

Ejemplo: Selección de mejor arquitectura

async function chooseBestArchitecture(requirement) {
  // Crear 3 agentes con diferentes filosofías
  const architects = [
    new ClaudeCode({
      model: 'claude-opus-4-5-20251101',
      systemPrompt: 'Prefieres simplicidad y mantenibilidad (KISS, YAGNI)'
    }),
    new ClaudeCode({
      model: 'claude-opus-4-5-20251101',
      systemPrompt: 'Prefieres escalabilidad y performance'
    }),
    new ClaudeCode({
      model: 'claude-opus-4-5-20251101',
      systemPrompt: 'Prefieres flexibilidad y extensibilidad'
    })
  ];
 
  console.log('🏛️  Generando propuestas de arquitectura...');
 
  // Cada arquitecto propone su solución
  const proposals = await Promise.all(
    architects.map((architect, i) =>
      architect.run(`
        Diseña arquitectura para: ${requirement}
 
        Guarda tu propuesta en:
        docs/proposals/architecture-proposal-${i + 1}.md
      `)
    )
  );
 
  console.log('✅ 3 propuestas generadas');
 
  // Evaluador imparcial
  const evaluator = new ClaudeCode({
    model: 'claude-opus-4-5-20251101',
    systemPrompt: 'Evalúas arquitecturas objetivamente considerando trade-offs'
  });
 
  // Evaluar todas las propuestas
  const evaluation = await evaluator.run(`
    Evalúa estas 3 propuestas:
    ${proposals.map(p => p.filesModified[0]).join('\n')}
 
    Criterios:
    - Simplicidad (1-10)
    - Escalabilidad (1-10)
    - Mantenibilidad (1-10)
    - Performance (1-10)
    - Costo de implementación (1-10)
 
    Recomienda la mejor para el contexto: ${requirement}
 
    Guarda evaluación en docs/proposals/evaluation.md
  `);
 
  console.log('📊 Evaluación completa');
  return evaluation.filesModified[0];
}
 
// Uso
const bestArchitecture = await chooseBestArchitecture(
  'E-commerce platform para 1M usuarios'
);

Control de flujo y coordinación

Orquestador centralizado

class AgentOrchestrator {
  constructor(config) {
    this.agents = {};
    this.results = {};
    this.config = config;
  }
 
  registerAgent(name, agent) {
    this.agents[name] = agent;
  }
 
  async execute(workflow) {
    console.log('🎯 Iniciando workflow:', workflow.name);
 
    for (const step of workflow.steps) {
      console.log(`\n▶️  Ejecutando: ${step.name}`);
 
      // Verificar dependencias
      if (step.dependsOn) {
        const dependencies = step.dependsOn.map(dep => this.results[dep]);
        if (dependencies.some(d => !d)) {
          throw new Error(`Dependencia no satisfecha para ${step.name}`);
        }
      }
 
      // Ejecutar agente
      const agent = this.agents[step.agent];
      const result = await agent.run(step.task);
 
      // Guardar resultado
      this.results[step.name] = result;
 
      // Verificar condiciones de parada
      if (step.stopIf && this.evaluateCondition(step.stopIf, result)) {
        console.log('🛑 Condición de parada alcanzada');
        break;
      }
 
      console.log(`✅ ${step.name} completado`);
    }
 
    console.log('\n🎉 Workflow completado');
    return this.results;
  }
 
  evaluateCondition(condition, result) {
    // Evaluar condición basándose en resultado
    // Simplificado para el ejemplo
    return condition(result);
  }
}
 
// Uso
const orchestrator = new AgentOrchestrator();
 
orchestrator.registerAgent('planner', planningAgent);
orchestrator.registerAgent('implementer', implementationAgent);
orchestrator.registerAgent('tester', testingAgent);
 
const workflow = {
  name: 'Feature Development',
  steps: [
    {
      name: 'planning',
      agent: 'planner',
      task: 'Diseña arquitectura para feature X'
    },
    {
      name: 'implementation',
      agent: 'implementer',
      task: 'Implementa según plan',
      dependsOn: ['planning']
    },
    {
      name: 'testing',
      agent: 'tester',
      task: 'Genera y ejecuta tests',
      dependsOn: ['implementation'],
      stopIf: (result) => result.output.includes('FAIL')
    }
  ]
};
 
await orchestrator.execute(workflow);

Mejores prácticas

1. Evita sobre-orquestación

// ❌ Demasiado complejo
const agentForEachFunction = files.map(file =>
  new ClaudeCode({ /* config */ })
);
 
// ✅ Un agente puede procesar múltiples archivos
const agent = new ClaudeCode({ /* config */ });
await agent.run(`Procesa estos archivos: ${files.join('\n')}`);

2. Manejo de errores robusto

async function robustPipeline() {
  try {
    const step1 = await agent1.run(task1);
 
    const step2 = await agent2.run(task2);
 
    return { success: true, results: [step1, step2] };
  } catch (error) {
    console.error('Pipeline failed:', error);
 
    // Rollback o cleanup
    await cleanup();
 
    return { success: false, error };
  }
}

3. Logging y observabilidad

function logAgentExecution(agentName, task, result) {
  console.log(`[${new Date().toISOString()}] ${agentName}`);
  console.log(`Task: ${task}`);
  console.log(`Duration: ${result.duration}ms`);
  console.log(`Tokens: ${result.tokensUsed}`);
  console.log(`Files modified: ${result.filesModified.length}`);
}

4. Rate limiting

import pLimit from 'p-limit';
 
const limit = pLimit(3); // Max 3 agentes concurrentes
 
const results = await Promise.all(
  tasks.map(task =>
    limit(() => agent.run(task))
  )
);

Resumen

Patrones de orquestación:

  1. Pipeline secuencial - Uno tras otro
  2. Parallel execution - Simultáneos
  3. Maestro-trabajadores - Coordinador + ejecutores
  4. Iterativo con feedback - Hasta lograr objetivo
  5. Especialización por dominio - Expertos por área
  6. Consensus-based - Mejor de múltiples propuestas

Componentes clave:

  • Agentes especializados
  • Coordinación de flujo
  • Manejo de dependencias
  • Gestión de errores

Cuándo orquestar:

  • Workflows complejos
  • Tareas que requieren múltiples expertises
  • Procesamiento paralelo para velocidad
  • Iteración hasta lograr calidad

En el siguiente punto aprenderás a integrar Claude Code en pipelines de CI/CD para automatización completa.


10.5 Integración en pipelines

Claude Code puede integrarse en tus pipelines de CI/CD para automatizar code review, generación de documentación, testing y más. En este punto aprenderás a integrar agentes en GitHub Actions, GitLab CI y otros sistemas.


Integración en GitHub Actions

Caso 1: Code review automático en PRs

# .github/workflows/ai-code-review.yml
name: AI Code Review
 
on:
  pull_request:
    types: [opened, synchronize]
 
jobs:
  ai-review:
    runs-on: ubuntu-latest
 
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  # Necesario para diff
 
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
 
      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code
 
      - name: Run AI Code Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          node scripts/ai-review.js
 
      - name: Post review as comment
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const review = fs.readFileSync('review-output.md', 'utf8');
 
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: review
            });

Script de review (scripts/ai-review.js):

import { ClaudeCode } from '@anthropic-ai/claude-code';
import { execSync } from 'child_process';
import fs from 'fs';
 
async function runCodeReview() {
  // Obtener archivos cambiados
  const changedFiles = execSync('git diff --name-only origin/main...HEAD')
    .toString()
    .trim()
    .split('\n')
    .filter(f => f.endsWith('.ts') || f.endsWith('.js'));
 
  console.log(`Revisando ${changedFiles.length} archivos...`);
 
  // Crear agente reviewer
  const reviewer = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: `
      Eres un code reviewer experimentado.
 
      Enfócate en:
      - Bugs potenciales (P1)
      - Vulnerabilidades de seguridad (P1)
      - Performance issues (P2)
      - Code smells (P3)
 
      Formato de output: Markdown con headings por archivo
    `
  });
 
  // Ejecutar review
  const result = await reviewer.run(`
    Revisa estos archivos cambiados en el PR:
    ${changedFiles.join('\n')}
 
    Para cada archivo:
    1. Lee el diff completo (cambios específicos del PR)
    2. Identifica issues con severidad
    3. Sugiere mejoras
 
    Genera reporte en Markdown
  `);
 
  // Generar reporte formateado
  const report = `
## 🤖 AI Code Review
 
${result.output}
 
---
 
*Review automático generado por Claude Code*
*Modelo: claude-sonnet-4-20250514*
*Archivos revisados: ${changedFiles.length}*
  `;
 
  fs.writeFileSync('review-output.md', report);
  console.log('✅ Review completado');
}
 
runCodeReview().catch(console.error);

Caso 2: Generación automática de changelog

# .github/workflows/changelog.yml
name: Generate Changelog
 
on:
  release:
    types: [created]
 
jobs:
  changelog:
    runs-on: ubuntu-latest
 
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
 
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
 
      - name: Generate Changelog
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          npm install -g @anthropic-ai/claude-code
          node scripts/generate-changelog.js
 
      - name: Commit Changelog
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add CHANGELOG.md
          git commit -m "docs: update changelog for ${{ github.event.release.tag_name }}"
          git push

Script de changelog (scripts/generate-changelog.js):

import { ClaudeCode } from '@anthropic-ai/claude-code';
import { execSync } from 'child_process';
import fs from 'fs';
 
async function generateChangelog() {
  // Obtener commits desde último release
  const previousTag = execSync('git describe --tags --abbrev=0 HEAD^')
    .toString()
    .trim();
 
  const commits = execSync(`git log ${previousTag}..HEAD --pretty=format:"%h %s"`)
    .toString()
    .trim();
 
  const changelogAgent = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: `
      Generas changelogs claros y bien organizados.
 
      Formato:
      ## [Version] - YYYY-MM-DD
 
      ### Added
      - Feature X
 
      ### Changed
      - Updated Y
 
      ### Fixed
      - Bug Z
 
      Agrupa commits relacionados.
      Usa lenguaje claro orientado a usuarios, no técnico.
    `
  });
 
  const result = await changelogAgent.run(`
    Genera entrada de changelog basándote en estos commits:
 
    ${commits}
 
    Version: ${process.env.GITHUB_REF_NAME}
    Fecha: ${new Date().toISOString().split('T')[0]}
  `);
 
  // Prepend al changelog existente
  let currentChangelog = '';
  if (fs.existsSync('CHANGELOG.md')) {
    currentChangelog = fs.readFileSync('CHANGELOG.md', 'utf8');
  }
 
  const newChangelog = result.output + '\n\n' + currentChangelog;
  fs.writeFileSync('CHANGELOG.md', newChangelog);
 
  console.log('✅ Changelog generado');
}
 
generateChangelog().catch(console.error);

Caso 3: Verificación de breaking changes

# .github/workflows/breaking-changes.yml
name: Detect Breaking Changes
 
on:
  pull_request:
    branches: [main]
 
jobs:
  check-breaking:
    runs-on: ubuntu-latest
 
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
 
      - uses: actions/setup-node@v4
 
      - name: Check for Breaking Changes
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          npm install -g @anthropic-ai/claude-code
          node scripts/check-breaking-changes.js
 
      - name: Comment if breaking changes found
        if: failure()
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const analysis = fs.readFileSync('breaking-changes.md', 'utf8');
 
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `## ⚠️ Breaking Changes Detected\n\n${analysis}`
            });

Script (scripts/check-breaking-changes.js):

import { ClaudeCode } from '@anthropic-ai/claude-code';
import { execSync } from 'child_process';
import fs from 'fs';
 
async function checkBreakingChanges() {
  const changedFiles = execSync('git diff --name-only origin/main...HEAD')
    .toString()
    .trim()
    .split('\n');
 
  const analyzer = new ClaudeCode({
    model: 'claude-opus-4-5-20251101', // Modelo más capaz
    systemPrompt: `
      Analizas cambios de API para detectar breaking changes.
 
      Breaking changes incluyen:
      - Eliminar funciones/métodos públicos
      - Cambiar firma de funciones (parámetros, tipos de retorno)
      - Renombrar exports públicos
      - Cambiar comportamiento de APIs públicas
 
      Output:
      - Lista de breaking changes con severidad
      - Impacto estimado
      - Sugerencias de mitigación
    `
  });
 
  const result = await analyzer.run(`
    Analiza estos archivos para detectar breaking changes:
    ${changedFiles.join('\n')}
 
    Compara con la versión en origin/main
 
    Si encuentras breaking changes, detalla:
    1. Qué cambió
    2. Impacto (alto/medio/bajo)
    3. Sugerencias para migración
  `);
 
  if (result.output.includes('Breaking change')) {
    fs.writeFileSync('breaking-changes.md', result.output);
    console.error('❌ Breaking changes detectados');
    process.exit(1);
  } else {
    console.log('✅ No breaking changes');
  }
}
 
checkBreakingChanges().catch(console.error);

Integración en GitLab CI

Ejemplo: Pipeline completo

# .gitlab-ci.yml
stages:
  - review
  - test
  - deploy
 
ai-code-review:
  stage: review
  image: node:20
  before_script:
    - npm install -g @anthropic-ai/claude-code
  script:
    - node scripts/gitlab-review.js
  artifacts:
    reports:
      codequality: code-review.json
  only:
    - merge_requests
 
auto-documentation:
  stage: review
  image: node:20
  before_script:
    - npm install -g @anthropic-ai/claude-code
  script:
    - node scripts/generate-docs.js
  artifacts:
    paths:
      - docs/api/
  only:
    - main

Integración en Jenkins

// Jenkinsfile
pipeline {
  agent any
 
  environment {
    ANTHROPIC_API_KEY = credentials('anthropic-api-key')
  }
 
  stages {
    stage('Code Review') {
      steps {
        script {
          sh 'npm install -g @anthropic-ai/claude-code'
          sh 'node scripts/jenkins-review.js'
        }
      }
    }
 
    stage('Generate Docs') {
      when {
        branch 'main'
      }
      steps {
        script {
          sh 'node scripts/auto-docs.js'
        }
      }
    }
  }
 
  post {
    always {
      publishHTML([
        reportDir: 'reports',
        reportFiles: 'code-review.html',
        reportName: 'AI Code Review'
      ])
    }
  }
}

Casos de uso avanzados

1. Test generator en CI

// scripts/generate-missing-tests.js
import { ClaudeCode } from '@anthropic-ai/claude-code';
import { glob } from 'glob';
import fs from 'fs';
 
async function generateMissingTests() {
  // Encontrar archivos sin tests
  const sourceFiles = await glob('src/**/*.ts', {
    ignore: ['**/*.test.ts', '**/*.spec.ts']
  });
 
  const testGenerator = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Generas tests exhaustivos siguiendo TDD best practices'
  });
 
  const filesWithoutTests = sourceFiles.filter(file => {
    const testFile = file.replace('.ts', '.test.ts');
    return !fs.existsSync(testFile);
  });
 
  console.log(`Generando tests para ${filesWithoutTests.length} archivos...`);
 
  for (const file of filesWithoutTests) {
    await testGenerator.run(`
      Genera tests completos para ${file}
      Guarda en ${file.replace('.ts', '.test.ts')}
    `);
  }
 
  // Si se generaron tests, crear commit
  if (filesWithoutTests.length > 0) {
    execSync('git add .');
    execSync('git commit -m "test: add missing tests [skip ci]"');
    execSync('git push');
  }
}

2. Dependency update con validación

// scripts/smart-dependency-update.js
async function smartDependencyUpdate() {
  const updater = new ClaudeCode({
    model: 'claude-opus-4-5-20251101',
    systemPrompt: 'Analizas actualizaciones de dependencias con enfoque en seguridad y compatibilidad'
  });
 
  await updater.run(`
    1. Ejecuta npm outdated
    2. Para cada dependencia desactualizada:
       a. Lee CHANGELOG en node_modules/[dep]/CHANGELOG.md
       b. Busca breaking changes
       c. Evalúa impacto de seguridad (CVEs)
    3. Categoriza en:
       - Seguras de actualizar (patch, no breaking)
       - Requieren revisión (minor con breaking)
       - Alto riesgo (major version)
    4. Actualiza solo las seguras
    5. Genera reporte de las pendientes
 
    Guarda reporte en dependency-update-report.md
  `);
 
  // Ejecutar tests después de actualizar
  const testResult = execSync('npm test').toString();
 
  if (testResult.includes('FAIL')) {
    console.log('❌ Tests fallaron después de actualizar deps');
    execSync('git checkout package.json package-lock.json');
  } else {
    console.log('✅ Dependencias actualizadas exitosamente');
  }
}

3. Documentation site generator

// scripts/generate-docs-site.js
async function generateDocsSite() {
  const docsGenerator = new ClaudeCode({
    model: 'claude-opus-4-5-20251101',
    systemPrompt: 'Generas documentación técnica completa y navegable'
  });
 
  await docsGenerator.run(`
    Genera sitio de documentación completo:
 
    1. API Reference
       - Lee todos los archivos en src/
       - Extrae funciones/clases públicas
       - Genera docs en formato Markdown
       - Incluye ejemplos de uso
 
    2. Guides
       - Getting started
       - Common use cases
       - Best practices
       - Troubleshooting
 
    3. Architecture
       - Diagrama de componentes
       - Flujos de datos
       - Decisiones de diseño
 
    Estructura de salida:
    docs/
      ├── api/
      ├── guides/
      ├── architecture/
      └── index.md
 
    Formato compatible con VitePress/Docusaurus
  `);
 
  // Build site
  execSync('cd docs && npm run build');
 
  // Deploy a GitHub Pages
  execSync('gh-pages -d docs/dist');
}

Mejores prácticas

1. Secrets management

# ❌ NUNCA hardcodear API keys
env:
  ANTHROPIC_API_KEY: "sk-ant-..."  # ¡PELIGROSO!
 
# ✅ Usar secrets del CI
env:
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

2. Fail-safe

async function safeAIOperation() {
  try {
    const result = await agent.run(task);
    return result;
  } catch (error) {
    console.error('AI operation failed:', error);
 
    // No fallar el pipeline completo
    // Solo marcar como warning
    console.warn('⚠️  Continuando sin AI assist');
    return null;
  }
}

3. Caching

# GitHub Actions: Cache node_modules
- name: Cache dependencies
  uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

4. Timeouts

const result = await agent.run(task, {
  timeout: 120000 // 2 minutos max
});

5. Cost control

// Solo ejecutar AI en ciertos archivos
const shouldRunAI = changedFiles.some(f =>
  f.startsWith('src/') && !f.includes('.test.')
);
 
if (shouldRunAI) {
  await runAIReview();
} else {
  console.log('Skipping AI review (no relevant changes)');
}

Monitoreo y observabilidad

Logging estructurado

function logAIExecution(operation, result) {
  const log = {
    timestamp: new Date().toISOString(),
    operation,
    model: result.model,
    tokensUsed: result.tokensUsed,
    duration: result.duration,
    cost: estimateCost(result.tokensUsed),
    success: result.success
  };
 
  console.log(JSON.stringify(log));
 
  // Opcional: Enviar a servicio de monitoring
  // sendToDatadog(log);
  // sendToNewRelic(log);
}

Métricas

// Trackear métricas importantes
const metrics = {
  totalReviews: 0,
  issuesFound: 0,
  falsePositives: 0,
  avgDuration: 0,
  avgCost: 0
};
 
// Actualizar después de cada ejecución
updateMetrics(metrics, result);
 
// Reportar periódicamente
reportMetrics(metrics);

Resumen

Integración en CI/CD permite:

Code review automático en cada PR ✅ Generación de changelogs en releases ✅ Detección de breaking changes antes de merge ✅ Generación de tests faltantes ✅ Actualización inteligente de dependencias ✅ Documentación automática siempre actualizada

Plataformas soportadas:

  • GitHub Actions
  • GitLab CI
  • Jenkins
  • CircleCI
  • Travis CI
  • Cualquier sistema que ejecute Node.js

Mejores prácticas:

  • Secrets management apropiado
  • Fail-safe (no romper pipeline si AI falla)
  • Timeouts configurados
  • Cost control
  • Monitoreo y logging

Beneficios:

  • Automatización completa
  • Consistencia en calidad
  • Ahorro de tiempo del equipo
  • Detección temprana de problemas

Con esto concluye el módulo sobre Claude Code SDK. En la práctica aplicarás todo lo aprendido construyendo agentes reales.


Práctica del módulo 10: Claude Code SDK

En esta práctica construirás agentes reales usando Claude Code como SDK. Aplicarás todo lo aprendido sobre automatización, orquestación y pipelines.


Objetivos

  • Crear agentes especializados con Claude Code SDK
  • Implementar orquestación de múltiples agentes
  • Automatizar workflows completos
  • Integrar agentes en scripts y pipelines
  • Construir herramientas productivas reales

Preparación

Requisitos

# Node.js 18+
node --version
 
# Instalar Claude Code globalmente
npm install -g @anthropic-ai/claude-code
 
# Verificar instalación
claude --version

Configurar API Key

# Opción 1: Variable de entorno
export ANTHROPIC_API_KEY="tu-api-key"
 
# Opción 2: Archivo .env
echo "ANTHROPIC_API_KEY=tu-api-key" > .env

Proyecto de práctica

mkdir ~/claude-sdk-practice
cd ~/claude-sdk-practice
npm init -y
 
# Instalar dependencias
npm install @anthropic-ai/claude-code dotenv
npm install -D @types/node typescript
 
# Configurar TypeScript
npx tsc --init

Ejercicio 1: Tu primer agente programático

Objetivo: Crear un agente simple usando el SDK.

Paso 1.1: Crear agente básico

// src/agents/simple-agent.ts
import { ClaudeCode } from '@anthropic-ai/claude-code';
import dotenv from 'dotenv';
 
dotenv.config();
 
async function main() {
  const agent = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    apiKey: process.env.ANTHROPIC_API_KEY
  });
 
  const result = await agent.run('Analiza el archivo package.json y describe su contenido');
 
  console.log('📊 Resultado:');
  console.log(result.output);
  console.log('\n📈 Estadísticas:');
  console.log(`Tokens usados: ${result.tokensUsed}`);
  console.log(`Duración: ${result.duration}ms`);
}
 
main().catch(console.error);

Paso 1.2: Ejecutar

npx tsx src/agents/simple-agent.ts

Verifica:

  • ¿El agente leyó package.json?
  • ¿La respuesta es coherente?
  • ¿Cuántos tokens consumió?

Ejercicio 2: Agente especializado

Objetivo: Crear agentes con system prompts específicos.

Paso 2.1: Agente de refactoring

// src/agents/refactor-agent.ts
import { ClaudeCode } from '@anthropic-ai/claude-code';
 
const refactorAgent = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Eres un experto en refactoring de código.
 
    Principios que sigues:
    - DRY (Don't Repeat Yourself)
    - SOLID
    - Funciones pequeñas (<20 líneas)
    - Nombres descriptivos
 
    Siempre:
    - Explicas qué cambios hiciste y por qué
    - Mantienes tests pasando
    - Priorizas legibilidad
  `,
  tools: ['Read', 'Write', 'Edit']
});
 
async function refactorFile(filePath: string) {
  console.log(`🔨 Refactorizando ${filePath}...`);
 
  const result = await refactorAgent.run(`
    Refactoriza ${filePath}
 
    Mejoras a aplicar:
    1. Extraer funciones largas
    2. Renombrar variables/funciones con nombres poco claros
    3. Eliminar código duplicado
    4. Añadir tipos si falta (TypeScript)
 
    Mantén la funcionalidad exacta.
  `);
 
  console.log('✅ Refactoring completado');
  console.log('Cambios:', result.output);
}
 
// Uso
refactorFile('src/legacy/old-code.ts');

Paso 2.2: Probar con código legacy

Crea un archivo con código que necesite refactoring:

// src/legacy/old-code.ts
function processData(d) {
  var r = [];
  for (var i = 0; i < d.length; i++) {
    if (d[i].status == 'active') {
      r.push(d[i]);
    }
  }
  return r;
}
 
function calc(x, y, z) {
  var a = x + y;
  var b = a * z;
  var c = b / 2;
  return c;
}

Ejecuta el agente y verifica las mejoras.


Ejercicio 3: Pipeline secuencial

Objetivo: Orquestar múltiples agentes en secuencia.

Implementación

// src/pipelines/feature-pipeline.ts
import { ClaudeCode } from '@anthropic-ai/claude-code';
 
class FeaturePipeline {
  private planner: ClaudeCode;
  private implementer: ClaudeCode;
  private tester: ClaudeCode;
 
  constructor() {
    this.planner = new ClaudeCode({
      model: 'claude-opus-4-5-20251101',
      systemPrompt: 'Arquitecto de software senior',
      tools: ['Read', 'Grep', 'Glob']
    });
 
    this.implementer = new ClaudeCode({
      model: 'claude-sonnet-4-20250514',
      systemPrompt: 'Implementas código siguiendo diseños técnicos',
      tools: ['Read', 'Write', 'Edit', 'Bash']
    });
 
    this.tester = new ClaudeCode({
      model: 'claude-sonnet-4-20250514',
      systemPrompt: 'Generas tests exhaustivos con Vitest',
      tools: ['Read', 'Write', 'Bash']
    });
  }
 
  async buildFeature(requirement: string) {
    console.log('🚀 Iniciando pipeline para:', requirement);
 
    // Fase 1: Planning
    console.log('\n📋 Fase 1: Planning');
    const plan = await this.planner.run(`
      Diseña arquitectura para: ${requirement}
      Guarda plan en docs/designs/feature-plan.md
    `);
    console.log('✅ Plan generado');
 
    // Fase 2: Implementation
    console.log('\n🔨 Fase 2: Implementation');
    const impl = await this.implementer.run(`
      Lee el plan: ${plan.filesModified[0]}
      Implementa TODO lo descrito
    `);
    console.log('✅ Implementación completa');
 
    // Fase 3: Tests
    console.log('\n🧪 Fase 3: Tests');
    const tests = await this.tester.run(`
      Genera tests para:
      ${impl.filesModified.join('\n')}
    `);
    console.log('✅ Tests generados');
 
    // Fase 4: Verificar tests
    console.log('\n✓ Fase 4: Ejecutar tests');
    const testRun = await this.tester.run('Ejecuta npm test');
 
    if (testRun.output.includes('FAIL')) {
      console.log('❌ Tests fallaron');
      return { success: false };
    }
 
    console.log('✅ Todos los tests pasan');
    console.log('\n🎉 Feature completado exitosamente');
 
    return {
      success: true,
      plan: plan.filesModified[0],
      implementation: impl.filesModified,
      tests: tests.filesModified
    };
  }
}
 
// Uso
const pipeline = new FeaturePipeline();
await pipeline.buildFeature('Validación de emails con regex y tests');

Ejercicio 4: Ejecución paralela

Objetivo: Ejecutar múltiples agentes simultáneamente.

Implementación

// src/workflows/parallel-review.ts
import { ClaudeCode } from '@anthropic-ai/claude-code';
 
async function parallelCodeReview(files: string[]) {
  const securityReviewer = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Experto en seguridad OWASP'
  });
 
  const perfReviewer = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Experto en performance y optimización'
  });
 
  const styleReviewer = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Experto en clean code y mantenibilidad'
  });
 
  console.log('🔍 Ejecutando 3 reviews en paralelo...');
  const startTime = Date.now();
 
  // Ejecutar todos simultáneamente
  const [security, perf, style] = await Promise.all([
    securityReviewer.run(`Revisa seguridad de ${files.join(', ')}`),
    perfReviewer.run(`Analiza performance de ${files.join(', ')}`),
    styleReviewer.run(`Revisa clean code en ${files.join(', ')}`)
  ]);
 
  const duration = Date.now() - startTime;
 
  console.log(`✅ Reviews completados en ${duration}ms`);
 
  return {
    security: security.output,
    performance: perf.output,
    style: style.output,
    totalDuration: duration
  };
}
 
// Uso
const reviews = await parallelCodeReview([
  'src/auth/login.ts',
  'src/auth/register.ts'
]);
 
console.log('\n📊 Reportes:');
console.log('\n🔒 Security:', reviews.security);
console.log('\n⚡ Performance:', reviews.performance);
console.log('\n✨ Style:', reviews.style);

Comparación:

  • Ejecuta reviews en paralelo y mide tiempo
  • Ejecuta reviews secuencialmente y mide tiempo
  • ¿Cuánto más rápido es paralelo?

Ejercicio 5: Agente de automatización no-coding

Objetivo: Crear agente para tareas que no involucran código.

Caso: Organizador de documentación

// src/automation/doc-organizer.ts
import { ClaudeCode } from '@anthropic-ai/claude-code';
 
const docOrganizer = new ClaudeCode({
  model: 'claude-sonnet-4-20250514',
  systemPrompt: `
    Organizas documentación de forma lógica y mantenible.
 
    Criterios:
    - Estructura por temas/categorías
    - Nomenclatura descriptiva y consistente
    - README en cada carpeta explicando contenido
  `
});
 
async function organizeDocs() {
  const result = await docOrganizer.run(`
    Analiza todos los archivos .md en docs/
 
    Organízalos en:
    docs/
      ├── guides/ (tutoriales y guías)
      ├── api/ (documentación de API)
      ├── architecture/ (diseño y arquitectura)
      └── misc/ (otros)
 
    Para cada carpeta:
    - Crea README.md explicando su contenido
    - Renombra archivos si tienen nombres poco claros
    - Genera índice principal en docs/README.md
 
    Genera reporte de cambios en docs/reorganization-report.md
  `);
 
  console.log('📚 Documentación organizada');
  console.log(result.output);
}

Ejercicio 6: Integración en script útil

Objetivo: Crear herramienta CLI útil con agentes.

Herramienta: Smart Git Commit

// src/tools/smart-commit.ts
#!/usr/bin/env node
 
import { ClaudeCode } from '@anthropic-ai/claude-code';
import { execSync } from 'child_process';
 
async function smartCommit() {
  // Verificar que hay cambios staged
  const status = execSync('git status --porcelain').toString();
  if (!status) {
    console.log('No hay cambios staged');
    process.exit(1);
  }
 
  // Obtener diff
  const diff = execSync('git diff --staged').toString();
 
  // Agente que genera mensaje de commit
  const commitAgent = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: `
      Generas mensajes de commit siguiendo Conventional Commits.
 
      Formato:
      <type>: <description>
 
      [optional body]
 
      Types: feat, fix, docs, style, refactor, test, chore
 
      Mensaje debe ser:
      - Claro y conciso
      - Describir QUÉ y POR QUÉ, no CÓMO
      - En imperativo (ej: "add" no "added")
    `
  });
 
  console.log('🤖 Generando mensaje de commit...');
 
  const result = await commitAgent.run(`
    Basándote en este diff:
 
    ${diff}
 
    Genera mensaje de commit apropiado.
    Solo el mensaje, sin explicaciones adicionales.
  `);
 
  const message = result.output.trim();
 
  console.log('\n📝 Mensaje generado:');
  console.log(message);
  console.log('\n¿Crear commit con este mensaje? (y/n)');
 
  // En producción, usar readline para input
  // Por ahora, auto-approve
  execSync(`git commit -m "${message}"`);
 
  console.log('✅ Commit creado');
}
 
smartCommit().catch(console.error);

Hacerlo ejecutable:

chmod +x src/tools/smart-commit.ts
 
# Agregar a package.json
{
  "bin": {
    "smart-commit": "./src/tools/smart-commit.ts"
  }
}
 
# Instalar globalmente
npm link
 
# Usar
git add .
smart-commit

Ejercicio 7: Pipeline de CI/CD

Objetivo: Integrar agentes en GitHub Actions.

Paso 7.1: Crear workflow

# .github/workflows/ai-review.yml
name: AI Code Review
 
on:
  pull_request:
    types: [opened, synchronize]
 
jobs:
  ai-review:
    runs-on: ubuntu-latest
 
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
 
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
 
      - name: Install dependencies
        run: |
          npm install -g @anthropic-ai/claude-code
          npm install
 
      - name: Run AI Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: npx tsx scripts/ci-review.ts
 
      - name: Comment on PR
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const review = fs.readFileSync('review.md', 'utf8');
 
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: review
            });

Paso 7.2: Script de review

// scripts/ci-review.ts
import { ClaudeCode } from '@anthropic-ai/claude-code';
import { execSync } from 'child_process';
import fs from 'fs';
 
async function ciReview() {
  const files = execSync('git diff --name-only origin/main...HEAD')
    .toString()
    .trim()
    .split('\n')
    .filter(f => f.endsWith('.ts') || f.endsWith('.js'));
 
  const reviewer = new ClaudeCode({
    model: 'claude-sonnet-4-20250514',
    systemPrompt: 'Code reviewer experimentado, enfocado en bugs y security'
  });
 
  const result = await reviewer.run(`
    Revisa estos archivos cambiados:
    ${files.join('\n')}
 
    Enfócate en:
    - P1: Bugs críticos y vulnerabilidades
    - P2: Problemas de performance
    - P3: Code smells
 
    Formato Markdown con emojis
  `);
 
  const report = `
## 🤖 AI Code Review
 
${result.output}
 
---
 
*Review generado automáticamente*
*Archivos revisados: ${files.length}*
*Modelo: claude-sonnet-4-20250514*
  `;
 
  fs.writeFileSync('review.md', report);
  console.log('✅ Review completado');
}
 
ciReview().catch(console.error);

Ejercicio 8: Proyecto completo - Documentation Generator

Objetivo: Construir herramienta completa que genere documentación automática.

Especificaciones

// src/projects/doc-generator/index.ts
 
/**
 * Generador de documentación automática
 *
 * Features:
 * 1. Analiza código TypeScript
 * 2. Extrae funciones/clases públicas
 * 3. Genera docs en Markdown
 * 4. Crea ejemplos de uso
 * 5. Genera índice navegable
 */
 
class DocumentationGenerator {
  private analyzer: ClaudeCode;
  private writer: ClaudeCode;
 
  constructor() {
    this.analyzer = new ClaudeCode({
      model: 'claude-sonnet-4-20250514',
      systemPrompt: 'Analizas código y extraes APIs públicas'
    });
 
    this.writer = new ClaudeCode({
      model: 'claude-sonnet-4-20250514',
      systemPrompt: 'Escribes documentación clara con ejemplos'
    });
  }
 
  async generateDocs(sourceDir: string, outputDir: string) {
    // TODO: Implementar
    // 1. Encontrar todos los archivos .ts en sourceDir
    // 2. Para cada archivo, analizar y extraer API pública
    // 3. Generar documentación
    // 4. Crear índice
    // 5. Guardar en outputDir
  }
}

Tu tarea:

  1. Implementa la clase completa
  2. Agrega tests
  3. Crea CLI para usarla
  4. Documenta su uso

Checklist de validación

Marca cuando completes cada ejercicio:

Ejercicios básicos

  • Ejercicio 1: Primer agente programático
  • Ejercicio 2: Agente especializado
  • Ejercicio 3: Pipeline secuencial

Ejercicios intermedios

  • Ejercicio 4: Ejecución paralela
  • Ejercicio 5: Automatización no-coding
  • Ejercicio 6: Herramienta CLI

Ejercicios avanzados

  • Ejercicio 7: Pipeline de CI/CD
  • Ejercicio 8: Proyecto completo

Validación técnica

  • Entiendo cómo crear agentes con SDK
  • Puedo configurar system prompts efectivos
  • Sé orquestar múltiples agentes
  • Puedo integrar en scripts y pipelines
  • Manejo errores y timeouts apropiadamente

Retos adicionales (opcionales)

Reto A: Multi-language code migrator

Crea agente que migre código entre lenguajes:

const migrator = new ClaudeCode({
  systemPrompt: 'Experto en migración de código entre lenguajes'
});
 
// Python → TypeScript
await migrator.run('Convierte script.py a TypeScript');

Reto B: Automated PR generator

Crea herramienta que:

  1. Identifica mejoras potenciales en codebase
  2. Implementa las mejoras
  3. Crea PR automático con descripción

Reto C: Documentation site builder

Construye generador completo de sitio de docs:

  • Analiza código
  • Genera API reference
  • Crea guías y tutorials
  • Build con VitePress/Docusaurus
  • Deploy automático

Reflexión final

Qué aprendiste

1. _________________
2. _________________
3. _________________

Agentes que creaste

1. _________________
2. _________________
3. _________________

Caso de uso real que implementarás

_________________

Próximo módulo

En el Módulo 11: Proyecto Final aplicarás TODO lo aprendido en el curso para construir un proyecto integral que demuestre tu dominio de Claude Code.

¡Excelente trabajo dominando Claude Code SDK! Ahora puedes automatizar prácticamente cualquier workflow relacionado con código y conocimiento.