@saulwade/swl-ses 2.1.0 → 2.2.1

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 (113) hide show
  1. package/CLAUDE.md +199 -196
  2. package/README.md +597 -579
  3. package/agentes/arquitecto-swl.md +0 -5
  4. package/agentes/backend-python-swl.md +0 -5
  5. package/agentes/implementador-swl.md +0 -5
  6. package/agentes/nemesis-auditor-swl.md +0 -5
  7. package/agentes/orquestador-swl.md +0 -5
  8. package/agentes/planificador-swl.md +0 -5
  9. package/agentes/revisor-codigo-swl.md +0 -5
  10. package/bin/swl-ses.js +63 -0
  11. package/comandos/swl/adoptar-proyecto.md +12 -14
  12. package/comandos/swl/aprender.md +30 -47
  13. package/comandos/swl/aprobar-plan.md +23 -35
  14. package/comandos/swl/autoresearch.md +12 -14
  15. package/comandos/swl/briefing.md +5 -8
  16. package/comandos/swl/checkpoint.md +10 -15
  17. package/comandos/swl/claudemd.md +12 -12
  18. package/comandos/swl/configurar-ci.md +20 -19
  19. package/comandos/swl/cron.md +10 -12
  20. package/comandos/swl/ejecutar-fase.md +10 -8
  21. package/comandos/swl/evolucionar.md +6 -11
  22. package/comandos/swl/inbox.md +10 -10
  23. package/comandos/swl/modelo.md +7 -9
  24. package/comandos/swl/notificaciones.md +19 -116
  25. package/comandos/swl/nuevo-proyecto.md +9 -14
  26. package/comandos/swl/release.md +19 -5
  27. package/comandos/swl/revisar-impacto.md +0 -5
  28. package/comandos/swl/status.md +333 -348
  29. package/comandos/swl/verificar.md +817 -813
  30. package/habilidades/agent-browser/SKILL.md +0 -5
  31. package/habilidades/angular-moderno/SKILL.md +0 -5
  32. package/habilidades/api-rest-diseno/SKILL.md +0 -5
  33. package/habilidades/aprendizaje-continuo/SKILL.md +0 -5
  34. package/habilidades/auth-patrones/SKILL.md +0 -5
  35. package/habilidades/build-errors-nextjs/SKILL.md +0 -5
  36. package/habilidades/changelog-generator/SKILL.md +174 -179
  37. package/habilidades/checklist-seguridad/SKILL.md +0 -5
  38. package/habilidades/contenedores-docker/SKILL.md +0 -5
  39. package/habilidades/datos-etl/SKILL.md +0 -5
  40. package/habilidades/doc-sync/SKILL.md +0 -5
  41. package/habilidades/extractor-de-aprendizajes/SKILL.md +0 -5
  42. package/habilidades/fastapi-experto/SKILL.md +0 -5
  43. package/habilidades/frontend-avanzado/SKILL.md +0 -5
  44. package/habilidades/iam-secretos/SKILL.md +0 -5
  45. package/habilidades/manejo-errores/SKILL.md +0 -5
  46. package/habilidades/mapear-codebase/SKILL.md +0 -5
  47. package/habilidades/meta-skills-estandar/SKILL.md +0 -5
  48. package/habilidades/monitoring-alertas/SKILL.md +0 -5
  49. package/habilidades/nextjs-experto/SKILL.md +0 -5
  50. package/habilidades/nextjs-testing/SKILL.md +0 -5
  51. package/habilidades/node-experto/SKILL.md +0 -5
  52. package/habilidades/orquestacion-async/SKILL.md +0 -5
  53. package/habilidades/patrones-python/SKILL.md +227 -232
  54. package/habilidades/planear-fase/SKILL.md +336 -341
  55. package/habilidades/postgresql-experto/SKILL.md +0 -5
  56. package/habilidades/prevencion-sobreingenieria/SKILL.md +0 -5
  57. package/habilidades/protocolo-revision-swl/SKILL.md +0 -5
  58. package/habilidades/react-experto/SKILL.md +0 -5
  59. package/habilidades/release-semver/SKILL.md +0 -5
  60. package/habilidades/swl-claudemd/SKILL.md +10 -11
  61. package/habilidades/tdd-workflow/SKILL.md +710 -715
  62. package/habilidades/testing-python/SKILL.md +335 -340
  63. package/habilidades/verificar-trabajo/SKILL.md +0 -5
  64. package/hooks/lib/evolution-tracker.js +191 -35
  65. package/hooks/lib/propose-step.js +1 -0
  66. package/llms.txt +1 -1
  67. package/manifiestos/canonical-hashes.json +656 -0
  68. package/manifiestos/modulos.json +3 -0
  69. package/manifiestos/skills-lock.json +71 -71
  70. package/package.json +1 -1
  71. package/plugin.json +1 -1
  72. package/scripts/auditar-claudemd.js +38 -0
  73. package/scripts/cli/aprobar-plan.js +73 -0
  74. package/scripts/cli/briefing.js +23 -0
  75. package/scripts/cli/ciclo-evolucion.js +26 -0
  76. package/scripts/cli/configurar-ci.js +40 -0
  77. package/scripts/cli/derivar-feature-list.js +25 -0
  78. package/scripts/cli/detectar-host.js +27 -0
  79. package/scripts/cli/diary-entry.js +69 -0
  80. package/scripts/cli/execution-state.js +18 -0
  81. package/scripts/cli/gateway-notify.js +41 -0
  82. package/scripts/cli/liberar-fase.js +42 -0
  83. package/scripts/cli/loop-telemetry.js +125 -0
  84. package/scripts/cli/mark-evolved.js +56 -0
  85. package/scripts/cli/metricas-dora.js +26 -0
  86. package/scripts/cli/near-duplicate.js +55 -0
  87. package/scripts/cli/notificaciones.js +123 -0
  88. package/scripts/cli/propose-step.js +29 -0
  89. package/scripts/cli/schedule-parse.js +19 -0
  90. package/scripts/cli/sugerir-modelo.js +20 -0
  91. package/scripts/cli/verificar-plan.js +36 -0
  92. package/scripts/cli/verificar-trazabilidad.js +35 -0
  93. package/scripts/derivar-feature-list.js +1 -0
  94. package/scripts/generar-canonical-hashes.js +147 -0
  95. package/scripts/instalador.js +126 -53
  96. package/scripts/lib/audit-evolved.js +71 -0
  97. package/scripts/lib/auditar-invocaciones-comandos.js +104 -0
  98. package/scripts/lib/canonical-hash.js +94 -0
  99. package/scripts/lib/evolved-fuente.js +138 -0
  100. package/scripts/lib/resolver-plan-fase.js +37 -0
  101. package/scripts/remediar-evolved-instaladas.js +239 -0
  102. package/scripts/validar.js +27 -0
  103. package/scripts/verificar-evolucion.js +36 -0
  104. package/scripts/verificar-release.js +33 -0
  105. package/scripts/verificar-trazabilidad.js +1 -1
  106. package/agentes/.evolved.json +0 -9
  107. package/comandos/swl/.evolved.json +0 -23
  108. package/habilidades/auth-patrones/.evolved.json +0 -9
  109. package/habilidades/extractor-de-aprendizajes/.evolved.json +0 -9
  110. package/habilidades/instalar-sistema/.evolved.json +0 -9
  111. package/habilidades/manejo-errores/.evolved.json +0 -9
  112. package/habilidades/node-experto/.evolved.json +0 -9
  113. package/habilidades/release-semver/.evolved.json +0 -9
