@saulwade/swl-ses 2.3.1 → 2.4.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 (112) hide show
  1. package/CLAUDE.md +241 -240
  2. package/README.md +597 -597
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/agentes/accesibilidad-wcag-swl.md +690 -690
  6. package/agentes/arquitecto-swl.md +267 -267
  7. package/agentes/auto-evolucion-swl.md +908 -908
  8. package/agentes/backend-api-swl.md +472 -472
  9. package/agentes/backend-csharp-swl.md +420 -420
  10. package/agentes/backend-go-swl.md +390 -390
  11. package/agentes/backend-java-swl.md +281 -281
  12. package/agentes/backend-node-swl.md +479 -479
  13. package/agentes/backend-python-swl.md +605 -605
  14. package/agentes/backend-rust-swl.md +364 -364
  15. package/agentes/backend-workers-swl.md +482 -482
  16. package/agentes/cloud-infra-swl.md +509 -509
  17. package/agentes/consolidador-swl.md +541 -541
  18. package/agentes/datos-swl.md +605 -605
  19. package/agentes/depurador-swl.md +352 -352
  20. package/agentes/devops-ci-swl.md +400 -400
  21. package/agentes/disenador-ui-swl.md +569 -569
  22. package/agentes/documentador-swl.md +345 -345
  23. package/agentes/frontend-angular-swl.md +621 -621
  24. package/agentes/frontend-css-swl.md +716 -716
  25. package/agentes/frontend-react-swl.md +692 -692
  26. package/agentes/frontend-swl.md +496 -496
  27. package/agentes/frontend-tailwind-swl.md +826 -826
  28. package/agentes/gh-fix-ci-swl.md +275 -275
  29. package/agentes/implementador-swl.md +328 -328
  30. package/agentes/investigador-swl.md +432 -432
  31. package/agentes/investigador-ux-swl.md +505 -505
  32. package/agentes/llm-apps-swl.md +278 -278
  33. package/agentes/migrador-swl.md +442 -442
  34. package/agentes/mobile-android-swl.md +511 -511
  35. package/agentes/mobile-cross-swl.md +541 -541
  36. package/agentes/mobile-ios-swl.md +502 -502
  37. package/agentes/mobile-testing-swl.md +302 -302
  38. package/agentes/nemesis-auditor-swl.md +285 -285
  39. package/agentes/notificador-swl.md +918 -918
  40. package/agentes/observabilidad-swl.md +438 -438
  41. package/agentes/orquestador-swl.md +1053 -1026
  42. package/agentes/pagos-swl.md +310 -310
  43. package/agentes/perfilador-usuario-swl.md +321 -321
  44. package/agentes/planificador-swl.md +399 -399
  45. package/agentes/producto-prd-swl.md +589 -589
  46. package/agentes/red-team-swl.md +218 -218
  47. package/agentes/release-manager-swl.md +590 -590
  48. package/agentes/rendimiento-swl.md +713 -713
  49. package/agentes/resolutor-build-swl.md +245 -245
  50. package/agentes/revisor-angular-swl.md +278 -278
  51. package/agentes/revisor-codigo-swl.md +538 -505
  52. package/agentes/revisor-csharp-swl.md +264 -264
  53. package/agentes/revisor-go-swl.md +259 -259
  54. package/agentes/revisor-java-swl.md +257 -257
  55. package/agentes/revisor-kotlin-swl.md +273 -273
  56. package/agentes/revisor-nextjs-swl.md +281 -281
  57. package/agentes/revisor-php-swl.md +271 -271
  58. package/agentes/revisor-react-swl.md +278 -278
  59. package/agentes/revisor-rust-swl.md +346 -346
  60. package/agentes/revisor-seguridad-swl.md +399 -399
  61. package/agentes/revisor-swift-swl.md +268 -268
  62. package/agentes/revisor-typescript-swl.md +346 -346
  63. package/agentes/sre-swl.md +291 -291
  64. package/agentes/tdd-qa-swl.md +393 -393
  65. package/comandos/swl/contexto.md +0 -2
  66. package/comandos/swl/deuda-codigo.md +97 -0
  67. package/habilidades/angular-moderno/SKILL.md +5 -1
  68. package/habilidades/contenedores-docker/SKILL.md +3 -1
  69. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  70. package/habilidades/harness-claude-code/SKILL.md +4 -4
  71. package/habilidades/harness-claude-code/recursos/disciplina-harness-regla.md +6 -5
  72. package/habilidades/legacy-code-rescue/SKILL.md +2 -1
  73. package/habilidades/meta-skills-estandar/SKILL.md +1 -1
  74. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +2 -2
  75. package/habilidades/postgresql-experto/SKILL.md +3 -1
  76. package/habilidades/prevencion-sobreingenieria/SKILL.md +70 -92
  77. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -0
  78. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -0
  79. package/hooks/audit-trail.js +4 -4
  80. package/hooks/calidad-pre-commit.js +15 -11
  81. package/hooks/captura-acciones-post.js +3 -2
  82. package/hooks/captura-acciones-session.js +3 -2
  83. package/hooks/contexto-iteracion.js +2 -1
  84. package/hooks/contexto-subagente.js +68 -0
  85. package/hooks/guardrail-modelo.js +13 -3
  86. package/hooks/inyeccion-contexto.js +12 -12
  87. package/hooks/registro-turnos.js +5 -4
  88. package/hooks/spec-gate.js +2 -1
  89. package/hooks/sugerir-contribuir.js +2 -1
  90. package/hooks/sugerir-regenerar-inventario.js +3 -2
  91. package/hooks/tdd-gate.js +2 -1
  92. package/llms.txt +3 -3
  93. package/manifiestos/canonical-hashes.json +667 -10
  94. package/manifiestos/hook-profiles.json +0 -2
  95. package/manifiestos/hooks-config.json +469 -477
  96. package/manifiestos/invariantes-criticos.json +30 -0
  97. package/manifiestos/modulos.json +1390 -1390
  98. package/manifiestos/skills-lock.json +24 -24
  99. package/package.json +93 -93
  100. package/plugin.json +369 -371
  101. package/schemas/agent-frontmatter.schema.json +3 -1
  102. package/scripts/instalador.js +4 -1
  103. package/scripts/lib/expandir-targets.js +71 -71
  104. package/scripts/lib/preservar-usuario.js +39 -5
  105. package/scripts/lib/toml-merge.js +204 -204
  106. package/scripts/mcp-server/auth.js +105 -105
  107. package/scripts/mcp-server/cache.js +106 -106
  108. package/scripts/validar.js +1 -1
  109. package/scripts/verificar-release.js +51 -0
  110. package/hooks/lib/context-compressor.js +0 -657
  111. package/hooks/linea-estado.js +0 -328
  112. package/hooks/monitor-contexto.js +0 -373
