agent-mp 0.5.18 → 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 +125 -41
- package/package.json +1 -1
package/dist/core/engine.js
CHANGED
|
@@ -238,11 +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
|
-
//
|
|
245
|
-
const
|
|
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;
|
|
246
246
|
async function walk(dir, depth) {
|
|
247
247
|
if (depth > 6)
|
|
248
248
|
return;
|
|
@@ -278,7 +278,7 @@ async function walkForKeyFiles(root) {
|
|
|
278
278
|
if (CTRL_REGEX.test(e.name) && result.controllers.length < 5) {
|
|
279
279
|
result.controllers.push(p);
|
|
280
280
|
}
|
|
281
|
-
const isSchema = SCHEMA_REGEX.test(e.name) ||
|
|
281
|
+
const isSchema = SCHEMA_REGEX.test(e.name) || DOMAIN_DIR_REGEX.test(p);
|
|
282
282
|
if (isSchema && result.schemas.length < 5) {
|
|
283
283
|
result.schemas.push(p);
|
|
284
284
|
}
|
|
@@ -1193,7 +1193,9 @@ INSTRUCCIONES:
|
|
|
1193
1193
|
// Ensure .agent/ structure exists
|
|
1194
1194
|
const agentDir = path.join(this.projectDir, '.agent');
|
|
1195
1195
|
const contextDir = path.join(agentDir, 'context');
|
|
1196
|
+
const docsDir = path.join(agentDir, 'docs');
|
|
1196
1197
|
await fs.mkdir(contextDir, { recursive: true });
|
|
1198
|
+
await fs.mkdir(docsDir, { recursive: true });
|
|
1197
1199
|
await fs.mkdir(path.join(agentDir, 'rules'), { recursive: true });
|
|
1198
1200
|
// NOTE: cleanup of stray files moved to AFTER successful parse, to avoid
|
|
1199
1201
|
// wiping previous docs when the explorer fails (e.g. tool-call hallucination).
|
|
@@ -1283,19 +1285,20 @@ El engine YA leyo por vos los archivos clave de cada componente y te los pasa ar
|
|
|
1283
1285
|
|
|
1284
1286
|
REGLA CRITICA PARA MODULOS (NIVEL 2):
|
|
1285
1287
|
- Los modulos SON LAS FEATURES DEL NEGOCIO, NO las capas tecnicas.
|
|
1286
|
-
- MAL: modulos llamados "web-api", "security", "data-access" — eso es hablar de capas, no de
|
|
1287
|
-
- BIEN: modulos llamados "clients", "sales", "products", "auth", "orders" — eso es hablar de features
|
|
1288
|
-
- Para identificar los modulos
|
|
1289
|
-
*
|
|
1290
|
-
*
|
|
1291
|
-
*
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
|
1296
|
-
|
|
|
1297
|
-
|
|
|
1298
|
-
| src/
|
|
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 |
|
|
1299
1302
|
|
|
1300
1303
|
NO inventes datos. Si un componente no tiene una de esas piezas en los archivos leidos, simplemente omiti esa seccion en su documentacion.
|
|
1301
1304
|
|
|
@@ -1510,40 +1513,109 @@ QUE NO HACER
|
|
|
1510
1513
|
- NO documentar componentes triviales (scripts, docs, configs sueltas) con su propia carpeta — mencionalos en NIVEL 0 y listo
|
|
1511
1514
|
- NO inventar endpoints, env vars, puertos o schemas que no leiste
|
|
1512
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
|
+
|
|
1513
1583
|
================================================================
|
|
1514
1584
|
FORMATO DE SALIDA — OBLIGATORIO
|
|
1515
1585
|
================================================================
|
|
1516
1586
|
Devolve UNICAMENTE bloques de archivos separados por marcadores ===. Nada de explicaciones extra fuera de los bloques.
|
|
1517
1587
|
|
|
1518
1588
|
IMPORTANTE: TODAS las rutas son RELATIVAS al directorio del proyecto.
|
|
1519
|
-
Los archivos se escriben SIEMPRE dentro de .agent/context/
|
|
1520
1589
|
|
|
1521
|
-
Ejemplos de marcadores:
|
|
1590
|
+
Ejemplos de marcadores validos:
|
|
1522
1591
|
=== .agent/context/architecture.md ===
|
|
1523
1592
|
=== .agent/context/datamart-data-access-api/architecture.md ===
|
|
1524
1593
|
=== .agent/context/datamart-data-access-api/modules/auth.md ===
|
|
1525
|
-
=== .agent/
|
|
1526
|
-
=== .agent/
|
|
1594
|
+
=== .agent/docs/README.md ===
|
|
1595
|
+
=== .agent/docs/auth.md ===
|
|
1596
|
+
=== .agent/docs/consulta-ventas.md ===
|
|
1527
1597
|
|
|
1528
1598
|
=== .agent/context/architecture.md ===
|
|
1529
|
-
[contenido
|
|
1599
|
+
[contenido NIVEL 0]
|
|
1530
1600
|
|
|
1531
|
-
=== .agent/context/nombre-componente
|
|
1532
|
-
[contenido
|
|
1601
|
+
=== .agent/context/nombre-componente/architecture.md ===
|
|
1602
|
+
[contenido NIVEL 1]
|
|
1533
1603
|
|
|
1534
|
-
=== .agent/context/nombre-componente
|
|
1535
|
-
[contenido
|
|
1604
|
+
=== .agent/context/nombre-componente/modules/auth.md ===
|
|
1605
|
+
[contenido NIVEL 2]
|
|
1536
1606
|
|
|
1537
|
-
=== .agent/
|
|
1538
|
-
[
|
|
1607
|
+
=== .agent/docs/README.md ===
|
|
1608
|
+
[indice de flujos]
|
|
1539
1609
|
|
|
1540
|
-
=== .agent/
|
|
1541
|
-
|
|
1610
|
+
=== .agent/docs/auth.md ===
|
|
1611
|
+
[flujo de autenticacion]
|
|
1542
1612
|
|
|
1543
1613
|
REGLAS DE PATHS:
|
|
1544
|
-
-
|
|
1614
|
+
- Arquitectura global: === .agent/context/architecture.md ===
|
|
1545
1615
|
- Por componente: === .agent/context/[nombre-componente]/architecture.md ===
|
|
1546
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 ===
|
|
1547
1619
|
- Documenta TODOS los componentes no triviales del DIRECTORIO_TRABAJO
|
|
1548
1620
|
- Si existe documentacion previa, ACTUALIZALA preservando lo que sigue siendo valido y agregando lo nuevo`;
|
|
1549
1621
|
const res = await this.runWithFallback('explorer', prompt, 'Exploracion');
|
|
@@ -1574,24 +1646,36 @@ REGLAS DE PATHS:
|
|
|
1574
1646
|
content = content.replace(/^```markdown\s*/i, '').replace(/^```\s*$/gm, '').trim();
|
|
1575
1647
|
if (!content)
|
|
1576
1648
|
continue;
|
|
1577
|
-
//
|
|
1578
|
-
|
|
1649
|
+
// Detect routing: .agent/docs/ → docsDir, .agent/context/ → contextDir
|
|
1650
|
+
const isDocsFile = /^\.agent[\/\\]docs[\/\\]/i.test(fileName);
|
|
1579
1651
|
let targetPath = null;
|
|
1580
|
-
if (
|
|
1581
|
-
|
|
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
|
+
}
|
|
1582
1659
|
}
|
|
1583
1660
|
else {
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
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;
|
|
1587
1665
|
}
|
|
1588
|
-
else
|
|
1589
|
-
|
|
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
|
+
}
|
|
1590
1674
|
}
|
|
1591
1675
|
}
|
|
1592
1676
|
if (!targetPath)
|
|
1593
1677
|
continue;
|
|
1594
|
-
pendingWrites.push({ targetPath, content, label:
|
|
1678
|
+
pendingWrites.push({ targetPath, content, label: fileName.trim() });
|
|
1595
1679
|
}
|
|
1596
1680
|
if (pendingWrites.length === 0) {
|
|
1597
1681
|
log.error('Explorer devolvio texto pero ningun bloque === *.md === fue parseable.');
|