@@ -59,16 +59,14 @@ Si el usuario omite `init` e invoca con flags directos, respetar esos flags sin
59
59
 
60
60
  ### Paso 3 — Copiar workflows
61
61
 
62
- Invocar `scripts/lib/configurar-ci.js` con las opciones seleccionadas:
62
+ Invocar el subcomando del CLI (resuelve cross-scope; ver
63
+ `docs/invocacion-cli-cross-scope.md`). Imprime el resultado como JSON
64
+ (`copiados`, `existentes`, `error`):
63
65
 
64
- ```javascript
65
- const { init } = require('./scripts/lib/configurar-ci');
66
- const resultado = init({
67
- withSecurity: true,
68
- withCi: true,
69
- withReleasePlease: false,
70
- // dryRun: true, // con --dry-run
71
- });
66
+ ```bash
67
+ swl-ses configurar-ci init
68
+ # flags: --no-security --no-ci --with-release-please --dry-run --force
69
+ # fallback: npx -y @saulwade/swl-ses@latest configurar-ci init
72
70
  ```
73
71
 
74
72
  Si hay archivos existentes en `resultado.existentes`, preguntar:
@@ -78,7 +76,7 @@ Los siguientes workflows ya existen en .github/workflows/:
78
76
  ¿Sobreescribir? (s/N)
79
77
  ```
