@saulwade/swl-ses 2.4.3 → 2.5.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 (197) hide show
  1. package/CLAUDE.md +194 -241
  2. package/README.md +600 -597
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/agentes/abogado-diablo-swl.md +145 -0
  6. package/agentes/accesibilidad-wcag-swl.md +690 -690
  7. package/agentes/arquitecto-swl.md +267 -267
  8. package/agentes/auto-evolucion-swl.md +908 -908
  9. package/agentes/backend-api-swl.md +1 -1
  10. package/agentes/backend-csharp-swl.md +420 -420
  11. package/agentes/backend-go-swl.md +390 -390
  12. package/agentes/backend-java-swl.md +281 -281
  13. package/agentes/backend-node-swl.md +1 -1
  14. package/agentes/backend-python-swl.md +1 -1
  15. package/agentes/backend-rust-swl.md +364 -364
  16. package/agentes/backend-workers-swl.md +482 -482
  17. package/agentes/cloud-infra-swl.md +509 -509
  18. package/agentes/consolidador-swl.md +541 -541
  19. package/agentes/datos-swl.md +1 -1
  20. package/agentes/depurador-swl.md +352 -352
  21. package/agentes/devops-ci-swl.md +400 -400
  22. package/agentes/disenador-ui-swl.md +569 -569
  23. package/agentes/documentador-swl.md +345 -345
  24. package/agentes/frontend-angular-swl.md +621 -621
  25. package/agentes/frontend-css-swl.md +716 -716
  26. package/agentes/frontend-react-swl.md +692 -692
  27. package/agentes/frontend-swl.md +496 -496
  28. package/agentes/frontend-tailwind-swl.md +826 -826
  29. package/agentes/gh-fix-ci-swl.md +6 -1
  30. package/agentes/implementador-swl.md +1 -1
  31. package/agentes/investigador-swl.md +432 -432
  32. package/agentes/investigador-ux-swl.md +505 -505
  33. package/agentes/llm-apps-swl.md +1 -1
  34. package/agentes/migrador-swl.md +442 -442
  35. package/agentes/mobile-android-swl.md +511 -511
  36. package/agentes/mobile-cross-swl.md +541 -541
  37. package/agentes/mobile-ios-swl.md +502 -502
  38. package/agentes/mobile-testing-swl.md +302 -302
  39. package/agentes/nemesis-auditor-swl.md +285 -285
  40. package/agentes/notificador-swl.md +1 -1
  41. package/agentes/observabilidad-swl.md +438 -438
  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 +10 -1
  50. package/agentes/revisor-angular-swl.md +278 -278
  51. package/agentes/revisor-codigo-swl.md +1 -1
  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 +1 -1
  64. package/agentes/tdd-qa-swl.md +393 -393
  65. package/bin/lib/bot-comandos.js +1 -1
  66. package/bin/swl-ses.js +6 -0
  67. package/comandos/swl/adoptar-proyecto.md +14 -2
  68. package/comandos/swl/configurar-ci.md +8 -1
  69. package/comandos/swl/deuda-codigo.md +97 -97
  70. package/comandos/swl/discutir-fase.md +22 -118
  71. package/comandos/swl/fix.md +118 -0
  72. package/comandos/swl/nuevo-proyecto.md +54 -3
  73. package/comandos/swl/predecir.md +32 -2
  74. package/comandos/swl/seguridad.md +189 -0
  75. package/comandos/swl/status.md +5 -3
  76. package/habilidades/aprendizaje-continuo/SKILL.md +3 -1
  77. package/habilidades/discutir-fase/SKILL.md +84 -81
  78. package/habilidades/discutir-fase/recursos/plantilla-contexto.md +136 -0
  79. package/habilidades/doc-sync/SKILL.md +3 -1
  80. package/habilidades/doubt-driven-review/SKILL.md +15 -1
  81. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  82. package/habilidades/estructura-proyecto-claude/SKILL.md +11 -2
  83. package/habilidades/harness-claude-code/SKILL.md +3 -1
  84. package/habilidades/instalar-sistema/SKILL.md +3 -1
  85. package/habilidades/meta-reglas-extendido/SKILL.md +92 -0
  86. package/habilidades/meta-reglas-extendido/recursos/analisis-previo-tareas-grandes.md +186 -0
  87. package/habilidades/meta-reglas-extendido/recursos/analizar-directorios-antes-de-escribir.md +235 -0
  88. package/habilidades/meta-reglas-extendido/recursos/api-diseno.md +413 -0
  89. package/habilidades/meta-reglas-extendido/recursos/arquitectura.md +491 -0
  90. package/habilidades/meta-reglas-extendido/recursos/arreglar-al-detectar.md +264 -0
  91. package/habilidades/meta-reglas-extendido/recursos/debatir-antes-de-aceptar.md +152 -0
  92. package/habilidades/meta-reglas-extendido/recursos/git-workflow.md +259 -0
  93. package/habilidades/meta-reglas-extendido/recursos/gobernanza.md +291 -0
  94. package/habilidades/meta-reglas-extendido/recursos/memoria-consolidada.md +263 -0
  95. package/habilidades/meta-reglas-extendido/recursos/seguridad-agentes.md +443 -0
  96. package/habilidades/meta-reglas-extendido/recursos/sesiones-paralelas.md +190 -0
  97. package/habilidades/meta-reglas-extendido/recursos/sin-duplicacion-reglas-globales.md +179 -0
  98. package/habilidades/meta-reglas-extendido/recursos/skills-estandar.md +394 -0
  99. package/habilidades/meta-reglas-extendido/recursos/usar-code-review-graph.md +156 -0
  100. package/habilidades/meta-reglas-extendido/recursos/usar-context7.md +236 -0
  101. package/habilidades/meta-reglas-extendido/recursos/usar-sistema-swl.md +253 -0
  102. package/habilidades/meta-reglas-extendido/recursos/verificar-citas-normativas.md +527 -0
  103. package/habilidades/meta-skills-estandar/SKILL.md +3 -1
  104. package/habilidades/nuevo-proyecto/SKILL.md +20 -3
  105. package/habilidades/php-experto/SKILL.md +10 -3
  106. package/habilidades/{filament-admin/SKILL.md → php-experto/recursos/filament-admin.md} +23 -39
  107. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
  108. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
  109. package/habilidades/proceso-debate-adversarial/recursos/personas.md +5 -4
  110. package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -0
  111. package/hooks/check-update.js +19 -10
  112. package/hooks/contexto-subagente.js +68 -68
  113. package/hooks/degradacion-instintos.js +1 -1
  114. package/hooks/extraccion-aprendizajes.js +2 -2
  115. package/hooks/lib/briefing.js +3 -3
  116. package/hooks/lib/nudge-tracker.js +1 -1
  117. package/hooks/lib/otlp-exporter.js +1 -1
  118. package/hooks/lib/webhook-dedup.js +1 -1
  119. package/hooks/session-briefing.js +1 -1
  120. package/llms.txt +6 -6
  121. package/manifiestos/canonical-hashes.json +713 -52
  122. package/manifiestos/hooks-config.json +469 -469
  123. package/manifiestos/invariantes-criticos.json +30 -30
  124. package/manifiestos/modulos.json +168 -135
  125. package/manifiestos/perfiles.json +0 -2
  126. package/manifiestos/skills-lock.json +49 -56
  127. package/package.json +7 -5
  128. package/plantillas/github-workflows/README.md +15 -1
  129. package/plantillas/github-workflows/swl-devsecops.yml +70 -0
  130. package/plugin.json +5 -5
  131. package/reglas/analisis-previo-tareas-grandes.md +30 -156
  132. package/reglas/analizar-directorios-antes-de-escribir.md +30 -211
  133. package/reglas/api-diseno.md +28 -398
  134. package/reglas/arquitectura.md +35 -456
  135. package/reglas/arreglar-al-detectar.md +30 -230
  136. package/reglas/debatir-antes-de-aceptar.md +30 -143
  137. package/reglas/docs.md +7 -0
  138. package/reglas/estilo-codigo.md +9 -0
  139. package/reglas/fragmentos-compartidos.md +6 -0
  140. package/reglas/git-workflow.md +44 -240
  141. package/reglas/gobernanza.md +23 -262
  142. package/reglas/memoria-consolidada.md +34 -228
  143. package/reglas/performance.md +8 -0
  144. package/reglas/pruebas.md +12 -0
  145. package/reglas/seguridad-agentes.md +37 -418
  146. package/reglas/seguridad.md +12 -0
  147. package/reglas/sesiones-paralelas.md +29 -162
  148. package/reglas/sin-duplicacion-reglas-globales.md +25 -166
  149. package/reglas/skills-estandar.md +23 -373
  150. package/reglas/usar-code-review-graph.md +31 -140
  151. package/reglas/usar-context7.md +30 -208
  152. package/reglas/usar-sistema-swl.md +47 -242
  153. package/reglas/verificar-citas-normativas.md +47 -537
  154. package/scripts/actualizar.js +253 -253
  155. package/scripts/audit-tools/auditar-relleno-inventario.js +145 -0
  156. package/scripts/auditar-clases-conocidas.js +106 -0
  157. package/scripts/bootstrap-instintos.js +2 -2
  158. package/scripts/canario-hooks.js +166 -0
  159. package/scripts/cli/configurar-ci.js +2 -1
  160. package/scripts/evidencia-valor.js +93 -0
  161. package/scripts/field-report.js +1 -1
  162. package/scripts/generar-comandos.js +143 -0
  163. package/scripts/generar-inventario.js +236 -23
  164. package/scripts/generar-matriz-lenguajes.js +1 -1
  165. package/scripts/instalador.js +15 -1
  166. package/scripts/lib/configurar-ci.js +10 -3
  167. package/scripts/lib/diary-entry.js +3 -1
  168. package/scripts/lib/drift-detector.js +1 -1
  169. package/scripts/lib/evidencia-valor.js +189 -0
  170. package/scripts/lib/expandir-targets.js +71 -71
  171. package/scripts/lib/frontmatter-md.js +63 -0
  172. package/scripts/lib/parsear-opciones.js +2 -0
  173. package/scripts/lib/prune-componentes.js +180 -0
  174. package/scripts/lib/reglas-globales-conocidas.json +16 -2
  175. package/scripts/lib/scoring-instintos.js +2 -2
  176. package/scripts/lib/toml-merge.js +204 -204
  177. package/scripts/lib/transformadores/claude.js +1 -1
  178. package/scripts/lib/transformadores/codex.js +1 -1
  179. package/scripts/lib/transformadores/copilot.js +1 -1
  180. package/scripts/lib/transformadores/cursor.js +1 -1
  181. package/scripts/lib/transformadores/gemini.js +22 -2
  182. package/scripts/lib/transformadores/opencode.js +1 -1
  183. package/scripts/mcp-server/auth.js +105 -105
  184. package/scripts/mcp-server/cache.js +106 -106
  185. package/scripts/prune.js +102 -0
  186. package/scripts/publicar.js +18 -2
  187. package/scripts/tui/pantallas/inspect.js +175 -175
  188. package/scripts/tui/pantallas/uninstall-wizard.js +210 -210
  189. package/scripts/tui/pantallas/update-wizard.js +234 -234
  190. package/scripts/tui/pantallas/welcome.js +189 -189
  191. package/habilidades/paid-media-tracking/SKILL.md +0 -269
  192. package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +0 -220
  193. package/habilidades/paid-media-tracking/recursos/google-ads-api.md +0 -215
  194. package/habilidades/tracking-measurement/SKILL.md +0 -239
  195. package/habilidades/tracking-measurement/recursos/consent-mode.md +0 -231
  196. package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +0 -216
  197. package/habilidades/tracking-measurement/recursos/meta-capi.md +0 -262
