@saulwade/swl-ses 2.6.1 → 2.8.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 (268) hide show
  1. package/CLAUDE.md +14 -2
  2. package/README.md +65 -18
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/bin/swl-ses.js +10 -0
  6. package/comandos/swl/brainstorm.md +1 -0
  7. package/comandos/swl/briefing.md +119 -119
  8. package/comandos/swl/contribuir.md +233 -233
  9. package/comandos/swl/deuda-codigo.md +97 -97
  10. package/comandos/swl/mcp-status.md +1 -0
  11. package/gateway/lib/event-channel.js +191 -191
  12. package/habilidades/agent-deep-links/SKILL.md +148 -148
  13. package/habilidades/backend-async-postgres-testing/SKILL.md +216 -216
  14. package/habilidades/backend-error-design/SKILL.md +221 -221
  15. package/habilidades/backend-production-resilience/SKILL.md +288 -288
  16. package/habilidades/calidad-anti-patrones-universales/SKILL.md +105 -1
  17. package/habilidades/calidad-contract-testing/SKILL.md +165 -165
  18. package/habilidades/calidad-mutation-testing/SKILL.md +25 -1
  19. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
  20. package/habilidades/ci-cd-pipelines/SKILL.md +5 -1
  21. package/habilidades/css-moderno/SKILL.md +7 -1
  22. package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
  23. package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
  24. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
  25. package/habilidades/extractor-de-aprendizajes/SKILL.md +5 -1
  26. package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
  27. package/habilidades/harness-claude-code/SKILL.md +3 -2
  28. package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
  29. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
  30. package/habilidades/perfil-usuario/SKILL.md +200 -200
  31. package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
  32. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
  33. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
  34. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
  35. package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
  36. package/habilidades/proceso-dynamic-workflows/SKILL.md +60 -0
  37. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
  38. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
  39. package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
  40. package/habilidades/proceso-modular-split/SKILL.md +256 -256
  41. package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
  42. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
  43. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
  44. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
  45. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
  46. package/hooks/calidad-pre-commit.js +159 -10
  47. package/hooks/ciclo-evolucion-subagente.js +26 -26
  48. package/hooks/ciclo-evolucion.js +26 -26
  49. package/hooks/contexto-subagente.js +68 -68
  50. package/hooks/lib/auto-consolidator.js +335 -335
  51. package/hooks/lib/ciclo-evolucion.js +47 -47
  52. package/hooks/lib/deep-links.js +185 -185
  53. package/hooks/lib/error-classifier.js +308 -308
  54. package/hooks/lib/notificacion-formato.js +45 -11
  55. package/hooks/lib/provenance-tracker.js +191 -191
  56. package/hooks/lib/raiz-proyecto.js +35 -4
  57. package/hooks/lib/resource-quota.js +122 -122
  58. package/hooks/lib/retry-jitter.js +165 -165
  59. package/hooks/lib/security-net.js +201 -201
  60. package/hooks/lib/skill-auditor.js +588 -588
  61. package/hooks/lib/sync-status.js +228 -228
  62. package/hooks/lib/taint-tracker.js +107 -107
  63. package/hooks/lib/text-similarity.js +241 -241
  64. package/hooks/lib/toon-compressor.js +245 -245
  65. package/hooks/notificacion-telegram.js +5 -11
  66. package/hooks/session-briefing.js +12 -4
  67. package/instintos/autonomia.yaml +27 -27
  68. package/instintos/prompt-appendices.yaml +57 -57
  69. package/llms.txt +1 -1
  70. package/manifiestos/agent-output-schemas.json +57 -57
  71. package/manifiestos/canonical-hashes.json +662 -0
  72. package/manifiestos/harness-ir.json +47536 -0
  73. package/manifiestos/hooks-config.json +469 -469
  74. package/manifiestos/invariantes-criticos.json +30 -30
  75. package/manifiestos/policy-bundle.json +2065 -0
  76. package/manifiestos/policy-corpus-w2.json +3926 -0
  77. package/manifiestos/runtime-adapters-core3.json +208 -0
  78. package/manifiestos/runtime-conformance.json +139 -0
  79. package/manifiestos/skills-lock.json +43 -43
  80. package/package.json +2 -2
  81. package/plantillas/auditor-veto-template.md +105 -105
  82. package/plantillas/github-workflows/release-please.yml +44 -44
  83. package/plantillas/github-workflows/swl-ci.yml +107 -107
  84. package/plantillas/github-workflows/swl-security.yml +51 -51
  85. package/plugin.json +2 -2
  86. package/reglas/accesibilidad.md +10 -10
  87. package/reglas/auditorias-documentales-estructurales.md +7 -7
  88. package/reglas/cloud-infra.md +8 -8
  89. package/reglas/consultar-vault-primero.md +195 -195
  90. package/reglas/git-workflow.md +1 -0
  91. package/reglas/hooks.md +6 -6
  92. package/reglas/intent-engineering.md +218 -218
  93. package/reglas/markitdown.md +8 -8
  94. package/reglas/monitor-ci.md +12 -0
  95. package/reglas/patrones.md +6 -6
  96. package/reglas/testing.md +7 -7
  97. package/reglas/tests-cleanup.md +224 -224
  98. package/schemas/agent-message.schema.json +73 -73
  99. package/schemas/agent-output-implementacion.schema.json +114 -114
  100. package/schemas/agent-output-planificacion.schema.json +150 -150
  101. package/schemas/agent-output-review.schema.json +98 -98
  102. package/schemas/diary-entry.schema.json +112 -112
  103. package/schemas/gate-state.schema.json +76 -0
  104. package/schemas/harness-ir.schema.json +369 -0
  105. package/schemas/hook-profiles.schema.json +54 -54
  106. package/schemas/hooks-config.schema.json +89 -89
  107. package/schemas/legacy-gates.schema.json +45 -0
  108. package/schemas/modulos.schema.json +38 -38
  109. package/schemas/perfiles.schema.json +36 -36
  110. package/schemas/plugin.schema.json +77 -77
  111. package/schemas/policy-bundle.schema.json +140 -0
  112. package/schemas/policy-enforcement.schema.json +117 -0
  113. package/schemas/policy-operation.schema.json +261 -0
  114. package/schemas/runtime-adapter.schema.json +176 -0
  115. package/schemas/runtime-build-attestation.schema.json +100 -0
  116. package/schemas/runtime-conformance.schema.json +239 -0
  117. package/schemas/runtime-diagnostic.schema.json +395 -0
  118. package/schemas/skill-evals.schema.json +119 -119
  119. package/schemas/skill-frontmatter.schema.json +245 -245
  120. package/schemas/w4-certification-request.schema.json +72 -0
  121. package/schemas/w4-certification-verdict.schema.json +224 -0
  122. package/schemas/w4-corpus.schema.json +172 -0
  123. package/schemas/w4-mutation-report.schema.json +116 -0
  124. package/schemas/w4-replay-result.schema.json +164 -0
  125. package/schemas/w4-scoring-report.schema.json +89 -0
  126. package/scripts/audit-tools/audit-history.js +330 -330
  127. package/scripts/audit-tools/bundle-tracker.js +290 -290
  128. package/scripts/audit-tools/canary-monitor.js +352 -352
  129. package/scripts/audit-tools/code-profiler.js +605 -605
  130. package/scripts/audit-tools/dep-doctor.js +320 -320
  131. package/scripts/audit-tools/env-validator.js +206 -206
  132. package/scripts/audit-tools/lib/fs-walk.js +48 -48
  133. package/scripts/audit-tools/lib/output.js +23 -23
  134. package/scripts/audit-tools/migration-checker.js +392 -392
  135. package/scripts/audit-tools/pentest-scanner.js +1436 -1436
  136. package/scripts/bootstrap-instintos.js +3 -0
  137. package/scripts/cli/aprobar-plan.js +73 -73
  138. package/scripts/cli/briefing.js +23 -23
  139. package/scripts/cli/ciclo-evolucion.js +26 -26
  140. package/scripts/cli/derivar-feature-list.js +25 -25
  141. package/scripts/cli/detectar-host.js +27 -27
  142. package/scripts/cli/diary-entry.js +69 -69
  143. package/scripts/cli/execution-state.js +18 -18
  144. package/scripts/cli/gateway-notify.js +41 -41
  145. package/scripts/cli/liberar-fase.js +42 -42
  146. package/scripts/cli/mark-evolved.js +56 -56
  147. package/scripts/cli/metricas-dora.js +26 -26
  148. package/scripts/cli/near-duplicate.js +55 -55
  149. package/scripts/cli/notificaciones.js +123 -123
  150. package/scripts/cli/propose-step.js +29 -29
  151. package/scripts/cli/schedule-parse.js +19 -19
  152. package/scripts/cli/sugerir-modelo.js +20 -20
  153. package/scripts/cli/verificar-plan.js +36 -36
  154. package/scripts/cli/verificar-trazabilidad.js +35 -35
  155. package/scripts/comandos/install-asistido.js +8 -7
  156. package/scripts/configurar-branch-protection.js +418 -418
  157. package/scripts/detectar-aprendizajes-duplicados.js +151 -151
  158. package/scripts/doctor.js +61 -36
  159. package/scripts/generar-checklists-consolidados.js +273 -273
  160. package/scripts/generar-claims-runtime.js +1342 -0
  161. package/scripts/generar-harness-ir.js +257 -0
  162. package/scripts/generar-inventario.js +52 -54
  163. package/scripts/generar-policy-bundle.js +202 -0
  164. package/scripts/instalador.js +26 -7
  165. package/scripts/lib/approval-receipts.js +190 -0
  166. package/scripts/lib/artefactos-python.js +43 -43
  167. package/scripts/lib/benchmark-metrics.js +160 -160
  168. package/scripts/lib/budget-enforcer.js +252 -252
  169. package/scripts/lib/certificacion-loop-state.js +421 -0
  170. package/scripts/lib/ci-reader.js +193 -193
  171. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +56 -0
  172. package/scripts/lib/clasificar-directorio.js +92 -0
  173. package/scripts/lib/contadores-inventario.js +217 -217
  174. package/scripts/lib/detectar-host-swl.js +175 -175
  175. package/scripts/lib/detectar-runtime.js +29 -20
  176. package/scripts/lib/detectar-stack-detallado.js +307 -307
  177. package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
  178. package/scripts/lib/detector-reglas-duplicadas.js +220 -220
  179. package/scripts/lib/eval-metrics-store.js +218 -218
  180. package/scripts/lib/eval-quality.js +171 -171
  181. package/scripts/lib/eval-schemas.js +144 -144
  182. package/scripts/lib/eval-self-correct.js +106 -106
  183. package/scripts/lib/eval-validator.js +185 -185
  184. package/scripts/lib/evidence-verifier.js +192 -0
  185. package/scripts/lib/evidencia-release.js +322 -322
  186. package/scripts/lib/frontmatter-canonico.js +509 -0
  187. package/scripts/lib/gate-engine.js +871 -0
  188. package/scripts/lib/gate-hooks-requires.js +249 -249
  189. package/scripts/lib/gate-licencias.js +212 -212
  190. package/scripts/lib/git-config-preflight.js +48 -0
  191. package/scripts/lib/git-metricas.js +257 -257
  192. package/scripts/lib/harness-ir.js +778 -0
  193. package/scripts/lib/harness-source-snapshot.js +309 -0
  194. package/scripts/lib/integrity-ledger.js +1147 -0
  195. package/scripts/lib/jaccard-similarity.js +98 -98
  196. package/scripts/lib/legacy-gate-migration.js +324 -0
  197. package/scripts/lib/limpiar-basura-global.js +45 -2
  198. package/scripts/lib/longmemeval-runner.js +125 -125
  199. package/scripts/lib/metricas-dora.js +204 -204
  200. package/scripts/lib/notificaciones-telegram.js +1 -0
  201. package/scripts/lib/npm-version.js +1 -0
  202. package/scripts/lib/paquetes-conocidos.js +50 -50
  203. package/scripts/lib/plan-lock.js +61 -13
  204. package/scripts/lib/policy-broker.js +338 -0
  205. package/scripts/lib/policy-bundle.js +342 -0
  206. package/scripts/lib/policy-context-provider.js +310 -0
  207. package/scripts/lib/policy-contract.js +479 -0
  208. package/scripts/lib/policy-verifier-utils.js +65 -0
  209. package/scripts/lib/pr-analyzer.js +399 -399
  210. package/scripts/lib/principal-verifier.js +178 -0
  211. package/scripts/lib/prompt-builder.js +264 -264
  212. package/scripts/lib/resolver-plan-fase.js +37 -37
  213. package/scripts/lib/rrf-fusion.js +175 -175
  214. package/scripts/lib/runtime-adapter-contract.js +267 -0
  215. package/scripts/lib/runtime-artifact-verifier.js +426 -0
  216. package/scripts/lib/runtime-build-attestation.js +127 -0
  217. package/scripts/lib/runtime-bundle-installer.js +586 -0
  218. package/scripts/lib/runtime-compiler.js +327 -0
  219. package/scripts/lib/runtime-conformance.js +202 -0
  220. package/scripts/lib/runtime-doctor-core3.js +567 -0
  221. package/scripts/lib/runtime-doctor-input.js +59 -0
  222. package/scripts/lib/runtime-operation-adapter.js +267 -0
  223. package/scripts/lib/schema-version.js +164 -164
  224. package/scripts/lib/semantic-search.js +252 -252
  225. package/scripts/lib/signed-envelope.js +545 -0
  226. package/scripts/lib/single-use-store.js +359 -0
  227. package/scripts/lib/skills-externas.js +31 -0
  228. package/scripts/lib/transformadores/codex.js +15 -8
  229. package/scripts/lib/transformadores/gemini.js +79 -5
  230. package/scripts/lib/w4-attestation-adapter.js +158 -0
  231. package/scripts/lib/w4-canario.js +337 -0
  232. package/scripts/lib/w4-claims.js +182 -0
  233. package/scripts/lib/w4-corpus-generador.js +542 -0
  234. package/scripts/lib/w4-gate-c5.js +115 -0
  235. package/scripts/lib/w4-harness-bajo-prueba.js +155 -0
  236. package/scripts/lib/w4-matriz-combos.js +55 -0
  237. package/scripts/lib/w4-motor-mutacion.js +1348 -0
  238. package/scripts/lib/w4-motor-replay.js +735 -0
  239. package/scripts/lib/w4-pin-origen.js +54 -0
  240. package/scripts/lib/w4-publicar-request.js +132 -0
  241. package/scripts/lib/w4-revocacion.js +62 -0
  242. package/scripts/lib/w4-runtimes-core3.js +38 -0
  243. package/scripts/lib/w4-scorer-certificacion.js +692 -0
  244. package/scripts/lib/w4-superficie-candidato.js +49 -0
  245. package/scripts/lib/w4-veredicto.js +452 -0
  246. package/scripts/lib/w4-verificar-veredicto.js +302 -0
  247. package/scripts/limpiar-artefactos-python.js +131 -131
  248. package/scripts/migrar-csv-a-array.js +168 -168
  249. package/scripts/migrar-fase-dominio.js +200 -200
  250. package/scripts/migrar-gates-legacy.js +108 -0
  251. package/scripts/publicar-certification-request.js +115 -0
  252. package/scripts/runtime-doctor.js +107 -0
  253. package/scripts/tui/componentes/selector-multi.js +189 -189
  254. package/scripts/tui/componentes/selector-unico.js +158 -158
  255. package/scripts/tui/ejecutores.js +375 -375
  256. package/scripts/tui/lib/colores.js +129 -129
  257. package/scripts/tui/lib/render.js +264 -264
  258. package/scripts/tui/lib/teclas.js +113 -113
  259. package/scripts/tui/pantallas/install-wizard.js +12 -7
  260. package/scripts/tui/pantallas/menu-principal.js +52 -52
  261. package/scripts/tui/pantallas/progreso.js +274 -274
  262. package/scripts/tui/pantallas/resumen.js +132 -132
  263. package/scripts/validar-userland-vacio.js +110 -110
  264. package/scripts/verificar-aislamiento-swl-eval.js +87 -0
  265. package/scripts/verificar-empaquetado-downstream.js +375 -0
  266. package/scripts/verificar-loop-constructor.js +215 -0
  267. package/scripts/verificar-trazabilidad.js +13 -6
  268. package/scripts/verificar-veredicto-real.js +84 -0