80
78
 
81
- Si el usuario dice que sí, volver a llamar `init` con `force: true`.
79
+ Si el usuario dice que sí, volver a llamar el subcomando con `--force`.
82
80
 
83
81
  ### Paso 4 — Configurar CLAUDE_API_KEY (solo si se instaló swl-security.yml)
84
82
 
@@ -152,14 +150,15 @@ Próximos pasos:
152
150
 
153
151
  ## /swl:configurar-ci status
154
152
 
155
- Muestra el estado actual de los workflows SWL en el proyecto.
153
+ Muestra el estado actual de los workflows SWL en el proyecto. Subcomando del CLI
154
+ (salida JSON con `instalados`, `faltantes`, `secretsFaltantes`):
156
155
 
157
- ```javascript
158
- const { status } = require('./scripts/lib/configurar-ci');
159
- const resultado = status();
156
+ ```bash
157
+ swl-ses configurar-ci status
158
+ # fallback: npx -y @saulwade/swl-ses@latest configurar-ci status
160
159
  ```
161
160
 
162
- Formato de salida:
161
+ Formato de salida (presentar al usuario a partir del JSON):
163
162
 
164
163
  ```
165
164
  Workflows SWL en .github/workflows/:
@@ -187,11 +186,13 @@ gh secret list 2>/dev/null | grep CLAUDE_API_KEY
187
186
 
188
187
  Elimina los workflows gestionados por swl-ses. No toca branch protection ni otros workflows.
189
188
 
190
- ```javascript
191
- const { uninstall } = require('./scripts/lib/configurar-ci');
189
+ Subcomando del CLI (salida JSON). Primero listar qué se eliminaría (sin
190
+ confirmar), luego repetir con `--confirmar`:
192
191
 
193
- // Primero listar qué se eliminaría (sin confirmar)
194
- const plan = uninstall({ confirmar: false });
192
+ ```bash
193
+ swl-ses configurar-ci uninstall # plan (confirmar: false)
194
+ swl-ses configurar-ci uninstall --confirmar # ejecuta la eliminación
195
+ # fallback: npx -y @saulwade/swl-ses@latest configurar-ci uninstall [--confirmar]
195
196
  ```
196
197
 
197
198
  Mostrar:
@@ -160,21 +160,19 @@ deliverResult(job, result, process.cwd());
160
160
 
161
161
  ## Parser de lenguaje natural programático (experimental)
162
162
 
163
- El módulo `scripts/lib/schedule-parser.js` proporciona parseo programático de
164
- frases en inglés a expresiones cron, disponible para scripts y extensiones del
165
- comando. No requiere dependencias externas.
163
+ El subcomando `swl-ses schedule-parse` parsea frases en inglés a expresiones
164
+ cron (resuelve cross-scope; ver `docs/invocacion-cli-cross-scope.md`). No
165
+ requiere dependencias externas.
166
166
 
167
- Uso desde Node.js:
168
- ```javascript
169
- const { parseNaturalSchedule, isCronDue } = require('./scripts/lib/schedule-parser');
170
-
171
- // "every morning at 9am" → { cron: '0 9 * * *', descripcion: 'Diariamente a las 9:00 AM' }
172
- const resultado = parseNaturalSchedule('every morning at 9am');
173
-
174
- // Verificar si una expresión cron debe ejecutarse ahora
175
- const pendiente = isCronDue('0 9 * * *', Date.now(), ultimaEjecucionMs);
167
+ ```bash
168
+ # "every morning at 9am" → { "cron": "0 9 * * *", "descripcion": "Diariamente a las 9 AM" }
169
+ swl-ses schedule-parse "every morning at 9am"
170
+ # fallback: npx -y @saulwade/swl-ses@latest schedule-parse "every morning at 9am"
176
171
  ```
177
172
 
173
+ La verificación de si un cron debe ejecutarse ahora (`isCronDue`) la usa el
174
+ motor de scheduling internamente; no se expone como subcomando.
175
+
178
176
  Frases reconocidas:
179
177
  - `"hourly"` → `0 * * * *`
180
178
  - `"daily"` / `"every day"` → `0 9 * * *`
@@ -2,17 +2,19 @@
2
2
  name: swl:ejecutar-fase
3
3
  description: Recibe el número de una fase y la implementa siguiendo el PLAN.md. Delega al agente implementador-swl, hace commits atómicos por slice, produce RESUMEN.md y actualiza ESTADO.md y HOJA-RUTA.md al terminar.
