@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,222 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * lib/model-router.js
5
+ * Model Router — Sugiere modelo optimo por complejidad de tarea.
6
+ *
7
+ * No fuerza el modelo (Claude Code lo decide), pero el orquestador
8
+ * puede usar esta sugerencia al delegar a subagentes.
9
+ *
10
+ * API publica:
11
+ * sugerirModelo(descripcionTarea, contexto) → { modelo, complejidad, razon, costoRelativo }
12
+ * MODELOS → { HAIKU, SONNET, OPUS }
13
+ * COMPLEJIDAD → { trivial, estandar, compleja }
14
+ */
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Constantes de modelos
18
+ // ---------------------------------------------------------------------------
19
+
20
+ /**
21
+ * Identificadores canonicos de modelo por tier de capacidad.
22
+ */
23
+ const MODELOS = {
24
+ HAIKU: 'haiku',
25
+ SONNET: 'sonnet',
26
+ OPUS: 'opus',
27
+ };
28
+
29
+ // ---------------------------------------------------------------------------
30
+ // Tabla de complejidad
31
+ // ---------------------------------------------------------------------------
32
+
33
+ /**
34
+ * Mapa de nivel de complejidad a modelo recomendado e indicadores de deteccion.
35
+ *
36
+ * El orden de evaluacion es: compleja → trivial → estandar (fallback).
37
+ * Se usa el primer indicador que coincida en la descripcion de la tarea.
38
+ */
39
+ const COMPLEJIDAD = {
40
+ trivial: {
41
+ modelo: MODELOS.HAIKU,
42
+ indicadores: [
43
+ 'formateo',
44
+ 'typo',
45
+ 'renombrar',
46
+ 'import',
47
+ 'lint fix',
48
+ 'comment',
49
+ ],
50
+ },
51
+ estandar: {
52
+ modelo: MODELOS.SONNET,
53
+ indicadores: [
54
+ 'implementar',
55
+ 'test',
56
+ 'review',
57
+ 'refactor',
58
+ 'endpoint',
59
+ 'componente',
60
+ 'fix bug',
61
+ ],
62
+ },
63
+ compleja: {
64
+ modelo: MODELOS.OPUS,
65
+ indicadores: [
66
+ 'arquitectura',
67
+ 'migracion',
68
+ 'seguridad',
69
+ 'performance',
70
+ 'disenar',
71
+ 'planificar',
72
+ 'debugging profundo',
73
+ 'sistema completo',
74
+ ],
75
+ },
76
+ };
77
+
78
+ // ---------------------------------------------------------------------------
79
+ // Logica de evaluacion
80
+ // ---------------------------------------------------------------------------
81
+
82
+ /**
83
+ * Busca el primer indicador de una lista que aparezca en la descripcion.
84
+ *
85
+ * @param {string} descripcion - Texto en minusculas de la tarea.
86
+ * @param {string[]} indicadores - Lista de indicadores a buscar.
87
+ * @returns {string|null} El primer indicador encontrado, o null.
88
+ */
89
+ function primerIndicadorCoincidente(descripcion, indicadores) {
90
+ for (const indicador of indicadores) {
91
+ if (descripcion.includes(indicador)) return indicador;
92
+ }
93
+ return null;
94
+ }
95
+
96
+ // ---------------------------------------------------------------------------
97
+ // API publica
98
+ // ---------------------------------------------------------------------------
99
+
100
+ /**
101
+ * Evalua la complejidad de una tarea y sugiere el modelo optimo.
102
+ *
103
+ * Criterios de evaluacion (en orden de prioridad):
104
+ * 1. Contexto estructural: archivos afectados > 20 o lenguajes > 2 → opus
105
+ * 2. Indicadores de complejidad alta en la descripcion → opus
106
+ * 3. Indicadores de complejidad trivial + archivos <= 3 → haiku
107
+ * 4. Fallback: complejidad estandar → sonnet
108
+ *
109
+ * @param {string} descripcionTarea - Descripcion en lenguaje natural de la tarea.
110
+ * @param {object} [contexto={}] - Contexto adicional de la tarea.
111
+ * @param {number} [contexto.archivosAfectados=0] - Numero de archivos que tocara la tarea.
112
+ * @param {number} [contexto.lenguajesInvolucrados=1] - Numero de lenguajes de programacion.
113
+ * @returns {{ modelo: string, complejidad: string, razon: string, costoRelativo: string }}
114
+ * - modelo: Identificador del modelo sugerido ('haiku' | 'sonnet' | 'opus').
115
+ * - complejidad: Nivel detectado ('trivial' | 'estandar' | 'compleja').
116
+ * - razon: Justificacion legible de la sugerencia.
117
+ * - costoRelativo: Indicador visual de costo ('$' | '$$' | '$$$').
118
+ */
119
+ function sugerirModelo(descripcionTarea, contexto = {}) {
120
+ const desc = (descripcionTarea || '').toLowerCase();
121
+ const numArchivos = contexto.archivosAfectados || 0;
122
+ const numLenguajes = contexto.lenguajesInvolucrados || 1;
123
+
124
+ // Criterio 1 — Contexto estructural de alta complejidad
125
+ if (numArchivos > 20 || numLenguajes > 2) {
126
+ return {
127
+ modelo: MODELOS.OPUS,
128
+ complejidad: 'compleja',
129
+ razon: `${numArchivos} archivos afectados, ${numLenguajes} lenguajes involucrados`,
130
+ costoRelativo: '$$$',
131
+ };
132
+ }
133
+
134
+ // Criterio 2 — Indicadores de complejidad alta en la descripcion
135
+ const indicadorComplejo = primerIndicadorCoincidente(desc, COMPLEJIDAD.compleja.indicadores);
136
+ if (indicadorComplejo) {
137
+ return {
138
+ modelo: MODELOS.OPUS,
139
+ complejidad: 'compleja',
140
+ razon: `indicador de alta complejidad detectado: "${indicadorComplejo}"`,
141
+ costoRelativo: '$$$',
142
+ };
143
+ }
144
+
145
+ // Criterio 3 — Indicadores triviales con alcance reducido
146
+ const indicadorTrivial = primerIndicadorCoincidente(desc, COMPLEJIDAD.trivial.indicadores);
147
+ if (indicadorTrivial && numArchivos <= 3) {
148
+ return {
149
+ modelo: MODELOS.HAIKU,
150
+ complejidad: 'trivial',
151
+ razon: `tarea de bajo alcance: indicador "${indicadorTrivial}", ${numArchivos} archivos`,
152
+ costoRelativo: '$',
153
+ };
154
+ }
155
+
156
+ // Criterio 4 — Fallback: complejidad estandar
157
+ return {
158
+ modelo: MODELOS.SONNET,
159
+ complejidad: 'estandar',
160
+ razon: 'complejidad estandar — ningun indicador de nivel trivial o complejo detectado',
161
+ costoRelativo: '$$',
162
+ };
163
+ }
164
+
165
+ // ---------------------------------------------------------------------------
166
+ // Proveedores — estructura extensible para routing multi-proveedor
167
+ // ---------------------------------------------------------------------------
168
+
169
+ /**
170
+ * Registro de proveedores de LLM.
171
+ *
172
+ * Actualmente swl-ses es mono-proveedor (Anthropic). Esta estructura
173
+ * permite evolucionar a multi-proveedor sin cambiar la API publica.
174
+ *
175
+ * Patron inspirado en instructor.from_provider() — interfaz unificada
176
+ * que abstrae el proveedor detrás de un string "proveedor/modelo".
177
+ *
178
+ * Para activar: setear PROVIDER en el contexto de sugerirModelo.
179
+ * Sin PROVIDER, el comportamiento es idéntico al actual (Anthropic).
180
+ */
181
+ const PROVEEDORES = {
182
+ anthropic: {
183
+ nombre: 'Anthropic',
184
+ modelos: {
185
+ opus: 'claude-opus-4-7',
186
+ sonnet: 'claude-sonnet-4-6',
187
+ haiku: 'claude-haiku-4-5-20251001',
188
+ },
189
+ costoPorMillon: { opus: 15.0, sonnet: 3.0, haiku: 0.25 },
190
+ default: true,
191
+ },
192
+ // Proveedores futuros — descomentar al necesitar:
193
+ // openai: {
194
+ // nombre: 'OpenAI',
195
+ // modelos: { alto: 'gpt-4o', medio: 'gpt-4o-mini', bajo: 'gpt-3.5-turbo' },
196
+ // costoPorMillon: { alto: 5.0, medio: 0.15, bajo: 0.05 },
197
+ // },
198
+ // google: {
199
+ // nombre: 'Google',
200
+ // modelos: { alto: 'gemini-pro', medio: 'gemini-flash', bajo: 'gemini-flash-lite' },
201
+ // costoPorMillon: { alto: 3.5, medio: 0.35, bajo: 0.075 },
202
+ // },
203
+ };
204
+
205
+ /**
206
+ * Resuelve el identificador completo del modelo para un proveedor dado.
207
+ *
208
+ * @param {string} tier - Tier del modelo ('opus'|'sonnet'|'haiku' para Anthropic).
209
+ * @param {string} [proveedor='anthropic'] - Identificador del proveedor.
210
+ * @returns {string} Identificador completo del modelo (ej: 'claude-sonnet-4-6').
211
+ */
212
+ function resolverModeloCompleto(tier, proveedor = 'anthropic') {
213
+ const prov = PROVEEDORES[proveedor];
214
+ if (!prov) return tier; // fallback: devolver tier tal cual
215
+ return prov.modelos[tier] || tier;
216
+ }
217
+
218
+ // ---------------------------------------------------------------------------
219
+ // Exportaciones
220
+ // ---------------------------------------------------------------------------
221
+
222
+ module.exports = { sugerirModelo, resolverModeloCompleto, MODELOS, COMPLEJIDAD, PROVEEDORES };
@@ -0,0 +1,324 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * normalize-error.js — Normalización de errores cross-contexto.
5
+ *
6
+ * Inspirado en tools/error-extractors.ts de Sim Studio (simstudioai/sim).
7
+ * Convierte errores de distintos orígenes en una estructura uniforme que
8
+ * facilita el logging, reporting y decisiones de recuperación en hooks y agentes.
9
+ *
10
+ * Estructura de error normalizado (NormalizedError):
11
+ * {
12
+ * codigo: string — clave semántica (RATE_LIMIT, NOT_FOUND, TIMEOUT, ...)
13
+ * mensaje: string — descripción legible en español
14
+ * categoria: string — 'api' | 'sistema' | 'hook' | 'agente' | 'herramienta' | 'desconocido'
15
+ * severidad: string — 'warning' | 'error' | 'fatal'
16
+ * recuperable: boolean — si se puede reintentar o hay workaround
17
+ * fuente: string — dónde se originó (nombre de módulo/hook)
18
+ * detalle: string — mensaje original del error
19
+ * sugerencia: string|null — acción recomendada al usuario
20
+ * }
21
+ *
22
+ * Uso:
23
+ * const { normalizar, formatear } = require('./lib/normalize-error');
24
+ * try { ... }
25
+ * catch (e) {
26
+ * const err = normalizar(e, { fuente: 'mi-hook' });
27
+ * process.stderr.write(formatear(err) + '\n');
28
+ * }
29
+ *
30
+ * Zero-dependencies: solo usa Node.js built-ins.
31
+ *
32
+ * @module hooks/lib/normalize-error
33
+ */
34
+
35
+ // ---------------------------------------------------------------------------
36
+ // Tabla de patrones conocidos
37
+ // ---------------------------------------------------------------------------
38
+
39
+ /**
40
+ * Patrones de mensajes de error → código normalizado.
41
+ * Se evalúan en orden; el primero que coincida gana.
42
+ *
43
+ * @type {Array<PatronError>}
44
+ *
45
+ * @typedef {object} PatronError
46
+ * @property {RegExp} patron — Expresión regular contra el mensaje de error
47
+ * @property {string} codigo — Código semántico del error
48
+ * @property {string} categoria — Categoría del error
49
+ * @property {string} severidad — Nivel de severidad
50
+ * @property {boolean} recuperable — Si el error permite reintento
51
+ * @property {string|null} sugerencia — Acción recomendada
52
+ */
53
+ const PATRONES = [
54
+ // Claude API — rate limiting
55
+ {
56
+ patron: /rate.?limit|429|too many requests/i,
57
+ codigo: 'RATE_LIMIT',
58
+ categoria: 'api',
59
+ severidad: 'warning',
60
+ recuperable: true,
61
+ sugerencia: 'Esperar 60 segundos y reintentar. Considerar reducir la concurrencia de agentes.',
62
+ },
63
+ // Claude API — sobrecargada
64
+ {
65
+ patron: /overloaded|529|service.?unavailable/i,
66
+ codigo: 'API_OVERLOADED',
67
+ categoria: 'api',
68
+ severidad: 'warning',
69
+ recuperable: true,
70
+ sugerencia: 'La API de Anthropic está sobrecargada. Reintentar en 30-60 segundos.',
71
+ },
72
+ // Claude API — ventana de contexto
73
+ {
74
+ patron: /context.?window|max.?token|too.?long|token.?limit|prompt.?too.?long/i,
75
+ codigo: 'CONTEXT_OVERFLOW',
76
+ categoria: 'api',
77
+ severidad: 'error',
78
+ recuperable: true,
79
+ sugerencia: 'Ejecutar /swl:compactar para reducir el contexto antes de continuar.',
80
+ },
81
+ // Claude API — autenticación
82
+ {
83
+ patron: /401|unauthorized|invalid.?api.?key|authentication.?failed/i,
84
+ codigo: 'AUTH_FAILED',
85
+ categoria: 'api',
86
+ severidad: 'fatal',
87
+ recuperable: false,
88
+ sugerencia: 'Verificar ANTHROPIC_API_KEY en el entorno. Ejecutar `claude login` si es necesario.',
89
+ },
90
+ // Claude API — forbidden
91
+ {
92
+ patron: /403|forbidden|access.?denied/i,
93
+ codigo: 'FORBIDDEN',
94
+ categoria: 'api',
95
+ severidad: 'fatal',
96
+ recuperable: false,
97
+ sugerencia: 'La cuenta no tiene acceso a este modelo o recurso. Verificar plan y permisos.',
98
+ },
99
+ // Red — conexión
100
+ {
101
+ patron: /ECONNREFUSED|ECONNRESET|ENOTFOUND|socket.?hang.?up|network.?error/i,
102
+ codigo: 'NETWORK_ERROR',
103
+ categoria: 'sistema',
104
+ severidad: 'error',
105
+ recuperable: true,
106
+ sugerencia: 'Verificar conectividad de red y que la API de Anthropic es accesible.',
107
+ },
108
+ // Red — timeout
109
+ {
110
+ patron: /ETIMEDOUT|timed.?out|timeout/i,
111
+ codigo: 'TIMEOUT',
112
+ categoria: 'sistema',
113
+ severidad: 'error',
114
+ recuperable: true,
115
+ sugerencia: 'La operación tardó demasiado. Reintentar con un timeout mayor o simplificar la tarea.',
116
+ },
117
+ // Sistema — archivo no encontrado
118
+ {
119
+ patron: /ENOENT|no such file|cannot find.+module|MODULE_NOT_FOUND/i,
120
+ codigo: 'NOT_FOUND',
121
+ categoria: 'sistema',
122
+ severidad: 'error',
123
+ recuperable: false,
124
+ sugerencia: 'Verificar que el archivo o módulo existe en la ruta indicada.',
125
+ },
126
+ // Sistema — permisos
127
+ {
128
+ patron: /EACCES|EPERM|permission.?denied/i,
129
+ codigo: 'PERMISSION_DENIED',
130
+ categoria: 'sistema',
131
+ severidad: 'error',
132
+ recuperable: false,
133
+ sugerencia: 'Verificar permisos del archivo o directorio. Puede requerir privilegios elevados.',
134
+ },
135
+ // JSON — parseo
136
+ {
137
+ patron: /unexpected.?token|JSON.?parse|invalid.?json|not.?valid.?json/i,
138
+ codigo: 'PARSE_ERROR',
139
+ categoria: 'herramienta',
140
+ severidad: 'error',
141
+ recuperable: false,
142
+ sugerencia: 'El output recibido no es JSON válido. Verificar la fuente de datos.',
143
+ },
144
+ // Proceso — exit code no-cero
145
+ {
146
+ patron: /exit.?code\s+[1-9]|non-?zero.?exit|exited.?with\s+[1-9]/i,
147
+ codigo: 'PROCESS_ERROR',
148
+ categoria: 'hook',
149
+ severidad: 'error',
150
+ recuperable: false,
151
+ sugerencia: 'El comando terminó con error. Ver el output de stderr para detalles.',
152
+ },
153
+ // Agente — fallo durante ejecución
154
+ {
155
+ patron: /agent.+fail|subagent.+error|agent.+error/i,
156
+ codigo: 'AGENT_FAILED',
157
+ categoria: 'agente',
158
+ severidad: 'error',
159
+ recuperable: true,
160
+ sugerencia: 'El subagente falló. Revisar el prompt y los parámetros de invocación.',
161
+ },
162
+ // Seguridad — inyección detectada
163
+ {
164
+ patron: /injection|prompt.?inject|malicious.?content/i,
165
+ codigo: 'SECURITY_BLOCKED',
166
+ categoria: 'hook',
167
+ severidad: 'fatal',
168
+ recuperable: false,
169
+ sugerencia: 'El sistema detectó un posible intento de inyección. Revisar el input antes de continuar.',
170
+ },
171
+ // Build — error de compilación
172
+ {
173
+ patron: /SyntaxError|CompileError|build.?failed|compilation.?error/i,
174
+ codigo: 'BUILD_ERROR',
175
+ categoria: 'herramienta',
176
+ severidad: 'error',
177
+ recuperable: false,
178
+ sugerencia: 'Error de compilación. Revisar la sintaxis del archivo afectado.',
179
+ },
180
+ ];
181
+
182
+ // ---------------------------------------------------------------------------
183
+ // Descripciones legibles
184
+ // ---------------------------------------------------------------------------
185
+
186
+ const DESCRIPCIONES = {
187
+ RATE_LIMIT: 'Límite de velocidad de la API alcanzado',
188
+ API_OVERLOADED: 'API temporalmente sobrecargada',
189
+ CONTEXT_OVERFLOW: 'Ventana de contexto saturada',
190
+ AUTH_FAILED: 'Autenticación fallida',
191
+ FORBIDDEN: 'Acceso prohibido al recurso',
192
+ NETWORK_ERROR: 'Error de red o conexión',
193
+ TIMEOUT: 'Tiempo de espera agotado',
194
+ NOT_FOUND: 'Recurso o módulo no encontrado',
195
+ PERMISSION_DENIED: 'Permiso denegado',
196
+ PARSE_ERROR: 'Error al parsear datos JSON',
197
+ PROCESS_ERROR: 'Proceso terminó con código de error',
198
+ AGENT_FAILED: 'El agente falló durante la ejecución',
199
+ SECURITY_BLOCKED: 'Operación bloqueada por seguridad',
200
+ BUILD_ERROR: 'Error de compilación o sintaxis',
201
+ UNKNOWN_ERROR: 'Error no reconocido',
202
+ };
203
+
204
+ // ---------------------------------------------------------------------------
205
+ // API pública
206
+ // ---------------------------------------------------------------------------
207
+
208
+ /**
209
+ * Extrae el mensaje de texto de cualquier tipo de error.
210
+ *
211
+ * @param {unknown} error
212
+ * @returns {string}
213
+ */
214
+ function extraerMensaje(error) {
215
+ if (error === null || error === undefined) return '(error sin mensaje)';
216
+ if (typeof error === 'string') return error;
217
+ if (error instanceof Error) return error.message;
218
+ if (typeof error === 'object') {
219
+ return String(error.message || error.msg || error.error || JSON.stringify(error).slice(0, 500));
220
+ }
221
+ return String(error);
222
+ }
223
+
224
+ /**
225
+ * Normaliza cualquier error en la estructura uniforme de swl-ses.
226
+ *
227
+ * @param {unknown} error — El error a normalizar (Error, string, objeto, etc.)
228
+ * @param {object} [opts]
229
+ * @param {string} [opts.fuente='desconocida'] — Módulo o hook donde ocurrió
230
+ * @returns {NormalizedError}
231
+ *
232
+ * @typedef {object} NormalizedError
233
+ * @property {string} codigo
234
+ * @property {string} mensaje
235
+ * @property {string} categoria
236
+ * @property {string} severidad
237
+ * @property {boolean} recuperable
238
+ * @property {string} fuente
239
+ * @property {string} detalle
240
+ * @property {string|null} sugerencia
241
+ */
242
+ function normalizar(error, opts = {}) {
243
+ const fuente = String(opts.fuente || 'desconocida');
244
+ const detalle = extraerMensaje(error);
245
+
246
+ // Buscar primer patrón coincidente
247
+ for (const p of PATRONES) {
248
+ if (p.patron.test(detalle)) {
249
+ return {
250
+ codigo: p.codigo,
251
+ mensaje: DESCRIPCIONES[p.codigo] || p.codigo,
252
+ categoria: p.categoria,
253
+ severidad: p.severidad,
254
+ recuperable: p.recuperable,
255
+ fuente,
256
+ detalle,
257
+ sugerencia: p.sugerencia,
258
+ };
259
+ }
260
+ }
261
+
262
+ // Fallback — error desconocido
263
+ return {
264
+ codigo: 'UNKNOWN_ERROR',
265
+ mensaje: DESCRIPCIONES.UNKNOWN_ERROR,
266
+ categoria: 'desconocido',
267
+ severidad: 'error',
268
+ recuperable: false,
269
+ fuente,
270
+ detalle,
271
+ sugerencia: null,
272
+ };
273
+ }
274
+
275
+ /**
276
+ * Formatea un error normalizado como texto legible para logs o mensajes al usuario.
277
+ * Produce una línea principal + líneas de detalle y sugerencia si aplica.
278
+ *
279
+ * @param {NormalizedError} err
280
+ * @returns {string}
281
+ */
282
+ function formatear(err) {
283
+ const iconos = { warning: '⚠', error: '✗', fatal: '✗✗' };
284
+ const icono = iconos[err.severidad] || '?';
285
+ const recuperable = err.recuperable ? ' (recuperable)' : '';
286
+
287
+ let txt = `${icono} [${err.codigo}] ${err.mensaje}${recuperable}`;
288
+
289
+ if (err.fuente && err.fuente !== 'desconocida') {
290
+ txt += ` — ${err.fuente}`;
291
+ }
292
+ if (err.detalle && err.detalle !== err.mensaje && err.detalle !== '(error sin mensaje)') {
293
+ txt += `\n Detalle: ${err.detalle.slice(0, 300)}`;
294
+ }
295
+ if (err.sugerencia) {
296
+ txt += `\n Sugerencia: ${err.sugerencia}`;
297
+ }
298
+
299
+ return txt;
300
+ }
301
+
302
+ /**
303
+ * Convierte a JSON compacto para logging estructurado en JSONL.
304
+ *
305
+ * @param {NormalizedError} err
306
+ * @returns {string} Una línea JSON
307
+ */
308
+ function formatearJSON(err) {
309
+ return JSON.stringify({
310
+ ts: new Date().toISOString(),
311
+ codigo: err.codigo,
312
+ categoria: err.categoria,
313
+ severidad: err.severidad,
314
+ recuperable: err.recuperable,
315
+ fuente: err.fuente,
316
+ detalle: err.detalle?.slice(0, 200),
317
+ });
318
+ }
319
+
320
+ // ---------------------------------------------------------------------------
321
+ // Exports
322
+ // ---------------------------------------------------------------------------
323
+
324
+ module.exports = { normalizar, extraerMensaje, formatear, formatearJSON };
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Normalize Input — Normalización anti-bypass para detección de seguridad.
5
+ *
6
+ * Previene evasión de patrones de detección mediante:
7
+ * - Caracteres Unicode fullwidth (A→A, 0→0)
8
+ * - Secuencias ANSI escape (colores, movimiento de cursor)
9
+ * - Null bytes (\x00)
10
+ * - Caracteres de control (excepto \n y \t)
11
+ *
12
+ * Patrón adoptado de Hermes Agent (approval.py → _normalize_command_for_detection).
13
+ *
14
+ * @module hooks/lib/normalize-input
15
+ */
16
+
17
+ /**
18
+ * Regex para secuencias ANSI escape.
19
+ *
20
+ * Cubre:
21
+ * - CSI (Control Sequence Introducer): \x1B[ ... letra
22
+ * - OSC (Operating System Command): \x1B] ... (BEL o ST)
23
+ * - DCS (Device Control String): \x1BP ... ST
24
+ * - 8-bit C1 control codes: \x80-\x9F
25
+ */
26
+ const ANSI_ESCAPE_RE = /\x1B\[[0-9;]*[a-zA-Z]|\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)|\x1BP[^\x1B]*\x1B\\|[\x80-\x9F]/g;
27
+
28
+ /**
29
+ * Regex para caracteres de control (excepto newline \x0A y tab \x09).
30
+ */
31
+ const CONTROL_CHARS_RE = /[\x01-\x08\x0B\x0C\x0E-\x1F\x7F]/g;
32
+
33
+ /**
34
+ * Normaliza texto para detección de patrones de seguridad.
35
+ *
36
+ * Debe aplicarse ANTES de evaluar cualquier regex de detección
37
+ * (secretos, credenciales, comandos peligrosos, inyecciones de prompt).
38
+ *
39
+ * @param {string} text - Texto a normalizar.
40
+ * @returns {string} Texto normalizado.
41
+ */
42
+ function normalizeForDetection(text) {
43
+ if (!text || typeof text !== 'string') return '';
44
+
45
+ let normalized = text;
46
+
47
+ // 1. Strip null bytes (técnica de bypass clásica)
48
+ normalized = normalized.replace(/\x00/g, '');
49
+
50
+ // 2. Strip ANSI escape sequences (ocultan contenido en terminales)
51
+ normalized = normalized.replace(ANSI_ESCAPE_RE, '');
52
+
53
+ // 3. Unicode NFKC normalization
54
+ // - Fullwidth Latin → ASCII (A→A, 0→0, rm→rm)
55
+ // - Halfwidth Katakana → regular
56
+ // - Compatibility decomposition + canonical composition
57
+ normalized = normalized.normalize('NFKC');
58
+
59
+ // 4. Strip caracteres de control (excepto newline y tab)
60
+ normalized = normalized.replace(CONTROL_CHARS_RE, '');
61
+
62
+ return normalized;
63
+ }
64
+
65
+ module.exports = { normalizeForDetection };