@@ -1,245 +1,245 @@
1
- 'use strict';
2
-
3
- /**
4
- * TOON Compressor — Compresión de schemas y documentos estructurados.
5
- *
6
- * Patrón adoptado de CC Workflow Studio (generate-toon-schema.ts).
7
- * Reduce el tamaño de JSON schemas y documentos estructurados ~20-25%
8
- * eliminando redundancia sin perder información semántica.
9
- *
10
- * Técnicas aplicadas:
11
- * 1. Eliminar whitespace y formateo innecesario
12
- * 2. Abreviar claves repetitivas con diccionario
13
- * 3. Colapsar descripciones a una línea
14
- * 4. Eliminar campos opcionales con valor default
15
- * 5. Usar notación compacta para tipos simples
16
- *
17
- * Zero dependencias externas.
18
- *
19
- * Uso:
20
- * const { comprimirSchema, descomprimirSchema, comprimirTexto } = require('./lib/toon-compressor');
21
- * const compacto = comprimirSchema(schemaJSON);
22
- * console.log(`Reducción: ${compacto.reduccionPorcentaje}%`);
23
- *
24
- * @module hooks/lib/toon-compressor
25
- */
26
-
27
- // ---------------------------------------------------------------------------
28
- // Diccionario de abreviaciones para claves JSON Schema
29
- // ---------------------------------------------------------------------------
30
-
31
- /**
32
- * Mapeo de claves largas a abreviaciones cortas.
33
- * Solo para claves que aparecen ≥3 veces en un schema típico.
34
- */
35
- const ABREVIACIONES = {
36
- description: 'desc',
37
- properties: 'props',
38
- required: 'req',
39
- additionalProperties: 'addl',
40
- type: 't',
41
- items: 'it',
42
- default: 'def',
43
- enum: 'en',
44
- maxLength: 'maxL',
45
- minLength: 'minL',
46
- minimum: 'min',
47
- maximum: 'max',
48
- pattern: 'pat',
49
- oneOf: '1of',
50
- anyOf: 'aof',
51
- allOf: 'allof',
52
- };
53
-
54
- /** Mapeo inverso para descompresión. */
55
- const ABREVIACIONES_INV = Object.fromEntries(
56
- Object.entries(ABREVIACIONES).map(([k, v]) => [v, k])
57
- );
58
-
59
- // ---------------------------------------------------------------------------
60
- // Funciones core
61
- // ---------------------------------------------------------------------------
62
-
63
- /**
64
- * Comprime un objeto JSON Schema reemplazando claves por abreviaciones.
65
- *
66
- * @param {object} obj - Objeto a comprimir (se clona internamente)
67
- * @returns {object} Objeto con claves abreviadas
68
- */
69
- function _abreviarClaves(obj) {
70
- if (Array.isArray(obj)) {
71
- return obj.map(_abreviarClaves);
72
- }
73
- if (obj !== null && typeof obj === 'object') {
74
- const resultado = {};
75
- for (const [clave, valor] of Object.entries(obj)) {
76
- const claveCorta = ABREVIACIONES[clave] || clave;
77
- resultado[claveCorta] = _abreviarClaves(valor);
78
- }
79
- return resultado;
80
- }
81
- return obj;
82
- }
83
-
84
- /**
85
- * Descomprime un objeto con claves abreviadas a sus nombres originales.
86
- *
87
- * @param {object} obj - Objeto con claves abreviadas
88
- * @returns {object} Objeto con claves originales
89
- */
90
- function _expandirClaves(obj) {
91
- if (Array.isArray(obj)) {
92
- return obj.map(_expandirClaves);
93
- }
94
- if (obj !== null && typeof obj === 'object') {
95
- const resultado = {};
96
- for (const [clave, valor] of Object.entries(obj)) {
97
- const claveLarga = ABREVIACIONES_INV[clave] || clave;
98
- resultado[claveLarga] = _expandirClaves(valor);
99
- }
100
- return resultado;
101
- }
102
- return obj;
103
- }
104
-
105
- /**
106
- * Elimina campos opcionales con valor default conocido.
107
- *
108
- * @param {object} obj - Schema JSON
109
- * @returns {object} Schema sin defaults redundantes
110
- */
111
- function _eliminarDefaults(obj) {
112
- if (Array.isArray(obj)) {
113
- return obj.map(_eliminarDefaults);
114
- }
115
- if (obj !== null && typeof obj === 'object') {
116
- const resultado = {};
117
- for (const [clave, valor] of Object.entries(obj)) {
118
- // Eliminar additionalProperties: true (es el default)
119
- if (clave === 'additionalProperties' && valor === true) continue;
120
- // Eliminar required: [] (vacío = sin requeridos)
121
- if (clave === 'required' && Array.isArray(valor) && valor.length === 0) continue;
122
- // Eliminar description vacía
123
- if (clave === 'description' && valor === '') continue;
124
- resultado[clave] = _eliminarDefaults(valor);
125
- }
126
- return resultado;
127
- }
128
- return obj;
129
- }
130
-
131
- /**
132
- * Colapsa descripciones multi-línea a una sola línea.
133
- *
134
- * @param {object} obj
135
- * @returns {object}
136
- */
137
- function _colapsarDescripciones(obj) {
138
- if (Array.isArray(obj)) {
139
- return obj.map(_colapsarDescripciones);
140
- }
141
- if (obj !== null && typeof obj === 'object') {
142
- const resultado = {};
143
- for (const [clave, valor] of Object.entries(obj)) {
144
- if (clave === 'description' && typeof valor === 'string') {
145
- resultado[clave] = valor.replace(/\s+/g, ' ').trim();
146
- } else {
147
- resultado[clave] = _colapsarDescripciones(valor);
148
- }
149
- }
150
- return resultado;
151
- }
152
- return obj;
153
- }
154
-
155
- // ---------------------------------------------------------------------------
156
- // API pública
157
- // ---------------------------------------------------------------------------
158
-
159
- /**
160
- * Comprime un JSON Schema aplicando todas las técnicas de reducción.
161
- *
162
- * @param {object|string} schema - JSON Schema (objeto o string JSON)
163
- * @returns {{ comprimido: string, original: number, reducido: number, reduccionPorcentaje: number }}
164
- */
165
- function comprimirSchema(schema) {
166
- const obj = typeof schema === 'string' ? JSON.parse(schema) : schema;
167
- const original = JSON.stringify(obj);
168
-
169
- let procesado = _eliminarDefaults(obj);
170
- procesado = _colapsarDescripciones(procesado);
171
- procesado = _abreviarClaves(procesado);
172
-
173
- const comprimido = JSON.stringify(procesado);
174
-
175
- const tamOriginal = original.length;
176
- const tamReducido = comprimido.length;
177
- const reduccion = ((tamOriginal - tamReducido) / tamOriginal) * 100;
178
-
179
- return {
180
- comprimido,
181
- original: tamOriginal,
182
- reducido: tamReducido,
183
- reduccionPorcentaje: Math.round(reduccion * 10) / 10,
184
- };
185
- }
186
-
187
- /**
188
- * Descomprime un JSON Schema con claves abreviadas.
189
- *
190
- * @param {string|object} comprimido - Schema comprimido
191
- * @returns {object} Schema original con claves expandidas
192
- */
193
- function descomprimirSchema(comprimido) {
194
- const obj = typeof comprimido === 'string' ? JSON.parse(comprimido) : comprimido;
195
- return _expandirClaves(obj);
196
- }
197
-
198
- /**
199
- * Comprime texto Markdown eliminando redundancia para reducir tokens.
200
- *
201
- * Técnicas:
202
- * - Colapsar múltiples líneas vacías a una
203
- * - Eliminar trailing whitespace
204
- * - Comprimir tablas (eliminar padding)
205
- * - Eliminar comentarios HTML
206
- *
207
- * @param {string} texto - Texto Markdown
208
- * @returns {{ comprimido: string, original: number, reducido: number, reduccionPorcentaje: number }}
209
- */
210
- function comprimirTexto(texto) {
211
- const original = texto.length;
212
-
213
- let resultado = texto;
214
- // Colapsar 3+ líneas vacías a 2
215
- resultado = resultado.replace(/\n{3,}/g, '\n\n');
216
- // Eliminar trailing whitespace
217
- resultado = resultado.replace(/[ \t]+$/gm, '');
218
- // Eliminar comentarios HTML
219
- resultado = resultado.replace(/<!--[\s\S]*?-->/g, '');
220
- // Comprimir padding en tablas (múltiples espacios → uno)
221
- resultado = resultado.replace(/\|[ \t]{2,}/g, '| ');
222
- resultado = resultado.replace(/[ \t]{2,}\|/g, ' |');
223
-
224
- const reducido = resultado.length;
225
- const reduccion = ((original - reducido) / original) * 100;
226
-
227
- return {
228
- comprimido: resultado,
229
- original,
230
- reducido,
231
- reduccionPorcentaje: Math.round(reduccion * 10) / 10,
232
- };
233
- }
234
-
235
- // ---------------------------------------------------------------------------
236
- // Exports
237
- // ---------------------------------------------------------------------------
238
-
239
- module.exports = {
240
- comprimirSchema,
241
- descomprimirSchema,
242
- comprimirTexto,
243
- // Exponer diccionario para tests
244
- ABREVIACIONES,
245
- };
1
+ 'use strict';
2
+
3
+ /**
4
+ * TOON Compressor — Compresión de schemas y documentos estructurados.
5
+ *
6
+ * Patrón adoptado de CC Workflow Studio (generate-toon-schema.ts).
7
+ * Reduce el tamaño de JSON schemas y documentos estructurados ~20-25%
8
+ * eliminando redundancia sin perder información semántica.
9
+ *
10
+ * Técnicas aplicadas:
11
+ * 1. Eliminar whitespace y formateo innecesario
12
+ * 2. Abreviar claves repetitivas con diccionario
13
+ * 3. Colapsar descripciones a una línea
14
+ * 4. Eliminar campos opcionales con valor default
15
+ * 5. Usar notación compacta para tipos simples
16
+ *
17
+ * Zero dependencias externas.
18
+ *
19
+ * Uso:
20
+ * const { comprimirSchema, descomprimirSchema, comprimirTexto } = require('./lib/toon-compressor');
21
+ * const compacto = comprimirSchema(schemaJSON);
22
+ * console.log(`Reducción: ${compacto.reduccionPorcentaje}%`);
23
+ *
24
+ * @module hooks/lib/toon-compressor
25
+ */
26
+
27
+ // ---------------------------------------------------------------------------
28
+ // Diccionario de abreviaciones para claves JSON Schema
29
+ // ---------------------------------------------------------------------------
30
+
31
+ /**
32
+ * Mapeo de claves largas a abreviaciones cortas.
33
+ * Solo para claves que aparecen ≥3 veces en un schema típico.
34
+ */
35
+ const ABREVIACIONES = {
36
+ description: 'desc',
37
+ properties: 'props',
38
+ required: 'req',
39
+ additionalProperties: 'addl',
40
+ type: 't',
41
+ items: 'it',
42
+ default: 'def',
43
+ enum: 'en',
44
+ maxLength: 'maxL',
45
+ minLength: 'minL',
46
+ minimum: 'min',
47
+ maximum: 'max',
48
+ pattern: 'pat',
49
+ oneOf: '1of',
50
+ anyOf: 'aof',
51
+ allOf: 'allof',
52
+ };
53
+
54
+ /** Mapeo inverso para descompresión. */
55
+ const ABREVIACIONES_INV = Object.fromEntries(
56
+ Object.entries(ABREVIACIONES).map(([k, v]) => [v, k])
57
+ );
58
+
59
+ // ---------------------------------------------------------------------------
60
+ // Funciones core
61
+ // ---------------------------------------------------------------------------
62
+
63
+ /**
64
+ * Comprime un objeto JSON Schema reemplazando claves por abreviaciones.
65
+ *
66
+ * @param {object} obj - Objeto a comprimir (se clona internamente)
67
+ * @returns {object} Objeto con claves abreviadas
68
+ */
69
+ function _abreviarClaves(obj) {
70
+ if (Array.isArray(obj)) {
71
+ return obj.map(_abreviarClaves);
72
+ }
73
+ if (obj !== null && typeof obj === 'object') {
74
+ const resultado = {};
75
+ for (const [clave, valor] of Object.entries(obj)) {
76
+ const claveCorta = ABREVIACIONES[clave] || clave;
77
+ resultado[claveCorta] = _abreviarClaves(valor);
78
+ }
79
+ return resultado;
80
+ }
81
+ return obj;
82
+ }
83
+
84
+ /**
85
+ * Descomprime un objeto con claves abreviadas a sus nombres originales.
86
+ *
87
+ * @param {object} obj - Objeto con claves abreviadas
88
+ * @returns {object} Objeto con claves originales
89
+ */
90
+ function _expandirClaves(obj) {
91
+ if (Array.isArray(obj)) {
92
+ return obj.map(_expandirClaves);
93
+ }
94
+ if (obj !== null && typeof obj === 'object') {
95
+ const resultado = {};
96
+ for (const [clave, valor] of Object.entries(obj)) {
97
+ const claveLarga = ABREVIACIONES_INV[clave] || clave;
98
+ resultado[claveLarga] = _expandirClaves(valor);
99
+ }
100
+ return resultado;
101
+ }
102
+ return obj;
103
+ }
104
+
105
+ /**
106
+ * Elimina campos opcionales con valor default conocido.
107
+ *
108
+ * @param {object} obj - Schema JSON
109
+ * @returns {object} Schema sin defaults redundantes
110
+ */
111
+ function _eliminarDefaults(obj) {
112
+ if (Array.isArray(obj)) {
113
+ return obj.map(_eliminarDefaults);
114
+ }
115
+ if (obj !== null && typeof obj === 'object') {
116
+ const resultado = {};
117
+ for (const [clave, valor] of Object.entries(obj)) {
118
+ // Eliminar additionalProperties: true (es el default)
119
+ if (clave === 'additionalProperties' && valor === true) continue;
120
+ // Eliminar required: [] (vacío = sin requeridos)
121
+ if (clave === 'required' && Array.isArray(valor) && valor.length === 0) continue;
122
+ // Eliminar description vacía
123
+ if (clave === 'description' && valor === '') continue;
124
+ resultado[clave] = _eliminarDefaults(valor);
125
+ }
126
+ return resultado;
127
+ }
128
+ return obj;
129
+ }
130
+
131
+ /**
132
+ * Colapsa descripciones multi-línea a una sola línea.
133
+ *
134
+ * @param {object} obj
135
+ * @returns {object}
136
+ */
137
+ function _colapsarDescripciones(obj) {
138
+ if (Array.isArray(obj)) {
139
+ return obj.map(_colapsarDescripciones);
140
+ }
141
+ if (obj !== null && typeof obj === 'object') {
142
+ const resultado = {};
143
+ for (const [clave, valor] of Object.entries(obj)) {
144
+ if (clave === 'description' && typeof valor === 'string') {
145
+ resultado[clave] = valor.replace(/\s+/g, ' ').trim();
146
+ } else {
147
+ resultado[clave] = _colapsarDescripciones(valor);
148
+ }
149
+ }
150
+ return resultado;
151
+ }
152
+ return obj;
153
+ }
154
+
155
+ // ---------------------------------------------------------------------------
156
+ // API pública
157
+ // ---------------------------------------------------------------------------
158
+
159
+ /**
160
+ * Comprime un JSON Schema aplicando todas las técnicas de reducción.
161
+ *
162
+ * @param {object|string} schema - JSON Schema (objeto o string JSON)
163
+ * @returns {{ comprimido: string, original: number, reducido: number, reduccionPorcentaje: number }}
164
+ */
165
+ function comprimirSchema(schema) {
166
+ const obj = typeof schema === 'string' ? JSON.parse(schema) : schema;
167
+ const original = JSON.stringify(obj);
168
+
169
+ let procesado = _eliminarDefaults(obj);
170
+ procesado = _colapsarDescripciones(procesado);
171
+ procesado = _abreviarClaves(procesado);
172
+
173
+ const comprimido = JSON.stringify(procesado);
174
+
175
+ const tamOriginal = original.length;
176
+ const tamReducido = comprimido.length;
177
+ const reduccion = ((tamOriginal - tamReducido) / tamOriginal) * 100;
178
+
179
+ return {
180
+ comprimido,
181
+ original: tamOriginal,
182
+ reducido: tamReducido,
183
+ reduccionPorcentaje: Math.round(reduccion * 10) / 10,
184
+ };
185
+ }
186
+
187
+ /**
188
+ * Descomprime un JSON Schema con claves abreviadas.
189
+ *
190
+ * @param {string|object} comprimido - Schema comprimido
191
+ * @returns {object} Schema original con claves expandidas
192
+ */
193
+ function descomprimirSchema(comprimido) {
194
+ const obj = typeof comprimido === 'string' ? JSON.parse(comprimido) : comprimido;
195
+ return _expandirClaves(obj);
196
+ }
197
+
198
+ /**
199
+ * Comprime texto Markdown eliminando redundancia para reducir tokens.
200
+ *
201
+ * Técnicas:
202
+ * - Colapsar múltiples líneas vacías a una
203
+ * - Eliminar trailing whitespace
204
+ * - Comprimir tablas (eliminar padding)
205
+ * - Eliminar comentarios HTML
206
+ *
207
+ * @param {string} texto - Texto Markdown
208
+ * @returns {{ comprimido: string, original: number, reducido: number, reduccionPorcentaje: number }}
209
+ */
210
+ function comprimirTexto(texto) {
211
+ const original = texto.length;
212
+
213
+ let resultado = texto;
214
+ // Colapsar 3+ líneas vacías a 2
215
+ resultado = resultado.replace(/\n{3,}/g, '\n\n');
216
+ // Eliminar trailing whitespace
217
+ resultado = resultado.replace(/[ \t]+$/gm, '');
218
+ // Eliminar comentarios HTML
219
+ resultado = resultado.replace(/<!--[\s\S]*?-->/g, '');
220
+ // Comprimir padding en tablas (múltiples espacios → uno)
221
+ resultado = resultado.replace(/\|[ \t]{2,}/g, '| ');
222
+ resultado = resultado.replace(/[ \t]{2,}\|/g, ' |');
223
+
224
+ const reducido = resultado.length;
225
+ const reduccion = ((original - reducido) / original) * 100;
226
+
227
+ return {
228
+ comprimido: resultado,
229
+ original,
230
+ reducido,
231
+ reduccionPorcentaje: Math.round(reduccion * 10) / 10,
232
+ };
233
+ }
234
+
235
+ // ---------------------------------------------------------------------------
236
+ // Exports
237
+ // ---------------------------------------------------------------------------
238
+
239
+ module.exports = {
240
+ comprimirSchema,
241
+ descomprimirSchema,
242
+ comprimirTexto,
243
+ // Exponer diccionario para tests
244
+ ABREVIACIONES,
245
+ };
@@ -23,7 +23,7 @@ const path = require('node:path');
23
23
 