4
4
  allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
5
- evolved: true
6
- evolved-from: "1.6.8"
7
- evolved-at: "2026-05-22"
8
- evolved-by: "aprender"
9
- evolved-note: "Paso 4.2 — cota dura 30k tokens al prompt del sub-agente para prevenir autocompact thrashing (origen SIGAF 2026-05-22)"
10
5
  ---
11
6
 
12
7
  # /swl:ejecutar-fase <n> [--iterative] — Ejecutar implementación de una fase
13
8
 
14
9
  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
10
 
11
+ > **Invocación cross-scope** (ver `@docs/invocacion-cli-cross-scope.md`): los
12
+ > gates G0/G1 y el anexo propositivo viven en subcomandos del CLI. Usa la forma
13
+ > `swl-ses <sub>`; si estás en el repo madre usa `node scripts/cli/<sub>.js`; si
14
+ > no hay bin en PATH, `npx -y @saulwade/swl-ses@latest <sub>`. NUNCA invoques
15
+ > `node -e "require('./scripts/lib/...')"` ni `node hooks/lib/...` con ruta
16
+ > relativa al proyecto — no existen downstream.
17
+
16
18
  ## Uso
17
19
 
18
20
  ```
@@ -83,7 +85,7 @@ Verifica en orden:
83
85
  6. **Gate G1 — verificación de integridad del plan firmado**: tras confirmar
84
86
  `estado: aprobado`, recomputa el hash del PLAN y compáralo contra su lock:
85
87
  ```bash
86
- node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
88
+ swl-ses verificar-plan --fase=N
87
89
  ```
88
90
  Interpreta el resultado:
89
91
  - `ok: true, modo: "firmado"` → el plan no fue mutado tras su aprobación.
@@ -168,7 +170,7 @@ Según tipo de error:
168
170
  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
171
 
170
172
  **Anexo propositivo (Fase 13, ADR-0037)**: antes de cerrar, ejecuta el propose-step
171
- sobre el diff de la fase (`node hooks/lib/propose-step.js --rango=<base>..HEAD`) e
173
+ sobre el diff de la fase (`swl-ses propose-step --rango=<base>..HEAD`) e
172
174
  incluye una sección "Anexo propositivo" en el RESUMEN.md **solo si hay ≥1 señal** de
173
175
  adyacencia (auth/PII/pagos, migración de schema). Si no hay señal, omite la sección
174
176
  (silencio, no sección vacía). El anexo propone, nunca bloquea. Opt-out `SWL_PROPOSE=0`.
@@ -182,7 +184,7 @@ la fase ya no está en ejecución y `hooks/spec-gate.js` debe volver a advertir
182
184
  escribe código sin una nueva fase aprobada:
183
185
 
184
186
  ```bash
185
- 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')}"
187
+ swl-ses liberar-fase
186
188
  ```
187
189
 
188
190
  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
@@ -2,11 +2,6 @@
2
2
  name: swl:nuevo-proyecto
3
3
  description: Inicializa un proyecto nuevo desde cero. Hace preguntas al usuario, investiga el stack tecnológico y produce la estructura de planeación completa en .planning/.
4
4
  allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
5
- evolved: true
6
- evolved-from: "1.6.8"
7
- evolved-at: "2026-05-22"
8
- evolved-by: "aprender"
9
- evolved-note: "Paso 6 — validación síncrona del auditor tras generar CLAUDE.md inicial (contrato cruzado con /swl:claudemd)"
10
5
  ---
11
6
 
12
7
  # /swl:nuevo-proyecto — Inicializar proyecto nuevo
@@ -149,17 +144,17 @@ primera sección bajo el título:
149
144
  ```markdown
150
145
  ## Reglas obligatorias
151
146
 
