agent-mp 0.5.17 → 0.5.19
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/core/engine.js +156 -39
- package/package.json +1 -1
package/dist/core/engine.js
CHANGED
|
@@ -238,9 +238,11 @@ async function walkForKeyFiles(root) {
|
|
|
238
238
|
'server.ts', 'server.js', 'server.py',
|
|
239
239
|
'application.ts', 'application.js', 'application.py',
|
|
240
240
|
]);
|
|
241
|
-
const ENTRY_REGEX = /Application\.
|
|
241
|
+
const ENTRY_REGEX = /Application\.[a-z]+$/i; // *Application.java, *Application.kt, etc.
|
|
242
242
|
const CTRL_REGEX = /(controller|router|routes|handler|endpoint|resource)/i;
|
|
243
243
|
const SCHEMA_REGEX = /(schema|\.entity|\.model|\.dto|models?\.|entities?\.)/i;
|
|
244
|
+
// Directories that conventionally hold data/domain classes (language-agnostic)
|
|
245
|
+
const DOMAIN_DIR_REGEX = /[\/\\](domain|entity|entities|model|models|dto|dtos|schema|schemas)[\/\\]/i;
|
|
244
246
|
async function walk(dir, depth) {
|
|
245
247
|
if (depth > 6)
|
|
246
248
|
return;
|
|
@@ -276,7 +278,8 @@ async function walkForKeyFiles(root) {
|
|
|
276
278
|
if (CTRL_REGEX.test(e.name) && result.controllers.length < 5) {
|
|
277
279
|
result.controllers.push(p);
|
|
278
280
|
}
|
|
279
|
-
|
|
281
|
+
const isSchema = SCHEMA_REGEX.test(e.name) || DOMAIN_DIR_REGEX.test(p);
|
|
282
|
+
if (isSchema && result.schemas.length < 5) {
|
|
280
283
|
result.schemas.push(p);
|
|
281
284
|
}
|
|
282
285
|
}
|
|
@@ -1155,7 +1158,7 @@ INSTRUCCIONES:
|
|
|
1155
1158
|
compSection.push(`### ENTRY POINT: ${rel}\n\`\`\`\n${content}\n\`\`\``);
|
|
1156
1159
|
}
|
|
1157
1160
|
}
|
|
1158
|
-
const ctrls = found.controllers.slice(0,
|
|
1161
|
+
const ctrls = found.controllers.slice(0, 5);
|
|
1159
1162
|
for (const ctrl of ctrls) {
|
|
1160
1163
|
const content = await readFileSafe(ctrl, MAX_CTRL);
|
|
1161
1164
|
if (content) {
|
|
@@ -1163,7 +1166,7 @@ INSTRUCCIONES:
|
|
|
1163
1166
|
compSection.push(`### CONTROLLER/ROUTER: ${rel}\n\`\`\`\n${content}\n\`\`\``);
|
|
1164
1167
|
}
|
|
1165
1168
|
}
|
|
1166
|
-
const schemas = found.schemas.slice(0,
|
|
1169
|
+
const schemas = found.schemas.slice(0, 4);
|
|
1167
1170
|
for (const sch of schemas) {
|
|
1168
1171
|
const content = await readFileSafe(sch, MAX_SCHEMA);
|
|
1169
1172
|
if (content) {
|
|
@@ -1190,7 +1193,9 @@ INSTRUCCIONES:
|
|
|
1190
1193
|
// Ensure .agent/ structure exists
|
|
1191
1194
|
const agentDir = path.join(this.projectDir, '.agent');
|
|
1192
1195
|
const contextDir = path.join(agentDir, 'context');
|
|
1196
|
+
const docsDir = path.join(agentDir, 'docs');
|
|
1193
1197
|
await fs.mkdir(contextDir, { recursive: true });
|
|
1198
|
+
await fs.mkdir(docsDir, { recursive: true });
|
|
1194
1199
|
await fs.mkdir(path.join(agentDir, 'rules'), { recursive: true });
|
|
1195
1200
|
// NOTE: cleanup of stray files moved to AFTER successful parse, to avoid
|
|
1196
1201
|
// wiping previous docs when the explorer fails (e.g. tool-call hallucination).
|
|
@@ -1273,11 +1278,28 @@ El engine YA leyo por vos los archivos clave de cada componente y te los pasa ar
|
|
|
1273
1278
|
- Del MANIFEST: nombre, version, framework, dependencias clave con sus versiones, scripts, entry point
|
|
1274
1279
|
- Del ENTRY POINT: puerto real, middlewares, modulos cargados
|
|
1275
1280
|
- De los CONFIG/ENV: variables reales y su proposito
|
|
1276
|
-
- De los CONTROLLER/ROUTER: endpoints REALES (metodo, ruta, parametros)
|
|
1277
|
-
- De los SCHEMA/MODEL: shape real de los datos
|
|
1281
|
+
- De los CONTROLLER/ROUTER: endpoints REALES (metodo, ruta, parametros, anotaciones como @GetMapping/@PostMapping/router.get)
|
|
1282
|
+
- De los SCHEMA/MODEL/DOMAIN: shape real de los datos (campos, tipos, anotaciones @Column/@Entity)
|
|
1278
1283
|
3. Identificar relaciones REALES entre componentes (URLs/hosts de otros servicios en .env, imports cross-component, conexiones a BBDD).
|
|
1279
1284
|
4. Generar la documentacion en los 3 niveles, en formato markdown, dentro de los bloques === ... ===.
|
|
1280
1285
|
|
|
1286
|
+
REGLA CRITICA PARA MODULOS (NIVEL 2):
|
|
1287
|
+
- Los modulos SON LAS FEATURES DEL NEGOCIO, NO las capas tecnicas.
|
|
1288
|
+
- MAL: modulos llamados "web-api", "security", "data-access" — eso es hablar de capas, no de features
|
|
1289
|
+
- BIEN: modulos llamados "clients", "sales", "products", "auth", "orders" — eso es hablar de features reales
|
|
1290
|
+
- Para identificar los modulos, MIRA los CONTROLLER/ROUTER pre-leidos: el nombre del modulo = lo que maneja ese controller
|
|
1291
|
+
* ClientController o clients.controller → modulo "clients"
|
|
1292
|
+
* SaleController o sale.routes → modulo "sales"
|
|
1293
|
+
* AuthController o auth.handler → modulo "auth"
|
|
1294
|
+
- "Archivos clave" en cada modulo DEBE listar los archivos FUENTE REALES que leiste, NO solo el manifest.
|
|
1295
|
+
Ejemplo correcto:
|
|
1296
|
+
| Archivo (ruta relativa al componente) | Rol |
|
|
1297
|
+
| controller/ClientController.java | Endpoints REST /clients |
|
|
1298
|
+
| domain/Client.java | Entidad mapeada a tabla CLIENTS |
|
|
1299
|
+
| repository/ClientRepository.java | Acceso a base de datos |
|
|
1300
|
+
| src/clients/clients.controller.ts | Endpoints /clients |
|
|
1301
|
+
| src/clients/client.schema.ts | Modelo de datos Client |
|
|
1302
|
+
|
|
1281
1303
|
NO inventes datos. Si un componente no tiene una de esas piezas en los archivos leidos, simplemente omiti esa seccion en su documentacion.
|
|
1282
1304
|
|
|
1283
1305
|
================================================================
|
|
@@ -1368,15 +1390,24 @@ Secciones obligatorias:
|
|
|
1368
1390
|
- **Health check:** GET /health (si existe)
|
|
1369
1391
|
|
|
1370
1392
|
## Estructura interna (arbol real)
|
|
1393
|
+
Listar DIRECTORIOS clave + los archivos que leiste (los CONTROLLER/ROUTER y SCHEMA/MODEL del prefetch).
|
|
1371
1394
|
\`\`\`
|
|
1372
1395
|
src/
|
|
1373
|
-
├── main.ts
|
|
1374
|
-
├── auth/
|
|
1375
|
-
├──
|
|
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 }
|
|
1376
1403
|
└── ...
|
|
1377
1404
|
\`\`\`
|
|
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.
|
|
1378
1407
|
|
|
1379
1408
|
## 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.
|
|
1380
1411
|
| Modulo | Proposito (negocio) | Doc tecnica |
|
|
1381
1412
|
|--------|---------------------|-------------|
|
|
1382
1413
|
| auth | Login y validacion de tokens | modules/auth.md |
|
|
@@ -1387,7 +1418,7 @@ src/
|
|
|
1387
1418
|
|--------|------|--------|----------------------------|
|
|
1388
1419
|
| GET | /leads | leads | Lista negocios filtrables |
|
|
1389
1420
|
| GET | /leads/:id | leads | Detalle de un negocio |
|
|
1390
|
-
(SOLO endpoints reales extraidos de los controllers)
|
|
1421
|
+
(SOLO endpoints reales extraidos de los controllers — metodo HTTP, ruta, y descripcion en 1 linea)
|
|
1391
1422
|
|
|
1392
1423
|
## Variables de entorno
|
|
1393
1424
|
| Variable | Default | Proposito |
|
|
@@ -1448,10 +1479,15 @@ Escenarios paso a paso. Ejemplo:
|
|
|
1448
1479
|
- Excepciones: ...
|
|
1449
1480
|
|
|
1450
1481
|
## Archivos clave
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
|
1454
|
-
|
|
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) |
|
|
1455
1491
|
|
|
1456
1492
|
## Dependencias
|
|
1457
1493
|
- **Internas (mismo componente):** auth, common
|
|
@@ -1464,7 +1500,7 @@ CALIBRACION DE DETALLE
|
|
|
1464
1500
|
- NIVEL 0: 50-150 lineas (no menos, no mas)
|
|
1465
1501
|
- NIVEL 1: 80-200 lineas por componente
|
|
1466
1502
|
- NIVEL 2: 40-120 lineas por modulo
|
|
1467
|
-
- Si te queda corto → leiste pocos archivos,
|
|
1503
|
+
- Si te queda corto → leiste pocos archivos, no agregues relleno — simplemente genera con lo que hay
|
|
1468
1504
|
- Si te queda largo → estas repitiendo o agregando relleno, recorta
|
|
1469
1505
|
|
|
1470
1506
|
================================================================
|
|
@@ -1477,40 +1513,109 @@ QUE NO HACER
|
|
|
1477
1513
|
- NO documentar componentes triviales (scripts, docs, configs sueltas) con su propia carpeta — mencionalos en NIVEL 0 y listo
|
|
1478
1514
|
- NO inventar endpoints, env vars, puertos o schemas que no leiste
|
|
1479
1515
|
|
|
1516
|
+
================================================================
|
|
1517
|
+
DIRECTORIO .agent/docs/ — FLUJOS POR FUNCIONALIDAD (orientado a desarrolladores)
|
|
1518
|
+
================================================================
|
|
1519
|
+
Ademas de los archivos de context/, generar docs de flujos. Objetivo: un dev que llega al proyecto puede buscar "como funciona el login" o "donde esta el endpoint de clientes" y encontrar exactamente que archivos tocar, en que orden, y por que.
|
|
1520
|
+
|
|
1521
|
+
Generar UN archivo por cada flujo funcional principal que puedas identificar de los CONTROLLER/ROUTER leidos.
|
|
1522
|
+
Si no hay controllers, inferir los flujos desde el MANIFEST y el ENTRY POINT.
|
|
1523
|
+
|
|
1524
|
+
INDICE OBLIGATORIO:
|
|
1525
|
+
=== .agent/docs/README.md ===
|
|
1526
|
+
# Flujos del proyecto — Indice
|
|
1527
|
+
|
|
1528
|
+
| Flujo | Descripcion | Componente(s) |
|
|
1529
|
+
|-------|-------------|---------------|
|
|
1530
|
+
| [nombre-flujo](nombre-flujo.md) | 1 linea que explica que hace | componente-a, componente-b |
|
|
1531
|
+
...
|
|
1532
|
+
|
|
1533
|
+
POR CADA FLUJO:
|
|
1534
|
+
=== .agent/docs/[nombre-flujo].md ===
|
|
1535
|
+
Nombre del archivo: kebab-case del nombre del flujo (auth.md, crear-cliente.md, consulta-ventas.md)
|
|
1536
|
+
|
|
1537
|
+
Estructura de cada archivo de flujo:
|
|
1538
|
+
|
|
1539
|
+
# Flujo: [Nombre legible]
|
|
1540
|
+
|
|
1541
|
+
## Qué hace
|
|
1542
|
+
1 linea en lenguaje de negocio: "Permite al usuario X hacer Y"
|
|
1543
|
+
|
|
1544
|
+
## Componentes involucrados
|
|
1545
|
+
- [componente-a]: rol en este flujo
|
|
1546
|
+
- [componente-b]: rol en este flujo
|
|
1547
|
+
|
|
1548
|
+
## Traza técnica paso a paso
|
|
1549
|
+
Numberar cada paso. Incluir archivo y funcion/clase cuando fue leido.
|
|
1550
|
+
1. Cliente/Frontend → METODO /ruta/endpoint (archivo: ruta/al/Controller)
|
|
1551
|
+
2. Middleware/Guard/Filter valida/transforma (archivo: ruta/al/Filter o Config)
|
|
1552
|
+
3. Service/UseCase ejecuta la logica (archivo: ruta/al/Service)
|
|
1553
|
+
4. Repository/DAO consulta o escribe en DB (archivo: ruta/al/Repository → tabla o coleccion)
|
|
1554
|
+
5. Respuesta: codigo HTTP + shape de respuesta
|
|
1555
|
+
|
|
1556
|
+
## Archivos involucrados y por qué
|
|
1557
|
+
Esta tabla es lo mas importante para un dev nuevo: tiene que saber QUE archivo y POR QUE esta en el flujo.
|
|
1558
|
+
| Archivo (ruta relativa al componente) | Por que esta en este flujo |
|
|
1559
|
+
|---------------------------------------|---------------------------|
|
|
1560
|
+
| ruta/Controller | Recibe el request y delega |
|
|
1561
|
+
| ruta/Service | Contiene la logica de negocio |
|
|
1562
|
+
| ruta/Repository | Lee o escribe en la base de datos |
|
|
1563
|
+
| ruta/Entity o Schema | Define la forma del dato |
|
|
1564
|
+
| ruta/Config o Filter | Aplica seguridad / transformacion |
|
|
1565
|
+
|
|
1566
|
+
## Variables / configuracion relevante
|
|
1567
|
+
Solo las que afectan directamente este flujo (env vars, properties, feature flags).
|
|
1568
|
+
|
|
1569
|
+
## Como probar este flujo
|
|
1570
|
+
- Endpoint: METODO /ruta
|
|
1571
|
+
- Body o params de ejemplo
|
|
1572
|
+
- Respuesta exitosa: codigo + campos
|
|
1573
|
+
- Errores comunes: codigo + cuando ocurre
|
|
1574
|
+
|
|
1575
|
+
================================================================
|
|
1576
|
+
CALIBRACION DE DETALLE — docs/
|
|
1577
|
+
================================================================
|
|
1578
|
+
- README.md: una fila por flujo, no mas
|
|
1579
|
+
- Por flujo: 30-80 lineas. Concreto. Si un paso no fue leido, omitirlo.
|
|
1580
|
+
- NO inventar nombres de archivos. Si no se leyo un Service para este flujo, no lo pongas.
|
|
1581
|
+
- Generar entre 2 y 8 flujos segun la cantidad de controllers/features encontrados.
|
|
1582
|
+
|
|
1480
1583
|
================================================================
|
|
1481
1584
|
FORMATO DE SALIDA — OBLIGATORIO
|
|
1482
1585
|
================================================================
|
|
1483
1586
|
Devolve UNICAMENTE bloques de archivos separados por marcadores ===. Nada de explicaciones extra fuera de los bloques.
|
|
1484
1587
|
|
|
1485
1588
|
IMPORTANTE: TODAS las rutas son RELATIVAS al directorio del proyecto.
|
|
1486
|
-
Los archivos se escriben SIEMPRE dentro de .agent/context/
|
|
1487
1589
|
|
|
1488
|
-
Ejemplos de marcadores:
|
|
1590
|
+
Ejemplos de marcadores validos:
|
|
1489
1591
|
=== .agent/context/architecture.md ===
|
|
1490
1592
|
=== .agent/context/datamart-data-access-api/architecture.md ===
|
|
1491
1593
|
=== .agent/context/datamart-data-access-api/modules/auth.md ===
|
|
1492
|
-
=== .agent/
|
|
1493
|
-
=== .agent/
|
|
1594
|
+
=== .agent/docs/README.md ===
|
|
1595
|
+
=== .agent/docs/auth.md ===
|
|
1596
|
+
=== .agent/docs/consulta-ventas.md ===
|
|
1494
1597
|
|
|
1495
1598
|
=== .agent/context/architecture.md ===
|
|
1496
|
-
[contenido
|
|
1599
|
+
[contenido NIVEL 0]
|
|
1497
1600
|
|
|
1498
|
-
=== .agent/context/nombre-componente
|
|
1499
|
-
[contenido
|
|
1601
|
+
=== .agent/context/nombre-componente/architecture.md ===
|
|
1602
|
+
[contenido NIVEL 1]
|
|
1500
1603
|
|
|
1501
|
-
=== .agent/context/nombre-componente
|
|
1502
|
-
[contenido
|
|
1604
|
+
=== .agent/context/nombre-componente/modules/auth.md ===
|
|
1605
|
+
[contenido NIVEL 2]
|
|
1503
1606
|
|
|
1504
|
-
=== .agent/
|
|
1505
|
-
[
|
|
1607
|
+
=== .agent/docs/README.md ===
|
|
1608
|
+
[indice de flujos]
|
|
1506
1609
|
|
|
1507
|
-
=== .agent/
|
|
1508
|
-
|
|
1610
|
+
=== .agent/docs/auth.md ===
|
|
1611
|
+
[flujo de autenticacion]
|
|
1509
1612
|
|
|
1510
1613
|
REGLAS DE PATHS:
|
|
1511
|
-
-
|
|
1614
|
+
- Arquitectura global: === .agent/context/architecture.md ===
|
|
1512
1615
|
- Por componente: === .agent/context/[nombre-componente]/architecture.md ===
|
|
1513
1616
|
- Por modulo interno: === .agent/context/[nombre-componente]/modules/[nombre-modulo].md ===
|
|
1617
|
+
- Indice de flujos: === .agent/docs/README.md ===
|
|
1618
|
+
- Por flujo: === .agent/docs/[nombre-flujo].md ===
|
|
1514
1619
|
- Documenta TODOS los componentes no triviales del DIRECTORIO_TRABAJO
|
|
1515
1620
|
- Si existe documentacion previa, ACTUALIZALA preservando lo que sigue siendo valido y agregando lo nuevo`;
|
|
1516
1621
|
const res = await this.runWithFallback('explorer', prompt, 'Exploracion');
|
|
@@ -1541,24 +1646,36 @@ REGLAS DE PATHS:
|
|
|
1541
1646
|
content = content.replace(/^```markdown\s*/i, '').replace(/^```\s*$/gm, '').trim();
|
|
1542
1647
|
if (!content)
|
|
1543
1648
|
continue;
|
|
1544
|
-
//
|
|
1545
|
-
|
|
1649
|
+
// Detect routing: .agent/docs/ → docsDir, .agent/context/ → contextDir
|
|
1650
|
+
const isDocsFile = /^\.agent[\/\\]docs[\/\\]/i.test(fileName);
|
|
1546
1651
|
let targetPath = null;
|
|
1547
|
-
if (
|
|
1548
|
-
|
|
1652
|
+
if (isDocsFile) {
|
|
1653
|
+
// .agent/docs/README.md → docsDir/README.md
|
|
1654
|
+
// .agent/docs/auth.md → docsDir/auth.md
|
|
1655
|
+
const docsRel = fileName.replace(/^\.agent[\/\\]docs[\/\\]/i, '').replace(/^\/+/, '');
|
|
1656
|
+
if (docsRel && docsRel.endsWith('.md')) {
|
|
1657
|
+
targetPath = path.join(docsDir, ...docsRel.split(/[\/\\]/).filter(Boolean));
|
|
1658
|
+
}
|
|
1549
1659
|
}
|
|
1550
1660
|
else {
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1661
|
+
// .agent/context/ files (existing behaviour)
|
|
1662
|
+
const relPath = fileName.replace(/^\.agent\/context\//i, '').replace(/^\/+/, '');
|
|
1663
|
+
if (relPath === 'architecture.md' || relPath === 'ARCHITECTURE.md') {
|
|
1664
|
+
targetPath = mainArchPath;
|
|
1554
1665
|
}
|
|
1555
|
-
else
|
|
1556
|
-
|
|
1666
|
+
else {
|
|
1667
|
+
const pathParts = relPath.split(/[\/\\]/).filter(Boolean);
|
|
1668
|
+
if (pathParts.length >= 3 && pathParts[pathParts.length - 2] === 'modules') {
|
|
1669
|
+
targetPath = path.join(contextDir, pathParts[pathParts.length - 3], 'modules', pathParts[pathParts.length - 1]);
|
|
1670
|
+
}
|
|
1671
|
+
else if (pathParts.length >= 2) {
|
|
1672
|
+
targetPath = path.join(contextDir, pathParts[pathParts.length - 2], pathParts[pathParts.length - 1]);
|
|
1673
|
+
}
|
|
1557
1674
|
}
|
|
1558
1675
|
}
|
|
1559
1676
|
if (!targetPath)
|
|
1560
1677
|
continue;
|
|
1561
|
-
pendingWrites.push({ targetPath, content, label:
|
|
1678
|
+
pendingWrites.push({ targetPath, content, label: fileName.trim() });
|
|
1562
1679
|
}
|
|
1563
1680
|
if (pendingWrites.length === 0) {
|
|
1564
1681
|
log.error('Explorer devolvio texto pero ningun bloque === *.md === fue parseable.');
|