@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,199 @@
1
+ ---
2
+ name: mobile-flutter
3
+ description: Flutter mejores prácticas. Cubre StatelessWidget/StatefulWidget/HookWidget, state management con Riverpod/BLoC/Provider, navegación con GoRouter y auto_route, platform channels, animaciones implícitas vs explícitas, performance con Impeller y const widgets, testing de widgets/integración/golden y anti-patrones críticos.
4
+ version: "1.0.0"
5
+ herramientasPermitidas: [Read, Grep]
6
+ exclusiones:
7
+ - "No cargar para React Native o Expo — Flutter usa Dart y tiene un modelo de renderizado completamente diferente; para React Native cargar `mobile-react-native`."
8
+ - "No cargar para apps nativas iOS (Swift/SwiftUI) o Android (Kotlin/Compose) — Flutter abstrae las plataformas con su propio motor; para iOS cargar `swift-experto`, para Android cargar `kotlin-experto`."
9
+ - "No cargar para errores de compilación Dart o configuración de Flutter SDK — para build errors usar las herramientas de diagnóstico de Flutter."
10
+ - "No cargar para diseño de UI web (CSS, Tailwind) — Flutter usa su propio sistema de widgets sin HTML/CSS."
11
+ evolvable: true # default para skill estandar
12
+ ---
13
+ # Flutter Experto
14
+
15
+ ## Cuándo NO cargar
16
+
17
+ - El proyecto es React Native o Expo — Flutter usa Dart con un motor de renderizado propio; para React Native cargar `mobile-react-native`.
18
+ - El proyecto es nativo iOS (Swift/SwiftUI) o Android (Kotlin/Compose) — cargar `swift-experto` o `kotlin-experto` según corresponda.
19
+ - Los errores son de compilación Dart, configuración del SDK o `pubspec.yaml` — usar las herramientas de diagnóstico de Flutter/Dart.
20
+ - El diseño UI es para web con HTML/CSS — Flutter no usa HTML; sus widgets son completamente distintos.
21
+
22
+ ## Filosofía
23
+
24
+ Flutter compila a código nativo ARM con su propio motor de renderizado (Skia/Impeller).
25
+ No usa componentes nativos del OS — pinta cada pixel.
26
+
27
+ **Regla fundamental**: Todo es un widget. Un widget no es mutable por sí solo —
28
+ se reconstruye cuando su estado o el estado de su ancestro cambia.
29
+
30
+ ---
31
+
32
+ ## 1. Tipos de Widget — Cuándo Usar Cuál
33
+
34
+ | Tipo | Cuándo |
35
+ |------|--------|
36
+ | **StatelessWidget** | Sin estado mutable, solo recibe props |
37
+ | **StatefulWidget** | Estado local al widget (animaciones, controllers) |
38
+ | **HookWidget** | Alternativa menos verbosa a StatefulWidget |
39
+ | **ConsumerWidget** | Cuando se usa Riverpod |
40
+
41
+ ```dart
42
+ // StatelessWidget — patrón base
43
+ class TarjetaUsuario extends StatelessWidget {
44
+ const TarjetaUsuario({super.key, required this.usuario, this.onTap});
45
+ final Usuario usuario;
46
+ final VoidCallback? onTap;
47
+
48
+ @override
49
+ Widget build(BuildContext context) {
50
+ return Card(
51
+ child: ListTile(
52
+ title: Text(usuario.nombre),
53
+ subtitle: Text(usuario.email),
54
+ trailing: const Icon(Icons.chevron_right),
55
+ onTap: onTap,
56
+ ),
57
+ );
58
+ }
59
+ }
60
+ ```
61
+
62
+ ---
63
+
64
+ ## 2. State Management — Riverpod (Recomendado)
65
+
66
+ ```dart
67
+ @riverpod
68
+ Future<List<Usuario>> listaUsuarios(ListaUsuariosRef ref) async {
69
+ final repo = ref.watch(usuarioRepositoryProvider);
70
+ return repo.obtenerTodos();
71
+ }
72
+
73
+ // Notifier con estado mutable
74
+ @riverpod
75
+ class CarritoNotifier extends _$CarritoNotifier {
76
+ @override
77
+ List<Producto> build() => [];
78
+
79
+ void agregar(Producto p) { state = [...state, p]; }
80
+ void eliminar(String id) { state = state.where((p) => p.id != id).toList(); }
81
+ }
82
+
83
+ // Uso con asyncValue.when()
84
+ asyncUsuarios.when(
85
+ data: (usuarios) => ListView.builder(...),
86
+ loading: () => const CircularProgressIndicator(),
87
+ error: (e, st) => Text('Error: $e'),
88
+ );
89
+ ```
90
+
91
+ ---
92
+
93
+ ## 3. Animaciones — Implícitas vs Explícitas
94
+
95
+ **Preferir implícitas** para transiciones simples:
96
+
97
+ ```dart
98
+ AnimatedContainer(
99
+ duration: const Duration(milliseconds: 300),
100
+ curve: Curves.easeInOut,
101
+ width: _expandido ? 200.0 : 100.0,
102
+ height: _expandido ? 200.0 : 100.0,
103
+ )
104
+ ```
105
+
106
+ Usar **explícitas** para animaciones complejas con `AnimationController`.
107
+ SIEMPRE disponer controllers en `dispose()`.
108
+
109
+ ---
110
+
111
+ ## 4. Performance — Reglas Críticas
112
+
113
+ - **`const` SIEMPRE que sea posible** — evita reconstrucción.
114
+ - **RepaintBoundary** para aislar subárboles que cambian frecuentemente.
115
+ - **`compute()`** para procesamiento pesado en isolate separado.
116
+ - **Impeller** habilitado por defecto en iOS y Android 3.19+.
117
+ - **Platform Views**: minimizar — tienen overhead significativo.
118
+
119
+ ```dart
120
+ // BIEN: const evita reconstrucción
121
+ child: const Padding(
122
+ padding: EdgeInsets.all(16),
123
+ child: Text('Título fijo'),
124
+ )
125
+
126
+ // CPU-intensivo: usar isolate
127
+ final resultado = await compute(procesarJsonGrande, jsonString);
128
+ ```
129
+
130
+ ---
131
+
132
+ ## 5. Anti-patrones Críticos
133
+
134
+ ### BuildContext después de await
135
+
136
+ ```dart
137
+ // MAL: context puede ser inválido
138
+ Future<void> _guardar() async {
139
+ await servicio.guardar(datos);
140
+ Navigator.of(context).pop(); // puede crashear
141
+
142
+ // BIEN: verificar mounted
143
+ if (!mounted) return;
144
+ Navigator.of(context).pop();
145
+ }
146
+ ```
147
+
148
+ ### setState en subárboles grandes
149
+
150
+ NUNCA `setState` en la raíz — reconstruye toda la pantalla.
151
+ Aislar el estado al widget que lo necesita, o usar Riverpod/BLoC.
152
+
153
+ ### Dispose olvidado
154
+
155
+ ```dart
156
+ // NUNCA olvidar:
157
+ @override
158
+ void dispose() {
159
+ _controller.dispose(); // AnimationController
160
+ _scrollController.dispose(); // ScrollController
161
+ _textController.dispose(); // TextEditingController
162
+ _focusNode.dispose(); // FocusNode
163
+ super.dispose();
164
+ }
165
+ ```
166
+
167
+ ---
168
+
169
+ ## 6. Testing
170
+
171
+ - **Widget tests**: `tester.pumpWidget()` + `find.text()` + `expect()`.
172
+ - **Golden tests**: `matchesGoldenFile()` para comparación visual.
173
+ - **Actualizar goldens**: `flutter test --update-goldens`.
174
+ - **Modo perfil**: `flutter run --profile` para detectar jank.
175
+
176
+ ---
177
+
178
+ ## Checklist Flutter
179
+
180
+ - [ ] Widgets const donde sea posible
181
+ - [ ] Controllers dispuestos en `dispose()`
182
+ - [ ] `mounted` verificado después de cada await
183
+ - [ ] State management con Riverpod o BLoC (no setState global)
184
+ - [ ] RepaintBoundary en animaciones frecuentes
185
+ - [ ] Compute para CPU-intensivo
186
+ - [ ] Widget tests para componentes clave
187
+ - [ ] Golden tests para componentes visuales críticos
188
+
189
+ Para implementaciones completas de BLoC, GoRouter, Platform Channels, animaciones explícitas y tests, ver [recursos/ejemplos-completos.md](recursos/ejemplos-completos.md).
190
+
191
+ ## Gotchas / Errores comunes no obvios
192
+
193
+ **Usar `BuildContext` después de un `await` sin verificar `mounted` causa `setState() called after dispose()`**: si el widget se desmontó mientras la operación async estaba en progreso, `context` ya no es válido. Causa: Flutter no cancela automáticamente operaciones async cuando el widget se destruye. Fix: siempre verificar `if (!mounted) return;` inmediatamente después de cada `await` antes de usar `context`, `setState` o `Navigator`.
194
+
195
+ **`const` en widgets con `GlobalKey` o con providers que cambian no previene reconstrucción**: `const TarjetaProducto(key: Key('prod-1'))` puede parecer que se cachea, pero si el `Provider` padre cambia y el widget consume datos del provider, se reconstruirá de todas formas. Causa: `const` en Flutter evita reconstrucción solo cuando el constructor recibe los mismos argumentos — no protege contra cambios en providers heredados. Fix: para aislar reconstrucciones costosas usar `Consumer` con un `builder` granular que solo consume el slice de estado necesario.
196
+
197
+ **`Riverpod` con `ref.watch` dentro de un callback (como `onPressed`) lanza `ProviderException`**: `ref.watch` solo puede llamarse en el cuerpo del `build` o en `ConsumerWidget` — llamarlo en `onPressed`, `initState` o callbacks async lanza error en runtime. Causa: `ref.watch` registra una suscripción que necesita el contexto de build activo. Fix: usar `ref.read` dentro de callbacks y `ref.watch` solo en el cuerpo del `build`.
198
+
199
+ **`AnimationController` sin `vsync: this` en un `StatefulWidget` que no implementa `TickerProviderStateMixin` causa error silencioso de rendimiento**: si se pasa `vsync: this` pero el widget solo implementa `SingleTickerProviderStateMixin` y luego se agregan más controllers, el segundo controller falla. Causa: `SingleTickerProviderStateMixin` solo soporta un ticker — el segundo lanza `FlutterError` en debug. Fix: implementar `TickerProviderStateMixin` (plural) cuando el widget necesita múltiples `AnimationController`.
@@ -0,0 +1,319 @@
1
+ # Flutter — Ejemplos Completos de Referencia
2
+
3
+ Implementaciones completas de widgets, state management, navegación, animaciones y testing.
4
+
5
+ ---
6
+
7
+ ## StatefulWidget Completo con Animación
8
+
9
+ ```dart
10
+ class ContadorAnimado extends StatefulWidget {
11
+ const ContadorAnimado({super.key, required this.inicial});
12
+ final int inicial;
13
+
14
+ @override
15
+ State<ContadorAnimado> createState() => _ContadorAnimadoState();
16
+ }
17
+
18
+ class _ContadorAnimadoState extends State<ContadorAnimado>
19
+ with SingleTickerProviderStateMixin {
20
+ late int _count;
21
+ late AnimationController _controller;
22
+
23
+ @override
24
+ void initState() {
25
+ super.initState();
26
+ _count = widget.inicial;
27
+ _controller = AnimationController(
28
+ vsync: this,
29
+ duration: const Duration(milliseconds: 300),
30
+ );
31
+ }
32
+
33
+ @override
34
+ void dispose() {
35
+ _controller.dispose();
36
+ super.dispose();
37
+ }
38
+
39
+ void _incrementar() {
40
+ setState(() { _count++; });
41
+ _controller.forward(from: 0);
42
+ }
43
+
44
+ @override
45
+ Widget build(BuildContext context) {
46
+ return Column(
47
+ children: [
48
+ Text('$_count', style: const TextStyle(fontSize: 48)),
49
+ FloatingActionButton(onPressed: _incrementar, child: const Icon(Icons.add)),
50
+ ],
51
+ );
52
+ }
53
+ }
54
+ ```
55
+
56
+ ---
57
+
58
+ ## HookWidget (flutter_hooks)
59
+
60
+ ```dart
61
+ import 'package:flutter_hooks/flutter_hooks.dart';
62
+
63
+ class BusquedaWidget extends HookWidget {
64
+ const BusquedaWidget({super.key});
65
+
66
+ @override
67
+ Widget build(BuildContext context) {
68
+ final controller = useTextEditingController();
69
+ final query = useListenableSelector(controller, () => controller.text);
70
+ final debouncedQuery = useDebounced(query, const Duration(milliseconds: 300));
71
+
72
+ useEffect(() {
73
+ return null;
74
+ }, [debouncedQuery]);
75
+
76
+ return TextField(
77
+ controller: controller,
78
+ decoration: const InputDecoration(
79
+ hintText: 'Buscar...',
80
+ prefixIcon: Icon(Icons.search),
81
+ ),
82
+ );
83
+ }
84
+ }
85
+ ```
86
+
87
+ ---
88
+
89
+ ## BLoC — Implementación Completa
90
+
91
+ ```dart
92
+ import 'package:flutter_bloc/flutter_bloc.dart';
93
+
94
+ // Eventos
95
+ sealed class AutenticacionEvento {}
96
+ final class LoginSolicitado extends AutenticacionEvento {
97
+ const LoginSolicitado({required this.email, required this.password});
98
+ final String email, password;
99
+ }
100
+ final class CerrarSesion extends AutenticacionEvento {}
101
+
102
+ // Estados
103
+ sealed class AutenticacionEstado {}
104
+ final class NoAutenticado extends AutenticacionEstado {}
105
+ final class Cargando extends AutenticacionEstado {}
106
+ final class Autenticado extends AutenticacionEstado {
107
+ const Autenticado(this.usuario);
108
+ final Usuario usuario;
109
+ }
110
+ final class ErrorAutenticacion extends AutenticacionEstado {
111
+ const ErrorAutenticacion(this.mensaje);
112
+ final String mensaje;
113
+ }
114
+
115
+ // BLoC
116
+ class AutenticacionBloc extends Bloc<AutenticacionEvento, AutenticacionEstado> {
117
+ AutenticacionBloc(this._authRepo) : super(NoAutenticado()) {
118
+ on<LoginSolicitado>(_onLoginSolicitado);
119
+ on<CerrarSesion>((_, emit) => emit(NoAutenticado()));
120
+ }
121
+
122
+ final AuthRepository _authRepo;
123
+
124
+ Future<void> _onLoginSolicitado(
125
+ LoginSolicitado evento,
126
+ Emitter<AutenticacionEstado> emit,
127
+ ) async {
128
+ emit(Cargando());
129
+ try {
130
+ final usuario = await _authRepo.login(evento.email, evento.password);
131
+ emit(Autenticado(usuario));
132
+ } catch (e) {
133
+ emit(ErrorAutenticacion(e.toString()));
134
+ }
135
+ }
136
+ }
137
+ ```
138
+
139
+ ---
140
+
141
+ ## Navegación con GoRouter
142
+
143
+ ```dart
144
+ import 'package:go_router/go_router.dart';
145
+
146
+ final appRouter = GoRouter(
147
+ initialLocation: '/',
148
+ redirect: (context, state) {
149
+ final autenticado = context.read<AuthBloc>().state is Autenticado;
150
+ final estaEnLogin = state.matchedLocation == '/login';
151
+ if (!autenticado && !estaEnLogin) return '/login';
152
+ if (autenticado && estaEnLogin) return '/';
153
+ return null;
154
+ },
155
+ routes: [
156
+ GoRoute(
157
+ path: '/',
158
+ builder: (context, state) => const HomeScreen(),
159
+ routes: [
160
+ GoRoute(
161
+ path: 'usuarios/:id',
162
+ builder: (context, state) => DetalleUsuarioScreen(
163
+ id: state.pathParameters['id']!,
164
+ ),
165
+ ),
166
+ ],
167
+ ),
168
+ GoRoute(
169
+ path: '/login',
170
+ builder: (context, state) => const LoginScreen(),
171
+ ),
172
+ ShellRoute(
173
+ builder: (context, state, child) => ScaffoldConNavBar(child: child),
174
+ routes: [
175
+ GoRoute(path: '/inicio', builder: (_, __) => const InicioTab()),
176
+ GoRoute(path: '/perfil', builder: (_, __) => const PerfilTab()),
177
+ ],
178
+ ),
179
+ ],
180
+ );
181
+ ```
182
+
183
+ ---
184
+
185
+ ## Platform Channels
186
+
187
+ ```dart
188
+ import 'package:flutter/services.dart';
189
+
190
+ class BiometricoChannel {
191
+ static const _channel = MethodChannel('com.miapp/biometrico');
192
+
193
+ static Future<bool> autenticar(String motivo) async {
194
+ try {
195
+ final resultado = await _channel.invokeMethod<bool>(
196
+ 'autenticar',
197
+ {'motivo': motivo},
198
+ );
199
+ return resultado ?? false;
200
+ } on PlatformException catch (e) {
201
+ throw BiometricoException(e.message ?? 'Error biométrico');
202
+ }
203
+ }
204
+ }
205
+ ```
206
+
207
+ ```kotlin
208
+ // android/app/src/main/kotlin/.../MainActivity.kt
209
+ class MainActivity : FlutterActivity() {
210
+ override fun configureFlutterEngine(engine: FlutterEngine) {
211
+ super.configureFlutterEngine(engine)
212
+ MethodChannel(engine.dartExecutor.binaryMessenger, "com.miapp/biometrico")
213
+ .setMethodCallHandler { call, result ->
214
+ when (call.method) {
215
+ "autenticar" -> {
216
+ val motivo = call.argument<String>("motivo") ?: "Confirma tu identidad"
217
+ result.success(true)
218
+ }
219
+ else -> result.notImplemented()
220
+ }
221
+ }
222
+ }
223
+ }
224
+ ```
225
+
226
+ ---
227
+
228
+ ## Animaciones Explícitas
229
+
230
+ ```dart
231
+ class _LogoAnimadoState extends State<LogoAnimado>
232
+ with SingleTickerProviderStateMixin {
233
+ late AnimationController _controller;
234
+ late Animation<double> _escala;
235
+ late Animation<double> _rotacion;
236
+
237
+ @override
238
+ void initState() {
239
+ super.initState();
240
+ _controller = AnimationController(
241
+ vsync: this,
242
+ duration: const Duration(seconds: 2),
243
+ )..repeat(reverse: true);
244
+
245
+ _escala = Tween<double>(begin: 0.8, end: 1.2).animate(
246
+ CurvedAnimation(parent: _controller, curve: Curves.elasticInOut),
247
+ );
248
+ _rotacion = Tween<double>(begin: 0, end: 0.1).animate(
249
+ CurvedAnimation(parent: _controller, curve: Curves.easeInOut),
250
+ );
251
+ }
252
+
253
+ @override
254
+ Widget build(BuildContext context) {
255
+ return AnimatedBuilder(
256
+ animation: _controller,
257
+ builder: (context, child) {
258
+ return Transform.scale(
259
+ scale: _escala.value,
260
+ child: Transform.rotate(angle: _rotacion.value, child: child),
261
+ );
262
+ },
263
+ child: const FlutterLogo(size: 100),
264
+ );
265
+ }
266
+ }
267
+ ```
268
+
269
+ ---
270
+
271
+ ## Testing Completo
272
+
273
+ ### Widget Tests
274
+
275
+ ```dart
276
+ import 'package:flutter_test/flutter_test.dart';
277
+
278
+ void main() {
279
+ group('TarjetaUsuario', () {
280
+ final usuario = Usuario(id: '1', nombre: 'Ana López', email: 'ana@test.com');
281
+
282
+ testWidgets('muestra nombre y email', (tester) async {
283
+ await tester.pumpWidget(
284
+ MaterialApp(home: TarjetaUsuario(usuario: usuario)),
285
+ );
286
+ expect(find.text('Ana López'), findsOneWidget);
287
+ expect(find.text('ana@test.com'), findsOneWidget);
288
+ });
289
+
290
+ testWidgets('llama onTap al presionar', (tester) async {
291
+ var llamado = false;
292
+ await tester.pumpWidget(
293
+ MaterialApp(
294
+ home: TarjetaUsuario(usuario: usuario, onTap: () => llamado = true),
295
+ ),
296
+ );
297
+ await tester.tap(find.byType(ListTile));
298
+ expect(llamado, isTrue);
299
+ });
300
+ });
301
+ }
302
+ ```
303
+
304
+ ### Golden Tests
305
+
306
+ ```dart
307
+ testWidgets('TarjetaUsuario golden', (tester) async {
308
+ await tester.pumpWidget(
309
+ MaterialApp(home: TarjetaUsuario(usuario: usuario)),
310
+ );
311
+ await expectLater(
312
+ find.byType(TarjetaUsuario),
313
+ matchesGoldenFile('goldens/tarjeta_usuario.png'),
314
+ );
315
+ });
316
+
317
+ // Actualizar goldens:
318
+ // flutter test --update-goldens
319
+ ```
@@ -0,0 +1,176 @@
1
+ ---
2
+ name: mobile-react-native
3
+ description: React Native + Expo mejores prácticas. Cubre navegación con React Navigation y Expo Router, state management (Zustand, Redux Toolkit), native modules y Turbo Modules, animaciones con Reanimated, styling con StyleSheet y NativeWind, performance con Hermes y FlashList, testing con Detox y Jest Testing Library.
4
+ version: "1.0.0"
5
+ herramientasPermitidas: [Read]
6
+ exclusiones:
7
+ - "No cargar para Flutter (Dart, Riverpod, GoRouter, widgets) — React Native usa JavaScript/TypeScript con un puente nativo diferente; para Flutter cargar `mobile-flutter`."
8
+ - "No cargar para React web (Next.js, Server Components, CSS) — React Native no tiene DOM, no usa HTML/CSS y las APIs de navegación son distintas; para web cargar `react-experto`."
9
+ - "No cargar para errores de compilación de módulos nativos, Xcode o Gradle en React Native — para build errors nativos usar las herramientas de diagnóstico de la plataforma."
10
+ - "No cargar para apps iOS nativas (Swift) o Android nativas (Kotlin) — React Native y los SDKs nativos tienen modelos de ciclo de vida completamente distintos."
11
+ evolvable: true # default para skill estandar
12
+ ---
13
+ # React Native + Expo Experto
14
+
15
+ ## Cuándo NO cargar
16
+
17
+ - El proyecto es Flutter (Dart) — React Native usa JavaScript con puente nativo; para Flutter cargar `mobile-flutter`.
18
+ - El contexto es React para web (Next.js, Server Components, DOM) — React Native no tiene DOM ni HTML/CSS; para web cargar `react-experto`.
19
+ - Los errores son de compilación nativa: Xcode build failures, Gradle errors, módulos nativos no encontrados — usar las herramientas de diagnóstico de iOS/Android.
20
+ - El proyecto es una app nativa pura en Swift o Kotlin — cargar `swift-experto` o `kotlin-experto`.
21
+
22
+ ## Filosofía
23
+
24
+ React Native comparte la lógica de JavaScript con React web, pero el modelo
25
+ de renderizado es completamente nativo. El puente JS-nativo tiene costo;
26
+ la arquitectura moderna (Nueva Arquitectura / Fabric) lo reduce con JSI,
27
+ pero las reglas de rendimiento siguen siendo críticas.
28
+
29
+ ---
30
+
31
+ ## 1. Navegación — Expo Router (recomendado para proyectos nuevos)
32
+
33
+ Expo Router usa el sistema de archivos como router, similar a Next.js App Router:
34
+
35
+ ```
36
+ app/
37
+ ├── _layout.tsx # Root layout (Stack/Tabs)
38
+ ├── index.tsx # / (pantalla home)
39
+ ├── (tabs)/
40
+ │ ├── _layout.tsx # Tabs layout
41
+ │ ├── inicio.tsx # /inicio
42
+ │ └── perfil.tsx # /perfil
43
+ ├── usuarios/
44
+ │ ├── index.tsx # /usuarios
45
+ │ └── [id].tsx # /usuarios/:id
46
+ └── modal.tsx # Pantalla modal
47
+ ```
48
+
49
+ ```tsx
50
+ // app/_layout.tsx — Root layout con Stack
51
+ import { Stack } from 'expo-router';
52
+
53
+ export default function RootLayout() {
54
+ return (
55
+ <Stack screenOptions={{ headerStyle: { backgroundColor: '#f8fafc' } }}>
56
+ <Stack.Screen name="(tabs)" options={{ headerShown: false }} />
57
+ <Stack.Screen name="modal" options={{ presentation: 'modal' }} />
58
+ </Stack>
59
+ );
60
+ }
61
+
62
+ // Navegación programática
63
+ import { router } from 'expo-router';
64
+ router.push('/usuarios/123');
65
+ router.replace('/login');
66
+ router.back();
67
+ ```
68
+
69
+ ---
70
+
71
+ ## 2. State Management — Zustand (recomendado)
72
+
73
+ ```typescript
74
+ import { create } from 'zustand';
75
+ import { persist, createJSONStorage } from 'zustand/middleware';
76
+ import AsyncStorage from '@react-native-async-storage/async-storage';
77
+
78
+ interface SesionStore {
79
+ usuario: Usuario | null;
80
+ token: string | null;
81
+ login: (usuario: Usuario, token: string) => void;
82
+ logout: () => void;
83
+ }
84
+
85
+ export const useSesionStore = create<SesionStore>()(
86
+ persist(
87
+ (set) => ({
88
+ usuario: null,
89
+ token: null,
90
+ login: (usuario, token) => set({ usuario, token }),
91
+ logout: () => set({ usuario: null, token: null }),
92
+ }),
93
+ { name: 'sesion-storage', storage: createJSONStorage(() => AsyncStorage) }
94
+ )
95
+ );
96
+ ```
97
+
98
+ ---
99
+
100
+ ## 3. Animaciones con Reanimated
101
+
102
+ ```tsx
103
+ import Animated, { useSharedValue, useAnimatedStyle, withSpring, withTiming } from 'react-native-reanimated';
104
+
105
+ function TarjetaAnimada() {
106
+ const escala = useSharedValue(1);
107
+
108
+ const estiloAnimado = useAnimatedStyle(() => ({
109
+ transform: [{ scale: escala.value }],
110
+ }));
111
+
112
+ return (
113
+ <Animated.View style={[styles.tarjeta, estiloAnimado]}>
114
+ <Pressable
115
+ onPressIn={() => { escala.value = withSpring(0.95); }}
116
+ onPressOut={() => { escala.value = withSpring(1); }}
117
+ >
118
+ <Text>Presiona</Text>
119
+ </Pressable>
120
+ </Animated.View>
121
+ );
122
+ }
123
+ ```
124
+
125
+ ---
126
+
127
+ ## 4. Styling: StyleSheet (enfoque nativo)
128
+
129
+ ```tsx
130
+ // Crear estilos fuera del componente (procesados UNA vez, no en cada render)
131
+ const styles = StyleSheet.create({
132
+ contenedor: { flex: 1, backgroundColor: '#f8fafc', padding: 16 },
133
+ tarjeta: {
134
+ backgroundColor: '#ffffff', borderRadius: 12, padding: 16, marginBottom: 12,
135
+ shadowColor: '#000', shadowOffset: { width: 0, height: 2 },
136
+ shadowOpacity: 0.05, shadowRadius: 4, elevation: 2,
137
+ },
138
+ });
139
+ ```
140
+
141
+ ---
142
+
143
+ ## 5. Performance
144
+
145
+ - Hermes habilitado por defecto en Expo SDK 48+: `"jsEngine": "hermes"`
146
+ - Usar `FlashList` de `@shopify/flash-list` en lugar de `FlatList` para listas grandes
147
+ - SIEMPRE pasar `estimatedItemSize` a FlashList
148
+ - SIEMPRE memorizar `renderItem` con `useCallback` y componentes de lista con `React.memo`
149
+
150
+ ---
151
+
152
+ ## 6. Anti-patrones Críticos
153
+
154
+ - **Bridge overhead**: usar `useWindowDimensions()` hook en vez de `Dimensions.get('window')` en cada render
155
+ - **Bloquear hilo JS**: usar librerías nativas para procesamiento pesado (ImageManipulator, etc.)
156
+ - **Estilos inline en listas**: NUNCA `style={{ ... }}` en componentes de lista, usar `StyleSheet.create` fuera
157
+ - **setInterval sin cleanup**: SIEMPRE retornar cleanup en `useEffect`
158
+
159
+ ---
160
+
161
+ ## Ejemplos Completos
162
+
163
+ Para implementaciones de React Navigation tipada, Redux Toolkit, Turbo Modules,
164
+ Expo Modules API, Gesture Handler + Reanimated, NativeWind v4, y testing con
165
+ Jest/RNTL y Detox, ver
166
+ [recursos/ejemplos-completos.md](recursos/ejemplos-completos.md).
167
+
168
+ ## Gotchas / Errores comunes no obvios
169
+
170
+ **`useEffect` con `async` function directa no maneja el cleanup correctamente y puede causar memory leaks**: `useEffect(async () => { await fetch(...); }, [])` no puede retornar una función de cleanup desde una función async (retorna una Promise, no una función). Causa: `useEffect` espera que el callback retorne una función de cleanup o `undefined` — retornar una Promise hace que React ignore el cleanup. Fix: declarar la función async dentro del efecto y llamarla: `useEffect(() => { const fn = async () => { ... }; fn(); return () => { /* cleanup */ }; }, [])`.
171
+
172
+ **Reanimated `useAnimatedStyle` que accede a valores de estado React (no shared values) no actualiza en el UI thread**: `useAnimatedStyle(() => ({ opacity: someReactState }))` no reacciona cuando `someReactState` cambia porque los animated styles se ejecutan en el UI thread y no tienen acceso al estado React del JS thread. Causa: la separación de threads de Reanimated 2/3. Fix: convertir el valor a `useSharedValue` y actualizarlo con `useEffect` cuando cambie el estado React: `useEffect(() => { sharedVal.value = someReactState; }, [someReactState])`.
173
+
174
+ **`FlashList` con items de altura variable sin `overrideItemLayout` tiene scroll jumpy**: `FlashList` usa `estimatedItemSize` para todos los items por defecto — si los items tienen altura muy variable (ej: mensajes de chat), el scroll puede saltar al navegar de vuelta a items ya renderizados. Causa: la estimación de tamaño acumula error en listas con alta variabilidad. Fix: implementar `overrideItemLayout` que retorna el tamaño real de cada item conocido, o medir los items con `onLayout` y almacenar sus tamaños para retornarlos en la función.
175
+
176
+ **`Zustand` con `persist` en AsyncStorage puede devolver `null` en el primer render antes de que se rehidrate**: `useSesionStore(s => s.usuario)` puede retornar `null` el primer frame aunque haya datos persistidos, porque la rehidratación de AsyncStorage es asíncrona. Causa: AsyncStorage es asíncrono — el store se inicializa con el estado por defecto y luego se rehidrata. Fix: verificar el estado de hidratación con `useStore(s => s._hasHydrated)` (habilitando el `onRehydrateStorage` callback) o usar `zustand/middleware/persist` con la opción `skipHydration: true` y disparar la hidratación manualmente en el splash screen.