@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,170 @@
1
+ ---
2
+ name: context-builder
3
+ description: >
4
+ Ensamblador de contexto con presupuesto de tokens para inyección automática
5
+ entre sesiones SWL. Cargar cuando se configure la inyección de contexto,
6
+ se depure el hook inyeccion-contexto.js, o se necesite entender cómo SWL
7
+ prioriza información entre sesiones. Budget default recalibrado a 2500 por
8
+ el tokenizer de Opus 4.7 (+15-30% tokens vs 4.6).
9
+ version: "1.1.0"
10
+ herramientasPermitidas: [Read]
11
+ exclusiones:
12
+ - "No cargar para depurar hooks que no sean `inyeccion-contexto.js` — la lógica de ensamblado es específica de ese hook."
13
+ - "No cargar para buscar en el historial de sesiones; para búsqueda semántica usar `memoria-busqueda`."
14
+ - "No cargar si `tokenBudget` ya fue configurado en la sesión y no hay cambios de modelo o proyecto — re-configurarlo mid-session no tiene efecto."
15
+ - "No cargar para ajustar la compactación del contexto activo; para eso usar `compactacion-contexto`."
16
+ evolvable: true # default para skill estandar
17
+ ---
18
+ # Context Builder
19
+
20
+ ## Qué es y por qué importa
21
+
22
+ El Context Builder (`hooks/lib/context-builder.js`) ensambla el bloque de contexto
23
+ que se inyecta al inicio de cada sesión nueva. Su trabajo es responder en pocos
24
+ tokens la pregunta: *"¿Dónde estaba yo?"*
25
+
26
+ Sin el Context Builder, cada sesión parte de cero. Con él, el modelo recibe en
27
+ los primeros mensajes: el proyecto activo, los patrones aprendidos, el resumen de
28
+ la sesión anterior y los aprendizajes recientes. Todo dentro de un presupuesto
29
+ controlado que no satura el contexto.
30
+
31
+ ---
32
+
33
+ ## Las 5 secciones en orden de prioridad
34
+
35
+ El ensamblado es secuencial con prioridad decreciente. Si el presupuesto se agota,
36
+ las secciones de mayor número se omiten primero.
37
+
38
+ | Prioridad | Sección | Fuente |
39
+ |-----------|---------|--------|
40
+ | 1 (siempre) | Header | `path.basename(baseDir)` + `.planning/CONTEXTO.md` |
41
+ | 2 | Instintos activos | `instintos/proyecto.yaml` (confidence >= 0.7) |
42
+ | 3 | Sesión anterior | `.planning/sessions/latest.json` |
43
+ | 4 | Aprendizajes recientes | `.planning/APRENDIZAJES.md` (últimos N bloques H2) |
44
+ | 5 | Footer de truncamiento | Generado automáticamente si se omitió algo |
45
+
46
+ ### Sección 1 — Header
47
+
48
+ Siempre incluida. Formato:
49
+ ```
50
+ [SWL Context] Proyecto: nombre-proyecto | Modo: dev
51
+ ```
52
+
53
+ El modo se lee de `**Modo**: valor` en `.planning/CONTEXTO.md`. Fallback: `dev`.
54
+
55
+ ### Sección 2 — Instintos activos
56
+
57
+ Instintos del archivo `instintos/proyecto.yaml` que cumplen:
58
+ - `status: active`
59
+ - `confidence >= 0.7`
60
+
61
+ Se ordenan por confianza descendente y se limitan a `maxInstintos` (default: 5).
62
+
63
+ ### Sección 3 — Sesión anterior
64
+
65
+ Lee `.planning/sessions/latest.json` para localizar el JSON de la sesión.
66
+ No se incluye si:
67
+ - La sesión tiene `status: active` (es la sesión actual)
68
+ - La sesión tiene menos de 3 tool calls (demasiado corta para aportar contexto)
69
+
70
+ Incluye: `id`, `summary` (max 200 chars), `filesChanged` (max 5 archivos).
71
+
72
+ ### Sección 4 — Aprendizajes recientes
73
+
74
+ Lee los últimos N bloques `## título` de `.planning/APRENDIZAJES.md`.
75
+ Solo incluye el título de cada bloque (no el contenido completo).
76
+ Respeta el budget restante de forma estricta: deja de agregar si se agotaría.
77
+
78
+ ### Sección 5 — Footer de truncamiento
79
+
80
+ Solo aparece si alguna sección fue omitida por presupuesto agotado:
81
+ ```
82
+ [Contexto truncado — secciones omitidas: instintos, aprendizajes. Budget: 2000 tokens]
83
+ ```
84
+
85
+ ---
86
+
87
+ ## Token budget: por qué 2500 es el default óptimo (Opus 4.7)
88
+
89
+ El presupuesto controla cuántos tokens puede ocupar el bloque de contexto inyectado.
90
+
91
+ | Budget | Resultado |
92
+ |--------|-----------|
93
+ | < 1200 tokens | Contexto insuficiente. El header y poco más. Pierde continuidad. |
94
+ | 1200-2500 tokens | Zona óptima. Header + instintos + sesión anterior caben completos. |
95
+ | 2500-6000 tokens | Aceptable para proyectos con muchos instintos o aprendizajes. |
96
+ | > 6000 tokens | Contexto saturado. Diluye información útil. Penaliza el rendimiento. |
97
+
98
+ El default de 2500 tokens (~10,000 caracteres en español) cubre los 3 niveles de
99
+ contexto más valiosos sin consumir más del 1.25% de la ventana de un modelo sonnet.
100
+
101
+ **Nota sobre el tokenizer**: Opus 4.7 cambió el tokenizer respecto a 4.6 y produce
102
+ entre 1.0× y 1.35× más tokens para el mismo contenido. El default previo de 2000
103
+ quedó corto — el mismo bloque de contexto ahora pesa 2300–2700 tokens reales.
104
+ El default de 2500 restaura el margen útil.
105
+
106
+ ---
107
+
108
+ ## Configuración
109
+
110
+ ```js
111
+ const { buildContext } = require('./hooks/lib/context-builder');
112
+
113
+ const { contexto, tokensUsados, seccionesTruncadas } = buildContext(baseDir, {
114
+ tokenBudget: 2500, // default: 2500 (era 2000 pre-4.7)
115
+ maxAprendizajes: 5, // default: 5
116
+ maxInstintos: 5, // default: 5
117
+ });
118
+ ```
119
+
120
+ ---
121
+
122
+ ## Integración con inyeccion-contexto.js
123
+
124
+ El hook `hooks/inyeccion-contexto.js` llama a `buildContext` en la primera
125
+ invocación de cada sesión nueva. El flujo completo:
126
+
127
+ ```
128
+ Nueva sesión
129
+ → inyeccion-contexto.js detecta primera invocación
130
+ → llama buildContext(cwd, opciones)
131
+ → escribe contexto en stdout
132
+ → Claude lo recibe como parte del primer turno
133
+ → marca como inyectado en bridge para no repetir
134
+ ```
135
+
136
+ El Context Builder no escribe en stdout directamente — devuelve el string.
137
+ La responsabilidad de emitirlo es del hook que lo invoca.
138
+
139
+ ---
140
+
141
+ ## Cuándo NO cargar
142
+
143
+ - Se busca recuperar el historial de sesiones o aprendizajes anteriores; usar `memoria-busqueda` con las 3 capas (search/timeline/fetch).
144
+ - El hook `inyeccion-contexto.js` ya inyectó contexto en esta sesión — re-invocar el Context Builder no modifica el contexto en curso.
145
+ - Se necesita depurar un hook que no sea `inyeccion-contexto.js`; la lógica de este módulo es específica del ensamblado inicial.
146
+ - Se quiere cambiar el presupuesto de tokens de la sesión actual ya iniciada; el budget se configura antes de la primera invocación del hook.
147
+
148
+ ## Gotchas / Errores comunes no obvios
149
+
150
+ - **`seccionesTruncadas` ignorado cuando contiene secciones críticas**: el builder omite la sección 3 (sesión anterior) por presupuesto agotado y el agente no lo detecta, iniciando la sesión sin contexto de trabajo previo. Causa: no se verificó el campo `seccionesTruncadas` tras llamar a `buildContext`. Solución: si `seccionesTruncadas` no está vacío, ajustar `tokenBudget` hacia arriba o reducir `maxAprendizajes` hasta que las secciones 1-3 quepan completas — la sesión anterior es crítica.
151
+ - **Sesión con `status: active` incluida como sesión anterior**: el builder lee `latest.json` y encuentra la sesión actual marcada como `active`, inyectando el contexto de sí mismo. Causa: el filtro de `status: active` no se aplicó. Solución: verificar que `buildContext` excluye sesiones con `status: active` antes de incluirlas en la Sección 3 — la documentación ya lo especifica pero la implementación debe verificarse.
152
+ - **Budget de 2000 tokens sin recalibrar para Opus 4.7**: el mismo archivo de configuración que usaba 2000 en Opus 4.6 ahora satura el contexto porque el tokenizer produce 1.0-1.35× más tokens para el mismo contenido. Causa: no se actualizó la configuración al migrar de modelo. Solución: usar el default de 2500 que establece este skill para Opus 4.7; no asumir que el budget previo sigue siendo válido.
153
+ - **Instintos con `confidence < 0.7` incluidos en la Sección 2**: el código no aplica el filtro de confianza y llena el budget con instintos en estado draft. Causa: el filtro `confidence >= 0.7` se omitió en la implementación. Solución: verificar que `buildContext` filtra por `status: active` Y `confidence >= 0.7` — un draft no debe consumir tokens en la inyección inicial.
154
+
155
+ ## Anti-patrones
156
+
157
+ **Budget muy alto (> 5000 tokens)**
158
+ Incluir todo el APRENDIZAJES.md en cada sesión satura el contexto útil.
159
+ El modelo pierde foco cuando recibe demasiado contexto de baja relevancia.
160
+ Usar `maxAprendizajes` bajo (3-5) y `tokenBudget` moderado (2000-3000).
161
+
162
+ **Incluir todo sin priorizar**
163
+ El valor del Context Builder está en la selección, no en la exhaustividad.
164
+ Un header + 3 instintos relevantes > 50 aprendizajes sin estructura.
165
+ Las secciones de mayor prioridad deben caber siempre en el budget.
166
+
167
+ **Ignorar seccionesTruncadas**
168
+ Si `seccionesTruncadas` no está vacío y el contenido truncado es importante,
169
+ aumentar `tokenBudget` o reducir `maxAprendizajes`/`maxInstintos` para que
170
+ las secciones de mayor prioridad quepan completas.
@@ -0,0 +1,128 @@
1
+ ---
2
+ name: control-profundidad
3
+ deprecated: true
4
+ deprecated-since: "5.8.0"
5
+ deprecated-reason: >
6
+ Opus 4.7 no soporta extended thinking con budget fijo — el modelo decide
7
+ dinámicamente cuándo invertir tokens de pensamiento. Los niveles nativos
8
+ de esfuerzo de Claude Code (high | xhigh | max) reemplazan el sistema de
9
+ porcentajes 25/50/75/100% de este skill. Programado para eliminación en
10
+ un release MAJOR futuro. Mantenido ahora por retrocompatibilidad.
11
+ deprecated-replacement: >
12
+ Usar niveles de esfuerzo nativos de Claude Code via toggle Shift+Tab o
13
+ configuración de sesión. Para controlar verbosidad del output final,
14
+ usar la regla `brevedad-output.md` (obligatoria y siempre activa).
15
+ description: >
16
+ [DEPRECATED — eliminar en próximo MAJOR] Permite al usuario controlar
17
+ la profundidad y extension de las respuestas de Claude. Ofrece 4 niveles
18
+ (25/50/75/100%) con estimacion heuristica de tokens. Cargar cuando el
19
+ usuario pide controlar longitud de respuesta, dice "version corta", "responde
20
+ breve", "dame el detalle completo", "token budget", o variantes similares.
21
+ Para nuevas invocaciones, preferir niveles de esfuerzo nativos de Claude Code.
22
+ herramientasPermitidas: [Read, Grep]
23
+ exclusiones:
24
+ - "No cargar en proyectos con Opus 4.7 — los niveles nativos `high/xhigh/max` de Claude Code reemplazan este skill; ver tabla de migración en el cuerpo."
25
+ - "No cargar para controlar la longitud del output entre agentes — eso lo hace `reglas/brevedad-output.md` que es obligatoria y siempre activa."
26
+ - "No cargar si el usuario no pidió explícitamente controlar profundidad — no interrumpir el flujo con un menú de niveles no solicitado."
27
+ evolvable: true # default para skill estandar
28
+ ---
29
+ # Control de Profundidad de Respuesta
30
+
31
+ > **⚠ DEPRECATED**: Opus 4.7 maneja el esfuerzo de razonamiento
32
+ > de forma dinámica y no soporta extended thinking con budget fijo. Usar los
33
+ > niveles nativos `high | xhigh | max` de Claude Code en lugar del sistema de
34
+ > porcentajes. Para verbosidad del output final, aplica la regla
35
+ > `brevedad-output.md` que ya es obligatoria. Este skill se mantiene por
36
+ > retrocompatibilidad y se eliminará en un release MAJOR futuro.
37
+
38
+ ## Migración recomendada
39
+
40
+ | Usuario pide | Antes (este skill) | Ahora (nativo) |
41
+ |--------------|-------------------|----------------|
42
+ | "breve", "tldr", "corto" | Nivel 25% | `brevedad-output.md` (siempre activa) |
43
+ | "normal", "balanceado" | Nivel 50% | Default del modelo |
44
+ | "detallado", "completo" | Nivel 75% | Effort `xhigh` (default en Claude Code) |
45
+ | "exhaustivo", "a fondo" | Nivel 100% | Effort `max` (solo para análisis difíciles) |
46
+
47
+ Los niveles de esfuerzo se controlan con Shift+Tab en Claude Code o via
48
+ configuración por agente (`model: claude-opus-4-7` + el harness decide el
49
+ esfuerzo según el contexto).
50
+
51
+ ## Cuándo NO cargar
52
+
53
+ - El proyecto usa Opus 4.7 como modelo — los niveles nativos de esfuerzo (`high/xhigh/max` via `Shift+Tab`) son el mecanismo correcto; este skill está deprecated.
54
+ - Se quiere controlar brevedad del output entre agentes; `brevedad-output.md` ya aplica globalmente, sin necesidad de este skill.
55
+ - El usuario no pidió control de profundidad explícitamente — presentar el menú de niveles cuando no fue solicitado es ruido de UX.
56
+
57
+ ## Cuando activar
58
+
59
+ - El usuario menciona "version corta", "breve", "resumido", "tldr"
60
+ - El usuario pide "respuesta detallada", "completa", "exhaustiva"
61
+ - El usuario dice "token budget", "cuantos tokens", "controlar longitud"
62
+ - El usuario dice "al 25%", "al 50%", "dame la version corta"
63
+ - NO activar si el usuario ya eligio un nivel en esta sesion (mantenerlo)
64
+ - NO activar si la respuesta es trivial (1 linea)
65
+
66
+ ## Niveles de profundidad
67
+
68
+ | Nivel | % | Que incluir | Que omitir |
69
+ |-------|---|-------------|-----------|
70
+ | Esencial | 25% | Respuesta directa, 2-4 oraciones max | Contexto, ejemplos, alternativas |
71
+ | Moderado | 50% | Respuesta + contexto necesario + 1 ejemplo | Analisis profundo, edge cases |
72
+ | Detallado | 75% | Respuesta estructurada, multiples ejemplos, pros/contras | Edge cases extremos |
73
+ | Exhaustivo | 100% | Todo — analisis completo, todas las perspectivas | Nada |
74
+
75
+ ## Atajos — el usuario ya señala el nivel
76
+
77
+ | Que dice el usuario | Nivel |
78
+ |--------------------|-------|
79
+ | "breve", "corto", "tldr", "version corta", "1" | 25% |
80
+ | "normal", "moderado", "balanceado", "2" | 50% |
81
+ | "detallado", "completo", "a fondo", "3" | 75% |
82
+ | "exhaustivo", "todo", "sin limites", "4" | 100% |
83
+
84
+ Si el usuario ya señala el nivel, responder directamente a ese nivel sin preguntar.
85
+
86
+ ## Estimacion heuristica de tokens
87
+
88
+ Para estimar cuantos tokens usara cada nivel:
89
+
90
+ - Prosa en español: `palabras x 1.5`
91
+ - Codigo: `caracteres / 3.5`
92
+ - Mixto: usar el tipo dominante
93
+
94
+ | Complejidad | Multiplicador (sobre input) |
95
+ |-------------|---------------------------|
96
+ | Simple (que es X?) | 3x - 8x |
97
+ | Media (como funciona X?) | 8x - 20x |
98
+ | Alta (diseña/compara/analiza) | 15x - 40x |
99
+
100
+ ## Como presentar opciones
101
+
102
+ Solo presentar cuando el usuario pide explicitamente controlar profundidad
103
+ y NO ha indicado ya un nivel:
104
+
105
+ ```
106
+ Profundidad de respuesta:
107
+
108
+ [1] Esencial (25%) — respuesta directa, sin contexto
109
+ [2] Moderado (50%) — respuesta + contexto + 1 ejemplo
110
+ [3] Detallado (75%) — respuesta completa con alternativas
111
+ [4] Exhaustivo(100%) — todo, sin limites
112
+
113
+ Cual nivel? (1-4)
114
+ ```
115
+
116
+ ## Gotchas / Errores comunes no obvios
117
+
118
+ - **Nivel aplicado a output entre agentes**: el agente aplica el nivel 25% al output de un checkpoint o reporte técnico entre agentes, perdiendo información necesaria para el siguiente agente. Causa: el skill dice "solo aplica a respuestas al usuario" pero no se verificó el destino del output. Solución: verificar siempre si el destinatario es el usuario (nivel aplica) o un agente (brevedad-output.md aplica en cambio).
119
+ - **Nivel 100% en preguntas simples de diagnóstico**: el usuario pregunta "¿qué versión de Python usan?" con un nivel 100% activo de una sesión anterior y recibe 3 páginas de análisis del ecosistema. Causa: el nivel se mantuvo de la sesión anterior sin verificar si sigue siendo apropiado. Solución: al iniciar una nueva sesión o nueva tarea, verificar si el nivel persistido aplica al contexto actual — si la pregunta es trivial, responder a nivel Esencial independientemente del nivel activo.
120
+ - **Estimación heurística de tokens usada como presupuesto real**: el agente estima "este response costará 1500 tokens" con la heurística `palabras × 1.5` y lo usa para tomar decisiones de API budget. Causa: la heurística es para orientar al usuario, no para cálculos de coste. Solución: para presupuesto real de tokens, usar el tokenizer o el callback de tokens del modelo — la heurística tiene margen de error del ±30%.
121
+
122
+ ## Reglas
123
+
124
+ - Si el usuario eligio un nivel, mantenerlo para el resto de la sesion
125
+ - El nivel aplica solo a respuestas al usuario, NO a output entre agentes
126
+ (ahi aplica `brevedad-output.md` siempre)
127
+ - No preguntar en cada mensaje — solo cuando el usuario lo pide
128
+ - Complementa, no reemplaza, la regla de brevedad de agentes
@@ -0,0 +1,322 @@
1
+ ---
2
+ name: csharp-experto
3
+ description: >
4
+ C# moderno con ASP.NET Core, EF Core async, async/await con CancellationToken,
5
+ LINQ avanzado, Minimal APIs, Options pattern y Background Services.
6
+ Cargar cuando se implementen APIs ASP.NET Core, entidades EF Core, migraciones,
7
+ servicios .NET 8+ o cualquier código C# de producción.
8
+ version: "1.0.0"
9
+ herramientasPermitidas: [Read, Grep]
10
+ exclusiones:
11
+ - "No cargar para escribir tests C# (xUnit, NSubstitute, FluentAssertions) — para testing cargar `csharp-testing`."
12
+ - "No cargar para diseñar patrones C# (CQRS, Result<T>, MediatR) — para diseño arquitectónico cargar `csharp-patrones`."
13
+ - "No cargar para errores de compilación C# o .csproj — para build errors cargar `build-errors-csharp`."
14
+ - "No cargar para lógica en F#, VB.NET u otro lenguaje .NET — este skill cubre C# específicamente con ASP.NET Core."
15
+ evolvable: true # default para skill estandar
16
+ ---
17
+ # C# Experto — ASP.NET Core y .NET 8+
18
+
19
+ ## Cuándo NO cargar
20
+
21
+ - La tarea es escribir tests C# con xUnit, NSubstitute o FluentAssertions — cargar `csharp-testing`.
22
+ - La pregunta es sobre diseñar patrones C# (CQRS, Result<T>, MediatR, Unit of Work) — cargar `csharp-patrones`.
23
+ - Los errores son de compilación C# o configuración de `.csproj` — cargar `build-errors-csharp`.
24
+ - El proyecto usa F#, VB.NET u otro lenguaje .NET — este skill cubre C# con ASP.NET Core específicamente.
25
+
26
+ ## Estructura de proyecto recomendada
27
+
28
+ ```
29
+ MiApi/
30
+ ├── MiApi.csproj
31
+ ├── Program.cs # App factory, DI, middleware pipeline
32
+ ├── appsettings.json
33
+ ├── Features/ # Organizado por feature (Vertical Slice)
34
+ │ └── Facturas/
35
+ │ ├── FacturasEndpoints.cs
36
+ │ ├── FacturasService.cs
37
+ │ └── FacturaDto.cs
38
+ ├── Infrastructure/
39
+ │ ├── Persistence/
40
+ │ │ ├── AppDbContext.cs
41
+ │ │ └── Migrations/
42
+ │ └── BackgroundJobs/
43
+ └── Domain/
44
+ └── Entities/
45
+ ```
46
+
47
+ ---
48
+
49
+ ## Minimal APIs vs Controllers
50
+
51
+ Preferir Minimal APIs para servicios nuevos en .NET 8+. Controllers solo cuando se necesita herencia o filtros de acción complejos.
52
+
53
+ ```csharp
54
+ // Program.cs — App factory
55
+ var builder = WebApplication.CreateBuilder(args);
56
+
57
+ builder.Services.AddDbContext<AppDbContext>(o =>
58
+ o.UseNpgsql(builder.Configuration.GetConnectionString("Default")));
59
+ builder.Services.AddScoped<IFacturasService, FacturasService>();
60
+ builder.Services.Configure<EmailOptions>(
61
+ builder.Configuration.GetSection("Email"));
62
+
63
+ var app = builder.Build();
64
+
65
+ app.MapGroup("/api/v1/facturas")
66
+ .MapFacturasEndpoints()
67
+ .RequireAuthorization();
68
+
69
+ app.Run();
70
+
71
+ // FacturasEndpoints.cs
72
+ public static class FacturasEndpoints
73
+ {
74
+ public static RouteGroupBuilder MapFacturasEndpoints(
75
+ this RouteGroupBuilder group)
76
+ {
77
+ group.MapGet("/", ObtenerTodas);
78
+ group.MapGet("/{id:guid}", ObtenerPorId); // parametrica DESPUÉS de estática
79
+ group.MapPost("/", Crear);
80
+ return group;
81
+ }
82
+
83
+ static async Task<Results<Ok<FacturaDto>, NotFound>> ObtenerPorId(
84
+ Guid id, IFacturasService svc, CancellationToken ct) =>
85
+ await svc.ObtenerAsync(id, ct) is { } dto
86
+ ? TypedResults.Ok(dto)
87
+ : TypedResults.NotFound();
88
+ }
89
+ ```
90
+
91
+ ---
92
+
93
+ ## EF Core — DbContext Lifecycle
94
+
95
+ ```csharp
96
+ // REGLA: DbContext siempre Scoped. Nunca Singleton ni Transient.
97
+ builder.Services.AddDbContext<AppDbContext>(o =>
98
+ o.UseNpgsql(connectionString)
99
+ .EnableSensitiveDataLogging(app.Environment.IsDevelopment()));
100
+
101
+ public class AppDbContext(DbContextOptions<AppDbContext> options)
102
+ : DbContext(options)
103
+ {
104
+ public DbSet<Factura> Facturas => Set<Factura>();
105
+ public DbSet<Cliente> Clientes => Set<Cliente>();
106
+
107
+ protected override void OnModelCreating(ModelBuilder mb)
108
+ {
109
+ mb.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
110
+ }
111
+ }
112
+
113
+ // Configuración de entidad separada (nunca en OnModelCreating directamente)
114
+ public class FacturaConfiguration : IEntityTypeConfiguration<Factura>
115
+ {
116
+ public void Configure(EntityTypeBuilder<Factura> b)
117
+ {
118
+ b.HasKey(f => f.Id);
119
+ b.Property(f => f.Estatus)
120
+ .HasConversion<string>()
121
+ .HasMaxLength(20);
122
+ b.HasIndex(f => new { f.EmpresaId, f.Estatus }); // documentar qué query justifica el índice
123
+ }
124
+ }
125
+ ```
126
+
127
+ ---
128
+
129
+ ## Async/Await con CancellationToken
130
+
131
+ ```csharp
132
+ // SIEMPRE propagar CancellationToken hasta la BD
133
+ public async Task<List<FacturaDto>> ObtenerTodasAsync(
134
+ Guid empresaId, CancellationToken ct = default)
135
+ {
136
+ return await _db.Facturas
137
+ .Where(f => f.EmpresaId == empresaId)
138
+ .Select(f => new FacturaDto(f.Id, f.Folio, f.Total))
139
+ .AsNoTracking() // SIEMPRE en queries de solo lectura
140
+ .ToListAsync(ct); // ct llega hasta la BD
141
+ }
142
+
143
+ // NUNCA async void — solo async Task o async ValueTask
144
+ // MAL:
145
+ async void ProcesarEnBackground() { ... }
146
+
147
+ // BIEN:
148
+ async Task ProcesarEnBackgroundAsync(CancellationToken ct) { ... }
149
+ ```
150
+
151
+ ---
152
+
153
+ ## IHostedService y BackgroundService
154
+
155
+ ```csharp
156
+ public class FacturasProcesadorService(
157
+ IServiceScopeFactory scopeFactory,
158
+ ILogger<FacturasProcesadorService> logger)
159
+ : BackgroundService
160
+ {
161
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
162
+ {
163
+ while (!stoppingToken.IsCancellationRequested)
164
+ {
165
+ try
166
+ {
167
+ // SIEMPRE crear scope — BackgroundService es Singleton
168
+ await using var scope = scopeFactory.CreateAsyncScope();
169
+ var svc = scope.ServiceProvider.GetRequiredService<IFacturasService>();
170
+ await svc.ProcesarPendientesAsync(stoppingToken);
171
+ }
172
+ catch (Exception ex) when (ex is not OperationCanceledException)
173
+ {
174
+ logger.LogError(ex, "Error en ciclo de procesamiento");
175
+ }
176
+ await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
177
+ }
178
+ }
179
+ }
180
+ ```
181
+
182
+ ---
183
+
184
+ ## Options Pattern
185
+
186
+ ```csharp
187
+ // Validación en tiempo de inicio — no en runtime
188
+ public class EmailOptions
189
+ {
190
+ public const string Section = "Email";
191
+
192
+ [Required] public string SmtpHost { get; init; } = "";
193
+ [Range(1, 65535)] public int SmtpPort { get; init; } = 587;
194
+ [Required] public string ApiKey { get; init; } = "";
195
+ }
196
+
197
+ // Registro con validación
198
+ builder.Services
199
+ .AddOptions<EmailOptions>()
200
+ .BindConfiguration(EmailOptions.Section)
201
+ .ValidateDataAnnotations()
202
+ .ValidateOnStart(); // Falla al arrancar si la config es inválida
203
+
204
+ // Uso en servicio
205
+ public class EmailService(IOptions<EmailOptions> opts)
206
+ {
207
+ private readonly EmailOptions _config = opts.Value;
208
+ }
209
+ ```
210
+
211
+ ---
212
+
213
+ ## Records e Init-Only Properties
214
+
215
+ ```csharp
216
+ // Records para DTOs y Commands (inmutables por defecto)
217
+ public record FacturaDto(Guid Id, string Folio, decimal Total);
218
+
219
+ public record CrearFacturaCommand(
220
+ Guid EmpresaId,
221
+ string Folio,
222
+ List<ItemDto> Items);
223
+
224
+ // Init-only para configuración mutable parcialmente
225
+ public class ConfiguracionSistema
226
+ {
227
+ public required string Nombre { get; init; }
228
+ public required string Version { get; init; }
229
+ public bool ModoDebug { get; set; } // mutable post-construcción
230
+ }
231
+ ```
232
+
233
+ ---
234
+
235
+ ## LINQ Method Syntax avanzado
236
+
237
+ ```csharp
238
+ // Proyección con join — preferir Include/ThenInclude en EF Core
239
+ var reporte = await _db.Facturas
240
+ .Where(f => f.EmpresaId == empresaId && f.FechaEmision >= desde)
241
+ .GroupBy(f => f.ClienteId)
242
+ .Select(g => new ReporteClienteDto(
243
+ ClienteId: g.Key,
244
+ TotalFacturas: g.Count(),
245
+ MontoTotal: g.Sum(f => f.Total),
246
+ UltimaFactura: g.Max(f => f.FechaEmision)
247
+ ))
248
+ .OrderByDescending(r => r.MontoTotal)
249
+ .Take(10)
250
+ .ToListAsync(ct);
251
+ ```
252
+
253
+ ---
254
+
255
+ ## Nullable Reference Types
256
+
257
+ ```csharp
258
+ // <Nullable>enable</Nullable> en .csproj — OBLIGATORIO
259
+ // Expresar intención de nulabilidad en el tipo
260
+ public class Factura
261
+ {
262
+ public Guid Id { get; set; }
263
+ public string Folio { get; set; } = ""; // nunca null
264
+ public string? Observaciones { get; set; } // puede ser null
265
+ public Cliente Cliente { get; set; } = null!; // EF lo asigna, nunca null en runtime
266
+ }
267
+ ```
268
+
269
+ ---
270
+
271
+ ## Anti-patrones críticos
272
+
273
+ ### DbContext como Singleton — NUNCA
274
+
275
+ ```csharp
276
+ // MAL — DbContext no es thread-safe
277
+ builder.Services.AddSingleton<AppDbContext>(...);
278
+
279
+ // BIEN — siempre Scoped
280
+ builder.Services.AddDbContext<AppDbContext>(...);
281
+ ```
282
+
283
+ ### SaveChanges en repositorios — NUNCA
284
+
285
+ ```csharp
286
+ // MAL — el repositorio no sabe si hay otras operaciones en la misma transacción
287
+ public async Task<Factura> CrearAsync(Factura factura)
288
+ {
289
+ _db.Facturas.Add(factura);
290
+ await _db.SaveChangesAsync(); // NO aquí
291
+ return factura;
292
+ }
293
+
294
+ // BIEN — SaveChanges solo en el use case / endpoint
295
+ public async Task<Factura> CrearAsync(Factura factura)
296
+ {
297
+ _db.Facturas.Add(factura);
298
+ return factura; // El llamador hace SaveChanges
299
+ }
300
+ ```
301
+
302
+ ---
303
+
304
+ ## Gotchas / Errores comunes no obvios
305
+
306
+ **`DbContext` registrado como `Singleton` causa `InvalidOperationException` en acceso concurrente**: EF Core `DbContext` no es thread-safe — si se registra como Singleton y múltiples requests lo usan simultáneamente, las queries se mezclan. Fix: registrar siempre como `Scoped` (`services.AddDbContext<AppDbContext>(...)`); para `BackgroundService` que vive como Singleton, usar `IServiceScopeFactory` para crear un scope por operación.
307
+
308
+ **`async void` en event handlers de ASP.NET lanza excepciones que no se pueden capturar**: un método `async void` lanza su excepción en el SynchronizationContext del thread de UI (o en ThreadPool), sin que el llamador pueda atraparla con `try/catch`. En ASP.NET Core sin SynchronizationContext, la excepción mata el proceso. Fix: nunca usar `async void` excepto en event handlers de frameworks que lo requieren explícitamente; usar `async Task` siempre.
309
+
310
+ **`IOptions<T>` registrado con `AddOptions<T>().ValidateDataAnnotations()` no valida al arranque**: la validación solo ocurre cuando se resuelve el servicio, no en el startup. Una configuración inválida no se detecta hasta que el primer request llega. Fix: encadenar `.ValidateOnStart()` para que la validación falle en `builder.Build()` si la configuración es inválida: `services.AddOptions<MiConfig>().Bind(config).ValidateDataAnnotations().ValidateOnStart()`.
311
+
312
+ **LINQ `Select` sobre `IQueryable` con métodos no traducibles a SQL lanza en runtime**: `dbContext.Facturas.Select(f => new { Total = CalcularTotal(f) })` falla en runtime con `InvalidOperationException: Could not translate expression` si `CalcularTotal` no es una función que EF Core conoce. Fix: materializar primero con `AsEnumerable()` o `ToList()` para operaciones que requieren lógica C# no traducible, luego aplicar el `Select` en memoria — con cuidado de no traer más datos de los necesarios.
313
+
314
+ ## Checklist antes de merge
315
+
316
+ - [ ] CancellationToken propagado hasta ToListAsync/SaveChangesAsync
317
+ - [ ] AsNoTracking() en todos los queries de solo lectura
318
+ - [ ] DbContext registrado como Scoped, nunca Singleton
319
+ - [ ] No hay async void (solo async Task)
320
+ - [ ] BackgroundService usa IServiceScopeFactory para resolver Scoped services
321
+ - [ ] Nullable Reference Types habilitado en .csproj
322
+ - [ ] Options validados con ValidateOnStart()