@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
@@ -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á
@@ -51,14 +59,15 @@ Lee el campo `estado:` del frontmatter:
51
59
 
52
60
  ## Paso 2.5 — Validar la matriz REQ×T (trazabilidad G4)
53
61
 
54
- Lee `.planning/fases/0N-CONTEXTO.md` y extrae los IDs `REQ-NN:` de la sección de
55
- criterios de aceptación.
62
+ Lee `.planning/fases/0N-CONTEXTO.md` y extrae los IDs `REQ-NN:` (fases 01-11) o
63
+ `REQ-<fase>-NN:` (namespaceados, fases ≥12) de la sección de criterios de
64
+ aceptación. `verificar-trazabilidad.js` reconoce ambos formatos.
56
65
 
57
66
  - **CONTEXTO sin REQ-IDs** (fases legacy 01-09): advertencia informativa
58
67
  ("CONTEXTO sin REQ-IDs — trazabilidad no exigible, gracia legacy") y continúa.
59
68
  - **CONTEXTO con REQ-IDs**: verifica que el PLAN cubra TODOS:
60
69
  ```bash
61
- node scripts/verificar-trazabilidad.js --fase=N --solo-plan
70
+ swl-ses verificar-trazabilidad --fase=N --solo-plan
62
71
  ```
63
72
  - Exit 0 → continúa al Paso 3.
64
73
  - Exit 1 (REQ huérfanos) → **RECHAZA la aprobación**. Lista los REQ sin tarea y
@@ -85,41 +94,21 @@ a `/swl:planear-fase N` para refinar.
85
94
  edita el frontmatter `estado: borrador` → `estado: aprobado` y agrega
86
95
  `aprobadoPor: usuario (<nombre>) — <fecha>, via /swl:aprobar-plan`.
87
96
 
88
- 2. **Firmar** — escribe el lock SHA256:
89
- ```bash
90
- node -e "const {firmarPlan}=require('./scripts/lib/plan-lock'); const r=firmarPlan('.planning/fases/0N-PLAN.md'); console.log(JSON.stringify(r))"
91
- ```
92
- Verifica que el resultado sea `ok: true` y que exista
93
- `.planning/locks/0N-PLAN.md.lock`.
94
-
95
- 3. **Verificar** la firma de inmediato:
96
- ```bash
97
- node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
98
- ```
99
- Debe retornar `modo: "firmado"`, `ok: true`.
100
-
101
- 4. **Marcar la fase como activa** (gate G0 — `hooks/spec-gate.js` consume este
102
- archivo): escribe `.planning/locks/fase-activa.json` con el sha256 devuelto
103
- 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`):
104
101
  ```bash
