@saulwade/swl-ses 2.0.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 (97) hide show
  1. package/CLAUDE.md +196 -196
  2. package/README.md +579 -579
  3. package/agentes/_propose-step.md +90 -0
  4. package/agentes/implementador-swl.md +2 -0
  5. package/agentes/orquestador-swl.md +2 -0
  6. package/agentes/perfilador-usuario-swl.md +14 -1
  7. package/bin/swl-ses.js +64 -1
  8. package/comandos/swl/adoptar-proyecto.md +258 -255
  9. package/comandos/swl/aprender.md +828 -840
  10. package/comandos/swl/aprobar-plan.md +26 -37
  11. package/comandos/swl/autoresearch.md +12 -14
  12. package/comandos/swl/briefing.md +119 -0
  13. package/comandos/swl/checkpoint.md +10 -15
  14. package/comandos/swl/claudemd.md +239 -234
  15. package/comandos/swl/compactar.md +29 -2
  16. package/comandos/swl/configurar-ci.md +20 -19
  17. package/comandos/swl/cron.md +10 -12
  18. package/comandos/swl/discutir-fase.md +8 -5
  19. package/comandos/swl/ejecutar-fase.md +15 -2
  20. package/comandos/swl/evolucionar.md +6 -11
  21. package/comandos/swl/inbox.md +10 -10
  22. package/comandos/swl/modelo.md +7 -9
  23. package/comandos/swl/notificaciones.md +19 -116
  24. package/comandos/swl/nuevo-proyecto.md +205 -205
  25. package/comandos/swl/planear-fase.md +5 -3
  26. package/comandos/swl/release.md +46 -0
  27. package/comandos/swl/status.md +333 -279
  28. package/comandos/swl/verificar.md +817 -812
  29. package/habilidades/changelog-generator/scripts/parse-commits.js +6 -4
  30. package/habilidades/ejecutar-fase/SKILL.md +541 -518
  31. package/habilidades/planear-fase/SKILL.md +3 -2
  32. package/habilidades/swl-claudemd/SKILL.md +10 -6
  33. package/habilidades/tdd-workflow/SKILL.md +715 -713
  34. package/habilidades/validacion-ci-sistema/SKILL.md +17 -1
  35. package/hooks/calidad-pre-commit.js +5 -1
  36. package/hooks/check-update.js +39 -1
  37. package/hooks/lib/autonomia.js +208 -0
  38. package/hooks/lib/briefing.js +474 -0
  39. package/hooks/lib/propose-step.js +358 -0
  40. package/hooks/session-briefing.js +98 -0
  41. package/hooks/telemetria-skill-routing.js +100 -0
  42. package/instintos/autonomia.yaml +27 -0
  43. package/llms.txt +4 -4
  44. package/manifiestos/hooks-config.json +18 -0
  45. package/manifiestos/modulos.json +25 -3
  46. package/manifiestos/skills-lock.json +17 -17
  47. package/package.json +93 -93
  48. package/plugin.json +371 -371
  49. package/reglas/analizar-directorios-antes-de-escribir.md +228 -0
  50. package/reglas/consultar-vault-primero.md +195 -0
  51. package/reglas/debatir-antes-de-aceptar.md +158 -0
  52. package/reglas/git-coauthor.md +100 -0
  53. package/reglas/monitor-ci.md +309 -0
  54. package/reglas/registro-componentes-nuevos.md +38 -10
  55. package/reglas/sesiones-paralelas.md +180 -0
  56. package/reglas/usar-code-review-graph.md +155 -0
  57. package/reglas/verificar-citas-normativas.md +548 -0
  58. package/scripts/auditar-claudemd.js +38 -0
  59. package/scripts/cli/aprobar-plan.js +73 -0
  60. package/scripts/cli/briefing.js +23 -0
  61. package/scripts/cli/ciclo-evolucion.js +26 -0
  62. package/scripts/cli/configurar-ci.js +40 -0
  63. package/scripts/cli/derivar-feature-list.js +25 -0
  64. package/scripts/cli/detectar-host.js +27 -0
  65. package/scripts/cli/diary-entry.js +69 -0
  66. package/scripts/cli/execution-state.js +18 -0
  67. package/scripts/cli/gateway-notify.js +41 -0
  68. package/scripts/cli/liberar-fase.js +42 -0
  69. package/scripts/cli/loop-telemetry.js +125 -0
  70. package/scripts/cli/mark-evolved.js +56 -0
  71. package/scripts/cli/metricas-dora.js +26 -0
  72. package/scripts/cli/near-duplicate.js +55 -0
  73. package/scripts/cli/notificaciones.js +123 -0
  74. package/scripts/cli/propose-step.js +29 -0
  75. package/scripts/cli/schedule-parse.js +19 -0
  76. package/scripts/cli/sugerir-modelo.js +20 -0
  77. package/scripts/cli/verificar-plan.js +36 -0
  78. package/scripts/cli/verificar-trazabilidad.js +35 -0
  79. package/scripts/derivar-feature-list.js +1 -0
  80. package/scripts/instalador.js +52 -6
  81. package/scripts/lib/auditar-invocaciones-comandos.js +104 -0
  82. package/scripts/lib/ci-reader.js +193 -0
  83. package/scripts/lib/detectar-host-swl.js +175 -0
  84. package/scripts/lib/evidencia-release.js +322 -0
  85. package/scripts/lib/gate-hooks-requires.js +249 -0
  86. package/scripts/lib/gate-licencias.js +212 -0
  87. package/scripts/lib/git-metricas.js +257 -0
  88. package/scripts/lib/metricas-dora.js +204 -0
  89. package/scripts/lib/resolver-plan-fase.js +37 -0
  90. package/scripts/tui/ejecutores.js +1 -1
  91. package/scripts/validar-manifest.js +92 -1
  92. package/scripts/validar.js +13 -0
  93. package/scripts/verificar-evolucion.js +54 -4
  94. package/scripts/verificar-release.js +102 -0
  95. package/scripts/verificar-trazabilidad.js +12 -6
  96. package/reglas/arquitectura.evolved.json +0 -7
  97. package/reglas/seguridad.evolved.json +0 -7
