@saulwade/swl-ses 1.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 (702) hide show
  1. package/CLAUDE.md +238 -0
  2. package/README.md +560 -0
  3. package/_userland/agentes/.gitkeep +0 -0
  4. package/_userland/habilidades/.gitkeep +0 -0
  5. package/agentes/.evolved.json +9 -0
  6. package/agentes/accesibilidad-wcag-swl.md +692 -0
  7. package/agentes/arquitecto-swl.md +238 -0
  8. package/agentes/auto-evolucion-swl.md +854 -0
  9. package/agentes/backend-api-swl.md +470 -0
  10. package/agentes/backend-csharp-swl.md +418 -0
  11. package/agentes/backend-go-swl.md +388 -0
  12. package/agentes/backend-java-swl.md +279 -0
  13. package/agentes/backend-node-swl.md +477 -0
  14. package/agentes/backend-python-swl.md +608 -0
  15. package/agentes/backend-rust-swl.md +362 -0
  16. package/agentes/backend-workers-swl.md +480 -0
  17. package/agentes/cloud-infra-swl.md +485 -0
  18. package/agentes/consolidador-swl.md +539 -0
  19. package/agentes/datos-swl.md +584 -0
  20. package/agentes/depurador-swl.md +349 -0
  21. package/agentes/devops-ci-swl.md +374 -0
  22. package/agentes/disenador-ui-swl.md +558 -0
  23. package/agentes/documentador-swl.md +343 -0
  24. package/agentes/evals/arquitecto-swl.evals.json +56 -0
  25. package/agentes/evals/auto-evolucion-swl.evals.json +68 -0
  26. package/agentes/evals/implementador-swl.evals.json +56 -0
  27. package/agentes/evals/orquestador-swl.evals.json +60 -0
  28. package/agentes/evals/perfilador-usuario-swl.evals.json +60 -0
  29. package/agentes/evals/red-team-swl.evals.json +59 -0
  30. package/agentes/evals/revisor-codigo-swl.evals.json +59 -0
  31. package/agentes/frontend-angular-swl.md +627 -0
  32. package/agentes/frontend-css-swl.md +720 -0
  33. package/agentes/frontend-react-swl.md +696 -0
  34. package/agentes/frontend-swl.md +500 -0
  35. package/agentes/frontend-tailwind-swl.md +830 -0
  36. package/agentes/implementador-swl.md +328 -0
  37. package/agentes/investigador-swl.md +430 -0
  38. package/agentes/investigador-ux-swl.md +500 -0
  39. package/agentes/llm-apps-swl.md +276 -0
  40. package/agentes/migrador-swl.md +417 -0
  41. package/agentes/mobile-android-swl.md +509 -0
  42. package/agentes/mobile-cross-swl.md +539 -0
  43. package/agentes/mobile-ios-swl.md +500 -0
  44. package/agentes/mobile-testing-swl.md +300 -0
  45. package/agentes/notificador-swl.md +916 -0
  46. package/agentes/observabilidad-swl.md +436 -0
  47. package/agentes/orquestador-swl.md +884 -0
  48. package/agentes/pagos-swl.md +283 -0
  49. package/agentes/perfilador-usuario-swl.md +306 -0
  50. package/agentes/planificador-swl.md +402 -0
  51. package/agentes/producto-prd-swl.md +587 -0
  52. package/agentes/red-team-swl.md +216 -0
  53. package/agentes/release-manager-swl.md +568 -0
  54. package/agentes/rendimiento-swl.md +714 -0
  55. package/agentes/resolutor-build-swl.md +243 -0
  56. package/agentes/revisor-angular-swl.md +276 -0
  57. package/agentes/revisor-codigo-swl.md +348 -0
  58. package/agentes/revisor-csharp-swl.md +262 -0
  59. package/agentes/revisor-go-swl.md +257 -0
  60. package/agentes/revisor-java-swl.md +255 -0
  61. package/agentes/revisor-kotlin-swl.md +271 -0
  62. package/agentes/revisor-nextjs-swl.md +279 -0
  63. package/agentes/revisor-php-swl.md +269 -0
  64. package/agentes/revisor-react-swl.md +276 -0
  65. package/agentes/revisor-rust-swl.md +344 -0
  66. package/agentes/revisor-seguridad-swl.md +390 -0
  67. package/agentes/revisor-swift-swl.md +266 -0
  68. package/agentes/revisor-typescript-swl.md +344 -0
  69. package/agentes/sre-swl.md +265 -0
  70. package/agentes/tdd-qa-swl.md +354 -0
  71. package/agentes/ux-disenador-swl.md +501 -0
  72. package/bin/lib/bot-comandos.js +1030 -0
  73. package/bin/lib/bot-discovery.js +182 -0
  74. package/bin/lib/bot-git.js +142 -0
  75. package/bin/swl-ses.js +325 -0
  76. package/bin/swl-telegram-bot.js +442 -0
  77. package/bin/swl-telegram-bot.plist +21 -0
  78. package/bin/swl-telegram-bot.service +14 -0
  79. package/comandos/swl/.evolved.json +23 -0
  80. package/comandos/swl/actualizar.md +174 -0
  81. package/comandos/swl/adoptar-proyecto.md +207 -0
  82. package/comandos/swl/aprender.md +701 -0
  83. package/comandos/swl/auditar-deps.md +134 -0
  84. package/comandos/swl/autoresearch.md +170 -0
  85. package/comandos/swl/ayuda.md +224 -0
  86. package/comandos/swl/brainstorm.md +50 -0
  87. package/comandos/swl/checkpoint.md +330 -0
  88. package/comandos/swl/compactar.md +283 -0
  89. package/comandos/swl/configurar-ci.md +227 -0
  90. package/comandos/swl/contexto.md +112 -0
  91. package/comandos/swl/contribuir.md +233 -0
  92. package/comandos/swl/crear-skill.md +292 -0
  93. package/comandos/swl/cron.md +196 -0
  94. package/comandos/swl/dashboard.md +146 -0
  95. package/comandos/swl/discutir-fase.md +230 -0
  96. package/comandos/swl/ejecutar-fase.md +135 -0
  97. package/comandos/swl/evaluar-skill.md +487 -0
  98. package/comandos/swl/evolucion-estado.md +142 -0
  99. package/comandos/swl/evolucionar.md +259 -0
  100. package/comandos/swl/exportar-vault.md +189 -0
  101. package/comandos/swl/gateway.md +158 -0
  102. package/comandos/swl/inbox.md +116 -0
  103. package/comandos/swl/instalar.md +220 -0
  104. package/comandos/swl/instintos.md +86 -0
  105. package/comandos/swl/mapear-codebase.md +312 -0
  106. package/comandos/swl/mcp-status.md +175 -0
  107. package/comandos/swl/metricas.md +270 -0
  108. package/comandos/swl/modelo.md +102 -0
  109. package/comandos/swl/notificaciones.md +396 -0
  110. package/comandos/swl/nuevo-proyecto.md +154 -0
  111. package/comandos/swl/planear-fase.md +221 -0
  112. package/comandos/swl/plugins.md +256 -0
  113. package/comandos/swl/reflect-skills.md +125 -0
  114. package/comandos/swl/release.md +217 -0
  115. package/comandos/swl/revisar-impacto.md +206 -0
  116. package/comandos/swl/revisar.md +330 -0
  117. package/comandos/swl/salud.md +363 -0
  118. package/comandos/swl/sesiones.md +200 -0
  119. package/comandos/swl/skill-search.md +113 -0
  120. package/comandos/swl/verificar.md +585 -0
  121. package/comandos/swl/wiki.md +620 -0
  122. package/contextos/dev.md +32 -0
  123. package/contextos/research.md +30 -0
  124. package/contextos/review.md +31 -0
  125. package/habilidades/accesibilidad-a11y/SKILL.md +201 -0
  126. package/habilidades/accesibilidad-a11y/evals/evals.json +56 -0
  127. package/habilidades/accesibilidad-a11y/recursos/ejemplos-y-checklist-completo.md +441 -0
  128. package/habilidades/agent-browser/SKILL.md +218 -0
  129. package/habilidades/agentes-como-servicio/SKILL.md +218 -0
  130. package/habilidades/ai-runtime-security/SKILL.md +273 -0
  131. package/habilidades/angular-avanzado/SKILL.md +164 -0
  132. package/habilidades/angular-avanzado/recursos/ejemplos-avanzados.md +219 -0
  133. package/habilidades/angular-moderno/SKILL.md +186 -0
  134. package/habilidades/angular-moderno/evals/evals.json +45 -0
  135. package/habilidades/angular-moderno/recursos/ejemplos-avanzados.md +106 -0
  136. package/habilidades/api-rest-diseno/SKILL.md +191 -0
  137. package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
  138. package/habilidades/api-rest-diseno/recursos/referencia-api.md +140 -0
  139. package/habilidades/aprendizaje-continuo/SKILL.md +151 -0
  140. package/habilidades/aprendizaje-continuo/evals/evals.json +53 -0
  141. package/habilidades/aprendizaje-continuo/recursos/referencia-instintos.md +290 -0
  142. package/habilidades/async-python/SKILL.md +149 -0
  143. package/habilidades/async-python/evals/evals.json +47 -0
  144. package/habilidades/async-python/recursos/patrones-y-ejemplos-completos.md +292 -0
  145. package/habilidades/auth-patrones/.evolved.json +9 -0
  146. package/habilidades/auth-patrones/SKILL.md +413 -0
  147. package/habilidades/auth-patrones/recursos/implementaciones-completas.md +229 -0
  148. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -0
  149. package/habilidades/auto-evolucion-protocolo/evals/evals.json +55 -0
  150. package/habilidades/auto-evolucion-protocolo/recursos/referencia-completa.md +145 -0
  151. package/habilidades/autoresearch/SKILL.md +268 -0
  152. package/habilidades/autoresearch/evals/evals.json +41 -0
  153. package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
  154. package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
  155. package/habilidades/azure-cloud/SKILL.md +308 -0
  156. package/habilidades/azure-cloud/recursos/aks.md +327 -0
  157. package/habilidades/backend-mcp-servidor/SKILL.md +270 -0
  158. package/habilidades/backend-production-resilience/SKILL.md +288 -0
  159. package/habilidades/brainstorming/SKILL.md +295 -0
  160. package/habilidades/brainstorming/recursos/componentes-html.md +247 -0
  161. package/habilidades/build-errors-cpp/SKILL.md +270 -0
  162. package/habilidades/build-errors-csharp/SKILL.md +265 -0
  163. package/habilidades/build-errors-go/SKILL.md +306 -0
  164. package/habilidades/build-errors-java/SKILL.md +278 -0
  165. package/habilidades/build-errors-kotlin/SKILL.md +303 -0
  166. package/habilidades/build-errors-nextjs/SKILL.md +312 -0
  167. package/habilidades/build-errors-php/SKILL.md +270 -0
  168. package/habilidades/build-errors-python/SKILL.md +292 -0
  169. package/habilidades/build-errors-rust/SKILL.md +284 -0
  170. package/habilidades/build-errors-swift/SKILL.md +272 -0
  171. package/habilidades/build-errors-typescript/SKILL.md +369 -0
  172. package/habilidades/checklist-calidad/SKILL.md +271 -0
  173. package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
  174. package/habilidades/checklist-seguridad/SKILL.md +285 -0
  175. package/habilidades/checkpoints-verificacion/SKILL.md +298 -0
  176. package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
  177. package/habilidades/ci-cd-pipelines/SKILL.md +157 -0
  178. package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
  179. package/habilidades/ci-cd-pipelines/recursos/pipelines-completos.md +487 -0
  180. package/habilidades/cloud-aws/SKILL.md +142 -0
  181. package/habilidades/cloud-aws/recursos/servicios-aws-referencia.md +321 -0
  182. package/habilidades/compactacion-contexto/SKILL.md +247 -0
  183. package/habilidades/contenedores-docker/SKILL.md +137 -0
  184. package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
  185. package/habilidades/contenedores-docker/recursos/ejemplos-y-configuraciones.md +327 -0
  186. package/habilidades/context-builder/SKILL.md +170 -0
  187. package/habilidades/control-profundidad/SKILL.md +128 -0
  188. package/habilidades/csharp-experto/SKILL.md +322 -0
  189. package/habilidades/csharp-patrones/SKILL.md +316 -0
  190. package/habilidades/csharp-testing/SKILL.md +286 -0
  191. package/habilidades/css-moderno/SKILL.md +166 -0
  192. package/habilidades/css-moderno/evals/evals.json +43 -0
  193. package/habilidades/css-moderno/recursos/ejemplos-y-patrones-completos.md +337 -0
  194. package/habilidades/datos-etl/SKILL.md +129 -0
  195. package/habilidades/datos-etl/recursos/implementaciones-completas.md +322 -0
  196. package/habilidades/dbml-experto/SKILL.md +339 -0
  197. package/habilidades/dbml-experto/evals/evals.json +56 -0
  198. package/habilidades/dependencias-auditoria/SKILL.md +320 -0
  199. package/habilidades/deprecacion-migracion/SKILL.md +169 -0
  200. package/habilidades/deprecacion-migracion/recursos/implementaciones-completas.md +220 -0
  201. package/habilidades/design-tokens/SKILL.md +158 -0
  202. package/habilidades/design-tokens/recursos/tokens-y-configuracion.md +363 -0
  203. package/habilidades/devsecops-pipeline-security/SKILL.md +309 -0
  204. package/habilidades/diagrama-arquitectura/SKILL.md +165 -0
  205. package/habilidades/diagrama-arquitectura/assets/template.html +276 -0
  206. package/habilidades/discutir-fase/SKILL.md +188 -0
  207. package/habilidades/diseno-herramientas-agente/SKILL.md +199 -0
  208. package/habilidades/diseno-responsivo/SKILL.md +186 -0
  209. package/habilidades/diseno-responsivo/recursos/ejemplos-layouts.md +156 -0
  210. package/habilidades/django-experto/SKILL.md +205 -0
  211. package/habilidades/django-experto/recursos/async-django.md +390 -0
  212. package/habilidades/django-experto/recursos/drf-patrones.md +438 -0
  213. package/habilidades/django-experto/recursos/orm-avanzado.md +382 -0
  214. package/habilidades/django-experto/recursos/referencia-completa.md +188 -0
  215. package/habilidades/django-experto/recursos/testing-django.md +415 -0
  216. package/habilidades/doc-sync/SKILL.md +280 -0
  217. package/habilidades/drift-detection/SKILL.md +179 -0
  218. package/habilidades/ejecutar-fase/SKILL.md +468 -0
  219. package/habilidades/estilo-sin-ai-isms/SKILL.md +775 -0
  220. package/habilidades/estilo-sin-ai-isms/evals/evals.json +63 -0
  221. package/habilidades/estilo-sin-ai-isms/scripts/detectar_aiisms.py +500 -0
  222. package/habilidades/estructura-proyecto-claude/SKILL.md +215 -0
  223. package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
  224. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +176 -0
  225. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +289 -0
  226. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
  227. package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
  228. package/habilidades/evaluacion-agentes/SKILL.md +314 -0
  229. package/habilidades/event-driven/SKILL.md +153 -0
  230. package/habilidades/event-driven/recursos/implementaciones-completas.md +423 -0
  231. package/habilidades/extraccion-documentos/SKILL.md +221 -0
  232. package/habilidades/extractor-de-aprendizajes/.evolved.json +9 -0
  233. package/habilidades/extractor-de-aprendizajes/SKILL.md +311 -0
  234. package/habilidades/extractor-de-aprendizajes/evals/evals.json +55 -0
  235. package/habilidades/fastapi-experto/SKILL.md +221 -0
  236. package/habilidades/fastapi-experto/recursos/async-patterns.md +438 -0
  237. package/habilidades/fastapi-experto/recursos/dependency-injection.md +330 -0
  238. package/habilidades/fastapi-experto/recursos/referencia-completa.md +79 -0
  239. package/habilidades/fastapi-experto/recursos/testing-httpx.md +420 -0
  240. package/habilidades/filament-admin/SKILL.md +290 -0
  241. package/habilidades/frontend-avanzado/SKILL.md +257 -0
  242. package/habilidades/frontend-avanzado/recursos/apis-nativas-ejemplos.md +341 -0
  243. package/habilidades/gcp-cloud/SKILL.md +260 -0
  244. package/habilidades/gcp-cloud/recursos/gke.md +234 -0
  245. package/habilidades/gcp-cloud/recursos/terraform-gcp.md +307 -0
  246. package/habilidades/generacion-mermaid/SKILL.md +229 -0
  247. package/habilidades/git-worktrees-paralelo/SKILL.md +270 -0
  248. package/habilidades/go-experto/SKILL.md +305 -0
  249. package/habilidades/go-patrones/SKILL.md +299 -0
  250. package/habilidades/go-testing/SKILL.md +291 -0
  251. package/habilidades/graphql-experto/SKILL.md +323 -0
  252. package/habilidades/guardrail-semantico/SKILL.md +282 -0
  253. package/habilidades/harness-claude-code/SKILL.md +299 -0
  254. package/habilidades/iam-secretos/SKILL.md +265 -0
  255. package/habilidades/iam-secretos/recursos/implementaciones-completas.md +356 -0
  256. package/habilidades/infra-github-actions/SKILL.md +166 -0
  257. package/habilidades/instalar-sistema/.evolved.json +9 -0
  258. package/habilidades/instalar-sistema/SKILL.md +221 -0
  259. package/habilidades/java-experto/SKILL.md +290 -0
  260. package/habilidades/java-patrones/SKILL.md +275 -0
  261. package/habilidades/java-testing/SKILL.md +288 -0
  262. package/habilidades/kotlin-compose/SKILL.md +278 -0
  263. package/habilidades/kotlin-compose/recursos/animaciones-performance.md +93 -0
  264. package/habilidades/kotlin-experto/SKILL.md +318 -0
  265. package/habilidades/kotlin-testing/SKILL.md +267 -0
  266. package/habilidades/kotlin-testing/recursos/testing-avanzado.md +74 -0
  267. package/habilidades/kubernetes-orquestacion/SKILL.md +152 -0
  268. package/habilidades/kubernetes-orquestacion/recursos/manifiestos-completos.md +452 -0
  269. package/habilidades/langchain-langraph/SKILL.md +386 -0
  270. package/habilidades/langchain-langraph/recursos/evaluacion-rag.md +321 -0
  271. package/habilidades/langchain-langraph/recursos/rag-maturity-model.md +225 -0
  272. package/habilidades/langchain-langraph/recursos/vectorstores.md +306 -0
  273. package/habilidades/legacy-code-rescue/SKILL.md +267 -0
  274. package/habilidades/likec4-experto/SKILL.md +412 -0
  275. package/habilidades/likec4-experto/evals/evals.json +69 -0
  276. package/habilidades/manejo-errores/.evolved.json +9 -0
  277. package/habilidades/manejo-errores/SKILL.md +407 -0
  278. package/habilidades/manejo-errores/recursos/implementaciones-completas.md +248 -0
  279. package/habilidades/mapear-codebase/SKILL.md +275 -0
  280. package/habilidades/memoria-busqueda/SKILL.md +194 -0
  281. package/habilidades/memoria-busqueda/evals/evals.json +44 -0
  282. package/habilidades/meta-skills-estandar/SKILL.md +298 -0
  283. package/habilidades/meta-skills-estandar/recursos/anti-patrones-y-leyes.md +205 -0
  284. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +107 -0
  285. package/habilidades/meta-skills-estandar/recursos/idiomas-framework.md +60 -0
  286. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -0
  287. package/habilidades/microservicios/SKILL.md +155 -0
  288. package/habilidades/microservicios/recursos/patrones-y-ejemplos-completos.md +325 -0
  289. package/habilidades/mobile-flutter/SKILL.md +199 -0
  290. package/habilidades/mobile-flutter/recursos/ejemplos-completos.md +319 -0
  291. package/habilidades/mobile-react-native/SKILL.md +176 -0
  292. package/habilidades/mobile-react-native/recursos/ejemplos-completos.md +216 -0
  293. package/habilidades/mongodb-experto/SKILL.md +302 -0
  294. package/habilidades/monitoring-alertas/SKILL.md +201 -0
  295. package/habilidades/monitoring-alertas/recursos/instrumentacion-y-alertas.md +301 -0
  296. package/habilidades/nestjs-experto/SKILL.md +307 -0
  297. package/habilidades/nestjs-experto/recursos/guards-interceptors.md +339 -0
  298. package/habilidades/nestjs-experto/recursos/modulos-di.md +287 -0
  299. package/habilidades/nestjs-experto/recursos/testing-nestjs.md +354 -0
  300. package/habilidades/nextjs-experto/SKILL.md +335 -0
  301. package/habilidades/nextjs-patrones/SKILL.md +303 -0
  302. package/habilidades/nextjs-testing/SKILL.md +331 -0
  303. package/habilidades/node-experto/.evolved.json +9 -0
  304. package/habilidades/node-experto/SKILL.md +266 -0
  305. package/habilidades/node-experto/recursos/patrones-completos.md +283 -0
  306. package/habilidades/notificaciones-multicanal/SKILL.md +159 -0
  307. package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
  308. package/habilidades/notificaciones-multicanal/recursos/configuracion-y-templates.md +303 -0
  309. package/habilidades/nuevo-proyecto/SKILL.md +204 -0
  310. package/habilidades/orquestacion-async/SKILL.md +303 -0
  311. package/habilidades/paid-media-tracking/SKILL.md +269 -0
  312. package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +220 -0
  313. package/habilidades/paid-media-tracking/recursos/google-ads-api.md +215 -0
  314. package/habilidades/patrones-python/SKILL.md +228 -0
  315. package/habilidades/patrones-python/evals/evals.json +56 -0
  316. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -0
  317. package/habilidades/patrones-python/recursos/referencia-completa.md +202 -0
  318. package/habilidades/perfil-usuario/SKILL.md +200 -0
  319. package/habilidades/perfil-usuario/evals/evals.json +55 -0
  320. package/habilidades/performance-baseline/SKILL.md +297 -0
  321. package/habilidades/php-experto/SKILL.md +291 -0
  322. package/habilidades/php-patrones/SKILL.md +306 -0
  323. package/habilidades/php-testing/SKILL.md +280 -0
  324. package/habilidades/planear-fase/SKILL.md +269 -0
  325. package/habilidades/postgresql-experto/SKILL.md +151 -0
  326. package/habilidades/postgresql-experto/evals/evals.json +53 -0
  327. package/habilidades/postgresql-experto/recursos/referencia-completa.md +215 -0
  328. package/habilidades/prevencion-racionalizacion/SKILL.md +175 -0
  329. package/habilidades/prevencion-sobreingenieria/SKILL.md +323 -0
  330. package/habilidades/privacy-memoria/SKILL.md +141 -0
  331. package/habilidades/privacy-memoria/evals/evals.json +43 -0
  332. package/habilidades/prompt-engineering/SKILL.md +518 -0
  333. package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +467 -0
  334. package/habilidades/rag-arquitectura/SKILL.md +338 -0
  335. package/habilidades/rails-experto/SKILL.md +237 -0
  336. package/habilidades/rails-experto/recursos/active-record.md +260 -0
  337. package/habilidades/rails-experto/recursos/hotwire-turbo.md +293 -0
  338. package/habilidades/rails-experto/recursos/testing-rspec.md +362 -0
  339. package/habilidades/react-experto/SKILL.md +209 -0
  340. package/habilidades/react-experto/evals/evals.json +55 -0
  341. package/habilidades/react-experto/recursos/patrones-y-ejemplos-completos.md +240 -0
  342. package/habilidades/react-optimizacion/SKILL.md +174 -0
  343. package/habilidades/react-optimizacion/recursos/patrones-avanzados.md +138 -0
  344. package/habilidades/redis-experto/SKILL.md +305 -0
  345. package/habilidades/release-semver/.evolved.json +9 -0
  346. package/habilidades/release-semver/SKILL.md +248 -0
  347. package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
  348. package/habilidades/rust-experto/SKILL.md +400 -0
  349. package/habilidades/rust-patrones/SKILL.md +296 -0
  350. package/habilidades/rust-testing/SKILL.md +311 -0
  351. package/habilidades/seguridad-skills-ia/SKILL.md +262 -0
  352. package/habilidades/sql-optimizacion/SKILL.md +200 -0
  353. package/habilidades/sql-optimizacion/evals/evals.json +54 -0
  354. package/habilidades/sql-optimizacion/recursos/patrones-sql-avanzados.md +131 -0
  355. package/habilidades/sre-patrones/SKILL.md +333 -0
  356. package/habilidades/sre-patrones/recursos/chaos-engineering.md +241 -0
  357. package/habilidades/sre-patrones/recursos/oncall-design.md +236 -0
  358. package/habilidades/stripe-pagos/SKILL.md +550 -0
  359. package/habilidades/stripe-pagos/recursos/errores-reintentos.md +390 -0
  360. package/habilidades/stripe-pagos/recursos/stripe-connect.md +290 -0
  361. package/habilidades/structured-outputs/SKILL.md +343 -0
  362. package/habilidades/swift-experto/SKILL.md +320 -0
  363. package/habilidades/swift-experto/recursos/keychain-y-wrappers.md +110 -0
  364. package/habilidades/swift-patrones/SKILL.md +313 -0
  365. package/habilidades/swift-patrones/recursos/tca-ejemplo-completo.md +113 -0
  366. package/habilidades/swift-testing/SKILL.md +254 -0
  367. package/habilidades/swift-testing/recursos/xcuitest-planes.md +143 -0
  368. package/habilidades/swl-dashboard/SKILL.md +370 -0
  369. package/habilidades/swl-markitdown/SKILL.md +285 -0
  370. package/habilidades/swl-markitdown/evals/evals.json +52 -0
  371. package/habilidades/swl-revisar-impacto/SKILL.md +233 -0
  372. package/habilidades/tailwind-experto/SKILL.md +240 -0
  373. package/habilidades/tailwind-experto/recursos/referencia-completa.md +184 -0
  374. package/habilidades/tdd-workflow/SKILL.md +293 -0
  375. package/habilidades/terraform-experto/SKILL.md +321 -0
  376. package/habilidades/testing-python/SKILL.md +340 -0
  377. package/habilidades/testing-python/recursos/ejemplos-completos.md +167 -0
  378. package/habilidades/threat-model-lite/SKILL.md +246 -0
  379. package/habilidades/tracing-processor/SKILL.md +212 -0
  380. package/habilidades/tracking-measurement/SKILL.md +239 -0
  381. package/habilidades/tracking-measurement/recursos/consent-mode.md +231 -0
  382. package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +216 -0
  383. package/habilidades/tracking-measurement/recursos/meta-capi.md +262 -0
  384. package/habilidades/typescript-avanzado/SKILL.md +144 -0
  385. package/habilidades/typescript-avanzado/evals/evals.json +55 -0
  386. package/habilidades/typescript-avanzado/recursos/patrones-y-ejemplos-completos.md +298 -0
  387. package/habilidades/typescript-diagnosticos/SKILL.md +513 -0
  388. package/habilidades/ux-diseno/SKILL.md +116 -0
  389. package/habilidades/ux-diseno/evals/evals.json +43 -0
  390. package/habilidades/ux-diseno/recursos/patrones-ux-referencia.md +214 -0
  391. package/habilidades/validacion-ci-sistema/SKILL.md +136 -0
  392. package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +369 -0
  393. package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
  394. package/habilidades/verificacion-evidencia/SKILL.md +160 -0
  395. package/habilidades/verificar-trabajo/SKILL.md +303 -0
  396. package/habilidades/verificar-trabajo/recursos/plantilla-verificacion.md +60 -0
  397. package/habilidades/wiki-conocimiento/SKILL.md +276 -0
  398. package/habilidades/wireframes-flujos/SKILL.md +212 -0
  399. package/habilidades/wireframes-flujos/recursos/referencia-completa.md +192 -0
  400. package/habilidades/workflow-claude-code/SKILL.md +260 -0
  401. package/habilidades/workflow-claude-code/recursos/referencia-completa.md +109 -0
  402. package/hooks/_run-hook.sh +57 -0
  403. package/hooks/actualizar-perfil-usuario.js +364 -0
  404. package/hooks/agente-lifecycle.js +71 -0
  405. package/hooks/aiisms-detector.js +173 -0
  406. package/hooks/audit-trail.js +204 -0
  407. package/hooks/auto-background.js +97 -0
  408. package/hooks/auto-consolidacion.js +178 -0
  409. package/hooks/auto-evolucion.js +666 -0
  410. package/hooks/auto-restaurar-settings.js +360 -0
  411. package/hooks/calidad-pre-commit.js +929 -0
  412. package/hooks/calidad-typescript.js +511 -0
  413. package/hooks/captura-feedback-usuario.js +148 -0
  414. package/hooks/check-update.js +211 -0
  415. package/hooks/clasificador-mensajes.js +271 -0
  416. package/hooks/degradacion-instintos.js +272 -0
  417. package/hooks/escaneo-secretos.js +389 -0
  418. package/hooks/extraccion-aprendizajes.js +763 -0
  419. package/hooks/grafo-contexto.js +129 -0
  420. package/hooks/graph-update.js +67 -0
  421. package/hooks/guardrail-modelo.js +247 -0
  422. package/hooks/inbox-aviso.js +75 -0
  423. package/hooks/inyeccion-contexto.js +246 -0
  424. package/hooks/lib/abort-registry.js +214 -0
  425. package/hooks/lib/agent-backend.js +210 -0
  426. package/hooks/lib/agent-comms.js +263 -0
  427. package/hooks/lib/agent-issue-codes.js +284 -0
  428. package/hooks/lib/agent-matcher.js +189 -0
  429. package/hooks/lib/async-hook-registry.js +252 -0
  430. package/hooks/lib/atomic-write.js +130 -0
  431. package/hooks/lib/auto-consolidator.js +335 -0
  432. package/hooks/lib/canary-skills.js +187 -0
  433. package/hooks/lib/consolidation-lock.js +291 -0
  434. package/hooks/lib/context-builder.js +430 -0
  435. package/hooks/lib/context-compressor.js +657 -0
  436. package/hooks/lib/convergence-detector.js +105 -0
  437. package/hooks/lib/delegation-tracker.js +198 -0
  438. package/hooks/lib/detectar-package-manager.js +423 -0
  439. package/hooks/lib/edit-accumulator.js +171 -0
  440. package/hooks/lib/error-classifier.js +308 -0
  441. package/hooks/lib/event-bus.js +112 -0
  442. package/hooks/lib/evolution-tracker.js +442 -0
  443. package/hooks/lib/execution-state.js +316 -0
  444. package/hooks/lib/fingerprint-id.js +135 -0
  445. package/hooks/lib/gateway-notify.js +116 -0
  446. package/hooks/lib/graph-security.js +75 -0
  447. package/hooks/lib/guardrail-metrics.js +202 -0
  448. package/hooks/lib/hook-circuit-breaker.js +206 -0
  449. package/hooks/lib/loop-detector.js +267 -0
  450. package/hooks/lib/mcp-health.js +184 -0
  451. package/hooks/lib/mcp-pool.js +436 -0
  452. package/hooks/lib/memory-search.js +506 -0
  453. package/hooks/lib/merkle-audit.js +96 -0
  454. package/hooks/lib/model-router.js +222 -0
  455. package/hooks/lib/normalize-error.js +324 -0
  456. package/hooks/lib/normalize-input.js +65 -0
  457. package/hooks/lib/nudge-tracker.js +306 -0
  458. package/hooks/lib/otlp-exporter.js +365 -0
  459. package/hooks/lib/performance-marks.js +239 -0
  460. package/hooks/lib/privacy-filter.js +128 -0
  461. package/hooks/lib/prompt-injection-scanner.js +209 -0
  462. package/hooks/lib/provenance-tracker.js +183 -0
  463. package/hooks/lib/rate-limit-tracker.js +253 -0
  464. package/hooks/lib/reflect-classifier.js +164 -0
  465. package/hooks/lib/resource-quota.js +122 -0
  466. package/hooks/lib/retry-jitter.js +165 -0
  467. package/hooks/lib/risk-engine.js +368 -0
  468. package/hooks/lib/run-log.js +408 -0
  469. package/hooks/lib/session-fts.js +379 -0
  470. package/hooks/lib/session-store.js +293 -0
  471. package/hooks/lib/singleton-guard.js +159 -0
  472. package/hooks/lib/skill-auditor.js +588 -0
  473. package/hooks/lib/sync-status.js +228 -0
  474. package/hooks/lib/taint-tracker.js +107 -0
  475. package/hooks/lib/task-service.js +295 -0
  476. package/hooks/lib/tech-skills-map.js +146 -0
  477. package/hooks/lib/telegram-cliente.js +159 -0
  478. package/hooks/lib/telegram-config.js +170 -0
  479. package/hooks/lib/token-budget.js +156 -0
  480. package/hooks/lib/token-estimator.js +420 -0
  481. package/hooks/lib/toon-compressor.js +245 -0
  482. package/hooks/lib/usage-model.js +183 -0
  483. package/hooks/lib/variable-resolver.js +230 -0
  484. package/hooks/linea-estado.js +324 -0
  485. package/hooks/metricas-evolucion.js +209 -0
  486. package/hooks/monitor-contexto.js +325 -0
  487. package/hooks/notificacion-sesion-stop.js +198 -0
  488. package/hooks/notificacion-telegram-notification.js +4 -0
  489. package/hooks/notificacion-telegram-subagent.js +4 -0
  490. package/hooks/notificacion-telegram.js +267 -0
  491. package/hooks/preservar-estado-pre-compact.js +150 -0
  492. package/hooks/proteccion-rutas.js +366 -0
  493. package/hooks/registro-turnos.js +209 -0
  494. package/hooks/resumen-sesion.js +249 -0
  495. package/hooks/risk-scoring.js +323 -0
  496. package/hooks/rotar-audit-auto.js +122 -0
  497. package/hooks/sugerir-regenerar-inventario.js +170 -0
  498. package/hooks/telemetria-agentes.js +167 -0
  499. package/hooks/tracking-costos.js +688 -0
  500. package/instintos/global.yaml +8 -0
  501. package/instintos/perfil-usuario.yaml +53 -0
  502. package/instintos/prompt-appendices.yaml +57 -0
  503. package/instintos/proyecto.yaml +372 -0
  504. package/manifiestos/gateway-config.json +77 -0
  505. package/manifiestos/handoff-context.json +223 -0
  506. package/manifiestos/hook-profiles.json +44 -0
  507. package/manifiestos/hooks-config.json +360 -0
  508. package/manifiestos/modulos.json +1173 -0
  509. package/manifiestos/perfiles.json +404 -0
  510. package/package.json +86 -0
  511. package/plantillas/ESTADO.md +109 -0
  512. package/plantillas/HOJA-RUTA.md +143 -0
  513. package/plantillas/PROYECTO.md +122 -0
  514. package/plantillas/REQUISITOS.md +132 -0
  515. package/plantillas/auditor-veto-template.md +105 -0
  516. package/plantillas/github-workflows/README.md +47 -0
  517. package/plantillas/github-workflows/release-please.yml +44 -0
  518. package/plantillas/github-workflows/swl-ci.yml +107 -0
  519. package/plantillas/github-workflows/swl-security.yml +51 -0
  520. package/plantillas/mcp-mineru.json +13 -0
  521. package/plantillas/research/ARQUITECTURA.md +220 -0
  522. package/plantillas/research/FUNCIONALIDADES.md +175 -0
  523. package/plantillas/research/RESUMEN.md +165 -0
  524. package/plantillas/research/STACK.md +233 -0
  525. package/plantillas/research/TRAMPAS.md +299 -0
  526. package/plantillas/skill-evals-template.json +44 -0
  527. package/plugin.json +343 -0
  528. package/reglas/accesibilidad.md +269 -0
  529. package/reglas/api-diseno.md +400 -0
  530. package/reglas/arquitectura.md +352 -0
  531. package/reglas/brevedad-output.md +124 -0
  532. package/reglas/cloud-infra.md +247 -0
  533. package/reglas/docs.md +245 -0
  534. package/reglas/estilo-codigo.md +201 -0
  535. package/reglas/git-workflow.md +245 -0
  536. package/reglas/gobernanza.md +271 -0
  537. package/reglas/harness-claude-code.md +213 -0
  538. package/reglas/hooks.md +186 -0
  539. package/reglas/lenguajes/csharp/estilo-codigo.md +231 -0
  540. package/reglas/lenguajes/csharp/hooks.md +281 -0
  541. package/reglas/lenguajes/csharp/patrones.md +226 -0
  542. package/reglas/lenguajes/csharp/seguridad.md +258 -0
  543. package/reglas/lenguajes/csharp/testing.md +176 -0
  544. package/reglas/lenguajes/go/estilo-codigo.md +195 -0
  545. package/reglas/lenguajes/go/hooks.md +249 -0
  546. package/reglas/lenguajes/go/patrones.md +249 -0
  547. package/reglas/lenguajes/go/seguridad.md +225 -0
  548. package/reglas/lenguajes/go/testing.md +272 -0
  549. package/reglas/lenguajes/java/estilo-codigo.md +217 -0
  550. package/reglas/lenguajes/java/hooks.md +251 -0
  551. package/reglas/lenguajes/java/patrones.md +226 -0
  552. package/reglas/lenguajes/java/seguridad.md +233 -0
  553. package/reglas/lenguajes/java/testing.md +238 -0
  554. package/reglas/lenguajes/kotlin/estilo-codigo.md +208 -0
  555. package/reglas/lenguajes/kotlin/hooks.md +245 -0
  556. package/reglas/lenguajes/kotlin/patrones.md +201 -0
  557. package/reglas/lenguajes/kotlin/seguridad.md +202 -0
  558. package/reglas/lenguajes/kotlin/testing.md +236 -0
  559. package/reglas/lenguajes/nextjs/estilo-codigo.md +175 -0
  560. package/reglas/lenguajes/nextjs/hooks.md +186 -0
  561. package/reglas/lenguajes/nextjs/patrones.md +225 -0
  562. package/reglas/lenguajes/nextjs/seguridad.md +216 -0
  563. package/reglas/lenguajes/nextjs/testing.md +193 -0
  564. package/reglas/lenguajes/php/estilo-codigo.md +228 -0
  565. package/reglas/lenguajes/php/hooks.md +165 -0
  566. package/reglas/lenguajes/php/patrones.md +233 -0
  567. package/reglas/lenguajes/php/seguridad.md +186 -0
  568. package/reglas/lenguajes/php/testing.md +205 -0
  569. package/reglas/lenguajes/rust/estilo-codigo.md +207 -0
  570. package/reglas/lenguajes/rust/hooks.md +240 -0
  571. package/reglas/lenguajes/rust/patrones.md +250 -0
  572. package/reglas/lenguajes/rust/seguridad.md +221 -0
  573. package/reglas/lenguajes/rust/testing.md +194 -0
  574. package/reglas/lenguajes/swift/estilo-codigo.md +238 -0
  575. package/reglas/lenguajes/swift/hooks.md +257 -0
  576. package/reglas/lenguajes/swift/patrones.md +235 -0
  577. package/reglas/lenguajes/swift/seguridad.md +248 -0
  578. package/reglas/lenguajes/swift/testing.md +242 -0
  579. package/reglas/markitdown.md +60 -0
  580. package/reglas/memoria-consolidada.md +209 -0
  581. package/reglas/patrones.md +225 -0
  582. package/reglas/performance.md +195 -0
  583. package/reglas/pruebas.md +159 -0
  584. package/reglas/seguridad-agentes.md +351 -0
  585. package/reglas/seguridad.md +151 -0
  586. package/reglas/skills-estandar.md +373 -0
  587. package/reglas/testing.md +193 -0
  588. package/schemas/agent-contract.json +176 -0
  589. package/schemas/agent-frontmatter.schema.json +149 -0
  590. package/schemas/agent-message.schema.json +53 -0
  591. package/schemas/agent-output-implementacion.schema.json +85 -0
  592. package/schemas/agent-output-planificacion.schema.json +113 -0
  593. package/schemas/agent-output-review.schema.json +78 -0
  594. package/schemas/diary-entry.schema.json +80 -0
  595. package/schemas/hook-profiles.schema.json +39 -0
  596. package/schemas/hooks-config.schema.json +74 -0
  597. package/schemas/instinct.schema.json +115 -0
  598. package/schemas/modulos.schema.json +29 -0
  599. package/schemas/perfiles.schema.json +28 -0
  600. package/schemas/plugin.schema.json +64 -0
  601. package/schemas/skill-evals.schema.json +95 -0
  602. package/schemas/skill-frontmatter.schema.json +170 -0
  603. package/scripts/actualizar.js +145 -0
  604. package/scripts/audit-skills.sh +78 -0
  605. package/scripts/auditar-agentes-gaps.js +149 -0
  606. package/scripts/auditar-cobertura-frameworks.js +241 -0
  607. package/scripts/auditar-skills-gaps.js +206 -0
  608. package/scripts/bootstrap-instintos.js +259 -0
  609. package/scripts/check-update.js +109 -0
  610. package/scripts/comandos/agents.js +105 -0
  611. package/scripts/comandos/info.js +108 -0
  612. package/scripts/comandos/install-asistido.js +186 -0
  613. package/scripts/comandos/skills.js +211 -0
  614. package/scripts/configurar-branch-protection.js +418 -0
  615. package/scripts/daemon-swl.py +388 -0
  616. package/scripts/desinstalar.js +130 -0
  617. package/scripts/doctor.js +559 -0
  618. package/scripts/field-report.js +199 -0
  619. package/scripts/generar-inventario.js +317 -0
  620. package/scripts/inbox-tmux-inject.js +161 -0
  621. package/scripts/inferir-herramientas-permitidas.js +586 -0
  622. package/scripts/inicializar.js +133 -0
  623. package/scripts/instalador.js +1031 -0
  624. package/scripts/instalar-git-hook.js +122 -0
  625. package/scripts/lib/agp-frontmatter.js +222 -0
  626. package/scripts/lib/append-con-marcadores.js +199 -0
  627. package/scripts/lib/artefactos-python.js +43 -0
  628. package/scripts/lib/audit-query.js +221 -0
  629. package/scripts/lib/autostart-linux.js +347 -0
  630. package/scripts/lib/autostart-macos.js +360 -0
  631. package/scripts/lib/autostart-windows.js +307 -0
  632. package/scripts/lib/budget-enforcer.js +252 -0
  633. package/scripts/lib/claude-sessions.js +285 -0
  634. package/scripts/lib/configurar-ci.js +380 -0
  635. package/scripts/lib/console-span-exporter.js +92 -0
  636. package/scripts/lib/contadores-inventario.js +217 -0
  637. package/scripts/lib/dashboard-widgets.js +290 -0
  638. package/scripts/lib/detectar-runtime.js +279 -0
  639. package/scripts/lib/detectar-stack.js +187 -0
  640. package/scripts/lib/diary-entry.js +234 -0
  641. package/scripts/lib/drift-detector.js +545 -0
  642. package/scripts/lib/estado.js +124 -0
  643. package/scripts/lib/gestor-componentes.js +243 -0
  644. package/scripts/lib/gitignore-manifest.js +305 -0
  645. package/scripts/lib/graph-analyze.py +556 -0
  646. package/scripts/lib/graph-builder.py +485 -0
  647. package/scripts/lib/graph-cluster.py +259 -0
  648. package/scripts/lib/health-row.js +168 -0
  649. package/scripts/lib/hooks-settings.js +789 -0
  650. package/scripts/lib/manifiestos.js +138 -0
  651. package/scripts/lib/mc-client.js +137 -0
  652. package/scripts/lib/notificaciones-telegram.js +1107 -0
  653. package/scripts/lib/npm-version.js +261 -0
  654. package/scripts/lib/paquetes-conocidos.js +50 -0
  655. package/scripts/lib/preservar-usuario.js +586 -0
  656. package/scripts/lib/prompt-builder.js +264 -0
  657. package/scripts/lib/resolver-externo.js +332 -0
  658. package/scripts/lib/schedule-parser.js +305 -0
  659. package/scripts/lib/scoring-instintos.js +240 -0
  660. package/scripts/lib/seguridad.js +160 -0
  661. package/scripts/lib/selector-interactivo.js +152 -0
  662. package/scripts/lib/semantic-search.js +242 -0
  663. package/scripts/lib/skill-discovery.js +234 -0
  664. package/scripts/lib/skill-metrics.js +246 -0
  665. package/scripts/lib/skill-normalizer.js +112 -0
  666. package/scripts/lib/skills-hub.js +340 -0
  667. package/scripts/lib/span-schema.js +134 -0
  668. package/scripts/lib/tool-cost-analyzer.js +255 -0
  669. package/scripts/lib/tracing-processor-interface.js +286 -0
  670. package/scripts/lib/transformadores/base.js +80 -0
  671. package/scripts/lib/transformadores/claude.js +124 -0
  672. package/scripts/lib/transformadores/codex.js +115 -0
  673. package/scripts/lib/transformadores/copilot.js +106 -0
  674. package/scripts/lib/transformadores/gemini.js +74 -0
  675. package/scripts/lib/transformadores/index.js +35 -0
  676. package/scripts/lib/transformadores/opencode.js +75 -0
  677. package/scripts/lib/ui.js +259 -0
  678. package/scripts/limpiar-artefactos-python.js +131 -0
  679. package/scripts/mcp-orchestrator.py +386 -0
  680. package/scripts/mcp-pool-manager.py +352 -0
  681. package/scripts/mcp-telemetry.py +378 -0
  682. package/scripts/poblar-evolvable.js +226 -0
  683. package/scripts/publicar.js +287 -0
  684. package/scripts/reflect-skills.js +403 -0
  685. package/scripts/rotar-audit-logs.js +185 -0
  686. package/scripts/run-skill-evals.js +242 -0
  687. package/scripts/smoke-test.js +374 -0
  688. package/scripts/token-analysis.py +471 -0
  689. package/scripts/validar-manifest.js +195 -0
  690. package/scripts/validar-memoria.js +321 -0
  691. package/scripts/validar-tests-aislamiento.js +184 -0
  692. package/scripts/validar-tokens-test.js +208 -0
  693. package/scripts/validar.js +147 -0
  694. package/scripts/validate-markdown.py +339 -0
  695. package/scripts/validate-skills.py +385 -0
  696. package/scripts/vendor/claude-usage/README.md +116 -0
  697. package/scripts/vendor/claude-usage/cli.py +334 -0
  698. package/scripts/vendor/claude-usage/dashboard.py +795 -0
  699. package/scripts/vendor/claude-usage/scanner.py +467 -0
  700. package/scripts/vendor/markitdown/cli.py +194 -0
  701. package/scripts/verificar-evolucion.js +289 -0
  702. package/scripts/verificar-release.js +494 -0