105
- node -e "
106
- const {atomicWriteJSON} = require('./hooks/lib/atomic-write');
107
- const {verificarPlan} = require('./scripts/lib/plan-lock');
108
- const v = verificarPlan('.planning/fases/0N-PLAN.md');
109
- atomicWriteJSON('.planning/locks/fase-activa.json', {
110
- numero: N,
111
- planPath: '.planning/fases/0N-PLAN.md',
112
- sha256: v.hashEsperado,
113
- aprobadoEn: new Date().toISOString(),
114
- aprobadoPor: 'usuario via /swl:aprobar-plan'
115
- });
116
- console.log('fase activa: 0N');
117
- "
102
+ swl-ses aprobar-plan --fase=N
118
103
  ```
119
- Este archivo es runtime local (gitignored a diferencia del `.lock`, que
120
- se versiona como evidencia). `/swl:ejecutar-fase` lo elimina al cerrar la fase.
121
- Si se re-firma un plan (re-aprobación tras mutación), re-escribir también
122
- 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.
123
112
 
124
113
  ## Paso 5 — Reporte
125
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:
@@ -0,0 +1,119 @@
1
+ ---
2
+ name: swl:briefing
3
+ description: Briefing proactivo del proyecto bajo demanda. Re-presenta las señales baratas del hook SessionStart (ADRs Propuestos con reevaluación vencida, deuda con trigger por fecha cumplido, nudges sin accionar, gates en calibración, retoma pendiente) y agrega el análisis profundo opt-in que el hook no puede pagar: audit de dependencias del proyecto destino, cobertura vs umbral, hubs del grafo tocados sin revisión, drift de feature-list, y triggers de deuda en prosa libre. Cargar cuando el usuario pide "¿qué hay pendiente?", "¿qué riesgos hay?", "ponme al día", o cuando el digest de sesión sugiere el análisis completo por volumen de señales.
4
+ allowed_tools: ["Read", "Bash", "Glob", "Grep"]
5
+ ---
6
+
7
+ # /swl:briefing — Briefing proactivo bajo demanda
8
+
9
+ Análisis no solicitado del estado del proyecto destino (Fase 12, ADR-0036). El
10
+ hook `session-briefing.js` da el digest barato al abrir sesión; este comando es
11
+ el nivel profundo: re-presenta esas señales Y agrega las que cuestan (deps, grafo,
12
+ cobertura) con degradación funcional si la herramienta no está instalada.
13
+
14
+ Principio rector: **proponer es barato y siempre permitido; actuar requiere
15
+ autorización del usuario**. Este comando solo propone y analiza — nunca aplica
16
+ cambios sin que el usuario los pida.
17
+
18
+ ## Uso
19
+
20
+ ```
21
+ /swl:briefing # señales baratas + análisis profundo completo
22
+ /swl:briefing rapido # solo las 5 señales del hook (sin deps/grafo/cobertura)
23
+ ```
24
+
25
+ ## Paso 1 — Señales baratas (mismas del hook)
26
+
27
+ Ejecuta los recolectores de filesystem y presenta el digest sin tope de 5 (aquí
28
+ sí caben todas, no hay presupuesto de latencia de arranque):
29
+
30
+ ```bash
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
34
+ ```
35
+
36
+ Las 5 categorías: `adr-vencido`, `deuda-trigger`, `nudges-pendientes`,
37
+ `gate-calibracion`, `continue-here`. Si `rapido`, terminar aquí.
38
+
39
+ ## Paso 2 — Análisis profundo (opt-in, con degradación)
40
+
41
+ Para cada herramienta, **validar antes de invocar** (patrón "validar antes de
42
+ invocar"): si no está disponible, reportar "no disponible, omitido" y continuar —
43
+ nunca fallar el briefing por una herramienta ausente.
44
+
45
+ ### 2.1 — Audit de dependencias del proyecto destino
46
+
47
+ Detectar el ecosistema y correr el audit nativo:
48
+
49
+ ```bash
50
+ # Node
51
+ [ -f package.json ] && npm audit --omit=dev 2>/dev/null | tail -5
52
+ # Python
53
+ [ -f requirements.txt -o -f pyproject.toml ] && (command -v pip-audit >/dev/null && pip-audit 2>/dev/null | tail -5 || echo "pip-audit no instalado — omitido")
54
+ ```
55
+
56
+ Reportar CVEs HIGH/CRITICAL con la acción concreta (`npm audit fix`, bump de
57
+ versión). Sin lockfile o sin gestor → omitir.
58
+
59
+ ### 2.2 — Cobertura vs umbral
60
+
61
+ Si el proyecto define cobertura, comparar contra el umbral del proyecto (80% por
62
+ defecto). Si no hay reporte reciente, indicar el comando para generarlo en vez de
63
+ correrlo (puede ser caro):
64
+
65
+ ```
66
+ Para medir cobertura: <runner del proyecto> --coverage
67
+ ```
68
+
69
+ ### 2.3 — Hubs del grafo tocados sin revisión
70
+
71
+ Si el MCP `code-review-graph` está disponible (tools `mcp__code-review-graph__*`
72
+ registradas o deferred), consultar los nodos hub modificados en los últimos N
73
+ commits sin revisión asociada. Si no está disponible → omitir con nota.
74
+
75
+ ### 2.4 — Drift de feature-list
76
+
77
+ ```bash
78
+ swl-ses derivar-feature-list --check 2>/dev/null; echo "exit: $?"
79
+ ```
80
+
81
+ Exit 2 → reportar que `HOJA-RUTA.md` y `feature-list.json` divergieron, con la
82
+ acción `swl-ses derivar-feature-list` para regenerar.
83
+
84
+ ### 2.5 — Deuda con trigger en prosa libre
85
+
86
+ El hook solo evalúa triggers verificables por fecha (D-16). Aquí, leer
87
+ `.planning/DEUDA-TECNICA.md` y evaluar con criterio los triggers en prosa
88
+ ("≥2 clientes reportan", "p95 > 60s documentado") contra el estado real del
89
+ proyecto. Reportar los que parezcan cumplidos para revisión del usuario.
90
+
91
+ ## Paso 3 — Presentación y telemetría
92
+
93
+ Presenta el briefing agrupado por prioridad (continue-here → gates → deuda →
94
+ ADRs → nudges → hallazgos profundos). Cada ítem con su acción ejecutable.
95
+
96
+ Tras presentar, el usuario decide qué accionar. NO ejecutar acciones de mutación
97
+ (cerrar deuda, promover gates, aplicar fixes) sin que el usuario lo pida — este
98
+ comando es propositivo (separación PROPONER/ACTUAR, ADR-0037 pendiente).
99
+
100
+ Si el usuario acciona una señal en esta sesión (ejecuta el comando sugerido), esa
101
+ resolución la captura la telemetría de aceptación del hook en la siguiente sesión
102
+ (la señal desaparece del recolector → cuenta como "actuada", D-18).
103
+
104
+ ## Cuándo NO usar este comando
105
+
106
+ - En cada turno de una sesión: el briefing es por sesión, no por mensaje. El hook
107
+ ya cubre el inicio; este comando es para cuando el usuario pide el detalle.
108
+ - Para aplicar las acciones propuestas: este comando propone, no ejecuta. Usar el
109
+ comando concreto de cada señal (`/swl:evolucion-estado`, `/swl:verificar`, etc.).
110
+ - En proyectos sin `.planning/`: no hay señales que recolectar.
111
+
112
+ ## Gotchas
113
+
114
+ - **Herramienta ausente ≠ error**: si `npm audit`, `pip-audit` o el grafo no están,
115
+ el briefing los omite con nota y sigue. Nunca abortar por una dependencia opt-in.
116
+ - **No re-listar lo que el hook ya mostró hoy**: el hook aplica dedupe diario; este
117
+ comando ignora el dedupe a propósito (lo invoca el usuario, quiere ver todo).
118
+ - **`code-review-graph` deferred ≠ ausente**: si las tools aparecen como deferred,
119
+ cargar su schema con `ToolSearch` antes de concluir que no está disponible.
@@ -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