@saulwade/swl-ses 2.1.0 → 2.2.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.
Files changed (52) hide show
  1. package/CLAUDE.md +1 -1
  2. package/README.md +1 -1
  3. package/bin/swl-ses.js +63 -0
  4. package/comandos/swl/adoptar-proyecto.md +258 -255
  5. package/comandos/swl/aprender.md +828 -840
  6. package/comandos/swl/aprobar-plan.md +23 -35
  7. package/comandos/swl/autoresearch.md +12 -14
  8. package/comandos/swl/briefing.md +5 -8
  9. package/comandos/swl/checkpoint.md +10 -15
  10. package/comandos/swl/claudemd.md +239 -234
  11. package/comandos/swl/configurar-ci.md +20 -19
  12. package/comandos/swl/cron.md +10 -12
  13. package/comandos/swl/ejecutar-fase.md +10 -3
  14. package/comandos/swl/evolucionar.md +6 -11
  15. package/comandos/swl/inbox.md +10 -10
  16. package/comandos/swl/modelo.md +7 -9
  17. package/comandos/swl/notificaciones.md +19 -116
  18. package/comandos/swl/nuevo-proyecto.md +205 -205
  19. package/comandos/swl/status.md +333 -348
  20. package/comandos/swl/verificar.md +817 -813
  21. package/habilidades/swl-claudemd/SKILL.md +10 -6
  22. package/hooks/lib/propose-step.js +1 -0
  23. package/llms.txt +1 -1
  24. package/manifiestos/skills-lock.json +5 -5
  25. package/package.json +1 -1
  26. package/plugin.json +1 -1
  27. package/scripts/auditar-claudemd.js +38 -0
  28. package/scripts/cli/aprobar-plan.js +73 -0
  29. package/scripts/cli/briefing.js +23 -0
  30. package/scripts/cli/ciclo-evolucion.js +26 -0
  31. package/scripts/cli/configurar-ci.js +40 -0
  32. package/scripts/cli/derivar-feature-list.js +25 -0
  33. package/scripts/cli/detectar-host.js +27 -0
  34. package/scripts/cli/diary-entry.js +69 -0
  35. package/scripts/cli/execution-state.js +18 -0
  36. package/scripts/cli/gateway-notify.js +41 -0
  37. package/scripts/cli/liberar-fase.js +42 -0
  38. package/scripts/cli/loop-telemetry.js +125 -0
  39. package/scripts/cli/mark-evolved.js +56 -0
  40. package/scripts/cli/metricas-dora.js +26 -0
  41. package/scripts/cli/near-duplicate.js +55 -0
  42. package/scripts/cli/notificaciones.js +123 -0
  43. package/scripts/cli/propose-step.js +29 -0
  44. package/scripts/cli/schedule-parse.js +19 -0
  45. package/scripts/cli/sugerir-modelo.js +20 -0
  46. package/scripts/cli/verificar-plan.js +36 -0
  47. package/scripts/cli/verificar-trazabilidad.js +35 -0
  48. package/scripts/derivar-feature-list.js +1 -0
  49. package/scripts/lib/auditar-invocaciones-comandos.js +104 -0
  50. package/scripts/lib/resolver-plan-fase.js +37 -0
  51. package/scripts/validar.js +13 -0
  52. package/scripts/verificar-trazabilidad.js +1 -1
