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,67 @@
|
|
|
1
|
+
# BOOST-005 — Micro-Tasking Engine
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-005 |
|
|
8
|
+
| **Título** | Micro-Tasking Engine |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | 🔴 Pendiente |
|
|
12
|
+
| **Depende de** | BOOST-003, BOOST-004 |
|
|
13
|
+
| **Archivos** | `src/boost/micro-tasker.js` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Motor que descompone tareas complejas de generación de código en micro-tareas secuenciales. Cada micro-tarea es una instrucción simple que un modelo pequeño puede seguir sin saturarse. El orquestador ejecuta las micro-tareas en cadena y el ensamblador une los resultados parciales en el archivo final.
|
|
18
|
+
|
|
19
|
+
## Criterios de Aceptación
|
|
20
|
+
|
|
21
|
+
### CA-1: Planificador de micro-tareas
|
|
22
|
+
- [ ] `plan(task, kind)` → devuelve array de micro-tareas con: id, instrucción, formato esperado, validator
|
|
23
|
+
- [ ] Para un hook: ["Define tipos/interface", "Define estado y efectos", "Implementa lógica", "Exporta"]
|
|
24
|
+
- [ ] Para un componente: ["Define props", "Define variantes cva", "Implementa JSX", "Exporta"]
|
|
25
|
+
- [ ] Para un page: ["Define imports y tipos", "Implementa layout", "Conecta datos", "Exporta"]
|
|
26
|
+
|
|
27
|
+
### CA-2: Orquestador secuencial
|
|
28
|
+
- [ ] `execute(task, kind, profile)` → ejecuta micro-tareas una por una
|
|
29
|
+
- [ ] Cada micro-tarea se ejecuta con contexto mínimo (solo instrucción actual + resultado anterior)
|
|
30
|
+
- [ ] Hay un shared state entre micro-tareas para mantener coherencia
|
|
31
|
+
- [ ] Si una micro-tarea falla, el orquestador puede reintentarla (según perfil)
|
|
32
|
+
|
|
33
|
+
### CA-3: Ensamblador
|
|
34
|
+
- [ ] `assemble(partialResults, kind)` → combina resultados parciales en archivo final
|
|
35
|
+
- [ ] Usa el hydrator (BOOST-003) para generar el código final con anotaciones
|
|
36
|
+
- [ ] Si hay conflictos entre resultados parciales, resuelve con heurísticas (último valor gana)
|
|
37
|
+
|
|
38
|
+
### CA-4: CLI microtask
|
|
39
|
+
- [ ] `opl boost microtask "crea hook useAuth"` → muestra el plan de micro-tareas sin ejecutar
|
|
40
|
+
- [ ] `opl boost microtask "crea hook useAuth" --execute` → ejecuta el plan
|
|
41
|
+
- [ ] Opción `--verbose` muestra cada paso y su resultado
|
|
42
|
+
- [ ] Opción `--plan-only` solo muestra el plan (alias de sin flag)
|
|
43
|
+
|
|
44
|
+
### CA-5: Integración con generate
|
|
45
|
+
- [ ] Cuando `opl boost generate` se ejecuta con perfil small, usa micro-tasking automáticamente
|
|
46
|
+
- [ ] Cuando el perfil es medium, decide según complejidad de la tarea
|
|
47
|
+
- [ ] Cuando el perfil es large, no usa micro-tasking
|
|
48
|
+
|
|
49
|
+
### CA-6: Tests
|
|
50
|
+
- [ ] Test de planificación para cada @kind que soporta
|
|
51
|
+
- [ ] Test de orquestación con respuestas mock
|
|
52
|
+
- [ ] Test de ensamblado con resultados parciales
|
|
53
|
+
- [ ] Test de fallo de micro-tarea y reintento
|
|
54
|
+
|
|
55
|
+
## Archivos a crear/modificar
|
|
56
|
+
|
|
57
|
+
| Archivo | Acción |
|
|
58
|
+
|---------|--------|
|
|
59
|
+
| `src/boost/micro-tasker.js` | ➕ Crear |
|
|
60
|
+
|
|
61
|
+
## Notas técnicas
|
|
62
|
+
|
|
63
|
+
- El orquestador es el componente más complejo del módulo Boost
|
|
64
|
+
- El shared state es un simple objeto JSON que se pasa entre micro-tareas
|
|
65
|
+
- Cada micro-tarea tiene un `validator` opcional que verifica el output antes de pasar a la siguiente
|
|
66
|
+
- Los validators pueden ser: validate OPL, typecheck básico, o función custom
|
|
67
|
+
- El orquestador debe ser extensible para soportar nuevos tipos de micro-tareas
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# BOOST-006 — Validation Feedback Loop
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-006 |
|
|
8
|
+
| **Título** | Validation Feedback Loop |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | 🔴 Pendiente |
|
|
12
|
+
| **Depende de** | BOOST-005 |
|
|
13
|
+
| **Archivos** | `src/boost/validation-loop.js` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Sistema post-generación que corre validación OPL y TypeScript sobre el código generado, y retroalimenta los errores específicos al modelo 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 de la tarea.
|
|
20
|
+
|
|
21
|
+
## Criterios de Aceptación
|
|
22
|
+
|
|
23
|
+
### CA-1: Validación post-generación
|
|
24
|
+
- [ ] `validate(code, kind)` → ejecuta validación OPL sobre el código generado
|
|
25
|
+
- [ ] Detecta: errores de anotaciones, errores de tipo, errores de sintaxis, violaciones de @limit
|
|
26
|
+
- [ ] Retorna array de errores con: tipo, mensaje, línea, sugerencia de fix
|
|
27
|
+
|
|
28
|
+
### CA-2: Feedback loop
|
|
29
|
+
- [ ] `feedbackLoop(code, errors, profile)` → intenta corregir errores iterativamente
|
|
30
|
+
- [ ] Por cada error, genera un mensaje de feedback claro para el modelo
|
|
31
|
+
- [ ] El feedback dice exactamente qué está mal y da una sugerencia de cómo arreglarlo
|
|
32
|
+
- [ ] El modelo corrige y se re-valida
|
|
33
|
+
- [ ] Número de reintentos según perfil: small=3, medium=2, large=1
|
|
34
|
+
|
|
35
|
+
### CA-3: Escalado de complejidad
|
|
36
|
+
- [ ] Si tras 3 reintentos (small) el código sigue fallando, reduce complejidad
|
|
37
|
+
- [ ] Estrategias de escalado: simplificar lógica, usar skeleton más básico, dividir en más micro-tareas
|
|
38
|
+
- [ ] `escalateDown(task, attempt)` → devuelve versión simplificada de la tarea
|
|
39
|
+
- [ ] El escalado se registra como @learn-error para futuras sesiones
|
|
40
|
+
|
|
41
|
+
### CA-4: Integración con micro-tasker
|
|
42
|
+
- [ ] Cuando una micro-tarea individual falla la validación, se reintenta antes de pasar a la siguiente
|
|
43
|
+
- [ ] Si la micro-tarea falla consistentemente, el orquestador (BOOST-005) decide escalar
|
|
44
|
+
|
|
45
|
+
### CA-5: Reporte de calidad
|
|
46
|
+
- [ ] `generateReport(codeHistory, errors)` → genera reporte de cuántos intentos tomó, qué errores se corrigieron
|
|
47
|
+
- [ ] El reporte se puede incluir en la documentación de la sesión
|
|
48
|
+
|
|
49
|
+
### CA-6: Tests
|
|
50
|
+
- [ ] Test de detección de errores de anotaciones
|
|
51
|
+
- [ ] Test de feedback loop con mock de correcciones
|
|
52
|
+
- [ ] Test de escalado tras N reintentos fallidos
|
|
53
|
+
- [ ] Test de reporte de calidad
|
|
54
|
+
|
|
55
|
+
## Archivos a crear/modificar
|
|
56
|
+
|
|
57
|
+
| Archivo | Acción |
|
|
58
|
+
|---------|--------|
|
|
59
|
+
| `src/boost/validation-loop.js` | ➕ Crear |
|
|
60
|
+
|
|
61
|
+
## Notas técnicas
|
|
62
|
+
|
|
63
|
+
- La validación OPL se hace invocando `npx openprompt-lang validate` o usando el módulo de validación directamente
|
|
64
|
+
- El feedback loop necesita acceso al modelo para re-generar — pero en esta fase inicial, solo prepara los mensajes de feedback (la re-generación la hace quien llame al boost)
|
|
65
|
+
- El escalado de complejidad es determinista (no necesita IA): simplifica basado en reglas
|
|
66
|
+
- Los errores más comunes en modelos pequeños: @kind faltante, @limit excedido, tipos incorrectos
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# BOOST-007 — Progressive Disclosure Pipeline
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-007 |
|
|
8
|
+
| **Título** | Progressive Disclosure Pipeline |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Alta |
|
|
11
|
+
| **Estado** | 🔴 Pendiente |
|
|
12
|
+
| **Depende de** | BOOST-002, BOOST-006 |
|
|
13
|
+
| **Archivos** | `src/boost/progressive-pipeline.js`, `src/boost/index.js` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Pipeline multi-etapa que orquesta todos los componentes Boost en un flujo coherente. Cada etapa expone gradualmente más complejidad al modelo, de modo que nunca ve el problema completo de golpe.
|
|
18
|
+
|
|
19
|
+
El `index.js` es el punto de entrada unificado del módulo Boost.
|
|
20
|
+
|
|
21
|
+
## Criterios de Aceptación
|
|
22
|
+
|
|
23
|
+
### CA-1: Pipeline multi-etapa
|
|
24
|
+
- [ ] **Stage 1 — Diseño**: el modelo define props, tipos, interface, contract sin implementar lógica
|
|
25
|
+
- [ ] **Stage 2 — Implementación**: el modelo rellena el skeleton con lógica de negocio
|
|
26
|
+
- [ ] **Stage 3 — Polish**: el modelo recibe feedback de validación y corrige errores
|
|
27
|
+
- [ ] Cada etapa es más específica que la anterior
|
|
28
|
+
|
|
29
|
+
### CA-2: Orchestrador unificado (index.js)
|
|
30
|
+
- [ ] `boost(task, options)` → orquesta todo el pipeline
|
|
31
|
+
- [ ] `options.profile` → perfil a usar
|
|
32
|
+
- [ ] `options.kind` → tipo de archivo a generar
|
|
33
|
+
- [ ] `options.dryRun` → mostrar plan sin ejecutar
|
|
34
|
+
- [ ] `options.output` → archivo de salida (opcional)
|
|
35
|
+
- [ ] Retorna: `{ code, metadata, report }`
|
|
36
|
+
|
|
37
|
+
### CA-3: Metadata de ejecución
|
|
38
|
+
- [ ] `{ profile, stages: [{name, duration, result}], totalTime, compressionRatio, validationAttempts }`
|
|
39
|
+
- [ ] Permite comparar rendimiento entre perfiles
|
|
40
|
+
- [ ] Se puede exportar como JSON
|
|
41
|
+
|
|
42
|
+
### CA-4: Modo dry-run
|
|
43
|
+
- [ ] `boost(task, { dryRun: true })` → muestra qué haría en cada etapa sin ejecutar
|
|
44
|
+
- [ ] Muestra: plan de micro-tareas, skeletons a usar, ejemplos a inyectar
|
|
45
|
+
|
|
46
|
+
### CA-5: Integración con compress
|
|
47
|
+
- [ ] Antes del Stage 1, comprime el contexto según perfil (usa BOOST-002)
|
|
48
|
+
- [ ] El Stage 1 recibe contexto mínimo
|
|
49
|
+
- [ ] Los Stages 2 y 3 pueden recibir contexto adicional si es necesario
|
|
50
|
+
|
|
51
|
+
### CA-6: Tests
|
|
52
|
+
- [ ] Test de pipeline completo con mock de modelo
|
|
53
|
+
- [ ] Test de metadata de ejecución
|
|
54
|
+
- [ ] Test de dry-run
|
|
55
|
+
- [ ] Test de integración: pipeline completo produce código válido
|
|
56
|
+
|
|
57
|
+
## Archivos a crear/modificar
|
|
58
|
+
|
|
59
|
+
| Archivo | Acción |
|
|
60
|
+
|---------|--------|
|
|
61
|
+
| `src/boost/index.js` | ➕ Crear (orquestador unificado) |
|
|
62
|
+
| `src/boost/progressive-pipeline.js` | ➕ Crear (pipeline multi-etapa) |
|
|
63
|
+
|
|
64
|
+
## Notas técnicas
|
|
65
|
+
|
|
66
|
+
- El index.js es el API público del módulo Boost
|
|
67
|
+
- Cada etapa del pipeline es un plugin: `pipeline.use(stage)` para futura extensibilidad
|
|
68
|
+
- El pipeline registra tiempo de cada etapa para diagnóstico
|
|
69
|
+
- Si una etapa falla, el pipeline detiene la ejecución y devuelve error con estado parcial
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# BOOST-008 — CLI + MCP Integration
|
|
2
|
+
|
|
3
|
+
## Metadatos
|
|
4
|
+
|
|
5
|
+
| Campo | Valor |
|
|
6
|
+
|-------|-------|
|
|
7
|
+
| **ID** | BOOST-008 |
|
|
8
|
+
| **Título** | CLI + MCP Integration |
|
|
9
|
+
| **Épica** | Módulo OPL Boost |
|
|
10
|
+
| **Prioridad** | Media |
|
|
11
|
+
| **Estado** | 🔴 Pendiente |
|
|
12
|
+
| **Depende de** | BOOST-007 |
|
|
13
|
+
| **Archivos** | `src/cli/commands-boost.js`, `src/mcp-server.js`, `src/mcp-refactor/router.js`, `AGENTS.md` |
|
|
14
|
+
|
|
15
|
+
## Descripción
|
|
16
|
+
|
|
17
|
+
Integrar el módulo Boost con la CLI de OPL (comandos `opl boost *`) y con el servidor MCP (tools `OPL_Boost_*`). También actualizar AGENTS.md con la sección Boost Workflow para que las IAs futuras sepan cómo usar el módulo.
|
|
18
|
+
|
|
19
|
+
## Criterios de Aceptación
|
|
20
|
+
|
|
21
|
+
### CA-1: CLI completa
|
|
22
|
+
- [ ] `opl boost check` → diagnóstico del perfil activo
|
|
23
|
+
- [ ] `opl boost profile <name>` → forzar perfil (small/medium/large/auto)
|
|
24
|
+
- [ ] `opl boost generate <desc>` → generar código con pipeline completo
|
|
25
|
+
- [ ] `opl boost microtask <task>` → descomponer tarea en micro-tareas
|
|
26
|
+
- [ ] Todos los comandos tienen `--help` descriptivo
|
|
27
|
+
- [ ] Todos los comandos tienen `--dry-run`
|
|
28
|
+
|
|
29
|
+
### CA-2: MCP tools
|
|
30
|
+
- [ ] `OPL_Boost_profile` → mostrar perfil actual del modelo
|
|
31
|
+
- [ ] `OPL_Boost_compress` → comprimir contexto según perfil
|
|
32
|
+
- [ ] `OPL_Boost_microtask` → ejecutar pipeline de micro-tasking
|
|
33
|
+
- [ ] `OPL_Boost_hydrate` → hidratar un skeleton con lógica
|
|
34
|
+
- [ ] `OPL_Boost_validate` → loop de validación con retroalimentación
|
|
35
|
+
- [ ] Las tools aparecen en el servidor MCP y son invocables
|
|
36
|
+
|
|
37
|
+
### CA-3: AGENTS.md actualizado
|
|
38
|
+
- [ ] Nueva sección "## 🚀 OPL Boost — Potenciar modelos pequeños" en AGENTS.md
|
|
39
|
+
- [ ] Describe: qué es, cuándo usarlo, cómo configurarlo
|
|
40
|
+
- [ ] Tabla de perfiles (small/medium/large)
|
|
41
|
+
- [ ] Workflow Boost para IAs que usan el módulo
|
|
42
|
+
- [ ] Referencia rápida de comandos `opl boost *`
|
|
43
|
+
|
|
44
|
+
### CA-4: Registrar en bin/cli.js
|
|
45
|
+
- [ ] `registerBoost(program)` llamado desde `bin/cli.js`
|
|
46
|
+
- [ ] Import y registro consistente con los otros comandos
|
|
47
|
+
|
|
48
|
+
### CA-5: Registrar en MCP server
|
|
49
|
+
- [ ] Tools de boost agregadas a TOOLS en `src/mcp-refactor/tools.js`
|
|
50
|
+
- [ ] Router en `src/mcp-refactor/router.js` maneja boost tools
|
|
51
|
+
- [ ] Workflow generator en `src/mcp-workflow.js` incluye boost
|
|
52
|
+
|
|
53
|
+
### CA-6: Tests de integración
|
|
54
|
+
- [ ] Test de CLI: `opl boost check` funciona sin errores
|
|
55
|
+
- [ ] Test de MCP: tools registradas correctamente
|
|
56
|
+
- [ ] Test que todos los comandos tienen `--help`
|
|
57
|
+
|
|
58
|
+
## Archivos a crear/modificar
|
|
59
|
+
|
|
60
|
+
| Archivo | Acción |
|
|
61
|
+
|---------|--------|
|
|
62
|
+
| `src/cli/commands-boost.js` | ➕ Crear (registro completo de comandos) |
|
|
63
|
+
| `bin/cli.js` | ✏️ Modificar (import + register) |
|
|
64
|
+
| `src/mcp-server.js` | ✏️ Modificar (boost tools en TOOLS) |
|
|
65
|
+
| `src/mcp-refactor/router.js` | ✏️ Modificar (boost routes) |
|
|
66
|
+
| `src/mcp-workflow.js` | ✏️ Modificar (boost instructions) |
|
|
67
|
+
| `AGENTS.md` | ✏️ Modificar (sección Boost) |
|
|
68
|
+
|
|
69
|
+
## Notas técnicas
|
|
70
|
+
|
|
71
|
+
- Los MCP tools deben seguir el patrón existente en `src/mcp-refactor/tools.js`
|
|
72
|
+
- Los comandos CLI deben seguir el patrón de commander (`.command().description().action()`)
|
|
73
|
+
- La sección de AGENTS.md debe seguir el tono y formato del documento existente
|
|
74
|
+
- No debe romper comandos existentes ni tools MCP existentes
|
package/docs/AI_CONTEXT.md
CHANGED
|
@@ -60,8 +60,24 @@ npx openPrompt-Lang validate # Validar anotaciones
|
|
|
60
60
|
npx openPrompt-Lang lang list # Listar módulos
|
|
61
61
|
npx openPrompt-Lang teach <id> # Aprender de un template
|
|
62
62
|
npx openPrompt-Lang qa-gen # Generar tests de regresión
|
|
63
|
+
|
|
64
|
+
# OPL Boost (multi-agente para modelos pequeños)
|
|
65
|
+
opl boost check # Diagnóstico perfil + estado del sistema
|
|
66
|
+
opl boost profile [name] # Ver/forzar perfil (small/medium/large/auto)
|
|
67
|
+
opl boost setup # Detectar hardware + configurar
|
|
68
|
+
opl boost generate <desc> # Generar código con pipeline Boost
|
|
69
|
+
opl boost microtask <task> # Descomponer tarea en DAG
|
|
70
|
+
opl boost cache [action] # Gestionar caché (stats, clear, clean)
|
|
63
71
|
```
|
|
64
72
|
|
|
73
|
+
## 5.5. Módulo OPL Boost
|
|
74
|
+
- **12 tickets implementados** (BOOST-001 a BOOST-012, todos completados)
|
|
75
|
+
- **Pipeline**: profile detection → context compression → few-shot → agent pool → skeleton hydration → validation loop
|
|
76
|
+
- **Dos modos**: single-pass (default) y multi-agent (`--multi-agent`)
|
|
77
|
+
- **Código**: `src/boost/` (17 archivos, ~3,700 líneas)
|
|
78
|
+
- **MCP tools**: `boost_generate`, `boost_compress`, `boost_profile`, `boost_plan`, `boost_validate`
|
|
79
|
+
- **Filosofía**: cada componente funciona independientemente; el multi-agente es opt-in
|
|
80
|
+
|
|
65
81
|
## 6. Referencia canónica
|
|
66
82
|
- `.openprompt/FRAMEWORK.md` — Manual completo: anotaciones, comandos CLI, MCP, dominios, módulos, reglas estrictas.
|
|
67
83
|
- `AGENTS.md` — Stack, convenciones, UI, calidad.
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
# Sistema de Embeddings Vectoriales
|
|
2
|
+
|
|
3
|
+
## 📋 Overview
|
|
4
|
+
|
|
5
|
+
openPrompt-Lang ahora soporta búsqueda semántica vectorial. En lugar de depender solo de coincidencia de palabras clave (tags, fulltext) o un mapa semántico manual, los documentos se dividen en **chunks semánticos**, cada chunk se convierte en un **vector embedding**, y las consultas se resuelven por **similitud de coseno**.
|
|
6
|
+
|
|
7
|
+
## 🏗️ Arquitectura
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Documento (opl format)
|
|
11
|
+
│
|
|
12
|
+
▼
|
|
13
|
+
┌─────────────────┐
|
|
14
|
+
│ chunker.js │ Divide: paragraph | section | fixed
|
|
15
|
+
└────────┬────────┘
|
|
16
|
+
│ chunks[]
|
|
17
|
+
▼
|
|
18
|
+
┌─────────────────┐
|
|
19
|
+
│ embedder.js │ Vectoriza: Ollama | Transformers.js | auto-fallback
|
|
20
|
+
└────────┬────────┘
|
|
21
|
+
│ vectors[]
|
|
22
|
+
▼
|
|
23
|
+
┌─────────────────────┐
|
|
24
|
+
│ vector-store.js │ Almacena + busca en SQLite
|
|
25
|
+
│ (embeddings table) │
|
|
26
|
+
└────────┬────────────┘
|
|
27
|
+
│ search(queryVector)
|
|
28
|
+
▼
|
|
29
|
+
┌─────────────────┐
|
|
30
|
+
│ index-pipeline │ Orquestador: chunk → embed → store
|
|
31
|
+
└─────────────────┘
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 📦 Módulos
|
|
35
|
+
|
|
36
|
+
| Módulo | Archivo | Responsabilidad |
|
|
37
|
+
|--------|---------|----------------|
|
|
38
|
+
| Chunker | `src/embeddings/chunker.js` | Divide documentos en chunks semánticos |
|
|
39
|
+
| Embedder | `src/embeddings/embedder.js` | Genera vectores numéricos (embeddings) |
|
|
40
|
+
| Vector Store | `src/embeddings/vector-store.js` | Almacena/consulta vectores en SQLite |
|
|
41
|
+
| Index Pipeline | `src/embeddings/index-pipeline.js` | Orquesta chunk → embed → store |
|
|
42
|
+
|
|
43
|
+
## 🔧 Comandos CLI
|
|
44
|
+
|
|
45
|
+
### `opl embeddings index <docId>`
|
|
46
|
+
|
|
47
|
+
Indexa un documento en el vector store.
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
opl embeddings index react-fullstack-app
|
|
51
|
+
opl embeddings index react-fullstack-app --strategy paragraph
|
|
52
|
+
opl embeddings index react-fullstack-app --provider transformers
|
|
53
|
+
opl embeddings index react-fullstack-app --dry-run # simular sin persistir
|
|
54
|
+
opl embeddings index react-fullstack-app --resume # saltar chunks existentes
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### `opl embeddings status`
|
|
58
|
+
|
|
59
|
+
Muestra el estado actual del índice vectorial.
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
opl embeddings status
|
|
63
|
+
# 📊 Estado del índice de embeddings
|
|
64
|
+
# Chunks indexados: 245
|
|
65
|
+
# Documentos: 12
|
|
66
|
+
# Dimensión: 768
|
|
67
|
+
# Modelo: nomic-embed-text
|
|
68
|
+
# Último indexado: 2026-05-24 20:00:00
|
|
69
|
+
# Almacenamiento: 1.2 MB
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### `opl embeddings remove <docId>`
|
|
73
|
+
|
|
74
|
+
Elimina todos los embeddings de un documento.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
opl embeddings remove react-fullstack-app
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### `opl embeddings config`
|
|
81
|
+
|
|
82
|
+
Ver o cambiar el proveedor de embeddings.
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
opl embeddings config # ver estado
|
|
86
|
+
opl embeddings config --provider transformers # cambiar a transformers
|
|
87
|
+
opl embeddings config --provider ollama # cambiar a ollama
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### `opl search --mode vector <query>`
|
|
91
|
+
|
|
92
|
+
Búsqueda semántica con embeddings.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
opl search "autenticacion react" --mode vector # solo vectorial
|
|
96
|
+
opl search "pagos chile" --mode hybrid # híbrido incluye vector
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 🧠 Proveedores de Embeddings
|
|
100
|
+
|
|
101
|
+
### Ollama (primario, default)
|
|
102
|
+
|
|
103
|
+
- **Modelo**: `nomic-embed-text` (768 dimensiones)
|
|
104
|
+
- **URL**: `http://localhost:11434`
|
|
105
|
+
- **Requisito**: `ollama pull nomic-embed-text`
|
|
106
|
+
- **Ventaja**: Local, rápido, gratuito
|
|
107
|
+
|
|
108
|
+
### Transformers.js (fallback)
|
|
109
|
+
|
|
110
|
+
- **Modelo**: `Xenova/all-MiniLM-L6-v2` (384 dimensiones)
|
|
111
|
+
- **Requisito**: `npm install @xenova/transformers`
|
|
112
|
+
- **Ventaja**: No requiere servidor externo
|
|
113
|
+
|
|
114
|
+
### Auto-fallback
|
|
115
|
+
|
|
116
|
+
El embedder intenta Ollama primero. Si no está disponible, cae automáticamente a Transformers.js. Si ningún proveedor funciona, lanza un error instructivo.
|
|
117
|
+
|
|
118
|
+
## 📐 Estrategias de Chunking
|
|
119
|
+
|
|
120
|
+
| Estrategia | Descripción | Cuándo usarla |
|
|
121
|
+
|------------|-------------|---------------|
|
|
122
|
+
| `section` (default) | Divide por `##` respetando títulos | Documentos con estructura clara |
|
|
123
|
+
| `paragraph` | Divide por doble salto de línea | Documentos sin estructura jerárquica |
|
|
124
|
+
| `fixed` | Divide por tamaño fijo con solapamiento | Documentos sin estructura detectada |
|
|
125
|
+
|
|
126
|
+
## 🔍 Búsqueda Híbrida
|
|
127
|
+
|
|
128
|
+
`hybridSearch` combina FTS5 (texto completo) con reordenamiento semántico:
|
|
129
|
+
|
|
130
|
+
1. **FTS5**: Busca palabras clave en el índice de texto completo
|
|
131
|
+
2. **Coseno**: Reordena los candidatos por similitud semántica
|
|
132
|
+
|
|
133
|
+
Esto da lo mejor de ambos mundos: precisión de FTS + semántica de embeddings.
|
|
134
|
+
|
|
135
|
+
## 💾 Esquema SQLite
|
|
136
|
+
|
|
137
|
+
```sql
|
|
138
|
+
CREATE TABLE IF NOT EXISTS embeddings (
|
|
139
|
+
id TEXT PRIMARY KEY,
|
|
140
|
+
doc_id TEXT NOT NULL,
|
|
141
|
+
doc_title TEXT NOT NULL DEFAULT '',
|
|
142
|
+
chapter_idx INTEGER NOT NULL DEFAULT 0,
|
|
143
|
+
chapter_title TEXT NOT NULL DEFAULT '',
|
|
144
|
+
chunk_idx INTEGER NOT NULL DEFAULT 0,
|
|
145
|
+
content TEXT NOT NULL,
|
|
146
|
+
vector BLOB NOT NULL,
|
|
147
|
+
dimension INTEGER NOT NULL DEFAULT 768,
|
|
148
|
+
tokens INTEGER NOT NULL DEFAULT 0,
|
|
149
|
+
model TEXT NOT NULL DEFAULT '',
|
|
150
|
+
strategy TEXT NOT NULL DEFAULT 'section',
|
|
151
|
+
metadata TEXT NOT NULL DEFAULT '{}',
|
|
152
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS embeddings_fts USING fts5(
|
|
156
|
+
content,
|
|
157
|
+
content=embeddings,
|
|
158
|
+
content_rowid=rowid
|
|
159
|
+
);
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Los vectores se serializan como BLOB de Float32Array (4 bytes por float).
|
|
163
|
+
|
|
164
|
+
## 📊 Límites de Escalabilidad
|
|
165
|
+
|
|
166
|
+
| Métrica | Límite actual | Estrategia futura |
|
|
167
|
+
|---------|--------------|-------------------|
|
|
168
|
+
| Chunks totales | ~5000 | Búsqueda lineal OK |
|
|
169
|
+
| Chunks > 100k | Podría ser lento | Índice HNSW |
|
|
170
|
+
| Dimensión vectores | 768 (Ollama) / 384 (Transformers) | Cualquier dimensión |
|
|
171
|
+
| Latencia búsqueda | < 50ms en 5000 chunks | Indexación en lote |
|
|
172
|
+
|
|
173
|
+
## ✅ Tests
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
npx vitest run tests/embeddings/ # 87 tests, 4 suites
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
| Suite | Tests | Cubre |
|
|
180
|
+
|-------|-------|-------|
|
|
181
|
+
| `chunker.test.js` | 20 | Estrategias, límites, edge cases |
|
|
182
|
+
| `embedder.test.js` | 23 | Proveedores, fallback, errores |
|
|
183
|
+
| `vector-store.test.js` | 30 | CRUD, búsqueda, FTS5, híbrida |
|
|
184
|
+
| `index-pipeline.test.js` | 14 | Pipeline completo, reindex, batch |
|
|
185
|
+
|
|
186
|
+
## 🔗 Integración con OPL Search
|
|
187
|
+
|
|
188
|
+
El modo `--mode vector` en `opl search`:
|
|
189
|
+
1. Toma la consulta del usuario
|
|
190
|
+
2. La convierte a vector con `embed()`
|
|
191
|
+
3. Busca en el vector store con `hybridSearch()`
|
|
192
|
+
4. Mapea chunks a documentos y muestra resultados
|
|
193
|
+
|
|
194
|
+
El modo `--mode hybrid` incluye los resultados vectoriales junto con tags, fulltext y semántico.
|
|
195
|
+
|
|
196
|
+
## ⚡ Auto-embedding
|
|
197
|
+
|
|
198
|
+
Cuando se ingesta un PDF con `knowledge ingest`, se genera automáticamente el embedding del documento. Para saltar este paso:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
knowledge ingest mi-documento.pdf --no-embed
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## 🚀 Roadmap
|
|
205
|
+
|
|
206
|
+
- [x] Chunker (3 estrategias)
|
|
207
|
+
- [x] Embedder (Ollama + Transformers.js)
|
|
208
|
+
- [x] Vector Store (SQLite + FTS5)
|
|
209
|
+
- [x] Index Pipeline
|
|
210
|
+
- [x] CLI: `opl embeddings index/status/remove/config`
|
|
211
|
+
- [x] Modo vector en `opl search`
|
|
212
|
+
- [x] Auto-embedding en `knowledge ingest`
|
|
213
|
+
- [ ] Web scraper (`opl webscrape`)
|
|
214
|
+
- [ ] Onboarding workflow en `opl init`
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# 🚀 Onboarding Workflow para IA en openPrompt-Lang
|
|
2
|
+
|
|
3
|
+
> **Propósito**: Este documento es el punto de entrada OBLIGATORIO para cualquier sesión de IA
|
|
4
|
+
> en un proyecto que ya tiene elementos de openPrompt-Lang.
|
|
5
|
+
>
|
|
6
|
+
> **Generado por**: `opl init` al finalizar la configuración
|
|
7
|
+
> **Versión del documento**: 1.0.0
|
|
8
|
+
> **Última actualización**: {{fecha}}
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 📋 Instrucciones para la IA
|
|
13
|
+
|
|
14
|
+
Al iniciar una sesión en este proyecto, SIGUE ESTE FLUJO ESTRICTAMENTE:
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
1. LEER este documento (ONBOARDING_WORKFLOW.md) → entender el estado del proyecto
|
|
18
|
+
2. LEER AGENTS.md → stack, convenciones, reglas
|
|
19
|
+
3. LEER docs/AI_CONTEXT.md → memoria del proyecto
|
|
20
|
+
4. EJECUTAR workflow_check → ver qué pasos del workflow OPL faltan
|
|
21
|
+
5. EJECUTAR context_unified → panorama completo del proyecto
|
|
22
|
+
6. CONTINUAR desde el último paso registrado (ver sección "Estado Actual")
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 🔍 Detección Automática de Contexto
|
|
28
|
+
|
|
29
|
+
### ¿Este proyecto ya tiene OPL?
|
|
30
|
+
|
|
31
|
+
Sí / No (según corresponda)
|
|
32
|
+
|
|
33
|
+
| Elemento | Estado | Ruta |
|
|
34
|
+
|----------|--------|------|
|
|
35
|
+
| `prompt-lang.json` | ✅ / ❌ | `/ruta` |
|
|
36
|
+
| `AGENTS.md` | ✅ / ❌ | `/ruta` |
|
|
37
|
+
| `docs/AI_CONTEXT.md` | ✅ / ❌ | `/ruta` |
|
|
38
|
+
| `docs/FRAMEWORK.md` | ✅ / ❌ | `/ruta` |
|
|
39
|
+
| `src/` con anotaciones | ✅ / ❌ | `/ruta` |
|
|
40
|
+
| `.opencode/` config | ✅ / ❌ | `/ruta` |
|
|
41
|
+
| `.openprompt/` | ✅ / ❌ | `/ruta` |
|
|
42
|
+
| `knowledge-repo/` | ✅ / ❌ | `/ruta` |
|
|
43
|
+
| Base de conocimiento | ✅ / ❌ | `/ruta` |
|
|
44
|
+
| Sistema de enseñanza | ✅ / ❌ | `/ruta` |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 🧩 Stack del Proyecto
|
|
49
|
+
|
|
50
|
+
| Componente | Valor |
|
|
51
|
+
|------------|-------|
|
|
52
|
+
| **Framework** | React / Vue / Node.js / Spring Boot |
|
|
53
|
+
| **Lenguaje** | TypeScript / JavaScript / Java |
|
|
54
|
+
| **UI** | Tailwind / shadcn / Mantine / Ninguno |
|
|
55
|
+
| **Base de datos** | Supabase / SQLite / PostgreSQL |
|
|
56
|
+
| **Extensiones** | Supabase, Stripe, Prisma, Ionic, ... |
|
|
57
|
+
| **Módulos OPL activos** | React(23t), Vue(12t), Node(12t), Java(8t) |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## 📊 Estado Actual del Proyecto
|
|
62
|
+
|
|
63
|
+
_Completar durante la última sesión. Esto permite a la próxima IA continuar sin pérdida de contexto._
|
|
64
|
+
|
|
65
|
+
| Aspecto | Detalle |
|
|
66
|
+
|---------|---------|
|
|
67
|
+
| **Última sesión** | {{fecha}} |
|
|
68
|
+
| **Último comando ejecutado** | `opl ...` |
|
|
69
|
+
| **Fase del proyecto** | Inicial / En desarrollo / Refinamiento / Producción |
|
|
70
|
+
| **Sprint activo** | embeddings-sprint-001 / ninguno |
|
|
71
|
+
| **Ticket en progreso** | TICKET-XXX / ninguno |
|
|
72
|
+
| **Próximo paso** | _Descripción de lo que sigue_ |
|
|
73
|
+
| **Bloqueadores** | _Problemas pendientes_ |
|
|
74
|
+
| **Branch activa** | `main` / `feature/...` |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 🎯 Próximos Pasos Recomendados
|
|
79
|
+
|
|
80
|
+
1. _Paso 1 — descripción_
|
|
81
|
+
2. _Paso 2 — descripción_
|
|
82
|
+
3. _Paso 3 — descripción_
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 🐛 Problemas Conocidos (Academic Issues)
|
|
87
|
+
|
|
88
|
+
Ver `docs/OPL_ACADEMIC_ISSUES.md` para problemas reportados del sistema de enseñanza.
|
|
89
|
+
|
|
90
|
+
| # | Título | Severidad | Estado |
|
|
91
|
+
|---|--------|-----------|--------|
|
|
92
|
+
| 1 | Onboarding IA en proyecto existente | 🔴 Alta | Abierto |
|
|
93
|
+
| 2 | `opl rebuild` no detecta OPL | 🟡 Media | Abierto |
|
|
94
|
+
| 3 | Falta documento post-init para IA | 🔴 Alta | Abierto |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 📚 Documentos de Referencia
|
|
99
|
+
|
|
100
|
+
| Documento | Propósito | Cuándo leerlo |
|
|
101
|
+
|-----------|-----------|---------------|
|
|
102
|
+
| `AGENTS.md` | Stack, convenciones, UI, calidad, reglas | ✅ Siempre — primera lectura |
|
|
103
|
+
| `docs/AI_CONTEXT.md` | Memoria extendida del proyecto | ✅ Siempre — segunda lectura |
|
|
104
|
+
| `docs/FRAMEWORK.md` | Manual completo: anotaciones, CLI, MCP | 🔍 Bajo demanda |
|
|
105
|
+
| `docs/OPL_ACADEMIC_ISSUES.md` | Problemas del sistema de enseñanza | 🔍 Si tocas el módulo académico |
|
|
106
|
+
| `docs/EMBEDDINGS.md` | Sistema de embeddings vectoriales | 🔍 Si tocas búsqueda semántica |
|
|
107
|
+
| `.opencode/work-context/SESSION.json` | Estado actual de la sesión | 🔍 Para restaurar contexto |
|
|
108
|
+
| `.opencode/work-context/LOG.json` | Bitácora de acciones | 🔍 Para auditoría |
|
|
109
|
+
| `prompt-lang.json` | Configuración del proyecto | 🔍 Si necesitas ver config |
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## ⚡ Comandos Rápidos para la IA
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Conocer el proyecto
|
|
117
|
+
npx openprompt-lang context # Vista general
|
|
118
|
+
npx openprompt-lang validate # Validar anotaciones
|
|
119
|
+
npx openprompt-lang analyze . # Auditoría completa
|
|
120
|
+
|
|
121
|
+
# Búsqueda de conocimiento
|
|
122
|
+
opl index # Navegar conocimiento
|
|
123
|
+
opl search "término" --mode hybrid # Búsqueda híbrida
|
|
124
|
+
opl read <dominio>/<id> --chapter <n> # Leer contenido
|
|
125
|
+
|
|
126
|
+
# Evaluación del proyecto
|
|
127
|
+
opl assess # Production Readiness Assessment
|
|
128
|
+
opl assess --verbose # Con detalle de 7 dimensiones
|
|
129
|
+
|
|
130
|
+
# Sistema de enseñanza
|
|
131
|
+
opl teach progress # Progreso de aprendizaje
|
|
132
|
+
opl teach study <concepto> # Estudiar un concepto
|
|
133
|
+
opl teach assess <concepto> # Evaluar nivel
|
|
134
|
+
|
|
135
|
+
# Embeddings (si aplica)
|
|
136
|
+
opl embeddings status # Estado del índice vectorial
|
|
137
|
+
opl search "término" --mode vector # Búsqueda semántica
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 📝 Notas de la Sesión Actual
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
Espacio para que la IA o el usuario dejen notas sobre la sesión actual.
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
*Documento generado automáticamente por `opl init`.*
|
|
151
|
+
*Versión: 1.0.0*
|