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.
- package/dist/commands/repl.js +9 -6
- package/dist/commands/setup.js +9 -6
- package/dist/core/engine.js +203 -133
- package/package.json +1 -1
package/dist/commands/repl.js
CHANGED
|
@@ -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}
|
|
409
|
-
'.agent/rules/workflow.md':
|
|
410
|
-
'.agent/rules/
|
|
411
|
-
'.agent/rules/
|
|
412
|
-
'.agent/
|
|
413
|
-
'.agent/
|
|
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 });
|
package/dist/commands/setup.js
CHANGED
|
@@ -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
|
|
297
|
-
'.agent/rules/workflow.md':
|
|
298
|
-
'.agent/rules/
|
|
299
|
-
'.agent/rules/
|
|
300
|
-
'.agent/
|
|
301
|
-
'.agent/
|
|
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 });
|
package/dist/core/engine.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
1338
|
+
NIVEL 0 — architecture.md (raiz de .agent/context/)
|
|
1339
|
+
Objetivo: 80-150 lineas. Panorama global real, no generico.
|
|
1340
|
+
────────────────────────────────────────────────────────────────
|
|
1321
1341
|
|
|
1322
|
-
#
|
|
1342
|
+
# [Nombre del proyecto] — Arquitectura Global (NIVEL 0)
|
|
1323
1343
|
|
|
1324
|
-
>
|
|
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
|
|
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 |
|
|
1334
|
-
|
|
1335
|
-
(
|
|
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
|
|
1339
|
-
|
|
1340
|
-
(
|
|
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
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
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
|
|
1351
|
-
|
|
1352
|
-
- **"
|
|
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-service → escribe en SQL Server → responde 201.
|
|
1353
1384
|
|
|
1354
|
-
## 6. Prerequisitos para levantar
|
|
1355
|
-
|
|
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
|
|
1388
|
+
## 7. Comandos de desarrollo
|
|
1358
1389
|
| Comando | Descripcion | Directorio |
|
|
1359
|
-
|
|
1360
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
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 |
|
|
1382
|
-
| Framework |
|
|
1383
|
-
| ORM |
|
|
1384
|
-
|
|
|
1385
|
-
(
|
|
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
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
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
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
|
1412
|
-
|
|
1413
|
-
|
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
##
|
|
1417
|
-
|
|
|
1418
|
-
|
|
1419
|
-
|
|
|
1420
|
-
|
|
|
1421
|
-
|
|
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
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
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
|
-
##
|
|
1441
|
-
|
|
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
|
-
|
|
1506
|
+
Objetivo: 50-120 lineas. Un archivo por modulo significativo.
|
|
1446
1507
|
────────────────────────────────────────────────────────────────
|
|
1447
|
-
Secciones obligatorias:
|
|
1448
1508
|
|
|
1449
|
-
# Modulo: [
|
|
1509
|
+
# Modulo: [Nombre] — [componente]
|
|
1450
1510
|
|
|
1451
1511
|
## Funcion (lenguaje simple)
|
|
1452
|
-
1-2 lineas: "
|
|
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
|
|
1456
|
-
|
|
1457
|
-
##
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
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
|
-
##
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
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
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
|
1487
|
-
|
|
|
1488
|
-
|
|
|
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
|
-
-
|
|
1494
|
-
-
|
|
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:
|
|
1501
|
-
- NIVEL 1:
|
|
1502
|
-
- NIVEL 2:
|
|
1503
|
-
- Si te queda corto →
|
|
1504
|
-
- Si te queda largo → estas repitiendo o agregando relleno
|
|
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
|
|
1513
|
-
- NO documentar componentes triviales (scripts
|
|
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
|