openprompt-lang 1.2.7 → 1.4.0
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/README.md +62 -8
- package/bin/cli.js +2 -0
- package/docs/00-ARCHITECTURE/OPL-BOOST-MULTI-AGENT.md +406 -0
- package/docs/02-STANDARDS/AGENTS.template.md +89 -0
- package/docs/02-STANDARDS/ticket-driven-development.md +99 -0
- package/docs/04-TICKETS/BOOST-001-profile-registry.md +66 -0
- package/docs/04-TICKETS/BOOST-002-context-compression.md +58 -0
- package/docs/04-TICKETS/BOOST-003-template-hydration.md +69 -0
- package/docs/04-TICKETS/BOOST-004-fewshot-engine.md +58 -0
- package/docs/04-TICKETS/BOOST-005-agent-pool.md +69 -0
- package/docs/04-TICKETS/BOOST-006-specialized-agents.md +53 -0
- package/docs/04-TICKETS/BOOST-007-validation-loop.md +56 -0
- package/docs/04-TICKETS/BOOST-008-orchestrator.md +71 -0
- package/docs/04-TICKETS/BOOST-009-cache-system.md +56 -0
- package/docs/04-TICKETS/BOOST-010-cli-mcp.md +67 -0
- package/docs/04-TICKETS/BOOST-011-self-learning.md +50 -0
- package/docs/04-TICKETS/BOOST-012-prompt-preamble.md +109 -0
- package/docs/04-TICKETS/BOOST-013-hydrator-duplicate-code.md +132 -0
- package/docs/04-TICKETS/BOOST-014-multiagent-missing-parts.md +87 -0
- package/docs/04-TICKETS/BOOST-015-skeleton-type-missing.md +76 -0
- package/docs/04-TICKETS/BOOST-016-output-path-duplicate.md +68 -0
- package/docs/04-TICKETS/INDEX.md +89 -0
- package/docs/04-TICKETS/_archive/BOOST-005-micro-tasking.md +67 -0
- package/docs/04-TICKETS/_archive/BOOST-006-validation-loop.md +66 -0
- package/docs/04-TICKETS/_archive/BOOST-007-progressive-pipeline.md +69 -0
- package/docs/04-TICKETS/_archive/BOOST-008-cli-mcp-integration.md +74 -0
- package/docs/AI_CONTEXT.md +16 -0
- package/docs/EMBEDDINGS.md +214 -0
- package/docs/ONBOARDING_WORKFLOW.md +151 -0
- package/docs/OPL_ACADEMIC_ISSUES.md +158 -0
- package/docs/WEB_SCRAPER_PLAN.md +454 -0
- package/package.json +9 -2
- package/scripts/postinstall.js +37 -0
- package/src/boost/agent-pool.js +442 -0
- package/src/boost/agents/index.js +79 -0
- package/src/boost/cache.js +241 -0
- package/src/boost/context-compressor.js +354 -0
- package/src/boost/fewshot-retriever.js +332 -0
- package/src/boost/hardware-detector.js +486 -0
- package/src/boost/hydrator.js +398 -0
- package/src/boost/index.js +60 -0
- package/src/boost/orchestrator.js +615 -0
- package/src/boost/preamble.js +217 -0
- package/src/boost/profile-registry.js +264 -0
- package/src/boost/self-learn.js +247 -0
- package/src/boost/skeletons/component.skeleton.js +24 -0
- package/src/boost/skeletons/hook.skeleton.js +27 -0
- package/src/boost/skeletons/index.js +67 -0
- package/src/boost/skeletons/page.skeleton.js +22 -0
- package/src/boost/skeletons/service.skeleton.js +20 -0
- package/src/boost/skeletons/store.skeleton.js +18 -0
- package/src/boost/skeletons/type.skeleton.js +11 -0
- package/src/boost/task-dispatcher.js +142 -0
- package/src/boost/validation-loop.js +495 -0
- package/src/cli/commands-boost.js +394 -0
- package/src/cli/commands-knowledge.js +1 -0
- package/src/cli/commands-opl.js +79 -1
- package/src/cli/commands-workflow.js +125 -6
- package/src/commands/init-core.js +169 -5
- package/src/commands/knowledge-ops.js +52 -0
- package/src/commands/opl-embeddings.js +556 -0
- package/src/commands/opl-help.js +26 -2
- package/src/commands/opl-search.js +106 -2
- package/src/commands/opl-webscrape.js +390 -0
- package/src/commands/workflow/epic-cli.js +192 -0
- package/src/commands/workflow/select.js +146 -0
- package/src/commands/workflow/sprint-cli.js +174 -0
- package/src/core/webscrape/analyzer.js +481 -0
- package/src/core/webscrape/deep-scraper.js +1027 -0
- package/src/core/workflow/epic-manager.js +845 -0
- package/src/core/workflow/gates.js +180 -1
- package/src/core/workflow/selector.js +707 -0
- package/src/embeddings/chunker.js +450 -0
- package/src/embeddings/embedder.js +431 -0
- package/src/embeddings/index-pipeline.js +320 -0
- package/src/embeddings/vector-store.js +505 -0
- package/src/mcp-refactor/handlers/boost.js +295 -0
- package/src/mcp-refactor/router.js +19 -0
- package/src/mcp-refactor/tools.js +113 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Ticket-Driven Development con openPrompt-Lang
|
|
2
|
+
|
|
3
|
+
> **Propósito:** Documentar el proceso de trabajo que combina tickets ágiles, sprints y anotaciones `@learn-error` de OPL. Este documento sirve como referencia obligatoria y como input para mejorar el workflow de OPL en siguientes versiones.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## El Workflow: Bug → Ticket → Fix → Learn-Error
|
|
8
|
+
|
|
9
|
+
### Regla de Oro
|
|
10
|
+
> **No se fixea nada sin un ticket primero.**
|
|
11
|
+
> Todo bug, por mínimo que sea, debe generar un TICKET-NNN antes de escribir código.
|
|
12
|
+
|
|
13
|
+
### Ciclo Completo
|
|
14
|
+
```
|
|
15
|
+
1. DETECTAR → 2. TICKET → 3. FIX → 4. QA → 5. LEARN → 6. ARCHIVAR
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
#### Paso 1: Detectar
|
|
19
|
+
- Puede venir de: `npx tsc --noEmit`, `npx openprompt-lang validate`, auditoría manual, QA tests
|
|
20
|
+
|
|
21
|
+
#### Paso 2: Crear Ticket
|
|
22
|
+
- Ubicación: `docs/04-TICKETS/TICKET-NNN-descripcion.md`
|
|
23
|
+
- Numeración correlativa global
|
|
24
|
+
|
|
25
|
+
#### Paso 3: Fix
|
|
26
|
+
- Hacer cambios en el código
|
|
27
|
+
- Si se descubre otro bug durante el fix, crear **nuevo ticket**
|
|
28
|
+
|
|
29
|
+
#### Paso 4: QA
|
|
30
|
+
- `npx tsc --noEmit` — debe pasar sin errores
|
|
31
|
+
- `npx openprompt-lang validate` — debe pasar sin errores
|
|
32
|
+
|
|
33
|
+
#### Paso 5: Learn-Error
|
|
34
|
+
```typescript
|
|
35
|
+
// @learn-error id=MODULO-NNN
|
|
36
|
+
// input='qué se hizo mal'
|
|
37
|
+
// expected='qué debería pasar'
|
|
38
|
+
// actual='qué pasó realmente'
|
|
39
|
+
// fix='cómo se corrigió'
|
|
40
|
+
// category=dominio
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
#### Paso 6: Archivar (Opcional)
|
|
44
|
+
- Sprint cerrado = tickets referenciados y archivados
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Estructura de Tickets
|
|
49
|
+
|
|
50
|
+
```markdown
|
|
51
|
+
# TICKET-NNN: Título Descriptivo
|
|
52
|
+
|
|
53
|
+
> **Sprint:** Sprint-N
|
|
54
|
+
> **Prioridad:** 🔴 Crítica | 🟠 Alta | 🟡 Media | 🟢 Baja
|
|
55
|
+
> **Esfuerzo:** Xh
|
|
56
|
+
|
|
57
|
+
## Contexto
|
|
58
|
+
[2-3 párrafos explicando el problema]
|
|
59
|
+
|
|
60
|
+
## Acceptance Criteria
|
|
61
|
+
- [ ] CRITERIO-1: Descripción verificable
|
|
62
|
+
- [ ] CRITERIO-2: Incluye edge cases
|
|
63
|
+
|
|
64
|
+
## QA Tests
|
|
65
|
+
```bash
|
|
66
|
+
# Test: comando para verificar
|
|
67
|
+
```
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Mejoras Propuestas para OPL v2
|
|
73
|
+
|
|
74
|
+
### 1. Nuevo Workflow "bug → ticket"
|
|
75
|
+
Paso obligatorio `create_ticket` antes de fix en el default workflow.
|
|
76
|
+
|
|
77
|
+
### 2. Integración de TODO List
|
|
78
|
+
Auto-creación de TODO list al comenzar tarea >3 pasos.
|
|
79
|
+
|
|
80
|
+
### 3. Anchored Summary Automático
|
|
81
|
+
Al cerrar sesión, generar resumen desde TODOs completados.
|
|
82
|
+
|
|
83
|
+
### 4. QA Tests Como Comandos
|
|
84
|
+
```yaml
|
|
85
|
+
acceptance:
|
|
86
|
+
- cmd: "npx tsc --noEmit"
|
|
87
|
+
expect: "exit code 0"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 5. Categorías Controladas para @learn-error
|
|
91
|
+
Enum validado por el validador (no strings libres).
|
|
92
|
+
|
|
93
|
+
### 6. Archivo de Tickets como Formato Reconocido
|
|
94
|
+
OPL debería reconocer `docs/04-TICKETS/TICKET-NNN-*.md` y validar su estructura.
|
|
95
|
+
|
|
96
|
+
### 7. Cross-Reference entre Tickets y Código
|
|
97
|
+
```typescript
|
|
98
|
+
// @ref-ticket(TICKET-023)
|
|
99
|
+
```
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# BOOST-001 — Profile Registry + Config Base
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-001 |
|
|
8
|
+
| **Título** | Profile Registry + Config Base |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | ✅ Completado |
|
|
12
|
+
| **Depende de** | — |
|
|
13
|
+
| **Archivos** | `src/boost/profile-registry.js`, `prompt-lang.json` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Crear el sistema de perfiles de modelo que permite a OPL detectar automáticamente la capacidad del modelo activo (small/medium/large) y configurar las estrategias de boost según el perfil.
|
|
18
|
+
|
|
19
|
+
Este es el cimiento del módulo Boost — sin esto, ningún otro componente sabe cómo comportarse.
|
|
20
|
+
|
|
21
|
+
## Criterios de Aceptación
|
|
22
|
+
|
|
23
|
+
### CA-1: Perfiles definidos
|
|
24
|
+
- [x] Existen 3 perfiles: `small` (8K contexto), `medium` (32K), `large` (128K+)
|
|
25
|
+
- [x] Cada perfil define: `compressionLevel`, `validationLoops`, `microTasks`, `templateHydration`, `fewShot`, `contextWindow`
|
|
26
|
+
- [x] Los valores por defecto son razonables (small: alta compresión, 3 loops; large: sin compresión, 1 loop)
|
|
27
|
+
|
|
28
|
+
### CA-2: Detección automática
|
|
29
|
+
- [x] Detecta perfil desde `process.env.OPL_BOOST_PROFILE`
|
|
30
|
+
- [x] Detecta perfil desde `process.env.OPL_MODEL` (mapeo por nombre conocido: deepseek-coder → small, qwen2.5-coder → medium, gpt-4 → large)
|
|
31
|
+
- [x] Detecta perfil desde configuración en `prompt-lang.json`
|
|
32
|
+
- [x] Si no hay indicación, default: `medium` (seguro)
|
|
33
|
+
|
|
34
|
+
### CA-3: API exportable
|
|
35
|
+
- [x] `getProfile()` → devuelve el perfil activo con todos sus valores
|
|
36
|
+
- [x] `setProfile(name)` → fuerza un perfil
|
|
37
|
+
- [x] `listProfiles()` → lista los perfiles disponibles
|
|
38
|
+
- [x] `detectProfile()` → lógica de detección automática
|
|
39
|
+
|
|
40
|
+
### CA-4: Config en prompt-lang.json
|
|
41
|
+
- [x] Sección `boost` agregada a `prompt-lang.json`
|
|
42
|
+
- [x] `boost.enabled: true/false`
|
|
43
|
+
- [x] `boost.defaultProfile: "auto" | "small" | "medium" | "large"`
|
|
44
|
+
- [x] `boost.profiles` con la configuración de cada perfil
|
|
45
|
+
|
|
46
|
+
### CA-5: CLI check
|
|
47
|
+
- [x] `opl boost check` muestra diagnóstico: perfil detectado, valores activos, modo
|
|
48
|
+
|
|
49
|
+
### CA-6: Tests
|
|
50
|
+
- [ ] Tests unitarios para detección de perfil (con variables de entorno mock)
|
|
51
|
+
- [ ] Tests para valores por defecto
|
|
52
|
+
- [ ] Tests para forzar perfil
|
|
53
|
+
|
|
54
|
+
## Archivos a crear/modificar
|
|
55
|
+
|
|
56
|
+
| Archivo | Acción |
|
|
57
|
+
|---------|--------|
|
|
58
|
+
| `src/boost/profile-registry.js` | ➕ Crear |
|
|
59
|
+
| `prompt-lang.json` | ✏️ Modificar (sección boost) |
|
|
60
|
+
| `src/cli/commands-boost.js` | ➕ Crear (registro inicial con `opl boost check`) |
|
|
61
|
+
|
|
62
|
+
## Notas técnicas
|
|
63
|
+
|
|
64
|
+
- No debe tener dependencias externas más allá de `fs` y `path`
|
|
65
|
+
- El perfil se cachea en memoria para no re-detectar en cada llamada
|
|
66
|
+
- El CLI `opl boost check` debe funcionar incluso si el resto del módulo Boost no está implementado
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# BOOST-002 — Context Compression Engine
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-002 |
|
|
8
|
+
| **Título** | Context Compression Engine |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | ✅ Completado |
|
|
12
|
+
| **Depende de** | BOOST-001 |
|
|
13
|
+
| **Archivos** | `src/boost/context-compressor.js` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Motor que comprime el contexto (AGENTS.md, reglas, documentación) a solo las secciones relevantes para la tarea actual. Un modelo small recibe ~20% del contexto original, eliminando secciones irrelevantes.
|
|
18
|
+
|
|
19
|
+
La compresión es adaptativa según el perfil: small comprime 80%, medium 50%, large 0%.
|
|
20
|
+
|
|
21
|
+
## Criterios de Aceptación
|
|
22
|
+
|
|
23
|
+
### CA-1: Compresión por tarea
|
|
24
|
+
- [ ] `compressContext(task, fullContext, profile)` → devuelve contexto comprimido
|
|
25
|
+
- [ ] El task description se usa para hacer keyword matching contra secciones
|
|
26
|
+
- [ ] Solo incluye secciones con score de relevancia > umbral (configurable por perfil)
|
|
27
|
+
|
|
28
|
+
### CA-2: Modos de compresión
|
|
29
|
+
- [ ] **Modo seguro** (default): siempre incluye reglas de enforcement (@limit, @kind, NUNCA)
|
|
30
|
+
- [ ] **Modo agresivo**: solo incluye lo estrictamente relevante a la tarea
|
|
31
|
+
- [ ] **Modo desactivado**: pasa el contexto completo sin modificar
|
|
32
|
+
|
|
33
|
+
### CA-3: Compresión cuantificable
|
|
34
|
+
- [ ] Retorna métricas: `{ originalChars, compressedChars, reductionPercent, sectionsKept, sectionsRemoved }`
|
|
35
|
+
- [ ] Las métricas son accesibles vía `opl boost check`
|
|
36
|
+
|
|
37
|
+
### CA-4: Preservación de estructura
|
|
38
|
+
- [ ] No rompe bloques de código, tablas, o listas
|
|
39
|
+
- [ ] Preserva la sección de NUNCA y ENFORCEMENT siempre (modo seguro)
|
|
40
|
+
- [ ] El output sigue siendo markdown válido
|
|
41
|
+
|
|
42
|
+
### CA-5: Tests
|
|
43
|
+
- [ ] Test con AGENTS.md completo: verify reduction % según perfil
|
|
44
|
+
- [ ] Test que preserve sectiones críticas (ENFORCEMENT, NUNCA)
|
|
45
|
+
- [ ] Test de keyword matching con diferentes task descriptions
|
|
46
|
+
|
|
47
|
+
## Archivos a crear/modificar
|
|
48
|
+
|
|
49
|
+
| Archivo | Acción |
|
|
50
|
+
|---------|--------|
|
|
51
|
+
| `src/boost/context-compressor.js` | ➕ Crear |
|
|
52
|
+
|
|
53
|
+
## Notas técnicas
|
|
54
|
+
|
|
55
|
+
- Implementar como función pura (sin side effects) para testabilidad
|
|
56
|
+
- El matching de secciones se hace por: título de sección (##, ###), palabras clave, y contexto
|
|
57
|
+
- Secciones protegidas: `ENFORCEMENT`, `NUNCA`, `REGLA ABSOLUTA`, `@limit`
|
|
58
|
+
- No necesita leer archivos — recibe el contexto como string
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# BOOST-003 — Template Hydration System
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-003 |
|
|
8
|
+
| **Título** | Template Hydration System |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | ✅ Completado |
|
|
12
|
+
| **Depende de** | BOOST-001 |
|
|
13
|
+
| **Archivos** | `src/boost/hydrator.js`, `src/boost/skeletons/*` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Sistema que proporciona esqueletos de código (skeletons) por @kind (hook, component, page, service, store) donde el modelo solo rellena la lógica de negocio (~10%). OPL se encarga de armar el código final con imports, tipos, anotaciones OPL y exports correctos.
|
|
18
|
+
|
|
19
|
+
Esto reduce drásticamente los errores de estructura típicos de modelos pequeños.
|
|
20
|
+
|
|
21
|
+
## Criterios de Aceptación
|
|
22
|
+
|
|
23
|
+
### CA-1: Skeletons por @kind
|
|
24
|
+
- [ ] Existen skeletons para: `hook`, `component`, `page`, `service`, `store`
|
|
25
|
+
- [ ] Cada skeleton incluye: imports base, estructura OPL (@use, @kind, @limit), tipo/interface, función placeholder, export
|
|
26
|
+
- [ ] Los skeletons respetan los límites de líneas de AGENTS.md (hook:80, component:120, etc.)
|
|
27
|
+
|
|
28
|
+
### CA-2: Hydration
|
|
29
|
+
- [ ] `hydrate(kind, businessLogic)` → devuelve archivo completo con anotaciones
|
|
30
|
+
- [ ] El business logic del modelo se inyecta en el placeholder correcto
|
|
31
|
+
- [ ] Se agregan anotaciones @use con los valores correctos
|
|
32
|
+
- [ ] Se agrega @limit según el @kind
|
|
33
|
+
- [ ] Se agrega @contract (hooks/services) o @props (components) según el tipo
|
|
34
|
+
|
|
35
|
+
### CA-3: Validación post-hydration
|
|
36
|
+
- [ ] El archivo resultante pasa `npx openprompt-lang validate` sin errores
|
|
37
|
+
- [ ] El archivo resultante tiene TypeScript válido
|
|
38
|
+
|
|
39
|
+
### CA-4: CLI generate
|
|
40
|
+
- [ ] `opl boost generate "hook useAuth"` → hydrata un hook
|
|
41
|
+
- [ ] `opl boost generate "component Button" --kind component` → hydrata un componente
|
|
42
|
+
- [ ] Opción `--dry-run` muestra el skeleton sin rellenar
|
|
43
|
+
- [ ] Opción `--kind` para especificar tipo (auto-detecta si se omite)
|
|
44
|
+
|
|
45
|
+
### CA-5: Tests
|
|
46
|
+
- [ ] Test de hydratación para cada @kind
|
|
47
|
+
- [ ] Test que el output pase validate
|
|
48
|
+
- [ ] Test que el output tenga TypeScript válido (si tsc está disponible)
|
|
49
|
+
- [ ] Test con business logic mínimo
|
|
50
|
+
|
|
51
|
+
## Archivos a crear/modificar
|
|
52
|
+
|
|
53
|
+
| Archivo | Acción |
|
|
54
|
+
|---------|--------|
|
|
55
|
+
| `src/boost/hydrator.js` | ➕ Crear |
|
|
56
|
+
| `src/boost/skeletons/hook.skeleton.js` | ➕ Crear |
|
|
57
|
+
| `src/boost/skeletons/component.skeleton.js` | ➕ Crear |
|
|
58
|
+
| `src/boost/skeletons/page.skeleton.js` | ➕ Crear |
|
|
59
|
+
| `src/boost/skeletons/service.skeleton.js` | ➕ Crear |
|
|
60
|
+
| `src/boost/skeletons/store.skeleton.js` | ➕ Crear |
|
|
61
|
+
| `src/boost/skeletons/index.js` | ➕ Crear (export unificado) |
|
|
62
|
+
|
|
63
|
+
## Notas técnicas
|
|
64
|
+
|
|
65
|
+
- Los skeletons son archivos JavaScript/TypeScript válidos con marcadores `{{PLACEHOLDER_LOGIC}}`
|
|
66
|
+
- La hydratación es un simple string replace + wrapper injection
|
|
67
|
+
- Los skeletons deben seguir las convenciones de OPL (named exports, anotaciones primero)
|
|
68
|
+
- Para `component`: incluir estructura cva + cn() como en shadcn/ui
|
|
69
|
+
- Para `hook`: incluir estructura de estado + efecto + retorno tipado
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# BOOST-004 — Few-Shot Example Engine
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-004 |
|
|
8
|
+
| **Título** | Few-Shot Example Engine |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Media |
|
|
11
|
+
| **Estado** | ✅ Completado |
|
|
12
|
+
| **Depende de** | BOOST-001 |
|
|
13
|
+
| **Archivos** | `src/boost/fewshot-retriever.js` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Motor que busca ejemplos relevantes en el knowledge-repo y los injecta en el prompt como few-shot examples antes de que el modelo genere código. Los modelos pequeños mejoran dramáticamente cuando tienen ejemplos concretos del mismo dominio y @kind.
|
|
18
|
+
|
|
19
|
+
## Criterios de Aceptación
|
|
20
|
+
|
|
21
|
+
### CA-1: Búsqueda de ejemplos
|
|
22
|
+
- [ ] `retrieveExamples(kind, domain, query)` → devuelve 2-3 ejemplos relevantes
|
|
23
|
+
- [ ] Busca en templates de OPL (p.ej., hooks existentes en src/)
|
|
24
|
+
- [ ] Busca en knowledge-repo (documentación, ejemplos de código)
|
|
25
|
+
- [ ] Filtra por @kind (solo ejemplos del mismo tipo)
|
|
26
|
+
|
|
27
|
+
### CA-2: Ranking de relevancia
|
|
28
|
+
- [ ] Ordena resultados por: matching de dominio > matching de @kind > frescura (fecha)
|
|
29
|
+
- [ ] Devuelve máximo 3 ejemplos para no saturar el contexto del modelo
|
|
30
|
+
|
|
31
|
+
### CA-3: Inyección en prompt
|
|
32
|
+
- [ ] `buildFewShotPrompt(examples, userPrompt)` → prompt completo con ejemplos antes de la instrucción
|
|
33
|
+
- [ ] Los ejemplos se envuelven en bloques con metadata (archivo, @kind, propósito)
|
|
34
|
+
- [ ] El prompt resultante tiene estructura clara: [instrucción] → [ejemplos] → [tarea]
|
|
35
|
+
|
|
36
|
+
### CA-4: Configuración por perfil
|
|
37
|
+
- [ ] Perfil `small`: siempre busca ejemplos (fewShot: true)
|
|
38
|
+
- [ ] Perfil `medium`: busca ejemplos si hay matching > 70%
|
|
39
|
+
- [ ] Perfil `large`: no busca ejemplos (fewShot: false)
|
|
40
|
+
|
|
41
|
+
### CA-5: Tests
|
|
42
|
+
- [ ] Test de búsqueda con diferentes queries
|
|
43
|
+
- [ ] Test que no retorne más de 3 ejemplos
|
|
44
|
+
- [ ] Test de formato del prompt inyectado
|
|
45
|
+
- [ ] Test con knowledge-repo vacío (debe fallar graceful)
|
|
46
|
+
|
|
47
|
+
## Archivos a crear/modificar
|
|
48
|
+
|
|
49
|
+
| Archivo | Acción |
|
|
50
|
+
|---------|--------|
|
|
51
|
+
| `src/boost/fewshot-retriever.js` | ➕ Crear |
|
|
52
|
+
|
|
53
|
+
## Notas técnicas
|
|
54
|
+
|
|
55
|
+
- La búsqueda en knowledge-repo puede ser básica (grep/búsqueda textual) o usando los embeddings existentes
|
|
56
|
+
- Priorizar búsqueda textual simple para no depender de embeddings
|
|
57
|
+
- Los ejemplos deben ser cortos (máximo 50 líneas cada uno)
|
|
58
|
+
- Incluir metadata de cada ejemplo: tipo, dominio, propósito
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# BOOST-005 — Agent Pool + Ollama Connector
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-005 |
|
|
8
|
+
| **Título** | Agent Pool + Ollama Connector |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | ✅ Completado |
|
|
12
|
+
| **Depende de** | BOOST-001 |
|
|
13
|
+
| **Documento** | `docs/00-ARCHITECTURE/OPL-BOOST-MULTI-AGENT.md` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Infraestructura que permite a OPL llamar a modelos locales vía Ollama. El Agent Pool gestiona una cola de solicitudes, maneja reintentos, timeouts y formatea los prompts según el rol del agente. Es el núcleo que permite el modelo de orquestación interna (Modelo A).
|
|
18
|
+
|
|
19
|
+
## Criterios de Aceptación
|
|
20
|
+
|
|
21
|
+
### CA-1: Conector Ollama
|
|
22
|
+
- [x] `callOllama(prompt, options)` → llama a `http://localhost:11434/api/generate`
|
|
23
|
+
- [x] Soporta: `model`, `temperature`, `maxTokens`, `stream` (false por defecto)
|
|
24
|
+
- [x] Timeout configurable (default: 30s)
|
|
25
|
+
- [x] Manejo de errores: conexión rechazada, timeout, respuesta inválida
|
|
26
|
+
|
|
27
|
+
### CA-2: Pool de agentes
|
|
28
|
+
- [x] `AgentPool` clase que mantiene cola de solicitudes
|
|
29
|
+
- [x] `pool.submit(role, input, profile)` → encola y retorna promesa
|
|
30
|
+
- [x] Modo cola: una solicitud a la vez (FIFO)
|
|
31
|
+
- [x] Modo paralelo: múltiples solicitudes simultáneas (configurable via perfil)
|
|
32
|
+
|
|
33
|
+
### CA-3: Formateo de prompts por rol
|
|
34
|
+
- [x] `buildPrompt(role, input)` → arma el prompt según el rol del agente
|
|
35
|
+
- [x] Roles iniciales: `types`, `state`, `logic`, `cleaner`, `validate`
|
|
36
|
+
- [x] Cada rol tiene: system prompt + template de input + formato de output esperado
|
|
37
|
+
|
|
38
|
+
### CA-4: Detección de Ollama
|
|
39
|
+
- [x] `checkOllama()` → verifica si Ollama está corriendo
|
|
40
|
+
- [x] `listModels()` → lista modelos disponibles en Ollama
|
|
41
|
+
- [x] `selectBestModel(profile)` → selecciona el mejor modelo según perfil
|
|
42
|
+
|
|
43
|
+
### CA-5: Integración con perfil
|
|
44
|
+
- [x] Lee configuración de `profile.agentPool` (mode, modelName, temperature)
|
|
45
|
+
- [x] Si Ollama no está disponible, falla graceful con mensaje claro
|
|
46
|
+
|
|
47
|
+
### CA-6: Tests
|
|
48
|
+
- [ ] Test de formateo de prompts por rol
|
|
49
|
+
- [ ] Test de cola FIFO
|
|
50
|
+
- [ ] Test de timeout y errores
|
|
51
|
+
- [ ] Test de detección de Ollama (mock)
|
|
52
|
+
|
|
53
|
+
## Archivos
|
|
54
|
+
|
|
55
|
+
| Archivo | Acción |
|
|
56
|
+
|---------|--------|
|
|
57
|
+
| `src/boost/agent-pool.js` | ➕ Crear (conector + pool + prompts) |
|
|
58
|
+
| `src/boost/agents/agent-types.js` | ➕ Crear |
|
|
59
|
+
| `src/boost/agents/agent-state.js` | ➕ Crear |
|
|
60
|
+
| `src/boost/agents/agent-logic.js` | ➕ Crear |
|
|
61
|
+
| `src/boost/agents/agent-validate.js` | ➕ Crear |
|
|
62
|
+
| `src/boost/agents/agent-cleaner.js` | ➕ Crear |
|
|
63
|
+
| `src/boost/agents/index.js` | ➕ Crear (export unificado) |
|
|
64
|
+
|
|
65
|
+
## Notas
|
|
66
|
+
|
|
67
|
+
- Node 18+ tiene `fetch` nativo — no necesita dependencias externas
|
|
68
|
+
- La URL de Ollama es configurable via `OLLAMA_HOST` env var (default: `http://localhost:11434`)
|
|
69
|
+
- Los prompts deben ser cortos (< 500 chars) para que quepan en contexto small
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# BOOST-006 — Agentes Especializados (Types, State, Logic, Cleaner, Validate)
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-006 |
|
|
8
|
+
| **Título** | Agentes Especializados |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | ✅ Completado |
|
|
12
|
+
| **Depende de** | BOOST-005 |
|
|
13
|
+
| **Archivos** | `src/boost/agents/index.js`, `src/boost/agent-pool.js` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Registro de agentes especializados que envuelven los prompts del Agent Pool (BOOST-005) con lógica de validación y parseo de output. Cada agente tiene un rol específico en el pipeline de generación de código.
|
|
18
|
+
|
|
19
|
+
## Implementación
|
|
20
|
+
|
|
21
|
+
Los 5 agentes están implementados en `src/boost/agents/index.js`:
|
|
22
|
+
|
|
23
|
+
| Rol | ID | Validación |
|
|
24
|
+
|-----|-----|-----------|
|
|
25
|
+
| **Type Designer** | `types` | Output debe contener `interface` o `type ` |
|
|
26
|
+
| **State Architect** | `state` | Output debe contener `useState`, `useEffect`, o `useReducer` |
|
|
27
|
+
| **Logic Implementer** | `logic` | Output debe tener más de 50 caracteres |
|
|
28
|
+
| **Context Cleaner** | `cleaner` | Output debe ser más corto que el input |
|
|
29
|
+
| **Code Validator** | `validate` | Output debe tener más de 20 caracteres |
|
|
30
|
+
|
|
31
|
+
## Criterios de Aceptación
|
|
32
|
+
|
|
33
|
+
### CA-1: Agentes registrados
|
|
34
|
+
- [x] 5 roles definidos en `AGENTS` registry: types, state, logic, cleaner, validate
|
|
35
|
+
- [x] Cada agente exporta: `role`, `label`, `description`, `buildPrompt`, `validateOutput`, `parseOutput`
|
|
36
|
+
- [x] `getAgent(role)` → obtiene agente por ID
|
|
37
|
+
- [x] `listAgents()` → lista todos los agentes disponibles
|
|
38
|
+
|
|
39
|
+
### CA-2: Validación de output
|
|
40
|
+
- [x] `validateOutput(text)` → verifica que el output tenga sentido para el rol
|
|
41
|
+
- [x] Si un agente produce output inválido, se puede reintentar
|
|
42
|
+
- [x] Validación específica por tipo de agente
|
|
43
|
+
|
|
44
|
+
### CA-3: Tests
|
|
45
|
+
- [ ] Test unitario para cada agente
|
|
46
|
+
- [ ] Test de validación de output
|
|
47
|
+
- [ ] Test que `getAgent` falla con rol desconocido
|
|
48
|
+
|
|
49
|
+
## Notas
|
|
50
|
+
|
|
51
|
+
- Los prompts de sistema viven en `agent-pool.js` (buildPrompt), el registry en `agents/index.js`
|
|
52
|
+
- Cada agente usa `buildPrompt(role, input)` del Agent Pool
|
|
53
|
+
- No hay archivos individuales por agente — todo está en el registry centralizado con agent-pool.js
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# BOOST-007 — Validation Loop + Agent Validate
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-007 |
|
|
8
|
+
| **Título** | Validation Loop + Agent Validate |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | ✅ Completado |
|
|
12
|
+
| **Depende de** | BOOST-006 |
|
|
13
|
+
| **Archivos** | `src/boost/validation-loop.js` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Sistema post-generación que ejecuta validación OPL y TypeScript sobre el código generado, retroalimentando errores específicos al agente `validate` para que los corrija. Los modelos pequeños son significativamente mejores corrigiendo errores específicos que generando código correcto la primera vez.
|
|
18
|
+
|
|
19
|
+
Si tras N reintentos el código sigue fallando, escala hacia abajo la complejidad.
|
|
20
|
+
|
|
21
|
+
## Criterios de Aceptación
|
|
22
|
+
|
|
23
|
+
### CA-1: Validación post-generación
|
|
24
|
+
- [ ] `validate(code, kind)` → ejecuta validación OPL sobre código generado
|
|
25
|
+
- [ ] Detecta: errores de anotaciones, violaciones de @limit, errores de sintaxis
|
|
26
|
+
- [ ] Retorna array de errores con: tipo, mensaje, línea, sugerencia de fix
|
|
27
|
+
|
|
28
|
+
### CA-2: Feedback loop con agente validate
|
|
29
|
+
- [ ] `feedbackLoop(code, errors, profile)` → itera: feedback → agente validate → re-validar
|
|
30
|
+
- [ ] El feedback dice exactamente qué está mal + sugerencia
|
|
31
|
+
- [ ] Número de reintentos según perfil: small=3, medium=2, large=1
|
|
32
|
+
|
|
33
|
+
### CA-3: Escalado de complejidad
|
|
34
|
+
- [ ] Si tras reintentos el código sigue fallando, reduce complejidad
|
|
35
|
+
- [ ] Estrategias: simplificar lógica, usar skeleton más básico, dividir en micro-tareas
|
|
36
|
+
- [ ] `escalateDown(task, attempt)` → versión simplificada de la tarea
|
|
37
|
+
|
|
38
|
+
### CA-4: Reporte de calidad
|
|
39
|
+
- [ ] `generateReport(codeHistory, errors)` → cuántos intentos tomó, qué errores se corrigieron
|
|
40
|
+
|
|
41
|
+
### CA-5: Tests
|
|
42
|
+
- [ ] Test de detección de errores de anotaciones
|
|
43
|
+
- [ ] Test de feedback loop con mock
|
|
44
|
+
- [ ] Test de escalado tras N reintentos fallidos
|
|
45
|
+
|
|
46
|
+
## Archivos a crear
|
|
47
|
+
|
|
48
|
+
| Archivo | Acción |
|
|
49
|
+
|---------|--------|
|
|
50
|
+
| `src/boost/validation-loop.js` | ➕ Crear |
|
|
51
|
+
|
|
52
|
+
## Notas técnicas
|
|
53
|
+
|
|
54
|
+
- La validación OPL se hace invocando `npx openprompt-lang validate` o usando el módulo de validación directamente
|
|
55
|
+
- El feedback loop necesita acceso al modelo vía agent-pool.js para re-generar
|
|
56
|
+
- El escalado de complejidad es determinista (no necesita IA)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# BOOST-008 — Orchestrator (Pipeline Unificado)
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-008 |
|
|
8
|
+
| **Título** | Orchestrator — Pipeline Unificado |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | ✅ Completado |
|
|
12
|
+
| **Depende de** | BOOST-007 |
|
|
13
|
+
| **Archivos** | `src/boost/orchestrator.js`, `src/boost/task-dispatcher.js`, `src/boost/index.js` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Orquestador multi-etapa que coordina todos los componentes Boost en un flujo coherente. Incluye el **Task Dispatcher** que descompone tareas en un DAG de pasos con dependencias, y el **Orchestrator** que ejecuta el pipeline completo.
|
|
18
|
+
|
|
19
|
+
El pipeline completo:
|
|
20
|
+
1. **Profile detect** → carga perfil activo
|
|
21
|
+
2. **Context compress** → reduce contexto según perfil
|
|
22
|
+
3. **Few-shot retrieve** → busca ejemplos relevantes
|
|
23
|
+
4. **Task dispatch** → descompone en DAG
|
|
24
|
+
5. **Agent pool execute** → ejecuta agentes según dependencias
|
|
25
|
+
6. **Hydrate** → ensambla código final (usa BOOST-003)
|
|
26
|
+
7. **Validate loop** → corrige errores (usa BOOST-007)
|
|
27
|
+
8. **Output** → código listo
|
|
28
|
+
|
|
29
|
+
## Criterios de Aceptación
|
|
30
|
+
|
|
31
|
+
### CA-1: Task Dispatcher (DAG)
|
|
32
|
+
- [ ] `plan(task, kind)` → devuelve DAG con nodos y dependencias
|
|
33
|
+
- [ ] Nodos sin dependencias → paralelo; con dependencias → secuencial
|
|
34
|
+
- [ ] DAG serializable a JSON para cache/debug
|
|
35
|
+
- [ ] Soporta: hooks, components, pages, services, stores
|
|
36
|
+
|
|
37
|
+
### CA-2: Orchestrator unificado
|
|
38
|
+
- [ ] `boost(task, options)` → orquesta pipeline completo
|
|
39
|
+
- [ ] `options.profile` → perfil a usar
|
|
40
|
+
- [ ] `options.kind` → tipo de archivo
|
|
41
|
+
- [ ] `options.dryRun` → mostrar plan sin ejecutar
|
|
42
|
+
- [ ] `options.output` → archivo de salida
|
|
43
|
+
- [ ] Retorna: `{ code, metadata, report }`
|
|
44
|
+
|
|
45
|
+
### CA-3: Metadata de ejecución
|
|
46
|
+
- [ ] `{ profile, stages: [{name, duration, result}], totalTime, compressionRatio, validationAttempts }`
|
|
47
|
+
- [ ] Exportable como JSON para diagnóstico
|
|
48
|
+
|
|
49
|
+
### CA-4: Modo dry-run
|
|
50
|
+
- [ ] `boost(task, { dryRun: true })` → muestra DAG, skeletons, ejemplos sin ejecutar
|
|
51
|
+
|
|
52
|
+
### CA-5: Tests
|
|
53
|
+
- [ ] Test de planificación DAG para cada @kind
|
|
54
|
+
- [ ] Test de pipeline completo con mock de modelo
|
|
55
|
+
- [ ] Test de dry-run
|
|
56
|
+
- [ ] Test de metadata de ejecución
|
|
57
|
+
|
|
58
|
+
## Archivos a crear
|
|
59
|
+
|
|
60
|
+
| Archivo | Acción |
|
|
61
|
+
|---------|--------|
|
|
62
|
+
| `src/boost/orchestrator.js` | ➕ Crear (pipeline unificado) |
|
|
63
|
+
| `src/boost/task-dispatcher.js` | ➕ Crear (DAG planner) |
|
|
64
|
+
| `src/boost/index.js` | ➕ Crear (API público del módulo) |
|
|
65
|
+
|
|
66
|
+
## Notas técnicas
|
|
67
|
+
|
|
68
|
+
- El `index.js` es el API público del módulo Boost (`import { boost } from './boost/index.js'`)
|
|
69
|
+
- Cada etapa del pipeline se puede ejecutar independientemente
|
|
70
|
+
- Si una etapa falla, el pipeline devuelve error con estado parcial
|
|
71
|
+
- Los tiempos de cada etapa se registran para diagnóstico
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# BOOST-009 — Cache System
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-009 |
|
|
8
|
+
| **Título** | Cache System para Boost |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Media |
|
|
11
|
+
| **Estado** | ✅ Completado |
|
|
12
|
+
| **Depende de** | BOOST-008 |
|
|
13
|
+
| **Archivos** | `src/boost/cache.js` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Sistema de caché para resultados parciales de agentes Boost. Evita re-ejecutar agentes cuando el mismo input ya fue procesado, ahorrando tiempo y recursos.
|
|
18
|
+
|
|
19
|
+
## Criterios de Aceptación
|
|
20
|
+
|
|
21
|
+
### CA-1: Caché por clave/valor
|
|
22
|
+
- [ ] `cache.get(key)` → obtiene valor cacheado
|
|
23
|
+
- [ ] `cache.set(key, value, ttl)` → guarda valor con TTL
|
|
24
|
+
- [ ] `cache.has(key)` → verifica si existe y no ha expirado
|
|
25
|
+
- [ ] `cache.delete(key)` → elimina entrada
|
|
26
|
+
- [ ] `cache.clear()` → limpia toda la caché
|
|
27
|
+
|
|
28
|
+
### CA-2: Claves de caché predefinidas
|
|
29
|
+
| Clave | TTL | Beneficio |
|
|
30
|
+
|-------|-----|-----------|
|
|
31
|
+
| `compress:{task.kind}` | 1 hora | No re-comprimir contexto |
|
|
32
|
+
| `fewshot:{kind}:{domain}` | 1 día | No re-buscar ejemplos |
|
|
33
|
+
| `agent:{role}:{input_hash}` | 5 min | No re-ejecutar mismo input |
|
|
34
|
+
| `dag:{task_hash}` | 5 min | No re-planificar tarea igual |
|
|
35
|
+
|
|
36
|
+
### CA-3: Persistencia
|
|
37
|
+
- [ ] Caché en disco: `.opencode/boost/cache/`
|
|
38
|
+
- [ ] Limpieza automática al expirar TTL
|
|
39
|
+
- [ ] `opl boost cache clear` → comando para limpiar manualmente
|
|
40
|
+
|
|
41
|
+
### CA-4: Tests
|
|
42
|
+
- [ ] Test de set/get/delete/clear
|
|
43
|
+
- [ ] Test de expiración por TTL
|
|
44
|
+
- [ ] Test de persistencia en disco
|
|
45
|
+
|
|
46
|
+
## Archivos a crear
|
|
47
|
+
|
|
48
|
+
| Archivo | Acción |
|
|
49
|
+
|---------|--------|
|
|
50
|
+
| `src/boost/cache.js` | ➕ Crear |
|
|
51
|
+
|
|
52
|
+
## Notas técnicas
|
|
53
|
+
|
|
54
|
+
- Implementación simple: archivos JSON en `.opencode/boost/cache/`
|
|
55
|
+
- Hash de input: `crypto.createHash('md5').update(input).digest('hex')`
|
|
56
|
+
- No necesita dependencias externas
|