@tacuchi/agent-workflow-cli 12.4.0 → 12.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/dist/application/humanize-es.d.ts +18 -0
- package/dist/application/humanize-es.d.ts.map +1 -0
- package/dist/application/humanize-es.js +71 -0
- package/dist/application/humanize-es.js.map +1 -0
- package/dist/application/session-close-service.d.ts.map +1 -1
- package/dist/application/session-close-service.js +4 -1
- package/dist/application/session-close-service.js.map +1 -1
- package/dist/application/status-service.d.ts +74 -0
- package/dist/application/status-service.d.ts.map +1 -0
- package/dist/application/status-service.js +336 -0
- package/dist/application/status-service.js.map +1 -0
- package/dist/application/templates/session.d.ts +4 -2
- package/dist/application/templates/session.d.ts.map +1 -1
- package/dist/application/templates/session.js +15 -11
- package/dist/application/templates/session.js.map +1 -1
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +10 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/help-groups.js +1 -1
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +2 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.d.ts.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +2 -1
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/README.md +2 -2
- package/skills/w/SKILL.md +6 -5
- package/skills/w/artifacts/README.md +8 -7
- package/skills/w/artifacts/artifacts-core/BACKLOG.md +5 -8
- package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +14 -13
- package/skills/w/artifacts/artifacts-core/SESSION.md +10 -11
- package/skills/w/artifacts/artifacts-core/TASKS.md +4 -4
- package/skills/w/artifacts/artifacts-dev/DECISION.md +3 -3
- package/skills/w/artifacts/artifacts-dev/TECHNICAL-NOTE.md +14 -14
- package/skills/w/artifacts/artifacts-research/ANALYSIS-FILE.md +14 -27
- package/skills/w/artifacts/artifacts-research/CONCLUSIONS.md +10 -13
- package/skills/w/commands/README.md +9 -6
- package/skills/w/commands/plan-exec.md +4 -4
- package/skills/w/commands/plan-new.md +8 -6
- package/skills/w/commands/spec-new.md +8 -7
- package/skills/w/commands/spec-refine.md +7 -5
- package/skills/w/commands/status.md +50 -0
- package/skills/w/loops/README.md +11 -10
- package/skills/w/loops/plan-exec-loop/SKILL.md +53 -53
- package/skills/w/loops/plan-new-loop/SKILL.md +28 -24
- package/skills/w/loops/quick-loop/SKILL.md +18 -17
- package/skills/w/loops/spec-refine-loop/SKILL.md +79 -63
- package/skills/w/roles/README.md +1 -1
- package/skills/w/roles/research/SKILL.md +21 -81
|
@@ -4,16 +4,16 @@ description: >-
|
|
|
4
4
|
El atajo liviano de agent-workflow: resuelve una tarea acotada (un fix, un
|
|
5
5
|
ajuste pequeño) directamente desde el prompt del usuario, editando código con
|
|
6
6
|
ceremonia mínima. Heir del chasis spec-refine-loop (motor gap-driven mínimo,
|
|
7
|
-
research
|
|
8
|
-
contenido + 1 tab flow Compactar/Cerrar siempre, compact/resume con
|
|
9
|
-
|
|
10
|
-
antes de editar + commit propuesto, nunca
|
|
11
|
-
nunca ejecuta DML, migraciones a SCRIPTS.sql;
|
|
12
|
-
fases ni plan-doc (el prompt ES la tarea),
|
|
13
|
-
(<slug>-quick), un solo commit; y escalación con
|
|
14
|
-
(propone subir a SPEC/PLAN dejando el código a
|
|
15
|
-
docs/. Lo arranca /w:quick y es reanudable.
|
|
16
|
-
directos que no ameritan spec ni plan formal.
|
|
7
|
+
research INLINE con regla BD read-only, AskUserQuestion con ≤3 tabs de
|
|
8
|
+
contenido + 1 tab flow Compactar/Cerrar siempre, compact/resume con artefactos
|
|
9
|
+
como log vivo: CHECKPOINT siempre, BACKLOG solo si difiere) y de plan-exec-loop
|
|
10
|
+
(git seguro: rama esperada antes de editar + commit propuesto, nunca
|
|
11
|
+
push/--amend/--no-verify; la IA nunca ejecuta DML, migraciones a SCRIPTS.sql;
|
|
12
|
+
sin auto-export). Sus deltas: sin fases ni plan-doc (el prompt ES la tarea),
|
|
13
|
+
una sola session ligera (<slug>-quick), un solo commit; y escalación con
|
|
14
|
+
handoff si la tarea crece (propone subir a SPEC/PLAN dejando el código a
|
|
15
|
+
medias como contexto). NO toca docs/. Lo arranca /w:quick y es reanudable.
|
|
16
|
+
Invocar para cambios pequeños y directos que no ameritan spec ni plan formal.
|
|
17
17
|
---
|
|
18
18
|
|
|
19
19
|
# quick-loop
|
|
@@ -39,21 +39,21 @@ QUICK
|
|
|
39
39
|
|
|
40
40
|
## Internal session
|
|
41
41
|
|
|
42
|
-
- **SIEMPRE** crea una session ligera con descriptor `<slug>-quick` → `NNN-<slug>-quick` (Type = `quick`, ≈ `exec`): `SESSION` · `DECISION` · `SCRIPTS.sql` · `CHECKPOINT` (+ `BACKLOG`
|
|
42
|
+
- **SIEMPRE** crea una session ligera con descriptor `<slug>-quick` → `NNN-<slug>-quick` (Type = `quick`, ≈ `exec`): `SESSION` · `DECISION` · `SCRIPTS.sql` · `CHECKPOINT` (+ `BACKLOG` solo si difiere). Una sola session. La investigación es **inline** dentro de ella (`ANALYSIS-FILE`/`CONCLUSIONS` + `SCRIPTS.sql` read-only en su carpeta). El caller pasa solo el descriptor; el CLI antepone el `NNN` global y secuencial (ver chasis).
|
|
43
43
|
|
|
44
44
|
## Inherits
|
|
45
45
|
|
|
46
|
-
- del **chasis** [`spec-refine-loop`](../spec-refine-loop/SKILL.md): gap-driven (mínimo), `AskUserQuestion` ≤3 + `flow` (`Compactar`/`Cerrar`), `research`
|
|
46
|
+
- del **chasis** [`spec-refine-loop`](../spec-refine-loop/SKILL.md): gap-driven (mínimo), `AskUserQuestion` ≤3 + `flow` (`Compactar`/`Cerrar`), `research` **inline** + regla BD read-only (pregunta MCP si >1 sin default → `SCRIPTS.sql` → ejecuta read-only), compact/resume, **artefactos como log vivo (ciclo artifact-first)** (`CHECKPOINT` siempre; `BACKLOG` solo si difiere).
|
|
47
47
|
- de [`plan-exec-loop`](../plan-exec-loop/SKILL.md): **git** (rama segura antes de editar + commit propuesto; nunca `push`/`--amend`/`--no-verify`), **BD** (la IA nunca ejecuta DML; migraciones → `SCRIPTS.sql` de la session), **sin auto-export** (no toca otras carpetas `docs/`).
|
|
48
48
|
|
|
49
49
|
## Composes
|
|
50
50
|
|
|
51
|
-
`git` · `coding-standards` · `testing` (validación puntual) · `sql` (regla BD) · `writing` · `research
|
|
51
|
+
`git` · `coding-standards` · `testing` (validación puntual) · `sql` (regla BD) · `writing` · `research` (inline). Resueltas por `.workflow/skills.toml`.
|
|
52
52
|
|
|
53
53
|
## Delta QUICK — minimal ceremony
|
|
54
54
|
|
|
55
55
|
- **Sin fases, sin plan-doc**: el prompt **es** la tarea (una sola unidad). No hay roadmap.
|
|
56
|
-
- **Una sola session
|
|
56
|
+
- **Una sola session**. **Un solo commit** propuesto al final.
|
|
57
57
|
- **Escalación + handoff**: si la tarea crece (muchos archivos / ≥2 fuentes / necesita arquitectura) → propone subir a **SPEC/PLAN**. Si el usuario acepta:
|
|
58
58
|
- el **código ya editado queda** en el working tree (no se revierte) **y se registra** en `CHECKPOINT` + `BACKLOG` ("cambios sin commitear en `<fuente>` — código a medias; decidir commit/descartar al retomar") — reusando **ambas** mitades del patrón "commit rechazado" de plan-exec (no revertir **y** registrar lo sin commitear). Crítico en la rama **SPEC**, que no retoma el working tree;
|
|
59
59
|
- la session quick va a `finalize`, persistiendo `CHECKPOINT` + `BACKLOG` con un **puntero** al spec/plan sembrado (Followups: "escalado a `docs/specs/NNN` o `docs/plans/PPP` — retomar ahí");
|
|
@@ -65,25 +65,26 @@ QUICK
|
|
|
65
65
|
```
|
|
66
66
|
quick-loop(prompt):
|
|
67
67
|
s = create_or_resume("<slug>-quick") # CLI antepone NNN global; siempre session ligera
|
|
68
|
+
seed CHECKPOINT.Pending/Next = la tarea (s) # ANTES: sembrar intención (artifact-first); SESSION.Objective = el prompt
|
|
68
69
|
trabajar la tarea (loop mínimo):
|
|
69
70
|
verificar rama esperada por fuente (branch-check); si no → pausar + resolver
|
|
70
71
|
editar código (cambio mínimo)
|
|
71
72
|
si consulta BD read-only → SCRIPTS.sql + ejecutar read-only
|
|
72
73
|
si cambio BD (DDL/DML) → SCRIPTS.sql (artefacto session, NO ejecutar)
|
|
73
74
|
si decisión no obvia → DECISION
|
|
74
|
-
si duda/gap → research
|
|
75
|
+
si duda/gap → research inline ó AskUserQuestion # chasis
|
|
75
76
|
si la tarea CRECE → proponer escalar a SPEC/PLAN
|
|
76
77
|
si acepta → handoff (código queda; BACKLOG→spec/plan sembrado) → goto finalize
|
|
77
78
|
validación puntual (test si aplica)
|
|
78
79
|
proponer commit (aprobar antes) # nunca push/amend/--no-verify
|
|
79
80
|
AskUserQuestion(contenido: [Cerrar tarea, Preguntar algo más], flow: [Compactar, Cerrar])
|
|
80
|
-
finalize: CHECKPOINT + BACKLOG (si queda algo) + cerrar session + reportar
|
|
81
|
+
finalize: CHECKPOINT (DESPUÉS: Pending→Completed) + BACKLOG (solo si queda algo diferido) + cerrar session + reportar
|
|
81
82
|
```
|
|
82
83
|
|
|
83
84
|
```mermaid
|
|
84
85
|
flowchart TD
|
|
85
86
|
S["create_or_resume session NNN-<slug>-quick"] --> G["branch-check por fuente"]
|
|
86
|
-
G -->|ok| DO["editar código · BD→SCRIPTS.sql · DECISION<br/>(duda→research/AskUserQuestion)"]
|
|
87
|
+
G -->|ok| DO["editar código · BD→SCRIPTS.sql · DECISION<br/>(duda→research inline/AskUserQuestion)"]
|
|
87
88
|
G -->|rama ≠| PA["pausar + resolver"]
|
|
88
89
|
PA --> G
|
|
89
90
|
DO --> GROW{"¿la tarea creció?"}
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
name: spec-refine-loop
|
|
3
3
|
description: >-
|
|
4
4
|
El CHASIS de los loops de agent-workflow. Refina un spec borrador
|
|
5
|
-
(docs/specs/NNN-spec
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
plan-exec-loop y quick-loop. Invocar cuando haya que
|
|
16
|
-
especificación antes de planificar.
|
|
5
|
+
(docs/specs/NNN-spec-<slug>.md) editándolo IN PLACE hasta dejarlo sin
|
|
6
|
+
ambigüedad, mediante un motor gap-driven convergente: detecta
|
|
7
|
+
huecos/ambigüedades, los resuelve preguntando al humano (lo que depende de su
|
|
8
|
+
intención) o investigando de forma autónoma INLINE en la propia session
|
|
9
|
+
(lo que se responde leyendo el repo/datos), integra y repite hasta converger.
|
|
10
|
+
Compone la capacidad ui-design (built-in ui-spec) cuando el requerimiento
|
|
11
|
+
involucra UI. Lo arranca el comando /w:spec-refine y es reanudable vía
|
|
12
|
+
CHECKPOINT. Usa AskUserQuestion con ≤3 tabs de contenido + 1 tab flow
|
|
13
|
+
(Compactar/Cerrar) siempre presente; mantiene sus artefactos como log vivo
|
|
14
|
+
(CHECKPOINT siempre, BACKLOG solo si difiere). Es el patrón de referencia que
|
|
15
|
+
heredan plan-new-loop, plan-exec-loop y quick-loop. Invocar cuando haya que
|
|
16
|
+
refinar/desambiguar una especificación antes de planificar.
|
|
17
17
|
---
|
|
18
18
|
|
|
19
19
|
# spec-refine-loop
|
|
@@ -27,39 +27,50 @@ SPEC
|
|
|
27
27
|
2 — la IA lo corre entero (gap-driven). El usuario no conduce el ciclo; solo responde tabs de contenido y dirige el ciclo de vida por el tab `flow`.
|
|
28
28
|
|
|
29
29
|
## Started by
|
|
30
|
-
`/w:spec-refine` — **reanudable**. Detecta el estado previo y arranca según corresponda (ver *Compact / resume
|
|
30
|
+
`/w:spec-refine` — **reanudable**. Detecta el estado previo (vía CHECKPOINT) y arranca según corresponda (ver *Compact / resume*).
|
|
31
31
|
|
|
32
32
|
## Reads
|
|
33
|
-
- `docs/specs/NNN-spec
|
|
34
|
-
- `docs/specs/NNN-spec-refined.md` si **ya existe** un refinado previo → se re-refina incremental sobre el refined (NO sobre el borrador stale).
|
|
33
|
+
- `docs/specs/NNN-spec*.md` (glob — localiza el spec por número, también captura el legacy `NNN-spec.md`), **o** la ruta exacta pasada en `$ARGUMENTS`. **Siempre el spec mismo**: este loop lo edita in place, no hay un archivo "refined" aparte.
|
|
35
34
|
|
|
36
35
|
## Writes
|
|
37
|
-
`docs/specs/NNN-spec
|
|
36
|
+
Actualiza `docs/specs/NNN-spec-<slug>.md` **in place** (cuando el usuario elige `Guardar especificación refinada`): completa secciones y **agrega** `## Refinement decisions` + `## Q&A traceability`, cerrando `Open questions` a medida que se resuelven. Como sobrescribe un doc existente, **con confirmación** del usuario.
|
|
38
37
|
|
|
39
38
|
> **Invariante de boundary:** este loop escribe **solo** en `docs/specs`. Nunca gradúa/exporta otros artefactos a `docs/` — eso es trabajo de `export-*`, aparte.
|
|
40
39
|
|
|
40
|
+
## Artifacts as a live log — ciclo artifact-first (chasis — heredado por todos los loops)
|
|
41
|
+
|
|
42
|
+
El loop trabaja **artifact-first**: el artefacto se **siembra antes** de ejecutar y se **actualiza después**, no solo al cerrar. Cada gap/fase/tarea corre el ciclo de **3 tiempos**:
|
|
43
|
+
|
|
44
|
+
1. **ANTES — sembrar la intención.** Antes de ejecutar, deja en el artefacto lo que se **va a** hacer: `CHECKPOINT.Pending`/`Next` = el trabajo inminente (`SESSION.Objective` ya fijó el qué del run).
|
|
45
|
+
2. **EJECUTAR.** Resolver el gap / correr la fase / editar el código.
|
|
46
|
+
3. **DESPUÉS — llevar al estado real.** `CHECKPOINT.Pending → Completed`; `DECISION` lo no obvio **a medida que se toma**; `BACKLOG` **solo si** algo queda diferido/followup (`session-close` ya no fabrica un BACKLOG vacío).
|
|
47
|
+
|
|
48
|
+
> El artefacto expresa la **intención** (Pending/Next, antes) y luego el **resultado** (Completed/DECISION, después), en **cada** límite de gap/fase — no solo al `Compactar`/`Cerrar`. Los artefactos de session son el registro vivo del run; el spec/plan es la **base guía**.
|
|
49
|
+
|
|
41
50
|
## Internal sessions (managed)
|
|
42
51
|
|
|
43
|
-
El loop crea y maneja
|
|
52
|
+
El loop crea y maneja su session en `.workflow/sessions/`. El usuario nunca la crea.
|
|
44
53
|
|
|
45
54
|
| Session | When | Artifacts | Role |
|
|
46
55
|
|---|---|---|---|
|
|
47
|
-
| **refine session** `NNN-spec-refine/` | al arrancar el loop (o se reanuda) | `SESSION.md` · `CHECKPOINT.md` (· `BACKLOG.md`
|
|
48
|
-
|
|
56
|
+
| **refine session** `NNN-spec-refine/` | al arrancar el loop (o se reanuda) | `SESSION.md` · `CHECKPOINT.md` (· `BACKLOG.md` solo si difiere) | Dueña del run. Mantiene el avance vivo (CHECKPOINT) y habilita el resume. Type = `refine`. |
|
|
57
|
+
|
|
58
|
+
> **Research INLINE** — la investigación ya **no** es una session aparte: es una actividad **dentro de la session actual** que escribe sus artefactos (`ANALYSIS-FILE`/`CONCLUSIONS`, + `SCRIPTS.sql` read-only si consulta BD) **en la carpeta de la propia session del run**. Ver *Research: autonomy, scope & failure*.
|
|
49
59
|
|
|
50
60
|
> El spec **nunca** entra en una session; vive en `docs/specs/`.
|
|
51
61
|
|
|
62
|
+
> **Compat (legacy):** workspaces viejos pueden tener `NNN-spec.md` / `NNN-spec-refined.md` y sessions `*-research-*` aparte — son históricos y se dejan tal cual. El glob `NNN-spec*.md` igual encuentra el spec base, y re-correr spec-refine lo edita in place de ahí en adelante.
|
|
63
|
+
|
|
52
64
|
### Numeración de sessions (regla dura, heredada por todos los loops)
|
|
53
65
|
|
|
54
|
-
El **CLI es dueño del número**: `aw session-create` antepone un `NNN` **global y secuencial** escaneando **todas** las sessions de `.workflow/sessions/` (cualquier tipo). El caller pasa **solo el descriptor** vía `--name` — **nunca** un número. Así la numeración no se reinicia por tipo ni colisiona (ej.: `001-spec-refine`, `002-
|
|
66
|
+
El **CLI es dueño del número**: `aw session-create` antepone un `NNN` **global y secuencial** escaneando **todas** las sessions de `.workflow/sessions/` (cualquier tipo). El caller pasa **solo el descriptor** vía `--name` — **nunca** un número. Así la numeración no se reinicia por tipo ni colisiona (ej.: `001-spec-refine`, `002-plan-new`, `003-plan-exec`, …).
|
|
55
67
|
|
|
56
|
-
> `<run>` = el **descriptor** (sin número) de la
|
|
68
|
+
> `<run>` = el **descriptor** (sin número) de la session del run: `spec-refine`, `plan-new`, `plan-exec`, `quick`. Como la investigación es **inline** en esta misma session, ya no hay sessions hijas `*-research-*` que numerar (compat: las viejas son históricas).
|
|
57
69
|
>
|
|
58
|
-
> **Resume**: localiza la session existente **escaneando** `.workflow/sessions/` por descriptor + `## Origin` (qué spec/plan), **no** reconstruyendo el número (que
|
|
70
|
+
> **Resume**: localiza la session existente **escaneando** `.workflow/sessions/` por descriptor + `## Origin` (qué spec/plan), **no** reconstruyendo el número (que es global, no derivable del artefacto). `aw session-resume --code <NNN | folder>` resuelve ambas formas.
|
|
59
71
|
|
|
60
72
|
**CLI**:
|
|
61
73
|
- `aw session-create --type refine --name spec-refine` → crea `NNN-spec-refine` / `aw session-resume --code <…>` (detecta `CHECKPOINT`).
|
|
62
|
-
- `aw session-create --type research --name <run>-research-<gap>` por cada gap factual → crea `MMM-<run>-research-<gap>`.
|
|
63
74
|
- `aw checkpoint-write` / `aw checkpoint-read` para el resume.
|
|
64
75
|
- `aw session-close` al cerrar (con razón); `aw session-artifacts` para inspeccionar.
|
|
65
76
|
|
|
@@ -67,16 +78,16 @@ El **CLI es dueño del número**: `aw session-create` antepone un `NNN` **global
|
|
|
67
78
|
|
|
68
79
|
Cuando el requerimiento involucra **UI**, compone la capacidad **`ui-design`** (default built-in `ui-spec`; rebindeable vía `.workflow/skills.toml`): autora el UI spec nativamente (esquema `Screen`, vocabulario, formato). El loop aporta la iteración/Q&A que el viejo servicio no tenía (design-system, tema, variantes, desambiguación) y lo integra como sección `## UI spec` del spec.
|
|
69
80
|
|
|
70
|
-
Otras capacidades transversales que el chasis usa siempre: `research` (research
|
|
81
|
+
Otras capacidades transversales que el chasis usa siempre: `research` (research **inline**, ver abajo), `sql` (regla BD en research), `writing` (redacción del spec). Todas se resuelven por config; `off` → el loop sigue sin la capacidad y, si era necesaria, lo dice o pregunta.
|
|
71
82
|
|
|
72
|
-
## Deliverable schema (
|
|
83
|
+
## Deliverable schema (el spec, editado in place)
|
|
73
84
|
|
|
74
|
-
|
|
85
|
+
El spec se completa **in place**: mismas secciones del borrador **completadas** + dos nuevas que se **agregan** (`Refinement decisions`, `Q&A traceability`). NO se crea un archivo aparte.
|
|
75
86
|
|
|
76
87
|
```markdown
|
|
77
|
-
# Spec NNN
|
|
88
|
+
# Spec NNN — <slug>
|
|
78
89
|
|
|
79
|
-
>
|
|
90
|
+
> Refinado in place por spec-refine-loop
|
|
80
91
|
|
|
81
92
|
## Requirement (afinado, sin ambigüedad)
|
|
82
93
|
## Context (completo)
|
|
@@ -87,11 +98,11 @@ Más rico que el borrador: mismas secciones **completadas** + dos nuevas (`Refin
|
|
|
87
98
|
## UI spec (opt. — si involucra UI; vía capacidad ui-design / skill ui-spec)
|
|
88
99
|
Screen (JSON) + render Markdown.
|
|
89
100
|
|
|
90
|
-
## Refinement decisions ← NEW
|
|
91
|
-
Qué se definió al refinar y por qué. Incluye lo resuelto vía research
|
|
92
|
-
(con referencia a
|
|
101
|
+
## Refinement decisions ← NEW (se AGREGA)
|
|
102
|
+
Qué se definió al refinar y por qué. Incluye lo resuelto vía research inline
|
|
103
|
+
(con referencia a las CONCLUSIONS de la session).
|
|
93
104
|
|
|
94
|
-
## Q&A traceability ← NEW
|
|
105
|
+
## Q&A traceability ← NEW (se AGREGA)
|
|
95
106
|
Cada duda preguntada al humano + la respuesta elegida.
|
|
96
107
|
|
|
97
108
|
## Open questions (idealmente "None"; lo que quede se difiere)
|
|
@@ -120,15 +131,17 @@ Para cada gap, una sola pregunta decide el resolutor:
|
|
|
120
131
|
|
|
121
132
|
## Research: autonomy, scope & failure
|
|
122
133
|
|
|
123
|
-
|
|
134
|
+
La investigación es **inline**: una actividad **dentro de la session actual del run**, no una session aparte. Escribe sus artefactos (`ANALYSIS-FILE` → `CONCLUSIONS`, + `SCRIPTS.sql` read-only si consulta BD) en la **carpeta de la propia session**.
|
|
135
|
+
|
|
136
|
+
- **Autónomo**: la IA investiga inline y reporta **sin pedir permiso**. El humano se entera al integrarse (en `Refinement decisions`) y mantiene control vía el tab `flow`.
|
|
124
137
|
- **Alcance**: workspace + repos asociados (fuentes) + MCPs de BD.
|
|
125
138
|
- **Regla BD** (única excepción a la autonomía):
|
|
126
139
|
1. **Elección de MCP**: si el gap requiere BD y hay **>1 MCP candidato sin default configurado**, la IA pregunta cuál usar. Esa pregunta va por el **mismo `AskUserQuestion`** como un **tab de contenido** (cuenta dentro del límite ≤3 + `flow`), **antes** de ejecutar queries. Si hay un único MCP o un default, no pregunta.
|
|
127
|
-
2. Escribe **primero** las queries en `SCRIPTS.sql` de la
|
|
140
|
+
2. Escribe **primero** las queries en `SCRIPTS.sql` de la session.
|
|
128
141
|
3. Las ejecuta **read-only** vía MCP (respeta `sql-mutation-guard`: nunca DML/DDL).
|
|
129
142
|
- **Research inconclusa** (BD no disponible, evidencia insuficiente, gap factual irresoluble):
|
|
130
|
-
- La
|
|
131
|
-
- El loop **degrada** el gap: lo pasa a **pregunta-al-humano** (próximo batch → `Q&A traceability`) o, si tampoco aplica, lo **difiere** a `## Open questions` del
|
|
143
|
+
- La investigación concluye con estado **`inconcluso`** en `CONCLUSIONS` y reporta el motivo.
|
|
144
|
+
- El loop **degrada** el gap: lo pasa a **pregunta-al-humano** (próximo batch → `Q&A traceability`) o, si tampoco aplica, lo **difiere** a `## Open questions` del spec.
|
|
132
145
|
- El gap se marca **"ya intentado vía research"** (`attempts[gap]++`, límite `MAX`) para que `detect_gaps` **no lo re-dispare en bucle** → garantiza convergencia.
|
|
133
146
|
|
|
134
147
|
## AskUserQuestion (design & batching)
|
|
@@ -145,23 +158,24 @@ Para cada gap, una sola pregunta decide el resolutor:
|
|
|
145
158
|
|
|
146
159
|
```
|
|
147
160
|
spec-refine-loop(spec):
|
|
148
|
-
input =
|
|
149
|
-
refine_session = create_or_resume("spec-refine")
|
|
161
|
+
input = glob(NNN-spec*.md) | $ARGUMENTS path # siempre el spec mismo (in place)
|
|
162
|
+
refine_session = create_or_resume("spec-refine") # CLI antepone NNN global; resume localiza por descriptor/origin
|
|
150
163
|
work = read(input) (+ aplicar avance del checkpoint si reanuda)
|
|
151
|
-
attempts = {}
|
|
164
|
+
attempts = {} # anti-relanzamiento por gap
|
|
152
165
|
repeat:
|
|
153
166
|
gaps = detect_gaps(work) menos los gaps "agotados"
|
|
154
167
|
if gaps == ∅: break
|
|
155
168
|
batch = top ≤3 gaps ; pending_human = []
|
|
169
|
+
seed CHECKPOINT.Pending/Next = batch (refine_session) # ANTES: sembrar intención (artifact-first)
|
|
156
170
|
para cada gap en batch:
|
|
157
171
|
si factual(gap) y attempts[gap] < MAX:
|
|
158
172
|
si requiere BD y >1 MCP sin default → encolar "elección MCP" en pending_human
|
|
159
|
-
|
|
160
|
-
res = rs.run_and_close() # ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql)
|
|
173
|
+
res = research_inline(gap) # en la session actual: ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql read-only)
|
|
161
174
|
si res.concluyente: work = integrate(work, res) # → Refinement decisions
|
|
162
175
|
si no: attempts[gap]++ ; si attempts[gap] >= MAX → pending_human.push(gap)
|
|
163
176
|
si no:
|
|
164
177
|
pending_human.push(gap)
|
|
178
|
+
update CHECKPOINT (refine_session) # DESPUÉS: Pending→Completed, en cada límite de gap (ver ciclo artifact-first)
|
|
165
179
|
si pending_human no vacío:
|
|
166
180
|
ans = AskUserQuestion(contenido: pending_human (≤3), flow: [Compactar, Cerrar])
|
|
167
181
|
switch(flow):
|
|
@@ -171,58 +185,60 @@ spec-refine-loop(spec):
|
|
|
171
185
|
# convergió:
|
|
172
186
|
ans = AskUserQuestion(contenido: [Guardar refinada, Preguntar algo más],
|
|
173
187
|
flow: [Compactar, Cerrar])
|
|
174
|
-
Guardar →
|
|
188
|
+
Guardar → edit_in_place_with_confirm(spec) # completa secciones + agrega Refinement decisions/Q&A ; goto finalize
|
|
175
189
|
Preguntar algo más → continue
|
|
176
190
|
flow Compactar/Cerrar → manejar igual
|
|
177
191
|
finalize:
|
|
178
|
-
write CHECKPOINT (refine_session)
|
|
179
|
-
write/update BACKLOG (motivo
|
|
180
|
-
cerrar
|
|
192
|
+
write CHECKPOINT (refine_session) # persiste siempre
|
|
193
|
+
si hay diferidos/followup → write/update BACKLOG (motivo + Open questions diferidas)
|
|
194
|
+
cerrar refine_session ; reportar
|
|
181
195
|
```
|
|
182
196
|
|
|
183
197
|
```mermaid
|
|
184
198
|
flowchart TD
|
|
185
|
-
S["input =
|
|
199
|
+
S["input = glob NNN-spec*.md (el spec mismo)<br/>create_or_resume refine session"] --> D{"¿gaps<br/>(no agotados)?"}
|
|
186
200
|
D -->|no| C["AskUserQuestion<br/>contenido[Guardar refinada · Preguntar más]<br/>flow[Compactar · Cerrar]"]
|
|
187
201
|
D -->|sí| B["tomar ≤3 gaps"]
|
|
188
202
|
B --> F{"¿factual y<br/>attempts<MAX?"}
|
|
189
|
-
F -->|sí| RS["research session<br/>ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql)"]
|
|
203
|
+
F -->|sí| RS["research INLINE en la session<br/>ANALYSIS-FILE → CONCLUSIONS (+SCRIPTS.sql)"]
|
|
190
204
|
RS --> CC{"¿concluyente?"}
|
|
191
205
|
CC -->|sí| I1["integrar → Refinement decisions"]
|
|
192
206
|
CC -->|no| DEG["attempts++ ; degradar a humano / Open questions"]
|
|
193
207
|
F -->|no| Q["AskUserQuestion<br/>contenido[dudas + elección MCP ≤3]<br/>flow[Compactar · Cerrar]"]
|
|
194
208
|
Q --> I2["integrar → Q&A traceability"]
|
|
195
|
-
I1 -->
|
|
196
|
-
DEG -->
|
|
197
|
-
I2 -->
|
|
198
|
-
|
|
209
|
+
I1 --> CK["update CHECKPOINT (Pending→Completed)"]
|
|
210
|
+
DEG --> CK
|
|
211
|
+
I2 --> CK
|
|
212
|
+
CK --> D
|
|
213
|
+
C -->|Guardar| W["edit IN PLACE con confirmación<br/>completa + agrega Refinement decisions/Q&A"]
|
|
199
214
|
C -->|Preguntar más| D
|
|
200
|
-
W --> FIN["finalize: CHECKPOINT + BACKLOG<br/>+ cerrar
|
|
215
|
+
W --> FIN["finalize: CHECKPOINT (+ BACKLOG si difiere)<br/>+ cerrar session + reportar"]
|
|
201
216
|
```
|
|
202
217
|
|
|
203
218
|
## Compact / resume
|
|
204
219
|
|
|
205
|
-
|
|
220
|
+
El resume **keya off el `CHECKPOINT`** de la refine session, no de la existencia de un archivo "refined". Tres casos al ejecutar `/w:spec-refine` sobre un spec:
|
|
221
|
+
|
|
222
|
+
1. **En curso** (existe `CHECKPOINT.md` en la refine session) → reanuda desde el avance (gaps resueltos, Q&A, `attempts`, research inline en curso).
|
|
223
|
+
2. **Sin avance** (no hay CHECKPOINT y el spec **no** tiene `Refinement decisions`/`Q&A traceability`) → arranca desde cero leyendo el spec (`NNN-spec*.md`).
|
|
224
|
+
3. **Ya refinado** (no hay CHECKPOINT abierto pero el spec **ya tiene** `Refinement decisions`/`Q&A traceability`) → re-refinamiento incremental leyendo el **spec mismo**; al `Guardar`, edita in place con confirmación.
|
|
206
225
|
|
|
207
|
-
|
|
208
|
-
2. **Sin avance** (no hay CHECKPOINT ni refined) → arranca desde cero leyendo `NNN-spec.md`.
|
|
209
|
-
3. **Ya completado** (existe `NNN-spec-refined.md`, sin CHECKPOINT) → re-refinamiento incremental: input = el **refined** (no el borrador); al `Guardar`, sobrescribe con confirmación.
|
|
210
|
-
4. **`Compactar`** (tab flow) → escribe `CHECKPOINT.md` en la refine session (spec en progreso, gaps restantes, Q&A, `attempts`, research sessions abiertas) → dispara `/compact` del host → reanuda leyendo el checkpoint.
|
|
226
|
+
> **`Compactar`** (tab flow, transversal a los 3 casos) → escribe `CHECKPOINT.md` en la refine session (spec en progreso, gaps restantes, Q&A, `attempts`) → dispara `/compact` del host → reanuda leyendo el checkpoint.
|
|
211
227
|
|
|
212
228
|
## Convergence / exit
|
|
213
229
|
|
|
214
230
|
- **Sin gaps materiales** → ofrece `Guardar especificación refinada`.
|
|
215
|
-
- `Guardar` → `
|
|
216
|
-
- `Cerrar` (tab flow, en cualquier momento) → `finalize`. **`finalize` persiste siempre
|
|
231
|
+
- `Guardar` → `edit_in_place_with_confirm(spec)` y `finalize`.
|
|
232
|
+
- `Cerrar` (tab flow, en cualquier momento) → `finalize`. **`finalize` persiste siempre el `CHECKPOINT.md`** (reanudable) y, **solo si hay algo diferido/followup**, escribe `BACKLOG.md` (motivo de cierre + `Open questions` diferidas); cierra la session y reporta. Así sobrevive el avance aunque no se haya `Compactar` antes.
|
|
217
233
|
|
|
218
234
|
## Integration (dónde aterriza cada resolución)
|
|
219
235
|
|
|
220
|
-
- Resuelto vía **research** → `## Refinement decisions` del
|
|
221
|
-
- Resuelto vía **humano** → `## Q&A traceability` del
|
|
222
|
-
- **Research inconclusa o sin resolver** → `## Open questions` del
|
|
236
|
+
- Resuelto vía **research inline** → `## Refinement decisions` del spec (+ ref a las `CONCLUSIONS` de la session).
|
|
237
|
+
- Resuelto vía **humano** → `## Q&A traceability` del spec.
|
|
238
|
+
- **Research inconclusa o sin resolver** → `## Open questions` del spec (diferido) + `BACKLOG.md` de la refine session (solo si queda algo diferido).
|
|
223
239
|
|
|
224
240
|
## Heredan este chasis
|
|
225
241
|
|
|
226
242
|
- `plan-new-loop` — mismo motor; deltas: plan rico + gap taxonomy de plan.
|
|
227
|
-
- `plan-exec-loop` — mismo motor; deltas: ejecución real (código/BD/git), session por fase, sin auto-export.
|
|
243
|
+
- `plan-exec-loop` — mismo motor; deltas: ejecución real (código/BD/git), **una sola session por run** (progreso por fase en el plan-doc), sin auto-export.
|
|
228
244
|
- `quick-loop` — mismo motor (mínimo); hereda además git/BD/no-export de `plan-exec-loop`.
|
package/skills/w/roles/README.md
CHANGED
|
@@ -13,7 +13,7 @@ All 10 roles, their built-in defaults, their tier, and which loops/exports compo
|
|
|
13
13
|
| Role | Default built-in | Tier | Composed by |
|
|
14
14
|
|---|---|---|---|
|
|
15
15
|
| `ui-design` | [`ui-spec`](../ui-spec/SKILL.md) | must | `spec-refine-loop` (when requirement involves UI) |
|
|
16
|
-
| `sql` | `sql` | must | research
|
|
16
|
+
| `sql` | `sql` | must | inline research · `plan-exec-loop` · `quick-loop` · `export-scripts` |
|
|
17
17
|
| `git` | `git` | must | `plan-exec-loop` · `quick-loop` |
|
|
18
18
|
| `coding-standards` | `coding-standards` | must | `plan-exec-loop` · `quick-loop` |
|
|
19
19
|
| `writing` | `writing` | must | all loops · `export-manuals` · `export-reports` |
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
name: research
|
|
3
3
|
description: >
|
|
4
4
|
Capacidad de investigación on-demand que los loops componen cuando necesitan evidencia para avanzar.
|
|
5
|
-
|
|
6
|
-
produce ANALYSIS-FILE → CONCLUSIONS
|
|
7
|
-
con las fuentes disponibles. Discrimina
|
|
8
|
-
|
|
5
|
+
Investiga INLINE dentro de la sesión activa (no crea una sesión aparte): lee el workspace + repos
|
|
6
|
+
asociados + MCPs en modo read-only, produce ANALYSIS-FILE → CONCLUSIONS dentro de esa sesión.
|
|
7
|
+
Concluye INCONCLUSIVE si la pregunta no puede responderse con las fuentes disponibles. Discrimina
|
|
8
|
+
cuándo investigar ("¿puedo responder leyendo repo/datos?") vs cuándo preguntar al humano
|
|
9
|
+
("¿depende de lo que el usuario quiere?").
|
|
9
10
|
---
|
|
10
11
|
|
|
11
12
|
# research — On-demand investigation capability
|
|
@@ -42,16 +43,16 @@ Todos los loops la cargan on-demand:
|
|
|
42
43
|
### Investigation lifecycle
|
|
43
44
|
|
|
44
45
|
```
|
|
45
|
-
[pregunta del loop] → [
|
|
46
|
+
[pregunta del loop] → [investigar inline en la sesión activa] → [recolectar evidencia] → [sintetizar] → [CONCLUSIONS]
|
|
46
47
|
↕
|
|
47
48
|
[nueva hipótesis o gap] → [más evidencia o INCONCLUSIVE]
|
|
48
49
|
```
|
|
49
50
|
|
|
50
|
-
1. **
|
|
51
|
+
1. **Investigar inline** — no se crea una sesión aparte; los artefactos se escriben en la sesión activa del loop (`.workflow/sessions/NNN-<run>/`).
|
|
51
52
|
2. **Recolectar evidencia** — read-only: `Read`, `Grep`, `Glob`, MCP SELECT, `git log`.
|
|
52
|
-
3. **Escribir `ANALYSIS-FILE.md`** con hallazgos crudos.
|
|
53
|
+
3. **Escribir `ANALYSIS-FILE.md`** (scratchpad opcional) con hallazgos crudos.
|
|
53
54
|
4. **Sintetizar** en `CONCLUSIONS.md` con conclusiones evidenciadas.
|
|
54
|
-
5. **
|
|
55
|
+
5. **Reportar al loop**: `concluido` si converge; `inconclusive` si no hay material suficiente — el loop degrada/difiere el gap.
|
|
55
56
|
|
|
56
57
|
### Ask-vs-research discriminator (examples)
|
|
57
58
|
|
|
@@ -64,73 +65,14 @@ Todos los loops la cargan on-demand:
|
|
|
64
65
|
"¿el servicio Y ya tiene auth implementado?" → investigar (leer código)
|
|
65
66
|
```
|
|
66
67
|
|
|
67
|
-
###
|
|
68
|
+
### Artifact schemas
|
|
68
69
|
|
|
69
|
-
|
|
70
|
-
# Analysis — <slug>
|
|
71
|
-
|
|
72
|
-
## Question
|
|
73
|
-
|
|
74
|
-
[La pregunta exacta que el loop planteó.]
|
|
75
|
-
|
|
76
|
-
## Sources consulted
|
|
77
|
-
|
|
78
|
-
- Codigo: <repo/path:lineas>
|
|
79
|
-
- BD (<mcp-name>): queries en queries/
|
|
80
|
-
- Git: <SHAs relevantes>
|
|
81
|
-
- Refs externas: <links si aplica>
|
|
82
|
-
|
|
83
|
-
## Finding 1: <titulo>
|
|
84
|
-
|
|
85
|
-
- **Que se observo**: ...
|
|
86
|
-
- **Donde**: <path o link>
|
|
87
|
-
- **Cuando**: <fecha si aplica>
|
|
88
|
-
|
|
89
|
-
## Finding N: ...
|
|
90
|
-
|
|
91
|
-
## Tentative hypotheses
|
|
92
|
-
|
|
93
|
-
- [hipotesis sin compromiso, para revisar en synthesis]
|
|
94
|
-
|
|
95
|
-
## Gaps
|
|
96
|
-
|
|
97
|
-
- [lo que no pudo leerse o no esta disponible]
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### CONCLUSIONS.md schema
|
|
101
|
-
|
|
102
|
-
```markdown
|
|
103
|
-
# Conclusions — <slug>
|
|
104
|
-
|
|
105
|
-
## Summary
|
|
106
|
-
|
|
107
|
-
[1-2 oraciones: que se investigo y que se concluyó.]
|
|
108
|
-
|
|
109
|
-
## Conclusions
|
|
110
|
-
|
|
111
|
-
- **C1**: <conclusion + link a ANALYSIS-FILE#section>
|
|
112
|
-
- **C2**: ...
|
|
113
|
-
|
|
114
|
-
## Recommendations
|
|
115
|
-
|
|
116
|
-
- **R1**: <accion concreta para el loop que hizo la pregunta>
|
|
117
|
-
|
|
118
|
-
## Open (gaps)
|
|
119
|
-
|
|
120
|
-
- <pregunta sin responder si aplica>
|
|
121
|
-
```
|
|
70
|
+
`ANALYSIS-FILE.md` (scratchpad opcional) y `CONCLUSIONS.md` siguen las **plantillas canónicas** en `artifacts/artifacts-research/` — no se duplican aquí para evitar drift. Para research liviana basta `CONCLUSIONS.md`; `ANALYSIS-FILE.md` es opcional para investigaciones más profundas.
|
|
122
71
|
|
|
123
72
|
### DB rule (invariant #4)
|
|
124
73
|
|
|
125
74
|
- **Solo SELECT** — nunca DML/DDL.
|
|
126
|
-
- **Escribir la query primero** en
|
|
127
|
-
```sql
|
|
128
|
-
-- Query: <proposito>
|
|
129
|
-
-- MCP: <nombre>
|
|
130
|
-
-- Fecha: YYYY-MM-DD
|
|
131
|
-
-- Sesion: <slug>
|
|
132
|
-
-- Costo estimado: <filas|N/A>
|
|
133
|
-
```
|
|
75
|
+
- **Escribir la query primero** en el `SCRIPTS.sql` de la sesión activa (tipo A, read-only; ver la plantilla `artifacts/artifacts-core/SCRIPTS.sql`) con su header de propósito + MCP + origen.
|
|
134
76
|
- **Si hay >1 MCP candidato sin default declarado**: preguntar al humano cuál usar antes de ejecutar.
|
|
135
77
|
- **Cost guard antes de ejecutar**:
|
|
136
78
|
- `COUNT(*) ≤ 1.000` o lookup por PK → ejecutar directo.
|
|
@@ -156,26 +98,24 @@ Si tras investigar los gaps persisten y no pueden cerrarse con las fuentes dispo
|
|
|
156
98
|
- Marcar sesión como `inconclusive`.
|
|
157
99
|
- Reportar al loop: qué se pudo y qué no — el loop decide si pregunta al humano.
|
|
158
100
|
|
|
159
|
-
###
|
|
101
|
+
### Inline research artifacts (en la sesión activa)
|
|
160
102
|
|
|
161
103
|
```
|
|
162
|
-
.workflow/sessions
|
|
163
|
-
├──
|
|
164
|
-
├──
|
|
165
|
-
|
|
166
|
-
└── queries/ # SQL read-only (si se usó MCP)
|
|
167
|
-
└── 001-<slug>.sql
|
|
104
|
+
.workflow/sessions/NNN-<run>/ # la sesión del loop (refine/exec/quick)
|
|
105
|
+
├── ANALYSIS-FILE.md # hallazgos crudos (scratchpad opcional)
|
|
106
|
+
├── CONCLUSIONS.md # síntesis + recomendaciones para el loop
|
|
107
|
+
└── SCRIPTS.sql # SQL read-only (tipo A), si se usó MCP
|
|
168
108
|
```
|
|
169
109
|
|
|
170
110
|
## Output
|
|
171
111
|
|
|
172
|
-
Produce en `.workflow/sessions
|
|
173
|
-
- `ANALYSIS-FILE.md` — hallazgos crudos sin sintetizar.
|
|
112
|
+
Produce, **inline en la sesión activa del loop** (`.workflow/sessions/NNN-<run>/`):
|
|
113
|
+
- `ANALYSIS-FILE.md` — hallazgos crudos sin sintetizar (opcional).
|
|
174
114
|
- `CONCLUSIONS.md` — conclusiones con evidencia + recomendaciones para el loop.
|
|
175
|
-
- `
|
|
115
|
+
- `SCRIPTS.sql` — queries read-only (tipo A), solo si se usó MCP.
|
|
176
116
|
|
|
177
117
|
No gradua a `docs/` (invariant #1). El loop que compone esta capacidad consume las conclusiones y actua en consecuencia.
|
|
178
118
|
|
|
179
119
|
## Source
|
|
180
120
|
|
|
181
|
-
Reciclado de `analyze-investigate`, `analyze-synthesize` y `analyze-conclude` del bundle viejo. Se conserva: el modelo de investigacion divergente → sintesis → conclusiones; las reglas read-only; el cost guard de queries; la discriminacion de gaps. Se descarta: la terminología de `flow=analyze`, `EVIDENCE.md`/`FINDINGS.md` como nombres canónicos (ahora `ANALYSIS-FILE.md`/`CONCLUSIONS.md`), el lifecycle de sesiones legacy, y la modulacion por modalidad (technical/incident/data) — la skill de research es de propósito general.
|
|
121
|
+
Reciclado de `analyze-investigate`, `analyze-synthesize` y `analyze-conclude` del bundle viejo. Se conserva: el modelo de investigacion divergente → sintesis → conclusiones; las reglas read-only; el cost guard de queries; la discriminacion de gaps. Se descarta: la terminología de `flow=analyze`, `EVIDENCE.md`/`FINDINGS.md` como nombres canónicos (ahora `ANALYSIS-FILE.md`/`CONCLUSIONS.md`), el lifecycle de sesiones legacy (la research ahora es **inline**, sin sesión propia), y la modulacion por modalidad (technical/incident/data) — la skill de research es de propósito general.
|