@saulwade/swl-ses 1.8.0 → 2.0.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 (135) hide show
  1. package/CLAUDE.md +8 -8
  2. package/README.md +13 -13
  3. package/agentes/accesibilidad-wcag-swl.md +3 -3
  4. package/agentes/auto-evolucion-swl.md +908 -908
  5. package/agentes/disenador-ui-swl.md +6 -5
  6. package/agentes/frontend-angular-swl.md +2 -2
  7. package/agentes/frontend-css-swl.md +2 -2
  8. package/agentes/frontend-react-swl.md +4 -4
  9. package/agentes/frontend-swl.md +6 -6
  10. package/agentes/investigador-ux-swl.md +5 -5
  11. package/agentes/orquestador-swl.md +96 -8
  12. package/agentes/perfilador-usuario-swl.md +308 -308
  13. package/agentes/producto-prd-swl.md +1 -1
  14. package/agentes/red-team-swl.md +218 -218
  15. package/agentes/revisor-codigo-swl.md +34 -10
  16. package/agentes/revisor-seguridad-swl.md +7 -0
  17. package/agentes/tdd-qa-swl.md +39 -2
  18. package/comandos/swl/actualizar.md +1 -1
  19. package/comandos/swl/aprender.md +2 -2
  20. package/comandos/swl/aprobar-plan.md +152 -0
  21. package/comandos/swl/autoresearch.md +102 -6
  22. package/comandos/swl/ayuda.md +3 -3
  23. package/comandos/swl/discutir-fase.md +20 -2
  24. package/comandos/swl/ejecutar-fase.md +53 -6
  25. package/comandos/swl/evolucionar.md +1 -1
  26. package/comandos/swl/inbox.md +1 -1
  27. package/comandos/swl/instalar.md +1 -1
  28. package/comandos/swl/nemesis.md +42 -1
  29. package/comandos/swl/planear-fase.md +25 -1
  30. package/comandos/swl/plugins.md +1 -1
  31. package/comandos/swl/predecir.md +139 -0
  32. package/comandos/swl/release.md +1 -1
  33. package/comandos/swl/status.md +279 -0
  34. package/comandos/swl/verificar.md +75 -7
  35. package/habilidades/ai-runtime-security/SKILL.md +1 -1
  36. package/habilidades/angular-moderno/SKILL.md +44 -1
  37. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
  38. package/habilidades/autoresearch/SKILL.md +15 -1
  39. package/habilidades/benchmark-memoria/SKILL.md +1 -1
  40. package/habilidades/calidad-contract-testing/SKILL.md +165 -0
  41. package/habilidades/calidad-mutation-testing/SKILL.md +170 -0
  42. package/habilidades/changelog-generator/SKILL.md +9 -2
  43. package/habilidades/changelog-generator/scripts/parse-commits.js +12 -1
  44. package/habilidades/checklist-seguridad/SKILL.md +29 -1
  45. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -0
  46. package/habilidades/css-moderno/SKILL.md +3 -1
  47. package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
  48. package/habilidades/drift-detection/SKILL.md +179 -179
  49. package/habilidades/ejecutar-fase/SKILL.md +64 -14
  50. package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
  51. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
  52. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
  53. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
  54. package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
  55. package/habilidades/fastapi-experto/SKILL.md +56 -5
  56. package/habilidades/harness-claude-code/SKILL.md +10 -7
  57. package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
  58. package/habilidades/instalar-sistema/SKILL.md +3 -3
  59. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
  60. package/habilidades/patrones-python/SKILL.md +8 -5
  61. package/habilidades/perfil-usuario/SKILL.md +200 -200
  62. package/habilidades/planear-fase/SKILL.md +25 -4
  63. package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
  64. package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
  65. package/habilidades/proceso-debate-adversarial/SKILL.md +164 -0
  66. package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -0
  67. package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -0
  68. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -0
  69. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -0
  70. package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
  71. package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
  72. package/habilidades/swl-claudemd/SKILL.md +50 -210
  73. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
  74. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
  75. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
  76. package/habilidades/swl-dashboard/SKILL.md +9 -9
  77. package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
  78. package/habilidades/tdd-workflow/SKILL.md +58 -5
  79. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -0
  80. package/habilidades/validacion-ci-sistema/SKILL.md +3 -3
  81. package/hooks/calidad-pre-commit.js +340 -3
  82. package/hooks/ciclo-evolucion-subagente.js +26 -0
  83. package/hooks/ciclo-evolucion.js +26 -0
  84. package/hooks/contexto-iteracion.js +144 -0
  85. package/hooks/extraccion-aprendizajes.js +13 -0
  86. package/hooks/lib/ciclo-evolucion.js +47 -0
  87. package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
  88. package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
  89. package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
  90. package/hooks/lib/evolution-tracker.js +24 -3
  91. package/hooks/lib/loop-telemetry.js +321 -0
  92. package/hooks/notificacion-telegram.js +11 -3
  93. package/hooks/spec-gate.js +211 -0
  94. package/hooks/tdd-gate.js +241 -0
  95. package/hooks/validar-intent-spec.js +30 -10
  96. package/llms.txt +29 -0
  97. package/manifiestos/hooks-config.json +36 -18
  98. package/manifiestos/modulos.json +23 -14
  99. package/manifiestos/skills-lock.json +100 -72
  100. package/package.json +4 -3
  101. package/plugin.json +9 -10
  102. package/reglas/accesibilidad.md +10 -0
  103. package/reglas/api-diseno.md +9 -0
  104. package/reglas/arquitectura.evolved.json +7 -0
  105. package/reglas/arquitectura.md +65 -0
  106. package/reglas/auditorias-documentales-estructurales.md +7 -0
  107. package/reglas/cloud-infra.md +8 -0
  108. package/reglas/fragmentos-compartidos.md +5 -0
  109. package/reglas/gobernanza.md +4 -4
  110. package/reglas/hooks.md +6 -0
  111. package/reglas/intent-engineering.md +4 -0
  112. package/reglas/markitdown.md +8 -0
  113. package/reglas/memoria-consolidada.md +1 -1
  114. package/reglas/patrones.md +6 -0
  115. package/reglas/registro-componentes-nuevos.md +10 -1
  116. package/reglas/seguridad-agentes.md +1 -1
  117. package/reglas/seguridad.evolved.json +7 -0
  118. package/reglas/seguridad.md +144 -0
  119. package/reglas/skills-estandar.md +6 -0
  120. package/reglas/testing.md +7 -0
  121. package/reglas/tests-cleanup.md +4 -0
  122. package/reglas/usar-sistema-swl.md +1 -1
  123. package/scripts/generar-inventario.js +64 -1
  124. package/scripts/instalador.js +32 -2
  125. package/scripts/lib/gitignore-manifest.js +29 -1
  126. package/scripts/lib/plan-lock.js +275 -0
  127. package/scripts/migrar-fase-dominio.js +0 -1
  128. package/scripts/smoke-test.js +24 -2
  129. package/scripts/verificar-trazabilidad.js +292 -0
  130. package/agentes/ux-disenador-swl.md +0 -503
  131. package/comandos/swl/dashboard.md +0 -146
  132. package/comandos/swl/evolucion-estado.md +0 -191
  133. package/comandos/swl/metricas.md +0 -342
  134. package/comandos/swl/salud.md +0 -481
  135. package/reglas/verificar-citas-temporales.md +0 -139