@@ -29,7 +29,12 @@ const path = require('path');
29
29
  // Guard de opt-in — zero-config por defecto
30
30
  // ---------------------------------------------------------------------------
31
31
 
32
- if (!process.env.SWL_GUARDRAIL_MODELO) {
32
+ // Entrypoint: ejecución directa o wrapper `node -e "require(...)"` de
33
+ // settings.json, donde require.main es undefined. Al requerir desde tests,
34
+ // require.main es el runner (definido y ≠ este módulo) → sin efectos.
35
+ const ES_ENTRYPOINT = !require.main || require.main === module;
36
+
37
+ if (ES_ENTRYPOINT && !process.env.SWL_GUARDRAIL_MODELO) {
33
38
  process.exit(0);
34
39
  }
35
40
 
@@ -102,11 +107,12 @@ function razonTripwire(texto, trivialLen, tareaLigera) {
102
107
  /**
103
108
  * Determina el modelo sugerido por degradación según modelo actual del agente.
104
109
  *
105
- * @param {string} modeloActual - Identificador del modelo actual ('opus'|'sonnet'|'haiku'|...).
110
+ * @param {string} modeloActual - Identificador del modelo actual ('fable'|'opus'|'sonnet'|'haiku'|...).
106
111
  * @returns {string} Modelo sugerido.
107
112
  */
108
113
  function modeloSugerido(modeloActual) {
109
114
  const m = (modeloActual || '').toLowerCase();
115
+ if (m.includes('fable')) return 'claude-opus-4-8';
110
116
  if (m.includes('opus')) return 'claude-sonnet-5';
111
117
  if (m.includes('sonnet')) return 'claude-haiku-4-5-20251001';
112
118
  // haiku o inherit — no hay degradación posible
@@ -244,4 +250,8 @@ async function main() {
244
250
  process.exit(0);
245
251
  }
246
252
 
247
- main().catch(() => process.exit(0));
253
+ if (ES_ENTRYPOINT) {
254
+ main().catch(() => process.exit(0));
255
+ }
256
+
257
+ module.exports = { modeloSugerido, esTrivialPorLongitud, esTareaLigera };
@@ -34,7 +34,6 @@ let _techDetector = null;
34
34
  try { _techDetector = require('./lib/tech-skills-map'); } catch (_) {}
35
35
 
36
36
  // Solo inyectar en la primera invocación
37
- const MAX_INVOCACION_PARA_INYECTAR = 1;
38
37
 
39
38
  function leerSesionAnterior(cwd) {
40
39
  const latestPath = path.join(cwd, '.planning', 'sessions', 'latest.json');
@@ -192,16 +191,17 @@ process.stdin.on('end', () => {
192
191
  const data = JSON.parse(inputRaw);
193
192
  const sessionId = String(data.session_id || 'default');
194
193
 
195
- // Leer bridge para verificar si ya inyectamos
196
- const bridgePath = path.join(os.tmpdir(), `swl-ctx-${sessionId}.json`);
197
- let bridge = {};
194
+ // Estado propio del hook (una inyección por sesión). Histórico: hasta
195
+ // 2026-07-03 leía el bridge swl-ctx-* de linea-estado.js (hook eliminado);
196
+ // ahora este archivo es de su exclusiva propiedad.
197
+ const estadoPath = path.join(os.tmpdir(), `swl-inyeccion-${sessionId}.json`);
198
+ let estado = {};
198
199
  try {
199
- bridge = JSON.parse(fs.readFileSync(bridgePath, 'utf8'));
200
+ estado = JSON.parse(fs.readFileSync(estadoPath, 'utf8'));
200
201
  } catch (_) {}
201
202
 
202
- // Solo inyectar en la primera invocacion
203
- const invocaciones = bridge.invocaciones || 0;
204
- if (invocaciones > MAX_INVOCACION_PARA_INYECTAR || bridge.contextoInyectado) {
203
+ // Solo inyectar una vez por sesión
204
+ if (estado.contextoInyectado) {
205
205
  return;
206
206
  }
207
207
 
@@ -230,11 +230,11 @@ process.stdin.on('end', () => {
230
230
  contexto = scanResult.content; // Original o con advertencia
231
231
  }
232
232
 
233
- // Marcar como inyectado en bridge
233
+ // Marcar como inyectado en el estado propio
234
234
  try {
235
- bridge.contextoInyectado = true;
236
- bridge.contextoTimestamp = new Date().toISOString();
237
- fs.writeFileSync(bridgePath, JSON.stringify(bridge, null, 2), 'utf8');
235
+ estado.contextoInyectado = true;
236
+ estado.contextoTimestamp = new Date().toISOString();
237
+ fs.writeFileSync(estadoPath, JSON.stringify(estado, null, 2), 'utf8');
238
238
  } catch (_) {}
239
239
 
240
240
  // Emitir contexto de sesión anterior
@@ -159,16 +159,17 @@ function extraerInfoTurno(data) {
159
159
  return turno;
160
160
  }
161
161
 
162
- // Solo registrar listeners de stdin en modo CLI. Cuando se importa como
162
+ // Solo registrar listeners de stdin en modo entrypoint. Cuando se importa como
163
163
  // módulo (tests), registrar listeners mantiene el event loop vivo
164
164
  // indefinidamente porque stdin nunca emite 'end' en ese contexto, lo que
165
- // hace que la suite de tests cuelgue hasta el timeout. El hook real
166
- // invocado por Claude Code siempre se ejecuta como require.main.
165
+ // hace que la suite de tests cuelgue hasta el timeout. El hook real invocado
166
+ // por Claude Code corre vía el wrapper `node -e "require(...)"` donde
167
+ // require.main es undefined (NO como require.main del proceso).
167
168
  //
168
169
  // El opt-in via SWL_REGISTRO_TURNOS también se evalúa aquí adentro: si
169
170
  // estuviera en el top-level del archivo, importar el módulo desde un
170
171
  // test sin la env var mataría al test runner via process.exit(0).
171
- if (require.main === module) {
172
+ if (!require.main || require.main === module) {
172
173
  if (process.env.SWL_REGISTRO_TURNOS !== '1') {
173
174
  // OPT-IN: hook inactivo por default. Salir silencioso sin leer stdin.
174
175
  process.exit(0);
@@ -204,7 +204,8 @@ function main() {
204
204
  process.exit(0);
205
205
  }
206
206
 
207
- if (require.main === module) {
207
+ // Entrypoint directo o wrapper `node -e "require(...)"` (require.main undefined).
208
+ if (!require.main || require.main === module) {
208
209
  main();
209
210
  }
210
211
 
@@ -210,7 +210,8 @@ function ejecutarComoHook() {
210
210
  });
211
211
  }
212
212
 
213
- if (require.main === module) {
213
+ // Entrypoint directo o wrapper `node -e "require(...)"` (require.main undefined).
214
+ if (!require.main || require.main === module) {
214
215
  ejecutarComoHook();
215
216
  }
216
217
 
@@ -155,8 +155,9 @@ function ejecutarComoHook() {
155
155
  });
156
156
  }
157
157
 
158
- // Solo escuchar stdin cuando se ejecuta como entrypoint (no al importar para tests)
159
- if (require.main === module) {
158
+ // Solo escuchar stdin cuando corre como entrypoint: directo o wrapper
159
+ // `node -e "require(...)"` (require.main undefined). No al importar para tests.
160
+ if (!require.main || require.main === module) {
160
161
  ejecutarComoHook();
161
162
  }
162
163
 
package/hooks/tdd-gate.js CHANGED
@@ -234,7 +234,8 @@ function main() {
234
234
  process.exit(0);
235
235
  }
236
236
 
237
- if (require.main === module) {
237
+ // Entrypoint directo o wrapper `node -e "require(...)"` (require.main undefined).
238
+ if (!require.main || require.main === module) {
238
239
  main();
239
240
  }
240
241
 
package/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # swl-ses (@saulwade/swl-ses)
2
2
 
3
- > Sistema de ingeniería de software auto-evolutivo multi-runtime polyglot (SDLC completo), distribuido como paquete npm y plugin de Claude Code. 60 agentes, 182 habilidades, 44 comandos, 37 reglas base y 50 hooks. Soporta 11 lenguajes y 7 runtimes (Claude Code, OpenClaude, OpenCode, Gemini, Cursor, Codex, Copilot). Versión 2.3.1.
3
+ > Sistema de ingeniería de software auto-evolutivo multi-runtime polyglot (SDLC completo), distribuido como paquete npm y plugin de Claude Code. 60 agentes, 182 habilidades, 45 comandos, 37 reglas base y 49 hooks. Soporta 11 lenguajes y 7 runtimes (Claude Code, OpenClaude, OpenCode, Gemini, Cursor, Codex, Copilot). Versión 2.3.1.
4
4
 
5
5
  Archivo generado por `node scripts/generar-inventario.js` — no editar a mano. Las cifras se sincronizan con INVENTARIO.md en cada regeneración.
6
6
 
@@ -18,9 +18,9 @@ Archivo generado por `node scripts/generar-inventario.js` — no editar a mano.
18
18
 
19
19
  - 60 agentes especializados en `agentes/` (orquestación, implementación por stack, revisión, calidad, diseño)
20
20
  - 182 habilidades cargables bajo demanda en `habilidades/` (conocimiento operacional con divulgación progresiva)
21
- - 44 comandos `/swl:*` en `comandos/swl/` (ciclo GSD, calidad, release, diagnóstico)
21
+ - 45 comandos `/swl:*` en `comandos/swl/` (ciclo GSD, calidad, release, diagnóstico)
22
22
  - 37 reglas base + 40 reglas por lenguaje en `reglas/` (políticas obligatorias por matcher)
23
- - 50 hooks en `hooks/` (telemetría, validación, seguridad; zero-deps, escrituras atómicas)
23
+ - 49 hooks en `hooks/` (telemetría, validación, seguridad; zero-deps, escrituras atómicas)
24
24
 
25
25
  ## Opcional
26
26