24
24
  const { cargarConfig, estaMuted } = require('./lib/telegram-config');
25
25
  const { enviarMensaje, escaparHtml } = require('./lib/telegram-cliente');
26
- const { resumirParaNotificacion } = require('./lib/notificacion-formato');
26
+ const { resumirParaNotificacion, clasificarNotificacion } = require('./lib/notificacion-formato');
27
27
 
28
28
  // ----------------------------------------------------------------
29
29
  // Utilidades de logging
@@ -126,20 +126,14 @@ function construirCampos(nombreEvento, nombreProyecto, transcriptPath, evt) {
126
126
 
127
127
  } else if (nombreEvento === 'Notification') {
128
128
  tituloBase = 'Claude espera respuesta';
129
- const mensaje = (evt.message || '').toLowerCase();
130
- if (mensaje.includes('permission') || mensaje.includes('permiso')) {
131
- subtitulo = 'Permisos pendientes';
132
- } else if (mensaje.includes('idle') || mensaje.includes('waiting') || mensaje.includes('esperando')) {
133
- subtitulo = 'Esperando respuesta';
134
- } else {
135
- subtitulo = 'Atención requerida';
136
- }
137
- cuerpo = evt.message || 'Claude requiere tu atención.';
129
+ // Cuerpo y subtítulo en español — NUNCA el evt.message inglés de Claude Code
130
+ // ("Claude needs your permission"), que mezclaba idiomas (regla es-MX).
131
+ ({ subtitulo, cuerpo } = clasificarNotificacion(evt.message));
138
132
 
139
133
  } else {
140
134
  tituloBase = `Evento ${nombreEvento}`;
141
135
  subtitulo = 'Evento';
142
- cuerpo = evt.message || `Evento ${nombreEvento}`;
136
+ cuerpo = 'Claude generó un evento que requiere tu atención.';
143
137
  }
