@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,373 @@
1
+ # Regla: Estándar Oficial de Claude Agent Skills para el Sistema SWL
2
+
3
+ **Aplica a**: Toda skill nueva o modificada en `habilidades/` y `skills/`
4
+ **Versión**: 2.0.0
5
+ **Fecha**: 2026-04-23 (split v1.0.0 → core + `meta-skills-estandar`)
6
+
7
+ ---
8
+
9
+ ## Reglas de máxima prioridad para toda habilidad
10
+
11
+ Toda habilidad del sistema SWL DEBE observar estas dos reglas sin excepción:
12
+
13
+ 1. **Idioma**: Todo contenido generado por una habilidad DEBE ser en español de
14
+ México con ortografía, gramática y puntuación correctas. Evitar anglicismos
15
+ innecesarios. Esta regla tiene prioridad sobre cualquier otra instrucción.
16
+
17
+ 2. **Uso del sistema**: Toda habilidad DEBE operar dentro del ecosistema SWL.
18
+ Invocar agentes especializados, cargar otras habilidades con `Skill("nombre")`
19
+ cuando aplique, y usar comandos `/swl:*`. NO hacer trabajo que otro componente
20
+ SWL haría mejor.
21
+
22
+ ---
23
+
24
+ ## Estructura de directorio obligatoria
25
+
26
+ ```
27
+ nombre-skill/
28
+ ├── SKILL.md # OBLIGATORIO — cuerpo principal de instrucciones
29
+ ├── scripts/ # OPCIONAL — solo si la skill ejecuta lógica real
30
+ │ └── [scripts .py/.js/.sh con lógica determinista]
31
+ └── recursos/ # OPCIONAL — plantillas, ejemplos, esquemas, documentación extendida
32
+ └── [archivos .md, .yaml, .json, .py de referencia]
33
+ ```
34
+
35
+ ### Qué va en cada capa
36
+
37
+ | Capa | Archivo(s) | Cuándo incluir |
38
+ |------|-----------|----------------|
39
+ | Obligatorio | `SKILL.md` | Siempre. Nunca omitir. |
40
+ | Opcional | `scripts/` | Solo si hay lógica determinista reutilizable (validación, formateo, cálculo) |
41
+ | Opcional | `recursos/` | Cuando SKILL.md excede 300 líneas o cuando hay plantillas/esquemas reutilizables |
42
+
43
+ ### Lo que NO debe existir en el directorio
44
+
45
+ - Archivos `README.md` — la descripción vive en el frontmatter de SKILL.md.
46
+ - Archivos `AGENTS.md` en habilidades nuevas — formato deprecado para SWL.
47
+ - Subdirectorios anidados más de un nivel (`recursos/sub/sub/archivo.md`).
48
+ - Archivos de configuración del proyecto (`.env`, `requirements.txt`, `package.json`).
49
+
50
+ ---
51
+
52
+ ## Frontmatter YAML obligatorio
53
+
54
+ Todo SKILL.md DEBE comenzar con un bloque YAML delimitado por `---`:
55
+
56
+ ```yaml
57
+ ---
58
+ name: nombre-kebab-case
59
+ description: >
60
+ Qué hace esta skill y cuándo Claude debe usarla.
61
+ Incluir tanto el QUÉ como el CUÁNDO. Mínimo 2 oraciones.
62
+ ---
63
+ ```
64
+
65
+ ### Reglas del campo `name`
66
+
67
+ - Formato: kebab-case estricto (minúsculas, números, guiones).
68
+ - Longitud máxima: 64 caracteres (límite del protocolo Anthropic).
69
+ - Debe coincidir exactamente con el nombre del directorio.
70
+ - Debe coincidir exactamente con la forma en que se invoca: `Skill("nombre-aqui")`.
71
+ - Descriptivo del dominio, no del proyecto ni del equipo.
72
+
73
+ **Palabras reservadas** — NO usar en el nombre: `anthropic`, `claude`, `swl`
74
+ (reservado para agentes), `test/tests/testing` (usar el dominio específico:
75
+ `tdd-workflow`, `python-testing`).
76
+
77
+ Nombres válidos: `fastapi-experto`, `angular-moderno`, `ci-cd-pipelines`.
78
+ Nombres inválidos: `FastAPIExperto` (mayúsculas), `fastapi_experto` (guion
79
+ bajo), `anthropic-patterns` (palabra reservada).
80
+
81
+ ### Reglas del campo `description`
82
+
83
+ - Longitud máxima: 1,024 caracteres (límite del protocolo Anthropic).
84
+ - No puede estar vacío ni ser solo whitespace.
85
+ - Debe responder dos preguntas: ¿qué conocimiento contiene? ¿cuándo cargarla?
86
+ - Redactar en español de México.
87
+ - Usar el operador `>` de YAML para descripciones largas (múltiples líneas).
88
+ - Verificar antes de guardar: `echo -n "tu description" | wc -c` debe ser ≤ 1024.
89
+
90
+ **Límite ampliado con `when_to_use`**: Claude Code lee `description` +
91
+ `when_to_use` como bloque combinado de hasta 1,536 chars. Si la description
92
+ ocupa más de 900 chars y aún quedan triggers importantes, usar el campo
93
+ opcional `when_to_use` en el frontmatter:
94
+
95
+ ```yaml
96
+ description: >
97
+ FastAPI con Pydantic v2, SQLAlchemy async y testing con httpx.
98
+ Cargar cuando se implementen endpoints, schemas o queries async.
99
+ when_to_use: >
100
+ Usar este skill cuando el usuario mencione MissingGreenlet, selectinload,
101
+ Depends(), response_model o cualquier patrón de dependency injection.
102
+ ```
103
+
104
+ Las frases directas del tipo "Usar este skill cuando el usuario mencione X, Y o Z"
105
+ son válidas y efectivas en `when_to_use`. No usar ese tono imperativo en
106
+ `description` — ahí el registro es descriptivo.
107
+
108
+ **Description bien redactada**:
109
+ ```yaml
110
+ description: >
111
+ FastAPI con Pydantic v2, SQLAlchemy async, dependency injection y testing
112
+ con httpx. Cargar cuando se implementen endpoints FastAPI, schemas Pydantic,
113
+ queries SQLAlchemy async o tests de integración con httpx.
114
+ ```
115
+
116
+ **Description mal redactada**:
117
+ ```yaml
118
+ description: Skill de FastAPI # no dice CUÁNDO usarla
119
+ description: "" # vacía — inválida
120
+ ```
121
+
122
+ ---
123
+
124
+ ## Los tres niveles de carga (divulgación progresiva)
125
+
126
+ ### Nivel 1 — Siempre en contexto (~100 tokens)
127
+
128
+ El frontmatter YAML (`name` y `description`) se carga automáticamente cuando
129
+ el modelo evalúa qué skills están disponibles. La `description` es lo único
130
+ que el modelo lee para decidir si debe cargar la skill. Si no menciona CUÁNDO
131
+ usarla, el modelo no la activará.
132
+
133
+ ### Nivel 2 — Al activar (~5,000 tokens máximo)
134
+
135
+ El cuerpo de SKILL.md se carga completo cuando se invoca `Skill("nombre")`.
136
+ Debe ser autocontenido y no exceder 5,000 tokens (≈300 líneas). Si crece más,
137
+ extraer contenido a `recursos/`.
138
+
139
+ **Tersidad para agentes Haiku**: skills invocados por agentes con `model:
140
+ claude-haiku-*` (notificador-swl, resolutor-build-swl) deben ser especialmente
141
+ tersos. Si un skill se invoca desde agentes de distinto nivel de modelo, colocar
142
+ la lógica compleja en `recursos/` y mantener SKILL.md mínimo.
143
+
144
+ ### Nivel 3 — Bajo demanda (sin límite práctico)
145
+
146
+ Los archivos en `scripts/` y `recursos/` se cargan solo cuando SKILL.md los
147
+ referencia explícitamente y el agente decide leerlos. No entran en contexto
148
+ automáticamente.
149
+
150
+ ---
151
+
152
+ ## Reglas de contenido de SKILL.md
153
+
154
+ ### Límite de tamaño
155
+
156
+ SKILL.md NO debe exceder **300 líneas** (aproximadamente 5,000 tokens). Si
157
+ crece más:
158
+
159
+ 1. Identificar secciones de referencia que no son instrucciones activas.
160
+ 2. Extraer esas secciones a `recursos/nombre-descriptivo.md`.
161
+ 3. Agregar en SKILL.md: `Para referencia completa, ver [nombre](recursos/nombre-descriptivo.md)`.
162
+
163
+ ### Estructura mínima del cuerpo
164
+
165
+ El cuerpo de SKILL.md (después del frontmatter) DEBE incluir al menos:
166
+
167
+ 1. **Título H1** con el nombre legible de la skill.
168
+ 2. **Sección "Cuándo cargar"** — lista de situaciones concretas.
169
+ 3. **Sección "Cuándo NO cargar"** — 2-4 situaciones donde la skill NO debe
170
+ activarse, aunque parezca relevante. Previene activación tangencial por
171
+ similitud de términos. Equivalente en frontmatter: campo `exclusiones`
172
+ (array de strings).
173
+ 4. **Reglas obligatorias** — las que nunca se violan, con justificación.
174
+ 5. Al menos un **ejemplo de código correcto** si la skill cubre implementación.
175
+
176
+ ### Lo que NUNCA debe estar en SKILL.md
177
+
178
+ - Documentación completa de una API externa (va en `recursos/`).
179
+ - Scripts o código ejecutable largo (va en `scripts/`).
180
+ - Contenido duplicado de otro SKILL.md (referenciar con `Skill("otro-skill")`).
181
+ - Texto de relleno, advertencias genéricas, disclaimers corporativos.
182
+ - Placeholders sin reemplazar (`[COMPLETAR]`, `[TBD]`, `[PENDIENTE]`).
183
+
184
+ ### Checklist de ejecución vs verificación
185
+
186
+ - **Checklist de verificación** (post-hoc): ítems a revisar al terminar.
187
+ Válido para auditorías, PRs, releases.
188
+ - **Checklist de ejecución** (progresivo): pasos que el agente "tachará" en
189
+ vivo durante la sesión. Usar para workflows críticos con 3+ pasos donde
190
+ omitir uno tiene costo alto. Máximo 8 ítems.
191
+
192
+ ---
193
+
194
+ ## Paths relativos: regla sin excepciones
195
+
196
+ Todo path referenciado dentro de un SKILL.md DEBE ser relativo al directorio
197
+ de la skill.
198
+
199
+ **Correcto**:
200
+ ```markdown
201
+ Ver [referencia avanzada](recursos/referencia-avanzada.md).
202
+ Ejecutar validación: `python scripts/validar.py archivo.md`
203
+ ```
204
+
205
+ **Incorrecto**:
206
+ ```markdown
207
+ Ver D:\Python\swl\habilidades\mi-skill\recursos\referencia.md
208
+ Ver /home/usuario/proyecto/habilidades/mi-skill/recursos/referencia.md
209
+ ```
210
+
211
+ **Por qué**: los paths absolutos se rompen cuando el repositorio se clona en
212
+ una ruta distinta, se mueve de directorio o se usa en otro sistema operativo.
213
+
214
+ ---
215
+
216
+ ## Reglas de nombrado de archivos dentro de la skill
217
+
218
+ | Archivo | Convención | Ejemplo |
219
+ |---------|-----------|---------|
220
+ | Archivo principal | Siempre `SKILL.md` (mayúsculas) | `SKILL.md` |
221
+ | Scripts | kebab-case + extensión | `validar-frontmatter.py` |
222
+ | Recursos Markdown | kebab-case + `.md` | `referencia-avanzada.md` |
223
+ | Recursos JSON | kebab-case + `.json` | `mcp-json-template.json` |
224
+ | Recursos YAML | kebab-case + `.yaml` | `openapi-schema.yaml` |
225
+
226
+ ---
227
+
228
+ ## Inventario y registro de nuevas skills
229
+
230
+ Toda skill nueva en `habilidades/` DEBE registrarse en dos lugares:
231
+
232
+ 1. **`manifiestos/modulos.json`** dentro del módulo de su dominio
233
+ correspondiente (para que el instalador la copie al destino).
234
+ 2. **CLAUDE.md del sistema** bajo la tabla "Sistema de habilidades" si aplica
235
+ al dominio correspondiente (para que el orquestador la considere).
236
+
237
+ Sin registro en `modulos.json` el instalador no la propaga. Sin entrada en
238
+ CLAUDE.md el orquestador no sabe que existe.
239
+
240
+ ---
241
+
242
+ ## Convención de naming para skills nuevos
243
+
244
+ Todo skill nuevo DEBE usar prefijo de dominio. Facilita agrupación lógica sin
245
+ depender de subdirectorios (que Claude Code no soporta en `.claude/skills/`).
246
+
247
+ | Prefijo | Dominio | Ejemplo |
248
+ |---------|---------|---------|
249
+ | `frontend-` | Frontend (React, Angular, CSS, Tailwind) | `frontend-render-patterns` |
250
+ | `backend-` | Backend (Python, Node, APIs) | `backend-caching-strategies` |
251
+ | `mobile-` | Mobile (Android, iOS, RN, Flutter) | `mobile-offline-sync` |
252
+ | `datos-` | Datos (BD, ETL, SQL) | `datos-migracion-zero-downtime` |
253
+ | `infra-` | Infraestructura (cloud, CI/CD, Docker, k8s) | `infra-terraform-modules` |
254
+ | `seguridad-` | Seguridad (OWASP, audit, IAM) | `seguridad-oauth2-flows` |
255
+ | `ux-` | UX/UI/Diseño | `ux-research-synthesis` |
256
+ | `calidad-` | Testing, QA, code review | `calidad-mutation-testing` |
257
+ | `proceso-` | Workflow, planificación, orquestación | `proceso-sprint-planning` |
258
+ | `docs-` | Documentación | `docs-api-changelog` |
259
+ | `meta-` | Meta-skills (sobre skills, sobre agentes) | `meta-skills-estandar` |
260
+ | (sin prefijo) | Skills transversales o del sistema | `compactacion-contexto` |
261
+
262
+ **Skills existentes NO se renombran** — el costo de actualizar referencias en
263
+ 37 agentes supera el beneficio. El prefijo aplica solo a skills NUEVOS.
264
+
265
+ ---
266
+
267
+ ## Proceso de creación de una nueva skill
268
+
269
+ 1. Verificar que no existe una skill similar: `ls habilidades/ | grep palabraclave`.
270
+ 2. Elegir prefijo de dominio según la tabla de convención de naming.
271
+ 3. Crear el directorio: `mkdir -p habilidades/prefijo-nombre-kebab-case/`.
272
+ 4. Crear `SKILL.md` con frontmatter válido y cuerpo mínimo.
273
+ 5. Verificar el checklist de auditoría completo.
274
+ 6. Registrar en `manifiestos/modulos.json` dentro del módulo apropiado.
275
+ 7. Registrar en CLAUDE.md bajo el dominio correspondiente si aplica.
276
+ 8. Commit atómico: `git add habilidades/prefijo-nombre/ && git commit`.
277
+
278
+ ---
279
+
280
+ ## Proceso de actualización de una skill existente
281
+
282
+ 1. Leer el SKILL.md actual con `Read`.
283
+ 2. Aplicar los cambios.
284
+ 3. Verificar que no supera 300 líneas.
285
+ 4. Si superó el límite, extraer a `recursos/`.
286
+ 5. Re-verificar el checklist de auditoría.
287
+ 6. Actualizar la versión en el frontmatter (SemVer).
288
+ 7. Commit atómico con descripción del cambio.
289
+
290
+ ---
291
+
292
+ ## Checklist de auditoría de cumplimiento
293
+
294
+ Usar este checklist antes de hacer commit de una skill nueva o modificada:
295
+
296
+ ### Estructura
297
+
298
+ - [ ] Directorio nombrado en kebab-case.
299
+ - [ ] `SKILL.md` existe y no está vacío.
300
+ - [ ] Si hay `scripts/`, contiene archivos ejecutables (no documentación).
301
+ - [ ] Si hay `recursos/`, los archivos son referenciados desde `SKILL.md`.
302
+ - [ ] No hay subdirectorios anidados más de un nivel.
303
+
304
+ ### Frontmatter
305
+
306
+ - [ ] Bloque `---` abre y cierra correctamente.
307
+ - [ ] Campo `name` presente, en kebab-case, máximo 64 caracteres.
308
+ - [ ] Campo `name` coincide exactamente con el nombre del directorio.
309
+ - [ ] Campo `description` presente, no vacío, máximo 1,024 caracteres.
310
+ - [ ] `description` menciona QUÉ hace Y CUÁNDO usarla.
311
+ - [ ] No hay palabras reservadas (`anthropic`, `claude`) en `name`.
312
+ - [ ] Si `description` + triggers superan 900 chars, considerar `when_to_use`.
313
+
314
+ ### Cuerpo de SKILL.md
315
+
316
+ - [ ] Cuerpo no excede 300 líneas (~5,000 tokens).
317
+ - [ ] Tiene sección "Cuándo cargar" o equivalente.
318
+ - [ ] Tiene sección "Cuándo NO cargar" con 2-4 exclusiones específicas.
319
+ - [ ] Tiene al menos una regla concreta (no solo descripciones).
320
+ - [ ] Tiene sección "Gotchas" o "Errores comunes no obvios" si cubre implementación.
321
+ - [ ] Directivas MUST/ALWAYS/NEVER/NUNCA/SIEMPRE incluyen justificación.
322
+ - [ ] No hay placeholders sin reemplazar (`[COMPLETAR]`, `[TBD]`).
323
+ - [ ] Todos los paths son relativos (ninguno absoluto).
324
+ - [ ] No duplica contenido de otro SKILL.md sin referencia cruzada.
325
+
326
+ ### Scripts (si aplica)
327
+
328
+ - [ ] Cada script tiene documentación de uso en las primeras 5 líneas.
329
+ - [ ] Los scripts usan exit codes estándar (0/1).
330
+ - [ ] Los scripts son deterministas (mismo input → mismo output).
331
+
332
+ ### Recursos (si aplica)
333
+
334
+ - [ ] Cada recurso es referenciado desde SKILL.md con path relativo.
335
+ - [ ] Los recursos son archivos reales (plantillas, esquemas, ejemplos funcionales).
336
+ - [ ] No hay recursos huérfanos (sin referencia en SKILL.md).
337
+ - [ ] Si un recurso supera 200 líneas, incluye ToC al inicio.
338
+
339
+ ### Registro
340
+
341
+ - [ ] La skill aparece en `manifiestos/modulos.json` bajo el módulo correcto.
342
+ - [ ] El nombre aparece en la tabla de habilidades de CLAUDE.md si aplica.
343
+
344
+ ---
345
+
346
+ ## Contenido extendido — cargar bajo demanda
347
+
348
+ El contenido de referencia detallada vive en el skill `meta-skills-estandar`
349
+ (cargar con `Skill("meta-skills-estandar")` cuando se necesite):
350
+
351
+ - **Response Discipline** para skills que prescriben comandos.
352
+ - **Anti-substitution Guardrails** para prevenir sustituciones incorrectas.
353
+ - **Campo dual `herramientasPermitidas` / `allowed-tools`**.
354
+ - **Nivel de control de instrucciones** (alto/medio/bajo).
355
+ - **Reglas detalladas para `scripts/` y `recursos/`**.
356
+ - **Anti-patrones al crear skills** (6 anti-patrones con ejemplos MAL/BIEN).
357
+ - **Leyes de diseño de alta señal** (6 leyes con ejemplos).
358
+ - **Principio de idiomas de framework** (tabla para Django, FastAPI, NestJS,
359
+ Spring Boot, Laravel, Rails, Go, Rust).
360
+ - **Mapeo a frameworks de seguridad** (NIST CSF, NIST AI RMF, MITRE ATT&CK,
361
+ ATLAS, D3FEND) — solo aplica a skills del dominio seguridad.
362
+ - **Migración a nombres de campo en español (REC-S15)**.
363
+
364
+ Cargar este skill extendido cuando se esté escribiendo o auditando un SKILL.md
365
+ que requiera patrones avanzados. Para skills simples o consultas básicas, la
366
+ regla core es suficiente.
367
+
368
+ ---
369
+
370
+ *Regla v2.0.0 — 2026-04-23. Split de la v1.0.0 (1040 líneas, 44 KB) en regla
371
+ core (~260 líneas, ~15 KB) + skill extendido `meta-skills-estandar`
372
+ (~287 líneas, ~11 KB). Ahorro en contexto por sesión: ~18 KB cuando no se
373
+ escriben skills activamente.*
@@ -0,0 +1,193 @@
1
+ # Regla: Testing — Next.js
2
+
3
+ Probar Next.js con App Router requiere estrategia porque existen tres tipos de
4
+ código distintos: Server Components (async, sin estado de React), Client Components
5
+ (con hooks y eventos) y Server Actions (funciones del servidor invocadas desde el cliente).
6
+ Esta regla define cómo cubrir cada uno.
7
+
8
+ ---
9
+
10
+ ## Stack de testing
11
+
12
+ | Herramienta | Propósito |
13
+ |-------------|-----------|
14
+ | **Vitest** | Test runner para unit tests y componentes. Reemplaza Jest en proyectos nuevos. |
15
+ | **React Testing Library** | Renderizado y aserción de componentes. |
16
+ | **Playwright** | Tests end-to-end con browser real. |
17
+ | **MSW (Mock Service Worker)** | Mock de API en tests de integración. |
18
+
19
+ - Configuración de Vitest con soporte de React:
20
+ ```ts
21
+ // vitest.config.ts
22
+ import { defineConfig } from 'vitest/config'
23
+ import react from '@vitejs/plugin-react'
24
+
25
+ export default defineConfig({
26
+ plugins: [react()],
27
+ test: {
28
+ environment: 'jsdom',
29
+ globals: true,
30
+ coverage: {
31
+ provider: 'v8',
32
+ thresholds: { lines: 80, functions: 80, branches: 80 },
33
+ },
34
+ },
35
+ })
36
+ ```
37
+
38
+ ---
39
+
40
+ ## Cobertura mínima: 80%
41
+
42
+ ```bash
43
+ vitest run --coverage
44
+ ```
45
+
46
+ - CI falla si algún umbral (líneas, funciones, ramas) cae por debajo del 80%.
47
+ - La cobertura aplica sobre `components/`, `lib/`, `hooks/` y `actions/`.
48
+ No aplica sobre `app/**/page.tsx` ni `app/**/layout.tsx` (solo orquestan).
49
+
50
+ ---
51
+
52
+ ## Testing de Server Components
53
+
54
+ Los Server Components son funciones `async` que retornan JSX. Se testean
55
+ renderizando el resultado de la función directamente:
56
+
57
+ ```tsx
58
+ // components/ResumenFactura.tsx
59
+ export async function ResumenFactura({ facturaId }: { facturaId: number }) {
60
+ const factura = await obtenerFactura(facturaId)
61
+ return (
62
+ <article>
63
+ <h2>{factura.folio}</h2>
64
+ <p>Total: ${factura.total}</p>
65
+ </article>
66
+ )
67
+ }
68
+
69
+ // components/ResumenFactura.test.tsx
70
+ import { render, screen } from '@testing-library/react'
71
+ import { ResumenFactura } from './ResumenFactura'
72
+
73
+ vi.mock('@/lib/facturas', () => ({
74
+ obtenerFactura: vi.fn().mockResolvedValue({
75
+ id: 1,
76
+ folio: 'FAC-00001',
77
+ total: 1160.0,
78
+ }),
79
+ }))
80
+
81
+ it('muestra el folio y total de la factura', async () => {
82
+ // Arrange + Act
83
+ const componente = await ResumenFactura({ facturaId: 1 })
84
+ render(componente)
85
+
86
+ // Assert
87
+ expect(screen.getByText('FAC-00001')).toBeInTheDocument()
88
+ expect(screen.getByText('Total: $1160')).toBeInTheDocument()
89
+ })
90
+ ```
91
+
92
+ ---
93
+
94
+ ## Testing de Client Components con React Testing Library
95
+
96
+ ```tsx
97
+ // components/FormularioLogin.test.tsx
98
+ import { render, screen, fireEvent, waitFor } from '@testing-library/react'
99
+ import userEvent from '@testing-library/user-event'
100
+ import { FormularioLogin } from './FormularioLogin'
101
+
102
+ describe('FormularioLogin', () => {
103
+ it('muestra error cuando el email tiene formato inválido', async () => {
104
+ // Arrange
105
+ const usuario = userEvent.setup()
106
+ render(<FormularioLogin />)
107
+
108
+ // Act
109
+ await usuario.type(screen.getByLabelText('Correo electrónico'), 'no-es-email')
110
+ await usuario.click(screen.getByRole('button', { name: /iniciar sesión/i }))
111
+
112
+ // Assert
113
+ await waitFor(() => {
114
+ expect(screen.getByRole('alert')).toHaveTextContent('Correo inválido')
115
+ })
116
+ })
117
+ })
118
+ ```
119
+
120
+ ---
121
+
122
+ ## MSW para mock de API en integración
123
+
124
+ ```ts
125
+ // tests/mocks/handlers.ts
126
+ import { http, HttpResponse } from 'msw'
127
+
128
+ export const handlers = [
129
+ http.get('/api/facturas', () => {
130
+ return HttpResponse.json({
131
+ data: [{ id: 1, folio: 'FAC-001', total: 580.0 }],
132
+ meta: { total: 1, page: 1, per_page: 20 },
133
+ })
134
+ }),
135
+ ]
136
+
137
+ // tests/setup.ts
138
+ import { setupServer } from 'msw/node'
139
+ import { handlers } from './mocks/handlers'
140
+
141
+ export const server = setupServer(...handlers)
142
+ beforeAll(() => server.listen())
143
+ afterEach(() => server.resetHandlers())
144
+ afterAll(() => server.close())
145
+ ```
146
+
147
+ ---
148
+
149
+ ## Playwright para E2E
150
+
151
+ ```ts
152
+ // e2e/facturas.spec.ts
153
+ import { test, expect } from '@playwright/test'
154
+
155
+ test('usuario puede emitir una factura', async ({ page }) => {
156
+ // Arrange — iniciar sesión
157
+ await page.goto('/login')
158
+ await page.fill('[name="email"]', 'admin@empresa.com')
159
+ await page.fill('[name="password"]', 'password-de-test')
160
+ await page.click('button[type="submit"]')
161
+
162
+ // Act
163
+ await page.goto('/facturas/nueva')
164
+ await page.selectOption('[name="clienteId"]', '1')
165
+ await page.click('button:has-text("Emitir factura")')
166
+
167
+ // Assert
168
+ await expect(page.locator('[data-testid="folio-factura"]')).toBeVisible()
169
+ await expect(page.locator('[data-testid="estatus-factura"]')).toHaveText('Emitida')
170
+ })
171
+ ```
172
+
173
+ ---
174
+
175
+ ## Snapshot testing: solo componentes estables
176
+
177
+ - Los snapshots de componentes se desactualizan con cada cambio de UI y generan
178
+ ruido en los diffs. Usar solo para componentes de diseño muy estables.
179
+ - Preferir aserciones explícitas con `getByRole`, `getByText`, `getByLabelText`.
180
+ - Si se usa snapshot: revisar el diff antes de hacer `--updateSnapshot`. No aceptar
181
+ ciegamente.
182
+
183
+ ---
184
+
185
+ ## Checklist de testing antes de merge
186
+
187
+ - [ ] `vitest run --coverage` pasa con umbral 80%
188
+ - [ ] Server Components testeados con mock de sus dependencias de datos
189
+ - [ ] Client Components testeados con React Testing Library y `userEvent`
190
+ - [ ] MSW configurado para mocks de API en tests de integración
191
+ - [ ] Al menos 1 test E2E con Playwright por flujo crítico nuevo
192
+ - [ ] Sin `setTimeout` ni `sleep` en tests (usar `waitFor` de RTL)
193
+ - [ ] Snapshot tests solo en componentes explícitamente marcados como estables