@@ -0,0 +1,144 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Hook: contexto-iteracion.js
6
+ * Tipo: UserPromptSubmit (matcher vacío)
7
+ *
8
+ * Anti-context-rot para loops iterativos: cuando hay una corrida activa en
9
+ * .planning/loops/ (autoresearch, nemesis --remediar, verificar
10
+ * --until-converge, debate adversarial), inyecta al contexto un bloque
11
+ * compacto con el estado del loop — iteración actual, últimas 3 filas del
12
+ * TSV y la recomendación de trayectoria (continuar / detener por plateau /
13
+ * cambiar estrategia).
14
+ *
15
+ * En sesiones largas el modelo pierde de vista en qué iteración va y si la
16
+ * métrica sigue mejorando; este hook re-ancla ese estado sin que el agente
17
+ * tenga que releer archivos. Patrón adoptado del análisis de autoresearch
18
+ * v2.1 (hook iteration-context), adaptado a SWL: estado en el directorio de
19
+ * la corrida (no /tmp) y throttle por tiempo (no por conteo de prompts).
20
+ *
21
+ * Throttle: máximo 1 inyección cada 4 minutos por corrida (estado en
22
+ * .inject-state.json dentro del directorio de la corrida — se limpia solo
23
+ * con la corrida). 4 min < TTL del prompt cache (5 min): la inyección no
24
+ * coincide dos veces dentro de la misma ventana de cache.
25
+ *
26
+ * Zero-deps (solo hooks/lib/loop-telemetry). Nunca bloquea.
27
+ * Opt-out: SWL_CONTEXTO_ITERACION=0
28
+ */
29
+
30
+ const fs = require('fs');
31
+ const path = require('path');
32
+
33
+ const { atomicWriteJSON } = require('./lib/atomic-write');
34
+ const { corridaActiva, analizarTrayectoria } = require('./lib/loop-telemetry');
35
+
36
+ /** Intervalo mínimo entre inyecciones para la misma corrida (4 minutos). */
37
+ const THROTTLE_MS = 4 * 60 * 1000;
38
+
39
+ const ARCHIVO_ESTADO = '.inject-state.json';
40
+
41
+ /**
42
+ * Decide si toca inyectar según el estado de throttle de la corrida.
43
+ * @param {string} dirCorrida - Directorio de la corrida activa.
44
+ * @param {number} [ahora=Date.now()]
45
+ * @returns {boolean}
46
+ */
47
+ function debeInyectar(dirCorrida, ahora = Date.now()) {
48
+ try {
49
+ const estado = JSON.parse(
50
+ fs.readFileSync(path.join(dirCorrida, ARCHIVO_ESTADO), 'utf8')
51
+ );
52
+ return ahora - (estado.ultimaInyeccion || 0) > THROTTLE_MS;
53
+ } catch {
54
+ return true; // sin estado = primera inyección
55
+ }
56
+ }
57
+
58
+ /** Registra la inyección para el throttle. Best-effort, escritura atómica. */
59
+ function registrarInyeccion(dirCorrida, ahora = Date.now()) {
60
+ try {
61
+ atomicWriteJSON(
62
+ path.join(dirCorrida, ARCHIVO_ESTADO),
63
+ { ultimaInyeccion: ahora }
64
+ );
65
+ } catch { /* silencioso */ }
66
+ }
67
+
68
+ /**
69
+ * Construye el bloque de contexto a inyectar.
70
+ * @param {{dir: string, tipo: string, ultimasFilas: object[], totalFilas: number}} activa
71
+ * @param {object} trayectoria - Resultado de analizarTrayectoria.
72
+ * @returns {string}
73
+ */
74
+ function construirBloque(activa, trayectoria) {
75
+ const lineas = [];
76
+ lineas.push(`🔁 Loop activo: \`${activa.tipo}\` (${path.basename(activa.dir)})`);
77
+ lineas.push(
78
+ `Iteraciones: ${trayectoria.totalIteraciones} | keep: ${trayectoria.keeps} | ` +
79
+ `revert: ${trayectoria.reverts} | métrica: ${trayectoria.metricaInicial} → ${trayectoria.metricaFinal}`
80
+ );
81
+
82
+ if (activa.ultimasFilas.length > 0) {
83
+ lineas.push('Últimas iteraciones:');
84
+ for (const fila of activa.ultimasFilas) {
85
+ const desc = (fila.descripcion || '').slice(0, 80);
86
+ lineas.push(` ${fila.iteracion ?? '?'}. [${fila.estado || '?'}] métrica=${fila.metrica ?? '?'} — ${desc}`);
87
+ }
88
+ }
89
+
90
+ if (trayectoria.plateau) {
91
+ lineas.push(
92
+ '⚠️ PLATEAU detectado: las últimas iteraciones no mejoran la métrica. ' +
93
+ 'Considera cerrar el loop y reportar el mejor estado alcanzado en lugar de seguir iterando.'
94
+ );
95
+ } else {
96
+ lineas.push(`Recomendación de trayectoria: ${trayectoria.recomendacion}.`);
97
+ }
98
+ lineas.push(`Registro completo: ${path.join(activa.dir, 'iteraciones.tsv')}`);
99
+
100
+ return lineas.join('\n');
101
+ }
102
+
103
+ // ---------------------------------------------------------------------------
104
+ // Entrypoint
105
+ // ---------------------------------------------------------------------------
106
+
107
+ function main() {
108
+ let inputRaw = '';
109
+ process.stdin.on('data', (c) => { inputRaw += c; });
110
+
111
+ process.stdin.on('end', () => {
112
+ try {
113
+ if (process.env.SWL_CONTEXTO_ITERACION === '0') return;
114
+
115
+ const activa = corridaActiva(process.cwd(), { maxEdadMin: 30 });
116
+ if (!activa) return;
117
+ if (!debeInyectar(activa.dir)) return;
118
+
119
+ const trayectoria = analizarTrayectoria(activa.dir);
120
+ // Sin iteraciones más allá del baseline no hay nada útil que anclar
121
+ if (trayectoria.totalIteraciones === 0) return;
122
+
123
+ const output = {
124
+ hookSpecificOutput: {
125
+ hookEventName: 'UserPromptSubmit',
126
+ additionalContext: construirBloque(activa, trayectoria),
127
+ },
128
+ };
129
+ // Marcar el throttle SOLO tras un write exitoso: si stdout falla
130
+ // (broken pipe, harness cerró el canal), no registrar la inyección
131
+ // para que el próximo prompt reintente en vez de saltarse 4 min con
132
+ // un mensaje que nunca llegó. Best-effort: el hook nunca bloquea.
133
+ process.stdout.write(JSON.stringify(output), (err) => {
134
+ if (!err) {
135
+ try { registrarInyeccion(activa.dir); } catch { /* throttle best-effort */ }
136
+ }
137
+ });
138
+ } catch { /* nunca bloquea */ }
139
+ });
140
+ }
141
+
142
+ if (require.main === module) main();
143
+
144
+ module.exports = { debeInyectar, registrarInyeccion, construirBloque, THROTTLE_MS, ARCHIVO_ESTADO };
@@ -663,6 +663,19 @@ const PATRONES_ARCHIVO_SWL_EXCLUIDO = [
663
663
  /[\\/]package\.json$/,
664
664
  /[\\/]plugin\.json$/,
665
665
  /[\\/]package-lock\.json$/,
666
+ // Scripts temporales del agente (convención .tmp-*.js|.md en la raíz del
667
+ // repo, borrados en el mismo turno). Sus comentarios de cabecera describen
668
+ // la operación con keywords narrativas ("sustitución", "idempotente",
669
+ // "reescribe") que el hook confunde con descubrimientos. Detectado
670
+ // 2026-06-11: el comentario de .tmp-fusion-status.js se promovió como
671
+ // entrada "descubrimiento" a APRENDIZAJES.md.
672
+ /(?:^|[\\/])\.tmp-[^\\/]+$/,
673
+ // Reglas globales instaladas del usuario (~/.claude/rules/): editar esas
674
+ // copias es mantenimiento de configuración, no descubrimiento. El patrón
675
+ // /reglas[\\/]/ de arriba no las cubre porque el directorio se llama
676
+ // "rules" (inglés). Detectado 2026-06-11: fragmentos de una edición a
677
+ // verificar-citas-normativas.md (global) se promovieron como "patrón".
678
+ /(?:^|[\\/])\.claude[\\/]rules[\\/]/,
666
679
  ];