@@ -0,0 +1,147 @@
1
+ ---
2
+ name: proceso-ingenieria-requerimientos
3
+ description: >
4
+ Checklist de calidad de requerimientos basado en ingeniería de
5
+ requerimientos clásica (investigación académica del autor, 2003; refs
6
+ ZAVE94 y RE'01): las 8 características del buen requerimiento (correcto,
7
+ necesario, conciso, libre de implementación, factible, priorizable, no
8
+ ambiguo, verificable), la heurística "una verificación = un requerimiento",
9
+ la metadata de soporte por REQ (IDUR, padre, fuente, razón, riesgo, estado)
10
+ y la jerarquía de verificación (inspección < demostración < prueba).
11
+ Cargar al congelar REQs en /swl:discutir-fase (Bloque 5), al redactar
12
+ criterios de aceptación en un PRD (producto-prd-swl), o al auditar la
13
+ calidad de un CONTEXTO.md/REQUISITOS.md existente.
14
+ version: "1.0.0"
15
+ herramientasPermitidas: [Read]
16
+ evolvable: true
17
+ exclusiones:
18
+ - "No cargar para descomponer REQs en tareas — eso es planificador-swl con el REQ ya congelado."
19
+ - "No cargar para verificar la CADENA REQ→tarea→commit→test — eso es el gate G4 de /swl:verificar; este skill mejora la calidad del REQ ANTES de que exista la cadena."
20
+ - "No cargar para decisiones de arquitectura — un ADR documenta el CÓMO se decide; este skill vigila que el REQ diga el QUÉ sin contaminarse de cómo."
21
+ ---
22
+ # Ingeniería de requerimientos — checklist de calidad por REQ
23
+
24
+ Un requerimiento mal escrito se propaga: el plan lo descompone mal, el test
25
+ lo verifica mal y el gate G4 valida una cadena correcta sobre un contenido
26
+ incorrecto. Este skill se aplica a **cada REQ individual antes de congelarlo**
27
+ (cierre de `discutir-fase`, redacción de PRD), no a la cadena posterior.
28
+
29
+ > La IR "funciona como el puente entre la necesidad que tienen los usuarios
30
+ > del mundo real [...] y las capacidades y oportunidades que brinda la
31
+ > tecnología" (RE'01). El REQ es ese puente: si el puente está torcido, todo
32
+ > lo que cruza llega torcido.
33
+
34
+ ## Cuándo cargar
35
+
36
+ - Al cerrar el **Bloque 5** de `discutir-fase` (criterios de aceptación),
37
+ antes de escribir los `REQ-<fase>-NN` al CONTEXTO.md.
38
+ - Al redactar criterios de aceptación e historias en un PRD.
39
+ - Al auditar un CONTEXTO.md o REQUISITOS.md existente (¿por qué esta fase
40
+ divergió? — a menudo el REQ era ambiguo desde el origen).
41
+
42
+ ## Las 8 características — checklist con prueba operativa
43
+
44
+ Aplicar a CADA requerimiento. Un REQ que falla una característica se
45
+ reescribe antes de congelar, no después de implementar.
46
+
47
+ | # | Característica | Prueba operativa |
48
+ |---|---|---|
49
+ | 1 | **Correcto** | Solo el usuario (o su sustituto cercano) determina si es correcto — validarlo con él en la entrevista. "Probablemente es lo que querían" = adivinar, no elicitar. |
50
+ | 2 | **Necesario** | Rastrear a una fuente con autoridad (petición del usuario, REQ padre, estándar, regulación). Prueba: *¿si lo elimino, qué necesidad queda sin resolver?* Sin respuesta = *gold plating* — fuera. |
51
+ | 3 | **Conciso** | Dice QUÉ debe hacerse y solo eso. Explicaciones, racional y análisis van en la metadata `Razón`, no en el enunciado. |
52
+ | 4 | **Libre de implementación** | Dice qué, no cómo. Regla de cascada: *"el diseño de un nivel es el requerimiento del nivel inferior"* — la solución elegida (ADR) genera los REQs del siguiente nivel, sin fijar el diseño de ese nivel. Excepción legítima: requerimientos de interface. |
53
+ | 5 | **Factible** | Chequeo de realidad técnica y de costo contra el sistema y su ambiente conocidos. Valores numéricos sospechosos se retan con física/límites del stack (el radar no ve más allá del horizonte). `/swl:predecir --abogado-diablo` es el retador formal. |
54
+ | 6 | **Priorizable** | Prioridad asignada = f(valor al cliente, costo relativo, riesgo técnico). Si todo es igual de importante, no se puede reaccionar a recortes ni imprevistos. |
55
+ | 7 | **No ambiguo** | Todos los lectores llegan a UNA interpretación. Palabras prohibidas en el enunciado: *fácil, simple, rápido, eficiente, varios, mejorado, robusto, flexible, amigable, maximizar, minimizar, soportar*. Cada una se reemplaza por un valor medible o se elimina. |
56
+ | 8 | **Verificable** | Enunciado en términos mensurables con tolerancias ("105 ± 0.5", "p95 < N ms", "0 hallazgos CRÍTICOS"). Un REQ no verificable convierte la aceptación en cuestión de opinión. No consistente/no factible/ambiguo ⇒ no verificable. |
57
+
58
+ ## Heurística de concisión: una verificación = un requerimiento
59
+
60
+ ¿La alarma visual y la audible son uno o dos REQs? **Se decide por cómo se
61
+ verificará**: si una sola prueba/demostración las verifica juntas, son UN
62
+ requerimiento; si exigen verificaciones separadas, son DOS. Ni párrafos con
63
+ múltiples REQs escondidos, ni multiplicar REQs sin razón — cada REQ se
64
+ administra y verifica, y eso cuesta.
65
+
66
+ ## Tipos técnicos (y su relación de verificación)
67
+
68
+ - **Funcional** — cualitativo: qué hace ("detectar blancos"). Se verifica por
69
+ la SUMA de sus requerimientos de desempeño asociados.
70
+ - **Desempeño** — cuantitativo y comprobable individualmente ("detectar 0.1 m²
71
+ a >20 km con Pd ≥ 0.9"). Usualmente varios por cada funcional.
72
+ - **Restricción de diseño** — límites bajo los que debe existir (peso, tamaño,
73
+ ambiente, stack impuesto).
74
+ - **Interface** — cómo interactúa con sistemas externos o entre subsistemas;
75
+ la excepción documentada a "libre de implementación".
76
+
77
+ ## Metadata de soporte por REQ
78
+
79
+ El REQ es un objeto de primera clase con metadata, no una línea suelta:
80
+
81
+ | Atributo | En swl-ses | Regla |
82
+ |---|---|---|
83
+ | **IDUR** | `REQ-<fase>-NN` (namespaceado) | Único, jamás reutilizado |
84
+ | **Padre** | `padre: REQ-<fase>-MM` (opcional) | Para REQs derivados de uno de nivel superior — da trazabilidad vertical |
85
+ | **Fuente** | quién/qué lo pidió (usuario en entrevista, PRD §, estándar, regla) | Sin fuente identificable → aplica prueba de "necesario" |
86
+ | **Razón** | 1 línea de racional o puntero (análisis, ADR, supuesto del Bloque 4) | Aquí vive lo que "conciso" echó del enunciado |
87
+ | **Riesgo** | alto/medio/bajo + por qué | Alimenta la priorización del plan |
88
+ | **Estado** | `PENDIENTE → definido → aprobado (gate G1) → verificado (gate G4) → borrado` | Mapa del ciclo PSD/PSR/Definido/Aprobado/Verificado/Borrado clásico; REQs `PENDIENTE` bloquean el cierre de la discusión |
89
+
90
+ ## Jerarquía de verificación (al declarar CÓMO se verificará cada REQ)
91
+
92
+ **Inspección** (mirar/medir el artefacto) < **demostración** (observar la
93
+ operación con instrumentación mínima — p. ej. medir MTTR reparando fallas
94
+ inducidas) < **prueba** (instrumentada por completo — la más confiable y la
95
+ más cara) — con **análisis** como soporte barato (modelos validados contra
96
+ pruebas previas). Elegir el método MÁS BARATO que realmente verifique el
97
+ REQ; declarar el método junto al criterio de aceptación.
98
+
99
+ ## Dos escalas de priorización (usar una, explícita)
100
+
101
+ - **Alto / Medio / Bajo** — crítico de misión para la próxima liberación /
102
+ necesario eventualmente / mejora si los recursos lo permiten.
103
+ - **Esencial / Condicional / Opcional** — el producto no es aceptable sin él /
104
+ mejora pero el producto es aceptable sin ella / puede o no valer la pena.
105
+ - MoSCoW (del PRD) mapea: Must≈Esencial, Should/Could≈Condicional,
106
+ Won't≈fuera. Declarar QUÉ escala se usa; nunca mezclar dos en el mismo doc.
107
+
108
+ ## Por qué la elicitación falla (y qué hace el cuestionario al respecto)
109
+
110
+ Restricciones clásicas que el entrevistador debe asumir como default:
111
+ **conocimiento tácito** (la gente no sabe describir lo que hace — pedir
112
+ ejemplos concretos, no definiciones), **distribución del conocimiento**
113
+ (fuentes múltiples en conflicto — los conflictos se registran como decisiones
114
+ del Bloque 4, no se resuelven en silencio), **observación limitada** y
115
+ **parcialidad** (el resultado afecta al informante). Es la razón por la que
116
+ `discutir-fase` pregunta supuestos explícitos y registra decisiones con
117
+ estado en vez de asumir consenso.
118
+
119
+ ## Cuándo NO cargar
120
+
121
+ - REQs ya congelados con plan aprobado (gate G1) — re-litigar el REQ ahí es
122
+ cambio de scope: pasa por re-planificación, no por este checklist.
123
+ - Tareas técnicas triviales sin REQs formales (fix puntual, typo).
124
+ - Verificación post-implementación — eso es `/swl:verificar` (G4).
125
+
126
+ ## Gotchas / Errores comunes no obvios
127
+
128
+ - **Checklist aplicado al documento y no al requerimiento**: las 8
129
+ características se evalúan POR REQ individual; un CONTEXTO.md "en general
130
+ claro" puede contener 2 REQs ambiguos que revientan la fase.
131
+ - **"Verificable" confundido con "tiene test"**: verificable es una propiedad
132
+ del ENUNCIADO (términos mensurables), previa al test. G4 valida que el test
133
+ exista; este skill valida que el enunciado sea testeable.
134
+ - **Racional dentro del enunciado**: si el REQ explica por qué, mezcla dos
135
+ atributos — mover el porqué a `Razón` y dejar el enunciado conciso.
136
+ - **Funcional "verificado" directamente**: un funcional sin desempeños
137
+ asociados se "verifica" con opinión. Todo funcional no trivial necesita al
138
+ menos un desempeño cuantitativo asociado.
139
+
140
+ ---
141
+
142
+ **Origen**: investigación académica de Saúl Wade, *"Ingeniería de
143
+ requerimientos"* (Wade Inc., ~2003; referencias [ZAVE94] y [RE'01 CfP]),
144
+ absorbida al sistema el 2026-07-08 (v2.5.1). El documento fuente vive en
145
+ `temp/` del repo madre (material de referencia, no distribuido); este skill
146
+ es su destilado operativo con el mapeo a los mecanismos SWL (gates G1/G4,
147
+ cuestionario de discutir-fase, MoSCoW del PRD).
@@ -205,9 +205,13 @@ process.stdin.on('end', async () => {
205
205
  notificado: 2,
206
206
  }), 'utf8');