@@ -0,0 +1,420 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Módulo: token-estimator.js
6
+ * Librería compartida para hooks de tracking de costos.
7
+ *
8
+ * Proporciona heurísticas de estimación de tokens por herramienta y cálculo
9
+ * de costo en USD basado en precios de Anthropic a marzo 2026.
10
+ *
11
+ * No se conecta a ningún servicio externo. Todos los cálculos son deterministas
12
+ * a partir del nombre de la herramienta y la etiqueta del modelo.
13
+ *
14
+ * Uso:
15
+ * const { estimarToolCall, formatearCosto } = require('./lib/token-estimator');
16
+ * const { tokensEstimados, costoEstimado } = estimarToolCall('Bash', 'sonnet');
17
+ * console.log(formatearCosto(costoEstimado)); // "$0.00"
18
+ */
19
+
20
+ // ---------------------------------------------------------------------------
21
+ // Heurísticas de tokens por herramienta
22
+ // ---------------------------------------------------------------------------
23
+
24
+ /**
25
+ * Tokens estimados de entrada por invocación de herramienta.
26
+ * Valores basados en uso típico (prompt + parámetros + respuesta promedio).
27
+ * Las herramientas de subagentes tienen valores más altos porque generan
28
+ * conversaciones completas anidadas.
29
+ *
30
+ * @type {Object.<string, number>}
31
+ */
32
+ const TOKENS_POR_HERRAMIENTA = {
33
+ Bash: 500,
34
+ Read: 300, // promedio; varía según tamaño del archivo
35
+ Write: 400,
36
+ Edit: 200,
37
+ Grep: 250,
38
+ Glob: 150,
39
+ Agent: 1500, // subagentes consumen conversaciones completas
40
+ Task: 1500, // alias de Agent en algunos runtimes
41
+ NotebookEdit: 300,
42
+ WebSearch: 600,
43
+ WebFetch: 800,
44
+ Skill: 100,
45
+ // Herramientas de Claude Code menos frecuentes
46
+ MultiEdit: 350,
47
+ TodoRead: 80,
48
+ TodoWrite: 120,
49
+ };
50
+
51
+ /** Tokens por defecto para herramientas no listadas. */
52
+ const TOKENS_DEFAULT = 300;
53
+
54
+ // ---------------------------------------------------------------------------
55
+ // Precios por modelo
56
+ // ---------------------------------------------------------------------------
57
+
58
+ /**
59
+ * Costo en USD por 1,000,000 tokens de entrada, por familia de modelo.
60
+ * Precios de Anthropic a marzo 2026.
61
+ *
62
+ * @type {Object.<string, number>}
63
+ */
64
+ const COSTO_POR_MILLON = {
65
+ opus: 15.0,
66
+ sonnet: 3.0,
67
+ haiku: 0.25,
68
+ };
69
+
70
+ /** Costo por millón de tokens para modelos no reconocidos (sonnet como fallback). */
71
+ const COSTO_DEFAULT_POR_MILLON = 3.0;
72
+
73
+ // ---------------------------------------------------------------------------
74
+ // Pricing canónico por modelo — precios oficiales Anthropic/OpenAI (abril 2026)
75
+ // Adoptado de Hermes Agent (agent/usage_pricing.py)
76
+ // ---------------------------------------------------------------------------
77
+
78
+ /**
79
+ * Tabla de precios canónicos por modelo con desglose completo:
80
+ * input, output, cache_read, cache_write.
81
+ *
82
+ * Fuente: documentación oficial de Anthropic y OpenAI (snapshot abril 2026).
83
+ * Tabla actualizada 2026-04-19 desde mission-control-main/src/lib/token-pricing.ts (MIT)
84
+ * para agregar aliases anthropic/* y modelos 4-5.
85
+ *
86
+ * @type {Object.<string, { input: number, output: number, cacheRead: number, cacheWrite: number }>}
87
+ */
88
+ const PRICING_CANONICO = {
89
+ // Anthropic — precios por 1M tokens (nombres canónicos)
90
+ 'claude-opus-4-7': { input: 15.00, output: 75.00, cacheRead: 1.50, cacheWrite: 18.75 },
91
+ 'claude-opus-4-6': { input: 15.00, output: 75.00, cacheRead: 1.50, cacheWrite: 18.75 },
92
+ 'claude-opus-4-5': { input: 15.00, output: 75.00, cacheRead: 1.50, cacheWrite: 18.75 },
93
+ 'claude-sonnet-4-6': { input: 3.00, output: 15.00, cacheRead: 0.30, cacheWrite: 3.75 },
94
+ 'claude-sonnet-4-5': { input: 3.00, output: 15.00, cacheRead: 0.30, cacheWrite: 3.75 },
95
+ 'claude-sonnet-4': { input: 3.00, output: 15.00, cacheRead: 0.30, cacheWrite: 3.75 },
96
+ 'claude-sonnet-4-20250514': { input: 3.00, output: 15.00, cacheRead: 0.30, cacheWrite: 3.75 },
97
+ 'claude-haiku-4-5': { input: 0.80, output: 4.00, cacheRead: 0.08, cacheWrite: 1.00 },
98
+ 'claude-3-5-haiku': { input: 0.80, output: 4.00, cacheRead: 0.08, cacheWrite: 1.00 },
99
+ // Aliases con prefijo anthropic/ (compatibilidad con mission-control y gateways)
100
+ 'anthropic/claude-opus-4-7': { input: 15.00, output: 75.00, cacheRead: 1.50, cacheWrite: 18.75 },
101
+ 'anthropic/claude-opus-4-6': { input: 15.00, output: 75.00, cacheRead: 1.50, cacheWrite: 18.75 },
102
+ 'anthropic/claude-opus-4-5': { input: 15.00, output: 75.00, cacheRead: 1.50, cacheWrite: 18.75 },
103
+ 'anthropic/claude-sonnet-4-6': { input: 3.00, output: 15.00, cacheRead: 0.30, cacheWrite: 3.75 },
104
+ 'anthropic/claude-sonnet-4-5': { input: 3.00, output: 15.00, cacheRead: 0.30, cacheWrite: 3.75 },
105
+ 'anthropic/claude-sonnet-4-20250514': { input: 3.00, output: 15.00, cacheRead: 0.30, cacheWrite: 3.75 },
106
+ 'anthropic/claude-haiku-4-5': { input: 0.80, output: 4.00, cacheRead: 0.08, cacheWrite: 1.00 },
107
+ 'anthropic/claude-3-5-haiku-latest': { input: 0.80, output: 4.00, cacheRead: 0.08, cacheWrite: 1.00 },
108
+ // Alias cortos — apuntan al modelo actual por defecto de cada familia
109
+ 'opus': { input: 15.00, output: 75.00, cacheRead: 1.50, cacheWrite: 18.75 },
110
+ 'sonnet': { input: 3.00, output: 15.00, cacheRead: 0.30, cacheWrite: 3.75 },
111
+ 'haiku': { input: 0.80, output: 4.00, cacheRead: 0.08, cacheWrite: 1.00 },
112
+ // OpenAI — referencia para multi-proveedor
113
+ 'gpt-4o': { input: 2.50, output: 10.00, cacheRead: 1.25, cacheWrite: 2.50 },
114
+ 'gpt-4o-mini': { input: 0.15, output: 0.60, cacheRead: 0.075, cacheWrite: 0.15 },
115
+ 'gpt-4.1': { input: 2.00, output: 8.00, cacheRead: 0.50, cacheWrite: 2.00 },
116
+ 'gpt-4.1-mini': { input: 0.40, output: 1.60, cacheRead: 0.10, cacheWrite: 0.40 },
117
+ };
118
+
119
+ /**
120
+ * Calcula el costo real de una invocación con desglose canónico.
121
+ *
122
+ * A diferencia de estimarToolCall() que usa heurísticas, esta función
123
+ * acepta conteos reales de tokens (input, output, cache) y calcula
124
+ * el costo exacto basado en la tabla de precios oficial.
125
+ *
126
+ * @param {object} uso
127
+ * @param {number} uso.inputTokens - Tokens de entrada (sin caché)
128
+ * @param {number} uso.outputTokens - Tokens de salida
129
+ * @param {number} [uso.cacheReadTokens=0] - Tokens leídos de caché
130
+ * @param {number} [uso.cacheWriteTokens=0] - Tokens escritos a caché
131
+ * @param {string} modelo - Identificador del modelo o etiqueta corta
132
+ * @returns {{ costoUsd: number, desglose: object, ahorroCache: number, modelo: string }}
133
+ */
134
+ function calcularCostoCanonicoTokens(uso, modelo) {
135
+ const {
136
+ inputTokens = 0,
137
+ outputTokens = 0,
138
+ cacheReadTokens = 0,
139
+ cacheWriteTokens = 0,
140
+ } = uso;
141
+
142
+ // Buscar pricing: primero exacto, luego por familia
143
+ let pricing = PRICING_CANONICO[modelo];
144
+ if (!pricing) {
145
+ const familia = inferirFamiliaModelo(modelo);
146
+ pricing = PRICING_CANONICO[familia] || PRICING_CANONICO['sonnet'];
147
+ }
148
+
149
+ const costoInput = (inputTokens / 1_000_000) * pricing.input;
150
+ const costoOutput = (outputTokens / 1_000_000) * pricing.output;
151
+ const costoCacheRead = (cacheReadTokens / 1_000_000) * pricing.cacheRead;
152
+ const costoCacheWrite = (cacheWriteTokens / 1_000_000) * pricing.cacheWrite;
153
+ const costoTotal = costoInput + costoOutput + costoCacheRead + costoCacheWrite;
154
+
155
+ // Ahorro por caché: cuánto habría costado si no hubiera caché
156
+ const costoSinCache = ((inputTokens + cacheReadTokens) / 1_000_000) * pricing.input;
157
+ const costoConCache = costoInput + costoCacheRead;
158
+ const ahorroCache = costoSinCache - costoConCache;
159
+
160
+ return {
161
+ costoUsd: Math.round(costoTotal * 1_000_000) / 1_000_000,
162
+ desglose: {
163
+ input: Math.round(costoInput * 1_000_000) / 1_000_000,
164
+ output: Math.round(costoOutput * 1_000_000) / 1_000_000,
165
+ cacheRead: Math.round(costoCacheRead * 1_000_000) / 1_000_000,
166
+ cacheWrite: Math.round(costoCacheWrite * 1_000_000) / 1_000_000,
167
+ },
168
+ ahorroCache: Math.round(ahorroCache * 1_000_000) / 1_000_000,
169
+ modelo,
170
+ };
171
+ }
172
+
173
+ // ---------------------------------------------------------------------------
174
+ // Funciones exportadas
175
+ // ---------------------------------------------------------------------------
176
+
177
+ /**
178
+ * Infiere la familia del modelo a partir del identificador completo.
179
+ *
180
+ * @param {string} modelId - Identificador completo, ej: "claude-sonnet-4-5-20251101"
181
+ * @returns {string} Etiqueta corta: 'opus' | 'sonnet' | 'haiku'
182
+ */
183
+ function inferirFamiliaModelo(modelId) {
184
+ const id = String(modelId || '').toLowerCase();
185
+ if (id.includes('opus')) return 'opus';
186
+ if (id.includes('haiku')) return 'haiku';
187
+ if (id.includes('sonnet')) return 'sonnet';
188
+ return 'sonnet'; // fallback conservador
189
+ }
190
+
191
+ /**
192
+ * Estima el consumo de tokens y el costo en USD para una invocación de herramienta.
193
+ *
194
+ * Los valores son estimaciones heurísticas, no mediciones exactas. El objetivo
195
+ * es dar una orden de magnitud útil para presupuesto y alertas, no facturación exacta.
196
+ *
197
+ * @param {string} toolName - Nombre de la herramienta invocada (ej: "Bash", "Read").
198
+ * @param {string} modelLabel - Etiqueta corta del modelo ('opus'|'sonnet'|'haiku')
199
+ * o identificador completo del modelo.
200
+ * @returns {{ tokensEstimados: number, costoEstimado: number }}
201
+ */
202
+ function estimarToolCall(toolName, modelLabel) {
203
+ const tokens = TOKENS_POR_HERRAMIENTA[toolName] ?? TOKENS_DEFAULT;
204
+
205
+ // Aceptar tanto etiqueta corta ('opus') como model_id completo
206
+ const familia = COSTO_POR_MILLON[modelLabel] !== undefined
207
+ ? modelLabel
208
+ : inferirFamiliaModelo(modelLabel);
209
+
210
+ const costoPorMillon = COSTO_POR_MILLON[familia] ?? COSTO_DEFAULT_POR_MILLON;
211
+
212
+ // Costo = tokens / 1_000_000 * costo_por_millon
213
+ const costoEstimado = (tokens / 1_000_000) * costoPorMillon;
214
+
215
+ return { tokensEstimados: tokens, costoEstimado };
216
+ }
217
+
218
+ /**
219
+ * Formatea un costo en USD con dos decimales para mostrar en reportes.
220
+ *
221
+ * @param {number} totalUsd - Costo total en dólares.
222
+ * @returns {string} Ejemplo: "$1.87" o "$0.03"
223
+ */
224
+ function formatearCosto(totalUsd) {
225
+ const valor = typeof totalUsd === 'number' && isFinite(totalUsd) ? totalUsd : 0;
226
+ return `$${valor.toFixed(2)}`;
227
+ }
228
+
229
+ /**
230
+ * Formatea un número grande con separadores de miles para lectura humana.
231
+ *
232
+ * @param {number} n - Número a formatear.
233
+ * @returns {string} Ejemplo: "125,000"
234
+ */
235
+ function formatearNumero(n) {
236
+ return Math.round(n).toLocaleString('en-US');
237
+ }
238
+
239
+ /**
240
+ * Devuelve los tokens estimados por defecto para herramientas no registradas.
241
+ * Útil para que el hook de tracking pueda mostrar el valor de fallback.
242
+ *
243
+ * @returns {number}
244
+ */
245
+ function tokensDefault() {
246
+ return TOKENS_DEFAULT;
247
+ }
248
+
249
+ // ---------------------------------------------------------------------------
250
+ // Tracking acumulativo por reintentos (patrón reask/retry)
251
+ // ---------------------------------------------------------------------------
252
+
253
+ /**
254
+ * Crea un acumulador de uso de tokens para rastrear consumo total
255
+ * incluyendo reintentos. Inspirado en el patrón update_total_usage
256
+ * de instructor (structured outputs).
257
+ *
258
+ * Uso:
259
+ * const tracker = crearTrackerReintentos('sonnet');
260
+ * tracker.registrarIntento({ tokensInput: 500, tokensOutput: 200 });
261
+ * tracker.registrarIntento({ tokensInput: 600, tokensOutput: 150 }); // reask
262
+ * const resumen = tracker.resumen();
263
+ * // { intentos: 2, tokensInputTotal: 1100, tokensOutputTotal: 350,
264
+ * // costoTotal: 0.0048, exitoso: false, desperdicio: 0.0015 }
265
+ *
266
+ * @param {string} modelLabel - Etiqueta del modelo ('opus'|'sonnet'|'haiku')
267
+ * @returns {object} Tracker con métodos registrarIntento, marcarExito, resumen
268
+ */
269
+ function crearTrackerReintentos(modelLabel) {
270
+ const familia = COSTO_POR_MILLON[modelLabel] !== undefined
271
+ ? modelLabel
272
+ : inferirFamiliaModelo(modelLabel);
273
+ const costoPorMillon = COSTO_POR_MILLON[familia] ?? COSTO_DEFAULT_POR_MILLON;
274
+
275
+ const intentos = [];
276
+ let exitoso = false;
277
+
278
+ return {
279
+ /**
280
+ * Registra un intento de llamada al LLM (exitoso o no).
281
+ *
282
+ * @param {{ tokensInput: number, tokensOutput: number }} uso
283
+ */
284
+ registrarIntento(uso) {
285
+ intentos.push({
286
+ numero: intentos.length + 1,
287
+ tokensInput: uso.tokensInput || 0,
288
+ tokensOutput: uso.tokensOutput || 0,
289
+ timestamp: Date.now(),
290
+ });
291
+ },
292
+
293
+ /** Marca la cadena de reintentos como exitosa (último intento pasó). */
294
+ marcarExito() { exitoso = true; },
295
+
296
+ /**
297
+ * Genera resumen del consumo acumulado incluyendo reintentos.
298
+ *
299
+ * @returns {{
300
+ * intentos: number,
301
+ * tokensInputTotal: number,
302
+ * tokensOutputTotal: number,
303
+ * tokensTotal: number,
304
+ * costoTotal: number,
305
+ * exitoso: boolean,
306
+ * desperdicio: number,
307
+ * descripcion: string
308
+ * }}
309
+ */
310
+ resumen() {
311
+ const tokensInputTotal = intentos.reduce((s, i) => s + i.tokensInput, 0);
312
+ const tokensOutputTotal = intentos.reduce((s, i) => s + i.tokensOutput, 0);
313
+ const tokensTotal = tokensInputTotal + tokensOutputTotal;
314
+ const costoTotal = (tokensTotal / 1_000_000) * costoPorMillon;
315
+
316
+ // Desperdicio = costo de intentos fallidos (todos menos el último si exitoso)
317
+ let desperdicio = 0;
318
+ if (exitoso && intentos.length > 1) {
319
+ const intentosFallidos = intentos.slice(0, -1);
320
+ const tokensFallidos = intentosFallidos.reduce(
321
+ (s, i) => s + i.tokensInput + i.tokensOutput, 0
322
+ );
323
+ desperdicio = (tokensFallidos / 1_000_000) * costoPorMillon;
324
+ } else if (!exitoso) {
325
+ desperdicio = costoTotal; // todo fue desperdicio
326
+ }
327
+
328
+ const numIntentos = intentos.length;
329
+ let descripcion;
330
+ if (numIntentos === 1) {
331
+ descripcion = 'Éxito en primer intento';
332
+ } else if (exitoso) {
333
+ descripcion = `Éxito en intento ${numIntentos} de ${numIntentos} — `
334
+ + `${formatearCosto(desperdicio)} en reintentos`;
335
+ } else {
336
+ descripcion = `Fallido después de ${numIntentos} intentos — `
337
+ + `${formatearCosto(costoTotal)} desperdiciados`;
338
+ }
339
+
340
+ return {
341
+ intentos: numIntentos,
342
+ tokensInputTotal,
343
+ tokensOutputTotal,
344
+ tokensTotal,
345
+ costoTotal: Math.round(costoTotal * 1_000_000) / 1_000_000,
346
+ exitoso,
347
+ desperdicio: Math.round(desperdicio * 1_000_000) / 1_000_000,
348
+ descripcion,
349
+ };
350
+ },
351
+ };
352
+ }
353
+
354
+ // ---------------------------------------------------------------------------
355
+ // ROI de reutilización de tokens
356
+ // ---------------------------------------------------------------------------
357
+
358
+ /**
359
+ * Calcula el ROI de reutilizacion de una observacion.
360
+ *
361
+ * discovery_tokens: tokens que costo descubrir esta informacion originalmente
362
+ * injection_tokens: tokens que cuesta inyectar el resumen en contexto
363
+ *
364
+ * ROI = (discovery_tokens - injection_tokens) / discovery_tokens * 100
365
+ *
366
+ * Ejemplo: descubrir un patron costo 5000 tokens, inyectarlo cuesta 50 tokens
367
+ * ROI = (5000 - 50) / 5000 * 100 = 99% de ahorro
368
+ *
369
+ * @param {number} discoveryTokens - Tokens originales de descubrimiento
370
+ * @param {number} injectionTokens - Tokens de inyeccion del resumen
371
+ * @returns {{ roi: number, ahorro: number, descripcion: string }}
372
+ */
373
+ function calcularROI(discoveryTokens, injectionTokens) {
374
+ if (discoveryTokens <= 0) return { roi: 0, ahorro: 0, descripcion: 'Sin datos de descubrimiento' };
375
+
376
+ const ahorro = discoveryTokens - injectionTokens;
377
+ const roi = (ahorro / discoveryTokens) * 100;
378
+
379
+ return {
380
+ roi: Math.round(roi * 10) / 10,
381
+ ahorro,
382
+ descripcion: roi > 80
383
+ ? `Excelente: ${roi.toFixed(1)}% de ahorro (${formatearNumero(ahorro)} tokens reutilizados)`
384
+ : roi > 50
385
+ ? `Bueno: ${roi.toFixed(1)}% de ahorro`
386
+ : `Moderado: ${roi.toFixed(1)}% de ahorro`,
387
+ };
388
+ }
389
+
390
+ /**
391
+ * Estima tokens de inyeccion para un bloque de contexto.
392
+ * Heuristica: ~4 caracteres por token en espanol.
393
+ *
394
+ * @param {string} texto
395
+ * @returns {number}
396
+ */
397
+ function estimarTokensTexto(texto) {
398
+ if (!texto) return 0;
399
+ return Math.ceil(texto.length / 4);
400
+ }
401
+
402
+ // ---------------------------------------------------------------------------
403
+ // Exports
404
+ // ---------------------------------------------------------------------------
405
+
406
+ module.exports = {
407
+ estimarToolCall,
408
+ formatearCosto,
409
+ formatearNumero,
410
+ inferirFamiliaModelo,
411
+ tokensDefault,
412
+ calcularROI,
413
+ estimarTokensTexto,
414
+ crearTrackerReintentos,
415
+ calcularCostoCanonicoTokens,
416
+ // Exponer tablas para tests y uso avanzado
417
+ TOKENS_POR_HERRAMIENTA,
418
+ COSTO_POR_MILLON,
419
+ PRICING_CANONICO,
420
+ };
@@ -0,0 +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
+ };