@saulwade/swl-ses 2.5.3 → 2.6.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 (181) hide show
  1. package/CLAUDE.md +192 -192
  2. package/README.md +600 -600
  3. package/agentes/auto-evolucion-swl.md +27 -3
  4. package/bin/swl-ses.js +32 -7
  5. package/comandos/swl/actualizar.md +174 -174
  6. package/comandos/swl/adoptar-proyecto.md +265 -265
  7. package/comandos/swl/aprender.md +836 -823
  8. package/comandos/swl/aprobar-plan.md +146 -146
  9. package/comandos/swl/auditar-deps.md +134 -134
  10. package/comandos/swl/autoresearch.md +264 -264
  11. package/comandos/swl/ayuda.md +224 -224
  12. package/comandos/swl/brainstorm.md +51 -51
  13. package/comandos/swl/briefing.md +119 -119
  14. package/comandos/swl/checkpoint.md +325 -325
  15. package/comandos/swl/claudemd.md +234 -234
  16. package/comandos/swl/compactar.md +310 -310
  17. package/comandos/swl/configurar-ci.md +235 -235
  18. package/comandos/swl/contexto.md +110 -110
  19. package/comandos/swl/contribuir.md +233 -233
  20. package/comandos/swl/crear-skill.md +292 -292
  21. package/comandos/swl/cron.md +194 -194
  22. package/comandos/swl/deuda-codigo.md +97 -97
  23. package/comandos/swl/discutir-fase.md +169 -169
  24. package/comandos/swl/ejecutar-fase.md +233 -233
  25. package/comandos/swl/evaluar-skill.md +520 -505
  26. package/comandos/swl/evolucion-continua.md +73 -0
  27. package/comandos/swl/evolucionar.md +267 -254
  28. package/comandos/swl/exportar-vault.md +583 -583
  29. package/comandos/swl/fix.md +118 -118
  30. package/comandos/swl/gateway.md +158 -158
  31. package/comandos/swl/inbox.md +116 -116
  32. package/comandos/swl/instalar.md +220 -220
  33. package/comandos/swl/instintos.md +86 -86
  34. package/comandos/swl/mapear-codebase.md +312 -312
  35. package/comandos/swl/mcp-status.md +175 -175
  36. package/comandos/swl/modelo.md +100 -100
  37. package/comandos/swl/nemesis.md +433 -433
  38. package/comandos/swl/notificaciones.md +299 -299
  39. package/comandos/swl/nuevo-proyecto.md +251 -251
  40. package/comandos/swl/planear-fase.md +263 -263
  41. package/comandos/swl/plugins.md +256 -256
  42. package/comandos/swl/predecir.md +169 -169
  43. package/comandos/swl/reflect-skills.md +125 -125
  44. package/comandos/swl/release.md +450 -450
  45. package/comandos/swl/revisar-impacto.md +201 -201
  46. package/comandos/swl/revisar.md +330 -330
  47. package/comandos/swl/seguridad.md +189 -189
  48. package/comandos/swl/sesiones.md +200 -200
  49. package/comandos/swl/skill-search.md +113 -113
  50. package/comandos/swl/status.md +343 -343
  51. package/comandos/swl/verificar.md +817 -817
  52. package/comandos/swl/wiki.md +620 -620
  53. package/gateway/cron/jobs.example.json +12 -0
  54. package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -276
  55. package/habilidades/autoresearch/SKILL.md +3 -2
  56. package/habilidades/benchmark-memoria/SKILL.md +7 -7
  57. package/habilidades/changelog-generator/SKILL.md +174 -174
  58. package/habilidades/changelog-generator/scripts/parse-commits.js +2 -1
  59. package/habilidades/checkpoints-verificacion/SKILL.md +6 -0
  60. package/habilidades/context-builder/SKILL.md +4 -0
  61. package/habilidades/doubt-driven-review/SKILL.md +207 -191
  62. package/habilidades/drift-detection/SKILL.md +6 -1
  63. package/habilidades/ejecutar-fase/SKILL.md +6 -6
  64. package/habilidades/eval-framework/SKILL.md +8 -3
  65. package/habilidades/harness-claude-code/SKILL.md +312 -308
  66. package/habilidades/infra-github-actions/SKILL.md +4 -3
  67. package/habilidades/instalar-sistema/SKILL.md +227 -223
  68. package/habilidades/memoria-busqueda/SKILL.md +31 -39
  69. package/habilidades/planear-fase/SKILL.md +358 -350
  70. package/habilidades/proceso-ddia-fundamentos/SKILL.md +3 -2
  71. package/habilidades/swl-claudemd/SKILL.md +6 -7
  72. package/habilidades/swl-dashboard/SKILL.md +11 -43
  73. package/habilidades/tdd-workflow/SKILL.md +749 -744
  74. package/habilidades/validacion-ci-sistema/SKILL.md +1 -1
  75. package/hooks/agente-lifecycle.js +2 -1
  76. package/hooks/aiisms-detector.js +13 -4
  77. package/hooks/audit-trail.js +2 -1
  78. package/hooks/auto-consolidacion.js +2 -1
  79. package/hooks/captura-acciones-post.js +2 -1
  80. package/hooks/captura-acciones-session.js +2 -1
  81. package/hooks/captura-feedback-usuario.js +3 -2
  82. package/hooks/claudemd-bloat-detector.js +12 -3
  83. package/hooks/claudemd-duplicacion-detector.js +13 -3
  84. package/hooks/contexto-iteracion.js +2 -1
  85. package/hooks/degradacion-instintos.js +2 -1
  86. package/hooks/extraccion-aprendizajes.js +109 -15
  87. package/hooks/grafo-contexto.js +2 -1
  88. package/hooks/guardrail-modelo.js +2 -1
  89. package/hooks/inbox-aviso.js +2 -1
  90. package/hooks/inyeccion-contexto.js +2 -1
  91. package/hooks/lib/agent-matcher.js +2 -1
  92. package/hooks/lib/agent-routing.js +2 -1
  93. package/hooks/lib/autonomia.js +5 -3
  94. package/hooks/lib/captura-acciones.js +2 -1
  95. package/hooks/lib/consolidation-lock.js +21 -10
  96. package/hooks/lib/etapa-auto-evolucion.js +10 -4
  97. package/hooks/lib/etapa-metricas.js +2 -1
  98. package/hooks/lib/etapa-perfil-usuario.js +20 -4
  99. package/hooks/lib/evolution-tracker.js +2 -1
  100. package/hooks/lib/gateway-notify.js +193 -179
  101. package/hooks/lib/loop-telemetry.js +5 -4
  102. package/hooks/lib/mcp-health.js +2 -1
  103. package/hooks/lib/memory-search.js +4 -0
  104. package/hooks/lib/merkle-audit.js +58 -6
  105. package/hooks/lib/nudge-tracker.js +2 -1
  106. package/hooks/lib/otlp-exporter.js +2 -1
  107. package/hooks/lib/propose-step.js +3 -2
  108. package/hooks/lib/raiz-proyecto.js +102 -0
  109. package/hooks/lib/run-log.js +2 -1
  110. package/hooks/lib/singleton-guard.js +218 -27
  111. package/hooks/lib/telegram-cliente.js +17 -8
  112. package/hooks/preservar-estado-pre-compact.js +2 -1
  113. package/hooks/proteccion-rutas.js +59 -3
  114. package/hooks/registro-turnos.js +2 -1
  115. package/hooks/resumen-sesion.js +2 -1
  116. package/hooks/risk-scoring.js +2 -1
  117. package/hooks/rotar-audit-auto.js +46 -20
  118. package/hooks/session-briefing.js +127 -1
  119. package/hooks/spec-gate.js +2 -1
  120. package/hooks/sugerir-contribuir.js +6 -3
  121. package/hooks/sugerir-regenerar-inventario.js +3 -2
  122. package/hooks/tdd-gate.js +2 -1
  123. package/hooks/telemetria-agentes.js +2 -1
  124. package/hooks/telemetria-skill-routing.js +2 -1
  125. package/hooks/tracking-costos.js +4 -3
  126. package/hooks/validar-formato-post-subagente.js +2 -1
  127. package/hooks/validar-intent-spec.js +2 -1
  128. package/hooks/validar-memoria-hook.js +13 -3
  129. package/hooks/validar-planning-paths.js +2 -1
  130. package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +53 -0
  131. package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +372 -0
  132. package/instintos/perfil-usuario.yaml +506 -3
  133. package/instintos/proyecto.yaml +78 -0
  134. package/llms.txt +2 -2
  135. package/manifiestos/canonical-hashes.json +335 -3
  136. package/manifiestos/modulos.json +19 -14
  137. package/manifiestos/planning-paths.json +1 -0
  138. package/manifiestos/skills-lock.json +50 -50
  139. package/package.json +2 -3
  140. package/plugin.json +2 -2
  141. package/scripts/actualizar.js +3 -0
  142. package/scripts/auditar-clases-conocidas.js +32 -4
  143. package/scripts/benchmark-memoria.js +1 -0
  144. package/scripts/cli/autonomia.js +23 -0
  145. package/scripts/cli/benchmark-memoria.js +37 -0
  146. package/scripts/cli/ciclo-autonomo.js +73 -0
  147. package/scripts/cli/ciclo-fase-b.js +102 -0
  148. package/scripts/cli/guardrail-metrics.js +39 -0
  149. package/scripts/cli/loop-telemetry.js +4 -2
  150. package/scripts/cli/memoria-search.js +69 -0
  151. package/scripts/cli/nudge-accionar.js +39 -0
  152. package/scripts/cli/run-eval.js +38 -0
  153. package/scripts/cli/run-skill-evals.js +13 -2
  154. package/scripts/derivar-feature-list.js +15 -14
  155. package/scripts/desinstalar.js +11 -0
  156. package/scripts/doctor.js +24 -10
  157. package/scripts/instalador.js +85 -7
  158. package/scripts/lib/activar-hooks-proyecto.js +12 -0
  159. package/scripts/lib/auditar-invocaciones-comandos.js +96 -6
  160. package/scripts/lib/ciclo-autonomo/candidatos.js +174 -0
  161. package/scripts/lib/ciclo-autonomo/config.js +165 -0
  162. package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -0
  163. package/scripts/lib/ciclo-autonomo/fallback.js +77 -0
  164. package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -0
  165. package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -0
  166. package/scripts/lib/ciclo-autonomo/index.js +301 -0
  167. package/scripts/lib/ciclo-autonomo/lock.js +124 -0
  168. package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -0
  169. package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -0
  170. package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -0
  171. package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -0
  172. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +535 -0
  173. package/scripts/lib/estado.js +9 -0
  174. package/scripts/lib/gitignore-manifest.js +8 -1
  175. package/scripts/lib/hooks-settings.js +45 -0
  176. package/scripts/rotar-audit-logs.js +48 -2
  177. package/scripts/run-eval.js +1 -0
  178. package/scripts/run-skill-evals.js +287 -8
  179. package/scripts/smoke-test.js +16 -8
  180. package/scripts/tui/pantallas/install-wizard.js +403 -347
  181. package/scripts/validar.js +40 -1
