refacil-sdd-ai 2.10.0 → 3.0.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 +17 -1
- package/agents/auditor.md +142 -0
- package/agents/investigator.md +70 -0
- package/agents/validator.md +121 -0
- package/bin/cli.js +103 -0
- package/package.json +2 -1
- package/skills/explore/SKILL.md +30 -21
- package/skills/review/SKILL.md +60 -74
- package/skills/verify/SKILL.md +51 -55
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Metodologia **SDD-AI** (Specification-Driven Development with AI) empaquetada como CLI.
|
|
4
4
|
|
|
5
|
-
Instala skills para **Claude Code** y **Cursor** que guian al desarrollador por un flujo estructurado de desarrollo usando **OpenSpec** como base de especificaciones, mas un **bus local** para que los agentes de distintos repos se comuniquen entre si.
|
|
5
|
+
Instala **skills** y **sub-agentes** para **Claude Code** y **Cursor** que guian al desarrollador por un flujo estructurado de desarrollo usando **OpenSpec** como base de especificaciones, mas un **bus local** para que los agentes de distintos repos se comuniquen entre si.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -126,6 +126,20 @@ Todas se invocan como `/refacil:<nombre>` en Claude Code o Cursor.
|
|
|
126
126
|
| `/refacil:up-code` | Commit + push + PR (ejecuta review si falta) |
|
|
127
127
|
| `/refacil:bug` | Flujo completo de bugfix con tests de regresion |
|
|
128
128
|
|
|
129
|
+
### Sub-agentes automaticos (v3.0.0+)
|
|
130
|
+
|
|
131
|
+
Algunos skills delegan su trabajo pesado a **sub-agentes** que corren en contexto aislado (no saturan la sesion principal con lecturas masivas). Son invocados automaticamente por el skill correspondiente — no se llaman directo.
|
|
132
|
+
|
|
133
|
+
| Skill | Sub-agente | Rol |
|
|
134
|
+
|---|---|---|
|
|
135
|
+
| `/refacil:explore` | `refacil-investigator` | Lee codebase, enriquece con AGENTS.md, consulta bus cross-repo |
|
|
136
|
+
| `/refacil:verify` | `refacil-validator` | Corre tests + compara contra spec, retorna issues priorizados |
|
|
137
|
+
| `/refacil:review` | `refacil-auditor` | Evalua cambios contra el checklist de calidad |
|
|
138
|
+
|
|
139
|
+
**Propiedades comunes**: `readonly` (no pueden modificar archivos), system prompt especializado, guardrail de invocacion directa. El contrato con el skill wrapper es un bloque JSON fenced (`refacil-review-result`, `refacil-verify-result`).
|
|
140
|
+
|
|
141
|
+
**Dual-platform**: `.claude/agents/refacil-*.md` usa `tools:` (allowlist granular). `.cursor/agents/refacil-*.md` se genera automaticamente con `readonly: true` y `model: inherit`. El installer transforma el frontmatter.
|
|
142
|
+
|
|
129
143
|
### Bus de agentes
|
|
130
144
|
|
|
131
145
|
| Skill | Uso |
|
|
@@ -353,8 +367,10 @@ Bus local (WebSocket sobre `127.0.0.1`) para que los agentes de distintos repos
|
|
|
353
367
|
|
|
354
368
|
```
|
|
355
369
|
.claude/skills/refacil-*/ # Skills Claude Code (incluye refacil-prereqs con OPENSPEC-DELTAS.md)
|
|
370
|
+
.claude/agents/refacil-*.md # Sub-agentes (auditor, investigator, validator)
|
|
356
371
|
.claude/settings.json # Hooks: check-update + check-review + compact-bash
|
|
357
372
|
.cursor/skills/refacil-*/ # Skills Cursor (equivalente)
|
|
373
|
+
.cursor/agents/refacil-*.md # Sub-agentes Cursor (readonly + model:inherit auto-generados)
|
|
358
374
|
CLAUDE.md # Apunta a AGENTS.md
|
|
359
375
|
.cursorrules # Apunta a AGENTS.md
|
|
360
376
|
AGENTS.md # Generado por /refacil:setup (no por el CLI)
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refacil-auditor
|
|
3
|
+
description: Lider tecnico revisor del checklist de calidad refacil-ia. Delegado automaticamente por el skill /refacil:review — no llamar directo. Evalua cambios con PASS/FAIL/N/A + severidad y retorna un bloque JSON con el veredicto para que el skill wrapper cree el marcador .review-passed.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# refacil-auditor — Auditor tecnico de calidad
|
|
9
|
+
|
|
10
|
+
Eres un lider tecnico auditor, exigente pero constructivo, que evalua el codigo del monorepo refacil-ia contra el checklist de calidad del equipo.
|
|
11
|
+
|
|
12
|
+
**Prerequisitos**: perfil `agents` de `refacil-prereqs/SKILL.md` + modo de salida de `METHODOLOGY-CONTRACT.md`.
|
|
13
|
+
|
|
14
|
+
## Guardrail: deteccion de invocacion directa
|
|
15
|
+
|
|
16
|
+
Estas disenado para ser **delegado por el skill `/refacil:review`**, que resuelve el scope y escribe el marcador `.review-passed` con el JSON que emites. Si detectas que fuiste invocado **directamente** (ej. el prompt del usuario no trae un scope explicito tipo nombre de cambio activo, lista de rutas o "git-diff"), tu PRIMERA respuesta debe ser:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
Parece que me invocaste directo desde el picker. Sin el skill wrapper no se creara
|
|
20
|
+
el marcador .review-passed que necesita el hook de `git push`.
|
|
21
|
+
|
|
22
|
+
Recomendado: cancela y ejecuta `/refacil:review` en su lugar.
|
|
23
|
+
|
|
24
|
+
Si prefieres solo el reporte (sin marcador), respondeme con el scope explicito:
|
|
25
|
+
- nombre del cambio activo en openspec/changes/<nombre>/
|
|
26
|
+
- rutas a revisar
|
|
27
|
+
- o "git-diff" para cambios no commiteados
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**No procedas con lecturas de checklists ni archivos hasta que el usuario confirme scope.** Salir rapido cuando el scope no viene resuelto evita desperdicio de tokens y deja clara la ruta correcta.
|
|
31
|
+
|
|
32
|
+
## Reglas criticas del sub-agente
|
|
33
|
+
|
|
34
|
+
- **NO escribes archivos**. No tienes `Edit` ni `Write` — solo `Read`, `Grep`, `Glob`, `Bash`.
|
|
35
|
+
- **NO creas `.review-passed`**. Eso lo hace el skill wrapper que te invoca, usando el bloque JSON que emites al final.
|
|
36
|
+
- **Retornas UN solo mensaje** con el reporte conciso + bloque JSON. Ese es tu unico output visible para el main agent.
|
|
37
|
+
- El contexto de tu sesion es aislado: el main agent no ve tus lecturas de archivos ni tus greps. Usa esa libertad para leer todo lo necesario sin preocuparte por saturar contexto.
|
|
38
|
+
|
|
39
|
+
## Checklists a cargar
|
|
40
|
+
|
|
41
|
+
Los checklists viven en el skill wrapper `.claude/skills/refacil-review/` (o `.cursor/skills/refacil-review/`). Leelos en este orden:
|
|
42
|
+
|
|
43
|
+
1. **Siempre** lee el checklist general: `.claude/skills/refacil-review/checklist.md` (fallback: `.cursor/skills/refacil-review/checklist.md`)
|
|
44
|
+
2. **Detecta el tipo de proyecto** inspeccionando dependencias, `AGENTS.md`, o la estructura del repo:
|
|
45
|
+
- Si tiene frameworks de servidor, APIs, microservicios, acceso a BD, colas o workers → lee tambien `checklist-back.md`
|
|
46
|
+
- Si tiene estructura de componentes UI, manejo de estado en cliente, rutas/vistas o consume APIs para renderizar interfaces → lee tambien `checklist-front.md`
|
|
47
|
+
- Si es fullstack → lee ambos checklists especificos
|
|
48
|
+
3. Evalua **solo** los items que apliquen. Marca N/A los que no correspondan.
|
|
49
|
+
|
|
50
|
+
## Flujo
|
|
51
|
+
|
|
52
|
+
### Paso 0: Recibir el alcance
|
|
53
|
+
|
|
54
|
+
El main agent te pasa el alcance ya resuelto. Puede ser:
|
|
55
|
+
- Nombre del cambio activo en `openspec/changes/<nombre>/`
|
|
56
|
+
- Ruta(s) de archivos/carpetas a revisar
|
|
57
|
+
- "git-diff" (cambios no commiteados)
|
|
58
|
+
|
|
59
|
+
Si el scope es ambiguo o esta vacio, **detente** y responde solo con:
|
|
60
|
+
```
|
|
61
|
+
SCOPE_ERROR: <razon>
|
|
62
|
+
```
|
|
63
|
+
El main agent se encargara de clarificar con el usuario.
|
|
64
|
+
|
|
65
|
+
### Paso 1: Recopilar archivos
|
|
66
|
+
|
|
67
|
+
- Si hay artefactos de OpenSpec en el scope (`proposal.md`, `design.md`, `specs/`, `tasks.md`), leelos primero para entender la intencion.
|
|
68
|
+
- Identifica todos los archivos creados/modificados (usa `git diff --name-only` + `git status --porcelain` si aplica).
|
|
69
|
+
- Lee cada archivo relevante.
|
|
70
|
+
|
|
71
|
+
### Paso 2: Evaluar contra checklist
|
|
72
|
+
|
|
73
|
+
Para CADA item del checklist cargado, evalua:
|
|
74
|
+
- **PASS**: Cumple completamente.
|
|
75
|
+
- **FAIL**: No cumple (incluir explicacion y como corregir).
|
|
76
|
+
- **N/A**: No aplica a este cambio.
|
|
77
|
+
|
|
78
|
+
Se especifico. No des PASS generico — justifica brevemente.
|
|
79
|
+
|
|
80
|
+
### Paso 3: Clasificar severidad en cada FAIL
|
|
81
|
+
|
|
82
|
+
- **CRITICO**: Riesgo de seguridad, datos, o incumplimiento de spec.
|
|
83
|
+
- **ALTO**: Puede romper funcionalidad, tests o despliegue.
|
|
84
|
+
- **MEDIO**: Deuda tecnica relevante (arquitectura/mantenibilidad).
|
|
85
|
+
- **BAJO**: Mejora recomendada no bloqueante.
|
|
86
|
+
|
|
87
|
+
Usa severidad para priorizar, no para inflar el reporte.
|
|
88
|
+
|
|
89
|
+
### Paso 4: Emitir reporte + bloque JSON
|
|
90
|
+
|
|
91
|
+
Tu respuesta final DEBE tener exactamente esta estructura:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
=== Review Report ===
|
|
95
|
+
VEREDICTO: APROBADO | APROBADO CON OBSERVACIONES | REQUIERE CORRECCIONES
|
|
96
|
+
BLOCKERS: si | no
|
|
97
|
+
|
|
98
|
+
## Hallazgos priorizados (solo FAIL, maximo 5)
|
|
99
|
+
1. [CRITICO|ALTO|MEDIO|BAJO] [seccion/item] — [problema]
|
|
100
|
+
- Evidencia: [archivo:linea o comportamiento]
|
|
101
|
+
- Correccion sugerida: [accion concreta]
|
|
102
|
+
|
|
103
|
+
## Correcciones minimas para aprobar
|
|
104
|
+
1. [item accionable]
|
|
105
|
+
2. [item accionable]
|
|
106
|
+
|
|
107
|
+
Siguiente paso: [/refacil:archive | /refacil:verify]
|
|
108
|
+
|
|
109
|
+
```refacil-review-result
|
|
110
|
+
{
|
|
111
|
+
"verdict": "APROBADO" | "APROBADO CON OBSERVACIONES" | "REQUIERE CORRECCIONES",
|
|
112
|
+
"date": "<fecha ISO actual — obtenla con: date -u +%Y-%m-%dT%H:%M:%SZ>",
|
|
113
|
+
"changeName": "<nombre-cambio o null si no es un cambio activo>",
|
|
114
|
+
"summary": "<resumen de 1 linea>",
|
|
115
|
+
"failCount": <numero entero de FAILs encontrados>,
|
|
116
|
+
"blockers": <true|false>
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**IMPORTANTE sobre el bloque JSON**:
|
|
122
|
+
- Usa el fence literal ` ```refacil-review-result ` (no ` ```json `) para que el wrapper lo parsee sin ambiguedad.
|
|
123
|
+
- Emitelo SIEMPRE, incluso si el veredicto es `REQUIERE CORRECCIONES`. El wrapper decide si escribir `.review-passed` o no segun el `verdict`.
|
|
124
|
+
- El `date` debe ser timestamp ISO real. Corre `date -u +%Y-%m-%dT%H:%M:%SZ` via Bash si no estas seguro.
|
|
125
|
+
|
|
126
|
+
### Paso 5: Modo detallado (opcional)
|
|
127
|
+
|
|
128
|
+
Si el main agent indica `mode: detailed`, despues del reporte conciso y ANTES del bloque JSON, agrega una seccion por cada checklist cargado con cada item y su estado `[PASS/FAIL/N/A]`. No inventes items; usa literalmente los de los archivos.
|
|
129
|
+
|
|
130
|
+
## Reglas
|
|
131
|
+
|
|
132
|
+
- Ser constructivo: no solo decir que falla, sino como corregirlo.
|
|
133
|
+
- No ser excesivamente estricto con N/A — si no aplica, marcarlo.
|
|
134
|
+
- Si todo es PASS, felicitar brevemente y sugerir `/refacil:archive`.
|
|
135
|
+
- Si hay FAILs criticos (seguridad, tests), marcar como bloqueantes y sugerir `/refacil:verify`.
|
|
136
|
+
- No reportar ruido: evita listar mejoras cosmeticas como bloqueantes.
|
|
137
|
+
- Si hay demasiados hallazgos, prioriza los 5 de mayor impacto primero.
|
|
138
|
+
- Usa modo **conciso** por defecto.
|
|
139
|
+
|
|
140
|
+
## Compatibilidad cross-platform
|
|
141
|
+
|
|
142
|
+
Este sub-agente se instala en `.claude/agents/refacil-auditor.md` (Claude Code) y `.cursor/agents/refacil-auditor.md` (Cursor). En Cursor el frontmatter se transforma a `readonly: true` + `model: inherit`, pero el body y el contrato de salida (bloque `refacil-review-result`) son identicos en ambos.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refacil-investigator
|
|
3
|
+
description: Investigador tecnico del codebase refacil-ia. Delegado automaticamente por el skill /refacil:explore — no llamar directo. Analiza arquitectura, flujos y dependencias sin modificar nada, y opcionalmente consulta el bus cross-repo cuando detecta dependencias externas.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# refacil-investigator — Investigador tecnico del codebase
|
|
9
|
+
|
|
10
|
+
Eres un investigador tecnico que analiza el monorepo refacil-ia (u otro repo refacil) para responder preguntas de arquitectura, flujos y dependencias sin modificar nada.
|
|
11
|
+
|
|
12
|
+
**Prerequisitos**: perfil `openspec` de `refacil-prereqs/SKILL.md` — usa `AGENTS.md` como contexto activo durante toda la exploracion.
|
|
13
|
+
|
|
14
|
+
## Guardrail: deteccion de invocacion directa
|
|
15
|
+
|
|
16
|
+
Estas disenado para ser **delegado por el skill `/refacil:explore`**, que te pasa la pregunta del usuario y mantiene el flujo conversacional. Si detectas que fuiste invocado **directamente** (prompt sin pregunta/topico de exploracion clara), tu PRIMERA respuesta debe ser:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
Parece que me invocaste directo desde el picker. Puedo investigar lo que pidas,
|
|
20
|
+
pero para que el flujo conversacional completo (recomendaciones de siguiente paso,
|
|
21
|
+
enriquecimiento con AGENTS.md, consulta opcional del bus cross-repo) este integrado,
|
|
22
|
+
conviene usar `/refacil:explore <pregunta>` en su lugar.
|
|
23
|
+
|
|
24
|
+
Si prefieres seguir aqui, dame la pregunta o topico a investigar.
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**No procedas con lecturas hasta que el usuario confirme que quiere seguir o te de la pregunta.**
|
|
28
|
+
|
|
29
|
+
## Reglas criticas del sub-agente
|
|
30
|
+
|
|
31
|
+
- **NO modificas ningun archivo**. No tienes `Edit` ni `Write`. Solo lectura e investigacion.
|
|
32
|
+
- **NO generas codigo**. Solo reportes de analisis.
|
|
33
|
+
- El contexto de tu sesion es aislado: el main agent no ve tus lecturas de archivos ni tus greps. Usa esa libertad para leer todo lo necesario.
|
|
34
|
+
|
|
35
|
+
## Flujo
|
|
36
|
+
|
|
37
|
+
### Paso 1: Delegar a OpenSpec explore
|
|
38
|
+
|
|
39
|
+
1. Lee `openspec-explore/SKILL.md` en `.claude/skills/` o `.cursor/skills/`.
|
|
40
|
+
2. Lee `OPENSPEC-DELTAS.md` en `refacil-prereqs` (seccion **explore**).
|
|
41
|
+
3. Sigue OpenSpec con la pregunta que te paso el main agent.
|
|
42
|
+
|
|
43
|
+
### Paso 2: Enriquecer con contexto de AGENTS.md
|
|
44
|
+
|
|
45
|
+
Ademas de lo que OpenSpec explore reporta, agrega:
|
|
46
|
+
- Patrones especificos del proyecto que encontraste en AGENTS.md relevantes a la exploracion.
|
|
47
|
+
- Convenciones que el usuario deberia tener en cuenta si planea hacer cambios en esa area.
|
|
48
|
+
|
|
49
|
+
### Paso 3: Detectar dependencias cross-repo (opcional)
|
|
50
|
+
|
|
51
|
+
Si durante la exploracion detectas que este repo depende de codigo que NO vive aqui (APIs que consume de otro servicio, eventos que recibe/emite, colas compartidas, contratos con un front/back externo), **no asumas el comportamiento del otro lado** — aplica el protocolo de `refacil-prereqs/BUS-CROSS-REPO.md` para consultar al agente del otro repo via el bus.
|
|
52
|
+
|
|
53
|
+
Incorpora la respuesta al reporte como seccion "Contexto cross-repo".
|
|
54
|
+
|
|
55
|
+
### Paso 4: Recomendar siguiente paso
|
|
56
|
+
|
|
57
|
+
Al final del reporte, sugiere:
|
|
58
|
+
- Si el usuario podria querer hacer un cambio: "Ejecuta `/refacil:propose <descripcion>` para crear una propuesta"
|
|
59
|
+
- Si el usuario podria querer investigar mas: "Ejecuta `/refacil:explore <otra pregunta>` para seguir explorando"
|
|
60
|
+
|
|
61
|
+
## Reglas
|
|
62
|
+
|
|
63
|
+
- NO modifiques ningun archivo ni generes codigo.
|
|
64
|
+
- El Paso 3 (bus cross-repo) es **opcional** — aplica solo si hay una dependencia cross-repo real.
|
|
65
|
+
- Responde en espanol con terminos tecnicos en ingles (ver `OPENSPEC-DELTAS.md` y `METHODOLOGY-CONTRACT.md`).
|
|
66
|
+
- Usa modo de salida **conciso** por defecto; si el main agent indica `mode: detailed`, expande cada seccion.
|
|
67
|
+
|
|
68
|
+
## Compatibilidad cross-platform
|
|
69
|
+
|
|
70
|
+
Este sub-agente se instala en `.claude/agents/refacil-investigator.md` (Claude Code) y `.cursor/agents/refacil-investigator.md` (Cursor). En Cursor el frontmatter se transforma a `readonly: true` + `model: inherit`, pero el body es identico en ambos.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refacil-validator
|
|
3
|
+
description: Validador tecnico de implementacion contra specs de OpenSpec. Delegado automaticamente por el skill /refacil:verify — no llamar directo. Corre tests, compara contra la spec del cambio activo y retorna un bloque JSON con issues priorizados. NO aplica correcciones — eso lo hace el skill wrapper con aprobacion del usuario.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# refacil-validator — Validador de implementacion
|
|
9
|
+
|
|
10
|
+
Eres un validador tecnico que comprueba si la implementacion de un cambio cumple con su spec de OpenSpec y con los tests del proyecto.
|
|
11
|
+
|
|
12
|
+
**Prerequisitos**: perfil `openspec` de `refacil-prereqs/SKILL.md` + reglas de `METHODOLOGY-CONTRACT.md`.
|
|
13
|
+
|
|
14
|
+
## Guardrail: deteccion de invocacion directa
|
|
15
|
+
|
|
16
|
+
Estas disenado para ser **delegado por el skill `/refacil:verify`**, que resuelve el scope, decide si aplicar correcciones y re-invoca si hace falta. Si detectas que fuiste invocado **directamente** (prompt sin scope explicito del cambio a validar), tu PRIMERA respuesta debe ser:
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
Parece que me invocaste directo desde el picker. Sin el skill wrapper:
|
|
20
|
+
- no se aplicaran correcciones automaticas si detecto issues
|
|
21
|
+
- el ciclo de re-verificacion no funciona
|
|
22
|
+
|
|
23
|
+
Recomendado: cancela y ejecuta `/refacil:verify` en su lugar.
|
|
24
|
+
|
|
25
|
+
Si prefieres solo el reporte (sin aplicar fixes), respondeme con el scope explicito:
|
|
26
|
+
- nombre del cambio activo en openspec/changes/<nombre>/
|
|
27
|
+
- o rutas especificas a verificar
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**No procedas con lecturas ni corras tests hasta que el usuario confirme scope.**
|
|
31
|
+
|
|
32
|
+
## Reglas criticas del sub-agente
|
|
33
|
+
|
|
34
|
+
- **NO modificas ningun archivo**. No tienes `Edit` ni `Write`. Solo lectura + ejecucion de tests via `Bash`.
|
|
35
|
+
- **NO aplicas correcciones**. Si detectas issues, los listas con severidad en el reporte + bloque JSON; el skill wrapper decide que hacer.
|
|
36
|
+
- **NO creas branches ni hace commits**. El paso de correcciones vive en el wrapper con aprobacion del usuario.
|
|
37
|
+
|
|
38
|
+
## Flujo
|
|
39
|
+
|
|
40
|
+
### Paso 1: Delegar a OpenSpec verify
|
|
41
|
+
|
|
42
|
+
1. Lee `openspec-verify-change/SKILL.md` en `.claude/skills/` o `.cursor/skills/`.
|
|
43
|
+
2. Lee `OPENSPEC-DELTAS.md` en `refacil-prereqs` (seccion **idioma**).
|
|
44
|
+
3. Sigue OpenSpec con el scope que te paso el main agent. Obten el reporte con issues `CRITICAL`/`WARNING`/`SUGGESTION`.
|
|
45
|
+
|
|
46
|
+
### Paso 2: Verificar tests (aporte Refacil)
|
|
47
|
+
|
|
48
|
+
Resuelve y ejecuta el comando de tests segun `refacil-prereqs/METHODOLOGY-CONTRACT.md` §3 y verifica:
|
|
49
|
+
- Todos los tests pasan.
|
|
50
|
+
- Los tests cubren los criterios de aceptacion de la spec.
|
|
51
|
+
- No hay tests faltantes para requisitos clave.
|
|
52
|
+
- Si hay comando de coverage del proyecto, ejecutalo y reporta el porcentaje; si no existe, reporta N/A con justificacion.
|
|
53
|
+
|
|
54
|
+
### Paso 3: Validar ambigüedades cross-repo (opcional)
|
|
55
|
+
|
|
56
|
+
Si detectas que la spec no cubre algo relevante del lado de un consumidor o productor externo, y esa ambigüedad impide decidir si la implementacion es correcta, **no asumas** — aplica el protocolo de `refacil-prereqs/BUS-CROSS-REPO.md` para resolverlo con el agente del otro repo via el bus antes de cerrar el reporte.
|
|
57
|
+
|
|
58
|
+
Incorpora la respuesta como SUGGESTION; si revela un bug real, escalalo a WARNING/CRITICAL.
|
|
59
|
+
|
|
60
|
+
### Paso 4: Reporte combinado + bloque JSON
|
|
61
|
+
|
|
62
|
+
Tu respuesta final DEBE tener esta estructura:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
=== Reporte de Verificacion ===
|
|
66
|
+
|
|
67
|
+
--- OpenSpec Verify ---
|
|
68
|
+
[Resultados del reporte de OpenSpec: CRITICAL, WARNING, SUGGESTION]
|
|
69
|
+
|
|
70
|
+
--- Tests (Refacil) ---
|
|
71
|
+
[PASS/FAIL] Comando de tests: [comando]
|
|
72
|
+
[PASS/FAIL] Tests ejecutados: [N]
|
|
73
|
+
[PASS/FAIL] Tests pasaron: [N]
|
|
74
|
+
[PASS/FAIL/N/A] Coverage: [X]% (minimo requerido: 80%)
|
|
75
|
+
|
|
76
|
+
RESULTADO: APROBADO | REQUIERE CORRECCIONES
|
|
77
|
+
|
|
78
|
+
Correcciones necesarias (solo si REQUIERE CORRECCIONES):
|
|
79
|
+
1. [CRITICAL|WARNING] [descripcion del issue y como corregirlo]
|
|
80
|
+
2. ...
|
|
81
|
+
|
|
82
|
+
```refacil-verify-result
|
|
83
|
+
{
|
|
84
|
+
"result": "APROBADO" | "REQUIERE CORRECCIONES",
|
|
85
|
+
"date": "<fecha ISO actual — obtenla con: date -u +%Y-%m-%dT%H:%M:%SZ>",
|
|
86
|
+
"changeName": "<nombre-cambio o null>",
|
|
87
|
+
"issues": [
|
|
88
|
+
{
|
|
89
|
+
"severity": "CRITICAL" | "WARNING" | "SUGGESTION",
|
|
90
|
+
"source": "openspec" | "tests" | "cross-repo",
|
|
91
|
+
"description": "<problema>",
|
|
92
|
+
"fix": "<accion concreta>"
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"tests": {
|
|
96
|
+
"command": "<comando>",
|
|
97
|
+
"passed": <bool>,
|
|
98
|
+
"total": <int o null>,
|
|
99
|
+
"coverage": <number o null>
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**IMPORTANTE sobre el bloque JSON**:
|
|
106
|
+
- Usa el fence literal ` ```refacil-verify-result ` para que el wrapper lo parsee sin ambiguedad.
|
|
107
|
+
- Emitelo SIEMPRE, incluso si `result` es APROBADO (el wrapper lo usa para decidir si sugerir `/refacil:review` o pedir aprobacion de correcciones).
|
|
108
|
+
- `date` debe ser timestamp ISO real. Corre `date -u +%Y-%m-%dT%H:%M:%SZ` via Bash si no estas seguro.
|
|
109
|
+
- `issues` debe ser array vacio `[]` si no hay issues.
|
|
110
|
+
|
|
111
|
+
## Reglas
|
|
112
|
+
|
|
113
|
+
- **NUNCA modificas codigo por cuenta propia**. Solo reportas.
|
|
114
|
+
- Se estricto con los criterios de la spec.
|
|
115
|
+
- Si algo no esta en la spec pero parece necesario, mencionarlo como SUGGESTION (no CRITICAL/WARNING).
|
|
116
|
+
- Usa modo de salida **conciso** por defecto; si el main agent indica `mode: detailed`, expande las secciones.
|
|
117
|
+
- El Paso 3 (bus cross-repo) es **opcional** — solo invocarlo si hay una ambigüedad real cross-repo que bloquea el veredicto.
|
|
118
|
+
|
|
119
|
+
## Compatibilidad cross-platform
|
|
120
|
+
|
|
121
|
+
Este sub-agente se instala en `.claude/agents/refacil-validator.md` (Claude Code) y `.cursor/agents/refacil-validator.md` (Cursor). En Cursor el frontmatter se transforma a `readonly: true` + `model: inherit`, pero el body y el contrato del bloque `refacil-verify-result` son identicos en ambos.
|
package/bin/cli.js
CHANGED
|
@@ -36,6 +36,15 @@ const SKILLS = [
|
|
|
36
36
|
'attend',
|
|
37
37
|
];
|
|
38
38
|
|
|
39
|
+
// Sub-agentes instalados en .claude/agents/ y .cursor/agents/.
|
|
40
|
+
// Fuente: refacil-sdd-ai/agents/<name>.md (un solo archivo, frontmatter estilo Claude Code).
|
|
41
|
+
// El installer lo copia verbatim a Claude y transforma el frontmatter para Cursor.
|
|
42
|
+
const AGENTS = [
|
|
43
|
+
'auditor',
|
|
44
|
+
'investigator',
|
|
45
|
+
'validator',
|
|
46
|
+
];
|
|
47
|
+
|
|
39
48
|
const packageRoot = path.resolve(__dirname, '..');
|
|
40
49
|
const projectRoot = process.cwd();
|
|
41
50
|
|
|
@@ -74,6 +83,87 @@ function installSkills() {
|
|
|
74
83
|
return installed;
|
|
75
84
|
}
|
|
76
85
|
|
|
86
|
+
// Transforma el frontmatter de un sub-agente Claude Code al formato Cursor.
|
|
87
|
+
// Claude Code: `tools:` (allowlist granular), `model: sonnet|opus|haiku`
|
|
88
|
+
// Cursor: `readonly: true|false` (booleano), `model: inherit` (default).
|
|
89
|
+
//
|
|
90
|
+
// Reglas:
|
|
91
|
+
// - Si tools NO incluye Edit ni Write → readonly: true (reviewer-style, read-only).
|
|
92
|
+
// - Si tools SI incluye Edit o Write → readonly: false.
|
|
93
|
+
// - model: sonnet|opus|haiku → model: inherit (Cursor decide).
|
|
94
|
+
// - model: <id explicito tipo claude-sonnet-4-6> → se mantiene.
|
|
95
|
+
// - Body (todo despues del segundo ---) se preserva verbatim.
|
|
96
|
+
function transformFrontmatterForCursor(content) {
|
|
97
|
+
const match = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
|
|
98
|
+
if (!match) return content; // sin frontmatter reconocible, copiamos tal cual
|
|
99
|
+
|
|
100
|
+
const [, frontmatterRaw, body] = match;
|
|
101
|
+
const lines = frontmatterRaw.split('\n');
|
|
102
|
+
const out = [];
|
|
103
|
+
let toolsLine = null;
|
|
104
|
+
let hasReadonly = false;
|
|
105
|
+
|
|
106
|
+
for (const line of lines) {
|
|
107
|
+
if (line.startsWith('tools:')) {
|
|
108
|
+
toolsLine = line;
|
|
109
|
+
continue; // se omite: Cursor no lo entiende
|
|
110
|
+
}
|
|
111
|
+
if (line.startsWith('readonly:')) {
|
|
112
|
+
hasReadonly = true;
|
|
113
|
+
out.push(line);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
if (line.startsWith('model:')) {
|
|
117
|
+
const value = line.slice('model:'.length).trim();
|
|
118
|
+
if (value === 'sonnet' || value === 'opus' || value === 'haiku') {
|
|
119
|
+
out.push('model: inherit');
|
|
120
|
+
} else {
|
|
121
|
+
out.push(line);
|
|
122
|
+
}
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
out.push(line);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Si el agente declaraba tools explicito y no tenia readonly,
|
|
129
|
+
// inferimos readonly a partir de tools.
|
|
130
|
+
if (toolsLine && !hasReadonly) {
|
|
131
|
+
const toolsList = toolsLine.slice('tools:'.length).trim();
|
|
132
|
+
const canWrite = /\b(Edit|Write|NotebookEdit)\b/.test(toolsList);
|
|
133
|
+
out.push(`readonly: ${canWrite ? 'false' : 'true'}`);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return `---\n${out.join('\n')}\n---\n${body}`;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function installAgents() {
|
|
140
|
+
let installed = 0;
|
|
141
|
+
|
|
142
|
+
const claudeDir = path.join(projectRoot, '.claude', 'agents');
|
|
143
|
+
const cursorDir = path.join(projectRoot, '.cursor', 'agents');
|
|
144
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
145
|
+
fs.mkdirSync(cursorDir, { recursive: true });
|
|
146
|
+
|
|
147
|
+
for (const agent of AGENTS) {
|
|
148
|
+
const srcFile = path.join(packageRoot, 'agents', `${agent}.md`);
|
|
149
|
+
if (!fs.existsSync(srcFile)) continue;
|
|
150
|
+
|
|
151
|
+
const content = fs.readFileSync(srcFile, 'utf8');
|
|
152
|
+
|
|
153
|
+
// Claude Code: copia verbatim
|
|
154
|
+
const claudeDest = path.join(claudeDir, `refacil-${agent}.md`);
|
|
155
|
+
fs.writeFileSync(claudeDest, content);
|
|
156
|
+
|
|
157
|
+
// Cursor: transforma frontmatter
|
|
158
|
+
const cursorDest = path.join(cursorDir, `refacil-${agent}.md`);
|
|
159
|
+
fs.writeFileSync(cursorDest, transformFrontmatterForCursor(content));
|
|
160
|
+
|
|
161
|
+
installed++;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return installed;
|
|
165
|
+
}
|
|
166
|
+
|
|
77
167
|
const SDD_SECTION_MARKER = '## Metodologia SDD-AI (Refacil)';
|
|
78
168
|
|
|
79
169
|
function extractSddSection(templateContent) {
|
|
@@ -516,6 +606,13 @@ function init() {
|
|
|
516
606
|
// Install skills
|
|
517
607
|
const count = installSkills();
|
|
518
608
|
console.log(` ${count} skills instaladas en .claude/skills/ y .cursor/skills/`);
|
|
609
|
+
|
|
610
|
+
// Install sub-agents
|
|
611
|
+
const agentsCount = installAgents();
|
|
612
|
+
if (agentsCount > 0) {
|
|
613
|
+
console.log(` ${agentsCount} sub-agentes instalados en .claude/agents/ y .cursor/agents/`);
|
|
614
|
+
}
|
|
615
|
+
|
|
519
616
|
writeRepoVersion(projectRoot, getPackageVersion());
|
|
520
617
|
|
|
521
618
|
// Create or update CLAUDE.md
|
|
@@ -559,6 +656,12 @@ function update() {
|
|
|
559
656
|
console.log('\n refacil-sdd-ai: Actualizando skills...\n');
|
|
560
657
|
const count = installSkills();
|
|
561
658
|
console.log(` ${count} skills actualizadas en .claude/skills/ y .cursor/skills/`);
|
|
659
|
+
|
|
660
|
+
const agentsCount = installAgents();
|
|
661
|
+
if (agentsCount > 0) {
|
|
662
|
+
console.log(` ${agentsCount} sub-agentes actualizados en .claude/agents/ y .cursor/agents/`);
|
|
663
|
+
}
|
|
664
|
+
|
|
562
665
|
writeRepoVersion(projectRoot, getPackageVersion());
|
|
563
666
|
|
|
564
667
|
// Ensure hook is installed (for users updating from versions without hook)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "refacil-sdd-ai",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "SDD-AI: Specification-Driven Development with AI — metodologia de desarrollo con IA usando OpenSpec, Claude Code y Cursor",
|
|
5
5
|
"bin": {
|
|
6
6
|
"refacil-sdd-ai": "./bin/cli.js"
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"bin/",
|
|
10
10
|
"lib/",
|
|
11
11
|
"skills/",
|
|
12
|
+
"agents/",
|
|
12
13
|
"templates/",
|
|
13
14
|
"config/",
|
|
14
15
|
"README.md"
|
package/skills/explore/SKILL.md
CHANGED
|
@@ -1,42 +1,51 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: refacil:explore
|
|
3
|
-
description: Explorar e investigar el codebase antes de hacer cambios —
|
|
3
|
+
description: Explorar e investigar el codebase antes de hacer cambios — delega al sub-agente refacil-investigator para analizar arquitectura, flujos y dependencias sin modificar nada
|
|
4
4
|
user-invocable: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# refacil:explore —
|
|
7
|
+
# refacil:explore — Entrypoint de Exploracion
|
|
8
8
|
|
|
9
|
-
Este
|
|
9
|
+
Este skill es un **wrapper delgado** que delega la investigacion al sub-agente `refacil-investigator`. El sub-agente corre en contexto aislado (no satura tu sesion principal con lecturas masivas de archivos) y retorna un reporte conciso con arquitectura, flujos y recomendaciones.
|
|
10
10
|
|
|
11
11
|
**Prerequisitos**: perfil `openspec` de `refacil-prereqs/SKILL.md` — usa `AGENTS.md` como contexto activo durante toda la exploracion.
|
|
12
12
|
|
|
13
|
-
##
|
|
13
|
+
## Flujo
|
|
14
14
|
|
|
15
|
-
### Paso
|
|
15
|
+
### Paso 0: Validar pregunta
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
3. Sigue OpenSpec con argumento **$ARGUMENTS**.
|
|
17
|
+
- Si `$ARGUMENTS` viene vacio, pide al usuario la pregunta o topico a explorar ANTES de invocar al sub-agente.
|
|
18
|
+
- Si hay pregunta, continua.
|
|
20
19
|
|
|
21
|
-
### Paso
|
|
20
|
+
### Paso 1: Delegar al sub-agente refacil-investigator
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
22
|
+
Invoca al sub-agente `refacil-investigator` pasandole:
|
|
23
|
+
- La pregunta del usuario (`$ARGUMENTS`).
|
|
24
|
+
- Si el usuario pidio modo detallado explicitamente, indicaselo (`mode: detailed`). Default: conciso.
|
|
26
25
|
|
|
27
|
-
|
|
26
|
+
El sub-agente:
|
|
27
|
+
- Delega a OpenSpec explore para la exploracion base.
|
|
28
|
+
- Enriquece con patrones y convenciones de `AGENTS.md`.
|
|
29
|
+
- Detecta dependencias cross-repo y, si corresponde, consulta el bus segun `refacil-prereqs/BUS-CROSS-REPO.md`.
|
|
30
|
+
- Retorna un reporte con arquitectura, flujos, dependencias y recomendaciones de siguiente paso.
|
|
28
31
|
|
|
29
|
-
|
|
32
|
+
### Paso 2: Presentar el reporte
|
|
30
33
|
|
|
31
|
-
|
|
34
|
+
Muestra al usuario el reporte completo que retorno el sub-agente. No hay artefactos que escribir — exploracion es puramente analitica.
|
|
32
35
|
|
|
33
|
-
|
|
36
|
+
Si el sub-agente pidio clarificacion (porque el prompt no traia pregunta explicita), propaga la pregunta al usuario.
|
|
34
37
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
- Si el usuario
|
|
38
|
+
### Paso 3: Siguiente paso
|
|
39
|
+
|
|
40
|
+
El sub-agente ya incluye recomendaciones al final de su reporte. Si el usuario responde a alguna (ej. "si quiero crear la propuesta"), redirigelo al skill correspondiente (`/refacil:propose`, `/refacil:bug`, etc.).
|
|
38
41
|
|
|
39
42
|
## Reglas
|
|
40
43
|
|
|
41
|
-
-
|
|
42
|
-
-
|
|
44
|
+
- **Siempre delega al sub-agente**. No repliques la logica de exploracion aqui.
|
|
45
|
+
- **No invoques sin pregunta**. Si `$ARGUMENTS` esta vacio, pide la pregunta primero.
|
|
46
|
+
- **No escribes archivos**. Exploracion es read-only end-to-end.
|
|
47
|
+
|
|
48
|
+
## Ver tambien
|
|
49
|
+
|
|
50
|
+
- Sub-agente: `.claude/agents/refacil-investigator.md` (fuente: `refacil-sdd-ai/agents/investigator.md`)
|
|
51
|
+
- Bus cross-repo: `refacil-prereqs/BUS-CROSS-REPO.md`
|
package/skills/review/SKILL.md
CHANGED
|
@@ -1,126 +1,112 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: refacil:review
|
|
3
|
-
description: Review de codigo con el checklist de calidad del equipo —
|
|
3
|
+
description: Review de codigo con el checklist de calidad del equipo — delega al sub-agente refacil-auditor y procesa el veredicto
|
|
4
4
|
user-invocable: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# refacil:review —
|
|
7
|
+
# refacil:review — Entrypoint del Review
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Este skill es un **wrapper delgado** que delega el review pesado al sub-agente `refacil-auditor`. El sub-agente corre en contexto aislado (no satura tu sesion principal con lecturas de checklists + archivos del cambio) y retorna un reporte conciso + un bloque JSON con el veredicto.
|
|
10
10
|
|
|
11
11
|
**Prerequisitos**: perfil `agents` de `refacil-prereqs/SKILL.md` + modo de salida de `METHODOLOGY-CONTRACT.md`.
|
|
12
12
|
|
|
13
|
-
##
|
|
13
|
+
## Flujo
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
2. **Detecta el tipo de proyecto** inspeccionando dependencias, `AGENTS.md`, o la estructura del repo:
|
|
17
|
-
- Si tiene frameworks de servidor, APIs, microservicios, acceso a BD, colas o workers → lee tambien [checklist-back.md](checklist-back.md)
|
|
18
|
-
- Si tiene estructura de componentes UI, manejo de estado en cliente, rutas/vistas o consume APIs para renderizar interfaces → lee tambien [checklist-front.md](checklist-front.md)
|
|
19
|
-
- Si es fullstack (tiene ambos) → lee ambos checklists especificos
|
|
20
|
-
3. Evalua **solo** los items de los checklists que apliquen. Marca N/A en items que no correspondan al tipo de proyecto.
|
|
15
|
+
### Paso 0: Resolver alcance
|
|
21
16
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
### Paso 0: Definir alcance (obligatorio)
|
|
25
|
-
|
|
26
|
-
- Determina el alcance real del review antes de evaluar.
|
|
27
|
-
- Prioriza este orden:
|
|
17
|
+
- Determina el alcance del review ANTES de invocar al sub-agente. Prioriza este orden:
|
|
28
18
|
1) Argumento del usuario (`$ARGUMENTS`)
|
|
29
19
|
2) Cambio activo en `openspec/changes/`
|
|
30
20
|
3) Cambios no commiteados (`git diff`)
|
|
31
|
-
- Si hay multiples cambios activos en `openspec/changes/` y no hay `$ARGUMENTS`, **detente** y pide al usuario seleccionar explicitamente cual cambio revisar.
|
|
32
|
-
- No ejecutes review masivo por defecto cuando hay multiples cambios activos.
|
|
21
|
+
- Si hay multiples cambios activos en `openspec/changes/` y no hay `$ARGUMENTS`, **detente** y pide al usuario seleccionar explicitamente cual cambio revisar. **No invoques al sub-agente con scope ambiguo.**
|
|
33
22
|
|
|
34
23
|
**Review ya aprobado**: Si el cambio objetivo ya tiene `.review-passed`, verifica si hay cambios posteriores al review:
|
|
35
24
|
1. Lee la `date` del `.review-passed`.
|
|
36
|
-
2. Compara con `git log --since="[date]" --oneline` y `git status --porcelain
|
|
37
|
-
3. **Si hay cambios nuevos**: elimina el `.review-passed` anterior y
|
|
38
|
-
4. **Si NO hay cambios nuevos**: informa al usuario y
|
|
25
|
+
2. Compara con `git log --since="[date]" --oneline` y `git status --porcelain`.
|
|
26
|
+
3. **Si hay cambios nuevos**: elimina el `.review-passed` anterior y continua (invoca al sub-agente para re-evaluar).
|
|
27
|
+
4. **Si NO hay cambios nuevos**: informa al usuario y termina sin invocar al sub-agente:
|
|
39
28
|
```
|
|
40
29
|
El cambio [nombre] ya tiene review aprobado ([verdict] — [date]) y no hay cambios posteriores.
|
|
41
30
|
```
|
|
42
31
|
|
|
43
|
-
### Paso 1:
|
|
44
|
-
|
|
45
|
-
Si hay un cambio activo en `openspec/changes/`, usalo como referencia.
|
|
46
|
-
Si hay multiples cambios y el usuario ya selecciono uno, revisa solo ese cambio.
|
|
47
|
-
Si el usuario paso un argumento ($ARGUMENTS), revisa ese archivo o carpeta especifica.
|
|
48
|
-
Si no hay cambio activo ni argumento, revisa los cambios no commiteados (git diff).
|
|
49
|
-
|
|
50
|
-
### Paso 2: Recopilar archivos a revisar
|
|
51
|
-
|
|
52
|
-
- Lee los artefactos de OpenSpec si existen (specs, design)
|
|
53
|
-
- Identifica todos los archivos creados/modificados
|
|
54
|
-
- Lee cada archivo para entender los cambios
|
|
55
|
-
|
|
56
|
-
### Paso 3: Evaluar contra checklist
|
|
57
|
-
|
|
58
|
-
Para CADA item del [checklist.md](checklist.md), evalua:
|
|
59
|
-
|
|
60
|
-
- **PASS**: Cumple completamente
|
|
61
|
-
- **FAIL**: No cumple (incluir explicacion y como corregir)
|
|
62
|
-
- **N/A**: No aplica a este cambio
|
|
63
|
-
|
|
64
|
-
Se especifico en las evaluaciones. No des PASS generico — justifica brevemente.
|
|
32
|
+
### Paso 1: Delegar al sub-agente refacil-auditor
|
|
65
33
|
|
|
66
|
-
|
|
34
|
+
Invoca al sub-agente `refacil-auditor` pasandole:
|
|
35
|
+
- El **scope resuelto** (nombre del cambio activo, rutas especificas, o "git-diff" para cambios no commiteados).
|
|
36
|
+
- Si el usuario pidio modo detallado explicitamente, indicaselo (`mode: detailed`). Default: conciso.
|
|
67
37
|
|
|
68
|
-
-
|
|
69
|
-
-
|
|
70
|
-
-
|
|
71
|
-
-
|
|
38
|
+
El sub-agente:
|
|
39
|
+
- Lee los checklists (`checklist.md`, `checklist-back.md`, `checklist-front.md` segun aplique).
|
|
40
|
+
- Lee los archivos del scope y los artefactos de OpenSpec.
|
|
41
|
+
- Evalua cada item con PASS/FAIL/N/A + severidad en cada FAIL.
|
|
42
|
+
- Retorna UN solo mensaje con el reporte + bloque JSON fenced como ` ```refacil-review-result `.
|
|
72
43
|
|
|
73
|
-
|
|
44
|
+
### Paso 2: Procesar el reporte del sub-agente
|
|
74
45
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
Por defecto, usa salida **concisa** (segun `METHODOLOGY-CONTRACT.md`):
|
|
46
|
+
El sub-agente retorna algo asi:
|
|
78
47
|
|
|
79
48
|
```
|
|
80
49
|
=== Review Report ===
|
|
81
50
|
VEREDICTO: APROBADO | APROBADO CON OBSERVACIONES | REQUIERE CORRECCIONES
|
|
82
|
-
BLOCKERS:
|
|
51
|
+
BLOCKERS: si | no
|
|
83
52
|
|
|
84
53
|
## Hallazgos priorizados (solo FAIL, maximo 5)
|
|
85
|
-
|
|
86
|
-
- Evidencia: [archivo/rango o comportamiento]
|
|
87
|
-
- Correccion sugerida: [accion concreta]
|
|
54
|
+
...
|
|
88
55
|
|
|
89
56
|
## Correcciones minimas para aprobar
|
|
90
|
-
|
|
91
|
-
2. [item accionable]
|
|
57
|
+
...
|
|
92
58
|
|
|
93
59
|
Siguiente paso: [/refacil:archive | /refacil:verify]
|
|
60
|
+
|
|
61
|
+
```refacil-review-result
|
|
62
|
+
{
|
|
63
|
+
"verdict": "APROBADO" | "APROBADO CON OBSERVACIONES" | "REQUIERE CORRECCIONES",
|
|
64
|
+
"date": "<ISO>",
|
|
65
|
+
"changeName": "<nombre-cambio o null>",
|
|
66
|
+
"summary": "<resumen 1 linea>",
|
|
67
|
+
"failCount": <int>,
|
|
68
|
+
"blockers": <bool>
|
|
69
|
+
}
|
|
70
|
+
```
|
|
94
71
|
```
|
|
95
72
|
|
|
96
|
-
|
|
73
|
+
Muestra al usuario el **reporte conciso** (todo lo anterior al bloque `refacil-review-result`). No muestres el bloque JSON — es metadata interna.
|
|
97
74
|
|
|
98
|
-
|
|
75
|
+
**Si el sub-agente retorno `SCOPE_ERROR: <razon>`**: propaga el error al usuario y pide clarificacion. No escribas marker.
|
|
99
76
|
|
|
100
|
-
|
|
77
|
+
### Paso 3: Crear marcador `.review-passed` (si aplica)
|
|
101
78
|
|
|
102
|
-
|
|
79
|
+
Parsea el bloque ` ```refacil-review-result ` del sub-agente. Si `verdict` es **APROBADO** o **APROBADO CON OBSERVACIONES** y `changeName` no es null:
|
|
103
80
|
|
|
104
|
-
**
|
|
81
|
+
**Ruta:** `openspec/changes/<changeName>/.review-passed`
|
|
82
|
+
|
|
83
|
+
**Contenido (el JSON parseado del bloque, verbatim):**
|
|
105
84
|
```json
|
|
106
85
|
{
|
|
107
86
|
"verdict": "APROBADO|APROBADO CON OBSERVACIONES",
|
|
108
|
-
"date": "<
|
|
87
|
+
"date": "<ISO>",
|
|
109
88
|
"changeName": "<nombre-cambio>",
|
|
110
|
-
"summary": "<resumen
|
|
111
|
-
"failCount": <
|
|
89
|
+
"summary": "<resumen 1 linea>",
|
|
90
|
+
"failCount": <int>,
|
|
112
91
|
"blockers": false
|
|
113
92
|
}
|
|
114
93
|
```
|
|
115
94
|
|
|
116
|
-
|
|
95
|
+
**No crees el marker si:**
|
|
96
|
+
- `verdict` es `REQUIERE CORRECCIONES`.
|
|
97
|
+
- `changeName` es null (review de git-diff o de archivos sueltos sin cambio activo).
|
|
98
|
+
- El sub-agente retorno `SCOPE_ERROR`.
|
|
99
|
+
|
|
100
|
+
Este archivo es evidencia de que el review se completo y es requerido por el hook `PreToolUse` antes de permitir `git push`.
|
|
117
101
|
|
|
118
102
|
## Reglas
|
|
119
103
|
|
|
120
|
-
-
|
|
121
|
-
-
|
|
122
|
-
-
|
|
123
|
-
- Si
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
104
|
+
- **Siempre delega al sub-agente**. No repliques la logica de checklists ni de evaluacion aqui — eso vive en `refacil-auditor`.
|
|
105
|
+
- **El marker lo crea este skill, no el sub-agente**. Es la unica operacion de escritura, y queda fuera del contexto aislado del sub-agente (compatible con `readonly: true` de Cursor).
|
|
106
|
+
- **No muestres el bloque JSON al usuario**. Es solo para que tu (el wrapper) escribas el marker.
|
|
107
|
+
- Si el sub-agente retorno algo fuera de formato (sin bloque JSON parseable y no es `SCOPE_ERROR`), informa al usuario: "El reviewer retorno un reporte no estructurado — no se creo marker. Revisa el reporte manualmente."
|
|
108
|
+
|
|
109
|
+
## Ver tambien
|
|
110
|
+
|
|
111
|
+
- Sub-agente: `.claude/agents/refacil-auditor.md` (fuente: `refacil-sdd-ai/agents/reviewer.md`)
|
|
112
|
+
- Checklists: `checklist.md`, `checklist-back.md`, `checklist-front.md` en este mismo directorio.
|
package/skills/verify/SKILL.md
CHANGED
|
@@ -1,101 +1,97 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: refacil:verify
|
|
3
|
-
description: Validar que la implementacion cumple con las specs —
|
|
3
|
+
description: Validar que la implementacion cumple con las specs — delega al sub-agente refacil-validator para el reporte y maneja correcciones con aprobacion del usuario
|
|
4
4
|
user-invocable: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# refacil:verify —
|
|
7
|
+
# refacil:verify — Entrypoint de Verificacion
|
|
8
8
|
|
|
9
|
-
Este
|
|
9
|
+
Este skill es un **wrapper** que delega el analisis pesado (lectura de specs + tests + archivos) al sub-agente `refacil-validator`, y maneja la interaccion con el usuario para aplicar correcciones cuando hay issues.
|
|
10
10
|
|
|
11
11
|
**Prerequisitos**: perfil `openspec` de `refacil-prereqs/SKILL.md` + reglas de `METHODOLOGY-CONTRACT.md`.
|
|
12
12
|
|
|
13
|
-
##
|
|
13
|
+
## Flujo
|
|
14
14
|
|
|
15
|
-
### Paso
|
|
15
|
+
### Paso 0: Resolver scope
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
Determina el scope antes de invocar al sub-agente. Prioriza este orden:
|
|
18
|
+
1. Argumento del usuario (`$ARGUMENTS`).
|
|
19
|
+
2. Cambio activo en `openspec/changes/`.
|
|
20
|
+
3. Si hay multiples cambios activos y no hay `$ARGUMENTS`, **detente** y pide al usuario seleccionar explicitamente cual cambio validar.
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
No invoques al sub-agente con scope ambiguo.
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
- Todos los tests pasan
|
|
25
|
-
- Los tests cubren los criterios de aceptacion de la spec
|
|
26
|
-
- No hay tests faltantes para requisitos clave
|
|
27
|
-
- Si hay comando de coverage del proyecto, ejecutalo y reporta el porcentaje; si no existe, reporta N/A con justificacion
|
|
24
|
+
### Paso 1: Delegar al sub-agente refacil-validator
|
|
28
25
|
|
|
29
|
-
|
|
26
|
+
Invoca a `refacil-validator` pasandole:
|
|
27
|
+
- El scope resuelto (nombre del cambio activo o rutas).
|
|
28
|
+
- Si el usuario pidio modo detallado, indicaselo (`mode: detailed`). Default: conciso.
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
El sub-agente:
|
|
31
|
+
- Delega a OpenSpec verify para issues contra la spec.
|
|
32
|
+
- Resuelve y corre el comando de tests del proyecto + coverage si aplica.
|
|
33
|
+
- Opcionalmente consulta el bus cross-repo ante ambigüedades.
|
|
34
|
+
- Retorna reporte combinado + bloque JSON fenced como ` ```refacil-verify-result `.
|
|
32
35
|
|
|
33
|
-
|
|
34
|
-
=== Reporte de Verificacion ===
|
|
35
|
-
|
|
36
|
-
--- OpenSpec Verify ---
|
|
37
|
-
[Resultados del reporte de OpenSpec: CRITICAL, WARNING, SUGGESTION]
|
|
38
|
-
|
|
39
|
-
--- Tests (Refacil) ---
|
|
40
|
-
[PASS/FAIL] Comando de tests: [comando]
|
|
41
|
-
[PASS/FAIL] Tests ejecutados: [N]
|
|
42
|
-
[PASS/FAIL] Tests pasaron: [N]
|
|
43
|
-
[PASS/FAIL/N/A] Coverage: [X]% (minimo requerido: 80%)
|
|
36
|
+
### Paso 2: Presentar el reporte
|
|
44
37
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
Correcciones necesarias:
|
|
48
|
-
1. [issues de OpenSpec]
|
|
49
|
-
2. [issues de tests]
|
|
50
|
-
```
|
|
38
|
+
Muestra el **reporte combinado** (todo lo anterior al bloque `refacil-verify-result`) al usuario. No muestres el bloque JSON — es metadata interna.
|
|
51
39
|
|
|
52
|
-
|
|
40
|
+
**Si el sub-agente retorno un error de scope** (sin bloque JSON): propaga al usuario y pide clarificacion.
|
|
53
41
|
|
|
54
|
-
|
|
42
|
+
### Paso 3: Procesar el resultado
|
|
55
43
|
|
|
56
|
-
|
|
44
|
+
Parsea el bloque ` ```refacil-verify-result ` del sub-agente.
|
|
57
45
|
|
|
58
|
-
|
|
46
|
+
#### Si `result` es APROBADO (sin issues CRITICAL ni WARNING):
|
|
59
47
|
|
|
60
|
-
|
|
48
|
+
Felicita y sugiere:
|
|
49
|
+
```
|
|
50
|
+
RESULTADO: APROBADO
|
|
61
51
|
|
|
62
|
-
|
|
52
|
+
Siguiente paso: `/refacil:review` para el review con checklist del equipo.
|
|
53
|
+
```
|
|
63
54
|
|
|
64
|
-
#### Si REQUIERE CORRECCIONES
|
|
55
|
+
#### Si `result` es REQUIERE CORRECCIONES:
|
|
65
56
|
|
|
66
|
-
Presenta
|
|
57
|
+
Presenta los issues (ya vienen en el reporte) y pregunta:
|
|
67
58
|
|
|
68
59
|
```
|
|
69
60
|
RESULTADO: REQUIERE CORRECCIONES
|
|
70
61
|
|
|
71
62
|
Correcciones necesarias:
|
|
72
|
-
1. [CRITICAL/WARNING] [descripcion
|
|
73
|
-
2.
|
|
63
|
+
1. [CRITICAL/WARNING] [descripcion] — [fix sugerido]
|
|
64
|
+
2. ...
|
|
74
65
|
|
|
75
66
|
Quieres que aplique estas correcciones? (si/no)
|
|
76
67
|
- Si: aplicare los fixes y re-verificare automaticamente
|
|
77
68
|
- No: puedes corregirlos manualmente y ejecutar /refacil:verify de nuevo
|
|
78
69
|
```
|
|
79
70
|
|
|
80
|
-
|
|
71
|
+
### Paso 4: Aplicar correcciones (si el usuario acepta)
|
|
72
|
+
|
|
73
|
+
**Solo aplica fixes despues de aprobacion explicita del usuario.**
|
|
81
74
|
|
|
82
75
|
1. Aplica SOLO las correcciones listadas — no agregar funcionalidad nueva, no refactorizar codigo no relacionado, no cambiar nada fuera del alcance de los issues reportados.
|
|
83
76
|
2. Si hay tests que necesitan ajuste por las correcciones, ajustarlos tambien.
|
|
84
77
|
3. Muestra un resumen breve de los archivos modificados.
|
|
85
|
-
4. Re-ejecuta automaticamente
|
|
86
|
-
5. Si la re-verificacion encuentra nuevos issues, repite este ciclo (maximo 2 rondas de correccion automatica). Si despues de 2 rondas aun hay issues, lista los pendientes para correccion manual.
|
|
78
|
+
4. **Re-ejecuta automaticamente desde el Paso 1** (re-invoca al sub-agente) para confirmar que las correcciones resolvieron los issues.
|
|
79
|
+
5. Si la re-verificacion encuentra nuevos issues, repite este ciclo (**maximo 2 rondas** de correccion automatica). Si despues de 2 rondas aun hay issues, lista los pendientes para correccion manual.
|
|
87
80
|
|
|
88
81
|
**Si el usuario no acepta:**
|
|
89
82
|
|
|
90
|
-
Lista los issues para que el usuario los corrija manualmente. Sugiere
|
|
83
|
+
Lista los issues para que el usuario los corrija manualmente. Sugiere `/refacil:verify` de nuevo cuando termine.
|
|
91
84
|
|
|
92
85
|
## Reglas
|
|
93
86
|
|
|
94
|
-
- **
|
|
95
|
-
- Las correcciones SOLO
|
|
96
|
-
-
|
|
97
|
-
- Las correcciones deben ser quirurgicas
|
|
98
|
-
-
|
|
99
|
-
- Si algo
|
|
100
|
-
|
|
101
|
-
|
|
87
|
+
- **Siempre delega al sub-agente** para el analisis (pasos 1-3). No repliques aqui la logica de lectura de specs ni de ejecucion de tests.
|
|
88
|
+
- **Las correcciones SOLO las aplica este wrapper** (Paso 4), despues de aprobacion explicita del usuario. El sub-agente es read-only.
|
|
89
|
+
- **No muestres el bloque JSON al usuario**. Es solo metadata para parsear el resultado.
|
|
90
|
+
- **Las correcciones deben ser quirurgicas**: solo lo necesario para resolver los issues reportados.
|
|
91
|
+
- Maximo 2 rondas de correccion automatica antes de escalar a manual.
|
|
92
|
+
- Si el sub-agente retorno algo fuera de formato (sin bloque JSON parseable), informa al usuario: "El validator retorno un reporte no estructurado — continua manualmente con las correcciones."
|
|
93
|
+
|
|
94
|
+
## Ver tambien
|
|
95
|
+
|
|
96
|
+
- Sub-agente: `.claude/agents/refacil-validator.md` (fuente: `refacil-sdd-ai/agents/validator.md`)
|
|
97
|
+
- Bus cross-repo: `refacil-prereqs/BUS-CROSS-REPO.md`
|