@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.
- package/CLAUDE.md +199 -196
- package/README.md +597 -579
- package/agentes/arquitecto-swl.md +0 -5
- package/agentes/backend-python-swl.md +0 -5
- package/agentes/implementador-swl.md +0 -5
- package/agentes/nemesis-auditor-swl.md +0 -5
- package/agentes/orquestador-swl.md +0 -5
- package/agentes/planificador-swl.md +0 -5
- package/agentes/revisor-codigo-swl.md +0 -5
- package/bin/swl-ses.js +63 -0
- package/comandos/swl/adoptar-proyecto.md +12 -14
- package/comandos/swl/aprender.md +30 -47
- package/comandos/swl/aprobar-plan.md +23 -35
- package/comandos/swl/autoresearch.md +12 -14
- package/comandos/swl/briefing.md +5 -8
- package/comandos/swl/checkpoint.md +10 -15
- package/comandos/swl/claudemd.md +12 -12
- package/comandos/swl/configurar-ci.md +20 -19
- package/comandos/swl/cron.md +10 -12
- package/comandos/swl/ejecutar-fase.md +10 -8
- package/comandos/swl/evolucionar.md +6 -11
- package/comandos/swl/inbox.md +10 -10
- package/comandos/swl/modelo.md +7 -9
- package/comandos/swl/notificaciones.md +19 -116
- package/comandos/swl/nuevo-proyecto.md +9 -14
- package/comandos/swl/release.md +19 -5
- package/comandos/swl/revisar-impacto.md +0 -5
- package/comandos/swl/status.md +333 -348
- package/comandos/swl/verificar.md +817 -813
- package/habilidades/agent-browser/SKILL.md +0 -5
- package/habilidades/angular-moderno/SKILL.md +0 -5
- package/habilidades/api-rest-diseno/SKILL.md +0 -5
- package/habilidades/aprendizaje-continuo/SKILL.md +0 -5
- package/habilidades/auth-patrones/SKILL.md +0 -5
- package/habilidades/build-errors-nextjs/SKILL.md +0 -5
- package/habilidades/changelog-generator/SKILL.md +174 -179
- package/habilidades/checklist-seguridad/SKILL.md +0 -5
- package/habilidades/contenedores-docker/SKILL.md +0 -5
- package/habilidades/datos-etl/SKILL.md +0 -5
- package/habilidades/doc-sync/SKILL.md +0 -5
- package/habilidades/extractor-de-aprendizajes/SKILL.md +0 -5
- package/habilidades/fastapi-experto/SKILL.md +0 -5
- package/habilidades/frontend-avanzado/SKILL.md +0 -5
- package/habilidades/iam-secretos/SKILL.md +0 -5
- package/habilidades/manejo-errores/SKILL.md +0 -5
- package/habilidades/mapear-codebase/SKILL.md +0 -5
- package/habilidades/meta-skills-estandar/SKILL.md +0 -5
- package/habilidades/monitoring-alertas/SKILL.md +0 -5
- package/habilidades/nextjs-experto/SKILL.md +0 -5
- package/habilidades/nextjs-testing/SKILL.md +0 -5
- package/habilidades/node-experto/SKILL.md +0 -5
- package/habilidades/orquestacion-async/SKILL.md +0 -5
- package/habilidades/patrones-python/SKILL.md +227 -232
- package/habilidades/planear-fase/SKILL.md +336 -341
- package/habilidades/postgresql-experto/SKILL.md +0 -5
- package/habilidades/prevencion-sobreingenieria/SKILL.md +0 -5
- package/habilidades/protocolo-revision-swl/SKILL.md +0 -5
- package/habilidades/react-experto/SKILL.md +0 -5
- package/habilidades/release-semver/SKILL.md +0 -5
- package/habilidades/swl-claudemd/SKILL.md +10 -11
- package/habilidades/tdd-workflow/SKILL.md +710 -715
- package/habilidades/testing-python/SKILL.md +335 -340
- package/habilidades/verificar-trabajo/SKILL.md +0 -5
- package/hooks/lib/evolution-tracker.js +191 -35
- package/hooks/lib/propose-step.js +1 -0
- package/llms.txt +1 -1
- package/manifiestos/canonical-hashes.json +656 -0
- package/manifiestos/modulos.json +3 -0
- package/manifiestos/skills-lock.json +71 -71
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/scripts/auditar-claudemd.js +38 -0
- package/scripts/cli/aprobar-plan.js +73 -0
- package/scripts/cli/briefing.js +23 -0
- package/scripts/cli/ciclo-evolucion.js +26 -0
- package/scripts/cli/configurar-ci.js +40 -0
- package/scripts/cli/derivar-feature-list.js +25 -0
- package/scripts/cli/detectar-host.js +27 -0
- package/scripts/cli/diary-entry.js +69 -0
- package/scripts/cli/execution-state.js +18 -0
- package/scripts/cli/gateway-notify.js +41 -0
- package/scripts/cli/liberar-fase.js +42 -0
- package/scripts/cli/loop-telemetry.js +125 -0
- package/scripts/cli/mark-evolved.js +56 -0
- package/scripts/cli/metricas-dora.js +26 -0
- package/scripts/cli/near-duplicate.js +55 -0
- package/scripts/cli/notificaciones.js +123 -0
- package/scripts/cli/propose-step.js +29 -0
- package/scripts/cli/schedule-parse.js +19 -0
- package/scripts/cli/sugerir-modelo.js +20 -0
- package/scripts/cli/verificar-plan.js +36 -0
- package/scripts/cli/verificar-trazabilidad.js +35 -0
- package/scripts/derivar-feature-list.js +1 -0
- package/scripts/generar-canonical-hashes.js +147 -0
- package/scripts/instalador.js +126 -53
- package/scripts/lib/audit-evolved.js +71 -0
- package/scripts/lib/auditar-invocaciones-comandos.js +104 -0
- package/scripts/lib/canonical-hash.js +94 -0
- package/scripts/lib/evolved-fuente.js +138 -0
- package/scripts/lib/resolver-plan-fase.js +37 -0
- package/scripts/remediar-evolved-instaladas.js +239 -0
- package/scripts/validar.js +27 -0
- package/scripts/verificar-evolucion.js +36 -0
- package/scripts/verificar-release.js +33 -0
- package/scripts/verificar-trazabilidad.js +1 -1
- package/agentes/.evolved.json +0 -9
- package/comandos/swl/.evolved.json +0 -23
- package/habilidades/auth-patrones/.evolved.json +0 -9
- package/habilidades/extractor-de-aprendizajes/.evolved.json +0 -9
- package/habilidades/instalar-sistema/.evolved.json +0 -9
- package/habilidades/manejo-errores/.evolved.json +0 -9
- package/habilidades/node-experto/.evolved.json +0 -9
- 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
|
|
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
|
-
```
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
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
|
-
```
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
191
|
-
|
|
189
|
+
Subcomando del CLI (salida JSON). Primero listar qué se eliminaría (sin
|
|
190
|
+
confirmar), luego repetir con `--confirmar`:
|
|
192
191
|
|
|
193
|
-
|
|
194
|
-
|
|
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:
|
package/comandos/swl/cron.md
CHANGED
|
@@ -160,21 +160,19 @@ deliverResult(job, result, process.cwd());
|
|
|
160
160
|
|
|
161
161
|
## Parser de lenguaje natural programático (experimental)
|
|
162
162
|
|
|
163
|
-
El
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
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 (`
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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.
|
package/comandos/swl/inbox.md
CHANGED
|
@@ -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
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
texto
|
|
68
|
-
to
|
|
69
|
-
|
|
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
|
package/comandos/swl/modelo.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
207
|
-
|
|
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
|
-
|
|
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
|
-
|
|
254
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
156
|
-
|
|
157
|
-
|
|
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
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
165
|
+
swl-ses audit-claudemd --json
|
|
171
166
|
# Fallback:
|
|
172
167
|
npx -y @saulwade/swl-ses@latest audit-claudemd --json
|
|
173
168
|
```
|
package/comandos/swl/release.md
CHANGED
|
@@ -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
|