@@ -71,7 +71,7 @@ significativas**.
71
71
  QUERY="qué hicimos sobre force push a main protegida"
72
72
 
73
73
  # 2. Ejecuta búsqueda y anota top-5 IDs
74
- node -e "console.log(require('./hooks/lib/memory-search').search('.', '$QUERY').slice(0, 5).map(r => r.id + ' / ' + r.titulo).join('\n'))"
74
+ swl-ses memoria-search search --query="$QUERY" --limit=5
75
75
 
76
76
  # 3. Verifica manualmente qué IDs son CORRECTOS (revisión humana,
77
77
  # no se inventa). Solo esos van en gold_ids.
@@ -93,7 +93,7 @@ benchmark es gate de release.
93
93
 
94
94
  ```bash
95
95
  # Ejecutar benchmark con dataset por defecto
96
- node scripts/benchmark-memoria.js
96
+ swl-ses benchmark-memoria
97
97
 
98
98
  # Output esperado:
99
99
  # Recall @ 5: 85.0%
@@ -107,16 +107,16 @@ node scripts/benchmark-memoria.js
107
107
 
108
108
  ```bash
109
109
  # Dataset alternativo
110
- node scripts/benchmark-memoria.js --dataset .planning/benchmark/custom.jsonl
110
+ swl-ses benchmark-memoria --dataset=.planning/benchmark/custom.jsonl
111
111
 