@@ -15,6 +15,14 @@ a mano (`estado: aprobado`) deja el plan en modo legacy (cláusula de gracia D-0
15
15
  se ejecuta con advertencia pero sin protección de integridad. Usar este comando
16
16
  es lo que activa el gate real.
17
17
 
18
+ > **Invocación cross-scope** (ver `@docs/invocacion-cli-cross-scope.md`): las
19
+ > partes deterministas del gate viven en subcomandos del CLI. Resuélvelos así:
20
+ > si existe `./scripts/cli/<sub>.js` (repo madre) usa `node scripts/cli/<sub>.js`;
21
+ > si `command -v swl-ses` responde usa `swl-ses <sub>`; si no,
22
+ > `npx -y @saulwade/swl-ses@latest <sub>`. Abajo escribo la forma `swl-ses <sub>`
23
+ > como canónica. NUNCA uses `node -e "require('./scripts/lib/...')"` — esa ruta no
24
+ > existe en proyectos downstream.
25
+
18
26
  ## Uso
19
27
 
20
28
  ```
@@ -37,7 +45,7 @@ Lee el campo `estado:` del frontmatter:
37
45
  - Si `estado: borrador` → continúa al Paso 3 (caso normal).
38
46
  - Si `estado: aprobado` → ya está aprobado. Verifica si existe el lock:
39
47
  ```bash
40
- node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
48
+ swl-ses verificar-plan --fase=N
41
49
  ```
42
50
  - Si `modo: "firmado"` → informa "El plan ya está aprobado y firmado." y termina.
43
51
  - Si `modo: "legacy"` (aprobado sin lock) → pregunta al usuario: "El plan está
@@ -59,7 +67,7 @@ aceptación. `verificar-trazabilidad.js` reconoce ambos formatos.
59
67
  ("CONTEXTO sin REQ-IDs — trazabilidad no exigible, gracia legacy") y continúa.
60
68
  - **CONTEXTO con REQ-IDs**: verifica que el PLAN cubra TODOS:
61
69
  ```bash
62
- node scripts/verificar-trazabilidad.js --fase=N --solo-plan
70
+ swl-ses verificar-trazabilidad --fase=N --solo-plan
63
71
  ```
64
72
  - Exit 0 → continúa al Paso 3.
65
73
  - Exit 1 (REQ huérfanos) → **RECHAZA la aprobación**. Lista los REQ sin tarea y
@@ -86,41 +94,21 @@ a `/swl:planear-fase N` para refinar.
86
94
  edita el frontmatter `estado: borrador` → `estado: aprobado` y agrega
87
95
  `aprobadoPor: usuario (<nombre>) — <fecha>, via /swl:aprobar-plan`.
88
96
 
89
- 2. **Firmar** — escribe el lock SHA256:
90
- ```bash
91
- node -e "const {firmarPlan}=require('./scripts/lib/plan-lock'); const r=firmarPlan('.planning/fases/0N-PLAN.md'); console.log(JSON.stringify(r))"
92
- ```
93
- Verifica que el resultado sea `ok: true` y que exista
94
- `.planning/locks/0N-PLAN.md.lock`.
95
-
96
- 3. **Verificar** la firma de inmediato:
97
- ```bash
98
- node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
99
- ```
100
- Debe retornar `modo: "firmado"`, `ok: true`.
101
-
102
- 4. **Marcar la fase como activa** (gate G0 — `hooks/spec-gate.js` consume este
103
- archivo): escribe `.planning/locks/fase-activa.json` con el sha256 devuelto
104
- por `firmarPlan`:
97
+ 2. **Firmar y marcar la fase activa** — un solo subcomando hace las tres
98
+ operaciones deterministas: firma SHA256 → `.planning/locks/0N-PLAN.md.lock`,
99
+ verifica la firma, y escribe `.planning/locks/fase-activa.json` (gate G0 que
100
+ consume `hooks/spec-gate.js`):
105
101
  ```bash
106
- node -e "
107
- const {atomicWriteJSON} = require('./hooks/lib/atomic-write');
108
- const {verificarPlan} = require('./scripts/lib/plan-lock');
109
- const v = verificarPlan('.planning/fases/0N-PLAN.md');
110
- atomicWriteJSON('.planning/locks/fase-activa.json', {
111
- numero: N,
112
- planPath: '.planning/fases/0N-PLAN.md',
113
- sha256: v.hashEsperado,
114
- aprobadoEn: new Date().toISOString(),
115
- aprobadoPor: 'usuario via /swl:aprobar-plan'
116
- });
117
- console.log('fase activa: 0N');
118
- "
102
+ swl-ses aprobar-plan --fase=N
119
103
  ```
120
- Este archivo es runtime local (gitignored a diferencia del `.lock`, que
121
- se versiona como evidencia). `/swl:ejecutar-fase` lo elimina al cerrar la fase.
122
- Si se re-firma un plan (re-aprobación tras mutación), re-escribir también
123
- fase-activa.json para que el hash quede alineado.
104
+ Verifica en la salida JSON que `ok: true` y `modo: "firmado"`. Si reporta
105
+ error de firma, **NO continúes** revisa el `motivo`.
106
+
107
+ El `.lock` se versiona en git (evidencia de aprobación, parte del audit
108
+ trail SDD). El `fase-activa.json` es runtime local (gitignored);
109
+ `/swl:ejecutar-fase` lo elimina al cerrar la fase. Re-ejecutar
110
+ `swl-ses aprobar-plan --fase=N` tras una re-aprobación (plan mutado) realinea
111
+ lock y fase-activa automáticamente.
124
112
 
125
113
  ## Paso 5 — Reporte
126
114
 
@@ -135,20 +135,15 @@ Resultado: [ÉXITO | PLATEAU | ESTANCAMIENTO | DEGRADACIÓN]
135
135
 
136
136
  Si el score mejoró respecto al baseline:
137
137
  1. Actualizar versión del skill/agente (< 10 pts: PATCH, >= 10 pts: MINOR)
138
- 2. **OBLIGATORIO — Marcar como evolucionado ejecutando este comando Bash**:
138
+ 2. **OBLIGATORIO — Marcar como evolucionado** con el subcomando del CLI
139
+ (resuelve cross-scope; ver `docs/invocacion-cli-cross-scope.md`):
139
140
  ```bash
140
- node -e "
141
- const { markAsEvolved } = require('./hooks/lib/evolution-tracker');
142
- const pkg = require('./package.json');
143
- const r = markAsEvolved('[RUTA_ARCHIVO_MODIFICADO]', {
144
- from: pkg.version,
145
- by: 'autoresearch',
146
- rounds: [N_ROUNDS],
147
- score: '[BASELINE]% → [FINAL]%',
148
- note: '[descripción breve de las mutaciones]'
149
- });
150
- console.log(r.marked ? 'Marcado como evolucionado' : 'Error: ' + r.error);
151
- "
141
+ swl-ses mark-evolved "[RUTA_ARCHIVO_MODIFICADO]" \
142
+ --by=autoresearch \
143
+ --rounds=[N_ROUNDS] \
144
+ --score="[BASELINE]% [FINAL]%" \
145
+ --note="[descripción breve de las mutaciones]"
146
+ # fallback: npx -y @saulwade/swl-ses@latest mark-evolved "[RUTA]" --by=autoresearch ...
152
147
  ```
153
148
  Reemplazar los placeholders entre corchetes con los valores reales.
154
149
  Si el comando Bash no está disponible, agregar manualmente en el frontmatter:
@@ -220,8 +215,11 @@ Si `--dry-run`: terminar aquí mostrando la configuración derivada.
220
215
 
221
216
  ### Paso C1 — Baseline y telemetría
222
217
 
218
+ Subcomando del CLI (resuelve cross-scope; ver `docs/invocacion-cli-cross-scope.md`).
219
+ Imprime el `<dir>` de la corrida:
220
+
223
221
  ```bash
224
- node -e "const lt=require('./hooks/lib/loop-telemetry');const r=lt.iniciarCorrida({tipo:'autoresearch',direccion:'[direction]',config:{goal:'[goal]',scope:'[scope]',verify:'[verify]',guard:'[guard]'}});console.log(r.dir)"
222
+ swl-ses loop-telemetry iniciar --tipo=autoresearch --direccion=[direction] --config='{"goal":"[goal]","scope":"[scope]","verify":"[verify]","guard":"[guard]"}'
225
223
  ```
226
224
 
227
225
  Correr Verify, extraer la métrica, registrar la iteración 0 (`estado:
@@ -28,12 +28,9 @@ Ejecuta los recolectores de filesystem y presenta el digest sin tope de 5 (aquí
28
28
  sí caben todas, no hay presupuesto de latencia de arranque):
29
29
 
30
30
  ```bash
31
- node -e "
32
- const b = require('./hooks/lib/briefing.js');
33
- const items = b.recolectarTodo(process.cwd(), new Date());
34
- for (const it of items) console.log('— [' + it.categoria + '] ' + it.titulo + ' → ' + it.accion);
35
- if (items.length === 0) console.log('(sin señales baratas)');
36
- "
31
+ # Subcomando del CLI (resuelve cross-scope; ver docs/invocacion-cli-cross-scope.md)
32
+ swl-ses briefing
33
+ # fallback: npx -y @saulwade/swl-ses@latest briefing
37
34
  ```
38
35
 
39
36
  Las 5 categorías: `adr-vencido`, `deuda-trigger`, `nudges-pendientes`,
@@ -78,11 +75,11 @@ commits sin revisión asociada. Si no está disponible → omitir con nota.
78
75
  ### 2.4 — Drift de feature-list
79
76
 
80
77
  ```bash
81
- node scripts/derivar-feature-list.js --check 2>/dev/null; echo "exit: $?"
78
+ swl-ses derivar-feature-list --check 2>/dev/null; echo "exit: $?"
82
79
  ```
83
80
 
84
81
  Exit 2 → reportar que `HOJA-RUTA.md` y `feature-list.json` divergieron, con la
85
- acción `node scripts/derivar-feature-list.js` para regenerar.
82
+ acción `swl-ses derivar-feature-list` para regenerar.
86
83
 
87
84
  ### 2.5 — Deuda con trigger en prosa libre
88
85
 
@@ -221,24 +221,19 @@ cat .planning/execution-state.json 2>/dev/null || echo "(sin estado de ejecució
221
221
  ```
222
222
 
223
223
  Si existe, actualizar el campo `proximoAgente` con la siguiente tarea pendiente.
224
- Si no existe y hay un plan en progreso con agentes ejecutados en esta sesión, crear el estado:
224
+ Si no existe y hay un plan en progreso con agentes ejecutados en esta sesión,
225
+ imprimir el resumen estructurado con el subcomando del CLI (resuelve cross-scope;
226
+ ver `docs/invocacion-cli-cross-scope.md`):
225
227
 
226
- ```javascript
227
- // Ejemplo de actualización manual desde el orquestador o skill ejecutar-fase:
228
- const es = require('./hooks/lib/execution-state');
229
-
230
- // Registrar agentes completados en esta sesión
231
- // es.completarAgente(cwd, 'nombre-agente', 'slice', { resumen: '...' });
232
-
233
- // Registrar el próximo agente a ejecutar
234
- // es.establecerProximo(cwd, 'proximo-agente', 'proximo-slice');
235
-
236
- // Ver resumen del estado
237
- console.log(es.formatearResumen(process.cwd()));
228
+ ```bash
229
+ swl-ses execution-state
230
+ # fallback: npx -y @saulwade/swl-ses@latest execution-state
238
231
  ```
239
232
 
240
- Incluir el resumen de `formatearResumen()` en el `continue-here.md` generado en el Paso 4,
241
- bajo la sección "Qué se estaba haciendo".
233
+ Incluir ese resumen en el `continue-here.md` generado en el Paso 4, bajo la
234
+ sección "Qué se estaba haciendo". El registro de agentes
235
+ (`completarAgente`/`establecerProximo`) lo gestiona el skill `ejecutar-fase`
236
+ internamente; aquí solo se lee el resumen.
242
237
 
243
238
  ## Paso 4 — Creación del continue-here.md
244
239