You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: add built-in playbooks for various stacks and enhance skill management
- Introduced built-in playbooks for Node.js, Python, React, and Spring Boot to streamline common tasks and improve user guidance.
- Enhanced the skill management system by allowing the extension of skills from built-in playbooks based on the active focus.
- Added documentation for creating new skills, hooks, tools, and modifying the harness to improve developer experience.
- Implemented a new focus pack addition process to support new stacks and languages.
cuando: "USAR cuando: agregar soporte para un stack/lenguaje nuevo (un focus pack: Go, Kotlin, Vue, etc.). NO usar para skills sueltos ni para tocar un pack que ya existe."
5
+
---
6
+
Un focus pack es el conocimiento de dominio que se inyecta al system prompt según
7
+
el stack. Para añadir uno (p.ej. `go`):
8
+
9
+
1.**Archivo**`src/focus/go.rs` con `pub const SKILLS: &str = "..."` — el dominio.
10
+
Incluye SIEMPRE un bloque de VERSIONES ACTUALES (autoritativo, junio 2026) que
11
+
gane sobre la memoria del modelo; no inventes números de versión.
12
+
2.**Declara el módulo**: `mod go;` en `src/focus/mod.rs` (junto a los otros).
13
+
3.**Catálogo**: añade su `Focus { id, name, tagline }` en `catalog()` (el `id` es
14
+
lo que el usuario elige, p.ej. `"go"`).
15
+
4.**Inyección**: añade el caso a `domain_skills()` (`"go" => Some(go::SKILLS)`).
16
+
5.**Detección** (opcional): enséñale a `fs::detect_stack` a reconocer el stack por
17
+
sus archivos raíz (p.ej. `go.mod`).
18
+
6.**Built-in playbooks** (opcional pero recomendado): añade `pub const PLAYBOOKS`
19
+
al pack y su caso en `focus::builtin_playbooks` (ver skill "crear un skill").
20
+
7.**Verifica** clippy estricto + tests; reinstala con `/actualizar` (el prompt se
cuando: "USAR cuando: agregar un hook o evento del ciclo de vida (OnSessionStart, PreToolUse y similares) que dispare comandos del usuario. NO usar para tools del agente ni comandos del REPL."
5
+
---
6
+
Los hooks viven en `src/cli/hooks.rs` y se configuran en `.dpx/hooks.toml`. Para
7
+
añadir un evento nuevo:
8
+
9
+
1.**Variante del enum**: añade el caso a `enum HookEvent` en `cli/hooks.rs`.
10
+
2.**Mapeo string ↔ enum**: añádelo en `HookEvent::parse` (string → variante) y en
11
+
la conversión inversa (variante → string). Deben coincidir EXACTO con el valor
12
+
que el usuario escribe en `hooks.toml`.
13
+
3.**Disparo**: llama a `run_hooks(&hooks, &HookEvent::TuEvento, ...)` en el punto
14
+
del ciclo de vida donde debe dispararse (mira cómo se dispara `OnSessionStart`
15
+
al arrancar la sesión en `src/cli/chat.rs`).
16
+
4.**Doc**: actualiza el comentario de cabecera de `hooks.rs` (lista de eventos) y
17
+
el README si menciona los hooks.
18
+
5.**Test** de `parse`/round-trip del nuevo evento + clippy estricto + tests.
cuando: "USAR cuando: agregar una acción o tool nueva que dpx pueda emitir (un bloque dpx:algo que lee o muta el repo). NO usar para comandos del REPL (/x) ni paneles."
5
+
---
6
+
Las acciones de dpx son bloques con marcador (`dpx:write path=`, `dpx:read path=`,
7
+
`dpx:run`, `dpx:edit`, `dpx:delete`, `dpx:search`). Para añadir una:
8
+
9
+
1.**Parser** en `src/fs/mod.rs`: una función `parse_<x>_marker`/`is_<x>_fence`
10
+
estilo las existentes (`parse_path_marker`, `is_run_fence`).
11
+
2.**Guard de stripping**: añade tu marcador a la lista de `on_fence`/`on_next` en
12
+
`fs/mod.rs` (la que limpia los bloques de acción del texto visible) — si no, tu
13
+
bloque se imprime crudo.
14
+
3.**Frontera lectura/mutación** (CRÍTICO): si la tool LEE, va libre. Si MUTA
15
+
(write/edit/delete/run), cabléala por la puerta de confirmación en
cuando: "USAR cuando: crear, escribir o agregar un skill o playbook nuevo (curado o built-in de un stack: React, Python, Node, etc.), o cuando falte un playbook para una tarea que se repite."
5
+
---
6
+
Un skill es un PLAYBOOK A→B: le dice a dpx los pasos exactos de una tarea que se
7
+
repite, para que no explore a ciegas ni dé algo genérico. Hay dos tipos:
8
+
9
+
## A) Curado local (`skills/*.md`) — para ESTE repo
10
+
Crea `skills/<nombre-kebab>.md` con frontmatter + cuerpo:
11
+
```
12
+
---
13
+
name: <título corto y reconocible>
14
+
focus: <id del stack o "dpx">
15
+
cuando: "USAR cuando: <frases gatillo concretas>. NO usar para <contraejemplo>."
16
+
---
17
+
1. <paso A→B con la RUTA/función real>
18
+
2. ...
19
+
```
20
+
21
+
## B) Built-in por stack (viene en dpx, para los USUARIOS)
22
+
Añade una tupla al `pub const PLAYBOOKS` del focus pack (p.ej. `src/focus/react.rs`):
23
+
`("nombre", "USAR cuando: …", "1. paso\n2. paso")`. Si el pack aún no tiene
24
+
`PLAYBOOKS`, créalo (copia la forma del de `spring_boot.rs`) y añade su caso a
25
+
`focus::builtin_playbooks` en `src/focus/mod.rs`. Reinstala para que tome efecto.
26
+
27
+
## Reglas de un BUEN skill (esto es lo que evita lo genérico)
28
+
- El `cuando` ES el gatillo: ponlo INSISTENTE, con frases y palabras reales que el
29
+
usuario diría (dpx tiende a sub-disparar los skills). Incluye un "NO usar para…".
30
+
- Cuerpo CORTO y ESPECÍFICO: rutas, funciones, anotaciones, comandos REALES del
31
+
stack — nada de "crea una clase y añade lógica". Si no es específico, no sirve.
32
+
-**Investiga antes de escribir** un stack que no domines: confirma las VERSIONES y
33
+
convenciones ACTUALES (busca en la web si hace falta; alinéate con el bloque de
34
+
versiones del focus pack). NUNCA inventes versiones ni APIs.
35
+
- Un solo playbook por tarea repetible; pasos numerados que terminen en "verifica".
name: modificar el harness (doctrina/prompt de dpx)
3
+
focus: dpx
4
+
cuando: "USAR cuando: agregar o cambiar una regla, lección o doctrina del comportamiento de dpx (el system prompt / focus pack), o corregir una falla recurrente del agente."
5
+
---
6
+
El "harness" es lo que define cómo se comporta dpx. Va compilado en el binario, así
7
+
que un cambio NO surte efecto hasta reinstalar.
8
+
9
+
1.**¿Dónde va la regla?**
10
+
- Doctrina GENERAL (aplica a todos los stacks): `src/focus/mod.rs` (las secciones
11
+
de método: economía de rondas, cambio mínimo, errores recurrentes…).
12
+
- Lección ESPECÍFICA de trabajar sobre dpx: `src/focus/dpx.rs`.
13
+
- Conocimiento de un stack: el focus pack correspondiente (`spring_boot.rs`, etc.).
14
+
2.**Sé concreto y corto**: una regla imperativa con el porqué y el síntoma real que
15
+
evita ("pasó de verdad: …"). Las reglas vagas se ignoran.
16
+
3.**No dupliques**: busca si ya existe una regla parecida y refínala en vez de
17
+
añadir una quinta que diga lo mismo.
18
+
4.**Reinstala**: `cargo install --path . --force` (o el usuario corre `/actualizar`).
19
+
OJO: falla si hay un dpx corriendo (binario en uso, os error 5 en Windows).
20
+
5.**Valida** con el banco de pruebas (`eval/run-eval.sh`): corre la tarea que picaba
0 commit comments