152
- @reglas/usar-sistema-swl.md
147
+ Aplica la regla global `usar-sistema-swl.md` (matriz operacional del sistema
148
+ SWL), auto-cargada desde `.claude/rules/`. NO duplicar su contenido aquí.
153
149
  ```
154
150
 
155
- Esta referencia carga la matriz operacional del sistema SWL al inicio de cada
156
- sesión del proyecto y previene que el agente haga trabajo directo cuando
157
- existe un componente especializado. Sin ella, el proyecto pierde el contrato
158
- de uso del sistema SWL.
151
+ Esta mención recuerda la matriz operacional del sistema SWL sin @-include. NO
152
+ usar `@reglas/usar-sistema-swl.md`: la regla se auto-carga desde `.claude/rules/`
153
+ y un `@reglas/...` se rompe en proyectos downstream (ahí no existe `reglas/`).
159
154
 
160
- Si ya existe `CLAUDE.md` (verificado en Paso 1), revisar que incluya
161
- `@reglas/usar-sistema-swl.md` en la sección de reglas obligatorias. Si NO
162
- lo incluye, agregarlo en este paso preservando el resto del contenido.
155
+ Si ya existe `CLAUDE.md` (verificado en Paso 1), revisar que mencione la regla
156
+ global `usar-sistema-swl`. Si NO la menciona, agregar la sección preservando el
157
+ resto del contenido.
163
158
 
164
159
  ### Validación síncrona post-generación (contrato cruzado con /swl:claudemd)
165
160
 
@@ -167,7 +162,7 @@ Tras generar el `CLAUDE.md` inicial, ejecutar el auditor síncrono para
167
162
  verificar el contrato canónico desde el primer commit:
168
163
 
169
164
  ```bash
170
- node scripts/auditar-claudemd.js --json
165
+ swl-ses audit-claudemd --json
171
166
  # Fallback:
172
167
  npx -y @saulwade/swl-ses@latest audit-claudemd --json
173
168
  ```
@@ -2,11 +2,6 @@
2
2
  name: swl:release
3
3
  description: Gestión del ciclo de release del proyecto. Genera versión siguiendo SemVer, crea changelog automático desde commits con Conventional Commits, valida que los tests pasan, crea tag de git y genera release notes. Flags: --tipo=patch|minor|major, --dry-run, --skip-tests.
4
4
  allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
5
- evolved: true
6
- evolved-from: "5.10.5"
7
- evolved-at: "2026-04-20"
8
- evolved-by: "aprender"
9
- evolved-note: "Paso 10 integra scripts/verificar-release.js como gate anti-gap obligatoria tras 3 releases consecutivos donde el release-manager-swl omitio archivos"
10
5
  ---
11
6
 
12
7
  # /swl:release — Gestión del ciclo de release
@@ -172,6 +167,25 @@ drift silencioso entre releases. Si el lock no cambió respecto al anterior,
172
167
  el commit lo refleja como no-op (idempotente). El archivo es pequeño (~37KB)
173
168
  y debe versionarse.
174
169
 
170
+ ## Paso 6.6 — Regenerar canonical-hashes.json (baseline del discriminador A/B)
171
+
172
+ Regenerar el manifiesto de hashes canónicos para la versión nueva. Es la baseline
173
+ que el instalador usa (Fase 16) para distinguir evolución del usuario (merge) de
174
+ shipped-evolved (actualizable) en cada upgrade. Debe incluir la versión que se
175
+ publica para que clientes que evolucionen desde ella se clasifiquen bien.
176
+
177
+ ```bash
178
+ node scripts/generar-canonical-hashes.js
179
+ git add manifiestos/canonical-hashes.json
180
+ ```
181
+
182
+ Idempotente (no-op si no cambió). El gate `node scripts/verificar-release.js`
183
+ (Paso 10.1) verifica que el manifiesto esté al día y que el fuente no porte
184
+ marcadores `evolved` espurios — si falla, ejecutar
185
+ `node scripts/verificar-evolucion.js --gate-inverso --fix`. El test e2e
186
+ `tests/scripts/release-e2e-evolved.test.js` (en `npm test`) bloquea el release
187
+ si la propagación A/B regresa.
188
+
175
189
  ## Paso 7 — Generar CHANGELOG
176
190
 
177
191
  Desde v1.6.5 este paso usa el skill `changelog-generator` para parsear
@@ -2,11 +2,6 @@
2
2
  name: swl:revisar-impacto
3
3
  description: Analiza el impacto estructural de cambios usando el grafo de dependencias SWL. Proporciona blast radius topológico real, god nodes, comunidades y conexiones sorpresivas. Potenciado por graph-builder.py + graph-analyze.py (graphify-3 patterns).
4
4
  allowed_tools: ["Bash", "Read"]
5
- evolved: true
6
- evolved-from: "5.3.4"
7
- evolved-at: "2026-04-09"
8
- evolved-by: "graphify-integration"
9
- evolved-note: "Análisis topológico real con networkx — graph-builder + graph-analyze + graph-cluster"
10
5
  ---
11
6
 
12
7
  # /swl:revisar-impacto — Análisis de impacto estructural