@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,246 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Hook: inyeccion-contexto.js
6
+ * Tipo: PostToolUse
7
+ *
8
+ * Inyecta automáticamente contexto de la sesión anterior al inicio
9
+ * de una nueva sesión. Inspirado en claude-mem's context injection.
10
+ *
11
+ * Comportamiento:
12
+ * - Solo actúa en la primera invocación de la sesión
13
+ * - Lee la sesión anterior desde .planning/sessions/latest.json
14
+ * - Genera un bloque de contexto con resumen, archivos, agentes
15
+ * - Lee instintos activos del proyecto (instintos/proyecto.yaml)
16
+ * - Escribe el contexto en stdout una sola vez
17
+ * - Marca como inyectado en bridge para no repetir
18
+ *
19
+ * Resultado:
20
+ * - Primera invocación con contexto previo: stdout con contexto
21
+ * - Invocaciones siguientes: exit 0 silencioso
22
+ * - Sin sesión previa: exit 0 silencioso
23
+ */
24
+
25
+ const fs = require('fs');
26
+ const path = require('path');
27
+ const os = require('os');
28
+
29
+ const { getOrBuildSnapshot } = require('./lib/context-builder');
30
+ const { sanitize: scanInjection } = require('./lib/prompt-injection-scanner');
31
+
32
+ // Detección de stack para sugerencia de skills
33
+ let _techDetector = null;
34
+ try { _techDetector = require('./lib/tech-skills-map'); } catch (_) {}
35
+
36
+ // Solo inyectar en la primera invocación
37
+ const MAX_INVOCACION_PARA_INYECTAR = 1;
38
+
39
+ function leerSesionAnterior(cwd) {
40
+ const latestPath = path.join(cwd, '.planning', 'sessions', 'latest.json');
41
+ if (!fs.existsSync(latestPath)) return null;
42
+
43
+ try {
44
+ const { path: sessionPath } = JSON.parse(fs.readFileSync(latestPath, 'utf8'));
45
+ if (!sessionPath || !fs.existsSync(sessionPath)) return null;
46
+ return JSON.parse(fs.readFileSync(sessionPath, 'utf8'));
47
+ } catch (_) {
48
+ return null;
49
+ }
50
+ }
51
+
52
+ function leerInstintosActivos(cwd) {
53
+ const instPath = path.join(cwd, 'instintos', 'proyecto.yaml');
54
+ if (!fs.existsSync(instPath)) return [];
55
+
56
+ try {
57
+ const contenido = fs.readFileSync(instPath, 'utf8');
58
+ // Parse simple YAML — extraer instintos con confidence > 0.7
59
+ const instintos = [];
60
+ const regex = /pattern:\s*"([^"]+)"[\s\S]*?confidence:\s*([\d.]+)/g;
61
+ let match;
62
+ while ((match = regex.exec(contenido)) !== null) {
63
+ const confidence = parseFloat(match[2]);
64
+ if (confidence >= 0.7) {
65
+ instintos.push({ pattern: match[1], confidence });
66
+ }
67
+ }
68
+ return instintos.sort((a, b) => b.confidence - a.confidence).slice(0, 5);
69
+ } catch (_) {
70
+ return [];
71
+ }
72
+ }
73
+
74
+ function leerContextoActivo(cwd) {
75
+ const ctxPath = path.join(cwd, '.planning', 'CONTEXTO.md');
76
+ if (!fs.existsSync(ctxPath)) return 'dev';
77
+
78
+ try {
79
+ const contenido = fs.readFileSync(ctxPath, 'utf8');
80
+ const match = contenido.match(/\*\*Modo\*\*:\s*(\w+)/);
81
+ return match ? match[1] : 'dev';
82
+ } catch (_) {
83
+ return 'dev';
84
+ }
85
+ }
86
+
87
+ function generarContexto(sesion, instintos, modo) {
88
+ const duracion = sesion.endTime
89
+ ? `${Math.round((new Date(sesion.endTime) - new Date(sesion.startTime)) / 60000)} min`
90
+ : 'en progreso';
91
+
92
+ const archivos = (sesion.filesChanged || []).slice(0, 10);
93
+ const agentes = (sesion.agentsInvoked || []).slice(0, 5);
94
+ const topTools = Object.entries(sesion.metricas?.herramientas || {})
95
+ .sort((a, b) => b[1] - a[1])
96
+ .slice(0, 3)
97
+ .map(([tool, count]) => `${tool}(${count})`)
98
+ .join(', ');
99
+
100
+ const lineas = [
101
+ '',
102
+ '--- CONTEXTO DE SESIÓN ANTERIOR (inyectado automáticamente) ---',
103
+ ` Sesión: ${sesion.id} | ${duracion} | Modo: ${modo}`,
104
+ ` Tool calls: ${sesion.toolCalls} | Costo: ~$${(sesion.costEstimated || 0).toFixed(2)}`,
105
+ ];
106
+
107
+ if (topTools) {
108
+ lineas.push(` Herramientas: ${topTools}`);
109
+ }
110
+
111
+ if (archivos.length > 0) {
112
+ lineas.push(` Archivos modificados: ${archivos.slice(0, 5).join(', ')}${archivos.length > 5 ? ` (+${archivos.length - 5} mas)` : ''}`);
113
+ }
114
+
115
+ if (agentes.length > 0) {
116
+ lineas.push(` Agentes: ${agentes.join(', ')}`);
117
+ }
118
+
119
+ if (sesion.summary) {
120
+ lineas.push(` Resumen: ${sesion.summary.slice(0, 200)}`);
121
+ }
122
+
123
+ if (instintos.length > 0) {
124
+ lineas.push(' Instintos activos:');
125
+ for (const inst of instintos) {
126
+ lineas.push(` - ${inst.pattern} (${(inst.confidence * 100).toFixed(0)}%)`);
127
+ }
128
+ }
129
+
130
+ lineas.push('--- FIN CONTEXTO ANTERIOR ---');
131
+ lineas.push('');
132
+
133
+ return lineas.join('\n');
134
+ }
135
+
136
+ /**
137
+ * Detecta el stack del proyecto y genera sugerencia de skills de comunidad
138
+ * si hay tecnologías con skills disponibles en skills.sh que SWL no cubre.
139
+ *
140
+ * @param {string} cwd
141
+ * @returns {string} Bloque de texto con sugerencia, o '' si no aplica.
142
+ */
143
+ function generarSugerenciaSkillsComunidad(cwd) {
144
+ if (!_techDetector) return '';
145
+
146
+ try {
147
+ const { skills, agentes } = _techDetector.sugerirSkills(cwd);
148
+ if (skills.length === 0) return '';
149
+
150
+ // Verificar si ya hay skills de comunidad instalados (.agents/skills/)
151
+ const agentsSkillsDir = path.join(cwd, '.agents', 'skills');
152
+ const yaTieneComunidad = fs.existsSync(agentsSkillsDir);
153
+
154
+ // Generar resumen de stack
155
+ const resumen = _techDetector.generarResumenStack(cwd);
156
+ if (!resumen) return '';
157
+
158
+ const lineas = [
159
+ '',
160
+ '--- STACK DETECTADO ---',
161
+ ` ${resumen.split('\n').slice(1).join('\n ')}`,
162
+ ];
163
+
164
+ if (!yaTieneComunidad) {
165
+ // Solo sugerir si no tiene skills de comunidad aun
166
+ lineas.push(' Skills de comunidad: ejecuta `npx autoskills --dry-run` para ver skills oficiales disponibles');
167
+ }
168
+
169
+ lineas.push('--- FIN STACK ---');
170
+ lineas.push('');
171
+
172
+ return lineas.join('\n');
173
+ } catch (_) {
174
+ return '';
175
+ }
176
+ }
177
+
178
+ // --- Entrypoint ---
179
+ let inputRaw = '';
180
+
181
+ process.stdin.on('data', chunk => {
182
+ inputRaw += chunk;
183
+ });
184
+
185
+ process.stdin.on('end', () => {
186
+ try {
187
+ const data = JSON.parse(inputRaw);
188
+ const sessionId = String(data.session_id || 'default');
189
+
190
+ // Leer bridge para verificar si ya inyectamos
191
+ const bridgePath = path.join(os.tmpdir(), `swl-ctx-${sessionId}.json`);
192
+ let bridge = {};
193
+ try {
194
+ bridge = JSON.parse(fs.readFileSync(bridgePath, 'utf8'));
195
+ } catch (_) {}
196
+
197
+ // Solo inyectar en la primera invocacion
198
+ const invocaciones = bridge.invocaciones || 0;
199
+ if (invocaciones > MAX_INVOCACION_PARA_INYECTAR || bridge.contextoInyectado) {
200
+ return;
201
+ }
202
+
203
+ const cwd = process.cwd();
204
+ const sesion = leerSesionAnterior(cwd);
205
+
206
+ // Solo inyectar si la sesion anterior tiene contenido util
207
+ if (!sesion || sesion.toolCalls < 5) {
208
+ return;
209
+ }
210
+
211
+ // No inyectar si la sesión anterior es la misma sesión activa
212
+ if (sesion.status === 'active') {
213
+ return;
214
+ }
215
+
216
+ const instintos = leerInstintosActivos(cwd);
217
+ const modo = leerContextoActivo(cwd);
218
+ let contexto = generarContexto(sesion, instintos, modo);
219
+
220
+ // Escanear contexto por inyecciones de prompt antes de inyectar
221
+ const scanResult = scanInjection(contexto, 'contexto-sesion-anterior');
222
+ if (scanResult.blocked) {
223
+ contexto = scanResult.content; // Placeholder de bloqueo
224
+ } else {
225
+ contexto = scanResult.content; // Original o con advertencia
226
+ }
227
+
228
+ // Marcar como inyectado en bridge
229
+ try {
230
+ bridge.contextoInyectado = true;
231
+ bridge.contextoTimestamp = new Date().toISOString();
232
+ fs.writeFileSync(bridgePath, JSON.stringify(bridge, null, 2), 'utf8');
233
+ } catch (_) {}
234
+
235
+ // Emitir contexto de sesión anterior
236
+ process.stdout.write(contexto);
237
+
238
+ // Emitir sugerencia de stack y skills de comunidad
239
+ const stackSugerencia = generarSugerenciaSkillsComunidad(cwd);
240
+ if (stackSugerencia) {
241
+ process.stdout.write(stackSugerencia);
242
+ }
243
+ } catch (err) {
244
+ // No escribir a stderr — Claude Code lo reporta como hook error
245
+ }
246
+ });
@@ -0,0 +1,214 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * abort-registry.js
5
+ *
6
+ * Registro de señales de abort para sesiones SWL. Portado del patrón
7
+ * InMemoryAbortRegistry de rowboat con adaptación a Claude Code hooks.
8
+ *
9
+ * Diferencia graceful vs force:
10
+ * graceful (abort) — Señal SIGTERM: el agente puede terminar limpiamente,
11
+ * cerrar conexiones MCP y escribir estado final.
12
+ * force (forceAbort) — Señal SIGKILL: termina inmediatamente, limpia todos
13
+ * los recursos sin esperar confirmaciones.
14
+ *
15
+ * Uso en hooks:
16
+ * const abortRegistry = require('./abort-registry');
17
+ *
18
+ * // En Stop hook o al detectar Ctrl+C:
19
+ * abortRegistry.abort(sessionId); // graceful
20
+ * abortRegistry.forceAbort(sessionId); // force
21
+ *
22
+ * // En tool execution:
23
+ * if (abortRegistry.isAborted(sessionId)) {
24
+ * // terminar limpiamente
25
+ * }
26
+ *
27
+ * // Obtener AbortSignal para pasarla a fetch/execFile:
28
+ * const signal = abortRegistry.getSignal(sessionId);
29
+ * await fetch(url, { signal });
30
+ *
31
+ * Zero-dependencies (solo AbortController nativo de Node.js 15+).
32
+ */
33
+
34
+ // ---------------------------------------------------------------------------
35
+ // Estado (singleton por proceso)
36
+ // ---------------------------------------------------------------------------
37
+
38
+ /** @type {Map<string, AbortController>} */
39
+ const controllers = new Map();
40
+
41
+ /** @type {Set<string>} sessionIds con force abort */
42
+ const forceAborted = new Set();
43
+
44
+ /** @type {Map<string, Array<() => void>>} callbacks de cleanup por sessionId */
45
+ const cleanupCallbacks = new Map();
46
+
47
+ // ---------------------------------------------------------------------------
48
+ // API pública
49
+ // ---------------------------------------------------------------------------
50
+
51
+ /**
52
+ * Obtiene (o crea) el AbortSignal asociado a una sesión.
53
+ * El signal se puede pasar a fetch(), execFile(), etc. para cancelación.
54
+ *
55
+ * @param {string} sessionId
56
+ * @returns {AbortSignal}
57
+ */
58
+ function getSignal(sessionId) {
59
+ if (!controllers.has(sessionId)) {
60
+ controllers.set(sessionId, new AbortController());
61
+ }
62
+ return controllers.get(sessionId).signal;
63
+ }
64
+
65
+ /**
66
+ * Abort graceful: señaliza que la sesión debe terminar limpiamente.
67
+ * Invoca todos los callbacks de cleanup registrados.
68
+ *
69
+ * @param {string} sessionId
70
+ */
71
+ function abort(sessionId) {
72
+ const ctrl = controllers.get(sessionId);
73
+ if (ctrl && !ctrl.signal.aborted) {
74
+ ctrl.abort();
75
+ }
76
+ // Invocar callbacks de cleanup registrados
77
+ const callbacks = cleanupCallbacks.get(sessionId) || [];
78
+ for (const cb of callbacks) {
79
+ try { cb(); } catch (_) { /* nunca propagar errores de cleanup */ }
80
+ }
81
+ cleanupCallbacks.delete(sessionId);
82
+ }
83
+
84
+ /**
85
+ * Abort forzado: termina inmediatamente sin esperar cleanup.
86
+ * Marca la sesión como force-aborted y llama a abort().
87
+ *
88
+ * @param {string} sessionId
89
+ */
90
+ function forceAbort(sessionId) {
91
+ forceAborted.add(sessionId);
92
+ abort(sessionId);
93
+ }
94
+
95
+ /**
96
+ * Verifica si una sesión ha sido abortada (graceful o force).
97
+ *
98
+ * @param {string} sessionId
99
+ * @returns {boolean}
100
+ */
101
+ function isAborted(sessionId) {
102
+ const ctrl = controllers.get(sessionId);
103
+ return (ctrl?.signal.aborted) || forceAborted.has(sessionId);
104
+ }
105
+
106
+ /**
107
+ * Verifica si una sesión fue abortada con force (SIGKILL semantics).
108
+ *
109
+ * @param {string} sessionId
110
+ * @returns {boolean}
111
+ */
112
+ function isForceAborted(sessionId) {
113
+ return forceAborted.has(sessionId);
114
+ }
115
+
116
+ /**
117
+ * Registra un callback de cleanup que se invocará al hacer abort().
118
+ * Útil para cerrar conexiones MCP, escribir estado final, etc.
119
+ *
120
+ * @param {string} sessionId
121
+ * @param {() => void} callback
122
+ * @returns {() => void} Función para desregistrar el callback.
123
+ */
124
+ function onAbort(sessionId, callback) {
125
+ if (!cleanupCallbacks.has(sessionId)) {
126
+ cleanupCallbacks.set(sessionId, []);
127
+ }
128
+ cleanupCallbacks.get(sessionId).push(callback);
129
+
130
+ return function unregister() {
131
+ const lista = cleanupCallbacks.get(sessionId);
132
+ if (!lista) return;
133
+ const idx = lista.indexOf(callback);
134
+ if (idx !== -1) lista.splice(idx, 1);
135
+ };
136
+ }
137
+
138
+ /**
139
+ * Limpia el estado de una sesión del registry (post-stop).
140
+ * Llamar desde el Stop hook después de procesar el resumen.
141
+ *
142
+ * @param {string} sessionId
143
+ */
144
+ function cleanup(sessionId) {
145
+ controllers.delete(sessionId);
146
+ forceAborted.delete(sessionId);
147
+ cleanupCallbacks.delete(sessionId);
148
+ }
149
+
150
+ /**
151
+ * Estado del registry (para diagnóstico).
152
+ *
153
+ * @returns {{ active: string[], forceAborted: string[] }}
154
+ */
155
+ function stats() {
156
+ return {
157
+ active: Array.from(controllers.keys()),
158
+ forceAborted: Array.from(forceAborted),
159
+ };
160
+ }
161
+
162
+ // ---------------------------------------------------------------------------
163
+ // Integración con señales del proceso (para hooks Stop)
164
+ // ---------------------------------------------------------------------------
165
+
166
+ let _sesionActiva = null;
167
+
168
+ /**
169
+ * Registra la sesión activa para manejo de señales del proceso.
170
+ * El Stop hook debe llamar esto al inicio para que SIGTERM/SIGINT
171
+ * disparen abort() automáticamente.
172
+ *
173
+ * @param {string} sessionId
174
+ */
175
+ function registrarSesionActiva(sessionId) {
176
+ _sesionActiva = sessionId;
177
+ }
178
+
179
+ // Instalar handlers de señal una sola vez
180
+ let _handlersInstalados = false;
181
+ function instalarHandlers() {
182
+ if (_handlersInstalados) return;
183
+ _handlersInstalados = true;
184
+
185
+ process.once('SIGTERM', () => {
186
+ if (_sesionActiva) abort(_sesionActiva);
187
+ });
188
+
189
+ // SIGINT (Ctrl+C) → primer hit graceful, segundo hit force
190
+ let _sigintCount = 0;
191
+ process.on('SIGINT', () => {
192
+ _sigintCount++;
193
+ if (!_sesionActiva) return;
194
+ if (_sigintCount === 1) {
195
+ abort(_sesionActiva);
196
+ } else {
197
+ forceAbort(_sesionActiva);
198
+ }
199
+ });
200
+ }
201
+
202
+ instalarHandlers();
203
+
204
+ module.exports = {
205
+ getSignal,
206
+ abort,
207
+ forceAbort,
208
+ isAborted,
209
+ isForceAborted,
210
+ onAbort,
211
+ cleanup,
212
+ stats,
213
+ registrarSesionActiva,
214
+ };
@@ -0,0 +1,210 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * agent-backend.js — Interfaz unificada de mensajes para ejecución de agentes.
5
+ *
6
+ * Portado del patrón Backend/Message/SessionResult de Multica.
7
+ * Define los tipos de mensaje que fluyen durante la ejecución de un agente SWL
8
+ * y proporciona factories para crear SessionResult estandarizados.
9
+ *
10
+ * Integra con event-bus.js para publicar eventos de agente en tiempo real.
11
+ * Zero-deps — solo módulos nativos de Node.js.
12
+ *
13
+ * Tipos de mensaje (alineados con Multica pkg/agent/agent.go):
14
+ * text — output textual del agente
15
+ * thinking — razonamiento interno (extended thinking)
16
+ * tool_use — herramienta siendo invocada
17
+ * tool_result — resultado de una herramienta
18
+ * status — cambio de estado del agente (running, paused, stopped)
19
+ * error — error durante la ejecución
20
+ * log — mensaje de log interno
21
+ *
22
+ * @module hooks/lib/agent-backend
23
+ */
24
+
25
+ // ---------------------------------------------------------------------------
26
+ // Tipos de mensaje
27
+ // ---------------------------------------------------------------------------
28
+
29
+ /** @enum {string} */
30
+ const MSG = {
31
+ TEXT: 'text',
32
+ THINKING: 'thinking',
33
+ TOOL_USE: 'tool_use',
34
+ TOOL_RESULT: 'tool_result',
35
+ STATUS: 'status',
36
+ ERROR: 'error',
37
+ LOG: 'log',
38
+ };
39
+
40
+ /** @enum {string} Estados posibles de un SessionResult */
41
+ const STATUS = {
42
+ SUCCESS: 'success',
43
+ FAILED: 'failed',
44
+ STOPPED: 'stopped',
45
+ };
46
+
47
+ // ---------------------------------------------------------------------------
48
+ // Factories
49
+ // ---------------------------------------------------------------------------
50
+
51
+ /**
52
+ * Crea un objeto Message estandarizado.
53
+ *
54
+ * @param {string} type - Uno de MSG.*
55
+ * @param {string} content - Contenido del mensaje
56
+ * @param {object} [meta] - Metadatos opcionales (toolName, toolInput, etc.)
57
+ * @returns {{ type, content, meta, timestamp }}
58
+ */
59
+ function crearMensaje(type, content, meta = {}) {
60
+ return {
61
+ type,
62
+ content: String(content || ''),
63
+ meta,
64
+ timestamp: new Date().toISOString(),
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Crea un SessionResult estandarizado al finalizar la ejecución de un agente.
70
+ *
71
+ * @param {object} opts
72
+ * @param {'success'|'failed'|'stopped'} [opts.status] - Estado final
73
+ * @param {string} [opts.error] - Mensaje de error si status='failed'
74
+ * @param {number} [opts.inputTokens] - Tokens de entrada consumidos
75
+ * @param {number} [opts.outputTokens] - Tokens de salida producidos
76
+ * @param {number} [opts.cacheRead] - Tokens leídos de caché
77
+ * @param {string} [opts.agente] - Nombre del agente
78
+ * @param {string} [opts.slice] - Nombre del slice ejecutado
79
+ * @param {object[]} [opts.mensajes] - Array de mensajes producidos durante la sesión
80
+ * @returns {object} SessionResult completo
81
+ */
82
+ function crearSessionResult(opts = {}) {
83
+ const inputTokens = Number(opts.inputTokens || 0);
84
+ const outputTokens = Number(opts.outputTokens || 0);
85
+ const cacheRead = Number(opts.cacheRead || 0);
86
+
87
+ return {
88
+ status: opts.status || STATUS.SUCCESS,
89
+ error: opts.error || null,
90
+ agente: opts.agente || 'desconocido',
91
+ slice: opts.slice || '',
92
+ uso: {
93
+ inputTokens,
94
+ outputTokens,
95
+ totalTokens: inputTokens + outputTokens,
96
+ cacheRead,
97
+ },
98
+ mensajes: opts.mensajes || [],
99
+ timestamp: new Date().toISOString(),
100
+ };
101
+ }
102
+
103
+ // ---------------------------------------------------------------------------
104
+ // Integración con event-bus
105
+ // ---------------------------------------------------------------------------
106
+
107
+ /**
108
+ * Publica un evento de agente al event-bus.
109
+ * Importación lazy para evitar dependencia circular.
110
+ *
111
+ * @param {string} tipo - 'agent:started' | 'agent:message' | 'agent:completed' | 'agent:failed'
112
+ * @param {object} payload - Datos del evento
113
+ * @param {string} [runId] - ID de la sesión (default: 'default')
114
+ */
115
+ function publicar(tipo, payload, runId = 'default') {
116
+ try {
117
+ const bus = require('./event-bus');
118
+ bus.publish({ type: tipo, runId, ...payload, timestamp: new Date().toISOString() });
119
+ } catch (_) {
120
+ // Silencioso — el bus puede no estar disponible en todos los contextos
121
+ }
122
+ }
123
+
124
+ // ---------------------------------------------------------------------------
125
+ // Helpers de ciclo de vida
126
+ // ---------------------------------------------------------------------------
127
+
128
+ /**
129
+ * Emite el evento de inicio de un agente.
130
+ *
131
+ * @param {string} agente - Nombre del agente SWL
132
+ * @param {string} slice - Slice que ejecuta
133
+ * @param {string} [runId] - ID de sesión
134
+ */
135
+ function emitirInicio(agente, slice, runId) {
136
+ publicar('agent:started', { agente, slice }, runId);
137
+ }
138
+
139
+ /**
140
+ * Emite un mensaje producido por el agente durante su ejecución.
141
+ *
142
+ * @param {object} mensaje - Objeto creado con crearMensaje()
143
+ * @param {string} agente - Nombre del agente
144
+ * @param {string} [runId]
145
+ */
146
+ function emitirMensaje(mensaje, agente, runId) {
147
+ publicar('agent:message', { mensaje, agente }, runId);
148
+ }
149
+
150
+ /**
151
+ * Emite el evento de finalización de un agente con su SessionResult.
152
+ *
153
+ * @param {object} sessionResult - Objeto creado con crearSessionResult()
154
+ * @param {string} [runId]
155
+ */
156
+ function emitirCompletado(sessionResult, runId) {
157
+ const tipo = sessionResult.status === STATUS.FAILED ? 'agent:failed' : 'agent:completed';
158
+ publicar(tipo, { resultado: sessionResult }, runId);
159
+ }
160
+
161
+ // ---------------------------------------------------------------------------
162
+ // Extracción de SessionResult desde payload de hook PostToolUse
163
+ // ---------------------------------------------------------------------------
164
+
165
+ /**
166
+ * Construye un SessionResult a partir del payload JSON que Claude Code envía
167
+ * al hook PostToolUse cuando la herramienta es 'Agent'.
168
+ *
169
+ * @param {object} hookPayload - Payload JSON del hook
170
+ * @returns {object} SessionResult
171
+ */
172
+ function desdePayloadHook(hookPayload) {
173
+ const input = hookPayload.tool_input || {};
174
+ const result = hookPayload.tool_result || {};
175
+ const agente = String(input.subagent_type || 'general-purpose');
176
+ const slice = String(input.description || '').slice(0, 80);
177
+
178
+ // Detectar error en el resultado
179
+ const resultStr = typeof result === 'string' ? result : JSON.stringify(result || '');
180
+ const hayError = /\berror\b|\bfailed\b|\bexception\b/i.test(resultStr);
181
+
182
+ // Extraer tokens del payload si el runtime los expone
183
+ const usage = hookPayload.usage || hookPayload.tool_result?.usage || {};
184
+
185
+ return crearSessionResult({
186
+ status: hayError ? STATUS.FAILED : STATUS.SUCCESS,
187
+ error: hayError ? resultStr.slice(0, 200) : null,
188
+ agente,
189
+ slice,
190
+ inputTokens: Number(usage.input_tokens || usage.inputTokens || 0),
191
+ outputTokens: Number(usage.output_tokens || usage.outputTokens || 0),
192
+ cacheRead: Number(usage.cache_read_tokens || 0),
193
+ });
194
+ }
195
+
196
+ // ---------------------------------------------------------------------------
197
+ // Exports
198
+ // ---------------------------------------------------------------------------
199
+
200
+ module.exports = {
201
+ MSG,
202
+ STATUS,
203
+ crearMensaje,
204
+ crearSessionResult,
205
+ publicar,
206
+ emitirInicio,
207
+ emitirMensaje,
208
+ emitirCompletado,
209
+ desdePayloadHook,
210
+ };