agent-mp 0.5.20 → 0.5.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -405,12 +405,15 @@ async function cmdSetup(rl) {
405
405
  await writeJson(path.join(projectDir, '.agent', 'config.json'), agentConfig);
406
406
  console.log(chalk.green(' .agent/config.json generated'));
407
407
  const templates = {
408
- '.agent/INDEX.md': `# ${projectName} - Agent Entry Point\n\n## Navegacion por rol\n| Si sos... | Lee primero... |\n|-----------|----------------|\n| ORCHESTRATOR | .agent/rules/workflow.md |\n| IMPLEMENTOR | .agent/tasks/{ID}/plan.json |\n| REVIEWER | .agent/rules/workflow.md |\n`,
409
- '.agent/rules/workflow.md': '# Agent Workflow Contract\n\n## REGLA #1 - Separacion de roles\nUn rol NUNCA ejecuta acciones de otro rol.\n\n## Roles\n- ORCHESTRATOR: planifica\n- IMPLEMENTOR: ejecuta\n- REVIEWER: valida\n',
410
- '.agent/rules/structure.md': '# Estructura\n\n## Aprobados\n.\n\n## Prohibidos\nnode_modules, dist, .git\n',
411
- '.agent/rules/patterns.md': '# Patrones\n\n- kebab-case: archivos\n- PascalCase: clases\n- camelCase: variables\n',
412
- '.agent/context/architecture.md': '# Arquitectura - NIVEL 0\n\n| Servicio | Stack | Puerto | Detalle |\n|----------|-------|--------|---------|\n| - | - | - | - |\n',
413
- '.agent/AGENT.md': '# Sub-Agentes\n\n1. Lee .agent/INDEX.md\n2. Lee .agent/rules/workflow.md\n3. Actua SOLO dentro de tu rol\n',
408
+ '.agent/INDEX.md': `# ${projectName} Agent Entry Point\n\n> Leé este archivo antes de cualquier accion.\n\n## Proyecto\n${projectName}\n\n## Navegacion por rol\n| Si sos... | Lee primero... | Luego... |\n|-----------|----------------|----------|\n| ORCHESTRATOR | .agent/rules/workflow.md | .agent/rules/orchestrator.md |\n| IMPLEMENTOR | .agent/rules/implementor.md | .agent/tasks/{ID}/plan.json |\n| REVIEWER | .agent/rules/reviewer.md | .agent/rules/workflow.md |\n\n## Contexto del proyecto\n- Arquitectura: .agent/context/architecture.md\n- Stack: ver .agent/config.json\n`,
409
+ '.agent/rules/workflow.md': `# Workflow Contract — ${projectName}\n\n## Flujo general\n\`\`\`\n[ORCHESTRATOR] planifica → genera plan.json\n ↓\n[IMPLEMENTOR] ejecuta el plan → modifica archivos\n ↓\n[REVIEWER] valida → genera result.md\n\`\`\`\n\n## REGLA #1 Separacion de roles\nCada CLI opera SOLO en su rol. Nunca ejecuta acciones de otro rol.\n\n## REGLA #2 — Orden estricto\nOrchestrator siempre primero. Implementor no actua sin plan. Reviewer no actua sin implementacion.\n\n## REGLA #3 — Sin inventar\nCada rol trabaja con los archivos reales del proyecto. No asume ni infiere sin leer.\n`,
410
+ '.agent/rules/orchestrator.md': `# Rol: ORCHESTRATOR — ${projectName}\n\n## Responsabilidad\nAnalizar el requerimiento, leer el contexto del proyecto y generar un plan de tareas claro y ejecutable.\n\n## Antes de planificar\n1. Leer .agent/context/architecture.md para entender los componentes\n2. Leer .agent/rules/structure.md para saber qué dirs son validos\n3. Leer .agent/rules/patterns.md para respetar convenciones del proyecto\n\n## Al generar el plan\n- Dividir el trabajo en pasos atomicos (1 paso = 1 cambio verificable)\n- Especificar rutas de archivos REALES (no genericas)\n- Indicar dependencias entre pasos si las hay\n\n## Prohibido\n- Modificar archivos de codigo directamente\n- Ejecutar comandos de build o test\n`,
411
+ '.agent/rules/implementor.md': `# Rol: IMPLEMENTOR — ${projectName}\n\n## Responsabilidad\nEjecutar el plan generado por el Orchestrator. Modificar archivos de codigo siguiendo las instrucciones exactas del plan.\n\n## Antes de implementar\n1. Leer .agent/tasks/{ID}/plan.json completo\n2. Leer .agent/rules/structure.md — no crear archivos en dirs prohibidos\n3. Leer .agent/rules/patterns.md — respetar convenciones\n\n## Al implementar\n- Seguir el plan paso a paso, en orden\n- No agregar cambios fuera del scope del plan\n- Marcar cada paso como completado al terminarlo\n\n## Prohibido\n- Modificar el plan\n- Hacer refactors no solicitados\n`,
412
+ '.agent/rules/reviewer.md': `# Rol: REVIEWER — ${projectName}\n\n## Responsabilidad\nValidar que la implementacion cumple el plan y respeta las reglas del proyecto.\n\n## Checklist de revision\n- [ ] Cada paso del plan fue implementado\n- [ ] No se modificaron archivos fuera del scope\n- [ ] Se respetan las convenciones de .agent/rules/patterns.md\n- [ ] La estructura cumple .agent/rules/structure.md\n- [ ] No hay codigo muerto ni imports sin usar\n\n## Al generar result.md\n- Indicar cada item como OK / FAIL / SKIP con razon\n- Si hay FAILs: describir exactamente que falta y en que archivo\n\n## Prohibido\n- Modificar archivos de codigo directamente\n- Aprobar implementaciones incompletas\n`,
413
+ '.agent/rules/structure.md': `# Estructura del proyecto — ${projectName}\n\n## Directorios aprobados\n- . (raiz del proyecto)\n\n## Directorios prohibidos\n- node_modules/\n- dist/\n- .git/\n- build/\n- target/\n- __pycache__/\n`,
414
+ '.agent/rules/patterns.md': `# Patrones y convenciones — ${projectName}\n\n## Nombrado\n- Archivos: kebab-case\n- Clases: PascalCase\n- Variables y funciones: camelCase\n- Constantes: UPPER_SNAKE_CASE\n\n## Reglas generales\n- No dejar console.log de debug en codigo productivo\n- Un archivo = una responsabilidad principal\n`,
415
+ '.agent/context/architecture.md': '# Arquitectura — NIVEL 0\n\n> Ejecuta `agent-mp explorer` para generar documentacion automatica.\n\n| Componente | Stack | Puerto | Proposito |\n|------------|-------|--------|-----------|\n| - | - | - | - |\n',
416
+ '.agent/AGENT.md': `# Instrucciones para Sub-Agentes — ${projectName}\n\n## Paso 1: Identificar tu rol\nLee .agent/INDEX.md para saber que archivo leer segun tu rol.\n\n## Paso 2: Leer el contexto\nAntes de cualquier accion, lee .agent/context/architecture.md.\n\n## Paso 3: Actua SOLO dentro de tu rol\nVer .agent/rules/workflow.md para las reglas de separacion de roles.\n`,
414
417
  };
415
418
  for (const [fp, content] of Object.entries(templates)) {
416
419
  await fs.mkdir(path.join(projectDir, path.dirname(fp)), { recursive: true });
@@ -293,12 +293,15 @@ export function setupCommand(program) {
293
293
  console.log(chalk.green(' ✓ .agent/config.json generated'));
294
294
  // Generate templates
295
295
  const templates = {
296
- '.agent/INDEX.md': `# ${projectName} — Agent Entry Point\n\n> Leé este archivo antes de cualquier accion.\n\n## Proyecto\n\n## Navegacion por rol\n| Si sos... | Lee primero... |\n|-----------|----------------|\n| ORCHESTRATOR | .agent/rules/workflow.md |\n| IMPLEMENTOR | .agent/tasks/{ID}/plan.json |\n| REVIEWER | .agent/rules/workflow.md |\n`,
297
- '.agent/rules/workflow.md': '# Agent Workflow Contract\n\n## REGLA #1 — Separacion de roles\nUn rol NUNCA ejecuta acciones de otro rol.\n\n## REGLA #2 — Un CLI NO cambia de rol\n\n## Roles\n- ORCHESTRATOR: planifica, genera plan.json\n- IMPLEMENTOR: ejecuta el plan\n- REVIEWER: valida, genera result.md\n',
298
- '.agent/rules/structure.md': '# Estructura\n\n## Aprobados\n.\n\n## Prohibidos\nnode_modules, dist, .git\n',
299
- '.agent/rules/patterns.md': '# Patrones\n\n- kebab-case para archivos\n- PascalCase para clases\n- camelCase para variables\n',
300
- '.agent/context/architecture.md': '# ArquitecturaNIVEL 0\n\n| Servicio | Stack | Puerto | Detalle |\n|----------|-------|--------|---------|\n| - | - | - | - |\n',
301
- '.agent/AGENT.md': '# Sub-Agentes\n\n1. Lee .agent/INDEX.md\n2. Lee .agent/rules/workflow.md\n3. Actua SOLO dentro de tu rol\n',
296
+ '.agent/INDEX.md': `# ${projectName} — Agent Entry Point\n\n> Leé este archivo antes de cualquier accion.\n\n## Proyecto\n${projectName}\n\n## Navegacion por rol\n| Si sos... | Lee primero... | Luego... |\n|-----------|----------------|----------|\n| ORCHESTRATOR | .agent/rules/workflow.md | .agent/rules/orchestrator.md |\n| IMPLEMENTOR | .agent/rules/implementor.md | .agent/tasks/{ID}/plan.json |\n| REVIEWER | .agent/rules/reviewer.md | .agent/rules/workflow.md |\n\n## Contexto del proyecto\n- Arquitectura: .agent/context/architecture.md\n- Stack: ver .agent/config.json\n`,
297
+ '.agent/rules/workflow.md': `# Workflow Contract — ${projectName}\n\n## Flujo general\n\`\`\`\n[ORCHESTRATOR] planifica → genera plan.json\n ↓\n[IMPLEMENTOR] ejecuta el plan → modifica archivos\n ↓\n[REVIEWER] valida → genera result.md\n\`\`\`\n\n## REGLA #1 — Separacion de roles\nCada CLI opera SOLO en su rol. Nunca ejecuta acciones de otro rol.\n\n## REGLA #2 — Orden estricto\nOrchestrator siempre primero. Implementor no actua sin plan. Reviewer no actua sin implementacion.\n\n## REGLA #3 — Sin inventar\nCada rol trabaja con los archivos reales del proyecto. No asume ni infiere sin leer.\n\n## REGLA #4 Escalada\nSi un rol encuentra un bloqueante, lo reporta. No lo omite ni lo parchea silenciosamente.\n`,
298
+ '.agent/rules/orchestrator.md': `# Rol: ORCHESTRATOR — ${projectName}\n\n## Responsabilidad\nAnalizar el requerimiento, leer el contexto del proyecto y generar un plan de tareas claro y ejecutable.\n\n## Antes de planificar\n1. Leer .agent/context/architecture.md para entender los componentes\n2. Leer .agent/rules/structure.md para saber qué dirs son validos\n3. Leer .agent/rules/patterns.md para respetar convenciones del proyecto\n\n## Al generar el plan\n- Dividir el trabajo en pasos atómicos (1 paso = 1 cambio verificable)\n- Especificar rutas de archivos REALES (no genéricas)\n- Indicar dependencias entre pasos si las hay\n- Estimar impacto: qué puede romperse con cada cambio\n\n## Prohibido\n- Modificar archivos de código directamente\n- Ejecutar comandos de build o test\n- Tomar decisiones de arquitectura sin documentarlas en el plan\n`,
299
+ '.agent/rules/implementor.md': `# Rol: IMPLEMENTOR — ${projectName}\n\n## Responsabilidad\nEjecutar el plan generado por el Orchestrator. Modificar archivos de código siguiendo las instrucciones exactas del plan.\n\n## Antes de implementar\n1. Leer .agent/tasks/{ID}/plan.json completo\n2. Leer .agent/rules/structure.md — no crear archivos en dirs prohibidos\n3. Leer .agent/rules/patterns.md — respetar convenciones de nombres y estructura\n\n## Al implementar\n- Seguir el plan paso a paso, en orden\n- Si un paso no es claro, documentar la ambigüedad, no improvisar\n- Marcar cada paso como completado al terminarlo\n- No agregar cambios fuera del scope del plan\n\n## Prohibido\n- Modificar el plan (eso es rol del Orchestrator)\n- Hacer refactors no solicitados\n- Ignorar pasos del plan aunque parezcan redundantes\n`,
300
+ '.agent/rules/reviewer.md': `# Rol: REVIEWER ${projectName}\n\n## Responsabilidad\nValidar que la implementacion cumple el plan, no rompe nada existente y respeta las reglas del proyecto.\n\n## Checklist de revision\n- [ ] Cada paso del plan fue implementado\n- [ ] No se modificaron archivos fuera del scope del plan\n- [ ] Se respetan las convenciones de .agent/rules/patterns.md\n- [ ] La estructura de dirs cumple .agent/rules/structure.md\n- [ ] No hay codigo muerto ni imports sin usar introducidos\n- [ ] Si hay tests, pasaron\n\n## Al generar result.md\n- Indicar cada item del checklist como OK / FAIL / SKIP con razon\n- Si hay FAILs: describir exactamente qué falta y en qué archivo\n- Si todo OK: marcar la tarea como DONE\n\n## Prohibido\n- Modificar archivos de código directamente\n- Aprobar implementaciones incompletas\n- Omitir items del checklist\n`,
301
+ '.agent/rules/structure.md': `# Estructura del proyecto — ${projectName}\n\n## Directorios aprobados\n- . (raiz del proyecto)\n\n## Directorios prohibidos (no crear ni modificar archivos aca)\n- node_modules/\n- dist/\n- .git/\n- build/\n- target/\n- __pycache__/\n- .venv/\n\n## Convenciones de ubicacion\n- Codigo fuente: src/\n- Tests: src/**/*.test.* o tests/\n- Config: raiz del componente\n- Scripts: scripts/\n`,
302
+ '.agent/rules/patterns.md': `# Patrones y convenciones — ${projectName}\n\n## Nombrado\n- Archivos: kebab-case (mi-archivo.ts)\n- Clases: PascalCase (MiClase)\n- Variables y funciones: camelCase (miVariable)\n- Constantes: UPPER_SNAKE_CASE (MI_CONSTANTE)\n\n## Estructura de commits\n- feat: nueva funcionalidad\n- fix: correccion de bug\n- chore: tareas de mantenimiento\n- docs: solo documentacion\n\n## Reglas generales\n- No dejar console.log / print de debug en código productivo\n- Un archivo = una responsabilidad principal\n- Preferir cambios pequeños y verificables sobre refactors grandes\n`,
303
+ '.agent/context/architecture.md': '# Arquitectura — NIVEL 0\n\n> Ejecuta `agent-mp explorer` para generar documentacion automatica.\n\n| Componente | Stack | Puerto | Proposito |\n|------------|-------|--------|-----------|\n| - | - | - | - |\n',
304
+ '.agent/AGENT.md': `# Instrucciones para Sub-Agentes — ${projectName}\n\n## Paso 1: Identificar tu rol\nLee .agent/INDEX.md para saber que archivo leer segun tu rol.\n\n## Paso 2: Leer el contexto\nAntes de cualquier accion, lee .agent/context/architecture.md.\n\n## Paso 3: Actua SOLO dentro de tu rol\nVer .agent/rules/workflow.md para las reglas de separacion de roles.\n`,
302
305
  };
303
306
  for (const [fp, content] of Object.entries(templates)) {
304
307
  await fs.mkdir(path.join(projectDir, path.dirname(fp)), { recursive: true });
@@ -1194,9 +1194,29 @@ INSTRUCCIONES:
1194
1194
  const agentDir = path.join(this.projectDir, '.agent');
1195
1195
  const contextDir = path.join(agentDir, 'context');
1196
1196
  const docsDir = path.join(agentDir, 'docs');
1197
+ const rulesDir = path.join(agentDir, 'rules');
1197
1198
  await fs.mkdir(contextDir, { recursive: true });
1198
1199
  await fs.mkdir(docsDir, { recursive: true });
1199
- await fs.mkdir(path.join(agentDir, 'rules'), { recursive: true });
1200
+ await fs.mkdir(rulesDir, { recursive: true });
1201
+ // Seed rules files if they don't exist yet (idempotent — never overwrites)
1202
+ const proj = this.config.project;
1203
+ const rulesSeeds = {
1204
+ 'workflow.md': `# Workflow Contract — ${proj}\n\n\`\`\`\n[ORCHESTRATOR] planifica → genera plan.json\n ↓\n[IMPLEMENTOR] ejecuta el plan → modifica archivos\n ↓\n[REVIEWER] valida → genera result.md\n\`\`\`\n\n## REGLA #1 — Separacion de roles\nCada CLI opera SOLO en su rol.\n\n## REGLA #2 — Orden estricto\nOrchestrator primero. Implementor no actua sin plan. Reviewer no actua sin implementacion.\n\n## REGLA #3 — Sin inventar\nCada rol trabaja con los archivos reales del proyecto.\n`,
1205
+ 'orchestrator.md': `# Rol: ORCHESTRATOR — ${proj}\n\n## Responsabilidad\nAnalizar el requerimiento, leer el contexto y generar un plan de tareas ejecutable.\n\n## Antes de planificar\n1. Leer .agent/context/architecture.md\n2. Leer .agent/rules/structure.md\n3. Leer .agent/rules/patterns.md\n\n## Al generar el plan\n- Pasos atomicos (1 paso = 1 cambio verificable)\n- Rutas de archivos REALES\n- Dependencias entre pasos si las hay\n\n## Prohibido\n- Modificar archivos de codigo directamente\n- Ejecutar comandos de build o test\n`,
1206
+ 'implementor.md': `# Rol: IMPLEMENTOR — ${proj}\n\n## Responsabilidad\nEjecutar el plan del Orchestrator. Modificar archivos de codigo siguiendo las instrucciones exactas.\n\n## Antes de implementar\n1. Leer .agent/tasks/{ID}/plan.json completo\n2. Leer .agent/rules/structure.md\n3. Leer .agent/rules/patterns.md\n\n## Al implementar\n- Seguir el plan paso a paso, en orden\n- No agregar cambios fuera del scope\n- Marcar cada paso como completado\n\n## Prohibido\n- Modificar el plan\n- Hacer refactors no solicitados\n`,
1207
+ 'reviewer.md': `# Rol: REVIEWER — ${proj}\n\n## Responsabilidad\nValidar que la implementacion cumple el plan y respeta las reglas del proyecto.\n\n## Checklist\n- [ ] Cada paso del plan fue implementado\n- [ ] Sin archivos modificados fuera del scope\n- [ ] Convenciones de patterns.md respetadas\n- [ ] Estructura de structure.md respetada\n- [ ] Sin codigo muerto ni imports sin usar\n\n## Al generar result.md\n- Indicar cada item: OK / FAIL / SKIP con razon\n- Si FAILs: describir qué falta y en qué archivo\n\n## Prohibido\n- Modificar archivos de codigo\n- Aprobar implementaciones incompletas\n`,
1208
+ 'structure.md': `# Estructura — ${proj}\n\n## Directorios aprobados\n- . (raiz del proyecto)\n\n## Prohibidos\n- node_modules/, dist/, .git/, build/, target/, __pycache__/, .venv/\n`,
1209
+ 'patterns.md': `# Patrones — ${proj}\n\n## Nombrado\n- Archivos: kebab-case\n- Clases: PascalCase\n- Variables/funciones: camelCase\n- Constantes: UPPER_SNAKE_CASE\n\n## Reglas generales\n- Sin console.log de debug en produccion\n- Un archivo = una responsabilidad principal\n`,
1210
+ };
1211
+ for (const [name, content] of Object.entries(rulesSeeds)) {
1212
+ const fp = path.join(rulesDir, name);
1213
+ try {
1214
+ await fs.access(fp);
1215
+ }
1216
+ catch {
1217
+ await writeFile(fp, content);
1218
+ } // only create if missing
1219
+ }
1200
1220
  // NOTE: cleanup of stray files moved to AFTER successful parse, to avoid
1201
1221
  // wiping previous docs when the explorer fails (e.g. tool-call hallucination).
1202
1222
  // Build a quick filesystem snapshot to give the explorer context
@@ -1314,204 +1334,254 @@ ESTRUCTURA DE LOS 3 NIVELES
1314
1334
  ================================================================
1315
1335
 
1316
1336
  ────────────────────────────────────────────────────────────────
1317
- NIVEL 0 — architecture.md (raiz de .agent/context/)
1318
- Indice global. Objetivo: 50-150 lineas. Concreto.
1319
1337
  ────────────────────────────────────────────────────────────────
1320
- Secciones obligatorias:
1338
+ NIVEL 0 — architecture.md (raiz de .agent/context/)
1339
+ Objetivo: 80-150 lineas. Panorama global real, no generico.
1340
+ ────────────────────────────────────────────────────────────────
1321
1341
 
1322
- # ${this.config.project} — Arquitectura Global (NIVEL 0)
1342
+ # [Nombre del proyecto] — Arquitectura Global (NIVEL 0)
1323
1343
 
1324
- > Indice de servicios y relaciones. Lectura escalonada:
1344
+ > Lectura escalonada:
1325
1345
  > NIVEL 0: este archivo
1326
1346
  > NIVEL 1: .agent/context/[componente]/architecture.md
1327
1347
  > NIVEL 2: .agent/context/[componente]/modules/[modulo].md
1328
1348
 
1329
1349
  ## 1. Overview funcional
1330
- 2-4 lineas en lenguaje simple: que es el sistema, para quien sirve, que problema resuelve.
1350
+ 2-4 lineas. Que es el sistema, para quien sirve, que problema resuelve.
1351
+ Si hay multiples componentes con roles distintos, nombrarlos y contrastarlos en el overview:
1352
+ ej. "X es la API de ingesta (escritura, batch), Y es la API de gestion (CRUD, portal Nexus)."
1331
1353
 
1332
1354
  ## 2. Componentes del proyecto
1333
- | Componente | Tipo | Stack + version | Puerto | Proposito (negocio) | Entry point |
1334
- |------------|------|-----------------|--------|---------------------|-------------|
1335
- (una fila por componente, con datos REALES)
1355
+ | Componente | Stack (version exacta) | Puerto | Rol principal | Consumers tipicos |
1356
+ |---|---|---|---|---|
1357
+ (datos REALES del manifest. "Consumers tipicos" = quien llama a este componente: frontend, proceso batch, sistema externo)
1336
1358
 
1337
1359
  ## 3. Relaciones entre componentes
1338
- | Origen | Destino | Tipo (HTTP / Import / DB / Queue / CORS) | Proposito |
1339
- |--------|---------|------------------------------------------|-----------|
1340
- (una fila por cada relacion confirmada)
1360
+ | Origen | Destino | Tipo | Proposito |
1361
+ |---|---|---|---|
1362
+ (incluir URLs/hosts reales si aparecen en .env o config: ej. "http://57.151.96.13:8000/v1/validate")
1341
1363
 
1342
1364
  ## 4. Diagrama de arquitectura
1343
- \`\`\`
1344
- [Frontend Web] ──HTTP──> [API Auth :8081]
1345
- │ │
1346
- │ v
1347
- └──HTTP──> [API Core :8080] ──> [MongoDB]
1365
+ Usar box-drawing (┌─┐│└┘┬┴├┤) y flechas (→ ──> ▼ ▲). Mostrar puertos REALES.
1366
+ Incluir endpoints clave inline en los componentes cuando se conocen.
1367
+ \`\`\`text
1368
+ ┌─────────────────────┐ ┌──────────────────────┐
1369
+ componente-a :8083 │ │ componente-b :8084 │
1370
+ │ POST /api/sales │ │ GET /api/nexus/combos │
1371
+ │ POST /api/stock │────────>│ PUT /api/nexus/... │
1372
+ └──────────┬──────────┘ └──────────────────────┘
1373
+ │ │
1374
+ ▼ ▼
1375
+ ┌──────────────┐ ┌──────────────┐
1376
+ │ SQL Server │ │ Auth Service│
1377
+ │ :31434 │ │ :8000 │
1378
+ └──────────────┘ └──────────────┘
1348
1379
  \`\`\`
1349
1380
 
1350
- ## 5. Flujos end-to-end principales (3-5)
1351
- Mappings funcional → tecnico, paso a paso. Ejemplo:
1352
- - **"Un usuario crea un pedido"**: WebApp → POST /orders (API Core) → valida JWT contra API Auth guarda en MongoDBdevuelve 201 con el pedido.
1381
+ ## 5. Flujos end-to-end principales
1382
+ Concretos, con componentes, endpoints y acciones reales. 2-5 flujos.
1383
+ - **"Nombre del flujo":** Actor → POST /endpoint (componente-a) → valida JWT con auth-serviceescribe en SQL Server responde 201.
1353
1384
 
1354
- ## 6. Prerequisitos para levantar el proyecto
1355
- Versiones REALES leidas de los manifests (no rangos genericos).
1385
+ ## 6. Prerequisitos para levantar
1386
+ Solo lo que es real: acceso de red a hosts externos, herramientas requeridas. Sin generalidades.
1356
1387
 
1357
- ## 7. Comandos globales de desarrollo
1388
+ ## 7. Comandos de desarrollo
1358
1389
  | Comando | Descripcion | Directorio |
1359
-
1360
- ## 8. Decisiones de arquitectura globales (opcional, solo si hay)
1390
+ |---|---|---|
1391
+ (comandos reales del Makefile, run.sh, package.json scripts, mvnw, etc.)
1361
1392
 
1362
1393
  ────────────────────────────────────────────────────────────────
1363
1394
  NIVEL 1 — [componente]/architecture.md
1364
- Detalle del componente. Objetivo: 80-200 lineas. Crear UNO POR CADA componente NO trivial.
1395
+ Objetivo: 120-250 lineas. Un archivo por cada componente no trivial.
1365
1396
  ────────────────────────────────────────────────────────────────
1366
- Secciones obligatorias:
1367
1397
 
1368
1398
  # [componente] — Arquitectura (NIVEL 1)
1369
1399
 
1370
1400
  ## Que hace
1371
- 2-3 lineas en lenguaje simple, sin tecnicismos.
1401
+ Parrafo 1: describe el rol del componente en lenguaje de negocio + quien lo consume.
1402
+ Parrafo 2 (si hay componentes hermanos): contrasta con ellos. ej. "A diferencia de X que solo escribe en bulk, esta API expone CRUD con paginacion y filtros para el portal."
1372
1403
 
1373
1404
  ## Casos de uso principales
1374
- 3-6 bullets en formato negocio:
1375
- - "Permite al usuario X..."
1376
- - "El sistema usa este servicio para Y..."
1405
+ Tabla con: Caso de uso | Actor (quien lo dispara) | Descripcion + endpoint si se conoce.
1406
+ | Caso de uso | Actor | Descripcion |
1407
+ |---|---|---|
1408
+ | Ingesta de ventas | Proceso batch BAT | POST /api/sales — upsert bulk de ventas finales |
1409
+ | Consulta de productos | Portal Nexus | GET /api/products?eanCode=XXX |
1377
1410
 
1378
1411
  ## Stack tecnico
1379
1412
  | Item | Valor |
1380
- |------|-------|
1381
- | Lenguaje | TypeScript 5.3 |
1382
- | Framework | NestJS 11.0.1 |
1383
- | ORM | Mongoose 9.3.3 |
1384
- | Auth | Passport JWT |
1385
- (datos reales del manifest)
1413
+ |---|---|
1414
+ | Lenguaje | Java 21 (Temurin LTS) |
1415
+ | Framework | Spring Boot 3.5.6 |
1416
+ | ORM | Spring Data JPA + Hibernate |
1417
+ | Seguridad | Spring Security 6 + JJWT |
1418
+ (versiones REALES del manifest. Si hay librerias clave como POI, MapStruct, HikariCP: incluirlas)
1386
1419
 
1387
1420
  ## Puerto y URLs
1388
- - **Puerto:** 8085 (de PORT en .env)
1389
- - **Swagger / docs:** http://localhost:8085/api/docs (si aplica)
1390
- - **Health check:** GET /health (si existe)
1391
-
1392
- ## Estructura interna (arbol real)
1393
- Listar DIRECTORIOS clave + los archivos que leiste (los CONTROLLER/ROUTER y SCHEMA/MODEL del prefetch).
1421
+ | Recurso | URL |
1422
+ |---|---|
1423
+ | API base | http://localhost:8084 |
1424
+ | Swagger / docs | http://localhost:8084/swagger-ui/index.html |
1425
+ | Perfil activo | development (application-development.properties) |
1426
+
1427
+ ## Estructura de capas / paquetes
1428
+ Arbol con los archivos y directorios REALES que leiste. Usar → para anotar inline que hace cada clase o directorio.
1429
+ \`\`\`text
1430
+ paquete.raiz/
1431
+ ├── controller/ → endpoints REST, delegan a service, responden ApiResponse<T>
1432
+ │ ├── ClientController → CRUD /api/clients
1433
+ │ ├── SaleController → POST /api/sales, /api/sales/interim-sales
1434
+ │ └── ExportController → GET /api/export/combos (genera .xlsx)
1435
+ ├── service/ → interfaces de logica de negocio
1436
+ │ └── impl/ → implementaciones (@Transactional aqui)
1437
+ ├── repository/ → Spring Data JPA Repositories
1438
+ ├── domain/ → Entidades JPA (@Entity)
1439
+ │ ├── Client, InterimClient → clientes finales y en staging
1440
+ │ ├── Sale, InterimSale → ventas finales y en staging
1441
+ │ └── compositekeys/ → @IdClass para PKs compuestas
1442
+ ├── dto/ → contratos de API (Request/Response DTOs)
1443
+ ├── mapper/ → MapStruct: Entity ↔ DTO
1444
+ ├── security/ → filtros JWT, validacion, handler 401
1445
+ └── configuration/ → CORS, Swagger, SecurityConfig
1394
1446
  \`\`\`
1395
- src/
1396
- ├── main.ts # entry point, configura CORS y swagger
1397
- ├── auth/
1398
- │ ├── auth.controller.ts # endpoints /auth/login, /auth/refresh
1399
- │ └── auth.service.ts # logica de validacion JWT
1400
- ├── leads/
1401
- │ ├── leads.controller.ts # endpoints /leads
1402
- │ └── lead.schema.ts # modelo Lead { name, email, status }
1403
- └── ...
1447
+ (Adaptar a la estructura real del proyecto: puede ser src/, app/, pkg/, etc.)
1448
+
1449
+ ## Endpoints reales
1450
+ SOLO los que se leyeron en los CONTROLLER/ROUTER files. Incluir columna Auth si se conoce.
1451
+ | Metodo | Ruta | Auth | Funcion |
1452
+ |---|---|---|---|
1453
+ | GET | /api/clients | JWT | Lista clientes (paginado, filtrable) |
1454
+ | POST | /api/sales | JWT | Upsert bulk de ventas finales |
1455
+ | GET | /api/export/combos | JWT/Azure | Descarga Excel con combos |
1456
+ (querystring params relevantes en la ruta, ej. ?eanCode= , ?page=&size= )
1457
+
1458
+ ## Formato de respuesta (si hay wrapper estandar)
1459
+ Si el codigo muestra un wrapper comun para todas las respuestas, documentarlo:
1460
+ \`\`\`json
1461
+ {
1462
+ "status": 200,
1463
+ "message": "Operacion exitosa",
1464
+ "data": [...],
1465
+ "pagination": { "page": 1, "size": 15, "totalElements": 120, "totalPages": 8 }
1466
+ }
1404
1467
  \`\`\`
1405
- Para Java, usar el arbol de packages: src/main/java/.../controller/, .../domain/, .../service/, etc.
1406
- Si no se leyo el codigo fuente, mencionar solo los directorios visibles en la estructura de archivos.
1468
+ Si no hay wrapper, omitir esta seccion.
1407
1469
 
1408
1470
  ## Modulos internos
1409
- IMPORTANTE: nombrar cada modulo por su FEATURE (clients, sales, products), no por su capa (web, data, service).
1410
- Los modulos surgen de los controllers que se leyeron: un controller → un modulo.
1411
- | Modulo | Proposito (negocio) | Doc tecnica |
1412
- |--------|---------------------|-------------|
1413
- | auth | Login y validacion de tokens | modules/auth.md |
1414
- | leads | Listado y consulta de negocios | modules/leads.md |
1415
-
1416
- ## Endpoints principales
1417
- | Metodo | Ruta | Modulo | Que hace (lenguaje simple) |
1418
- |--------|------|--------|----------------------------|
1419
- | GET | /leads | leads | Lista negocios filtrables |
1420
- | GET | /leads/:id | leads | Detalle de un negocio |
1421
- (SOLO endpoints reales extraidos de los controllers metodo HTTP, ruta, y descripcion en 1 linea)
1422
-
1423
- ## Variables de entorno
1424
- | Variable | Default | Proposito |
1425
- |----------|---------|-----------|
1426
- | PORT | 8085 | Puerto del servicio |
1427
- | MONGODB_URI | mongodb://... | Conexion principal |
1428
-
1429
- ## Integraciones con otros servicios / sistemas
1430
- | Servicio externo | Tipo (HTTP/DB/Queue) | Proposito |
1471
+ | Modulo | Proposito | Doc tecnica |
1472
+ |---|---|---|
1473
+ | seguridad | Autenticacion JWT/Azure, roles, filtro HTTP | modules/security.md |
1474
+ | acceso-datos | JPA, Specifications, pool, entidades | modules/data-access.md |
1475
+ | api-web | Controladores, DTOs, validacion, exportacion | modules/web-api.md |
1476
+ (Agrupar por responsabilidad tecnica real, no inventar modulos)
1477
+
1478
+ ## Variables de configuracion clave
1479
+ | Propiedad / Variable | Valor actual | Proposito |
1480
+ |---|---|---|
1481
+ | server.port | 8084 | Puerto de la API |
1482
+ | spring.datasource.url | jdbc:sqlserver://... | Conexion SQL Server |
1483
+ | auth.url | http://57.151.96.13:8000/v1/validate | Servicio externo de validacion JWT |
1484
+ (Valores REALES del archivo de config/env leido. Si no se leyo el archivo, omitir la tabla)
1431
1485
 
1432
1486
  ## Como levantar
1433
- - **Instalar deps:** \`npm install\`
1434
- - **Servicios necesarios:** MongoDB corriendo, security-api accesible
1435
- - **Comando para iniciar:** \`npm run start:dev\`
1436
-
1437
- ## Comandos disponibles
1438
- | Comando | Que hace |
1487
+ Comando principal primero. Luego paso a paso si existe.
1488
+ \`\`\`bash
1489
+ ./run.sh # compila y levanta todo en uno (si existe)
1490
+ \`\`\`
1491
+ O paso a paso:
1492
+ \`\`\`bash
1493
+ source ./scripts/env.sh
1494
+ npm install && npm run dev
1495
+ \`\`\`
1439
1496
 
1440
- ## Decisiones tecnicas relevantes
1441
- (solo si hay decisiones notables; si no, omitir esta seccion)
1497
+ ## Testing (si hay tests en el proyecto)
1498
+ Frameworks, comando para correr, cobertura minima si se menciona en el manifest o config.
1499
+ \`\`\`bash
1500
+ npm test # todos los tests
1501
+ npm test -- --watch # modo watch
1502
+ \`\`\`
1442
1503
 
1443
1504
  ────────────────────────────────────────────────────────────────
1444
1505
  NIVEL 2 — [componente]/modules/[modulo].md
1445
- Detalle de un modulo interno. Objetivo: 40-120 lineas. Crear UNO POR cada modulo significativo.
1506
+ Objetivo: 50-120 lineas. Un archivo por modulo significativo.
1446
1507
  ────────────────────────────────────────────────────────────────
1447
- Secciones obligatorias:
1448
1508
 
1449
- # Modulo: [nombre] — [componente]
1509
+ # Modulo: [Nombre] — [componente]
1450
1510
 
1451
1511
  ## Funcion (lenguaje simple)
1452
- 1-2 lineas: "Permite al usuario gestionar X" / "El sistema usa este modulo para Y".
1512
+ 1-2 lineas: "Protege todos los endpoints /api/**. Cada request debe llevar un token JWT valido."
1453
1513
 
1454
1514
  ## Funcion (tecnica)
1455
- 1-2 lineas: como esta implementado a alto nivel.
1456
-
1457
- ## Flujos / casos de uso (1-3)
1458
- Escenarios paso a paso. Ejemplo:
1459
- - **Crear un pedido:** Cliente POST /orders middleware valida JWT → service.create() → guarda en DB → responde 201
1460
-
1461
- ## Endpoints / interfaces publicas (si aplica)
1462
- | Metodo | Ruta | Body | Respuesta |
1463
- |--------|------|------|-----------|
1464
-
1465
- ## Modelos / schemas relevantes
1466
- \`\`\`typescript
1467
- // shape REAL extraido del archivo de schema/model
1468
- {
1469
- _id: ObjectId,
1470
- name: string,
1471
- createdAt: Date,
1472
- ...
1473
- }
1515
+ 1-2 lineas: como esta implementado. ej. "Filtro OncePerRequestFilter que extrae el JWT del header Authorization, lo valida contra el servicio externo auth.url, y si es valido establece el SecurityContext."
1516
+
1517
+ ## Flujo principal (diagrama ASCII)
1518
+ Para modulos de seguridad, acceso a datos, o cualquiera con logica de decision/secuencia:
1519
+ mostrar el flujo con ASCII art y nombres REALES de clases/metodos.
1520
+ \`\`\`text
1521
+ HTTP Request
1522
+
1523
+
1524
+ AuthFilter (OncePerRequestFilter)
1525
+
1526
+ ├── X-User-Source == "Azure"?
1527
+ │ ▼ SI
1528
+ │ AzureHeaderValidator → construye usuario virtual desde headers
1529
+
1530
+ └── NO
1531
+
1532
+ JwtValidator → POST http://auth-service/validate → carga usuario de BD
1533
+
1534
+
1535
+ SecurityContextHolder.setAuthentication(...)
1536
+
1537
+
1538
+ @PreAuthorize("hasAnyAuthority('ROLE_A','ROLE_B')") en el controller
1474
1539
  \`\`\`
1475
1540
 
1476
- ## Reglas de negocio
1477
- - Validaciones: ...
1478
- - Condiciones especiales: ...
1479
- - Excepciones: ...
1541
+ ## Entidades / modelos relevantes (si aplica)
1542
+ Para modulos de acceso a datos: tabla de entidades con su proposito y notas.
1543
+ | Entidad | Proposito | Notas |
1544
+ |---|---|---|
1545
+ | Client | Clientes finales | Clave compuesta: ClientId |
1546
+ | InterimClient | Clientes en staging | Tabla intermedia antes de procesar |
1547
+
1548
+ ## Reglas del modulo
1549
+ - Rutas protegidas: /api/** → autenticacion obligatoria
1550
+ - Rutas publicas: OPTIONS /**, /swagger-ui/**, /*
1551
+ - Sin sesion: STATELESS — sin cookies
1552
+ - ddl-auto=validate → el schema nunca se auto-modifica
1480
1553
 
1481
1554
  ## Archivos clave
1482
- OBLIGATORIO: listar los archivos FUENTE reales que encontraste en los pre-fetched data.
1483
- NO poner solo el manifest. Si no hay fuentes leidas para este modulo, omitir la seccion.
1484
- | Archivo (ruta relativa al componente) | Rol |
1485
- |---------------------------------------|-----|
1486
- | src/main/java/.../ClientController.java | Expone endpoints REST /clients |
1487
- | src/main/java/.../Client.java | Entidad JPA mapeada a tabla CLIENTS |
1488
- | src/main/java/.../ClientRepository.java | Acceso a datos via JPA |
1489
- | src/clients/clients.controller.ts | Endpoints /clients (Node.js) |
1490
- | src/clients/clients.service.ts | Logica de negocio (Node.js) |
1555
+ Rutas RELATIVAS al directorio raiz del componente (no rutas absolutas, no solo el manifest).
1556
+ | Archivo | Rol |
1557
+ |---|---|
1558
+ | security/AuthFilter.java | Filtro principal — intercepta y valida cada request |
1559
+ | security/JwtValidator.java | Extrae username del JWT, verifica firma y expiracion |
1560
+ | configuration/SecurityConfig.java | Define SecurityFilterChain, rutas publicas/protegidas |
1561
+ | application-development.properties | auth.url, security.token.secret, security.token.expiration |
1491
1562
 
1492
1563
  ## Dependencias
1493
- - **Internas (mismo componente):** auth, common
1494
- - **Externas:** mongoose, class-validator
1495
- - **Cross-component:** llama a security-api via HTTP para validar JWT
1564
+ - Librerias clave con version si se conoce: io.jsonwebtoken:jjwt:0.9.1, spring-boot-starter-security
1565
+ - Cross-component si corresponde: "llama a http://auth-service:8000/v1/validate para validar tokens"
1496
1566
 
1497
1567
  ================================================================
1498
1568
  CALIBRACION DE DETALLE
1499
1569
  ================================================================
1500
- - NIVEL 0: 50-150 lineas (no menos, no mas)
1501
- - NIVEL 1: 80-200 lineas por componente
1502
- - NIVEL 2: 40-120 lineas por modulo
1503
- - Si te queda corto → leiste pocos archivos, no agregues relleno simplemente genera con lo que hay
1504
- - Si te queda largo → estas repitiendo o agregando relleno, recorta
1570
+ - NIVEL 0: 80-150 lineas
1571
+ - NIVEL 1: 120-250 lineas por componente
1572
+ - NIVEL 2: 50-120 lineas por modulo
1573
+ - Si te queda corto → incluir mas endpoints reales, mas clases en el arbol, mas config values
1574
+ - Si te queda largo → estas repitiendo entre niveles o agregando relleno; recorta
1505
1575
 
1506
1576
  ================================================================
1507
1577
  QUE NO HACER
1508
1578
  ================================================================
1509
1579
  - NO usar "Inferido", "Probablemente", "(asumido)", "(quizas)", "parece"
1510
1580
  - NO repetir lo mismo entre niveles sin agregar valor (cada nivel zoomea mas)
1511
- - NO dejar tablas vacias ni con placeholders tipo "..."
1512
- - NO mezclar lenguaje tecnico puro: SIEMPRE empezar funcional, despues tecnico
1513
- - NO documentar componentes triviales (scripts, docs, configs sueltas) con su propia carpeta — mencionalos en NIVEL 0 y listo
1514
- - NO inventar endpoints, env vars, puertos o schemas que no leiste
1581
+ - NO dejar tablas vacias ni con placeholders tipo "..." o "ver manifest"
1582
+ - NO escribir overview que podria aplicar a cualquier proyecto (tiene que ser especifico de ESTE proyecto)
1583
+ - NO documentar componentes triviales (scripts sueltos, configs simples) con carpeta propia — mencionalos en NIVEL 0 y listo
1584
+ - NO inventar endpoints, env vars, puertos, hosts, clases o schemas que no leiste en los archivos reales
1515
1585
 
1516
1586
  ================================================================
1517
1587
  FORMATO DE SALIDA — OBLIGATORIO
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-mp",
3
- "version": "0.5.20",
3
+ "version": "0.5.22",
4
4
  "description": "Deterministic multi-agent CLI orchestrator — plan, code, review",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",