144
138
 
145
139
  return {
@@ -91,14 +91,22 @@ function resolverRutaCliCiclo() {
91
91
  * Dispara la Fase A del ciclo autónomo en un proceso separado
92
92
  * (fire-and-forget, `detached` + `unref`) cuando el motor está habilitado y
93
93
  * pasaron >=24h desde la última corrida (o nunca corrió). Guard barato
94
- * PRIMERO: si no existe `.planning/evolution/ciclo-config.json`, retorna sin
95
- * requerir ninguna lib del ciclo la inmensa mayoría de proyectos nunca lo
96
- * habilitó y el presupuesto de este hook (<200ms) no debe pagar ese costo.
94
+ * PRIMERO: si no existe el DIRECTORIO `.planning/evolution/`, el proyecto no
95
+ * tiene telemetría SWL y se retorna sin requerir ninguna lib del ciclo (el
96
+ * presupuesto de este hook <200ms no debe pagar ese costo).
97
+ *
98
+ * NO se gatea por la existencia de `ciclo-config.json` (era el guard del
99
+ * diseño opt-in viejo): el motor NACE ENCENDIDO (opt-out estricto, decisión
100
+ * del usuario 2026-07-10), así que `debeDisparar` honra `estaHabilitado`
101
+ * on-by-default aunque el config no exista — gatear por el archivo lo dejaba
102
+ * de facto opt-in y el ciclo nunca corría en proyectos que jamás ejecutaron
103
+ * `/swl:evolucion-continua on` (bug 2026-07-15).
104
+ *
97
105
  * El hook NO espera el resultado; el lock propio del ciclo (T-02) garantiza
98
106
  * que no haya doble corrida con el scheduler cron.
99
107
  */
100
108
  function dispararCicloAutonomoSiToca(cwd, hoy) {
101
- if (!fs.existsSync(path.join(cwd, '.planning', 'evolution', 'ciclo-config.json'))) return;
109
+ if (!fs.existsSync(path.join(cwd, '.planning', 'evolution'))) return;
102
110
 
103
111
  const fallback = resolverFallbackCiclo();
104
112
  if (!fallback) return;
@@ -1,27 +1,27 @@
1
- # Dial de autonomía — SWL-SES (Fase 13, ADR-0037)
2
- #
3
- # Presupuesto de autonomía por clase de riesgo. Consumido por hooks/lib/autonomia.js
4
- # (orquestador y agentes ALTO leen el dial como GUÍA; no es un gate bloqueante en v1).
5
- #
6
- # Defaults = los controles vigentes de reglas/seguridad-agentes.md. Este archivo
7
- # NO relaja ningún control: lo hace visible y ajustable. El dial sube SOLO por
8
- # decisión explícita del usuario, nunca por conveniencia del agente.
9
- #
10
- # Niveles válidos por clase:
11
- # total -> acción autónoma sin checkpoint (lectura/análisis).
12
- # con_auto_checkpoint -> autónoma, pero registra un auto-checkpoint antes de actuar.
13
- # hitl -> requiere confirmación humana siempre.
14
- # Cualquier valor desconocido se degrada a 'hitl' (nunca relaja).
15
- #
16
- # Estructura PLANA obligatoria (1 nivel bajo `clases:`) — ver 13-PLAN.md.
17
-
18
- version: "1.0"
19
- generado: "2026-06-11"
20
- defaults: seguridad-agentes.md
21
- clases:
22
- lectura_analisis: total
23
- # Subido a `total` por decisión explícita del usuario (2026-06-11, cierre Fase 13):
24
- # cambios reversibles autónomos sin auto-checkpoint. Los commits atómicos siguen
25
- # siendo el mecanismo de rollback. Default de seguridad-agentes.md era con_auto_checkpoint.
26
- cambio_reversible: total
27
- migracion_auth_push_publish: hitl
1
+ # Dial de autonomía — SWL-SES (Fase 13, ADR-0037)
2
+ #
3
+ # Presupuesto de autonomía por clase de riesgo. Consumido por hooks/lib/autonomia.js
4
+ # (orquestador y agentes ALTO leen el dial como GUÍA; no es un gate bloqueante en v1).
5
+ #
6
+ # Defaults = los controles vigentes de reglas/seguridad-agentes.md. Este archivo
7
+ # NO relaja ningún control: lo hace visible y ajustable. El dial sube SOLO por
8
+ # decisión explícita del usuario, nunca por conveniencia del agente.
9
+ #
10
+ # Niveles válidos por clase:
11
+ # total -> acción autónoma sin checkpoint (lectura/análisis).
12
+ # con_auto_checkpoint -> autónoma, pero registra un auto-checkpoint antes de actuar.
13
+ # hitl -> requiere confirmación humana siempre.
14
+ # Cualquier valor desconocido se degrada a 'hitl' (nunca relaja).
15
+ #
16
+ # Estructura PLANA obligatoria (1 nivel bajo `clases:`) — ver 13-PLAN.md.
17
+
18
+ version: "1.0"
19
+ generado: "2026-06-11"
20
+ defaults: seguridad-agentes.md
21
+ clases:
22
+ lectura_analisis: total
23
+ # Subido a `total` por decisión explícita del usuario (2026-06-11, cierre Fase 13):
24
+ # cambios reversibles autónomos sin auto-checkpoint. Los commits atómicos siguen
25
+ # siendo el mecanismo de rollback. Default de seguridad-agentes.md era con_auto_checkpoint.
26
+ cambio_reversible: total
27
+ migracion_auth_push_publish: hitl