@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,338 @@
1
+ ---
2
+ name: rag-arquitectura
3
+ description: >
4
+ Arquitectura de sistemas RAG (Retrieval-Augmented Generation): diseño de pipelines
5
+ de ingestión, estrategias de chunking, selección de vector stores, reranking,
6
+ evaluación con RAGAS y patrones de producción. Cargar cuando se diseñe o implemente
7
+ un sistema RAG completo, se optimice la precisión de recuperación, o se evalúe
8
+ la calidad de un pipeline existente.
9
+ version: "1.0.0"
10
+ herramientasPermitidas: [Read, Grep]
11
+ user-invocable: false
12
+ evolvable: true # default para skill estandar
13
+ exclusiones:
14
+ - "No cargar para construcción de agentes LangGraph con memoria y herramientas — para agentes orquestados con LangGraph cargar `langchain-langraph`."
15
+ - "No cargar para extracción de documentos Office/PDF sin pipeline de recuperación (sin búsqueda vectorial) — para extracción puntual de documentos cargar `extraccion-documentos`."
16
+ - "No cargar para búsqueda de texto completo en bases de datos SQL sin componente vectorial — para full-text search en PostgreSQL usar `tsvector`/`tsquery` directamente."
17
+ - "No cargar para fine-tuning de modelos de embedding en dominios específicos — este skill cubre RAG con modelos de embedding pre-entrenados, no el proceso de ajuste de pesos."
18
+ ---
19
+ # RAG — Retrieval-Augmented Generation
20
+
21
+ ## Cuándo NO cargar
22
+
23
+ - La tarea es construir agentes con estado y herramientas usando LangGraph: cargar `langchain-langraph`.
24
+ - La tarea es extracción puntual de un documento (sin búsqueda vectorial posterior): cargar `extraccion-documentos`.
25
+ - La tarea es full-text search en PostgreSQL sin componente vectorial: usar `tsvector`/`tsquery` del skill `postgresql-experto`.
26
+ - La tarea es fine-tuning de modelos de embedding: usar la documentación del proveedor de embeddings.
27
+
28
+ ## Arquitectura de referencia
29
+
30
+ ```
31
+ Documentos → Ingestión → Chunking → Embeddings → Vector Store
32
+
33
+ Usuario → Query → Retriever → Reranker → LLM → Respuesta
34
+ ```
35
+
36
+ ---
37
+
38
+ ## Pipeline de ingestión
39
+
40
+ ### Loaders por tipo de fuente
41
+
42
+ | Fuente | Loader recomendado | Notas |
43
+ |--------|-------------------|-------|
44
+ | PDF | `PyPDFLoader` / `UnstructuredPDFLoader` | Unstructured para PDFs con tablas complejas |
45
+ | Web | `WebBaseLoader` / `RecursiveUrlLoader` | Recursive para crawl de sitios completos |
46
+ | Markdown | `UnstructuredMarkdownLoader` | Preserva headers para chunking semántico |
47
+ | CSV / Excel | `CSVLoader` / `UnstructuredExcelLoader` | Cada fila como documento independiente |
48
+ | Base de datos | `SQLDatabaseLoader` | Query SQL → documentos |
49
+ | Código fuente | `GenericLoader` + `LanguageParser` | Preserva estructura de funciones/clases |
50
+
51
+ ### Limpieza pre-chunking
52
+
53
+ ```python
54
+ def limpiar_documento(texto: str) -> str:
55
+ """Normalización antes de chunking."""
56
+ import re
57
+ # Eliminar saltos de línea excesivos
58
+ texto = re.sub(r'\n{3,}', '\n\n', texto)
59
+ # Normalizar espacios
60
+ texto = re.sub(r'[ \t]+', ' ', texto)
61
+ # Eliminar headers/footers repetitivos de PDFs
62
+ texto = re.sub(r'Página \d+ de \d+', '', texto)
63
+ return texto.strip()
64
+ ```
65
+
66
+ ---
67
+
68
+ ## Estrategias de chunking
69
+
70
+ ### Tabla de decisión
71
+
72
+ | Tipo de documento | Estrategia | chunk_size | overlap | Razón |
73
+ |-------------------|-----------|------------|---------|-------|
74
+ | Texto general | `RecursiveCharacterTextSplitter` | 1000 | 200 | Balance general entre contexto y precisión |
75
+ | Documentación técnica | `MarkdownHeaderTextSplitter` | — | — | Preserva estructura de secciones |
76
+ | Código fuente | `RecursiveCharacterTextSplitter(language=...)` | 500 | 50 | Funciones/clases como unidades |
77
+ | Contratos/legal | `RecursiveCharacterTextSplitter` | 1500 | 300 | Cláusulas largas necesitan más contexto |
78
+ | FAQ / Q&A | `CharacterTextSplitter(separator="\n\n")` | — | 0 | Cada pregunta-respuesta es un chunk |
79
+
80
+ ### Chunking semántico (avanzado)
81
+
82
+ ```python
83
+ from langchain_experimental.text_splitter import SemanticChunker
84
+ from langchain_openai import OpenAIEmbeddings
85
+
86
+ # Agrupa oraciones por similitud semántica
87
+ chunker = SemanticChunker(
88
+ OpenAIEmbeddings(),
89
+ breakpoint_threshold_type="percentile",
90
+ breakpoint_threshold_amount=95,
91
+ )
92
+ chunks = chunker.create_documents([texto])
93
+ ```
94
+
95
+ **Cuándo usar chunking semántico**: documentos heterogéneos donde los separadores
96
+ textuales no reflejan cambios de tema. Más costoso (requiere embedding por oración).
97
+
98
+ ### Reglas estrictas de chunking
99
+
100
+ - Usar `tiktoken` para contar tokens reales, no `len(texto)`
101
+ - overlap > 0 para evitar pérdida de contexto en bordes
102
+ - chunk_size demasiado grande → ruido en recuperación
103
+ - chunk_size demasiado pequeño → fragmentos sin contexto suficiente
104
+ - Siempre incluir metadata: `source`, `page`, `section` para trazabilidad
105
+
106
+ ---
107
+
108
+ ## Vector stores — criterios de selección
109
+
110
+ | Vector store | Cuándo usar | Ventajas | Limitaciones |
111
+ |-------------|-------------|----------|-------------|
112
+ | **pgvector** | Ya tienes PostgreSQL, < 10M vectores | Una sola BD, SQL familiar, transacciones ACID | Rendimiento baja con > 10M vectores |
113
+ | **Chroma** | Prototipado local, desarrollo | Zero config, in-memory o persistente | No escala a producción con alta carga |
114
+ | **Pinecone** | Serverless, equipo sin DevOps | Escala automática, filtrado por metadata | Vendor lock-in, costo por volumen |
115
+ | **Weaviate** | Búsqueda híbrida vectorial + keyword | Módulos de vectorización, GraphQL API | Complejidad operativa |
116
+ | **Qdrant** | Alto rendimiento, filtrado avanzado | Filtros combinados eficientes, Rust core | Menos integraciones que Pinecone |
117
+ | **FAISS** | Batch processing, no necesitas persistencia | Ultra rápido en memoria, Facebook Research | Sin persistencia nativa, sin filtros |
118
+
119
+ ### Patrón de inicialización con pgvector
120
+
121
+ ```python
122
+ from langchain_postgres import PGVector
123
+
124
+ vector_store = PGVector(
125
+ embeddings=embeddings,
126
+ collection_name="mi_coleccion",
127
+ connection=DATABASE_URL,
128
+ use_jsonb=True, # metadata como JSONB para filtros eficientes
129
+ )
130
+ ```
131
+
132
+ ---
133
+
134
+ ## Modelos de embedding
135
+
136
+ ```
137
+ text-embedding-3-small (OpenAI) → Bajo costo ($0.02/1M tokens), suficiente para mayoría
138
+ text-embedding-3-large (OpenAI) → Alta precisión ($0.13/1M tokens), documentos técnicos
139
+ voyage-3 (Anthropic/Voyage) → Óptimo con Claude, buen balance
140
+ all-MiniLM-L6-v2 (HuggingFace) → Gratuito, on-premise, calidad base aceptable
141
+ nomic-embed-text (Ollama) → 100% local, sin costo de API, privacidad total
142
+ ```
143
+
144
+ **Regla**: nunca mezclar modelos de embedding entre ingestión y búsqueda. El modelo
145
+ que generó los embeddings debe ser el mismo que transforma la query.
146
+
147
+ ---
148
+
149
+ ## Retrieval — estrategias de recuperación
150
+
151
+ ### Búsqueda básica vs avanzada
152
+
153
+ | Estrategia | Implementación | Cuándo usar |
154
+ |-----------|---------------|-------------|
155
+ | Similarity search | `vectorstore.similarity_search(query, k=4)` | Caso base, consultas directas |
156
+ | MMR (Maximal Marginal Relevance) | `vectorstore.max_marginal_relevance_search(query, k=4, fetch_k=20)` | Evitar chunks redundantes |
157
+ | Búsqueda híbrida | Vectorial + BM25 keyword | Documentos técnicos con terminología específica |
158
+ | Multi-query | Generar N variantes de la query con LLM | Queries ambiguas o cortas |
159
+ | Parent document | Recuperar chunk hijo, devolver documento padre | Necesitas contexto amplio pero búsqueda precisa |
160
+
161
+ ### Reranking
162
+
163
+ ```python
164
+ from langchain.retrievers import ContextualCompressionRetriever
165
+ from langchain_cohere import CohereRerank
166
+
167
+ reranker = CohereRerank(model="rerank-v3.5", top_n=3)
168
+ retriever_con_rerank = ContextualCompressionRetriever(
169
+ base_compressor=reranker,
170
+ base_retriever=vectorstore.as_retriever(search_kwargs={"k": 20}),
171
+ )
172
+ ```
173
+
174
+ **Patrón retrieve-wide-rerank-narrow**: recuperar 20 chunks con similarity search,
175
+ rerankecar a los 3 más relevantes. Mejora precisión sin aumentar tokens de contexto.
176
+
177
+ ---
178
+
179
+ ## Evaluación con RAGAS
180
+
181
+ ### Métricas obligatorias antes de producción
182
+
183
+ ```python
184
+ from ragas import evaluate
185
+ from ragas.metrics import (
186
+ faithfulness,
187
+ answer_relevancy,
188
+ context_precision,
189
+ context_recall,
190
+ )
191
+
192
+ resultado = evaluate(
193
+ dataset=dataset_evaluacion, # mínimo 50 preguntas con ground truth
194
+ metrics=[faithfulness, answer_relevancy, context_precision, context_recall],
195
+ )
196
+ ```
197
+
198
+ ### Umbrales mínimos aceptables
199
+
200
+ | Métrica | Umbral mínimo | Qué indica si falla |
201
+ |---------|:----------:|-------------------|
202
+ | `faithfulness` | > 0.8 | El LLM alucina — revisar retriever y prompt |
203
+ | `answer_relevancy` | > 0.7 | La respuesta no atiende la pregunta — revisar prompt |
204
+ | `context_precision` | > 0.7 | Se recuperan chunks irrelevantes — ajustar chunking/k |
205
+ | `context_recall` | > 0.7 | Falta contexto — aumentar k o mejorar embeddings |
206
+
207
+ Si `faithfulness < 0.6` después de optimizar → evaluar fine-tuning del retriever.
208
+
209
+ ---
210
+
211
+ ## Patrones de producción
212
+
213
+ ### Caching de embeddings
214
+
215
+ ```python
216
+ from langchain.storage import LocalFileStore
217
+ from langchain.embeddings import CacheBackedEmbeddings
218
+
219
+ store = LocalFileStore("./cache/embeddings/")
220
+ cached_embeddings = CacheBackedEmbeddings.from_bytes_store(
221
+ underlying_embeddings=embeddings,
222
+ document_embedding_cache=store,
223
+ namespace=embeddings.model, # invalida cache si cambia el modelo
224
+ )
225
+ ```
226
+
227
+ ### Streaming de respuestas
228
+
229
+ ```python
230
+ async for chunk in cadena_rag.astream({"question": pregunta}):
231
+ yield chunk # Enviar al cliente vía SSE o WebSocket
232
+ ```
233
+
234
+ ### Guardrails obligatorios
235
+
236
+ - Rate limiting por usuario (máx. 10 queries/min para APIs públicas)
237
+ - Límite de tokens de contexto: `k` entre 3 y 6 chunks
238
+ - Timeout en llamadas al LLM: 30s máximo
239
+ - Logging de query + contexto recuperado + respuesta para auditoría
240
+ - Nunca incluir PII en embeddings sin cifrar o consentimiento
241
+
242
+ ---
243
+
244
+ ## RAG con grafo de conocimiento (patrón LightRAG)
245
+
246
+ ### Arquitectura híbrida: Vector + Knowledge Graph
247
+
248
+ A diferencia del RAG tradicional (solo vectores), LightRAG combina:
249
+
250
+ ```
251
+ Documentos → Chunking → [Extracción de entidades/relaciones] → Knowledge Graph
252
+ → [Embeddings] → Vector Store
253
+
254
+ Consulta → Keywords → [Retrieval híbrido: KG + Vector] → Reranker → LLM → Respuesta
255
+ ```
256
+
257
+ **Ventaja clave**: el KG captura relaciones explícitas entre entidades que la búsqueda
258
+ vectorial sola no puede representar. Ejemplo: "Bug X fue causado por Patrón Y que
259
+ se adoptó en ADR-003" — esta cadena causal se pierde en similaridad de embeddings.
260
+
261
+ ### 5 modos de retrieval (adoptar según caso de uso)
262
+
263
+ | Modo | Estrategia | Cuándo usar |
264
+ |------|-----------|-------------|
265
+ | **local** | Keywords de bajo nivel → entidades cercanas → relaciones | Preguntas específicas sobre un componente |
266
+ | **global** | Keywords de alto nivel → relaciones agregadas/comunidades | Preguntas amplias sobre patrones o tendencias |
267
+ | **hybrid** | Local + global fusionados | Cuando no se sabe el nivel de especificidad |
268
+ | **naive** | Solo similarity search (sin KG) | Búsqueda rápida cuando se conoce el texto |
269
+ | **mix** | KG + vector + reranking (recomendado) | Default para producción — mejor precisión |
270
+
271
+ ### Extracción de entidades y relaciones
272
+
273
+ ```python
274
+ async def extract_entities(chunk: str, llm) -> dict:
275
+ """LLM extrae entidades y relaciones del chunk."""
276
+ # El LLM identifica:
277
+ # - Entidades: personas, tecnologías, componentes, conceptos
278
+ # - Relaciones: causa, dependencia, uso, implementación
279
+ # - Keywords: alto nivel (temas) y bajo nivel (términos específicos)
280
+ prompt = f"""Extrae entidades y relaciones del siguiente texto.
281
+ Formato: ENTITY|||TYPE|||DESCRIPTION y RELATION|||SOURCE|||TARGET|||DESCRIPTION
282
+ Texto: {chunk}"""
283
+ return await llm(prompt)
284
+ ```
285
+
286
+ **Gleaning**: ejecutar extracción 2-3 veces con "¿falta algo?" para mejorar cobertura.
287
+
288
+ ### Configuración recomendada
289
+
290
+ ```python
291
+ # Parámetros optimizados para proyectos de software
292
+ chunk_token_size = 1200 # Balance contexto/precisión
293
+ chunk_overlap_token_size = 100 # Continuidad entre chunks
294
+ top_k = 60 # Entidades/relaciones a recuperar
295
+ chunk_top_k = 20 # Chunks post-reranking
296
+ max_entity_tokens = 6000 # Límite tokens por entidad
297
+ max_relation_tokens = 8000 # Límite tokens por relación
298
+ max_total_tokens = 30000 # Límite total de contexto
299
+ cosine_threshold = 0.2 # Mínimo de similaridad para incluir
300
+ ```
301
+
302
+ ### Cuándo usar RAG + KG vs RAG solo vectores
303
+
304
+ | Criterio | Solo vectores | Vector + KG |
305
+ |----------|:-------------:|:-----------:|
306
+ | Preguntas factuales directas | Suficiente | Overkill |
307
+ | Relaciones causales entre documentos | Pierde relaciones | Captura cadenas causales |
308
+ | Corpus < 100 documentos | Óptimo | KG no aporta mucho |
309
+ | Corpus > 1000 documentos | Pierde contexto global | KG organiza conocimiento |
310
+ | Preguntas multi-hop (A→B→C) | Falla frecuente | Sigue relaciones en el grafo |
311
+ | Costo de ingestión | Bajo (solo embeddings) | Alto (LLM extrae entidades) |
312
+
313
+ ---
314
+
315
+ ## Reglas estrictas
316
+
317
+ - **Evaluar con RAGAS** antes de desplegar — mínimo 50 preguntas con ground truth
318
+ - **Nunca mezclar** modelos de embedding entre ingestión y búsqueda
319
+ - **Siempre incluir metadata** en chunks: source, page, section
320
+ - **Reranking obligatorio** cuando k > 5 en producción
321
+ - **Cachear embeddings** para evitar recálculos en re-ingestión
322
+ - **Nunca hacer embedding en loops** — usar `embed_documents(chunks)` en lote
323
+ - **Monitorear drift**: re-evaluar con RAGAS cada 2 semanas o tras cambios en el corpus
324
+ - **KG: gleaning obligatorio** — mínimo 2 pasadas de extracción para cobertura ≥ 80%
325
+ - **KG: merge de entidades** — entidades con nombre similar deben fusionarse automáticamente
326
+ - **KG: caché de LLM** — habilitar para reducir costo en re-ingestión de documentos sin cambios
327
+
328
+ ---
329
+
330
+ ## Gotchas / Errores comunes no obvios
331
+
332
+ **`similarity_search(query, k=4)` devuelve documentos con score > 0.9 pero la respuesta del LLM alucina información no presente en ningún chunk**: el score de similitud coseno mide afinidad semántica del embedding, no relevancia para la pregunta. Un chunk sobre "autenticación JWT" con alta similitud a la query "cómo funciona OAuth2" puede no contener la respuesta real. Causa: los embeddings capturan temas relacionados, no respuestas precisas; la similitud semántica y la completitud factual son dimensiones independientes. Fix: agregar un paso de reranking con un modelo cross-encoder (Cohere rerank, Jina reranker) después del retrieval vectorial. El cross-encoder evalúa relevancia query→documento directamente, no por similitud de embedding.
333
+
334
+ **`RecursiveCharacterTextSplitter` con `chunk_overlap=200` en documentos de soporte técnico crea chunks que empiezan con la respuesta de la pregunta anterior pero sin la pregunta, haciendo que el retriever recupere contextos semánticamente incoherentes**: un chunk que comienza con "...solución: actualizar el driver a la versión 4.2" sin el contexto del problema tiene alto overlap con queries generales sobre drivers pero no responde ninguna pregunta concreta correctamente. Causa: el overlap de caracteres corta oraciones sin considerar la estructura semántica del documento. Fix: para documentos de Q&A o tickets de soporte, usar `CharacterTextSplitter(separator="\n\n", chunk_overlap=0)` con cada par pregunta-respuesta como chunk atómico, añadiendo la pregunta como prefijo en el metadata para boosting en el retrieval.
335
+
336
+ **`CacheBackedEmbeddings` con `LocalFileStore` produce inconsistencias cuando dos procesos del servidor escriben simultáneamente al mismo archivo de cache porque `LocalFileStore` no usa file locking**: bajo carga concurrente en un servidor uvicorn con múltiples workers, el cache de embeddings se corrompe ocasionalmente generando embeddings parciales que fallan silenciosamente en la búsqueda vectorial (el vector store retorna k=0 resultados para esas queries). Causa: `LocalFileStore` usa escrituras directas sin sincronización entre procesos. Fix: en producción con múltiples workers, usar Redis como backend de cache de embeddings en lugar de `LocalFileStore`, o limitar la app a un solo worker y usar async concurrente en lugar de multiprocessing.
337
+
338
+ **RAGAS reporta `faithfulness > 0.85` en el test set pero el sistema alucina en producción porque el test set fue generado con el mismo LLM que ahora se evalúa**: el LLM genera preguntas cuyas respuestas están claramente en los documentos de entrenamiento, sesgando los scores hacia arriba. Causa: la distribución de queries reales de usuarios es diferente al test set sintético — los usuarios hacen preguntas sobre brechas, casos edge y contradicciones que el LLM generador evita. Fix: mezclar el test set sintético (50%) con queries reales anonimizadas de usuarios (50%). Si no hay queries reales disponibles, usar personas adversariales explícitas en la generación: "genera preguntas que el sistema probablemente no pueda responder correctamente".
@@ -0,0 +1,237 @@
1
+ ---
2
+ name: rails-experto
3
+ description: >
4
+ Ruby on Rails 7+ con Active Record, Hotwire (Turbo Frames/Streams), Action Cable,
5
+ Sidekiq y RSpec. Patrones idiomáticos de Rails: convención sobre configuración,
6
+ fat models/thin controllers, service objects. Cargar cuando se implemente
7
+ cualquier componente Rails: modelos, controladores, jobs, WebSockets o al
8
+ migrar a Rails 7+ con Hotwire desde vistas tradicionales.
9
+ version: "1.0.0"
10
+ herramientasPermitidas: [Read]
11
+ exclusiones:
12
+ - "No cargar para escribir specs RSpec o configurar FactoryBot — los patrones de testing Rails están en el recurso `recursos/testing-rspec.md` de este mismo skill; para testing standalone cargar el recurso."
13
+ - "No cargar para optimizaciones de base de datos SQL fuera de Active Record — para queries SQL avanzadas y plan de ejecución cargar `sql-optimizacion`."
14
+ - "No cargar para APIs Django, FastAPI o Laravel — Rails tiene convenciones y naming completamente distintos."
15
+ - "No cargar para errores de compilación Ruby o bundler — para errores de build Ruby cargar el skill de errores correspondiente."
16
+ evolvable: true # default para skill estandar
17
+ ---
18
+ # Rails Experto
19
+
20
+ ## Cuándo NO cargar
21
+
22
+ - La pregunta es específicamente sobre escribir specs RSpec o configurar FactoryBot — el recurso `recursos/testing-rspec.md` de este skill cubre ese tema; para testing de otro framework cargar su skill.
23
+ - La pregunta es sobre optimizaciones SQL fuera de Active Record (índices, EXPLAIN, partitioning) — cargar `sql-optimizacion`.
24
+ - El framework es Django, FastAPI o Laravel — Rails tiene convenciones (naming, estructura, ORM) completamente distintas.
25
+ - Los errores son de bundler o gemas Ruby — diagnosticar con el skill de build errors de Ruby.
26
+
27
+ ## Cuándo cargar este skill
28
+
29
+ - Implementar modelos Active Record con validaciones, scopes o asociaciones
30
+ - Crear controladores Rails y sus actions CRUD
31
+ - Construir service objects para lógica de negocio compleja
32
+ - Integrar Hotwire (Turbo Frames, Turbo Streams, Stimulus)
33
+ - Configurar Action Cable o canales de WebSocket
34
+ - Crear jobs con ActiveJob o Sidekiq
35
+ - Escribir tests con RSpec (modelos, requests, system specs)
36
+ - Migrar vistas ERB tradicionales a Hotwire
37
+ - Optimizar queries con eager loading para prevenir N+1
38
+ - Configurar ActiveRecord::Encryption para campos sensibles (Rails 7+)
39
+
40
+ ## Estructura de proyecto Rails 7+
41
+
42
+ ```
43
+ app/
44
+ ├── controllers/
45
+ │ ├── application_controller.rb
46
+ │ └── api/v1/
47
+ ├── models/
48
+ │ ├── concerns/ # Módulos compartidos entre modelos
49
+ │ └── application_record.rb
50
+ ├── services/ # Service objects para lógica compleja
51
+ ├── jobs/ # ActiveJob / Sidekiq
52
+ ├── views/
53
+ │ └── components/ # ViewComponent
54
+ ├── javascript/
55
+ │ ├── controllers/ # Stimulus controllers
56
+ │ └── application.js
57
+ └── channels/ # Action Cable
58
+ ```
59
+
60
+ ## Regla crítica: prevenir N+1 con includes
61
+
62
+ ```ruby
63
+ # NUNCA — N+1 query (1 + N queries en la vista)
64
+ @posts = Post.all
65
+ # En la vista: post.author.nombre → query por cada post
66
+
67
+ # SIEMPRE — eager loading
68
+ @posts = Post.includes(:author, :tags).order(created_at: :desc)
69
+
70
+ # Con condición en asociación (usa JOIN, no subquery)
71
+ @posts = Post.eager_load(:author).where(authors: { verified: true })
72
+
73
+ # Bullet gem para detectar N+1 en desarrollo
74
+ # config/environments/development.rb:
75
+ # config.after_initialize { Bullet.enable = true; Bullet.rails_logger = true }
76
+ ```
77
+
78
+ ## Model con validaciones, scopes y asociaciones
79
+
80
+ ```ruby
81
+ class Post < ApplicationRecord
82
+ belongs_to :author, class_name: 'User'
83
+ has_many :comments, dependent: :destroy
84
+ has_many_attached :images
85
+ has_rich_text :body
86
+
87
+ enum :status, { borrador: 0, publicado: 1, archivado: 2 }, prefix: true
88
+
89
+ validates :titulo, presence: true, length: { maximum: 200 }
90
+ validates :cuerpo, presence: true
91
+
92
+ scope :publicados, -> { where(status: :publicado) }
93
+ scope :recientes, -> { order(created_at: :desc) }
94
+ scope :del_autor, ->(user) { where(author: user) }
95
+
96
+ before_save :normalizar_titulo
97
+
98
+ private
99
+
100
+ def normalizar_titulo
101
+ self.titulo = titulo.strip.capitalize
102
+ end
103
+ end
104
+ ```
105
+
106
+ ## Controller delgado con service objects
107
+
108
+ ```ruby
109
+ class PostsController < ApplicationController
110
+ before_action :authenticate_user!
111
+ before_action :set_post, only: [:show, :edit, :update, :destroy]
112
+
113
+ def create
114
+ result = Posts::CrearService.call(
115
+ autor: current_user,
116
+ parametros: post_params
117
+ )
118
+
119
+ if result.exitoso?
120
+ redirect_to result.post, notice: 'Publicación creada'
121
+ else
122
+ @post = result.post
123
+ render :new, status: :unprocessable_entity
124
+ end
125
+ end
126
+
127
+ private
128
+
129
+ def set_post
130
+ @post = Post.find(params[:id])
131
+ end
132
+
133
+ def post_params
134
+ params.require(:post).permit(:titulo, :cuerpo, :status, images: [])
135
+ end
136
+ end
137
+ ```
138
+
139
+ ## Service Object pattern
140
+
141
+ ```ruby
142
+ # app/services/posts/crear_service.rb
143
+ module Posts
144
+ class CrearService
145
+ Result = Struct.new(:exitoso?, :post, :errores, keyword_init: true)
146
+
147
+ def self.call(autor:, parametros:)
148
+ new(autor: autor, parametros: parametros).call
149
+ end
150
+
151
+ def initialize(autor:, parametros:)
152
+ @autor = autor
153
+ @parametros = parametros
154
+ end
155
+
156
+ def call
157
+ post = Post.new(@parametros.merge(author: @autor))
158
+
159
+ if post.save
160
+ NotificarSeguidoresJob.perform_later(post.id)
161
+ Result.new(exitoso?: true, post: post, errores: [])
162
+ else
163
+ Result.new(exitoso?: false, post: post, errores: post.errors.full_messages)
164
+ end
165
+ end
166
+ end
167
+ end
168
+ ```
169
+
170
+ ## Sidekiq Job
171
+
172
+ ```ruby
173
+ class NotificarSeguidoresJob < ApplicationJob
174
+ queue_as :default
175
+ sidekiq_options retry: 3, dead: false, backtrace: 5
176
+
177
+ def perform(post_id)
178
+ post = Post.find_by(id: post_id)
179
+ return unless post # El post puede haberse eliminado
180
+
181
+ post.author.seguidores.find_each do |seguidor|
182
+ NotificacionMailer.nueva_publicacion(seguidor, post).deliver_later
183
+ end
184
+ rescue StandardError => e
185
+ Rails.logger.error("NotificarSeguidoresJob falló para post #{post_id}: #{e.message}")
186
+ raise # Re-raise para que Sidekiq reintente
187
+ end
188
+ end
189
+ ```
190
+
191
+ ## MUST DO / MUST NOT DO
192
+
193
+ **MUST DO:**
194
+ - `includes`/`eager_load` para prevenir N+1 en toda relación accedida fuera del modelo
195
+ - `strong_parameters` en todos los controllers (`permit` explícito, nunca `permit!`)
196
+ - Service objects para lógica de negocio compleja (más de 3 pasos o con side effects)
197
+ - `find_by` en lugar de `find` cuando el registro puede no existir
198
+ - Migraciones reversibles (`change` cuando es reversible, `up`/`down` cuando no)
199
+ - Tests con RSpec — cobertura >90% en modelos y services
200
+ - `perform_later` para jobs (async). `perform_now` solo en tests o CLIs
201
+
202
+ **MUST NOT DO:**
203
+ - Lógica de negocio en controllers ni en views
204
+ - `User.all` sin paginación en listas grandes (usar `kaminari` o `pagy`)
205
+ - Queries N+1 — instalar `bullet` gem en desarrollo para detectarlas
206
+ - `rescue Exception` — usar `rescue StandardError`
207
+ - `update_attribute` (omite validaciones) — usar `update` o `save`
208
+ - Secrets en código fuente — usar `rails credentials:edit` o variables de entorno
209
+ - Requests HTTP ni IO en callbacks de modelo (`after_save`, `after_create`)
210
+
211
+ ## Checklist de verificación
212
+
213
+ - [ ] Toda relación accedida en vista o serialización usa `includes`/`eager_load`
214
+ - [ ] `post_params` usa `permit` explícito (sin `permit!`)
215
+ - [ ] Lógica compleja extraída a service object en `app/services/`
216
+ - [ ] Jobs reintentables, idempotentes y con `find_by` (no `find`)
217
+ - [ ] Migraciones con `change` o pareja `up`/`down`
218
+ - [ ] Tests de modelo, request y (si hay JS) system specs cubren el happy path y errores
219
+ - [ ] Sin secrets hardcodeados (usar `Rails.application.credentials` o `ENV`)
220
+
221
+ ## Gotchas / Errores comunes no obvios
222
+
223
+ **Callbacks de modelo (`after_save`, `after_create`) con llamadas HTTP o IO bloquean la transacción completa**: Rails ejecuta los callbacks dentro de la transacción del `save`. Si el callback llama a un servicio externo (Stripe, Slack, S3) y falla, la transacción hace rollback pero el efecto externo ya ocurrió — estado inconsistente. Causa: los callbacks son síncronos y viven dentro del bloque de transacción de ActiveRecord. Fix: mover efectos secundarios externos a jobs (`after_create_commit { MyJob.perform_later(id) }`) o usar el patrón service object donde el commit ocurre antes de los side effects.
224
+
225
+ **`counter_cache` con `increment_counter` directo no dispara validaciones ni callbacks**: `Post.increment_counter(:comments_count, post_id)` actualiza la columna directamente con SQL sin pasar por el modelo, ignorando `before_save`, `after_save` y validaciones. Causa: es una operación SQL cruda para eficiencia. Fix: si se necesitan callbacks, usar `update` en la instancia del modelo; si solo se necesita el conteo sin callbacks, `increment_counter` es correcto y más eficiente.
226
+
227
+ **Migraciones con `add_index` en tablas grandes bloquean escrituras en PostgreSQL**: `add_index :facturas, :cliente_id` adquiere un `AccessExclusiveLock` durante toda la creación del índice — en tablas con millones de filas esto puede durar minutos bloqueando inserts y updates. Causa: el comportamiento por defecto de PostgreSQL. Fix: usar `add_index :facturas, :cliente_id, algorithm: :concurrently` en la migración, y separar la migración en su propio deployment sin otras operaciones DDL. Requiere que la migración sea irreversible o usar `disable_ddl_transaction!`.
228
+
229
+ **Turbo Frames requieren IDs de DOM únicos en toda la página — duplicados causan actualizaciones incorrectas**: si dos `turbo_frame_tag "comentario"` con el mismo id existen en la página (ej: en un listado), Turbo actualiza solo el primero que encuentra al recibir la respuesta. Causa: Turbo usa `document.getElementById()` que retorna el primer match. Fix: usar IDs compuestos con el `id` del registro: `turbo_frame_tag dom_id(comentario)` que genera `comentario_42`, `comentario_43`, etc.
230
+
231
+ ## Referencias a recursos extendidos
232
+
233
+ | Tema | Archivo |
234
+ |------|---------|
235
+ | Active Record avanzado: concerns, counter_cache, STI, bulk ops, encryption | [recursos/active-record.md](recursos/active-record.md) |
236
+ | Hotwire: Turbo Frames, Turbo Streams, Stimulus, Action Cable, morphing | [recursos/hotwire-turbo.md](recursos/hotwire-turbo.md) |
237
+ | RSpec: factories, request specs, system specs, mocking, coverage | [recursos/testing-rspec.md](recursos/testing-rspec.md) |