@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,511 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Hook: calidad-typescript.js
6
+ * Tipo: PreToolUse (aplica a: Bash — comandos git commit)
7
+ *
8
+ * Verifica calidad TypeScript en archivos staged ANTES de que Claude Code
9
+ * ejecute un `git commit`. Complementa a calidad-pre-commit.js con
10
+ * verificaciones específicas del sistema de tipos de TypeScript.
11
+ *
12
+ * Verificaciones (sin dependencias externas):
13
+ * 1. Nuevas introducciones de `any` explícito en el diff
14
+ * 2. @ts-ignore sin comentario de justificación en la línea anterior
15
+ * 3. `as unknown as T` (double cast para evadir el type system)
16
+ * 4. Funciones async sin tipo de retorno cuando el retorno no es void/any
17
+ * 5. Errores de tsc --noEmit si el proyecto tiene tsconfig.json
18
+ *
19
+ * Verificaciones con ts-morph (si está instalado en el proyecto):
20
+ * 6. Imports no usados (más precisos que grep)
21
+ * 7. Variables declaradas con `var` en archivos TypeScript
22
+ *
23
+ * Resultado:
24
+ * - Violaciones CRÍTICAS → stdout + exit code 2 (bloquea el commit)
25
+ * - Advertencias → stdout + exit code 0 (no bloquea)
26
+ * - Sin violaciones → sin output, exit natural
27
+ * - Error interno → sin output (nunca bloquear por fallo del hook)
28
+ *
29
+ * Escenario C — integración con ts-morph:
30
+ * Si el proyecto tiene ts-morph instalado (`node_modules/ts-morph`),
31
+ * este hook lo usa automáticamente para análisis más profundo.
32
+ * Si no está disponible, las verificaciones básicas de grep siguen funcionando.
33
+ *
34
+ * Performance:
35
+ * Usa hooks/lib/performance-marks.js para medir tiempos de cada verificación.
36
+ * El reporte de tiempos se incluye en el output cuando hay violaciones.
37
+ *
38
+ * @module hooks/calidad-typescript
39
+ */
40
+
41
+ const fs = require('fs');
42
+ const path = require('path');
43
+ const { execSync } = require('child_process');
44
+ const perf = require('./lib/performance-marks');
45
+ const { normalizeForDetection } = require('./lib/normalize-input');
46
+
47
+ // ---------------------------------------------------------------------------
48
+ // Configuración
49
+ // ---------------------------------------------------------------------------
50
+
51
+ const CWD = process.cwd();
52
+
53
+ /**
54
+ * Directorios excluidos de verificación.
55
+ * Los archivos en estos paths no se verifican aunque estén en el diff.
56
+ */
57
+ const EXCLUIR_DIRS = [
58
+ 'node_modules', '.next', 'dist', 'build', 'out', 'coverage',
59
+ '.planning', 'temp', '.cache',
60
+ ];
61
+
62
+ // ---------------------------------------------------------------------------
63
+ // Utilidades
64
+ // ---------------------------------------------------------------------------
65
+
66
+ /**
67
+ * Verifica si el comando actual es un git commit.
68
+ * @param {string} cmd
69
+ * @returns {boolean}
70
+ */
71
+ function esGitCommit(cmd) {
72
+ return /\bgit\s+commit\b/.test(cmd);
73
+ }
74
+
75
+ /**
76
+ * Obtiene los archivos TypeScript staged para commit.
77
+ * @returns {string[]} rutas de archivos .ts/.tsx staged
78
+ */
79
+ function obtenerArchivosTSStagged() {
80
+ try {
81
+ const out = execSync('git diff --cached --name-only --diff-filter=ACMR', {
82
+ cwd: CWD, encoding: 'utf8', stdio: ['pipe','pipe','pipe'],
83
+ });
84
+ return out.trim().split('\n')
85
+ .filter(f => f && (f.endsWith('.ts') || f.endsWith('.tsx')))
86
+ .filter(f => !EXCLUIR_DIRS.some(d => f.startsWith(d + '/')))
87
+ .filter(f => !f.includes('.d.ts'));
88
+ } catch (_) {
89
+ return [];
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Obtiene el contenido del diff staged para los archivos TS.
95
+ * @returns {string}
96
+ */
97
+ function obtenerDiffTS() {
98
+ try {
99
+ return execSync('git diff --cached -- "*.ts" "*.tsx"', {
100
+ cwd: CWD, encoding: 'utf8', stdio: ['pipe','pipe','pipe'],
101
+ });
102
+ } catch (_) {
103
+ return '';
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Extrae solo las líneas añadidas del diff (líneas con + al inicio).
109
+ * Excluye encabezados de archivos (+++ ...).
110
+ * @param {string} diff
111
+ * @returns {{ archivo: string, linea: number, contenido: string }[]}
112
+ */
113
+ function extraerLineasAgregadas(diff) {
114
+ const resultado = [];
115
+ let archivoActual = '';
116
+ let lineaActual = 0;
117
+
118
+ for (const linea of diff.split('\n')) {
119
+ // Encabezado de archivo nuevo
120
+ const matchArchivo = linea.match(/^\+\+\+ b\/(.+)/);
121
+ if (matchArchivo) {
122
+ archivoActual = matchArchivo[1];
123
+ lineaActual = 0;
124
+ continue;
125
+ }
126
+
127
+ // Número de línea en el nuevo archivo
128
+ const matchHunk = linea.match(/^@@.*\+(\d+)/);
129
+ if (matchHunk) {
130
+ lineaActual = parseInt(matchHunk[1], 10) - 1;
131
+ continue;
132
+ }
133
+
134
+ if (linea.startsWith('+') && !linea.startsWith('+++')) {
135
+ lineaActual++;
136
+ resultado.push({
137
+ archivo: archivoActual,
138
+ linea: lineaActual,
139
+ contenido: linea.slice(1), // quitar el + del diff
140
+ });
141
+ } else if (!linea.startsWith('-')) {
142
+ lineaActual++;
143
+ }
144
+ }
145
+
146
+ return resultado;
147
+ }
148
+
149
+ // ---------------------------------------------------------------------------
150
+ // Verificaciones de calidad TypeScript
151
+ // ---------------------------------------------------------------------------
152
+
153
+ /**
154
+ * 1. Detecta introducciones nuevas de `any` explícito sin justificación.
155
+ * Busca en líneas agregadas del diff.
156
+ *
157
+ * @param {Array} lineasAgregadas
158
+ * @returns {{ archivo: string, linea: number, descripcion: string }[]}
159
+ */
160
+ function verificarAnyExplicito(lineasAgregadas) {
161
+ perf.mark('anyCheck_start');
162
+ const violaciones = [];
163
+
164
+ const patronAny = /(?<!\/\/.*)(?<!\w)(?::\s*any\b|as\s+any\b|<any>|Array<any>|Promise<any>|Record<string,\s*any>)/;
165
+ const patronJustificado = /\/\/\s*(eslint-disable|ts-ignore|any justificado|FIXME|TODO|hack)/i;
166
+
167
+ for (const { archivo, linea, contenido } of lineasAgregadas) {
168
+ if (!patronAny.test(contenido)) continue;
169
+ // Si la línea tiene un comentario de justificación, no es violación
170
+ if (patronJustificado.test(contenido)) continue;
171
+ // Si es en un archivo de test, es advertencia no crítica
172
+ const esTest = archivo.includes('.test.') || archivo.includes('.spec.') || archivo.includes('__tests__');
173
+ violaciones.push({
174
+ archivo, linea,
175
+ descripcion: `'any' introducido sin justificación${esTest ? ' (en test)' : ''}`,
176
+ severidad: esTest ? 'advertencia' : 'critica',
177
+ });
178
+ }
179
+
180
+ perf.mark('anyCheck_end');
181
+ perf.measure('anyCheck', 'anyCheck_start', 'anyCheck_end');
182
+ return violaciones;
183
+ }
184
+
185
+ /**
186
+ * 2. Detecta @ts-ignore sin comentario explicativo en la línea anterior.
187
+ *
188
+ * @param {string[]} archivos — lista de rutas relativas
189
+ * @returns {{ archivo: string, linea: number, descripcion: string }[]}
190
+ */
191
+ function verificarTsIgnore(archivos) {
192
+ perf.mark('tsIgnoreCheck_start');
193
+ const violaciones = [];
194
+
195
+ for (const archivo of archivos) {
196
+ let contenido;
197
+ try {
198
+ contenido = fs.readFileSync(path.join(CWD, archivo), 'utf8');
199
+ } catch (_) {
200
+ continue;
201
+ }
202
+
203
+ const lineas = contenido.split('\n');
204
+ for (let i = 0; i < lineas.length; i++) {
205
+ const linea = lineas[i];
206
+ if (!/@ts-ignore/.test(linea)) continue;
207
+
208
+ // Verificar que la línea actual o la anterior tiene un comentario explicativo
209
+ const lineaAnterior = i > 0 ? lineas[i - 1] : '';
210
+ const tieneJustificacion =
211
+ /\/\/\s*.{5,}/.test(lineaAnterior) || // comentario con texto en línea anterior
212
+ /\/\/\s*.{5,}/.test(linea.replace('@ts-ignore', '').trim()); // comentario en misma línea
213
+
214
+ if (!tieneJustificacion) {
215
+ violaciones.push({
216
+ archivo, linea: i + 1,
217
+ descripcion: '@ts-ignore sin comentario de justificación (¿por qué no se puede tipar correctamente?)',
218
+ severidad: 'critica',
219
+ });
220
+ }
221
+ }
222
+ }
223
+
224
+ perf.mark('tsIgnoreCheck_end');
225
+ perf.measure('tsIgnoreCheck', 'tsIgnoreCheck_start', 'tsIgnoreCheck_end');
226
+ return violaciones;
227
+ }
228
+
229
+ /**
230
+ * 3. Detecta double cast `as unknown as T` para evadir el type system.
231
+ *
232
+ * @param {Array} lineasAgregadas
233
+ * @returns {{ archivo: string, linea: number, descripcion: string }[]}
234
+ */
235
+ function verificarDoubleCast(lineasAgregadas) {
236
+ perf.mark('doubleCastCheck_start');
237
+ const violaciones = [];
238
+ const patron = /as\s+unknown\s+as\s+\w/;
239
+
240
+ for (const { archivo, linea, contenido } of lineasAgregadas) {
241
+ if (!patron.test(contenido)) continue;
242
+ violaciones.push({
243
+ archivo, linea,
244
+ descripcion: "'as unknown as T' — double cast para evadir el type system. Tipar la fuente correctamente o usar type guard",
245
+ severidad: 'critica',
246
+ });
247
+ }
248
+
249
+ perf.mark('doubleCastCheck_end');
250
+ perf.measure('doubleCastCheck', 'doubleCastCheck_start', 'doubleCastCheck_end');
251
+ return violaciones;
252
+ }
253
+
254
+ /**
255
+ * 4. Detecta catch blocks con tipo any o Error en lugar de unknown.
256
+ *
257
+ * @param {Array} lineasAgregadas
258
+ * @returns {{ archivo: string, linea: number, descripcion: string }[]}
259
+ */
260
+ function verificarCatchTipos(lineasAgregadas) {
261
+ perf.mark('catchCheck_start');
262
+ const violaciones = [];
263
+
264
+ const patronCatchAny = /catch\s*\(\s*\w+\s*:\s*any\s*\)/;
265
+ const patronCatchError = /catch\s*\(\s*\w+\s*:\s*Error\s*\)/;
266
+
267
+ for (const { archivo, linea, contenido } of lineasAgregadas) {
268
+ if (patronCatchAny.test(contenido)) {
269
+ violaciones.push({
270
+ archivo, linea,
271
+ descripcion: "catch (e: any) — usar 'unknown' y narrowing con instanceof",
272
+ severidad: 'critica',
273
+ });
274
+ } else if (patronCatchError.test(contenido)) {
275
+ violaciones.push({
276
+ archivo, linea,
277
+ descripcion: "catch (e: Error) — el tipo en catch es siempre 'unknown' en TS moderno. Usar instanceof Error para narrowing",
278
+ severidad: 'mayor',
279
+ });
280
+ }
281
+ }
282
+
283
+ perf.mark('catchCheck_end');
284
+ perf.measure('catchCheck', 'catchCheck_start', 'catchCheck_end');
285
+ return violaciones;
286
+ }
287
+
288
+ /**
289
+ * 5. Ejecuta tsc --noEmit si el proyecto tiene tsconfig.json.
290
+ * Captura los primeros errores (no bloquea si tsc no está disponible).
291
+ *
292
+ * @returns {{ errores: string[], tiempoMs: number }}
293
+ */
294
+ function ejecutarTsc() {
295
+ perf.mark('tsc_start');
296
+ const resultado = { errores: [], tiempoMs: 0 };
297
+
298
+ const tsconfigPath = path.join(CWD, 'tsconfig.json');
299
+ if (!fs.existsSync(tsconfigPath)) {
300
+ perf.mark('tsc_end');
301
+ perf.measure('tsc', 'tsc_start', 'tsc_end');
302
+ return resultado;
303
+ }
304
+
305
+ try {
306
+ execSync('npx tsc --noEmit 2>&1', {
307
+ cwd: CWD, encoding: 'utf8', stdio: ['pipe','pipe','pipe'], timeout: 60_000,
308
+ });
309
+ } catch (err) {
310
+ const output = (err.stdout || err.stderr || '').toString();
311
+ // Extraer solo los primeros 10 errores — evitar output masivo
312
+ const lineas = output.split('\n').filter(l => l.includes(': error TS'));
313
+ resultado.errores = lineas.slice(0, 10);
314
+ }
315
+
316
+ perf.mark('tsc_end');
317
+ perf.measure('tsc', 'tsc_start', 'tsc_end');
318
+ return resultado;
319
+ }
320
+
321
+ /**
322
+ * 6. Verificaciones con ts-morph si está disponible.
323
+ * Graceful degradation: si no está instalado, retorna vacío.
324
+ *
325
+ * @param {string[]} archivos
326
+ * @returns {{ violaciones: Array, disponible: boolean }}
327
+ */
328
+ function verificarConTsMorph(archivos) {
329
+ perf.mark('tsMorph_start');
330
+ const resultado = { violaciones: [], disponible: false };
331
+
332
+ // Verificar si ts-morph está disponible
333
+ const tsMorphPath = path.join(CWD, 'node_modules', 'ts-morph');
334
+ if (!fs.existsSync(tsMorphPath)) {
335
+ perf.mark('tsMorph_end');
336
+ perf.measure('tsMorph', 'tsMorph_start', 'tsMorph_end');
337
+ return resultado;
338
+ }
339
+
340
+ try {
341
+ const { Project } = require(tsMorphPath);
342
+ resultado.disponible = true;
343
+
344
+ const project = new Project({
345
+ tsConfigFilePath: path.join(CWD, 'tsconfig.json'),
346
+ skipAddingFilesFromTsConfig: true,
347
+ });
348
+
349
+ for (const rutaRelativa of archivos.slice(0, 20)) { // Limitar a 20 archivos
350
+ const rutaAbsoluta = path.join(CWD, rutaRelativa);
351
+ if (!fs.existsSync(rutaAbsoluta)) continue;
352
+
353
+ const sourceFile = project.addSourceFileAtPath(rutaAbsoluta);
354
+
355
+ // Detectar variables declaradas con `var`
356
+ sourceFile.getVariableDeclarations().forEach(decl => {
357
+ const declarationList = decl.getParent();
358
+ if (declarationList && declarationList.getDeclarationKind &&
359
+ declarationList.getDeclarationKind().toString() === 'var') {
360
+ resultado.violaciones.push({
361
+ archivo: rutaRelativa,
362
+ linea: decl.getStartLineNumber(),
363
+ descripcion: `var '${decl.getName()}' — usar const o let`,
364
+ severidad: 'menor',
365
+ });
366
+ }
367
+ });
368
+
369
+ // Detectar console.log en producción (refuerza calidad-pre-commit)
370
+ sourceFile.getDescendantsOfKind(274 /* CallExpression */).forEach(call => {
371
+ const expr = call.getExpression();
372
+ if (expr && expr.getText && /^console\.(log|debug|warn)/.test(expr.getText())) {
373
+ const ruta = call.getSourceFile().getFilePath();
374
+ if (!ruta.includes('.test.') && !ruta.includes('.spec.')) {
375
+ resultado.violaciones.push({
376
+ archivo: rutaRelativa,
377
+ linea: call.getStartLineNumber(),
378
+ descripcion: `${expr.getText()}() — eliminar debug output en producción`,
379
+ severidad: 'menor',
380
+ });
381
+ }
382
+ }
383
+ });
384
+ }
385
+ } catch (_) {
386
+ // ts-morph disponible pero error al analizar — no bloquear
387
+ resultado.disponible = true;
388
+ }
389
+
390
+ perf.mark('tsMorph_end');
391
+ perf.measure('tsMorph', 'tsMorph_start', 'tsMorph_end');
392
+ return resultado;
393
+ }
394
+
395
+ // ---------------------------------------------------------------------------
396
+ // Punto de entrada
397
+ // ---------------------------------------------------------------------------
398
+
399
+ function main() {
400
+ // Leer el input de Claude Code (JSON en stdin)
401
+ let input = '';
402
+ try {
403
+ input = fs.readFileSync('/dev/stdin', 'utf8');
404
+ } catch (_) {
405
+ try {
406
+ // Fallback para Windows
407
+ const buf = [];
408
+ const fd = require('fs').openSync('\\\\.\\pipe\\CONIN$', 'r');
409
+ // Si falla, simplemente no hay input — salir silenciosamente
410
+ } catch (_2) {}
411
+ }
412
+
413
+ let datos = {};
414
+ try { datos = JSON.parse(input); } catch (_) { process.exit(0); }
415
+
416
+ const cmd = normalizeForDetection(datos?.tool_input?.command || '');
417
+ if (!esGitCommit(cmd)) process.exit(0);
418
+
419
+ perf.mark('hook_start');
420
+
421
+ // Obtener archivos TypeScript staged
422
+ const archivosTS = obtenerArchivosTSStagged();
423
+ if (archivosTS.length === 0) {
424
+ // No hay archivos TypeScript en el commit — no aplica este hook
425
+ process.exit(0);
426
+ }
427
+
428
+ // Obtener diff de archivos TS
429
+ const diff = obtenerDiffTS();
430
+ const lineasAgregadas = extraerLineasAgregadas(diff);
431
+
432
+ // Ejecutar todas las verificaciones
433
+ const todasViolaciones = [];
434
+
435
+ todasViolaciones.push(...verificarAnyExplicito(lineasAgregadas));
436
+ todasViolaciones.push(...verificarTsIgnore(archivosTS));
437
+ todasViolaciones.push(...verificarDoubleCast(lineasAgregadas));
438
+ todasViolaciones.push(...verificarCatchTipos(lineasAgregadas));
439
+
440
+ // tsc --noEmit
441
+ const { errores: erroresTsc } = ejecutarTsc();
442
+
443
+ // ts-morph (opcional)
444
+ const { violaciones: violacionesMorph } = verificarConTsMorph(archivosTS);
445
+ todasViolaciones.push(...violacionesMorph);
446
+
447
+ perf.mark('hook_end');
448
+ perf.measure('hook_total', 'hook_start', 'hook_end');
449
+
450
+ // Separar críticos de advertencias
451
+ const criticos = todasViolaciones.filter(v => v.severidad === 'critica');
452
+ const mayores = todasViolaciones.filter(v => v.severidad === 'mayor');
453
+ const advertencias = todasViolaciones.filter(v => v.severidad === 'advertencia' || v.severidad === 'menor');
454
+
455
+ const hayProblemas = criticos.length > 0 || mayores.length > 0 || erroresTsc.length > 0;
456
+
457
+ if (!hayProblemas && advertencias.length === 0) process.exit(0);
458
+
459
+ // Generar output
460
+ const lineasOutput = [
461
+ `\n[calidad-typescript] ${archivosTS.length} archivo(s) TypeScript en el commit\n`,
462
+ ];
463
+
464
+ if (criticos.length > 0) {
465
+ lineasOutput.push('CRÍTICOS (bloquean el commit):');
466
+ criticos.forEach(v => lineasOutput.push(` ${v.archivo}:${v.linea} — ${v.descripcion}`));
467
+ lineasOutput.push('');
468
+ }
469
+
470
+ if (mayores.length > 0) {
471
+ lineasOutput.push('MAYORES:');
472
+ mayores.forEach(v => lineasOutput.push(` ${v.archivo}:${v.linea} — ${v.descripcion}`));
473
+ lineasOutput.push('');
474
+ }
475
+
476
+ if (erroresTsc.length > 0) {
477
+ lineasOutput.push(`Errores de tsc --noEmit (${erroresTsc.length} primeros):`);
478
+ erroresTsc.forEach(e => lineasOutput.push(` ${e}`));
479
+ lineasOutput.push('');
480
+ }
481
+
482
+ if (advertencias.length > 0) {
483
+ lineasOutput.push('Advertencias (no bloquean):');
484
+ advertencias.forEach(v => lineasOutput.push(` ${v.archivo}:${v.linea} — ${v.descripcion}`));
485
+ lineasOutput.push('');
486
+ }
487
+
488
+ // Agregar reporte de performance si tardó más de 3 segundos
489
+ const durTotal = perf.getDuration('hook_total');
490
+ if (durTotal > 3000) {
491
+ lineasOutput.push(perf.formatReporte({ umbralMs: 50 }));
492
+ lineasOutput.push('');
493
+ }
494
+
495
+ // stderr: visible al usuario siempre y enviado a Claude si se usa exit 2.
496
+ // stdout solo se muestra en modo transcript (CTRL-R), no llega al modelo.
497
+ process.stderr.write(lineasOutput.join('\n'));
498
+
499
+ // Bloquear solo si hay críticos, mayores o errores de tsc
500
+ if (criticos.length > 0 || erroresTsc.length > 0) {
501
+ process.exit(2);
502
+ }
503
+ // Mayores: bloquear si hay más de 2
504
+ if (mayores.length > 2) {
505
+ process.exit(2);
506
+ }
507
+ // Si solo hay advertencias o 1-2 mayores: warning sin bloqueo
508
+ process.exit(0);
509
+ }
510
+
511
+ main();
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * Hook: captura-feedback-usuario.js
6
+ * Tipo: UserPromptSubmit
7
+ *
8
+ * Detecta correcciones explícitas del usuario ("no hagas X", "recuerda Y",
9
+ * "prefiero Z") y las encola en .planning/evolucion/feedback-queue.jsonl
10
+ * para que el perfilador-usuario-swl, el ciclo AGP y /swl:aprender puedan
11
+ * consumirlas sin depender de que el usuario ejecute comandos manualmente.
12
+ *
13
+ * Inspirado en claude-reflect (capture_learning.py). Zero-deps, patrones
14
+ * regex en español e inglés.
15
+ *
16
+ * A diferencia del clasificador-mensajes.js (que hace routing de modelos),
17
+ * este hook captura SEÑALES DE MEMORIA persistente del usuario.
18
+ *
19
+ * Resultado:
20
+ * - Señal detectada → append a feedback-queue.jsonl (no bloquea ni muestra al modelo)
21
+ * - Sin señal → exit 0 silencioso
22
+ * - Error → exit 0 silencioso (nunca bloquea)
23
+ *
24
+ * Opt-out: SWL_CAPTURAR_FEEDBACK=0
25
+ */
26
+
27
+ const fs = require('fs');
28
+ const path = require('path');
29
+
30
+ // ---------------------------------------------------------------------------
31
+ // Patrones de detección
32
+ //
33
+ // Clasificación por tipo de señal:
34
+ // correccion: el usuario corrige un comportamiento ("no hagas X", "no uses Y")
35
+ // preferencia: el usuario declara una preferencia ("prefiero X", "siempre usa Y")
36
+ // memoria: el usuario pide recordar ("recuerda que X", "guarda X")
37
+ // prohibicion: el usuario prohíbe ("nunca X", "jamás Y")
38
+ // ---------------------------------------------------------------------------
39
+
40
+ const PATRONES = [
41
+ // Correcciones explícitas
42
+ { tipo: 'correccion', re: /\b(no\s+(?:hagas|uses|escribas|incluyas|agregues)\s+[a-záéíóúñ][^.!?\n]{3,100})/i },
43
+ { tipo: 'correccion', re: /\b(don['´]?t\s+(?:do|use|write|include|add)\s+[a-z][^.!?\n]{3,100})/i },
44
+ { tipo: 'correccion', re: /\b(eso\s+(?:está|esta)\s+mal[^.!?\n]{0,100})/i },
45
+ { tipo: 'correccion', re: /\b(that['´]?s\s+wrong[^.!?\n]{0,100})/i },
46
+ { tipo: 'correccion', re: /\b(corrige\s+[a-záéíóúñ][^.!?\n]{3,100})/i },
47
+
48
+ // Preferencias
49
+ { tipo: 'preferencia', re: /\b(prefiero\s+[a-záéíóúñ][^.!?\n]{3,100})/i },
50
+ { tipo: 'preferencia', re: /\b(i\s+prefer\s+[a-z][^.!?\n]{3,100})/i },
51
+ { tipo: 'preferencia', re: /\b(mejor\s+usa\s+[a-záéíóúñ][^.!?\n]{3,100})/i },
52
+ { tipo: 'preferencia', re: /\b(siempre\s+(?:usa|haz|escribe|incluye)\s+[a-záéíóúñ][^.!?\n]{3,100})/i },
53
+ { tipo: 'preferencia', re: /\b(always\s+(?:use|do|write|include)\s+[a-z][^.!?\n]{3,100})/i },
54
+
55
+ // Memoria explícita
56
+ { tipo: 'memoria', re: /\b(recuerda(?:\s+que)?\s+[a-záéíóúñ][^.!?\n]{3,100})/i },
57
+ { tipo: 'memoria', re: /\b(guarda\s+(?:esto|que)\s+[a-záéíóúñ][^.!?\n]{3,100})/i },
58
+ { tipo: 'memoria', re: /\b(remember\s+(?:that\s+)?[a-z][^.!?\n]{3,100})/i },
59
+
60
+ // Prohibiciones absolutas
61
+ { tipo: 'prohibicion', re: /\b(nunca\s+(?:hagas|uses|escribas|incluyas|agregues)\s+[a-záéíóúñ][^.!?\n]{3,100})/i },
62
+ { tipo: 'prohibicion', re: /\b(jamás\s+(?:hagas|uses|escribas|incluyas|agregues)\s+[a-záéíóúñ][^.!?\n]{3,100})/i },
63
+ { tipo: 'prohibicion', re: /\b(never\s+(?:do|use|write|include|add)\s+[a-z][^.!?\n]{3,100})/i },
64
+ ];
65
+
66
+ // Longitud mínima del prompt completo para considerarlo como feedback
67
+ // (evita capturar "no" suelto o prompts ultra-cortos de navegación).
68
+ const MIN_PROMPT_LEN = 12;
69
+
70
+ // Longitud máxima del fragmento capturado (para no saturar la cola con pastes largos)
71
+ const MAX_FRAGMENTO_LEN = 280;
72
+
73
+ /**
74
+ * Analiza un prompt y extrae señales de feedback.
75
+ * @param {string} prompt
76
+ * @returns {Array<{tipo: string, fragmento: string}>}
77
+ */
78
+ function detectarFeedback(prompt) {
79
+ if (!prompt || prompt.length < MIN_PROMPT_LEN) return [];
80
+
81
+ // Omitir si el prompt es claramente un comando slash
82
+ if (prompt.trim().startsWith('/')) return [];
83
+
84
+ const hallazgos = [];
85
+ for (const { tipo, re } of PATRONES) {
86
+ const m = prompt.match(re);
87
+ if (!m) continue;
88
+ const fragmento = m[1].trim().slice(0, MAX_FRAGMENTO_LEN);
89
+ hallazgos.push({ tipo, fragmento });
90
+ }
91
+
92
+ // Deduplicar por fragmento idéntico
93
+ const vistos = new Set();
94
+ return hallazgos.filter(h => {
95
+ const clave = `${h.tipo}::${h.fragmento.toLowerCase()}`;
96
+ if (vistos.has(clave)) return false;
97
+ vistos.add(clave);
98
+ return true;
99
+ });
100
+ }
101
+
102
+ /**
103
+ * Encola un hallazgo en feedback-queue.jsonl.
104
+ */
105
+ function encolar(hallazgo, meta) {
106
+ try {
107
+ const dir = path.join(process.cwd(), '.planning', 'evolucion');
108
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
109
+
110
+ const entrada = {
111
+ ts: new Date().toISOString(),
112
+ sessionId: meta.sessionId,
113
+ tipo: hallazgo.tipo,
114
+ fragmento: hallazgo.fragmento,
115
+ cwd: meta.cwd,
116
+ procesado: false,
117
+ };
118
+
119
+ const jsonlPath = path.join(dir, 'feedback-queue.jsonl');
120
+ fs.appendFileSync(jsonlPath, JSON.stringify(entrada) + '\n');
121
+ } catch (_) { /* nunca bloquear */ }
122
+ }
123
+
124
+ // ---------------------------------------------------------------------------
125
+ // Entrypoint
126
+ // ---------------------------------------------------------------------------
127
+
128
+ let inputRaw = '';
129
+ process.stdin.on('data', c => { inputRaw += c; });
130
+
131
+ process.stdin.on('end', () => {
132
+ try {
133
+ if (process.env.SWL_CAPTURAR_FEEDBACK === '0') return;
134
+
135
+ const data = JSON.parse(inputRaw);
136
+ const prompt = data.prompt || '';
137
+ const sessionId = String(data.session_id || 'default');
138
+
139
+ const hallazgos = detectarFeedback(prompt);
140
+ if (hallazgos.length === 0) return;
141
+
142
+ for (const h of hallazgos) {
143
+ encolar(h, { sessionId, cwd: process.cwd() });
144
+ }
145
+ } catch (_) { /* silencioso */ }
146
+ });
147
+
148
+ module.exports = { detectarFeedback };