@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,290 @@
1
+ ---
2
+ name: filament-admin
3
+ description: >
4
+ Laravel Filament v3: optimización de paneles admin, formularios con Tabs y
5
+ Grid, Infolist para vistas de detalle, Tables con filtros avanzados y bulk
6
+ actions, Resources con relaciones anidadas. Cargar cuando se construya o
7
+ rediseñe un panel Filament, se implementen formularios complejos, tablas con
8
+ filtros o Resources con relaciones.
9
+ version: "1.0.0"
10
+ herramientasPermitidas: [Read, Grep]
11
+ evolvable: true # default para skill estandar
12
+ exclusiones:
13
+ - "No cargar para paneles admin genéricos sin Filament (Nova, Voyager, backpack) — cada panel tiene su propia API; cargar el skill del framework correspondiente."
14
+ - "No cargar para formularios frontend en la app pública de Laravel (Livewire sin Filament, Inertia/Vue) — para formularios de usuario final cargar `livewire-avanzado` o el skill del framework JS."
15
+ - "No cargar para migración de datos o seeds de base de datos en proyectos Laravel — para migraciones y seeds cargar `postgresql-experto` o el skill del ORM."
16
+ - "No cargar para autenticación y autorización en Laravel sin relación con paneles Filament — para auth cargar `auth-patrones` o `laravel-auth`."
17
+ ---
18
+ # Filament Admin v3 — Paneles, Formularios y Tablas
19
+
20
+ Skill para construir paneles de administración con Laravel Filament v3.
21
+ Cubre optimización de UX, formularios multi-tab, infolistas de detalle,
22
+ tablas con filtros y acciones masivas.
23
+
24
+ ---
25
+
26
+ ## Cuándo NO cargar
27
+
28
+ - El proyecto usa un panel admin diferente (Nova, Voyager, Backpack): cargar el skill del framework correspondiente.
29
+ - Los formularios son de la app pública del usuario final (Livewire sin Filament, Inertia/Vue): cargar `livewire-avanzado` o el skill del framework JS.
30
+ - La tarea es migración de datos, seeds o esquema de BD sin relación con el panel: cargar `postgresql-experto`.
31
+ - La tarea es autenticación y autorización sin relación con el panel Filament: cargar `auth-patrones`.
32
+
33
+ ## Cuándo cargar este skill
34
+
35
+ - Al crear o modificar un `Resource` de Filament (formulario, tabla o infolist)
36
+ - Al implementar formularios con más de 6 campos
37
+ - Al configurar filtros, ordenamiento o bulk actions en tablas
38
+ - Al separar modo vista del modo edición en un panel admin
39
+ - Al implementar relaciones anidadas (`HasMany`, `BelongsToMany`) en Forms o Tables
40
+
41
+ ---
42
+
43
+ ## 1. Jerarquía de optimización de UX (en orden de impacto)
44
+
45
+ ```
46
+ 1. Separar en Tabs secciones distintas → 60% menos scroll
47
+ 2. Grid::make(2) o Grid::make(3) dentro de sección → campos legibles en paralelo
48
+ 3. Collapsible en secciones secundarias → foco en lo importante
49
+ 4. Infolist separado del formulario → modo lectura sin inputs desactivados
50
+ 5. Repeater con itemLabel → listas identificables
51
+ 6. Placeholder para campos vacíos frecuentes → contexto sin campos en blanco
52
+ ```
53
+
54
+ ---
55
+
56
+ ## 2. Formulario con Tabs optimizados
57
+
58
+ ```php
59
+ use Filament\Forms\Components\{Tabs, Grid, TextInput, Select, Toggle, Section, Placeholder};
60
+
61
+ public static function form(Form $form): Form
62
+ {
63
+ return $form->schema([
64
+ Tabs::make('formulario')
65
+ ->tabs([
66
+ Tabs\Tab::make('Datos básicos')
67
+ ->icon('heroicon-o-user')
68
+ ->schema([
69
+ Grid::make(2)->schema([
70
+ TextInput::make('nombre')
71
+ ->required()
72
+ ->maxLength(100),
73
+ TextInput::make('email')
74
+ ->email()
75
+ ->unique(ignoreRecord: true),
76
+ ]),
77
+ Grid::make(3)->schema([
78
+ Select::make('rol')
79
+ ->options(Rol::class)
80
+ ->searchable()
81
+ ->preload(),
82
+ Select::make('empresa_id')
83
+ ->relationship('empresa', 'nombre')
84
+ ->searchable()
85
+ ->preload(),
86
+ Toggle::make('activo')
87
+ ->default(true),
88
+ ]),
89
+ ]),
90
+
91
+ Tabs\Tab::make('Configuración')
92
+ ->icon('heroicon-o-cog-6-tooth')
93
+ ->schema([
94
+ Section::make('Notificaciones')
95
+ ->collapsible()
96
+ ->collapsed()
97
+ ->schema([
98
+ Toggle::make('notif_email')->label('Por correo'),
99
+ Toggle::make('notif_sms')->label('Por SMS'),
100
+ ]),
101
+ ]),
102
+
103
+ Tabs\Tab::make('Historial')
104
+ ->icon('heroicon-o-clock')
105
+ ->schema([
106
+ Placeholder::make('creado_en')
107
+ ->label('Registrado')
108
+ ->content(fn ($record) => $record?->created_at?->diffForHumans() ?? '—'),
109
+ Placeholder::make('ultimo_acceso')
110
+ ->content(fn ($record) => $record?->last_login_at?->format('d/m/Y H:i') ?? 'Nunca'),
111
+ ]),
112
+ ])
113
+ ->columnSpanFull(),
114
+ ]);
115
+ }
116
+ ```
117
+
118
+ ---
119
+
120
+ ## 3. Infolist para modo vista (separar del formulario)
121
+
122
+ No desactivar inputs para modo lectura. Usar `Infolist` como método dedicado.
123
+
124
+ ```php
125
+ use Filament\Infolists\Components\{TextEntry, Section, Grid, IconEntry};
126
+
127
+ public static function infolist(Infolist $infolist): Infolist
128
+ {
129
+ return $infolist->schema([
130
+ Grid::make(3)->schema([
131
+ Section::make('Información personal')->schema([
132
+ TextEntry::make('nombre')->label('Nombre completo'),
133
+ TextEntry::make('email')->copyable(),
134
+ IconEntry::make('activo')
135
+ ->boolean()
136
+ ->trueColor('success')
137
+ ->falseColor('danger'),
138
+ ])->columnSpan(2),
139
+
140
+ Section::make('Estadísticas')->schema([
141
+ TextEntry::make('ordenes_count')
142
+ ->label('Órdenes')
143
+ ->badge()
144
+ ->color('primary'),
145
+ TextEntry::make('total_facturado')
146
+ ->label('Total facturado')
147
+ ->money('MXN'),
148
+ ])->columnSpan(1),
149
+ ]),
150
+ ]);
151
+ }
152
+ ```
153
+
154
+ ---
155
+
156
+ ## 4. Table con filtros y bulk actions
157
+
158
+ ```php
159
+ use Filament\Tables\Columns\{TextColumn, BadgeColumn, IconColumn};
160
+ use Filament\Tables\Filters\{SelectFilter, TernaryFilter};
161
+ use Filament\Tables\Actions\BulkAction;
162
+ use Illuminate\Support\Collection;
163
+
164
+ public static function table(Table $table): Table
165
+ {
166
+ return $table
167
+ ->columns([
168
+ TextColumn::make('nombre')->searchable()->sortable(),
169
+ TextColumn::make('empresa.nombre')->searchable()->toggleable(),
170
+ BadgeColumn::make('rol')
171
+ ->colors([
172
+ 'primary' => 'admin',
173
+ 'success' => 'usuario',
174
+ 'warning' => 'editor',
175
+ ]),
176
+ IconColumn::make('activo')->boolean(),
177
+ TextColumn::make('created_at')
178
+ ->dateTime('d/m/Y')
179
+ ->sortable()
180
+ ->toggleable(isToggledHiddenByDefault: true),
181
+ ])
182
+ ->filters([
183
+ SelectFilter::make('rol')->options(Rol::class),
184
+ SelectFilter::make('empresa')
185
+ ->relationship('empresa', 'nombre')
186
+ ->searchable()
187
+ ->preload(),
188
+ TernaryFilter::make('activo'),
189
+ ])
190
+ ->actions([
191
+ Tables\Actions\EditAction::make(),
192
+ Tables\Actions\DeleteAction::make(),
193
+ ])
194
+ ->bulkActions([
195
+ Tables\Actions\BulkActionGroup::make([
196
+ Tables\Actions\DeleteBulkAction::make(),
197
+ BulkAction::make('activar')
198
+ ->label('Activar seleccionados')
199
+ ->icon('heroicon-o-check')
200
+ ->action(fn (Collection $records) => $records->each->update(['activo' => true]))
201
+ ->requiresConfirmation(),
202
+ ]),
203
+ ])
204
+ ->defaultSort('created_at', 'desc')
205
+ ->poll('30s');
206
+ }
207
+ ```
208
+
209
+ ---
210
+
211
+ ## 5. Relaciones anidadas — HasMany con Repeater
212
+
213
+ ```php
214
+ use Filament\Forms\Components\Repeater;
215
+
216
+ Repeater::make('telefonos')
217
+ ->relationship('telefonos')
218
+ ->schema([
219
+ Grid::make(2)->schema([
220
+ Select::make('tipo')
221
+ ->options(['movil' => 'Móvil', 'oficina' => 'Oficina', 'casa' => 'Casa'])
222
+ ->required(),
223
+ TextInput::make('numero')->tel()->required(),
224
+ ]),
225
+ ])
226
+ ->itemLabel(fn (array $state): ?string => $state['numero'] ?? null)
227
+ ->collapsible()
228
+ ->defaultItems(1)
229
+ ->minItems(1),
230
+ ```
231
+
232
+ ---
233
+
234
+ ## 6. Reglas obligatorias
235
+
236
+ | Regla | Justificación | Verificación |
237
+ |-------|--------------|--------------|
238
+ | Tabs cuando formulario > 8 campos | Scroll interminable degrada UX | Contar campos en `form()` |
239
+ | `Grid::make(2+)` dentro de cada sección | Columna única desperdicia espacio horizontal | Revisar que no haya secciones sin Grid |
240
+ | `Infolist` separado para modo vista | `->disabled()` no es modo lectura real | Verificar que existe método `infolist()` en Resources con vista |
241
+ | `->searchable()->preload()` en selects de relación | Sin preload, el dropdown carga vacío | Revisar todo Select con `->relationship()` |
242
+ | `->unique(ignoreRecord: true)` en campos únicos | Sin esto, la edición siempre falla validación | Revisar campos `->unique()` en formularios de edición |
243
+ | `->collapsible()->collapsed()` en secciones secundarias | Reduce ruido visual en el formulario | Secciones de configuración, historial y metadatos |
244
+
245
+ ---
246
+
247
+ ## 7. Anti-patrones
248
+
249
+ | MAL | BIEN |
250
+ |-----|------|
251
+ | Formulario de 15 campos en una sola columna | Tabs con Grid::make(2) por sección |
252
+ | `TextInput::make()->disabled()` en modo vista | Método `infolist()` con TextEntry |
253
+ | `Select::make()->relationship()` sin `->preload()` | `->searchable()->preload()` siempre |
254
+ | Hardcodear opciones en Select: `->options(['a' => 'Admin'])` | `->options(Rol::class)` usando Enum |
255
+ | Table con columna de relación sin `->searchable()` | N+1 queries en listados — usar eager loading |
256
+ | `BulkAction` sin `->requiresConfirmation()` en acciones destructivas | Siempre confirmar acciones masivas |
257
+
258
+ ---
259
+
260
+ ## 8. Checklist de verificación
261
+
262
+ - [ ] Formulario con más de 8 campos usa Tabs
263
+ - [ ] Cada sección tiene Grid::make(2) o Grid::make(3)
264
+ - [ ] Secciones secundarias tienen `->collapsible()->collapsed()`
265
+ - [ ] Resource con vista de detalle implementa `infolist()`
266
+ - [ ] Todos los `Select` con relación usan `->searchable()->preload()`
267
+ - [ ] Campos únicos en edición tienen `->unique(ignoreRecord: true)`
268
+ - [ ] Bulk actions destructivas tienen `->requiresConfirmation()`
269
+ - [ ] Table usa `->defaultSort()` explícito
270
+
271
+ ---
272
+
273
+ ## 9. Referencias
274
+
275
+ | Tema | Recurso |
276
+ |------|---------|
277
+ | Documentación oficial Forms, Tables, Infolists | [filamentphp.com/docs/3.x](https://filamentphp.com/docs/3.x) |
278
+ | Heroicons para íconos de Tabs y Actions | [heroicons.com](https://heroicons.com) |
279
+ | FluxUI components para UI premium | [fluxui.dev](https://fluxui.dev) |
280
+ | Livewire v3 + Alpine.js integración | [livewire.laravel.com](https://livewire.laravel.com) |
281
+
282
+ ## Gotchas / Errores comunes no obvios
283
+
284
+ **`->unique(ignoreRecord: true)` no funciona en formularios de creación cuando el record no existe aún y el campo es único en la BD**: Filament pasa `ignoreRecord: true` para la edición (excluir el propio registro del chequeo), pero en creación este flag no tiene efecto si la regla unique no está configurada correctamente para el modelo. Causa: `ignoreRecord: true` necesita que el Resource tenga acceso al modelo del registro activo. En formularios de creación, el record es `null` y la regla unique valida correctamente, pero si el campo tiene valor `null` en la BD y se permite `nullable`, la validación puede pasar cuando no debería. Fix: usar `->unique(table: 'usuarios', column: 'email', ignorable: fn ($record) => $record)` para asegurarse del comportamiento correcto en creación y edición.
285
+
286
+ **`Select::make()->relationship()->searchable()` hace una query por cada pulsación de tecla sin debounce por defecto**: en producción con tablas grandes (>10,000 registros), el autocompletado del Select dispara una query SQL al servidor en cada keystroke. Con varios usuarios simultáneos, esto satura la BD. Causa: Filament no configura debounce en los selects de relación. Fix: agregar `->searchDebounce(500)` (milisegundos) en todos los Select con `->relationship()` en producción. Verificar con el query log de Laravel (`DB::enableQueryLog()`) cuántas queries se ejecutan al escribir en el campo.
287
+
288
+ **`Infolist` no se actualiza en tiempo real cuando el record cambia en la BD mientras el usuario lo tiene abierto**: Filament usa Livewire para reactividad, pero el `Infolist` carga los datos una sola vez al abrir el panel. Si otro usuario modifica el registro simultáneamente, el primer usuario sigue viendo datos desactualizados sin ninguna advertencia. Causa: los componentes Filament no tienen polling habilitado por defecto. Fix: agregar `->refreshable()` en el `ViewAction` del panel o configurar `->polling('30s')` en el componente de página si la frescura de datos es crítica para el caso de uso.
289
+
290
+ **`BulkAction` en tablas con `->paginated()` aplica la acción solo a los registros de la página actual, no a todos los que coinciden con el filtro**: si el usuario selecciona "todos" en la tabla pero hay filtros aplicados y múltiples páginas, Filament por defecto solo envía los IDs visibles en la página actual. Causa: la selección de "todos" en Filament opera sobre el conjunto paginado, no sobre la query completa. Fix: implementar `->deselectRecordsAfterCompletion()` y procesar la query completa dentro del `->action()` usando el filtro activo directamente en la BD, no la colección recibida por parámetro cuando el volumen puede ser mayor que una página.
@@ -0,0 +1,257 @@
1
+ ---
2
+ name: frontend-avanzado
3
+ description: >
4
+ Frontend avanzado: Web Workers, Service Workers, PWA, WebSockets, SSE, IndexedDB,
5
+ Web Components, Shadow DOM, CSS Container Queries, CSS Layers, View Transitions API.
6
+ Patrones de optimización de rendimiento.
7
+ version: "1.1.0"
8
+ evolved: true
9
+ evolved-from: "1.0.0"
10
+ evolved-at: "2026-04-24"
11
+ evolved-by: "aprender"
12
+ evolved-note: "Sección nueva: CSP 'unsafe-inline' como transitorio aceptable con plan de migración a nonce"
13
+ herramientasPermitidas: [Read, Grep]
14
+ evolvable: true # default para skill estandar
15
+ exclusiones:
16
+ - "No cargar para componentes UI estándar con frameworks (React, Angular, Vue) sin necesidad de APIs nativas — para implementación de componentes cargar el skill del framework."
17
+ - "No cargar para diseño responsivo (breakpoints, container queries en Tailwind, mobile-first layouts) — para diseño responsivo cargar `diseno-responsivo`."
18
+ - "No cargar para optimización de bundle (tree shaking, code splitting, Vite, Webpack) — para build optimization cargar el skill del bundler del proyecto."
19
+ - "No cargar para notificaciones push del lado cliente (Push API, Notification API) sin Service Worker completo — para integraciones de notificaciones cargar `notificaciones-multicanal`."
20
+ ---
21
+ # Frontend Avanzado — APIs Nativas y Rendimiento
22
+
23
+ ## Cuándo NO cargar
24
+
25
+ - La tarea es implementar componentes UI con React, Angular o Vue sin necesitar Web Workers, Service Workers ni IndexedDB: cargar el skill del framework.
26
+ - La tarea es diseño responsivo (breakpoints, Tailwind mobile-first, container queries para layout): cargar `diseno-responsivo`.
27
+ - La tarea es optimización del bundle de build (tree shaking, code splitting, Vite, Webpack): cargar el skill del bundler.
28
+ - La tarea es integración de notificaciones push sin implementar el Service Worker completo: cargar `notificaciones-multicanal`.
29
+
30
+ ## Por qué importan las APIs nativas del navegador
31
+
32
+ Los frameworks abstraen muchas APIs del navegador, pero conocerlas directamente permite:
33
+ - Descargar trabajo pesado del hilo principal (Web Workers).
34
+ - Ofrecer experiencias offline (Service Workers + IndexedDB).
35
+ - Actualización en tiempo real sin polling (WebSockets/SSE).
36
+ - Estilos que responden al contenedor, no solo a la pantalla (Container Queries).
37
+
38
+ ---
39
+
40
+ ## Web Workers — Reglas
41
+
42
+ - Todo cálculo que tome >50ms DEBE ir en un Web Worker.
43
+ - Comunicación tipada con interfaces `MensajeEntrada` / `MensajeSalida`.
44
+ - Reportar progreso para operaciones largas.
45
+ - NUNCA bloquear el hilo principal con operaciones O(n2).
46
+
47
+ ---
48
+
49
+ ## Service Workers — Estrategias de Caché
50
+
51
+ | Tipo de recurso | Estrategia |
52
+ |----------------|------------|
53
+ | APIs | Network First (fallback a caché) |
54
+ | Recursos estáticos (JS, imágenes) | Cache First |
55
+ | HTML | Stale While Revalidate |
56
+
57
+ Reglas obligatorias:
58
+ - `skipWaiting()` + `clients.claim()` para actualización inmediata.
59
+ - Limpiar cachés viejos en el evento `activate`.
60
+ - Precachear recursos críticos en `install`.
61
+ - Página `/offline.html` como fallback de última instancia.
62
+
63
+ ---
64
+
65
+ ## WebSockets vs SSE — Cuándo Usar Cuál
66
+
67
+ | Criterio | WebSocket | SSE |
68
+ |----------|-----------|-----|
69
+ | Dirección | Bidireccional | Servidor -> Cliente |
70
+ | Protocolo | ws:// / wss:// | HTTP estándar |
71
+ | Reconexión | Manual | Automática nativa |
72
+ | Complejidad | Mayor | Menor |
73
+
74
+ **Regla**: Si solo necesitas flujo del servidor al cliente, usa SSE. Es más simple.
75
+
76
+ Ambos DEBEN tener:
77
+ - Reconexión automática con backoff exponencial.
78
+ - Manejo de estado (conectando / conectado / desconectado).
79
+ - Cleanup al destruir el componente.
80
+
81
+ ---
82
+
83
+ ## IndexedDB — Reglas
84
+
85
+ - Esquema versionado con migraciones incrementales en `upgrade`.
86
+ - Índices para queries frecuentes.
87
+ - Patrón offline-first: guardar localmente, sincronizar cuando hay red.
88
+ - NUNCA almacenar datos sensibles sin cifrado adicional.
89
+
90
+ ---
91
+
92
+ ## CSS Container Queries — Reglas
93
+
94
+ - Preferir container queries sobre media queries para componentes reutilizables.
95
+ - El componente responde a su contenedor, no al viewport.
96
+ - Unidades `cqi` (container query inline) para tipografía fluida dentro del contenedor.
97
+
98
+ ```css
99
+ .contenedor { container-type: inline-size; container-name: tarjetas; }
100
+
101
+ @container tarjetas (min-width: 400px) {
102
+ .tarjeta { flex-direction: row; }
103
+ }
104
+ @container tarjetas (max-width: 399px) {
105
+ .tarjeta { flex-direction: column; }
106
+ }
107
+ ```
108
+
109
+ ---
110
+
111
+ ## CSS Cascade Layers — Reglas
112
+
113
+ - SIEMPRE declarar orden explícito de capas al inicio del archivo.
114
+ - Orden recomendado: `@layer reset, base, componentes, utilidades, sobreescrituras`.
115
+ - Las utilidades siempre ganan sobre componentes (por orden de capa, no especificidad).
116
+
117
+ ```css
118
+ @layer reset, base, componentes, utilidades, sobreescrituras;
119
+
120
+ @layer componentes {
121
+ .btn { padding: 0.5rem 1rem; border-radius: 0.25rem; }
122
+ }
123
+ @layer utilidades {
124
+ .hidden { display: none; }
125
+ }
126
+ ```
127
+
128
+ ---
129
+
130
+ ## View Transitions API — Reglas
131
+
132
+ - SIEMPRE verificar soporte: `if (!("startViewTransition" in document)) return;`
133
+ - Personalizar con `::view-transition-old` y `::view-transition-new`.
134
+ - `view-transition-name` para transiciones específicas de elemento.
135
+
136
+ ---
137
+
138
+ ## Checklist de Revisión
139
+
140
+ - [ ] Cálculos >50ms en Web Worker, no en hilo principal
141
+ - [ ] Service Worker con estrategia correcta por tipo de recurso
142
+ - [ ] IndexedDB con esquema versionado
143
+ - [ ] WebSocket/SSE con reconexión automática y backoff
144
+ - [ ] Container Queries para componentes reutilizables
145
+ - [ ] CSS Layers con orden explícito
146
+ - [ ] View Transitions con fallback
147
+ - [ ] Service Worker actualiza correctamente (`skipWaiting` + `clients.claim`)
148
+
149
+ Para implementaciones completas de cada API (Web Workers, Service Workers, WebSocket, SSE, IndexedDB, View Transitions), ver [recursos/apis-nativas-ejemplos.md](recursos/apis-nativas-ejemplos.md).
150
+
151
+ ## Gotchas / Errores comunes no obvios
152
+
153
+ **Un Web Worker falla silenciosamente cuando importa módulos ES que no están disponibles en el contexto del worker**: los Web Workers no tienen acceso al `window`, al DOM ni a módulos que dependan de él. Si el worker importa un módulo que llama a `document.createElement` o `window.fetch` internamente, el worker termina sin mensaje de error visible en la consola principal. Causa: los errores del worker solo se propagan si el código del worker los emite explícitamente. Fix: envolver todo el cuerpo del worker en un `try/catch` y usar `postMessage({ error: e.message })` para reportar fallos al hilo principal. Verificar con `worker.onerror = e => console.error(e)` antes de enviar el primer mensaje.
154
+
155
+ **Service Worker en `skipWaiting` + `clients.claim()` puede forzar una actualización de SW mientras el usuario tiene formularios a medio llenar**: `skipWaiting()` activa el SW nuevo inmediatamente, y `clients.claim()` toma control de todas las pestañas. Si el SW nuevo tiene breaking changes en el caché (versión diferente), las peticiones en vuelo en otras pestañas pueden recibir respuestas inesperadas o el estado local puede quedar inconsistente. Causa: la actualización de SW es asíncrona pero `clients.claim()` es agresivo. Fix: usar `skipWaiting()` solo en SWs que no cambien la estrategia de caché, y comunicar la actualización al cliente con `postMessage({ type: 'SW_UPDATED' })` para que el usuario pueda guardar y recargar voluntariamente.
156
+
157
+ **`IndexedDB` en Safari Private Browsing retorna quota de 0 bytes y cualquier `put()` lanza un error de quota excedida**: Safari en modo privado restringe IndexedDB a 0 bytes disponibles, pero la apertura de la BD (`indexedDB.open()`) no falla — solo las operaciones de escritura. Causa: Safari no comunica el modo privado al API web, y los errores de quota en IDB se lanzan de forma asíncrona en el handler de transacción. Fix: implementar un feature-detect en el `onsuccess` del `open()` intentando una operación de escritura de prueba y manejar el `QuotaExceededError`. Si se detecta, degradar gracefully a `sessionStorage` o a operación solo en memoria con aviso al usuario.
158
+
159
+ **La View Transitions API con `view-transition-name` en listas dinámicas produce transiciones que se solapan si dos elementos tienen el mismo nombre**: si el `view-transition-name` se genera dinámicamente con un valor que puede repetirse (como el tipo de componente en lugar del ID), el browser lanza un error de "duplicate names" y cancela toda la transición sin efecto visual. Causa: la especificación prohíbe tener dos elementos con el mismo `view-transition-name` activos simultáneamente. Fix: usar siempre el ID único del elemento como parte del nombre: `view-transition-name: item-${id}`. Agregar en el CSS `view-transition-name: none` en el `:hover` para deshabilitar la transición del elemento que no se está navegando si hay listas largas.
160
+
161
+ ---
162
+
163
+ ## CSP con `'unsafe-inline'` es transitorio aceptable; endurecer con nonce
164
+
165
+ ### Contexto
166
+
167
+ Content Security Policy (CSP) es un header HTTP que mitiga XSS restringiendo
168
+ qué fuentes de scripts, estilos e imágenes puede cargar el navegador. La
169
+ directiva más estricta es `script-src 'self'` (solo scripts del mismo origen),
170
+ pero muchas UIs legacy o con inyección de estilos dinámicos requieren
171
+ temporalmente `'unsafe-inline'` para funcionar.
172
+
173
+ ### Regla
174
+
175
+ `'unsafe-inline'` es **aceptable como paso transitorio** en migraciones hacia
176
+ CSP estricto, **pero nunca como estado final**. Debe venir acompañado de:
177
+
178
+ 1. Comentario `TODO: migrar a nonce` en el código que emite el CSP.
179
+ 2. Fecha objetivo de remoción (máximo 90 días).
180
+ 3. Issue en el tracker referenciando el TODO.
181
+
182
+ ### Patrón de migración en 3 fases
183
+
184
+ ```python
185
+ # Fase 1 — transitoria: permitir inline con warning claro
186
+ # TODO(2026-07-01): migrar a nonce-based CSP; eliminar 'unsafe-inline'
187
+ # Issue: https://tracker/X-1234
188
+ CSP_TRANSITORIO = "; ".join([
189
+ "default-src 'self'",
190
+ "script-src 'self' 'unsafe-inline'", # ← deuda técnica temporal
191
+ "style-src 'self' 'unsafe-inline'",
192
+ "img-src 'self' data:",
193
+ "connect-src 'self'",
194
+ ])
195
+
196
+
197
+ # Fase 2 — nonce por request: eliminar 'unsafe-inline' de scripts
198
+ import secrets
199
+
200
+ def construir_csp_con_nonce(nonce: str) -> str:
201
+ return "; ".join([
202
+ "default-src 'self'",
203
+ f"script-src 'self' 'nonce-{nonce}'",
204
+ "style-src 'self' 'unsafe-inline'", # estilos todavía pendientes
205
+ "img-src 'self' data:",
206
+ "connect-src 'self'",
207
+ ])
208
+
209
+
210
+ # En FastAPI middleware
211
+ @app.middleware("http")
212
+ async def csp_middleware(request: Request, call_next):
213
+ nonce = secrets.token_urlsafe(16)
214
+ request.state.csp_nonce = nonce # disponible para templates
215
+ response = await call_next(request)
216
+ response.headers["Content-Security-Policy"] = construir_csp_con_nonce(nonce)
217
+ return response
218
+
219
+
220
+ # Template usa el nonce en <script>
221
+ # <script nonce="{{ request.state.csp_nonce }}">...</script>
222
+
223
+
224
+ # Fase 3 — final: sin 'unsafe-inline' ni nonce necesario
225
+ CSP_ESTRICTO = "; ".join([
226
+ "default-src 'self'",
227
+ "script-src 'self'",
228
+ "style-src 'self'",
229
+ "img-src 'self' data:",
230
+ "connect-src 'self'",
231
+ ])
232
+ ```
233
+
234
+ ### Reglas
235
+
236
+ - **Nunca deployar Fase 1 sin fecha de migración a Fase 2/3 comprometida** — sin fecha, la deuda persiste indefinidamente.
237
+ - **`script-src` debe migrar a nonce antes que `style-src`** — los ataques XSS vía `<script>` son mucho más impactantes que vía `<style>`.
238
+ - **El nonce es por-request**, regenerado en cada response. Cachearlo entre requests anula la protección.
239
+ - **Agregar `Content-Security-Policy-Report-Only`** en staging antes de activar en producción para observar violaciones sin romper la UI.
240
+ - **Listar endpoints de report**: `report-uri /csp-report` o `report-to csp-endpoint` para recolectar violaciones y detectar intentos de XSS bloqueados.
241
+
242
+ ### Anti-patrón
243
+
244
+ ```python
245
+ # MAL — 'unsafe-inline' permanente sin TODO ni plan de migración
246
+ CSP = "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"
247
+ ```
248
+
249
+ `'unsafe-eval'` es aún más permisivo y habilita ataques de eval() dinámico —
250
+ debe eliminarse inmediatamente, no en fases. `'unsafe-inline'` puede coexistir
251
+ temporalmente.
252
+
253
+ ### Frameworks de seguridad
254
+
255
+ - OWASP Top 10 A03:2021 — Injection (XSS).
256
+ - MITRE ATT&CK T1189 — Drive-by Compromise.
257
+ - NIST CSF PR.PS-06 — Communications and control networks are protected.