112
112
  # Top-k personalizado (default 20)
113
- node scripts/benchmark-memoria.js --limit 30
113
+ swl-ses benchmark-memoria --limit=30
114
114
 
115
115
  # Output JSON (para scripts)
116
- node scripts/benchmark-memoria.js --json
116
+ swl-ses benchmark-memoria --json
117
117
 
118
118
  # Detalle por query (útil para debugging)
119
- node scripts/benchmark-memoria.js --verbose
119
+ swl-ses benchmark-memoria --verbose
120
120
  ```
121
121
 
122
122
  ### Tracking histórico opcional
@@ -126,7 +126,7 @@ agregado a `.planning/evolution/benchmark-memoria.jsonl` (append-only)
126
126
  para detectar regresión entre releases:
127
127
 
128
128
  ```bash
129
- SWL_BENCHMARK_PERSIST=1 node scripts/benchmark-memoria.js
129
+ SWL_BENCHMARK_PERSIST=1 swl-ses benchmark-memoria
130
130
  ```
131
131
 
132
132
  Comparar entre releases:
@@ -1,174 +1,174 @@
1
- ---
2
- name: changelog-generator
3
- description: >
4
- Generador automático de entradas CHANGELOG.md en formato Keep a Changelog
5
- desde commits Conventional Commits. Parser determinista que clasifica feat/
6
- fix/perf/refactor/docs/etc. en categorías user-facing en español, detecta
7
- breaking changes (marca '!' o trailer 'BREAKING CHANGE:') y reporta nivel
8
- de conformidad para decidir fallback manual. Cargar en /swl:release Paso 7
9
- cuando hay commits Conventional, o manualmente para previsualizar el
10
- changelog antes de un release.
11
- version: 1.1.0
12
- nivelRiesgo: BAJO
13
- herramientasPermitidas: [Read, Bash]
14
- skillsInvocables: [release-semver]
15
- exclusiones:
16
- - "No invocar para generar release notes con marketing copy o anuncios para usuarios finales — este skill produce listado técnico-legible, no narrativa."
17
- - "No invocar si el repo no usa Conventional Commits — el parser detecta <80% conformidad y el caller debe abortar a flujo manual de release-semver."
18
- - "No invocar para reescribir CHANGELOG histórico — solo agrega entrada de la próxima versión al inicio."
19
- ---
20
-
21
- # /habilidades/changelog-generator — CHANGELOG automático desde Conventional Commits
22
-
23
- ## Cuándo cargar
24
-
25
- - Durante `/swl:release` Paso 7 (Generar CHANGELOG), cuando el flujo automático
26
- está disponible y los commits del rango siguen Conventional Commits.
27
- - Para previsualizar el changelog candidato antes de bumpear versión:
28
- `node habilidades/changelog-generator/scripts/parse-commits.js --version X`
29
- - Cuando un colaborador pide un resumen legible de cambios entre dos refs
30
- arbitrarias del repo.
31
-
32
- ## Cuándo NO cargar
33
-
34
- - Repo sin Conventional Commits (<80% de conformidad): el parser detecta y
35
- reporta; el caller debe usar `Skill("release-semver")` flujo manual.
36
- - Generación de **release notes** (texto narrativo con contexto de producto):
37
- este skill produce CHANGELOG técnico-legible; las release notes con marketing
38
- son tarea aparte (`documentador-swl` con plantilla específica).
39
- - Reescritura histórica del CHANGELOG (squash de varias versiones, corrección
40
- de entradas antiguas): solo se agrega entrada de la versión nueva al inicio.
41
-
42
- ## Qué hace el skill
43
-
44
- 1. **Lee commits** desde la última tag (o entre dos refs arbitrarias) con
45
- `git log --format=...` usando un separador único para parsear subject + body
46
- sin colisiones.
47
- 2. **Parsea con Conventional Commits 1.0.0**: regex que captura tipo, scope,
48
- marca `!`, descripción. Soporta tipos extendidos del proyecto SWL:
49
- `evolucion` (cambios de skills/agentes), además de `feat/fix/perf/refactor/
50
- docs/style/test/ci/build/chore/revert`. Tolera el prefijo opcional de
51
- trazabilidad `[T-NN]` / `[REQ-NN]` de la convención de `ejecutar-fase`
52
- (no altera la semántica CC — el tipo+scope+descripción siguen presentes).
53
- 3. **Detecta breaking changes** por marca `!` después del tipo o trailer
54
- `BREAKING CHANGE:` en el body. Los breaking siempre van al inicio del
55
- release, sin importar el tipo original.
56
- 4. **Transforma descripción técnica → legible**:
57
- - Elimina referencias a issues al final (`(#123)`, `Refs #456`).
58
- - Capitaliza primera letra.
59
- - Elimina punto final (Keep a Changelog usa bullets sin punto).
60
- 5. **Agrupa en categorías** con orden canónico:
61
- 1. Breaking changes
62
- 2. Nuevas funcionalidades (feat)
63
- 3. Correcciones (fix)
64
- 4. Mejoras de rendimiento (perf)
65
- 5. Cambios internos (refactor)
66
- 6. Reversiones (revert)
67
- 7. Evoluciones de skills/agentes (evolucion — SWL-specific)
68
- 8. Mantenimiento (docs/style/test/ci/build/chore — colapsadas)
69
- 9. Otros (commits sin prefijo CC válido)
70
- 6. **Reporta conformidad**: ratio commits conformes / total. Si <80%, el
71
- caller debe decidir si abortar o seguir manualmente.
72
-
73
- ## Helper programático
74
-
75
- ```js
76
- const {
77
- parsearCommits,
78
- leerCommitsGit,
79
- generarChangelog,
80
- } = require('./habilidades/changelog-generator/scripts/parse-commits');
81
-
82
- // 1. Leer commits desde la última tag hasta HEAD
83
- const commits = leerCommitsGit({ to: 'HEAD' });
84
-
85
- // 2. Parsear y clasificar
86
- const { categorias, conformidad, totalCommits, conformes } = parsearCommits(commits);
87
-
88
- // 3. Si conformidad < 0.8, abortar o avisar al usuario
89
- if (conformidad < 0.8) {
90
- console.warn(`Conformidad CC: ${conformes}/${totalCommits}. Revisar "Otros".`);
91
- }
92
-
93
- // 4. Generar markdown listo para insertar en CHANGELOG.md
94
- const md = generarChangelog(categorias, {
95
- version: '1.6.5',
96
- fecha: '2026-05-22', // opcional, default = hoy
97
- incluirHash: true, // muestra hash corto al inicio de cada bullet
98
- });
99
- ```
100
-
101
- ## Uso CLI
102
-
103
- Previsualizar changelog candidato sin escribir nada:
104
-
105
- ```bash
106
- node habilidades/changelog-generator/scripts/parse-commits.js \
107
- --version 1.6.5 \
108
- --format markdown
109
- ```
110
-
111
- Filtrar por rango específico:
112
-
113
- ```bash
114
- node habilidades/changelog-generator/scripts/parse-commits.js \
115
- --from v1.6.4 \
116
- --to HEAD \
117
- --version 1.6.5
118
- ```
119
-
120
- Salida JSON estructurado para post-procesamiento:
121
-
122
- ```bash
123
- node habilidades/changelog-generator/scripts/parse-commits.js \
124
- --from v1.6.4 \
125
- --format json > /tmp/changelog-candidato.json
126
- ```
127
-
128
- ## Reglas de uso desde /swl:release
129
-
130
- 1. Llamar a `leerCommitsGit` con la última tag detectada en el Paso 1 del
131
- release.
132
- 2. Verificar `conformidad >= 0.8`. Si menor, presentar al usuario los commits
133
- bajo "Otros" y pedir decisión: (a) continuar con el changelog, (b) abortar
134
- y reescribir commits, (c) editar manualmente la categoría "Otros".
135
- 3. Si `--dry-run` está activo en `/swl:release`, mostrar el output de
136
- `generarChangelog` sin escribir a disco.
137
- 4. Si conformidad OK: leer CHANGELOG.md actual, insertar el bloque generado
138
- al inicio después del header `# Changelog`, escribir atómicamente.
139
- 5. NO hacer commit aquí — eso lo hace el Paso 8 de `/swl:release`.
140
-
141
- ## Gotchas observables
142
-
143
- - **Conventional Commits sin scope son válidos**: `fix: corregir X` parsea
144
- igual que `fix(modulo): corregir X`. El parser no exige scope.
145
- - **El subject debe ir en una sola línea**: si un commit usa newline en el
146
- subject, el parser lo trata como completo pero `git log %s` ya lo trunca.
147
- - **Tipos no estándar van a "Otros"**: si un equipo usa `mejora:`, `cambio:`,
148
- el parser los marca como no conformes. El usuario debe ajustar la lista
149
- `CATEGORIAS` en `parse-commits.js` o adoptar tipos estándar.
150
- - **El skill NO escribe a disco directamente**: solo retorna markdown. El
151
- caller (`/swl:release` Paso 7) es responsable de leer el CHANGELOG actual,
152
- insertar al inicio y escribir atómicamente.
153
- - **Commits revert vienen del propio git**: `git revert` genera mensajes
154
- `Revert "Subject original"` que el parser categoriza correctamente bajo
155
- Reversiones (regex matchea `revert:` sin que el usuario lo escriba si usa
156
- `git revert -e` para editar el mensaje al formato CC).
157
- - **El hash corto se trunca a 7 chars**: alineado con el formato `git log
158
- --oneline` estándar.
159
-
160
- ## Origen
161
-
162
- Adaptado del skill `changelog-generator` de
163
- `temp/awesome-codex-skills-master/changelog-generator/` (ComposioHQ, MIT) con:
164
-
165
- - Frontmatter al estándar SWL (es-MX, `nivelRiesgo: BAJO`, `exclusiones`).
166
- - Parser determinista en Node.js (`parse-commits.js`) — el origen es solo
167
- documentación; este skill agrega la implementación ejecutable.
168
- - Tipo `evolucion:` específico de SWL agregado al parser.
169
- - Soporte para breaking changes `!` y trailer `BREAKING CHANGE:` (origen
170
- solo menciona el segundo).
171
- - Reporte de conformidad <80% como gate explícita para fallback manual.
172
- - Integración con `/swl:release` Paso 7 documentada en `comandos/swl/release.md`.
173
-
174
- Documentado en ADR-0029 (integración parcial awesome-codex-skills, Opción B).
1
+ ---
2
+ name: changelog-generator
3
+ description: >
4
+ Generador automático de entradas CHANGELOG.md en formato Keep a Changelog
5
+ desde commits Conventional Commits. Parser determinista que clasifica feat/
6
+ fix/perf/refactor/docs/etc. en categorías user-facing en español, detecta
7
+ breaking changes (marca '!' o trailer 'BREAKING CHANGE:') y reporta nivel
8
+ de conformidad para decidir fallback manual. Cargar en /swl:release Paso 7
9
+ cuando hay commits Conventional, o manualmente para previsualizar el
10
+ changelog antes de un release.
11
+ version: 1.1.1
12
+ nivelRiesgo: BAJO
13
+ herramientasPermitidas: [Read, Bash]
14
+ skillsInvocables: [release-semver]
15
+ exclusiones:
16
+ - "No invocar para generar release notes con marketing copy o anuncios para usuarios finales — este skill produce listado técnico-legible, no narrativa."
17
+ - "No invocar si el repo no usa Conventional Commits — el parser detecta <80% conformidad y el caller debe abortar a flujo manual de release-semver."
18
+ - "No invocar para reescribir CHANGELOG histórico — solo agrega entrada de la próxima versión al inicio."
19
+ ---
20
+
21
+ # /habilidades/changelog-generator — CHANGELOG automático desde Conventional Commits
22
+
23
+ ## Cuándo cargar
24
+
25
+ - Durante `/swl:release` Paso 7 (Generar CHANGELOG), cuando el flujo automático
26
+ está disponible y los commits del rango siguen Conventional Commits.
27
+ - Para previsualizar el changelog candidato antes de bumpear versión:
28
+ `node habilidades/changelog-generator/scripts/parse-commits.js --version X`
29
+ - Cuando un colaborador pide un resumen legible de cambios entre dos refs
30
+ arbitrarias del repo.
31
+
32
+ ## Cuándo NO cargar
33
+
34
+ - Repo sin Conventional Commits (<80% de conformidad): el parser detecta y
35
+ reporta; el caller debe usar `Skill("release-semver")` flujo manual.
36
+ - Generación de **release notes** (texto narrativo con contexto de producto):
37
+ este skill produce CHANGELOG técnico-legible; las release notes con marketing
38
+ son tarea aparte (`documentador-swl` con plantilla específica).
39
+ - Reescritura histórica del CHANGELOG (squash de varias versiones, corrección
40
+ de entradas antiguas): solo se agrega entrada de la versión nueva al inicio.
41
+
42
+ ## Qué hace el skill
43
+
44
+ 1. **Lee commits** desde la última tag (o entre dos refs arbitrarias) con
45
+ `git log --format=...` usando un separador único para parsear subject + body
46
+ sin colisiones.
47
+ 2. **Parsea con Conventional Commits 1.0.0**: regex que captura tipo, scope,
48
+ marca `!`, descripción. Soporta tipos extendidos del proyecto SWL:
49
+ `evolucion` (cambios de skills/agentes), además de `feat/fix/perf/refactor/
50
+ docs/style/test/ci/build/chore/revert`. Tolera el prefijo opcional de
51
+ trazabilidad `[T-NN]` / `[REQ-NN]` de la convención de `ejecutar-fase`
52
+ (no altera la semántica CC — el tipo+scope+descripción siguen presentes).
53
+ 3. **Detecta breaking changes** por marca `!` después del tipo o trailer
54
+ `BREAKING CHANGE:` en el body. Los breaking siempre van al inicio del
55
+ release, sin importar el tipo original.
56
+ 4. **Transforma descripción técnica → legible**:
57
+ - Elimina referencias a issues al final (`(#123)`, `Refs #456`).
58
+ - Capitaliza primera letra.
59
+ - Elimina punto final (Keep a Changelog usa bullets sin punto).
60
+ 5. **Agrupa en categorías** con orden canónico:
61
+ 1. Breaking changes
62
+ 2. Nuevas funcionalidades (feat)
63
+ 3. Correcciones (fix)
64
+ 4. Mejoras de rendimiento (perf)
65
+ 5. Cambios internos (refactor)
66
+ 6. Reversiones (revert)
67
+ 7. Evoluciones de skills/agentes (evolucion — SWL-specific)
68
+ 8. Mantenimiento (docs/style/test/ci/build/chore — colapsadas)
69
+ 9. Otros (commits sin prefijo CC válido)
70
+ 6. **Reporta conformidad**: ratio commits conformes / total. Si <80%, el
71
+ caller debe decidir si abortar o seguir manualmente.
72
+
73
+ ## Helper programático
74
+
75
+ ```js
76
+ const {
77
+ parsearCommits,
78
+ leerCommitsGit,
79
+ generarChangelog,
80
+ } = require('./habilidades/changelog-generator/scripts/parse-commits');
81
+
82
+ // 1. Leer commits desde la última tag hasta HEAD
83
+ const commits = leerCommitsGit({ to: 'HEAD' });
84
+
85
+ // 2. Parsear y clasificar
86
+ const { categorias, conformidad, totalCommits, conformes } = parsearCommits(commits);
87
+
88
+ // 3. Si conformidad < 0.8, abortar o avisar al usuario
89
+ if (conformidad < 0.8) {
90
+ console.warn(`Conformidad CC: ${conformes}/${totalCommits}. Revisar "Otros".`);
91
+ }
92
+
93
+ // 4. Generar markdown listo para insertar en CHANGELOG.md
94
+ const md = generarChangelog(categorias, {
95
+ version: '1.6.5',
96
+ fecha: '2026-05-22', // opcional, default = hoy
97
+ incluirHash: true, // muestra hash corto al inicio de cada bullet
98
+ });
99
+ ```
100
+
101
+ ## Uso CLI
102
+
103
+ Previsualizar changelog candidato sin escribir nada:
104
+
105
+ ```bash
106
+ node habilidades/changelog-generator/scripts/parse-commits.js \
107
+ --version 1.6.5 \
108
+ --format markdown
109
+ ```
110
+
111
+ Filtrar por rango específico:
112
+
113
+ ```bash
114
+ node habilidades/changelog-generator/scripts/parse-commits.js \
115
+ --from v1.6.4 \
116
+ --to HEAD \
117
+ --version 1.6.5
118
+ ```
119
+
120
+ Salida JSON estructurado para post-procesamiento:
121
+
122
+ ```bash
123
+ node habilidades/changelog-generator/scripts/parse-commits.js \
124
+ --from v1.6.4 \
125
+ --format json > /tmp/changelog-candidato.json
126
+ ```
127
+
128
+ ## Reglas de uso desde /swl:release
129
+
130
+ 1. Llamar a `leerCommitsGit` con la última tag detectada en el Paso 1 del
131
+ release.
132
+ 2. Verificar `conformidad >= 0.8`. Si menor, presentar al usuario los commits
133
+ bajo "Otros" y pedir decisión: (a) continuar con el changelog, (b) abortar
134
+ y reescribir commits, (c) editar manualmente la categoría "Otros".
135
+ 3. Si `--dry-run` está activo en `/swl:release`, mostrar el output de
136
+ `generarChangelog` sin escribir a disco.
137
+ 4. Si conformidad OK: leer CHANGELOG.md actual, insertar el bloque generado
138
+ al inicio después del header `# Changelog`, escribir atómicamente.
139
+ 5. NO hacer commit aquí — eso lo hace el Paso 8 de `/swl:release`.
140
+
141
+ ## Gotchas observables
142
+
143
+ - **Conventional Commits sin scope son válidos**: `fix: corregir X` parsea
144
+ igual que `fix(modulo): corregir X`. El parser no exige scope.
145
+ - **El subject debe ir en una sola línea**: si un commit usa newline en el
146
+ subject, el parser lo trata como completo pero `git log %s` ya lo trunca.
147
+ - **Tipos no estándar van a "Otros"**: si un equipo usa `mejora:`, `cambio:`,
148
+ el parser los marca como no conformes. El usuario debe ajustar la lista
149
+ `CATEGORIAS` en `parse-commits.js` o adoptar tipos estándar.
150
+ - **El skill NO escribe a disco directamente**: solo retorna markdown. El
151
+ caller (`/swl:release` Paso 7) es responsable de leer el CHANGELOG actual,
152
+ insertar al inicio y escribir atómicamente.
153
+ - **Commits revert vienen del propio git**: `git revert` genera mensajes
154
+ `Revert "Subject original"` que el parser categoriza correctamente bajo
155
+ Reversiones (regex matchea `revert:` sin que el usuario lo escriba si usa
156
+ `git revert -e` para editar el mensaje al formato CC).
157
+ - **El hash corto se trunca a 7 chars**: alineado con el formato `git log
158
+ --oneline` estándar.
159
+
160
+ ## Origen
161
+
162
+ Adaptado del skill `changelog-generator` de
163
+ `temp/awesome-codex-skills-master/changelog-generator/` (ComposioHQ, MIT) con:
164
+
165
+ - Frontmatter al estándar SWL (es-MX, `nivelRiesgo: BAJO`, `exclusiones`).
166
+ - Parser determinista en Node.js (`parse-commits.js`) — el origen es solo
167
+ documentación; este skill agrega la implementación ejecutable.
168
+ - Tipo `evolucion:` específico de SWL agregado al parser.
169
+ - Soporte para breaking changes `!` y trailer `BREAKING CHANGE:` (origen
170
+ solo menciona el segundo).
171
+ - Reporte de conformidad <80% como gate explícita para fallback manual.
172
+ - Integración con `/swl:release` Paso 7 documentada en `comandos/swl/release.md`.
173
+
174
+ Documentado en ADR-0029 (integración parcial awesome-codex-skills, Opción B).
@@ -288,7 +288,8 @@ function generarChangelog(categorias, opts) {
288
288
  const { version, fecha, incluirHash = true } = opts || {};
289
289
  if (!version) throw new Error('generarChangelog: version es obligatoria');
290
290
 
291
- const fechaUsada = fecha || new Date().toISOString().slice(0, 10);
291
+ // Fecha LOCAL, no UTC desde México la tarde ya es "mañana" en toISOString() (clase C1)
292
+ const fechaUsada = fecha || new Date().toLocaleDateString('sv');
292
293
  const lineas = [`## [${version}] - ${fechaUsada}`, ''];
293
294
 
294
295
  for (const categoria of ORDEN_CATEGORIAS) {
@@ -149,6 +149,12 @@ a partir de texto libre. Inspirado en el patrón ExecutionSnapshot de Sim Studio
149
149
 
150
150
  ### Al completar un agente
151
151
 
152
+ Los bloques `javascript` de esta sección documentan la API de los módulos con
153
+ el layout del repo madre (`hooks/lib/`); en instalaciones destino viven
154
+ aplanados junto a los hooks instalados. Son referencia de la API, no comandos
155
+ a ejecutar tal cual en proyectos consumidores (para lectura del estado existe
156
+ `swl-ses execution-state`).
157
+
152
158
  ```javascript
153
159
  const es = require('./hooks/lib/execution-state');
154
160
  es.completarAgente(process.cwd(), 'implementador-swl', 'api-endpoints', {
@@ -107,6 +107,10 @@ El default de 2500 restaura el margen útil.
107
107
 
108
108
  ## Configuración
109
109
 
110
+ API del módulo con el layout del repo madre (`hooks/lib/`); en instalaciones
111
+ destino vive aplanado junto a los hooks instalados. Es referencia para ajustar
112
+ el hook, no un comando a ejecutar en proyectos consumidores.
113
+
110
114
  ```js
111
115
  const { buildContext } = require('./hooks/lib/context-builder');
112
116