207
207
  } catch { /* silencioso */ }
208
- process.stderr.write(
208
+ // stdout, NO stderr: en Claude Code el stderr de un hook con exit 0 no
209
+ // se muestra a nadie (bug de visibilidad 2026-07-08 — el aviso llevaba
210
+ // meses emitiéndose a un canal invisible). El stdout de
211
+ // UserPromptSubmit/SessionStart sí llega como contexto visible.
212
+ process.stdout.write(
209
213
  '[swl-ses/check-update] lib npm-version no disponible — el aviso de ' +
210
- 'nuevas versiones está inactivo. Reinstala con: ' +
214
+ 'nuevas versiones está inactivo. Informa al usuario que reinstale con: ' +
211
215
  'npx -y @saulwade/swl-ses@latest update\n'
212
216
  );
213
217
  }
@@ -223,9 +227,11 @@ process.stdin.on('end', async () => {
223
227
  // `undefined < 2` evalúa `false` por NaN comparison — usar fallback a 0.
224
228
  const notificadoActual = data.notificado || 0;
225
229
  if (data.hayNueva && notificadoActual < 2) {
226
- process.stderr.write(
227
- `[swl-ses] Versión ${data.remota} disponible (actual: ${data.local}). ` +
228
- `Ejecuta: npx @saulwade/swl-ses@latest update\n`
230
+ // stdout (visible como contexto), no stderr (invisible con exit 0).
231
+ process.stdout.write(
232
+ `[swl-ses] Hay una versión nueva de swl-ses: ${data.remota} (instalada: ${data.local}). ` +
233
+ `INFORMA AL USUARIO al inicio de tu respuesta y sugiere actualizar con ` +
234
+ `\`npx @saulwade/swl-ses@latest update\` o \`/swl:actualizar\`.\n`
229
235
  );
230
236
  data.notificado = notificadoActual + 1;
231
237
  fs.writeFileSync(flagPath(), JSON.stringify(data), 'utf8');
@@ -251,14 +257,17 @@ process.stdin.on('end', async () => {
251
257
  registrarCheck(local, remota, hayNueva);
252
258
 
253
259
  if (hayNueva) {
260
+ // stdout (visible como contexto del turno / del arranque de sesión),
261
+ // no stderr (invisible con exit 0 — causa de que el aviso nunca se viera).
254
262
  const msg = [
255
263
  '',
256
- `[swl-ses] Nueva versión disponible: ${remota} (actual: ${local})`,
257
- ` Ejecuta: npx @saulwade/swl-ses@latest update`,
258
- ` O desde Claude Code: /swl:actualizar`,
264
+ `[swl-ses] Nueva versión disponible: ${remota} (instalada: ${local}).`,
265
+ `INFORMA AL USUARIO al inicio de tu respuesta y sugiere actualizar con:`,
266
+ ` npx @saulwade/swl-ses@latest update`,
267
+ ` o desde el runtime: /swl:actualizar`,
259
268
  '',
260
269
  ].join('\n');
261
- process.stderr.write(msg);
270
+ process.stdout.write(msg);
262
271
  } else if (process.env.SWL_FORCE_UPDATE_NOTIFICATION === '1') {
263
272
  // Modo debug: mostrar siempre el estado aunque local == remota.
264
273
  // Útil para el autor (cuya local nunca queda atrás) y para verificar
@@ -268,7 +277,7 @@ process.stdin.on('end', async () => {
268
277
  if (cmp === 0) estado = 'al día';
269
278
  else if (cmp > 0) estado = 'local adelantada (publicación pendiente)';
270
279
  else estado = 'comparación inconclusa';
271
- process.stderr.write(
280
+ process.stdout.write(
272
281
  `[swl-ses/check-update] FORCE: local=${local}, remota=${remota}, ${estado}\n`
273
282
  );
274
283
  }
@@ -1,68 +1,68 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
-
4
- /**
5
- * Hook: contexto-subagente.js
6
- * Tipo: SubagentStart (aplica a todos los subagentes Task/Agent)
7
- *
8
- * El contexto emitido por hooks de SessionStart es solo del hilo padre y
9
- * NUNCA llega a los subagentes: cada agente spawneado vía Task/Agent corre
10
- * sin las disciplinas activas de la sesión (patrón documentado en ponytail
11
- * issue #252 — mismo gap verificado en swl-ses el 2026-07-03: 0 usos de
12
- * SubagentStart hasta este hook).
13
- *
14
- * Re-inyecta a cada subagente un bloque compacto (~120 tokens) con las
15
- * disciplinas transversales no negociables: idioma es-MX, escalera de código
16
- * mínimo con guardas intocables, y la convención de marcador `simplificado:`.
17
- * Deliberadamente mínimo — el costo se paga en CADA spawn de subagente.
18
- *
19
- * Opt-out: SWL_CONTEXTO_SUBAGENTE=0 desactiva la inyección.
20
- * Formato de salida: SubagentStart requiere la forma JSON hookSpecificOutput
21
- * (stdout crudo se descarta en este evento — a diferencia de SessionStart).
22
- */
23
-
24
- /**
25
- * Construye el bloque de disciplinas que se inyecta al subagente.
26
- *
27
- * @returns {string} Contexto compacto en es-MX.
28
- */
29
- function construirContexto() {
30
- return [
31
- 'DISCIPLINAS SWL ACTIVAS (heredadas de la sesión padre):',
32
- '- Idioma: español de México en todo output (código, comentarios, commits, reportes).',
33
- '- Código mínimo — escalera antes de escribir: ¿necesita existir (YAGNI)? →',
34
- ' ¿ya existe en este codebase? → ¿stdlib? → ¿feature nativa de la plataforma? →',
35
- ' ¿dependencia ya instalada? → ¿una línea? → solo entonces, el mínimo que funciona.',
36
- '- Guardas intocables (nunca simplificar): validación en trust boundaries,',
37
- ' manejo de errores que previene pérdida de datos, seguridad, accesibilidad.',
38
- '- Simplificación deliberada se marca: `simplificado: <techo>, <trigger de upgrade>`.',
39
- '- Bug fix = causa raíz: grep de todos los callers antes de parchar uno.',
40
- 'Detalle completo: Skill("prevencion-sobreingenieria").',
41
- ].join('\n');
42
- }
43
-
44
- /**
45
- * Emite el contexto en el formato JSON que SubagentStart exige.
46
- * Nunca falla hacia afuera: un stdout roto no debe reportarse como hook error.
47
- */
48
- function main() {
49
- if (process.env.SWL_CONTEXTO_SUBAGENTE === '0') return;
50
- try {
51
- process.stdout.write(JSON.stringify({
52
- hookSpecificOutput: {
53
- hookEventName: 'SubagentStart',
54
- additionalContext: construirContexto(),
55
- },
56
- }));
57
- } catch (_) {
58
- // Silencioso — no interrumpir el spawn del subagente.
59
- }
60
- }
61
-
62
- // Entrypoint directo o wrapper `node -e "require(...)"` (require.main undefined).
63
- // No consume stdin: emite y termina — sin listeners, el proceso sale solo.
64
- if (!require.main || require.main === module) {
65
- main();
66
- }
67
-
68
- module.exports = { construirContexto };
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Hook: contexto-subagente.js
6
+ * Tipo: SubagentStart (aplica a todos los subagentes Task/Agent)
7
+ *
8
+ * El contexto emitido por hooks de SessionStart es solo del hilo padre y
9
+ * NUNCA llega a los subagentes: cada agente spawneado vía Task/Agent corre
10
+ * sin las disciplinas activas de la sesión (patrón documentado en ponytail
11
+ * issue #252 — mismo gap verificado en swl-ses el 2026-07-03: 0 usos de
12
+ * SubagentStart hasta este hook).
13
+ *
14
+ * Re-inyecta a cada subagente un bloque compacto (~120 tokens) con las
15
+ * disciplinas transversales no negociables: idioma es-MX, escalera de código
16
+ * mínimo con guardas intocables, y la convención de marcador `simplificado:`.
17
+ * Deliberadamente mínimo — el costo se paga en CADA spawn de subagente.
18
+ *
19
+ * Opt-out: SWL_CONTEXTO_SUBAGENTE=0 desactiva la inyección.
20
+ * Formato de salida: SubagentStart requiere la forma JSON hookSpecificOutput
21
+ * (stdout crudo se descarta en este evento — a diferencia de SessionStart).
22
+ */
23
+
24
+ /**
25
+ * Construye el bloque de disciplinas que se inyecta al subagente.
26
+ *
27
+ * @returns {string} Contexto compacto en es-MX.
28
+ */
29
+ function construirContexto() {
30
+ return [
31
+ 'DISCIPLINAS SWL ACTIVAS (heredadas de la sesión padre):',
32
+ '- Idioma: español de México en todo output (código, comentarios, commits, reportes).',
33
+ '- Código mínimo — escalera antes de escribir: ¿necesita existir (YAGNI)? →',
34
+ ' ¿ya existe en este codebase? → ¿stdlib? → ¿feature nativa de la plataforma? →',
35
+ ' ¿dependencia ya instalada? → ¿una línea? → solo entonces, el mínimo que funciona.',
36
+ '- Guardas intocables (nunca simplificar): validación en trust boundaries,',
37
+ ' manejo de errores que previene pérdida de datos, seguridad, accesibilidad.',
38
+ '- Simplificación deliberada se marca: `simplificado: <techo>, <trigger de upgrade>`.',
39
+ '- Bug fix = causa raíz: grep de todos los callers antes de parchar uno.',
40
+ 'Detalle completo: Skill("prevencion-sobreingenieria").',
41
+ ].join('\n');
42
+ }
43
+
44
+ /**
45
+ * Emite el contexto en el formato JSON que SubagentStart exige.
46
+ * Nunca falla hacia afuera: un stdout roto no debe reportarse como hook error.
47
+ */
48
+ function main() {
49
+ if (process.env.SWL_CONTEXTO_SUBAGENTE === '0') return;
50
+ try {
51
+ process.stdout.write(JSON.stringify({
52
+ hookSpecificOutput: {
53
+ hookEventName: 'SubagentStart',
54
+ additionalContext: construirContexto(),
55
+ },
56
+ }));
57
+ } catch (_) {
58
+ // Silencioso — no interrumpir el spawn del subagente.
59
+ }
60
+ }
61
+
62
+ // Entrypoint directo o wrapper `node -e "require(...)"` (require.main undefined).
63
+ // No consume stdin: emite y termina — sin listeners, el proceso sale solo.
64
+ if (!require.main || require.main === module) {
65
+ main();
66
+ }
67
+
68
+ module.exports = { construirContexto };
@@ -191,7 +191,7 @@ function aplicarDegradaciones(contradicciones) {
191
191
  try {
192
192
  const contenido = fs.readFileSync(RUTA_APRENDIZAJES, 'utf8');
193
193
  const lineas = contenido.split('\n');
194
- const fecha = new Date().toISOString().slice(0, 10);
194
+ const fecha = new Date().toLocaleDateString('sv');
195
195
 
196
196
  for (const { indice, motivo } of contradicciones) {
197
197
  if (indice >= lineas.length) continue;
@@ -275,7 +275,7 @@ function normalizarFechas(texto, ahora = new Date()) {
275
275
  const diasOffset = calc(args);
276
276
  const fecha = new Date(ahora);
277
277
  fecha.setDate(fecha.getDate() + diasOffset);
278
- return fecha.toISOString().slice(0, 10); // YYYY-MM-DD
278
+ return fecha.toLocaleDateString('sv'); // YYYY-MM-DD local (no UTC)
279
279
  });
280
280
  }
281
281
 
@@ -550,7 +550,7 @@ function escribirAprendizaje(aprendizaje, agente) {
550
550
  return;
551
551
  }
552
552
 
553
- const fecha = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
553
+ const fecha = new Date().toLocaleDateString('sv'); // YYYY-MM-DD local (no UTC)
554
554
  const contenidoBase = asegurarEncabezado(contenidoExistente);
555
555
 
556
556
  // Normalizar fechas relativas a absolutas (patrón autoDream)
@@ -161,7 +161,7 @@ function deudaTriggerCumplido(baseDir, hoy = new Date()) {
161
161
  out.push(
162
162
  item(
163
163
  'deuda-trigger',
164
- `${id}: trigger con fecha cumplida (${fecha.toISOString().slice(0, 10)})`,
164
+ `${id}: trigger con fecha cumplida (${fecha.toLocaleDateString('sv')})`,
165
165
  `Revisar .planning/DEUDA-TECNICA.md § ${id} y cerrar o re-planear`
166
166
  )
167
167
  );
@@ -185,7 +185,7 @@ function nudgesPendientes(baseDir /*, hoy */) {
185
185
  item(
186
186
  'nudges-pendientes',
187
187
  `${nudges.length} nudge(s) sin accionar (${detalle})`,
188
- 'Ejecutar /swl:evolucion-estado para revisarlos y accionar'
188
+ 'Ejecutar /swl:status evolucion para revisarlos y accionar'
189
189
  ),
190
190
  ];
191
191
  }
@@ -338,7 +338,7 @@ function indicePrioridad(categoria) {
338
338
  * null = silencio total (sin señales nuevas).
339
339
  */
340
340
  function armarDigest(items, estadoPrevio = {}, dia, opts = {}) {
341
- const hoyStr = dia || new Date().toISOString().slice(0, 10);
341
+ const hoyStr = dia || new Date().toLocaleDateString('sv');
342
342
  const mismoDia = estadoPrevio && estadoPrevio.dia === hoyStr;
343
343
  const yaMostrados = mismoDia && Array.isArray(estadoPrevio.hashesPrevios)
344
344
  ? new Set(estadoPrevio.hashesPrevios)
@@ -241,7 +241,7 @@ function escalarSiAplica(opts = {}) {
241
241
  }
242
242
 
243
243
  /**
244
- * Resumen de nudges para el comando /swl:evolucion-estado.
244
+ * Resumen de nudges para el comando /swl:status evolucion.
245
245
  *
246
246
  * @param {object} [opts]
247
247
  * @param {number} [opts.dias=14]
@@ -80,7 +80,7 @@ function asegurarDirectorio(cwd) {
80
80
  * @returns {string}
81
81
  */
82
82
  function rutaHoy(cwd) {
83
- const fecha = new Date().toISOString().slice(0, 10);
83
+ const fecha = new Date().toLocaleDateString('sv');
84
84
  return path.join(asegurarDirectorio(cwd), `${fecha}.jsonl`);
85
85
  }
86
86
 
@@ -126,7 +126,7 @@ class WebhookDedup {
126
126
  }
127
127
 
128
128
  if (archivar.length > 0) {
129
- const fechaArchivo = new Date(ahora).toISOString().slice(0, 10);
129
+ const fechaArchivo = new Date(ahora).toLocaleDateString('sv');
130
130
  const dirArchive = path.join(path.dirname(this.rutaLedger), 'webhook-events-archive');
131
131
  const archivoArchive = path.join(dirArchive, `events-${fechaArchivo}.jsonl`);
132
132
  fs.mkdirSync(dirArchive, { recursive: true });
@@ -59,7 +59,7 @@ process.stdin.on('end', () => {
59
59
  const hoy = new Date();
60
60
  const items = briefing.recolectarTodo(cwd, hoy);
61
61
  const estadoPrevio = briefing.leerEstadoBriefing(cwd);
62
- const dia = hoy.toISOString().slice(0, 10);
62
+ const dia = hoy.toLocaleDateString('sv');
63
63
 
64
64
  // Telemetría de aceptación (D-18, REQ-12-05): se actualiza SIEMPRE que el
65
65
  // hook corre, comparando lo visto antes con lo presente ahora — independiente
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, 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.
3
+ > Sistema de ingeniería de software auto-evolutivo multi-runtime polyglot (SDLC completo), distribuido como paquete npm y plugin de Claude Code. 61 agentes, 181 habilidades, 47 comandos, 37 reglas base y 49 hooks. Soporta 11 lenguajes y 7 runtimes (Claude Code, OpenClaude, OpenCode, Gemini, Cursor, Codex, Copilot). Versión 2.5.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
 
@@ -16,11 +16,11 @@ Archivo generado por `node scripts/generar-inventario.js` — no editar a mano.
16
16
 
17
17
  ## Componentes
18
18
 
19
- - 60 agentes especializados en `agentes/` (orquestación, implementación por stack, revisión, calidad, diseño)
20
- - 182 habilidades cargables bajo demanda en `habilidades/` (conocimiento operacional con divulgación progresiva)
21
- - 45 comandos `/swl:*` en `comandos/swl/` (ciclo GSD, calidad, release, diagnóstico)
22
- - 37 reglas base + 40 reglas por lenguaje en `reglas/` (políticas obligatorias por matcher)
23
- - 49 hooks en `hooks/` (telemetría, validación, seguridad; zero-deps, escrituras atómicas)
19
+ - [61 agentes especializados](AGENTS.md): orquestación, implementación por stack, revisión, calidad, diseño — fuente en `agentes/`
20
+ - [181 habilidades cargables bajo demanda](INVENTARIO.md): conocimiento operacional con divulgación progresiva — fuente en `habilidades/`
21
+ - [47 comandos /swl:*](COMANDOS.md): ciclo GSD, calidad, release, diagnóstico — fuente en `comandos/swl/`
22
+ - [37 reglas base + 40 por lenguaje](INVENTARIO.md): políticas obligatorias por matcher — fuente en `reglas/`
23
+ - [49 hooks](INVENTARIO.md): telemetría, validación, seguridad; zero-deps, escrituras atómicas — fuente en `hooks/`
24
24
 
25
25
  ## Opcional
26
26