openprompt-lang 1.3.0 → 1.5.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/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/package.json +3 -2
- 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 +502 -0
- package/src/cli/commands-boost.js +394 -0
- package/src/commands/validate.js +54 -12
- 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
- package/src/utils/annotations.js +18 -6
package/bin/cli.js
CHANGED
|
@@ -21,6 +21,7 @@ import { register as registerOpl } from "../src/cli/commands-opl.js"
|
|
|
21
21
|
import { register as registerMisc } from "../src/cli/commands-misc.js"
|
|
22
22
|
import { register as registerWorkflow } from "../src/cli/commands-workflow.js"
|
|
23
23
|
import { register as registerTeach } from "../src/cli/commands-teach.js"
|
|
24
|
+
import { register as registerBoost } from "../src/cli/commands-boost.js"
|
|
24
25
|
|
|
25
26
|
import { handleUncaughtErrors, EXIT_CODES } from "../src/utils/errors.js"
|
|
26
27
|
|
|
@@ -67,6 +68,7 @@ registerLearning(program)
|
|
|
67
68
|
registerMisc(program)
|
|
68
69
|
registerWorkflow(program)
|
|
69
70
|
registerTeach(program)
|
|
71
|
+
registerBoost(program)
|
|
70
72
|
|
|
71
73
|
try {
|
|
72
74
|
await program.parseAsync(process.argv)
|
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
# OPL Boost — Arquitectura Multi-Agente (MoA)
|
|
2
|
+
|
|
3
|
+
> **Documento de diseño** — Versión borrador para discusión
|
|
4
|
+
> Última actualización: 2026-05-26
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. Concepto Central
|
|
9
|
+
|
|
10
|
+
**Modelos pequeños colaborando pueden superar a uno grande.** Es el principio de **Mixture of Agents (MoA)** validado por Together AI (2024): tres modelos de 7B especializados y coordinados pueden igualar o superar a GPT-4 en tareas específicas de generación de código.
|
|
11
|
+
|
|
12
|
+
La clave está en que **cada modelo solo necesita resolver la parte del problema que cabe en su ventana de contexto**.
|
|
13
|
+
|
|
14
|
+
### Analogía: Fábrica de código
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
[ Modelo Grande ] → Un artesano que lo hace todo, pero caro y escaso
|
|
18
|
+
[ Boost Multi-Agente ] → Una línea de ensamblaje con 5 operarios baratos, cada uno especializado
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
| Aspecto | Modelo grande único | Boost Multi-Agente |
|
|
22
|
+
|---------|-------------------|-------------------|
|
|
23
|
+
| RAM requerida | ~20-40 GB | ~4-12 GB |
|
|
24
|
+
| Velocidad | Secuencial, un paso a la vez | Paralelo, varios pasos simultáneos |
|
|
25
|
+
| Costo operativo | Alto (GPU grande) | Bajo (varias GPUs chicas o una sola con cola) |
|
|
26
|
+
| Especialización | Generalista | Agentes especializados por rol |
|
|
27
|
+
| Respaldo científico | — | MoA (Together AI, 2024) |
|
|
28
|
+
| Degradación | Si falla, todo falla | Si un agente falla, se reasigna |
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. Arquitectura
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
┌─────────────────────────────────────────────────────────────────────┐
|
|
36
|
+
│ Boost Orchestrator │
|
|
37
|
+
│ (src/boost/index.js + orchestrator.js) │
|
|
38
|
+
│ │
|
|
39
|
+
│ 1. Recibe tarea → "crea hook useAuth" │
|
|
40
|
+
│ 2. Descompone en DAG de pasos │
|
|
41
|
+
│ 3. Asigna agentes según dependencias │
|
|
42
|
+
│ 4. Ejecuta en paralelo o secuencial según DAG │
|
|
43
|
+
│ 5. Recolecta resultados parciales │
|
|
44
|
+
│ 6. Ensambla resultado final │
|
|
45
|
+
│ 7. Pasa por validation loop │
|
|
46
|
+
└──────┬────────────────────────────────────┬──────────────────────────┘
|
|
47
|
+
│ │
|
|
48
|
+
│ Fase 1: Paralela │ Fase 2: Secuencial
|
|
49
|
+
│ (tareas independientes) │ (tareas con dependencias)
|
|
50
|
+
▼ ▼
|
|
51
|
+
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
|
52
|
+
│ Agent A │ │ Agent B │ │ Agent D │
|
|
53
|
+
│ Tipos │ │ Estado │ │ Lógica │
|
|
54
|
+
│ "Define │ │ "Diseña el │ │ "Implementa │
|
|
55
|
+
│ interfaces"│ │ estado y │ │ la función"│
|
|
56
|
+
└──────┬──────┘ │ efectos" │ └──────┬──────┘
|
|
57
|
+
│ └──────┬──────┘ │
|
|
58
|
+
│ │ │
|
|
59
|
+
└────────┬───────┘ │
|
|
60
|
+
│ │
|
|
61
|
+
▼ ▼
|
|
62
|
+
┌──────────────┐ ┌──────────────┐
|
|
63
|
+
│ Agent C │ │ Agent E │
|
|
64
|
+
│ Props/Contract│ │ Validación │
|
|
65
|
+
│ (paralelo a │ │ (último paso)│
|
|
66
|
+
│ A y B) │ │ │
|
|
67
|
+
└──────────────┘ └──────────────┘
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 2.1 Componentes del Sistema
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
src/boost/
|
|
74
|
+
├── index.js → Punto de entrada (orquestador general)
|
|
75
|
+
├── orchestrator.js → Motor de planificación + scheduling de agentes
|
|
76
|
+
├── agent-pool.js → Pool de agentes: gestión, cola, paralelismo
|
|
77
|
+
├── task-dispatcher.js → Descompone tarea en DAG + asigna
|
|
78
|
+
├── agents/ → Agentes especializados
|
|
79
|
+
│ ├── agent-types.js → Prompt + validator por rol
|
|
80
|
+
│ ├── agent-types.js → Define interfaces de tipos/tipado
|
|
81
|
+
│ ├── agent-state.js → Diseña estado y efectos
|
|
82
|
+
│ ├── agent-logic.js → Implementa lógica de negocio
|
|
83
|
+
│ ├── agent-validate.js → Corre validación + retroalimentación
|
|
84
|
+
│ └── agent-cleaner.js → Comprime/pule contexto (AI Cleaner)
|
|
85
|
+
├── context-cache/ → Contexto limpio cacheado por tipo de tarea
|
|
86
|
+
├── profile-registry.js → ✅ Ya existe (Ticket 1)
|
|
87
|
+
├── context-compressor.js → Capa 1: determinística (Ticket 2)
|
|
88
|
+
├── hydrator.js → Hidratación de skeletons (Ticket 3)
|
|
89
|
+
├── fewshot-retriever.js → Búsqueda de ejemplos (Ticket 4)
|
|
90
|
+
└── validation-loop.js → Feedback loop post-generación (Ticket 6)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 2.2 Pool de Agentes vs Instancias de Modelo
|
|
94
|
+
|
|
95
|
+
El pool de agentes es **lógico**, no necesariamente físico:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
┌──────────────────────────────────┐
|
|
99
|
+
│ Agent Pool │
|
|
100
|
+
│ (gestiona tareas vs instancias) │
|
|
101
|
+
│ │
|
|
102
|
+
│ ┌──────────┐ ┌──────────┐ │
|
|
103
|
+
│ │ Agent A │ │ Agent B │ │ ← Agentes lógicos (roles)
|
|
104
|
+
│ │ (Tipos) │ │ (Estado) │ │
|
|
105
|
+
│ └────┬─────┘ └────┬─────┘ │
|
|
106
|
+
│ │ │ │
|
|
107
|
+
│ ▼ ▼ │
|
|
108
|
+
│ ┌──────────────────────────┐ │
|
|
109
|
+
│ │ Instancia de modelo │ │ ← Física (Ollama, API)
|
|
110
|
+
│ │ deepseek-coder-7b │ │ Se reusa entre agentes
|
|
111
|
+
│ └──────────────────────────┘ │
|
|
112
|
+
└──────────────────────────────────┘
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Un solo modelo físico puede servir múltiples agentes lógicos en serie (no en paralelo real si no hay GPU suficiente):
|
|
116
|
+
|
|
117
|
+
- **Modo paralelo real**: varias instancias del modelo en GPUs diferentes (o misma con batching)
|
|
118
|
+
- **Modo cola**: una sola instancia atiende agentes en secuencia, como si fuera un solo núcleo compartido
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## 3. Agentes Especializados
|
|
123
|
+
|
|
124
|
+
Cada agente tiene:
|
|
125
|
+
|
|
126
|
+
| Rol | Nombre | Input | Output | Prompt característico |
|
|
127
|
+
|-----|--------|-------|--------|----------------------|
|
|
128
|
+
| **Tipos** | `agent-types` | Descripción de la tarea | Interfaces, types, DTOs | _"Define solo los tipos. Sin implementación."_ |
|
|
129
|
+
| **Estado** | `agent-state` | Descripción de la tarea + tipos | Estado, hooks, efectos | _"Diseña el estado y efectos. Sin JSX."_ |
|
|
130
|
+
| **Contrato** | `agent-contract` | Descripción de la tarea + tipos | Props, anotaciones @contract | _"Define el contrato del componente."_ |
|
|
131
|
+
| **Lógica** | `agent-logic` | tipos + estado + contrato | Lógica de negocio completa | _"Implementa la función usando tipos y estado ya definidos."_ |
|
|
132
|
+
| **Validación** | `agent-validate` | Código completo | Versión corregida o reporte | _"Este código falló en X línea. Corrígelo."_ |
|
|
133
|
+
| **Cleaner** | `agent-cleaner` | Contexto completo | Contexto comprimido minimal | _"Comprime este contexto a solo lo esencial para generar un hook."_ |
|
|
134
|
+
|
|
135
|
+
**Cada prompt es 3-5 líneas máximo.** Un modelo de 8K procesa esto sin saturarse.
|
|
136
|
+
|
|
137
|
+
### 3.1 Prompt de ejemplo para Agent-Cleaner
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
Eres un compresor de contexto para un asistente de código.
|
|
141
|
+
Recibe estas reglas y devuélvelas en su forma más compacta.
|
|
142
|
+
|
|
143
|
+
Reglas críticas a preservar:
|
|
144
|
+
- @kind limits (hook:80, component:120, page:200)
|
|
145
|
+
- @limit NO es sugerencia, bloquea commit
|
|
146
|
+
- @use() obligatorio al inicio
|
|
147
|
+
- Named exports sobre default exports
|
|
148
|
+
- NUNCA: any types, modificar *.template.*, eliminar @use
|
|
149
|
+
|
|
150
|
+
Tarea actual: generar un hook useDebounce
|
|
151
|
+
Contexto a comprimir:
|
|
152
|
+
[CONTEXTO AQUÍ]
|
|
153
|
+
|
|
154
|
+
Output: solo las reglas relevantes para hooks, en formato minimal.
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 4. Modos de Ejecución
|
|
160
|
+
|
|
161
|
+
### 4.1 Modo Paralelo (múltiples GPUs/instancias)
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
Tiempo: 0s ─────────────────────────────────────►
|
|
165
|
+
|
|
166
|
+
Agent A (Tipos): ████████░░░░░░░░░░░░░░░░░░░░ 2s
|
|
167
|
+
Agent B (Estado): ██████████░░░░░░░░░░░░░░░░░░ 2.5s
|
|
168
|
+
Agent C (Contrato): ██████░░░░░░░░░░░░░░░░░░░░░░ 1.5s
|
|
169
|
+
│ paralelo
|
|
170
|
+
▼
|
|
171
|
+
Agent D (Lógica): ░░░░░░░░░░░████████░░░░░░░░░░ 2s
|
|
172
|
+
│ secuencial
|
|
173
|
+
▼
|
|
174
|
+
Agent E (Validar): ░░░░░░░░░░░░░░░░░░████████░░ 2s
|
|
175
|
+
|
|
176
|
+
Total: ~6.5s (vs ~10s secuencial, vs ~8s un modelo grande)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 4.2 Modo Cola (una sola instancia de modelo)
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
Agent A → B → C → (paralelo lógico) → D → E
|
|
183
|
+
|
|
184
|
+
Tiempo: ~10s pero con ~4GB RAM en lugar de ~24GB
|
|
185
|
+
Vs un modelo grande: 8s pero necesita 24GB de RAM
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 4.3 Comparación de costos
|
|
189
|
+
|
|
190
|
+
| Config | RAM | VRAM | Tiempo | Tokens/s | Puede correr en |
|
|
191
|
+
|--------|-----|------|--------|----------|-----------------|
|
|
192
|
+
| 1× Qwen 32B | 24 GB | 20 GB | 8s | ~15 tok/s | RTX 4090, Mac M2 Ultra |
|
|
193
|
+
| 3× DeepSeek 7B (cola) | 12 GB | 8 GB | 10s | ~25 tok/s (compartido) | RTX 3060, Mac M1 Pro |
|
|
194
|
+
| 3× DeepSeek 7B (paralelo) | 12 GB | 24 GB | 6s | ~75 tok/s (3 instancias) | RTX 4090, 2× RTX 3060 |
|
|
195
|
+
| 5× DeepSeek 7B (cola, con cache) | 8 GB | 4 GB | 12s | ~35 tok/s (cuantizado) | Laptop con GPU modesta |
|
|
196
|
+
|
|
197
|
+
La conclusión: **3 modelos chicos en cola en una RTX 3060 dan resultados competitivos vs un modelo grande en RTX 4090**, con un costo de hardware 3-4× menor.
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## 5. DAG de Tareas (Task Dispatcher)
|
|
202
|
+
|
|
203
|
+
El dispatcher convierte una descripción tipo _"crea hook useAuth"_ en un grafo dirigido:
|
|
204
|
+
|
|
205
|
+
```json
|
|
206
|
+
{
|
|
207
|
+
"task": "crea hook useAuth con Supabase y Zustand",
|
|
208
|
+
"kind": "hook",
|
|
209
|
+
"dag": {
|
|
210
|
+
"nodes": [
|
|
211
|
+
{ "id": "types", "agent": "agent-types", "deps": [] },
|
|
212
|
+
{ "id": "state", "agent": "agent-state", "deps": [] },
|
|
213
|
+
{ "id": "effects", "agent": "agent-logic", "deps": ["types", "state"] },
|
|
214
|
+
{ "id": "final", "agent": "agent-validate", "deps": ["effects"] }
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Reglas del DAG:
|
|
221
|
+
- **Nodos sin dependencias** → se ejecutan en paralelo
|
|
222
|
+
- **Nodos con dependencias** → esperan a que sus predecesores terminen
|
|
223
|
+
- **Si un nodo falla** → se reintenta (según perfil) o se reasigna a otro agente
|
|
224
|
+
- **El DAG es serializable** → se puede cachear y re-ejecutar
|
|
225
|
+
|
|
226
|
+
El DAG se puede representar como Mermaid para visualización:
|
|
227
|
+
|
|
228
|
+
```mermaid
|
|
229
|
+
graph TD
|
|
230
|
+
Task["hook useAuth"] --> Types[Agent: Tipos]
|
|
231
|
+
Task --> State[Agent: Estado]
|
|
232
|
+
Types --> Logic[Agent: Lógica]
|
|
233
|
+
State --> Logic
|
|
234
|
+
Logic --> Validate[Agent: Validación]
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 6. Integración con el Pipeline Existente
|
|
240
|
+
|
|
241
|
+
Boost no reemplaza el flujo actual de OPL — lo envuelve:
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
Flujo normal OPL:
|
|
245
|
+
workflow select → ticket → plan → implement → validate → close
|
|
246
|
+
|
|
247
|
+
Con Boost Multi-Agente:
|
|
248
|
+
boost generate "hook useAuth"
|
|
249
|
+
│
|
|
250
|
+
├── 1. Profile Registry → detecta small (activa Boost)
|
|
251
|
+
├── 2. Context Compressor → reduce AGENTS.md
|
|
252
|
+
├── 3. FewShot Retriever → busca ejemplos
|
|
253
|
+
├── 4. Task Dispatcher → DAG de agentes
|
|
254
|
+
├── 5. Agent Pool → ejecuta DAG (paralelo/cola)
|
|
255
|
+
├── 6. Hydrator → ensambla código final con anotaciones
|
|
256
|
+
├── 7. Validation Loop → corrige errores
|
|
257
|
+
└── 8. Output → archivo listo para validar
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
El `opl boost generate` se convierte en el **punto de entrada único** que dispara todo el pipeline multi-agente. Funciona igual para MCP vía `OPL_Boost_microtask`.
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## 7. Modelo de Datos
|
|
265
|
+
|
|
266
|
+
### Profile → define capacidades
|
|
267
|
+
```json
|
|
268
|
+
{
|
|
269
|
+
"name": "small",
|
|
270
|
+
"agentPool": {
|
|
271
|
+
"mode": "queue", // "parallel" | "queue"
|
|
272
|
+
"maxConcurrency": 3, // paralelo máximo
|
|
273
|
+
"modelName": "deepseek-coder-7b",
|
|
274
|
+
"modelProvider": "ollama",
|
|
275
|
+
"modelEndpoint": "http://localhost:11434",
|
|
276
|
+
"contextWindow": 8000,
|
|
277
|
+
"temperature": 0.2,
|
|
278
|
+
"cacheEnabled": true
|
|
279
|
+
},
|
|
280
|
+
"features": {
|
|
281
|
+
"compress": true,
|
|
282
|
+
"fewShot": true,
|
|
283
|
+
"agents": true,
|
|
284
|
+
"hydration": true,
|
|
285
|
+
"validation": true
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### Agent → define un worker
|
|
291
|
+
```json
|
|
292
|
+
{
|
|
293
|
+
"id": "agent-types",
|
|
294
|
+
"role": "types",
|
|
295
|
+
"modelName": "deepseek-coder-7b",
|
|
296
|
+
"systemPrompt": "Define solo tipos e interfaces. Sin implementación.",
|
|
297
|
+
"inputSchema": { "description": "string" },
|
|
298
|
+
"outputSchema": { "types": "string", "interfaces": "string" },
|
|
299
|
+
"timeoutMs": 30000,
|
|
300
|
+
"retries": 2,
|
|
301
|
+
"cacheTtl": 3600
|
|
302
|
+
}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### Task → instancia de trabajo
|
|
306
|
+
```json
|
|
307
|
+
{
|
|
308
|
+
"id": "task_001",
|
|
309
|
+
"description": "crea hook useAuth con Supabase",
|
|
310
|
+
"kind": "hook",
|
|
311
|
+
"dag": { "nodes": [...] },
|
|
312
|
+
"profile": "small",
|
|
313
|
+
"status": "running",
|
|
314
|
+
"startedAt": "2026-05-26T14:00:00Z",
|
|
315
|
+
"agents": {
|
|
316
|
+
"agent-types": { "status": "completed", "output": "..." },
|
|
317
|
+
"agent-state": { "status": "running", "output": null },
|
|
318
|
+
"agent-logic": { "status": "pending", "output": null },
|
|
319
|
+
"agent-validate":{ "status": "pending", "output": null }
|
|
320
|
+
},
|
|
321
|
+
"metadata": {
|
|
322
|
+
"totalTime": 0,
|
|
323
|
+
"tokenCount": 0,
|
|
324
|
+
"retries": 0
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 8. Cache Inteligente
|
|
332
|
+
|
|
333
|
+
Resultados de agentes se cachean para reúso:
|
|
334
|
+
|
|
335
|
+
| Clave de caché | Se cachea | TTL | Beneficio |
|
|
336
|
+
|---------------|-----------|-----|-----------|
|
|
337
|
+
| `compress:{task.kind}` | Contexto comprimido | 1 hora | No re-comprimir por cada generate |
|
|
338
|
+
| `fewshot:{kind}:{domain}` | Ejemplos encontrados | 1 día | No re-buscar en knowledge-repo |
|
|
339
|
+
| `agent:{role}:{input_hash}` | Output del agente | 5 min | No re-ejecutar idéntico input |
|
|
340
|
+
| `dag:{task_hash}` | Plan de tareas | 5 min | No re-planificar tarea idéntica |
|
|
341
|
+
|
|
342
|
+
La caché vive en `.opencode/boost/cache/` y se limpia automáticamente.
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## 9. Comparación: Plan Original vs Multi-Agente
|
|
347
|
+
|
|
348
|
+
| Aspecto | Plan original (micro-tasking) | Multi-agente |
|
|
349
|
+
|---------|------------------------------|--------------|
|
|
350
|
+
| Modelo subyacente | 1 modelo principal | Múltiples modelos pequeños |
|
|
351
|
+
| Paralelismo | Solo secuencial | Paralelo + secuencial |
|
|
352
|
+
| Especialización | El mismo modelo hace todo | Agentes especializados |
|
|
353
|
+
| Tolerancia a fallos | Si falla, reinicia | Reasigna agente |
|
|
354
|
+
| Cache | No | Sí, por agente |
|
|
355
|
+
| Costo hardware | GPU grande (24GB+) | GPU modesta (8-12GB) |
|
|
356
|
+
| DAG | Lineal | Grafo dirigido con dependencias |
|
|
357
|
+
| AI Cleaner | No | Sí (agente dedicado) |
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## 10. Tickets Actualizados (versión Multi-Agente)
|
|
362
|
+
|
|
363
|
+
| ID | Título | Depende de |
|
|
364
|
+
|----|--------|------------|
|
|
365
|
+
| BOOST-001 | ✅ Profile Registry + Config Base | — |
|
|
366
|
+
| BOOST-002 | Context Compressor (Capa 1 + AI Cleaner) | BOOST-001 |
|
|
367
|
+
| BOOST-003 | Template Hydration System | BOOST-001 |
|
|
368
|
+
| BOOST-004 | Few-Shot Engine | BOOST-001 |
|
|
369
|
+
| BOOST-005 | Agent Pool + Task Dispatcher | BOOST-001 |
|
|
370
|
+
| BOOST-006 | Agentes Especializados (types, state, logic) | BOOST-005 |
|
|
371
|
+
| BOOST-007 | Validation Loop + Agent Validate | BOOST-006 |
|
|
372
|
+
| BOOST-008 | Orchestrator (index.js + progressive pipeline) | BOOST-007 |
|
|
373
|
+
| BOOST-009 | Cache System | BOOST-008 |
|
|
374
|
+
| BOOST-010 | CLI + MCP Integration | BOOST-009 |
|
|
375
|
+
| BOOST-011 | Auto-aprendizaje: feedback entre sesiones | BOOST-010 |
|
|
376
|
+
|
|
377
|
+
---
|
|
378
|
+
|
|
379
|
+
## 11. Preguntas Abiertas para Discutir
|
|
380
|
+
|
|
381
|
+
1. **¿Paralelismo real o cola?** — ¿Vale la pena tener múltiples instancias del modelo, o basta una en cola (más lento pero menos RAM)?
|
|
382
|
+
|
|
383
|
+
2. **¿Cuántos agentes simultáneos?** — 3 en paralelo? 5? ¿El usuario configura?
|
|
384
|
+
|
|
385
|
+
3. **¿Soporte para diferentes providers?** — Solo Ollama? ¿O también OpenAI API, Anthropic? Podríamos mezclar: un agente barato (local) + otro caro (API) solo para validación.
|
|
386
|
+
|
|
387
|
+
4. **¿Cache por sesión o persistente?** — TTL de 1 hora parece razonable, pero ¿el usuario puede limpiar manualmente?
|
|
388
|
+
|
|
389
|
+
5. **¿Cuándo activar Boost automáticamente?** — ¿Solo cuando el perfil es "small"? ¿O también como opción voluntaria en "medium"?
|
|
390
|
+
|
|
391
|
+
6. **¿El AI Cleaner debe ser obligatorio?** — ¿O el usuario decide si quiere usar un modelo para comprimir contexto (más preciso) o la capa determinística (más rápido)?
|
|
392
|
+
|
|
393
|
+
7. **¿Cómo exponer el DAG al usuario?** — Un `opl boost microtask --dag` que muestre el grafo antes de ejecutar, para que el usuario entienda qué va a pasar.
|
|
394
|
+
|
|
395
|
+
---
|
|
396
|
+
|
|
397
|
+
## 12. Recursos Relacionados
|
|
398
|
+
|
|
399
|
+
- **Paper**: Mixture-of-Agents Enhances Large Language Model Capabilities (Together AI, 2024)
|
|
400
|
+
- **Tecnología base**: Ollama (`ollama run deepseek-coder-7b`)
|
|
401
|
+
- **Proyecto OPL existente**: `src/boost/` (en construcción), `src/cli/commands-boost.js`
|
|
402
|
+
- **Tickets activos**: `docs/04-TICKETS/INDEX.md`
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
*Este documento es un diseño vivo. Se actualiza a medida que evoluciona el módulo Boost.*
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# AGENTS.template.md — Plantilla Universal para Proyectos
|
|
2
|
+
|
|
3
|
+
> **Versión:** 1.0
|
|
4
|
+
> **Uso:** La IA debe ejecutar el Protocolo de Inicialización al detectar un proyecto sin AGENTS.md o con AGENTS.md incompleto.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Protocolo de Inicialización — EJECUTAR AUTOMÁTICAMENTE
|
|
9
|
+
|
|
10
|
+
Cuando la IA detecte un proyecto NUEVO o un proyecto EXISTENTE sin AGENTS.md completo, DEBE ejecutar los siguientes pasos EN ORDEN:
|
|
11
|
+
|
|
12
|
+
### Paso 1: Detectar el stack del proyecto
|
|
13
|
+
```
|
|
14
|
+
Leer package.json:
|
|
15
|
+
- Buscar en dependencies/devDependencies: react, vue, angular, next, svelte, etc.
|
|
16
|
+
- Buscar runtime: node, deno, bun
|
|
17
|
+
- Buscar DB: supabase, firebase, prisma, mongoose, etc.
|
|
18
|
+
- Buscar CSS: tailwind, styled-components, emotion, etc.
|
|
19
|
+
- Buscar lenguaje: typescript (tsconfig.json), javascript
|
|
20
|
+
- Buscar plataforma: ionic, capacitor, tauri, electron, etc.
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Paso 2: Inicializar openPrompt-Lang
|
|
24
|
+
```
|
|
25
|
+
ejecutar: opl init → Crea prompt-lang.json y estructura base docs/
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Paso 3: Generar AGENTS.md con el stack detectado
|
|
29
|
+
```
|
|
30
|
+
Copiar ESTE archivo como AGENTS.md en la raíz del proyecto.
|
|
31
|
+
Reemplazar "## Stack" con las tecnologías detectadas.
|
|
32
|
+
Reemplazar "## Perfil" según nivel (senior por defecto).
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Paso 4: Detectar archivos fuente sin anotaciones
|
|
36
|
+
```
|
|
37
|
+
ejecutar: npx openprompt-lang validate
|
|
38
|
+
Archivos que DEBEN tener @use: service, hook, page, context, component
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Paso 5: Verificar cobertura
|
|
42
|
+
```
|
|
43
|
+
Calcular: (archivos con @use / archivos que deben tener @use) * 100
|
|
44
|
+
Si cobertura < 80% → seguir agregando anotaciones
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Paso 6: Verificar estado del proyecto
|
|
48
|
+
```
|
|
49
|
+
ejecutar: npx tsc --noEmit → 0 errores
|
|
50
|
+
ejecutar: npx openprompt-lang validate → 0 errores
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Stack
|
|
56
|
+
<!-- COMPLETAR con tecnologías del proyecto -->
|
|
57
|
+
- react
|
|
58
|
+
- tailwind
|
|
59
|
+
- typescript
|
|
60
|
+
|
|
61
|
+
## Convenciones
|
|
62
|
+
- Anotaciones OPL con @kind, @contract, @limit
|
|
63
|
+
- NO usar any
|
|
64
|
+
- NO superar límites de líneas sin refactorizar
|
|
65
|
+
- TODO list para tareas >3 pasos
|
|
66
|
+
|
|
67
|
+
## Enforcement — REGLAS QUE SE CUMPLEN O SE BLOQUEA
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
PRE-COMMIT HOOK ACTIVO:
|
|
71
|
+
npx openprompt-lang validate --strict + tsc --noEmit
|
|
72
|
+
Bloquea commits si hay violaciones @limit
|
|
73
|
+
|
|
74
|
+
REGLA FUNDAMENTAL:
|
|
75
|
+
@limit(lines: N) NO es una sugerencia — es un LÍMITE que bloquea el commit.
|
|
76
|
+
Si un archivo supera su @limit, refactorizar ANTES de committear.
|
|
77
|
+
|
|
78
|
+
LECCIÓN APRENDIDA (RULES-001):
|
|
79
|
+
Las reglas sin enforcement son aspiraciones.
|
|
80
|
+
Las reglas CON enforcement son restricciones. Este proyecto usa enforcement.
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Perfil
|
|
84
|
+
<!-- COMPLETAR: senior, mid, junior -->
|
|
85
|
+
senior
|
|
86
|
+
|
|
87
|
+
## Referencias
|
|
88
|
+
- Framework: openPrompt-Lang
|
|
89
|
+
- Tickets OPL: `opl ticket list`
|
|
@@ -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
|