667
680
 
668
681
  /**
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * hooks/lib/ciclo-evolucion.js — Lib de dominio del ciclo de evolución (Fase 11).
5
+ *
6
+ * Consolida las 3 etapas que antes eran hooks independientes
7
+ * (`metricas-evolucion.js`, `actualizar-perfil-usuario.js`,
8
+ * `auto-evolucion.js`). Cada etapa preserva su lógica intacta en
9
+ * `etapa-*.js`; esta lib solo las compone para reducir procesos de arranque.
10
+ *
11
+ * Mapeo a entry points:
12
+ * - hooks/ciclo-evolucion.js (Stop) → metricas + perfil-usuario
13
+ * - hooks/ciclo-evolucion-subagente.js (SubagentStop) → auto-evolucion
14
+ *
15
+ * `auto-consolidacion.js` queda FUERA por diseño: pertenece al dominio de
16
+ * consolidación de aprendizajes (/swl:aprender), no al de evolución (D-12).
17
+ */
18
+
19
+ const etapaMetricas = require('./etapa-metricas');
20
+ const etapaPerfilUsuario = require('./etapa-perfil-usuario');
21
+ const etapaAutoEvolucion = require('./etapa-auto-evolucion');
22
+
23
+ /**
24
+ * Sub-etapas del evento Stop: métricas del ciclo + perfil de usuario.
25
+ * Cada etapa es best-effort (nunca lanza); un fallo en una no impide la otra.
26
+ * @param {string} inputRaw payload del hook Stop
27
+ */
28
+ function ejecutarStop(inputRaw) {
29
+ try { etapaMetricas.ejecutar(inputRaw); } catch { /* best-effort */ }
30
+ try { etapaPerfilUsuario.ejecutar(inputRaw); } catch { /* best-effort */ }
31
+ }
32
+
33
+ /**
34
+ * Sub-etapa del evento SubagentStop: auto-evolución de agentes.
35
+ * @param {string} inputRaw payload del hook SubagentStop
36
+ */
37
+ function ejecutarSubagentStop(inputRaw) {
38
+ try { etapaAutoEvolucion.ejecutar(inputRaw); } catch { /* best-effort */ }
39
+ }
40
+
41
+ module.exports = {
42
+ ejecutarStop,
43
+ ejecutarSubagentStop,
44
+ etapaMetricas,
45
+ etapaPerfilUsuario,
46
+ etapaAutoEvolucion,
47
+ };