@@ -218,16 +218,19 @@ Estructura del archivo:
218
218
  [descripción de pantallas]
219
219
 
220
220
  ## Criterios de aceptación (REQ)
221
- [criterios binarios y verificables con ID estable REQ-NN trazabilidad G4:
222
- - **REQ-01**: [criterio binario verificable]
223
- - **REQ-02**: [criterio binario verificable]
221
+ [criterios binarios y verificables con ID estable namespaceado por fase
222
+ `REQ-<fase>-NN` (DT-IDS-NAMESPACE, fases ≥12) — trazabilidad G4:
223
+ - **REQ-12-01**: [criterio binario verificable]
224
+ - **REQ-12-02**: [criterio binario verificable]
225
+ Las fases 01-11 conservan el formato plano `REQ-NN` (gracia legacy permanente,
226
+ no se renumeran). `verificar-trazabilidad.js` acepta ambos formatos.
224
227
  Un REQ emitido NUNCA se renumera ni se reusa: si un criterio se descarta, marcarlo
225
228
  "RETIRADO — razón" conservando el número. planear-fase exige que cada tarea T-NN
226
229
  declare qué REQ verifica (matriz REQ×T) y aprobar-plan rechaza planes con REQ
227
230
  huérfanos. verificar-trazabilidad.js valida la cadena REQ→T→commit→test al cierre.
228
231
  Método de verificación: por default cada REQ exige un test con marker
229
- `verifica: REQ-NN`; los REQ satisfechos por prosa/docs/configuración llevan la
230
- anotación `(verificación: inspección)` en el criterio — exigen tarea y commit
232
+ `verifica: REQ-<fase>-NN`; los REQ satisfechos por prosa/docs/configuración llevan
233
+ la anotación `(verificación: inspección)` en el criterio — exigen tarea y commit
231
234
  pero no test automatizado.]
232
235
 
233
236
  ## Riesgos identificados
@@ -13,6 +13,13 @@ evolved-note: "Paso 4.2 — cota dura 30k tokens al prompt del sub-agente para p
13
13
 
14
14
  Eres el coordinador de ejecución SWL. Orquestas la implementación real del código para una fase, delegando al agente implementador-swl, verificando cada slice y manteniendo el estado del proyecto actualizado.
15
15
 
16
+ > **Invocación cross-scope** (ver `@docs/invocacion-cli-cross-scope.md`): los
17
+ > gates G0/G1 y el anexo propositivo viven en subcomandos del CLI. Usa la forma
18
+ > `swl-ses <sub>`; si estás en el repo madre usa `node scripts/cli/<sub>.js`; si
19
+ > no hay bin en PATH, `npx -y @saulwade/swl-ses@latest <sub>`. NUNCA invoques
20
+ > `node -e "require('./scripts/lib/...')"` ni `node hooks/lib/...` con ruta
21
+ > relativa al proyecto — no existen downstream.
22
+
16
23
  ## Uso
17
24
 
18
25
  ```
@@ -83,7 +90,7 @@ Verifica en orden:
83
90
  6. **Gate G1 — verificación de integridad del plan firmado**: tras confirmar
84
91
  `estado: aprobado`, recomputa el hash del PLAN y compáralo contra su lock:
85
92
  ```bash
86
- node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
93
+ swl-ses verificar-plan --fase=N
87
94
  ```
88
95
  Interpreta el resultado:
89
96
  - `ok: true, modo: "firmado"` → el plan no fue mutado tras su aprobación.
@@ -167,6 +174,12 @@ Según tipo de error:
167
174
 
168
175
  Al completar todos los slices, genera `.planning/fases/0N-RESUMEN.md` con: slices implementados (commits, archivos), resultados de tests, desviaciones del plan, decisiones técnicas, deuda técnica, estado final, criterios de aceptación verificados, próximos pasos.
169
176
 
177
+ **Anexo propositivo (Fase 13, ADR-0037)**: antes de cerrar, ejecuta el propose-step
178
+ sobre el diff de la fase (`swl-ses propose-step --rango=<base>..HEAD`) e
179
+ incluye una sección "Anexo propositivo" en el RESUMEN.md **solo si hay ≥1 señal** de
180
+ adyacencia (auth/PII/pagos, migración de schema). Si no hay señal, omite la sección
181
+ (silencio, no sección vacía). El anexo propone, nunca bloquea. Opt-out `SWL_PROPOSE=0`.
182
+
170
183
  ## Paso 7 — Actualización de HOJA-RUTA.md y ESTADO.md
171
184
 
172
185
  Marca fase completada en HOJA-RUTA.md con fecha. Actualiza ESTADO.md con estado general.
@@ -176,7 +189,7 @@ la fase ya no está en ejecución y `hooks/spec-gate.js` debe volver a advertir
176
189
  escribe código sin una nueva fase aprobada:
177
190
 
178
191
  ```bash
179
- node -e "const fs=require('fs'); const p='.planning/locks/fase-activa.json'; if(fs.existsSync(p)){fs.unlinkSync(p); console.log('fase activa liberada')} else {console.log('sin fase activa que liberar')}"
192
+ swl-ses liberar-fase
180
193
  ```
181
194
 
182
195
  NO eliminar el `.lock` del plan (`0N-PLAN.md.lock`) — ese es evidencia de
@@ -134,19 +134,14 @@ Aplica siguiendo las reglas de governance y safety checks del skill:
134
134
 
135
135
  Respeta la governance: PARCHE auto-aplicable, MENOR requiere revisión, MAYOR requiere aprobación humana. Modificar agentes siempre requiere aprobación humana.
136
136
 
137
- **OBLIGATORIO — Marcar como evolucionado ejecutando este comando Bash**:
137
+ **OBLIGATORIO — Marcar como evolucionado** con el subcomando del CLI (resuelve
138
+ cross-scope; ver `docs/invocacion-cli-cross-scope.md`):
138
139
 
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: 'evolucionar',
146
- note: '[descripción breve del cambio]'
147
- });
148
- console.log(r.marked ? 'Marcado como evolucionado' : 'Error: ' + r.error);
149
- "
141
+ swl-ses mark-evolved "[RUTA_ARCHIVO_MODIFICADO]" \
142
+ --by=evolucionar \
143
+ --note="[descripción breve del cambio]"
144
+ # fallback: npx -y @saulwade/swl-ses@latest mark-evolved "[RUTA]" --by=evolucionar --note="..."
150
145
  ```
151
146
 
152
147
  Reemplazar los placeholders entre corchetes con los valores reales.
@@ -58,16 +58,16 @@ node -e "const R = require('./gateway/command-relay'); const fs = require('fs');
58
58
 
59
59
  ### Paso 4 — Notificar de vuelta al usuario (opcional)
60
60
 
61
- Si el comando merece respuesta al canal origen (Telegram, Discord), encolar un `gateway_notification`:
62
-
63
- ```javascript
64
- const { notificarGateway } = require('./hooks/lib/gateway-notify');
65
- notificarGateway({
66
- tipo: 'custom',
67
- texto: '✅ Comando procesado: <resumen>',
68
- to: 'telegram', // o el adaptador de donde vino
69
- payload: { replyTo: '<chatId>' }
70
- });
61
+ Si el comando merece respuesta al canal origen (Telegram, Discord), encolar un
62
+ `gateway_notification` con el subcomando del CLI (resuelve cross-scope; ver
63
+ `docs/invocacion-cli-cross-scope.md`):
64
+
65
+ ```bash
66
+ swl-ses gateway-notify \
67
+ --texto="✅ Comando procesado: <resumen>" \
68
+ --to=telegram \
69
+ --reply-to="<chatId>"
70
+ # fallback: npx -y @saulwade/swl-ses@latest gateway-notify --texto="..." --to=telegram --reply-to="<chatId>"
71
71
  ```
72
72
 
73
73
  ### Paso 5 — Auditar
@@ -35,19 +35,17 @@ Si el usuario pasó una descripción entre comillas, usar esa descripción direc
35
35
 
36
36
  ## Paso 2 — Evaluar complejidad
37
37
 
38
- Cargar la lógica de evaluación usando el módulo `hooks/lib/model-router.js`.
38
+ Evaluar la complejidad con el subcomando del CLI (resuelve cross-scope: repo
39
+ madre / `swl-ses` en PATH / `npx`; ver `docs/invocacion-cli-cross-scope.md`):
39
40
 
40
41
  ```bash
41
- node -e "
42
- const { sugerirModelo } = require('./hooks/lib/model-router.js');
43
- const desc = process.argv[1] || '';
44
- const result = sugerirModelo(desc);
45
- console.log(JSON.stringify(result, null, 2));
46
- " "DESCRIPCIÓN_DE_LA_TAREA"
42
+ swl-ses sugerir-modelo "DESCRIPCIÓN_DE_LA_TAREA"
43
+ # fallback si swl-ses no está en PATH:
44
+ # npx -y @saulwade/swl-ses@latest sugerir-modelo "DESCRIPCIÓN_DE_LA_TAREA"
47
45
  ```
48
46
 
49
- Si el script falla (el módulo no existe o hay error de Node), aplicar la
50
- tabla de routing manualmente (ver Paso 3).
47
+ Si el subcomando falla (CLI no disponible), aplicar la tabla de routing
48
+ manualmente (ver Paso 3).
51
49
 
52
50
  ## Paso 3 — Tabla de routing manual (fallback)
53
51
 
@@ -191,50 +191,21 @@ Subcomandos disponibles:
191
191
 
192
192
  ### Paso 2 — Ejecutar según subcomando
193
193
 
194
- **Para `init`**:
194
+ Todos los subcomandos usan el CLI cross-scope (resuelve repo madre / `swl-ses`
195
+ en PATH / `npx`; ver `docs/invocacion-cli-cross-scope.md`). El subcomando
196
+ encapsula el formato de salida y la detección de TTY.
195
197
 
196
- ```bash
197
- node -e "
198
- const { init } = require('./scripts/lib/notificaciones-telegram');
199
- init({ esTty: true }).then(r => {
200
- console.log('[resultado]', r.resultado, r.detalle || '');
201
- process.exit(r.resultado === 'error' ? 1 : 0);
202
- }).catch(e => { console.error(e.message); process.exit(1); });
203
- "
204
- ```
198
+ **Para `init`** (requiere TTY; el subcomando detecta su ausencia y guía):
205
199
 
206
- Si el proceso no tiene TTY (modo no interactivo en Claude Code), detectarlo
207
- y mostrar instrucciones para ejecutar desde terminal:
208
-
209
- ```
210
- Este subcomando requiere entrada interactiva (TTY).
211
- Ejecuta desde tu terminal:
212
- node -e "require('./scripts/lib/notificaciones-telegram').init({ esTty: true })"
213
- O usa el instalador:
214
- npx @saulwade/swl-ses@latest install
200
+ ```bash
201
+ swl-ses notificaciones init
202
+ # fallback: npx -y @saulwade/swl-ses@latest notificaciones init
215
203
  ```
216
204
 
217
205
  **Para `status`**:
218
206
 
219
207
  ```bash
220
- node -e "
221
- const { status } = require('./scripts/lib/notificaciones-telegram');
222
- const s = status();
223
- console.log('');
224
- console.log('Notificaciones Telegram — estado actual');
225
- console.log(' .env: ', s.envExiste ? 'existe' : 'no existe');
226
- console.log(' token: ', s.tokenConfigurado ? 'configurado' : 'no configurado');
227
- console.log(' chat_id: ', s.chatIdConfigurado ? ('configurado (' + s.chatIdParcial + ')') : 'no configurado');
228
- const mudos = s.proyectosSilenciados.length
229
- ? s.proyectosSilenciados.join(', ')
230
- : 'ninguno';
231
- console.log(' proyectos mudos: ', mudos);
232
- const botS = require('./scripts/lib/notificaciones-telegram').botStatus();
233
- console.log(' bot daemon: ', botS.activo ? ('activo (PID ' + botS.pid + ')') : 'detenido');
234
- const autostartLabel = process.platform === 'win32' ? 'Scheduled Task' : (process.platform === 'linux' ? 'systemd --user' : 'LaunchAgent');
235
- console.log(' autostart: usar /swl:notificaciones bot enable-autostart (' + autostartLabel + ')');
236
- console.log('');
237
- "
208
+ swl-ses notificaciones status
238
209
  ```
239
210
 
240
211
  **Para `disable`**:
@@ -247,122 +218,54 @@ Antes de invocar la lib, pedir confirmación al usuario:
247
218
 
248
219
  Si responde `n` o vacío: cancelar sin tocar nada.
249
220
 
250
- Si responde `s`:
221
+ Si responde `s` (agregar `--purge` para eliminar también las credenciales, tras
222
+ confirmación adicional del usuario):
251
223
 
252
224
  ```bash
253
- node -e "
254
- const { disable } = require('./scripts/lib/notificaciones-telegram');
255
- const r = disable({ confirmar: true, conservarEnv: true });
256
- console.log('[resultado]', r.resultado, r.detalle || '');
257
- process.exit(r.resultado === 'error' ? 1 : 0);
258
- "
259
- ```
260
-
261
- Si se pasó `--purge`, pedir confirmación adicional:
262
- ```
263
- ¿Eliminar también las credenciales (~/.claude/notifications/.env)? [s/N]
225
+ swl-ses notificaciones disable # conserva ~/.claude/notifications/.env
226
+ swl-ses notificaciones disable --purge # elimina también las credenciales
264
227
  ```
265
- Si confirma, llamar con `conservarEnv: false`.
266
228
 
267
229
  **Para `repair`**:
268
230
 
269
231
  ```bash
270
- node -e "
271
- const { repair } = require('./scripts/lib/notificaciones-telegram');
272
- repair().then(r => {
273
- console.log('[repair]', r.resultado, r.detalle || '');
274
- process.exit(r.resultado === 'error' ? 1 : 0);
275
- }).catch(e => { console.error(e.message); process.exit(1); });
276
- "
232
+ swl-ses notificaciones repair
277
233
  ```
278
234
 
279
235
  **Para `bot start`**:
280
236
 
281
237
  ```bash
282
- node -e "
283
- const { botStart } = require('./scripts/lib/notificaciones-telegram');
284
- const r = botStart();
285
- if (r.ok) {
286
- console.log('[bot]', r.mensaje || 'Bot iniciado.');
287
- } else {
288
- console.error('[bot] Error:', r.error);
289
- process.exit(1);
290
- }
291
- "
238
+ swl-ses notificaciones bot-start
292
239
  ```
293
240
 
294
241
  **Para `bot stop`**:
295
242
 
296
243
  ```bash
297
- node -e "
298
- const { botStop } = require('./scripts/lib/notificaciones-telegram');
299
- const r = botStop();
300
- if (r.ok) {
301
- console.log('[bot]', r.mensaje || 'Bot detenido.');
302
- } else {
303
- console.error('[bot] Error:', r.error);
304
- process.exit(1);
305
- }
306
- "
244
+ swl-ses notificaciones bot-stop
307
245
  ```
308
246
 
309
247
  **Para `bot status`**:
310
248
 
311
249
  ```bash
312
- node -e "
313
- const { botStatus } = require('./scripts/lib/notificaciones-telegram');
314
- const r = botStatus();
315
- console.log('');
316
- console.log('Bot daemon — estado actual');
317
- console.log(' activo:', r.activo ? 'sí' : 'no');
318
- console.log(' pid: ', r.pid !== null ? r.pid : 'n/a');
319
- console.log('');
320
- "
250
+ swl-ses notificaciones bot-status
321
251
  ```
322
252
 
323
253
  **Para `bot restart`**:
324
254
 
325
255
  ```bash
326
- node -e "
327
- const { botRestart } = require('./scripts/lib/notificaciones-telegram');
328
- const r = botRestart();
329
- if (r.ok) {
330
- console.log('[bot]', r.mensaje || 'Bot reiniciado.');
331
- } else {
332
- console.error('[bot] Error:', r.error);
333
- process.exit(1);
334
- }
335
- "
256
+ swl-ses notificaciones bot-restart
336
257
  ```
337
258
 
338
259
  **Para `bot enable-autostart`**:
339
260
 
340
261
  ```bash
341
- node -e "
342
- const { botEnableAutostart } = require('./scripts/lib/notificaciones-telegram');
343
- const r = botEnableAutostart();
344
- if (r.ok) {
345
- console.log('[autostart]', r.mensaje || 'Autostart habilitado.');
346
- } else {
347
- console.error('[autostart] Error:', r.error);
348
- process.exit(1);
349
- }
350
- "
262
+ swl-ses notificaciones bot-enable-autostart
351
263
  ```
352
264
 
353
265
  **Para `bot disable-autostart`**:
354
266
 
355
267
  ```bash
356
- node -e "
357
- const { botDisableAutostart } = require('./scripts/lib/notificaciones-telegram');
358
- const r = botDisableAutostart();
359
- if (r.ok) {
360
- console.log('[autostart]', r.mensaje || 'Autostart deshabilitado.');
361
- } else {
362
- console.error('[autostart] Error:', r.error);
363
- process.exit(1);
364
- }
365
- "
268
+ swl-ses notificaciones bot-disable-autostart
366
269
  ```
367
270
 
368
271
  ### Paso 3 — Reportar resultado