refacil-sdd-ai 4.0.0 → 4.0.2
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 +10 -6
- package/bin/cli.js +42 -20
- package/lib/hooks.js +21 -0
- package/package.json +1 -1
- package/skills/prereqs/OPENSPEC-DELTAS.md +1 -1
- package/skills/propose/SKILL.md +2 -2
- package/skills/setup/SKILL.md +91 -7
- package/skills/setup/troubleshooting.md +9 -3
- package/skills/update/SKILL.md +27 -2
package/README.md
CHANGED
|
@@ -71,9 +71,10 @@ npm uninstall -g refacil-sdd-ai
|
|
|
71
71
|
|
|
72
72
|
| Comando | Descripcion |
|
|
73
73
|
|---|---|
|
|
74
|
-
| `refacil-sdd-ai check-update` | Verifica nueva version
|
|
75
|
-
| `refacil-sdd-ai
|
|
76
|
-
| `refacil-sdd-ai
|
|
74
|
+
| `refacil-sdd-ai check-update` | (`SessionStart`) Verifica nueva version, sincroniza skills y `compact-guidance` en AGENTS.md |
|
|
75
|
+
| `refacil-sdd-ai notify-update` | (`UserPromptSubmit`) Notifica al LLM sobre migraciones pendientes en el primer mensaje del usuario |
|
|
76
|
+
| `refacil-sdd-ai check-review` | (`PreToolUse`) Bloquea `git push` si falta `.review-passed` en algun cambio activo |
|
|
77
|
+
| `refacil-sdd-ai compact-bash` | (`PreToolUse`) Reescribe comandos Bash bare via `updatedInput` |
|
|
77
78
|
|
|
78
79
|
### Control del rewrite de comandos (`compact-bash`)
|
|
79
80
|
|
|
@@ -232,11 +233,14 @@ Se instalan en `.claude/settings.json` **y** `.cursor/settings.json` durante `in
|
|
|
232
233
|
|
|
233
234
|
| Hook | Evento | Que hace |
|
|
234
235
|
|---|---|---|
|
|
235
|
-
| `check-update` | `SessionStart` | Chequea nueva version en npm, la instala, y **sincroniza el bloque `compact-guidance`** en `AGENTS.md`. |
|
|
236
|
+
| `check-update` | `SessionStart` | Chequea nueva version en npm, la instala, sincroniza skills y **sincroniza el bloque `compact-guidance`** en `AGENTS.md`. Si hubo actualizacion, escribe un flag de notificacion para el siguiente hook. |
|
|
237
|
+
| `notify-update` | `UserPromptSubmit` | Lee el flag de actualizacion pendiente. Si existe, lo inyecta como `[ACCION REQUERIDA]` en el contexto del primer mensaje del usuario para que el LLM lo procese y ofrezca ejecutar `/refacil:update`. El flag se borra tras notificar. |
|
|
236
238
|
| `compact-bash` | `PreToolUse` (Bash) | Reescribe silenciosamente comandos Bash bare via `updatedInput`. Sin turnos extra, sin que el IDE vea el cambio. Requiere Claude Code >= 2.1.89. |
|
|
237
239
|
| `check-review` | `PreToolUse` (Bash) | Intercepta `git push` y bloquea si falta `.review-passed` en algun cambio activo. |
|
|
238
240
|
|
|
239
|
-
Los
|
|
241
|
+
Los cuatro hooks se instalan en `.claude/settings.json` (Claude Code) y `.cursor/settings.json` (Cursor) con la misma logica parametrica.
|
|
242
|
+
|
|
243
|
+
> **Por que dos hooks para el update?** `SessionStart` hace el sync silencioso al abrir la sesion, pero el LLM no genera respuesta hasta que el usuario escribe algo. `notify-update` en `UserPromptSubmit` garantiza que la notificacion llegue pegada al primer mensaje real del usuario y no sea ignorada.
|
|
240
244
|
|
|
241
245
|
### Gate de review en el push
|
|
242
246
|
|
|
@@ -356,7 +360,7 @@ Bus local (WebSocket sobre `127.0.0.1`) para que los agentes de distintos repos
|
|
|
356
360
|
|
|
357
361
|
**Observador puro** (0 tokens): `refacil-sdd-ai bus watch <session>` o `refacil-sdd-ai bus view` para la UI web.
|
|
358
362
|
|
|
359
|
-
> **Diagramas, escenarios y pitch**: ver
|
|
363
|
+
> **Diagramas, escenarios y pitch**: ver `refacil-bus-diagrams.md` (incluido en el paquete) — incluye arquitectura, flujo con attend, flujo sin attend, tabla comparativa de impacto y guia de decision visual (Mermaid).
|
|
360
364
|
>
|
|
361
365
|
|
|
362
366
|
### Limitaciones conocidas
|
package/bin/cli.js
CHANGED
|
@@ -29,7 +29,38 @@ const { syncIgnoreFiles } = require('../lib/ignore-files');
|
|
|
29
29
|
const packageRoot = path.resolve(__dirname, '..');
|
|
30
30
|
const projectRoot = process.cwd();
|
|
31
31
|
|
|
32
|
-
// ---
|
|
32
|
+
// --- check-update (SessionStart) + notify-update (UserPromptSubmit) ---
|
|
33
|
+
|
|
34
|
+
function ideBaseDir(root) {
|
|
35
|
+
const claudeDir = path.join(root, '.claude');
|
|
36
|
+
const cursorDir = path.join(root, '.cursor');
|
|
37
|
+
return fs.existsSync(claudeDir) ? claudeDir : fs.existsSync(cursorDir) ? cursorDir : null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function writePendingUpdateFlag(root, fromVersion, toVersion) {
|
|
41
|
+
const base = ideBaseDir(root);
|
|
42
|
+
if (!base) return;
|
|
43
|
+
try {
|
|
44
|
+
fs.writeFileSync(path.join(base, '.refacil-pending-update'), JSON.stringify({ from: fromVersion, to: toVersion }));
|
|
45
|
+
} catch (_) {}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function notifyUpdate() {
|
|
49
|
+
const base = ideBaseDir(projectRoot);
|
|
50
|
+
if (!base) return;
|
|
51
|
+
const flagPath = path.join(base, '.refacil-pending-update');
|
|
52
|
+
if (!fs.existsSync(flagPath)) return;
|
|
53
|
+
|
|
54
|
+
let info = {};
|
|
55
|
+
try { info = JSON.parse(fs.readFileSync(flagPath, 'utf8')); } catch (_) {}
|
|
56
|
+
try { fs.unlinkSync(flagPath); } catch (_) {}
|
|
57
|
+
|
|
58
|
+
const fromLabel = info.from ? `v${info.from}` : 'version desconocida';
|
|
59
|
+
console.log(
|
|
60
|
+
`[refacil-sdd-ai] ACCION REQUERIDA: La metodologia fue actualizada (${fromLabel} → v${info.to}). ` +
|
|
61
|
+
'Antes de responder al usuario, informa del cambio y ofrece ejecutar /refacil:update para aplicar las migraciones pendientes.',
|
|
62
|
+
);
|
|
63
|
+
}
|
|
33
64
|
|
|
34
65
|
function repoIsInitialized() {
|
|
35
66
|
return (
|
|
@@ -65,9 +96,7 @@ function checkUpdate() {
|
|
|
65
96
|
try {
|
|
66
97
|
syncCompactGuidance(projectRoot, packageRoot);
|
|
67
98
|
} catch (err) {
|
|
68
|
-
process.stderr.write(
|
|
69
|
-
`[refacil-sdd-ai] No se pudo sincronizar compact-guidance: ${err.message}\n`,
|
|
70
|
-
);
|
|
99
|
+
process.stderr.write(`[refacil-sdd-ai] No se pudo sincronizar compact-guidance: ${err.message}\n`);
|
|
71
100
|
}
|
|
72
101
|
|
|
73
102
|
const syncResult = syncRepoSkillsIfStale(localVersion);
|
|
@@ -77,10 +106,7 @@ function checkUpdate() {
|
|
|
77
106
|
`[refacil-sdd-ai] Skills de este repo sincronizadas (${fromLabel} -> v${syncResult.to}). ` +
|
|
78
107
|
'Reinicia la sesion de Claude Code o Cursor para detectar los cambios.',
|
|
79
108
|
);
|
|
80
|
-
|
|
81
|
-
'[refacil-sdd-ai] La metodologia fue actualizada. ' +
|
|
82
|
-
'Pregunta al usuario si desea aplicar las migraciones pendientes y, si confirma, ejecuta /refacil:update.',
|
|
83
|
-
);
|
|
109
|
+
writePendingUpdateFlag(projectRoot, syncResult.from, syncResult.to);
|
|
84
110
|
} else if (syncResult && syncResult.failed) {
|
|
85
111
|
console.log(
|
|
86
112
|
`[refacil-sdd-ai] Skills de este repo estan desactualizadas respecto al paquete global (v${syncResult.to}) ` +
|
|
@@ -98,16 +124,8 @@ function checkUpdate() {
|
|
|
98
124
|
if (!latest || latest === localVersion) return;
|
|
99
125
|
|
|
100
126
|
try {
|
|
101
|
-
execSync('npm update -g refacil-sdd-ai', {
|
|
102
|
-
|
|
103
|
-
timeout: 60000,
|
|
104
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
105
|
-
});
|
|
106
|
-
execSync('refacil-sdd-ai update', {
|
|
107
|
-
encoding: 'utf8',
|
|
108
|
-
timeout: 30000,
|
|
109
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
110
|
-
});
|
|
127
|
+
execSync('npm update -g refacil-sdd-ai', { encoding: 'utf8', timeout: 60000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
128
|
+
execSync('refacil-sdd-ai update', { encoding: 'utf8', timeout: 30000, stdio: ['pipe', 'pipe', 'pipe'] });
|
|
111
129
|
writeRepoVersion(projectRoot, latest);
|
|
112
130
|
console.log(
|
|
113
131
|
`[refacil-sdd-ai] La metodologia SDD-AI se actualizo automaticamente de v${localVersion} a v${latest}. Skills y hooks sincronizados.`,
|
|
@@ -327,8 +345,9 @@ function help() {
|
|
|
327
345
|
Comandos:
|
|
328
346
|
init Instala skills en .claude/ y .cursor/, crea CLAUDE.md y .cursorrules
|
|
329
347
|
update Re-copia skills (para actualizar a nueva version del paquete)
|
|
330
|
-
check-update
|
|
331
|
-
|
|
348
|
+
check-update Sincroniza skills y compact-guidance al inicio de sesion (hook SessionStart)
|
|
349
|
+
notify-update Notifica al LLM sobre migraciones pendientes (hook UserPromptSubmit)
|
|
350
|
+
check-review Verifica que el review se haya completado (usado por hook PreToolUse)
|
|
332
351
|
compact-bash Reescribe comandos Bash bare para reducir tokens (usado por hook PreToolUse)
|
|
333
352
|
compact Subcomandos del hook compact-bash:
|
|
334
353
|
compact stats - Estadisticas completas (hook + ya-compacto) y ahorro estimado
|
|
@@ -380,6 +399,9 @@ switch (command) {
|
|
|
380
399
|
case 'check-update':
|
|
381
400
|
checkUpdate();
|
|
382
401
|
break;
|
|
402
|
+
case 'notify-update':
|
|
403
|
+
notifyUpdate();
|
|
404
|
+
break;
|
|
383
405
|
case 'check-review':
|
|
384
406
|
checkReview();
|
|
385
407
|
break;
|
package/lib/hooks.js
CHANGED
|
@@ -31,6 +31,18 @@ function installHooks(ideDir, projectRoot) {
|
|
|
31
31
|
changed = true;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
if (!settings.hooks.UserPromptSubmit) settings.hooks.UserPromptSubmit = [];
|
|
35
|
+
|
|
36
|
+
const hasNotifyHook = settings.hooks.UserPromptSubmit.some((h) => h._sdd_notify === true);
|
|
37
|
+
if (!hasNotifyHook) {
|
|
38
|
+
settings.hooks.UserPromptSubmit.push({
|
|
39
|
+
_sdd_notify: true,
|
|
40
|
+
matcher: '',
|
|
41
|
+
hooks: [{ type: 'command', command: 'refacil-sdd-ai notify-update' }],
|
|
42
|
+
});
|
|
43
|
+
changed = true;
|
|
44
|
+
}
|
|
45
|
+
|
|
34
46
|
if (!settings.hooks.PreToolUse) settings.hooks.PreToolUse = [];
|
|
35
47
|
|
|
36
48
|
// compact-bash debe correr ANTES de check-review para que el rewrite sea visible
|
|
@@ -87,6 +99,15 @@ function uninstallHooks(ideDir, projectRoot) {
|
|
|
87
99
|
if (settings.hooks.SessionStart.length === 0) delete settings.hooks.SessionStart;
|
|
88
100
|
}
|
|
89
101
|
|
|
102
|
+
if (Array.isArray(settings.hooks.UserPromptSubmit)) {
|
|
103
|
+
const original = settings.hooks.UserPromptSubmit.length;
|
|
104
|
+
settings.hooks.UserPromptSubmit = settings.hooks.UserPromptSubmit.filter(
|
|
105
|
+
(h) => h._sdd_notify !== true,
|
|
106
|
+
);
|
|
107
|
+
if (settings.hooks.UserPromptSubmit.length !== original) changed = true;
|
|
108
|
+
if (settings.hooks.UserPromptSubmit.length === 0) delete settings.hooks.UserPromptSubmit;
|
|
109
|
+
}
|
|
110
|
+
|
|
90
111
|
if (Array.isArray(settings.hooks.PreToolUse)) {
|
|
91
112
|
const original = settings.hooks.PreToolUse.length;
|
|
92
113
|
settings.hooks.PreToolUse = settings.hooks.PreToolUse.filter(
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@ Lee este archivo **ademas** de la skill `openspec-*` que indique el comando `ref
|
|
|
8
8
|
|
|
9
9
|
- Respuestas al usuario y artefactos bajo `openspec/`: **español**; terminos tecnicos (API, REST, nombres de tipos, etc.) en **ingles**.
|
|
10
10
|
|
|
11
|
-
## propose — `openspec-
|
|
11
|
+
## propose — `openspec-propose`
|
|
12
12
|
|
|
13
13
|
- Criterios de aceptacion: formato **Dado / Cuando / Entonces**.
|
|
14
14
|
- Incluir **criterios de rechazo** (edge cases) en specs.
|
package/skills/propose/SKILL.md
CHANGED
|
@@ -6,7 +6,7 @@ user-invocable: true
|
|
|
6
6
|
|
|
7
7
|
# refacil:propose — Propuesta de Cambio
|
|
8
8
|
|
|
9
|
-
Este comando envuelve la funcionalidad de OpenSpec
|
|
9
|
+
Este comando envuelve la funcionalidad de OpenSpec propose y agrega las convenciones del equipo.
|
|
10
10
|
|
|
11
11
|
**Prerequisitos**: perfil `openspec` de `refacil-prereqs/SKILL.md` + reglas de `METHODOLOGY-CONTRACT.md`.
|
|
12
12
|
|
|
@@ -23,7 +23,7 @@ Si $ARGUMENTS ya es claro, no preguntes de nuevo.
|
|
|
23
23
|
|
|
24
24
|
### Paso 2: Delegar a OpenSpec ff (fast-forward)
|
|
25
25
|
|
|
26
|
-
1. Lee `openspec-
|
|
26
|
+
1. Lee `openspec-propose/SKILL.md` en `.claude/skills/` o `.cursor/skills/`.
|
|
27
27
|
2. Lee `OPENSPEC-DELTAS.md` en la carpeta `refacil-prereqs` (misma ruta dual que en prereqs).
|
|
28
28
|
3. Ejecuta la skill OpenSpec siguiendo sus instrucciones y aplicando los deltas Refacil para generar los artefactos (proposal, specs, design, tasks) en una sola pasada.
|
|
29
29
|
|
package/skills/setup/SKILL.md
CHANGED
|
@@ -16,17 +16,31 @@ Guia al desarrollador **paso a paso**. Tras cada paso, informa resultado; si fal
|
|
|
16
16
|
|
|
17
17
|
### Paso 2: OpenSpec
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
```bash
|
|
20
|
+
openspec --version 2>&1
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Version minima requerida: **1.3.0**. Si falla o es inferior: `npm install -g @fission-ai/openspec@latest`, re-verificar. Si sigue fallando: **troubleshooting.md**.
|
|
20
24
|
|
|
21
|
-
### Paso 3:
|
|
25
|
+
### Paso 3: Configurar todos los workflows de OpenSpec
|
|
26
|
+
|
|
27
|
+
`openspec config set workflows` no acepta arrays por CLI. La unica forma de configurar los workflows es editando el archivo de config directamente:
|
|
22
28
|
|
|
23
29
|
```bash
|
|
24
|
-
|
|
25
|
-
|
|
30
|
+
node -e "
|
|
31
|
+
const fs=require('fs');
|
|
32
|
+
const {execSync}=require('child_process');
|
|
33
|
+
const p=execSync('openspec config path',{encoding:'utf8'}).trim();
|
|
34
|
+
const c=JSON.parse(fs.readFileSync(p,'utf8'));
|
|
35
|
+
c.profile='custom';
|
|
36
|
+
c.workflows=['propose','explore','apply','archive','verify'];
|
|
37
|
+
fs.writeFileSync(p,JSON.stringify(c,null,2));
|
|
38
|
+
console.log('Workflows configurados:',c.workflows.join(', '));
|
|
39
|
+
"
|
|
26
40
|
openspec config list
|
|
27
41
|
```
|
|
28
42
|
|
|
29
|
-
Debe verse `profile: custom` y los
|
|
43
|
+
Debe verse `profile: custom` y exactamente estos 5 workflows: `propose`, `explore`, `apply`, `archive`, `verify` — los unicos que usan los comandos `refacil:*`.
|
|
30
44
|
|
|
31
45
|
### Paso 4: Init en el repo
|
|
32
46
|
|
|
@@ -36,6 +50,48 @@ openspec init --tools claude,cursor
|
|
|
36
50
|
|
|
37
51
|
`openspec init` instala `opsx:*` en `.claude/` y `.cursor/`; convive con `refacil:*` — el equipo usa **refacil:*** como interfaz principal.
|
|
38
52
|
|
|
53
|
+
`openspec init` no elimina skills ni commands de instalaciones anteriores. Después del init, ejecuta este script para limpiar todo lo sobrante:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
node -e "
|
|
57
|
+
const fs=require('fs');
|
|
58
|
+
const path=require('path');
|
|
59
|
+
const requiredSkills=new Set(['openspec-propose','openspec-explore','openspec-apply-change','openspec-archive-change','openspec-verify-change']);
|
|
60
|
+
const requiredCmdsOpsx=new Set(['apply.md','archive.md','explore.md','propose.md','verify.md']);
|
|
61
|
+
const requiredCmdsCursor=new Set(['opsx-apply.md','opsx-archive.md','opsx-explore.md','opsx-propose.md','opsx-verify.md']);
|
|
62
|
+
// Skills sobrantes
|
|
63
|
+
for(const base of ['.claude/skills','.cursor/skills']){
|
|
64
|
+
if(!fs.existsSync(base)) continue;
|
|
65
|
+
for(const d of fs.readdirSync(base)){
|
|
66
|
+
if(d.startsWith('openspec-') && !requiredSkills.has(d)){
|
|
67
|
+
fs.rmSync(path.join(base,d),{recursive:true,force:true});
|
|
68
|
+
console.log('Eliminada skill:',path.join(base,d));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Commands sobrantes — .claude/commands/opsx/ (archivos .md)
|
|
73
|
+
const claudeCmds='.claude/commands/opsx';
|
|
74
|
+
if(fs.existsSync(claudeCmds)){
|
|
75
|
+
for(const f of fs.readdirSync(claudeCmds)){
|
|
76
|
+
if(f.endsWith('.md') && !requiredCmdsOpsx.has(f)){
|
|
77
|
+
fs.rmSync(path.join(claudeCmds,f),{force:true});
|
|
78
|
+
console.log('Eliminado command:',path.join(claudeCmds,f));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Commands sobrantes — .cursor/commands/ (archivos opsx-*.md)
|
|
83
|
+
const cursorCmds='.cursor/commands';
|
|
84
|
+
if(fs.existsSync(cursorCmds)){
|
|
85
|
+
for(const f of fs.readdirSync(cursorCmds)){
|
|
86
|
+
if(f.startsWith('opsx-') && f.endsWith('.md') && !requiredCmdsCursor.has(f)){
|
|
87
|
+
fs.rmSync(path.join(cursorCmds,f),{force:true});
|
|
88
|
+
console.log('Eliminado command:',path.join(cursorCmds,f));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
"
|
|
93
|
+
```
|
|
94
|
+
|
|
39
95
|
### Paso 5: `openspec/config.yaml`
|
|
40
96
|
|
|
41
97
|
Si no existe, crear con `language: spanish` (y comentario de terminos tecnicos en ingles). Si existe, asegurar `language: spanish`.
|
|
@@ -62,7 +118,35 @@ Un monorepo puede agregar `.agents/services.md`; una libreria puede combinar tes
|
|
|
62
118
|
`AGENTS.md` es el **indice puro** — no contiene detalle de proyecto, solo:
|
|
63
119
|
1. Una linea de descripcion del proyecto.
|
|
64
120
|
2. Por cada archivo en `.agents/`: nombre del area + enlace relativo + cuando leer ese archivo (una frase).
|
|
65
|
-
3.
|
|
121
|
+
3. Seccion `## Metodología SDD-AI` con la tabla completa de comandos `refacil:*` — siempre en `AGENTS.md`, nunca en `.agents/`. Si ya existe, sobreescribirla con el contenido actualizado; si no existe, crearla.
|
|
122
|
+
4. Bloque `compact-guidance` (auto-gestionado por `refacil-sdd-ai`, no editar).
|
|
123
|
+
|
|
124
|
+
**Contenido obligatorio de `## Metodología SDD-AI`** (insertar literalmente, antes del bloque `compact-guidance`):
|
|
125
|
+
|
|
126
|
+
```markdown
|
|
127
|
+
## Metodología SDD-AI
|
|
128
|
+
|
|
129
|
+
| Comando | Descripcion |
|
|
130
|
+
|---------|-------------|
|
|
131
|
+
| `/refacil:setup` | Instalar y configurar la metodologia en el repo |
|
|
132
|
+
| `/refacil:guide` | Ver guia de flujo y elegir siguiente paso |
|
|
133
|
+
| `/refacil:explore` | Explorar el codebase sin modificar archivos |
|
|
134
|
+
| `/refacil:propose` | Crear propuesta de cambio (proposal, specs, design, tasks) |
|
|
135
|
+
| `/refacil:apply` | Implementar las tasks de una propuesta aprobada |
|
|
136
|
+
| `/refacil:test` | Ejecutar y revisar tests del cambio actual |
|
|
137
|
+
| `/refacil:verify` | Verificar implementacion contra las specs |
|
|
138
|
+
| `/refacil:review` | Auditoria de calidad del codigo implementado |
|
|
139
|
+
| `/refacil:archive` | Archivar el cambio y sincronizar specs al historico |
|
|
140
|
+
| `/refacil:up-code` | Actualizar codigo existente a patrones actuales |
|
|
141
|
+
| `/refacil:bug` | Crear propuesta de fix para un bug detectado |
|
|
142
|
+
| `/refacil:update` | Migrar documentacion al patron actual de la metodologia |
|
|
143
|
+
| `/refacil:join` | Unirse al bus cross-repo (primer setup del servicio) |
|
|
144
|
+
| `/refacil:say` | Enviar mensaje a otro agente via bus |
|
|
145
|
+
| `/refacil:ask` | Hacer consulta a otro agente y esperar respuesta |
|
|
146
|
+
| `/refacil:reply` | Responder a una consulta recibida via bus |
|
|
147
|
+
| `/refacil:attend` | Atender y responder mensajes pendientes del bus |
|
|
148
|
+
| `/refacil:inbox` | Ver mensajes pendientes en el bus |
|
|
149
|
+
```
|
|
66
150
|
|
|
67
151
|
**6.3 Fallback** — Si el analisis falla: crear `.agents/summary.md` con resumen minimo + tabla refacil + TODOs, y `AGENTS.md` como indice apuntando a ese unico archivo.
|
|
68
152
|
|
|
@@ -104,7 +188,7 @@ Si el usuario quiere personalizar exclusiones adicionales, puede editarlos direc
|
|
|
104
188
|
|
|
105
189
|
### Paso 8: Verificar skills
|
|
106
190
|
|
|
107
|
-
- OpenSpec:
|
|
191
|
+
- OpenSpec: 5 carpetas bajo `.claude/skills/` y `.cursor/skills/`: `openspec-propose`, `openspec-explore`, `openspec-apply-change`, `openspec-archive-change`, `openspec-verify-change`. Si falta alguna: re-ejecutar el Paso 3 y luego `openspec init --tools claude,cursor`.
|
|
108
192
|
- Refacil: carpetas `refacil-*` en esas rutas. Si no: `refacil-sdd-ai init` + reiniciar sesion.
|
|
109
193
|
|
|
110
194
|
### Paso 9: Resumen final
|
|
@@ -11,10 +11,16 @@ Consulta este archivo **solo** si un paso de setup falla. No forma parte del flu
|
|
|
11
11
|
|
|
12
12
|
- OpenSpec exige **Node >= 20.19.0**. Actualiza Node y vuelve a intentar.
|
|
13
13
|
|
|
14
|
-
## `openspec init` no crea
|
|
14
|
+
## `openspec init` no crea las 5 skills requeridas
|
|
15
15
|
|
|
16
|
-
- Ejecuta `openspec config list` y confirma `profile: custom` y los
|
|
17
|
-
-
|
|
16
|
+
- Ejecuta `openspec config list` y confirma `profile: custom` y los 5 workflows: `propose, explore, apply, archive, verify`.
|
|
17
|
+
- Si faltan workflows, repite el Paso 3 del setup (script `node -e "..."`) y luego `openspec init --tools claude,cursor` desde la raiz del repo.
|
|
18
|
+
- Las skills esperadas son: `openspec-propose`, `openspec-explore`, `openspec-apply-change`, `openspec-archive-change`, `openspec-verify-change`.
|
|
19
|
+
|
|
20
|
+
## `openspec config set workflows` falla con error de array
|
|
21
|
+
|
|
22
|
+
- El CLI de OpenSpec no acepta arrays via `config set`. Usa el script `node -e "..."` del Paso 3 para editar el JSON de configuracion directamente.
|
|
23
|
+
- La ruta del archivo de config se obtiene con `openspec config path`.
|
|
18
24
|
|
|
19
25
|
## Falta `openspec/config.yaml`
|
|
20
26
|
|
package/skills/update/SKILL.md
CHANGED
|
@@ -17,6 +17,7 @@ Evalua cada condicion y marca si aplica:
|
|
|
17
17
|
| 1 | `AGENTS.md` existe y no existe carpeta `.agents/` | Reestructurar en `.agents/` + reescribir como indice |
|
|
18
18
|
| 2 | `CLAUDE.md` tiene mas de 5 lineas o no apunta a `AGENTS.md` | Reemplazar por indice minimo |
|
|
19
19
|
| 3 | `.cursorrules` tiene mas de 5 lineas o no apunta a `AGENTS.md` | Reemplazar por indice minimo |
|
|
20
|
+
| 4 | Existen skills `openspec-*` o commands `opsx-*` fuera del conjunto requerido en `.claude/` o `.cursor/` | Eliminar los sobrantes y reconfigurar OpenSpec |
|
|
20
21
|
|
|
21
22
|
Si ninguna condicion aplica: informar al usuario que todo esta al dia y salir sin cambios.
|
|
22
23
|
|
|
@@ -31,9 +32,10 @@ Ejecutar solo las migraciones marcadas en el Paso 1.
|
|
|
31
32
|
### Migracion 1 — AGENTS.md → `.agents/` + indice
|
|
32
33
|
|
|
33
34
|
1. Lee el contenido completo de `AGENTS.md`.
|
|
34
|
-
2. Identifica y separa
|
|
35
|
+
2. Identifica y separa el contenido que NO debe moverse a `.agents/`:
|
|
35
36
|
- Bloque `compact-guidance`: entre `<!-- refacil-sdd-ai:compact-guidance:start -->` y `<!-- refacil-sdd-ai:compact-guidance:end -->`
|
|
36
37
|
- Bloque de presentacion del bus: entre `<!-- refacil-bus:presentation:start -->` y `<!-- refacil-bus:presentation:end -->`
|
|
38
|
+
- Seccion `## Metodología SDD-AI`: tabla de comandos `refacil:*` — siempre permanece en `AGENTS.md`. Si existe, sobreescribirla con la tabla actualizada (ver Paso 6.2 de `refacil:setup`); si no existe, crearla.
|
|
37
39
|
3. Crea la carpeta `.agents/`.
|
|
38
40
|
4. Distribuye el contenido de proyecto (todo excepto los bloques gestionados) en archivos por area. Reglas:
|
|
39
41
|
- **`.agents/summary.md` es siempre obligatorio** — descripcion del proyecto, tabla mini de stack, scripts esenciales, reglas criticas condensadas. Si el AGENTS.md original no tiene resumen claro, sintetizalo a partir del contenido disponible.
|
|
@@ -43,9 +45,10 @@ Ejecutar solo las migraciones marcadas en el Paso 1.
|
|
|
43
45
|
- `.agents/testing.md` — estrategia de tests, comandos, convenciones, fixtures.
|
|
44
46
|
- `.agents/commands.md` — comandos de desarrollo, alias, scripts de CI/CD.
|
|
45
47
|
- Adaptar al tipo de proyecto: un monorepo puede necesitar `.agents/services.md`; una libreria simple puede combinar testing y stack en un solo archivo. Usar el mismo criterio que `/refacil:setup`.
|
|
46
|
-
5. Reescribe `AGENTS.md` como indice puro
|
|
48
|
+
5. Reescribe `AGENTS.md` como indice puro en este orden:
|
|
47
49
|
- Primera linea: descripcion breve del proyecto.
|
|
48
50
|
- Por cada archivo en `.agents/`: nombre del area + enlace relativo + cuando leerlo (una frase).
|
|
51
|
+
- Seccion `## Metodología SDD-AI` con la tabla actualizada de comandos `refacil:*` (ver Paso 6.2 de `refacil:setup` para el contenido exacto).
|
|
49
52
|
- Bloques gestionados que ya existian (compact-guidance, bus presentation) al final, intactos.
|
|
50
53
|
- Si no existian, el bloque compact-guidance se re-inyectara automaticamente en el proximo SessionStart.
|
|
51
54
|
|
|
@@ -69,6 +72,28 @@ Contexto completo del proyecto: ver `AGENTS.md`.
|
|
|
69
72
|
Si no existe, ejecuta `/refacil:setup`.
|
|
70
73
|
```
|
|
71
74
|
|
|
75
|
+
### Migracion 4 — Skills y commands OpenSpec sobrantes
|
|
76
|
+
|
|
77
|
+
Conjunto requerido de skills: `openspec-propose`, `openspec-explore`, `openspec-apply-change`, `openspec-archive-change`, `openspec-verify-change`.
|
|
78
|
+
Conjunto requerido de commands: `.claude/commands/opsx/` → `apply.md`, `archive.md`, `explore.md`, `propose.md`, `verify.md`; `.cursor/commands/` → `opsx-apply.md`, `opsx-archive.md`, `opsx-explore.md`, `opsx-propose.md`, `opsx-verify.md`.
|
|
79
|
+
|
|
80
|
+
1. Detecta skills `openspec-*` en `.claude/skills/` y `.cursor/skills/` fuera del conjunto requerido.
|
|
81
|
+
2. Detecta commands `opsx-*.md` en `.cursor/commands/` y archivos `.md` en `.claude/commands/opsx/` fuera del conjunto requerido.
|
|
82
|
+
3. Reconfigura OpenSpec con solo los 5 workflows necesarios:
|
|
83
|
+
```bash
|
|
84
|
+
node -e "
|
|
85
|
+
const fs=require('fs');
|
|
86
|
+
const {execSync}=require('child_process');
|
|
87
|
+
const p=execSync('openspec config path',{encoding:'utf8'}).trim();
|
|
88
|
+
const c=JSON.parse(fs.readFileSync(p,'utf8'));
|
|
89
|
+
c.profile='custom';
|
|
90
|
+
c.workflows=['propose','explore','apply','archive','verify'];
|
|
91
|
+
fs.writeFileSync(p,JSON.stringify(c,null,2));
|
|
92
|
+
"
|
|
93
|
+
```
|
|
94
|
+
4. Elimina skills y commands sobrantes.
|
|
95
|
+
5. Ejecuta `openspec init --tools claude,cursor` para dejar el estado limpio.
|
|
96
|
+
|
|
72
97
|
## Paso 4: Resumen
|
|
73
98
|
|
|
74
99
|
Informar que archivos se crearon o modificaron. Mencionar que el bloque `compact-guidance` se sincronizara automaticamente en el proximo SessionStart.
|