theus-cli-linux-arm64 1.2.2 → 1.4.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 (759) hide show
  1. package/README.md +50 -11
  2. package/RELEASE.json +6 -6
  3. package/bin/theus +0 -0
  4. package/package.json +1 -1
  5. package/vendor/higiene-motor/PARCHES.md +244 -0
  6. package/vendor/higiene-motor/audit_dir.py +166 -0
  7. package/vendor/higiene-motor/audit_lib.py +333 -0
  8. package/vendor/higiene-motor/audit_website.py +635 -0
  9. package/vendor/higiene-motor/av_meta.py +498 -0
  10. package/vendor/higiene-motor/check_staged.py +71 -0
  11. package/vendor/higiene-motor/clean_ctrlregen.py +212 -0
  12. package/vendor/higiene-motor/clean_file.py +237 -0
  13. package/vendor/higiene-motor/clean_image.py +218 -0
  14. package/vendor/higiene-motor/clean_staged.py +143 -0
  15. package/vendor/higiene-motor/clean_text.py +108 -0
  16. package/vendor/higiene-motor/common.py +486 -0
  17. package/vendor/higiene-motor/container_meta.py +2522 -0
  18. package/vendor/higiene-motor/detect_gumbel.py +308 -0
  19. package/vendor/higiene-motor/detect_text_watermark.py +613 -0
  20. package/vendor/higiene-motor/format_dispatch.py +157 -0
  21. package/vendor/higiene-motor/hook_written_file.py +253 -0
  22. package/vendor/higiene-motor/image_meta.py +2171 -0
  23. package/vendor/higiene-motor/inspect_file.py +138 -0
  24. package/vendor/higiene-motor/inspect_image.py +72 -0
  25. package/vendor/higiene-motor/inspect_text.py +86 -0
  26. package/vendor/higiene-motor/markdiffusion_harness.py +533 -0
  27. package/vendor/higiene-motor/rewrite_text.py +737 -0
  28. package/vendor/higiene-motor/score_stylometry.py +460 -0
  29. package/vendor/higiene-motor/score_synthid.py +165 -0
  30. package/vendor/higiene-motor/server.py +1059 -0
  31. package/vendor/higiene-motor/synthid_score_server.py +176 -0
  32. package/vendor/higiene-motor/text_detectors.py +433 -0
  33. package/vendor/higiene-motor/text_unicode.py +730 -0
  34. package/vendor/theus-arsenal/.arsenal-nombres-ola2.json +0 -6
  35. package/vendor/theus-arsenal/.arsenal-nombres-ola3.json +0 -72
  36. package/vendor/theus-arsenal/.mailmap +0 -2
  37. package/vendor/theus-arsenal/.theus-plugin/marketplace.json +0 -25
  38. package/vendor/theus-arsenal/.theus-plugin/plugin.json +0 -20
  39. package/vendor/theus-arsenal/AUTHORS.md +0 -8
  40. package/vendor/theus-arsenal/CLEANROOM_REPLACEMENT_PLAN.md +0 -11
  41. package/vendor/theus-arsenal/LICENSE +0 -26
  42. package/vendor/theus-arsenal/PROVENANCE.md +0 -9
  43. package/vendor/theus-arsenal/README.md +0 -41
  44. package/vendor/theus-arsenal/THIRD_PARTY.md +0 -80
  45. package/vendor/theus-arsenal/agents/actualizador-docs.md +0 -123
  46. package/vendor/theus-arsenal/agents/analista-comentarios.md +0 -53
  47. package/vendor/theus-arsenal/agents/analista-conversaciones.md +0 -60
  48. package/vendor/theus-arsenal/agents/analista-tests-pr.md +0 -53
  49. package/vendor/theus-arsenal/agents/analista-tipos.md +0 -49
  50. package/vendor/theus-arsenal/agents/arquitecto-accesibilidad.md +0 -148
  51. package/vendor/theus-arsenal/agents/arquitecto-codigo.md +0 -79
  52. package/vendor/theus-arsenal/agents/arquitecto-homelab.md +0 -90
  53. package/vendor/theus-arsenal/agents/arquitecto-redes.md +0 -116
  54. package/vendor/theus-arsenal/agents/arquitecto-sistemas.md +0 -219
  55. package/vendor/theus-arsenal/agents/bifurcador-opensource.md +0 -206
  56. package/vendor/theus-arsenal/agents/cazador-fallos-silenciosos.md +0 -58
  57. package/vendor/theus-arsenal/agents/consultor-documentacion.md +0 -76
  58. package/vendor/theus-arsenal/agents/diagnosticador-redes.md +0 -135
  59. package/vendor/theus-arsenal/agents/ejecutor-e2e.md +0 -96
  60. package/vendor/theus-arsenal/agents/empaquetador-opensource.md +0 -257
  61. package/vendor/theus-arsenal/agents/escaner-secretos.md +0 -196
  62. package/vendor/theus-arsenal/agents/especialista-seo.md +0 -70
  63. package/vendor/theus-arsenal/agents/estratega-marketing.md +0 -158
  64. package/vendor/theus-arsenal/agents/evaluador-agentes.md +0 -214
  65. package/vendor/theus-arsenal/agents/evaluador-harness.md +0 -217
  66. package/vendor/theus-arsenal/agents/explorador-codigo.md +0 -79
  67. package/vendor/theus-arsenal/agents/extractor-specs.md +0 -214
  68. package/vendor/theus-arsenal/agents/generador-harness.md +0 -139
  69. package/vendor/theus-arsenal/agents/guia-tdd.md +0 -99
  70. package/vendor/theus-arsenal/agents/jefe-de-gabinete.md +0 -162
  71. package/vendor/theus-arsenal/agents/limpiador-refactors.md +0 -93
  72. package/vendor/theus-arsenal/agents/optimizador-rendimiento.md +0 -454
  73. package/vendor/theus-arsenal/agents/planificador-harness.md +0 -107
  74. package/vendor/theus-arsenal/agents/planificador.md +0 -221
  75. package/vendor/theus-arsenal/agents/resolutor-apps-harmonyos.md +0 -181
  76. package/vendor/theus-arsenal/agents/resolutor-builds-cpp.md +0 -98
  77. package/vendor/theus-arsenal/agents/resolutor-builds-dart.md +0 -209
  78. package/vendor/theus-arsenal/agents/resolutor-builds-django.md +0 -253
  79. package/vendor/theus-arsenal/agents/resolutor-builds-go.md +0 -102
  80. package/vendor/theus-arsenal/agents/resolutor-builds-java.md +0 -274
  81. package/vendor/theus-arsenal/agents/resolutor-builds-kotlin.md +0 -128
  82. package/vendor/theus-arsenal/agents/resolutor-builds-pytorch.md +0 -128
  83. package/vendor/theus-arsenal/agents/resolutor-builds-react.md +0 -214
  84. package/vendor/theus-arsenal/agents/resolutor-builds-rust.md +0 -156
  85. package/vendor/theus-arsenal/agents/resolutor-builds-swift.md +0 -169
  86. package/vendor/theus-arsenal/agents/resolutor-builds.md +0 -122
  87. package/vendor/theus-arsenal/agents/revisor-bd.md +0 -97
  88. package/vendor/theus-arsenal/agents/revisor-codigo.md +0 -291
  89. package/vendor/theus-arsenal/agents/revisor-config-red.md +0 -116
  90. package/vendor/theus-arsenal/agents/revisor-cpp.md +0 -80
  91. package/vendor/theus-arsenal/agents/revisor-csharp.md +0 -109
  92. package/vendor/theus-arsenal/agents/revisor-django.md +0 -168
  93. package/vendor/theus-arsenal/agents/revisor-fastapi.md +0 -82
  94. package/vendor/theus-arsenal/agents/revisor-flutter.md +0 -251
  95. package/vendor/theus-arsenal/agents/revisor-go.md +0 -84
  96. package/vendor/theus-arsenal/agents/revisor-java.md +0 -192
  97. package/vendor/theus-arsenal/agents/revisor-kotlin.md +0 -171
  98. package/vendor/theus-arsenal/agents/revisor-ml.md +0 -159
  99. package/vendor/theus-arsenal/agents/revisor-php.md +0 -108
  100. package/vendor/theus-arsenal/agents/revisor-python.md +0 -106
  101. package/vendor/theus-arsenal/agents/revisor-react.md +0 -166
  102. package/vendor/theus-arsenal/agents/revisor-rust.md +0 -102
  103. package/vendor/theus-arsenal/agents/revisor-seguridad.md +0 -116
  104. package/vendor/theus-arsenal/agents/revisor-software-clinico.md +0 -95
  105. package/vendor/theus-arsenal/agents/revisor-swift.md +0 -115
  106. package/vendor/theus-arsenal/agents/revisor-typescript.md +0 -123
  107. package/vendor/theus-arsenal/agents/revisor-vue.md +0 -205
  108. package/vendor/theus-arsenal/agents/simplificador-codigo.md +0 -55
  109. package/vendor/theus-arsenal/commands/actualizar-docs.md +0 -88
  110. package/vendor/theus-arsenal/commands/actualizar-mapas-codigo.md +0 -78
  111. package/vendor/theus-arsenal/commands/aprender-evaluar.md +0 -109
  112. package/vendor/theus-arsenal/commands/aprender.md +0 -74
  113. package/vendor/theus-arsenal/commands/arreglar-build.md +0 -66
  114. package/vendor/theus-arsenal/commands/bucle-multiperspectiva.md +0 -153
  115. package/vendor/theus-arsenal/commands/build-cpp.md +0 -173
  116. package/vendor/theus-arsenal/commands/build-flutter.md +0 -164
  117. package/vendor/theus-arsenal/commands/build-go.md +0 -183
  118. package/vendor/theus-arsenal/commands/build-gradle.md +0 -75
  119. package/vendor/theus-arsenal/commands/build-kotlin.md +0 -176
  120. package/vendor/theus-arsenal/commands/build-react.md +0 -187
  121. package/vendor/theus-arsenal/commands/build-rust.md +0 -187
  122. package/vendor/theus-arsenal/commands/campana-marketing.md +0 -125
  123. package/vendor/theus-arsenal/commands/checkpoint.md +0 -78
  124. package/vendor/theus-arsenal/commands/cobertura-tests.md +0 -73
  125. package/vendor/theus-arsenal/commands/configurar-gestor-paquetes.md +0 -86
  126. package/vendor/theus-arsenal/commands/consulta.md +0 -164
  127. package/vendor/theus-arsenal/commands/control-calidad.md +0 -50
  128. package/vendor/theus-arsenal/commands/crear-skill.md +0 -77
  129. package/vendor/theus-arsenal/commands/enrutar-modelo.md +0 -30
  130. package/vendor/theus-arsenal/commands/epica-desbloquear.md +0 -17
  131. package/vendor/theus-arsenal/commands/epica-descomponer.md +0 -22
  132. package/vendor/theus-arsenal/commands/epica-publicar.md +0 -21
  133. package/vendor/theus-arsenal/commands/epica-reclamar.md +0 -25
  134. package/vendor/theus-arsenal/commands/epica-revisar.md +0 -22
  135. package/vendor/theus-arsenal/commands/epica-sincronizar.md +0 -21
  136. package/vendor/theus-arsenal/commands/epica-validar.md +0 -21
  137. package/vendor/theus-arsenal/commands/evolucionar.md +0 -176
  138. package/vendor/theus-arsenal/commands/funcionalidad.md +0 -49
  139. package/vendor/theus-arsenal/commands/guardar-sesion.md +0 -278
  140. package/vendor/theus-arsenal/commands/harness-build.md +0 -111
  141. package/vendor/theus-arsenal/commands/harness-diseno.md +0 -46
  142. package/vendor/theus-arsenal/commands/informe-costos.md +0 -90
  143. package/vendor/theus-arsenal/commands/iniciar-bucle.md +0 -36
  144. package/vendor/theus-arsenal/commands/instintos-estado.md +0 -53
  145. package/vendor/theus-arsenal/commands/instintos-exportar.md +0 -69
  146. package/vendor/theus-arsenal/commands/instintos-importar.md +0 -120
  147. package/vendor/theus-arsenal/commands/lienzo-planes.md +0 -48
  148. package/vendor/theus-arsenal/commands/limpiar-refactor.md +0 -84
  149. package/vendor/theus-arsenal/commands/modo-seguro.md +0 -96
  150. package/vendor/theus-arsenal/commands/orq-agregar-funcionalidad.md +0 -36
  151. package/vendor/theus-arsenal/commands/orq-cambiar-funcionalidad.md +0 -38
  152. package/vendor/theus-arsenal/commands/orq-construir-mvp.md +0 -36
  153. package/vendor/theus-arsenal/commands/orq-corregir-defecto.md +0 -40
  154. package/vendor/theus-arsenal/commands/orq-refinar-codigo.md +0 -44
  155. package/vendor/theus-arsenal/commands/orq-revisar.md +0 -135
  156. package/vendor/theus-arsenal/commands/plan-prd.md +0 -160
  157. package/vendor/theus-arsenal/commands/plan.md +0 -198
  158. package/vendor/theus-arsenal/commands/podar.md +0 -31
  159. package/vendor/theus-arsenal/commands/pr.md +0 -181
  160. package/vendor/theus-arsenal/commands/promover.md +0 -41
  161. package/vendor/theus-arsenal/commands/proyectos.md +0 -33
  162. package/vendor/theus-arsenal/commands/prp-commit.md +0 -112
  163. package/vendor/theus-arsenal/commands/prp-implementar.md +0 -385
  164. package/vendor/theus-arsenal/commands/prp-planificar.md +0 -501
  165. package/vendor/theus-arsenal/commands/reanudar-sesion.md +0 -160
  166. package/vendor/theus-arsenal/commands/revisar-codigo.md +0 -289
  167. package/vendor/theus-arsenal/commands/revisar-cpp.md +0 -132
  168. package/vendor/theus-arsenal/commands/revisar-fastapi.md +0 -39
  169. package/vendor/theus-arsenal/commands/revisar-flutter.md +0 -115
  170. package/vendor/theus-arsenal/commands/revisar-go.md +0 -148
  171. package/vendor/theus-arsenal/commands/revisar-kotlin.md +0 -140
  172. package/vendor/theus-arsenal/commands/revisar-pr.md +0 -37
  173. package/vendor/theus-arsenal/commands/revisar-python.md +0 -297
  174. package/vendor/theus-arsenal/commands/revisar-react.md +0 -170
  175. package/vendor/theus-arsenal/commands/revisar-rust.md +0 -142
  176. package/vendor/theus-arsenal/commands/revisar-vue.md +0 -174
  177. package/vendor/theus-arsenal/commands/salud-skills.md +0 -52
  178. package/vendor/theus-arsenal/commands/sesiones.md +0 -345
  179. package/vendor/theus-arsenal/commands/test-cpp.md +0 -252
  180. package/vendor/theus-arsenal/commands/test-flutter.md +0 -143
  181. package/vendor/theus-arsenal/commands/test-go.md +0 -268
  182. package/vendor/theus-arsenal/commands/test-kotlin.md +0 -312
  183. package/vendor/theus-arsenal/commands/test-react.md +0 -265
  184. package/vendor/theus-arsenal/commands/test-rust.md +0 -309
  185. package/vendor/theus-arsenal/commands/vigilancia-canary.md +0 -43
  186. package/vendor/theus-arsenal/hooks/hooks.json +0 -274
  187. package/vendor/theus-arsenal/package.json +0 -6
  188. package/vendor/theus-arsenal/rules/angular/coding-style.md +0 -182
  189. package/vendor/theus-arsenal/rules/angular/hooks.md +0 -25
  190. package/vendor/theus-arsenal/rules/angular/patterns.md +0 -249
  191. package/vendor/theus-arsenal/rules/angular/security.md +0 -87
  192. package/vendor/theus-arsenal/rules/angular/testing.md +0 -164
  193. package/vendor/theus-arsenal/rules/arkts/coding-style.md +0 -153
  194. package/vendor/theus-arsenal/rules/arkts/hooks.md +0 -80
  195. package/vendor/theus-arsenal/rules/arkts/patterns.md +0 -236
  196. package/vendor/theus-arsenal/rules/arkts/security.md +0 -141
  197. package/vendor/theus-arsenal/rules/arkts/testing.md +0 -126
  198. package/vendor/theus-arsenal/rules/common/agents.md +0 -49
  199. package/vendor/theus-arsenal/rules/common/code-review.md +0 -123
  200. package/vendor/theus-arsenal/rules/common/coding-style.md +0 -90
  201. package/vendor/theus-arsenal/rules/common/development-workflow.md +0 -44
  202. package/vendor/theus-arsenal/rules/common/git-workflow.md +0 -24
  203. package/vendor/theus-arsenal/rules/common/hooks.md +0 -32
  204. package/vendor/theus-arsenal/rules/common/patterns.md +0 -31
  205. package/vendor/theus-arsenal/rules/common/performance.md +0 -53
  206. package/vendor/theus-arsenal/rules/common/security.md +0 -29
  207. package/vendor/theus-arsenal/rules/common/testing.md +0 -57
  208. package/vendor/theus-arsenal/rules/cpp/coding-style.md +0 -44
  209. package/vendor/theus-arsenal/rules/cpp/hooks.md +0 -39
  210. package/vendor/theus-arsenal/rules/cpp/patterns.md +0 -51
  211. package/vendor/theus-arsenal/rules/cpp/security.md +0 -51
  212. package/vendor/theus-arsenal/rules/cpp/testing.md +0 -44
  213. package/vendor/theus-arsenal/rules/csharp/coding-style.md +0 -72
  214. package/vendor/theus-arsenal/rules/csharp/hooks.md +0 -25
  215. package/vendor/theus-arsenal/rules/csharp/patterns.md +0 -50
  216. package/vendor/theus-arsenal/rules/csharp/security.md +0 -58
  217. package/vendor/theus-arsenal/rules/csharp/testing.md +0 -50
  218. package/vendor/theus-arsenal/rules/dart/coding-style.md +0 -159
  219. package/vendor/theus-arsenal/rules/dart/hooks.md +0 -68
  220. package/vendor/theus-arsenal/rules/dart/patterns.md +0 -261
  221. package/vendor/theus-arsenal/rules/dart/security.md +0 -135
  222. package/vendor/theus-arsenal/rules/dart/testing.md +0 -215
  223. package/vendor/theus-arsenal/rules/fsharp/coding-style.md +0 -112
  224. package/vendor/theus-arsenal/rules/fsharp/hooks.md +0 -26
  225. package/vendor/theus-arsenal/rules/fsharp/patterns.md +0 -111
  226. package/vendor/theus-arsenal/rules/fsharp/security.md +0 -76
  227. package/vendor/theus-arsenal/rules/fsharp/testing.md +0 -62
  228. package/vendor/theus-arsenal/rules/golang/coding-style.md +0 -32
  229. package/vendor/theus-arsenal/rules/golang/hooks.md +0 -17
  230. package/vendor/theus-arsenal/rules/golang/patterns.md +0 -45
  231. package/vendor/theus-arsenal/rules/golang/security.md +0 -34
  232. package/vendor/theus-arsenal/rules/golang/testing.md +0 -31
  233. package/vendor/theus-arsenal/rules/java/coding-style.md +0 -114
  234. package/vendor/theus-arsenal/rules/java/hooks.md +0 -18
  235. package/vendor/theus-arsenal/rules/java/patterns.md +0 -147
  236. package/vendor/theus-arsenal/rules/java/security.md +0 -101
  237. package/vendor/theus-arsenal/rules/java/testing.md +0 -133
  238. package/vendor/theus-arsenal/rules/kotlin/coding-style.md +0 -86
  239. package/vendor/theus-arsenal/rules/kotlin/hooks.md +0 -17
  240. package/vendor/theus-arsenal/rules/kotlin/patterns.md +0 -146
  241. package/vendor/theus-arsenal/rules/kotlin/security.md +0 -82
  242. package/vendor/theus-arsenal/rules/kotlin/testing.md +0 -128
  243. package/vendor/theus-arsenal/rules/nuxt/coding-style.md +0 -47
  244. package/vendor/theus-arsenal/rules/nuxt/hooks.md +0 -39
  245. package/vendor/theus-arsenal/rules/nuxt/patterns.md +0 -54
  246. package/vendor/theus-arsenal/rules/nuxt/security.md +0 -48
  247. package/vendor/theus-arsenal/rules/nuxt/testing.md +0 -49
  248. package/vendor/theus-arsenal/rules/php/coding-style.md +0 -40
  249. package/vendor/theus-arsenal/rules/php/hooks.md +0 -24
  250. package/vendor/theus-arsenal/rules/php/patterns.md +0 -33
  251. package/vendor/theus-arsenal/rules/php/security.md +0 -37
  252. package/vendor/theus-arsenal/rules/php/testing.md +0 -38
  253. package/vendor/theus-arsenal/rules/python/coding-style.md +0 -42
  254. package/vendor/theus-arsenal/rules/python/fastapi.md +0 -58
  255. package/vendor/theus-arsenal/rules/python/hooks.md +0 -19
  256. package/vendor/theus-arsenal/rules/python/patterns.md +0 -39
  257. package/vendor/theus-arsenal/rules/python/security.md +0 -30
  258. package/vendor/theus-arsenal/rules/python/testing.md +0 -38
  259. package/vendor/theus-arsenal/rules/react/coding-style.md +0 -109
  260. package/vendor/theus-arsenal/rules/react/hooks.md +0 -187
  261. package/vendor/theus-arsenal/rules/react/patterns.md +0 -194
  262. package/vendor/theus-arsenal/rules/react/security.md +0 -180
  263. package/vendor/theus-arsenal/rules/react/testing.md +0 -208
  264. package/vendor/theus-arsenal/rules/react-native/accessibility.md +0 -55
  265. package/vendor/theus-arsenal/rules/react-native/coding-style.md +0 -71
  266. package/vendor/theus-arsenal/rules/react-native/hooks.md +0 -28
  267. package/vendor/theus-arsenal/rules/react-native/patterns.md +0 -88
  268. package/vendor/theus-arsenal/rules/react-native/performance.md +0 -45
  269. package/vendor/theus-arsenal/rules/react-native/production-readiness.md +0 -51
  270. package/vendor/theus-arsenal/rules/react-native/security.md +0 -43
  271. package/vendor/theus-arsenal/rules/react-native/testing.md +0 -52
  272. package/vendor/theus-arsenal/rules/ruby/coding-style.md +0 -46
  273. package/vendor/theus-arsenal/rules/ruby/hooks.md +0 -37
  274. package/vendor/theus-arsenal/rules/ruby/patterns.md +0 -44
  275. package/vendor/theus-arsenal/rules/ruby/security.md +0 -51
  276. package/vendor/theus-arsenal/rules/ruby/testing.md +0 -51
  277. package/vendor/theus-arsenal/rules/rust/coding-style.md +0 -151
  278. package/vendor/theus-arsenal/rules/rust/hooks.md +0 -16
  279. package/vendor/theus-arsenal/rules/rust/patterns.md +0 -168
  280. package/vendor/theus-arsenal/rules/rust/security.md +0 -141
  281. package/vendor/theus-arsenal/rules/rust/testing.md +0 -154
  282. package/vendor/theus-arsenal/rules/swift/coding-style.md +0 -47
  283. package/vendor/theus-arsenal/rules/swift/hooks.md +0 -20
  284. package/vendor/theus-arsenal/rules/swift/patterns.md +0 -66
  285. package/vendor/theus-arsenal/rules/swift/security.md +0 -33
  286. package/vendor/theus-arsenal/rules/swift/testing.md +0 -45
  287. package/vendor/theus-arsenal/rules/typescript/coding-style.md +0 -199
  288. package/vendor/theus-arsenal/rules/typescript/hooks.md +0 -22
  289. package/vendor/theus-arsenal/rules/typescript/patterns.md +0 -52
  290. package/vendor/theus-arsenal/rules/typescript/security.md +0 -28
  291. package/vendor/theus-arsenal/rules/typescript/testing.md +0 -18
  292. package/vendor/theus-arsenal/rules/vue/coding-style.md +0 -54
  293. package/vendor/theus-arsenal/rules/vue/hooks.md +0 -45
  294. package/vendor/theus-arsenal/rules/vue/patterns.md +0 -56
  295. package/vendor/theus-arsenal/rules/vue/security.md +0 -46
  296. package/vendor/theus-arsenal/rules/vue/testing.md +0 -53
  297. package/vendor/theus-arsenal/rules/web/coding-style.md +0 -108
  298. package/vendor/theus-arsenal/rules/web/design-quality.md +0 -75
  299. package/vendor/theus-arsenal/rules/web/hooks.md +0 -141
  300. package/vendor/theus-arsenal/rules/web/patterns.md +0 -91
  301. package/vendor/theus-arsenal/rules/web/performance.md +0 -76
  302. package/vendor/theus-arsenal/rules/web/security.md +0 -69
  303. package/vendor/theus-arsenal/rules/web/testing.md +0 -67
  304. package/vendor/theus-arsenal/scripts/hooks/bash-hook-dispatcher.js +0 -192
  305. package/vendor/theus-arsenal/scripts/hooks/block-no-verify.js +0 -556
  306. package/vendor/theus-arsenal/scripts/hooks/check-console-log.js +0 -92
  307. package/vendor/theus-arsenal/scripts/hooks/check-hook-enabled.js +0 -16
  308. package/vendor/theus-arsenal/scripts/hooks/config-protection.js +0 -171
  309. package/vendor/theus-arsenal/scripts/hooks/design-quality-check.js +0 -132
  310. package/vendor/theus-arsenal/scripts/hooks/doc-file-warning.js +0 -110
  311. package/vendor/theus-arsenal/scripts/hooks/modo-seguro.js +0 -158
  312. package/vendor/theus-arsenal/scripts/hooks/notificacion-escritorio.js +0 -208
  313. package/vendor/theus-arsenal/scripts/hooks/plugin-hook-bootstrap.js +0 -280
  314. package/vendor/theus-arsenal/scripts/hooks/post-bash-command-log.js +0 -87
  315. package/vendor/theus-arsenal/scripts/hooks/post-bash-dispatcher.js +0 -24
  316. package/vendor/theus-arsenal/scripts/hooks/post-bash-pr-created.js +0 -60
  317. package/vendor/theus-arsenal/scripts/hooks/post-edit-accumulator.js +0 -94
  318. package/vendor/theus-arsenal/scripts/hooks/post-edit-console-warn.js +0 -54
  319. package/vendor/theus-arsenal/scripts/hooks/post-edit-format.js +0 -110
  320. package/vendor/theus-arsenal/scripts/hooks/post-edit-typecheck.js +0 -98
  321. package/vendor/theus-arsenal/scripts/hooks/pre-bash-commit-quality.js +0 -447
  322. package/vendor/theus-arsenal/scripts/hooks/pre-bash-dev-server-block.js +0 -232
  323. package/vendor/theus-arsenal/scripts/hooks/pre-bash-dispatcher.js +0 -27
  324. package/vendor/theus-arsenal/scripts/hooks/pre-compact.js +0 -101
  325. package/vendor/theus-arsenal/scripts/hooks/pretooluse-visible-output.js +0 -49
  326. package/vendor/theus-arsenal/scripts/hooks/quality-gate.js +0 -168
  327. package/vendor/theus-arsenal/scripts/hooks/run-with-flags.js +0 -271
  328. package/vendor/theus-arsenal/scripts/hooks/salud-mcp.js +0 -749
  329. package/vendor/theus-arsenal/scripts/hooks/seguimiento-costos.js +0 -161
  330. package/vendor/theus-arsenal/scripts/hooks/session-end.js +0 -340
  331. package/vendor/theus-arsenal/scripts/hooks/session-start.js +0 -906
  332. package/vendor/theus-arsenal/scripts/hooks/stop-format-typecheck.js +0 -263
  333. package/vendor/theus-arsenal/scripts/hooks/suggest-compact.js +0 -286
  334. package/vendor/theus-arsenal/scripts/hooks/theus-context-monitor.js +0 -289
  335. package/vendor/theus-arsenal/scripts/hooks/verificacion-factual.js +0 -1278
  336. package/vendor/theus-arsenal/scripts/lib/agent-data-home.js +0 -96
  337. package/vendor/theus-arsenal/scripts/lib/cost-estimate.js +0 -66
  338. package/vendor/theus-arsenal/scripts/lib/hook-flags.js +0 -79
  339. package/vendor/theus-arsenal/scripts/lib/llm-summary.js +0 -185
  340. package/vendor/theus-arsenal/scripts/lib/loopback-guard.js +0 -54
  341. package/vendor/theus-arsenal/scripts/lib/observer-sessions.js +0 -237
  342. package/vendor/theus-arsenal/scripts/lib/package-manager.d.ts +0 -120
  343. package/vendor/theus-arsenal/scripts/lib/package-manager.js +0 -434
  344. package/vendor/theus-arsenal/scripts/lib/path-safety.js +0 -86
  345. package/vendor/theus-arsenal/scripts/lib/plan-canvas/markdown.js +0 -285
  346. package/vendor/theus-arsenal/scripts/lib/plan-canvas/sdk.js +0 -238
  347. package/vendor/theus-arsenal/scripts/lib/plan-canvas/server.js +0 -534
  348. package/vendor/theus-arsenal/scripts/lib/plan-canvas/sessions.js +0 -274
  349. package/vendor/theus-arsenal/scripts/lib/plan-canvas/ui.js +0 -546
  350. package/vendor/theus-arsenal/scripts/lib/project-detect.js +0 -451
  351. package/vendor/theus-arsenal/scripts/lib/resolve-formatter.js +0 -193
  352. package/vendor/theus-arsenal/scripts/lib/resolve-theus-root.js +0 -101
  353. package/vendor/theus-arsenal/scripts/lib/session-aliases.d.ts +0 -138
  354. package/vendor/theus-arsenal/scripts/lib/session-aliases.js +0 -483
  355. package/vendor/theus-arsenal/scripts/lib/session-bridge.js +0 -155
  356. package/vendor/theus-arsenal/scripts/lib/session-manager.d.ts +0 -137
  357. package/vendor/theus-arsenal/scripts/lib/session-manager.js +0 -555
  358. package/vendor/theus-arsenal/scripts/lib/shell-split.js +0 -86
  359. package/vendor/theus-arsenal/scripts/lib/shell-substitution.js +0 -501
  360. package/vendor/theus-arsenal/scripts/lib/skill-evolution/dashboard.js +0 -414
  361. package/vendor/theus-arsenal/scripts/lib/skill-evolution/health.js +0 -285
  362. package/vendor/theus-arsenal/scripts/lib/skill-evolution/index.js +0 -22
  363. package/vendor/theus-arsenal/scripts/lib/skill-evolution/provenance.js +0 -200
  364. package/vendor/theus-arsenal/scripts/lib/skill-evolution/tracker.js +0 -157
  365. package/vendor/theus-arsenal/scripts/lib/skill-evolution/versioning.js +0 -246
  366. package/vendor/theus-arsenal/scripts/lib/transcript-context.js +0 -232
  367. package/vendor/theus-arsenal/scripts/lib/utils.d.ts +0 -205
  368. package/vendor/theus-arsenal/scripts/lib/utils.js +0 -658
  369. package/vendor/theus-arsenal/scripts/plan-canvas.js +0 -341
  370. package/vendor/theus-arsenal/scripts/setup-package-manager.js +0 -46
  371. package/vendor/theus-arsenal/scripts/skills-health.js +0 -143
  372. package/vendor/theus-arsenal/skills/a11y-frontend/SKILL.md +0 -444
  373. package/vendor/theus-arsenal/skills/accesibilidad/SKILL.md +0 -144
  374. package/vendor/theus-arsenal/skills/acelerador-throughput-datos/SKILL.md +0 -72
  375. package/vendor/theus-arsenal/skills/agente-scraper-datos/SKILL.md +0 -771
  376. package/vendor/theus-arsenal/skills/analisis-plataformas-competencia/SKILL.md +0 -137
  377. package/vendor/theus-arsenal/skills/api-x/SKILL.md +0 -233
  378. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/SKILL.md +0 -335
  379. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer-loop.sh +0 -374
  380. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer.md +0 -188
  381. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/session-guardian.sh +0 -153
  382. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/start-observer.sh +0 -253
  383. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/config.json +0 -8
  384. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/hooks/observe.sh +0 -594
  385. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/detect-project.sh +0 -325
  386. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/instinct-cli.py +0 -1918
  387. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/lib/arsenal-dir.sh +0 -23
  388. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/test_parse_instinct.py +0 -1420
  389. package/vendor/theus-arsenal/skills/arquitectura-hexagonal/SKILL.md +0 -275
  390. package/vendor/theus-arsenal/skills/arquitectura-limpia-android/SKILL.md +0 -340
  391. package/vendor/theus-arsenal/skills/arquitectura-pipelines-recomendacion/SKILL.md +0 -112
  392. package/vendor/theus-arsenal/skills/atlas-datos-prediccion/SKILL.md +0 -53
  393. package/vendor/theus-arsenal/skills/auditoria-arquitectura-agentes/SKILL.md +0 -257
  394. package/vendor/theus-arsenal/skills/auditoria-produccion/SKILL.md +0 -180
  395. package/vendor/theus-arsenal/skills/auditoria-rutas-clic/SKILL.md +0 -243
  396. package/vendor/theus-arsenal/skills/autoevaluacion-agente/SKILL.md +0 -180
  397. package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/high-score-example.md +0 -89
  398. package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/low-score-example.md +0 -87
  399. package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/evaluation-criteria.md +0 -71
  400. package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/hook-integration.md +0 -90
  401. package/vendor/theus-arsenal/skills/autoevaluacion-agente/scripts/evaluate.py +0 -409
  402. package/vendor/theus-arsenal/skills/autoevaluacion-agente/templates/evaluation-report.md +0 -86
  403. package/vendor/theus-arsenal/skills/automatizacion-ssh-netmiko/SKILL.md +0 -176
  404. package/vendor/theus-arsenal/skills/base-datos-pubmed/SKILL.md +0 -174
  405. package/vendor/theus-arsenal/skills/base-datos-uspto/SKILL.md +0 -173
  406. package/vendor/theus-arsenal/skills/benchmark/SKILL.md +0 -92
  407. package/vendor/theus-arsenal/skills/bitacora-crecimiento/SKILL.md +0 -120
  408. package/vendor/theus-arsenal/skills/bucle-verificacion/SKILL.md +0 -125
  409. package/vendor/theus-arsenal/skills/buscar-primero/SKILL.md +0 -184
  410. package/vendor/theus-arsenal/skills/busqueda-exa/SKILL.md +0 -111
  411. package/vendor/theus-arsenal/skills/cache-por-hash/SKILL.md +0 -160
  412. package/vendor/theus-arsenal/skills/campana-marketing/SKILL.md +0 -118
  413. package/vendor/theus-arsenal/skills/capacidad-producto/SKILL.md +0 -138
  414. package/vendor/theus-arsenal/skills/cazador-vulnerabilidades/SKILL.md +0 -104
  415. package/vendor/theus-arsenal/skills/compactacion-estrategica/SKILL.md +0 -115
  416. package/vendor/theus-arsenal/skills/comparador-baskets-prediccion/SKILL.md +0 -69
  417. package/vendor/theus-arsenal/skills/compras-energia/SKILL.md +0 -206
  418. package/vendor/theus-arsenal/skills/concurrencia-swift-6-2/SKILL.md +0 -224
  419. package/vendor/theus-arsenal/skills/consejo/SKILL.md +0 -201
  420. package/vendor/theus-arsenal/skills/construccion-harness-agentes/SKILL.md +0 -78
  421. package/vendor/theus-arsenal/skills/constructor-conectores/SKILL.md +0 -119
  422. package/vendor/theus-arsenal/skills/constructor-equipos/SKILL.md +0 -169
  423. package/vendor/theus-arsenal/skills/consulta-documentacion/SKILL.md +0 -92
  424. package/vendor/theus-arsenal/skills/consultas-genomicas-gget/SKILL.md +0 -170
  425. package/vendor/theus-arsenal/skills/contacto-inversores/SKILL.md +0 -95
  426. package/vendor/theus-arsenal/skills/corrutinas-flows-kotlin/SKILL.md +0 -284
  427. package/vendor/theus-arsenal/skills/creacion-video-remotion/SKILL.md +0 -46
  428. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/3d.md +0 -86
  429. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/animations.md +0 -29
  430. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/charts-bar-chart.tsx +0 -173
  431. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-typewriter.tsx +0 -100
  432. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-word-highlight.tsx +0 -108
  433. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets.md +0 -78
  434. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/audio.md +0 -172
  435. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/calculate-metadata.md +0 -104
  436. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/can-decode.md +0 -75
  437. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/charts.md +0 -58
  438. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/compositions.md +0 -146
  439. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/display-captions.md +0 -126
  440. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/extract-frames.md +0 -229
  441. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/fonts.md +0 -152
  442. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-audio-duration.md +0 -58
  443. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-dimensions.md +0 -68
  444. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-duration.md +0 -58
  445. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/gifs.md +0 -138
  446. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/images.md +0 -130
  447. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/import-srt-captions.md +0 -67
  448. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/lottie.md +0 -67
  449. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-dom-nodes.md +0 -34
  450. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-text.md +0 -143
  451. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/sequencing.md +0 -106
  452. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/tailwind.md +0 -11
  453. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/text-animations.md +0 -20
  454. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/timing.md +0 -179
  455. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transcribe-captions.md +0 -19
  456. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transitions.md +0 -122
  457. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/trimming.md +0 -52
  458. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/videos.md +0 -171
  459. package/vendor/theus-arsenal/skills/cumplimiento-aduanero/SKILL.md +0 -270
  460. package/vendor/theus-arsenal/skills/cumplimiento-hipaa/SKILL.md +0 -78
  461. package/vendor/theus-arsenal/skills/datos-sensibles-salud/SKILL.md +0 -149
  462. package/vendor/theus-arsenal/skills/decimales-tokens-evm/SKILL.md +0 -128
  463. package/vendor/theus-arsenal/skills/decisiones-arquitectura/SKILL.md +0 -206
  464. package/vendor/theus-arsenal/skills/demos-ui/SKILL.md +0 -469
  465. package/vendor/theus-arsenal/skills/desarrollo-por-intencion/SKILL.md +0 -369
  466. package/vendor/theus-arsenal/skills/descubrimiento-marca/SKILL.md +0 -149
  467. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/10_proposito-porque.md +0 -42
  468. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/20_posicionamiento.md +0 -47
  469. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/30_audiencia-nicho.md +0 -53
  470. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/40_personalidad-arquetipo.md +0 -61
  471. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/50_voz-tono.md +0 -62
  472. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/60_narrativa-historia.md +0 -54
  473. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/70_tension-fundador.md +0 -50
  474. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/90_SINTESIS.md +0 -133
  475. package/vendor/theus-arsenal/skills/descubrimiento-plugins-laravel/SKILL.md +0 -230
  476. package/vendor/theus-arsenal/skills/destilado-reglas/SKILL.md +0 -263
  477. package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-rules.sh +0 -58
  478. package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-skills.sh +0 -129
  479. package/vendor/theus-arsenal/skills/diagnostico-bgp/SKILL.md +0 -170
  480. package/vendor/theus-arsenal/skills/direccion-estetica/SKILL.md +0 -220
  481. package/vendor/theus-arsenal/skills/direccion-estetica/references/taxonomia-generos.md +0 -89
  482. package/vendor/theus-arsenal/skills/diseno-api/SKILL.md +0 -522
  483. package/vendor/theus-arsenal/skills/diseno-liquid-glass/SKILL.md +0 -282
  484. package/vendor/theus-arsenal/skills/e2e-escritorio-windows/SKILL.md +0 -879
  485. package/vendor/theus-arsenal/skills/edicion-video/SKILL.md +0 -289
  486. package/vendor/theus-arsenal/skills/enfoque-producto/SKILL.md +0 -91
  487. package/vendor/theus-arsenal/skills/entornos-flox/SKILL.md +0 -493
  488. package/vendor/theus-arsenal/skills/estandares-codigo/SKILL.md +0 -548
  489. package/vendor/theus-arsenal/skills/estandares-cpp/SKILL.md +0 -727
  490. package/vendor/theus-arsenal/skills/estandares-java/SKILL.md +0 -389
  491. package/vendor/theus-arsenal/skills/estilo-legado/SKILL.md +0 -149
  492. package/vendor/theus-arsenal/skills/estructura-informes-competencia/SKILL.md +0 -95
  493. package/vendor/theus-arsenal/skills/evaluacion-academica/SKILL.md +0 -165
  494. package/vendor/theus-arsenal/skills/explorador-skills/SKILL.md +0 -129
  495. package/vendor/theus-arsenal/skills/flujo-git/SKILL.md +0 -714
  496. package/vendor/theus-arsenal/skills/flujo-ingenieria-ml/SKILL.md +0 -343
  497. package/vendor/theus-arsenal/skills/flujo-tdd/SKILL.md +0 -584
  498. package/vendor/theus-arsenal/skills/forja-personas/SKILL.md +0 -298
  499. package/vendor/theus-arsenal/skills/forja-personas/gacha.py +0 -224
  500. package/vendor/theus-arsenal/skills/forja-personas/gacha.sh +0 -5
  501. package/vendor/theus-arsenal/skills/forja-personas/references/avatar-style.md +0 -123
  502. package/vendor/theus-arsenal/skills/forja-personas/references/boundary-rules.md +0 -53
  503. package/vendor/theus-arsenal/skills/forja-personas/references/error-handling.md +0 -53
  504. package/vendor/theus-arsenal/skills/forja-personas/references/identity-tension.md +0 -48
  505. package/vendor/theus-arsenal/skills/forja-personas/references/naming-system.md +0 -39
  506. package/vendor/theus-arsenal/skills/forja-personas/references/output-template.md +0 -166
  507. package/vendor/theus-arsenal/skills/fundamentos-animacion/SKILL.md +0 -296
  508. package/vendor/theus-arsenal/skills/generacion-iconos-ios/SKILL.md +0 -156
  509. package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/generate_icons.swift +0 -258
  510. package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/iconify_gen.sh +0 -235
  511. package/vendor/theus-arsenal/skills/gestion-excepciones-logisticas/SKILL.md +0 -208
  512. package/vendor/theus-arsenal/skills/gestion-transportistas/SKILL.md +0 -204
  513. package/vendor/theus-arsenal/skills/guia-adopcion-ml/SKILL.md +0 -64
  514. package/vendor/theus-arsenal/skills/harness-agente-autonomo/SKILL.md +0 -252
  515. package/vendor/theus-arsenal/skills/harness-eval-clinico/SKILL.md +0 -212
  516. package/vendor/theus-arsenal/skills/harness-evaluacion/SKILL.md +0 -296
  517. package/vendor/theus-arsenal/skills/harness-generador-evaluador/SKILL.md +0 -254
  518. package/vendor/theus-arsenal/skills/homelab-diseno-red/SKILL.md +0 -120
  519. package/vendor/theus-arsenal/skills/homelab-dns-pihole/SKILL.md +0 -264
  520. package/vendor/theus-arsenal/skills/homelab-preparacion-red/SKILL.md +0 -144
  521. package/vendor/theus-arsenal/skills/homelab-segmentacion-vlan/SKILL.md +0 -307
  522. package/vendor/theus-arsenal/skills/homelab-vpn-wireguard/SKILL.md +0 -299
  523. package/vendor/theus-arsenal/skills/ingenieria-agentica/SKILL.md +0 -96
  524. package/vendor/theus-arsenal/skills/inspeccion-animaciones-blender/SKILL.md +0 -164
  525. package/vendor/theus-arsenal/skills/instaladores-python/SKILL.md +0 -820
  526. package/vendor/theus-arsenal/skills/integracion-jira/SKILL.md +0 -307
  527. package/vendor/theus-arsenal/skills/inteligencia-leads/SKILL.md +0 -312
  528. package/vendor/theus-arsenal/skills/inteligencia-leads/agents/agente-enriquecimiento.md +0 -87
  529. package/vendor/theus-arsenal/skills/inteligencia-leads/agents/mapeador-mutuos.md +0 -76
  530. package/vendor/theus-arsenal/skills/inteligencia-leads/agents/puntuador-senales.md +0 -60
  531. package/vendor/theus-arsenal/skills/inteligencia-leads/agents/redactor-outreach.md +0 -102
  532. package/vendor/theus-arsenal/skills/inteligencia-mercados-prediccion/SKILL.md +0 -53
  533. package/vendor/theus-arsenal/skills/introspeccion-agente/SKILL.md +0 -150
  534. package/vendor/theus-arsenal/skills/inventario-skills/SKILL.md +0 -194
  535. package/vendor/theus-arsenal/skills/inventario-skills/scripts/quick-diff.sh +0 -87
  536. package/vendor/theus-arsenal/skills/inventario-skills/scripts/save-results.sh +0 -57
  537. package/vendor/theus-arsenal/skills/inventario-skills/scripts/scan.sh +0 -170
  538. package/vendor/theus-arsenal/skills/investigacion-mercado/SKILL.md +0 -87
  539. package/vendor/theus-arsenal/skills/investigacion-oraculos-prediccion/SKILL.md +0 -59
  540. package/vendor/theus-arsenal/skills/investigacion-profunda/SKILL.md +0 -161
  541. package/vendor/theus-arsenal/skills/keccak256-nodejs/SKILL.md +0 -100
  542. package/vendor/theus-arsenal/skills/libro-decisiones-recursivo/SKILL.md +0 -82
  543. package/vendor/theus-arsenal/skills/lienzo-planes/SKILL.md +0 -111
  544. package/vendor/theus-arsenal/skills/limpieza-configuracion/SKILL.md +0 -116
  545. package/vendor/theus-arsenal/skills/logistica-inversa-devoluciones/SKILL.md +0 -241
  546. package/vendor/theus-arsenal/skills/manejo-errores/SKILL.md +0 -375
  547. package/vendor/theus-arsenal/skills/materiales-inversores/SKILL.md +0 -101
  548. package/vendor/theus-arsenal/skills/memoria-por-proyecto/SKILL.md +0 -170
  549. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/forget.mjs +0 -44
  550. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/info.mjs +0 -24
  551. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/init.mjs +0 -152
  552. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/list.mjs +0 -40
  553. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/migrate.mjs +0 -214
  554. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/resume.mjs +0 -36
  555. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/save.mjs +0 -210
  556. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/shared.mjs +0 -402
  557. package/vendor/theus-arsenal/skills/memoria-por-proyecto/hooks/session-start.mjs +0 -238
  558. package/vendor/theus-arsenal/skills/metodologia-benchmarks/SKILL.md +0 -131
  559. package/vendor/theus-arsenal/skills/migraciones-bd/SKILL.md +0 -430
  560. package/vendor/theus-arsenal/skills/modelos-fundacionales-en-dispositivo/SKILL.md +0 -244
  561. package/vendor/theus-arsenal/skills/modo-seguro/SKILL.md +0 -86
  562. package/vendor/theus-arsenal/skills/motion-avanzado/SKILL.md +0 -592
  563. package/vendor/theus-arsenal/skills/motor-de-contenido/SKILL.md +0 -136
  564. package/vendor/theus-arsenal/skills/no-conformidades-calidad/SKILL.md +0 -249
  565. package/vendor/theus-arsenal/skills/onboarding-codigo/SKILL.md +0 -244
  566. package/vendor/theus-arsenal/skills/operaciones-agentes-empresariales/SKILL.md +0 -51
  567. package/vendor/theus-arsenal/skills/operaciones-conocimiento/SKILL.md +0 -159
  568. package/vendor/theus-arsenal/skills/operaciones-correo/SKILL.md +0 -123
  569. package/vendor/theus-arsenal/skills/operaciones-facturacion/SKILL.md +0 -142
  570. package/vendor/theus-arsenal/skills/operaciones-flujo-proyectos/SKILL.md +0 -110
  571. package/vendor/theus-arsenal/skills/operaciones-github/SKILL.md +0 -143
  572. package/vendor/theus-arsenal/skills/operaciones-google-workspace/SKILL.md +0 -100
  573. package/vendor/theus-arsenal/skills/operaciones-investigacion/SKILL.md +0 -124
  574. package/vendor/theus-arsenal/skills/operaciones-mensajes/SKILL.md +0 -103
  575. package/vendor/theus-arsenal/skills/operaciones-terminal/SKILL.md +0 -110
  576. package/vendor/theus-arsenal/skills/optimizacion-benchmark/SKILL.md +0 -70
  577. package/vendor/theus-arsenal/skills/optimizacion-costos-llm/SKILL.md +0 -182
  578. package/vendor/theus-arsenal/skills/optimizador-conexiones/SKILL.md +0 -191
  579. package/vendor/theus-arsenal/skills/optimizador-paralelismo/SKILL.md +0 -75
  580. package/vendor/theus-arsenal/skills/optimizador-prompts/SKILL.md +0 -374
  581. package/vendor/theus-arsenal/skills/orq-agregar-funcionalidad/SKILL.md +0 -37
  582. package/vendor/theus-arsenal/skills/orq-cambiar-funcionalidad/SKILL.md +0 -36
  583. package/vendor/theus-arsenal/skills/orq-construir-mvp/SKILL.md +0 -38
  584. package/vendor/theus-arsenal/skills/orq-corregir-defecto/SKILL.md +0 -36
  585. package/vendor/theus-arsenal/skills/orq-pipeline/SKILL.md +0 -134
  586. package/vendor/theus-arsenal/skills/orq-refinar-codigo/SKILL.md +0 -49
  587. package/vendor/theus-arsenal/skills/orquestacion-equipos-agentes/SKILL.md +0 -117
  588. package/vendor/theus-arsenal/skills/pagos-agentes-x402/SKILL.md +0 -237
  589. package/vendor/theus-arsenal/skills/patrones-angular/SKILL.md +0 -153
  590. package/vendor/theus-arsenal/skills/patrones-angular/references/angular-animations.md +0 -160
  591. package/vendor/theus-arsenal/skills/patrones-angular/references/angular-aria.md +0 -410
  592. package/vendor/theus-arsenal/skills/patrones-angular/references/cli.md +0 -86
  593. package/vendor/theus-arsenal/skills/patrones-angular/references/component-harnesses.md +0 -59
  594. package/vendor/theus-arsenal/skills/patrones-angular/references/component-styling.md +0 -91
  595. package/vendor/theus-arsenal/skills/patrones-angular/references/components.md +0 -117
  596. package/vendor/theus-arsenal/skills/patrones-angular/references/creating-services.md +0 -97
  597. package/vendor/theus-arsenal/skills/patrones-angular/references/data-resolvers.md +0 -69
  598. package/vendor/theus-arsenal/skills/patrones-angular/references/define-routes.md +0 -67
  599. package/vendor/theus-arsenal/skills/patrones-angular/references/defining-providers.md +0 -72
  600. package/vendor/theus-arsenal/skills/patrones-angular/references/di-fundamentals.md +0 -120
  601. package/vendor/theus-arsenal/skills/patrones-angular/references/e2e-testing.md +0 -56
  602. package/vendor/theus-arsenal/skills/patrones-angular/references/effects.md +0 -83
  603. package/vendor/theus-arsenal/skills/patrones-angular/references/hierarchical-injectors.md +0 -43
  604. package/vendor/theus-arsenal/skills/patrones-angular/references/host-elements.md +0 -80
  605. package/vendor/theus-arsenal/skills/patrones-angular/references/injection-context.md +0 -63
  606. package/vendor/theus-arsenal/skills/patrones-angular/references/inputs.md +0 -101
  607. package/vendor/theus-arsenal/skills/patrones-angular/references/linked-signal.md +0 -59
  608. package/vendor/theus-arsenal/skills/patrones-angular/references/loading-strategies.md +0 -61
  609. package/vendor/theus-arsenal/skills/patrones-angular/references/mcp.md +0 -67
  610. package/vendor/theus-arsenal/skills/patrones-angular/references/navigate-to-routes.md +0 -69
  611. package/vendor/theus-arsenal/skills/patrones-angular/references/outputs.md +0 -86
  612. package/vendor/theus-arsenal/skills/patrones-angular/references/reactive-forms.md +0 -122
  613. package/vendor/theus-arsenal/skills/patrones-angular/references/rendering-strategies.md +0 -44
  614. package/vendor/theus-arsenal/skills/patrones-angular/references/resource.md +0 -77
  615. package/vendor/theus-arsenal/skills/patrones-angular/references/route-animations.md +0 -56
  616. package/vendor/theus-arsenal/skills/patrones-angular/references/route-guards.md +0 -52
  617. package/vendor/theus-arsenal/skills/patrones-angular/references/router-lifecycle.md +0 -45
  618. package/vendor/theus-arsenal/skills/patrones-angular/references/router-testing.md +0 -87
  619. package/vendor/theus-arsenal/skills/patrones-angular/references/show-routes-with-outlets.md +0 -68
  620. package/vendor/theus-arsenal/skills/patrones-angular/references/signal-forms.md +0 -795
  621. package/vendor/theus-arsenal/skills/patrones-angular/references/signals-overview.md +0 -94
  622. package/vendor/theus-arsenal/skills/patrones-angular/references/tailwind-css.md +0 -69
  623. package/vendor/theus-arsenal/skills/patrones-angular/references/template-driven-forms.md +0 -114
  624. package/vendor/theus-arsenal/skills/patrones-angular/references/testing-fundamentals.md +0 -65
  625. package/vendor/theus-arsenal/skills/patrones-animacion/SKILL.md +0 -432
  626. package/vendor/theus-arsenal/skills/patrones-backend/SKILL.md +0 -560
  627. package/vendor/theus-arsenal/skills/patrones-cdss-clinico/SKILL.md +0 -249
  628. package/vendor/theus-arsenal/skills/patrones-cisco-ios/SKILL.md +0 -148
  629. package/vendor/theus-arsenal/skills/patrones-clickhouse/SKILL.md +0 -443
  630. package/vendor/theus-arsenal/skills/patrones-compose-multiplatform/SKILL.md +0 -298
  631. package/vendor/theus-arsenal/skills/patrones-dart-flutter/SKILL.md +0 -566
  632. package/vendor/theus-arsenal/skills/patrones-despliegue/SKILL.md +0 -426
  633. package/vendor/theus-arsenal/skills/patrones-django/SKILL.md +0 -739
  634. package/vendor/theus-arsenal/skills/patrones-django-celery/SKILL.md +0 -456
  635. package/vendor/theus-arsenal/skills/patrones-docker/SKILL.md +0 -363
  636. package/vendor/theus-arsenal/skills/patrones-dotnet/SKILL.md +0 -321
  637. package/vendor/theus-arsenal/skills/patrones-emr-clinico/SKILL.md +0 -168
  638. package/vendor/theus-arsenal/skills/patrones-fastapi/SKILL.md +0 -513
  639. package/vendor/theus-arsenal/skills/patrones-frontend/SKILL.md +0 -655
  640. package/vendor/theus-arsenal/skills/patrones-go/SKILL.md +0 -674
  641. package/vendor/theus-arsenal/skills/patrones-jpa/SKILL.md +0 -156
  642. package/vendor/theus-arsenal/skills/patrones-kotlin/SKILL.md +0 -717
  643. package/vendor/theus-arsenal/skills/patrones-kotlin-exposed/SKILL.md +0 -724
  644. package/vendor/theus-arsenal/skills/patrones-kotlin-ktor/SKILL.md +0 -694
  645. package/vendor/theus-arsenal/skills/patrones-kubernetes/SKILL.md +0 -754
  646. package/vendor/theus-arsenal/skills/patrones-laravel/SKILL.md +0 -414
  647. package/vendor/theus-arsenal/skills/patrones-mcp/SKILL.md +0 -66
  648. package/vendor/theus-arsenal/skills/patrones-mysql/SKILL.md +0 -420
  649. package/vendor/theus-arsenal/skills/patrones-nestjs/SKILL.md +0 -229
  650. package/vendor/theus-arsenal/skills/patrones-nextjs/SKILL.md +0 -56
  651. package/vendor/theus-arsenal/skills/patrones-nuxt4/SKILL.md +0 -99
  652. package/vendor/theus-arsenal/skills/patrones-perl/SKILL.md +0 -508
  653. package/vendor/theus-arsenal/skills/patrones-postgres/SKILL.md +0 -141
  654. package/vendor/theus-arsenal/skills/patrones-prisma/SKILL.md +0 -399
  655. package/vendor/theus-arsenal/skills/patrones-python/SKILL.md +0 -750
  656. package/vendor/theus-arsenal/skills/patrones-pytorch/SKILL.md +0 -400
  657. package/vendor/theus-arsenal/skills/patrones-quarkus/SKILL.md +0 -729
  658. package/vendor/theus-arsenal/skills/patrones-react/SKILL.md +0 -339
  659. package/vendor/theus-arsenal/skills/patrones-react-native/SKILL.md +0 -325
  660. package/vendor/theus-arsenal/skills/patrones-redis/SKILL.md +0 -401
  661. package/vendor/theus-arsenal/skills/patrones-rust/SKILL.md +0 -504
  662. package/vendor/theus-arsenal/skills/patrones-springboot/SKILL.md +0 -314
  663. package/vendor/theus-arsenal/skills/patrones-swiftui/SKILL.md +0 -261
  664. package/vendor/theus-arsenal/skills/patrones-tinystruct/SKILL.md +0 -281
  665. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/architecture.md +0 -90
  666. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/data-handling.md +0 -60
  667. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/database.md +0 -99
  668. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/routing.md +0 -64
  669. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/system-usage.md +0 -97
  670. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/testing.md +0 -72
  671. package/vendor/theus-arsenal/skills/patrones-vite/SKILL.md +0 -449
  672. package/vendor/theus-arsenal/skills/patrones-vue/SKILL.md +0 -469
  673. package/vendor/theus-arsenal/skills/persistencia-actores-swift/SKILL.md +0 -148
  674. package/vendor/theus-arsenal/skills/pipeline-opensource/SKILL.md +0 -254
  675. package/vendor/theus-arsenal/skills/planificacion-demanda-inventario/SKILL.md +0 -236
  676. package/vendor/theus-arsenal/skills/planificador-trades-prediccion/SKILL.md +0 -60
  677. package/vendor/theus-arsenal/skills/plano-tecnico/SKILL.md +0 -102
  678. package/vendor/theus-arsenal/skills/presentaciones-html/SKILL.md +0 -189
  679. package/vendor/theus-arsenal/skills/presentaciones-html/STYLE_PRESETS.md +0 -330
  680. package/vendor/theus-arsenal/skills/presentaciones-html/animation-patterns.md +0 -122
  681. package/vendor/theus-arsenal/skills/presentaciones-html/html-template.md +0 -419
  682. package/vendor/theus-arsenal/skills/presentaciones-html/scripts/export-pdf.sh +0 -418
  683. package/vendor/theus-arsenal/skills/presentaciones-html/scripts/extract-pptx.py +0 -96
  684. package/vendor/theus-arsenal/skills/presentaciones-html/viewport-base.css +0 -153
  685. package/vendor/theus-arsenal/skills/presupuesto-contexto/SKILL.md +0 -263
  686. package/vendor/theus-arsenal/skills/procesamiento-documentos-nutrient/SKILL.md +0 -168
  687. package/vendor/theus-arsenal/skills/programacion-produccion/SKILL.md +0 -220
  688. package/vendor/theus-arsenal/skills/publicacion-cruzada/SKILL.md +0 -117
  689. package/vendor/theus-arsenal/skills/publicador-social/SKILL.md +0 -121
  690. package/vendor/theus-arsenal/skills/puerta-de-entrega/SKILL.md +0 -164
  691. package/vendor/theus-arsenal/skills/puerta-de-entrega/hooks/puerta-entrega.py +0 -242
  692. package/vendor/theus-arsenal/skills/pulir-interfaces/SKILL.md +0 -126
  693. package/vendor/theus-arsenal/skills/qa-navegador/SKILL.md +0 -103
  694. package/vendor/theus-arsenal/skills/ranking-grafo-social/SKILL.md +0 -153
  695. package/vendor/theus-arsenal/skills/recuperacion-iterativa/SKILL.md +0 -236
  696. package/vendor/theus-arsenal/skills/redaccion-articulos/SKILL.md +0 -81
  697. package/vendor/theus-arsenal/skills/regex-vs-llm/SKILL.md +0 -221
  698. package/vendor/theus-arsenal/skills/regresion-codigo-ia/SKILL.md +0 -388
  699. package/vendor/theus-arsenal/skills/rendimiento-react/SKILL.md +0 -567
  700. package/vendor/theus-arsenal/skills/revision-codigo-flutter-dart/SKILL.md +0 -442
  701. package/vendor/theus-arsenal/skills/revision-literatura-cientifica/SKILL.md +0 -191
  702. package/vendor/theus-arsenal/skills/revision-multiperspectiva/SKILL.md +0 -302
  703. package/vendor/theus-arsenal/skills/revision-riesgo-prediccion/SKILL.md +0 -56
  704. package/vendor/theus-arsenal/skills/revision-seguridad/SKILL.md +0 -505
  705. package/vendor/theus-arsenal/skills/revision-seguridad/cloud-infrastructure-security.md +0 -361
  706. package/vendor/theus-arsenal/skills/runtime-bun/SKILL.md +0 -83
  707. package/vendor/theus-arsenal/skills/salud-codigo-codescene/SKILL.md +0 -163
  708. package/vendor/theus-arsenal/skills/salud-interfaces-red/SKILL.md +0 -143
  709. package/vendor/theus-arsenal/skills/seguimiento-costos/SKILL.md +0 -122
  710. package/vendor/theus-arsenal/skills/seguridad-agentes-trading/SKILL.md +0 -145
  711. package/vendor/theus-arsenal/skills/seguridad-amm-defi/SKILL.md +0 -166
  712. package/vendor/theus-arsenal/skills/seguridad-django/SKILL.md +0 -648
  713. package/vendor/theus-arsenal/skills/seguridad-laravel/SKILL.md +0 -945
  714. package/vendor/theus-arsenal/skills/seguridad-perl/SKILL.md +0 -507
  715. package/vendor/theus-arsenal/skills/seguridad-quarkus/SKILL.md +0 -474
  716. package/vendor/theus-arsenal/skills/seguridad-springboot/SKILL.md +0 -279
  717. package/vendor/theus-arsenal/skills/seo/SKILL.md +0 -166
  718. package/vendor/theus-arsenal/skills/sistema-diseno/SKILL.md +0 -81
  719. package/vendor/theus-arsenal/skills/sistema-operativo-agentico/SKILL.md +0 -375
  720. package/vendor/theus-arsenal/skills/sistemas-latencia-critica/SKILL.md +0 -65
  721. package/vendor/theus-arsenal/skills/tdd-django/SKILL.md +0 -735
  722. package/vendor/theus-arsenal/skills/tdd-laravel/SKILL.md +0 -673
  723. package/vendor/theus-arsenal/skills/tdd-quarkus/SKILL.md +0 -817
  724. package/vendor/theus-arsenal/skills/tdd-springboot/SKILL.md +0 -165
  725. package/vendor/theus-arsenal/skills/testing-cpp/SKILL.md +0 -328
  726. package/vendor/theus-arsenal/skills/testing-csharp/SKILL.md +0 -321
  727. package/vendor/theus-arsenal/skills/testing-e2e/SKILL.md +0 -325
  728. package/vendor/theus-arsenal/skills/testing-go/SKILL.md +0 -719
  729. package/vendor/theus-arsenal/skills/testing-kotlin/SKILL.md +0 -829
  730. package/vendor/theus-arsenal/skills/testing-perl/SKILL.md +0 -479
  731. package/vendor/theus-arsenal/skills/testing-protocolos-di-swift/SKILL.md +0 -196
  732. package/vendor/theus-arsenal/skills/testing-python/SKILL.md +0 -815
  733. package/vendor/theus-arsenal/skills/testing-react/SKILL.md +0 -421
  734. package/vendor/theus-arsenal/skills/testing-rust/SKILL.md +0 -506
  735. package/vendor/theus-arsenal/skills/tours-de-codigo/SKILL.md +0 -252
  736. package/vendor/theus-arsenal/skills/traduccion-documentos-visado/SKILL.md +0 -121
  737. package/vendor/theus-arsenal/skills/ui-a-vue/SKILL.md +0 -141
  738. package/vendor/theus-arsenal/skills/validacion-config-red/SKILL.md +0 -211
  739. package/vendor/theus-arsenal/skills/verificacion-django/SKILL.md +0 -470
  740. package/vendor/theus-arsenal/skills/verificacion-factual/SKILL.md +0 -142
  741. package/vendor/theus-arsenal/skills/verificacion-laravel/SKILL.md +0 -184
  742. package/vendor/theus-arsenal/skills/verificacion-quarkus/SKILL.md +0 -485
  743. package/vendor/theus-arsenal/skills/verificacion-springboot/SKILL.md +0 -237
  744. package/vendor/theus-arsenal/skills/videodb/SKILL.md +0 -374
  745. package/vendor/theus-arsenal/skills/videodb/reference/api-reference.md +0 -550
  746. package/vendor/theus-arsenal/skills/videodb/reference/capture-reference.md +0 -407
  747. package/vendor/theus-arsenal/skills/videodb/reference/capture.md +0 -101
  748. package/vendor/theus-arsenal/skills/videodb/reference/editor.md +0 -443
  749. package/vendor/theus-arsenal/skills/videodb/reference/generative.md +0 -331
  750. package/vendor/theus-arsenal/skills/videodb/reference/rtstream-reference.md +0 -564
  751. package/vendor/theus-arsenal/skills/videodb/reference/rtstream.md +0 -65
  752. package/vendor/theus-arsenal/skills/videodb/reference/search.md +0 -230
  753. package/vendor/theus-arsenal/skills/videodb/reference/streaming.md +0 -406
  754. package/vendor/theus-arsenal/skills/videodb/reference/use-cases.md +0 -118
  755. package/vendor/theus-arsenal/skills/videodb/scripts/ws_listener.py +0 -279
  756. package/vendor/theus-arsenal/skills/videos-manim/SKILL.md +0 -91
  757. package/vendor/theus-arsenal/skills/videos-manim/assets/network_graph_scene.py +0 -52
  758. package/vendor/theus-arsenal/skills/vigilancia-canary/SKILL.md +0 -108
  759. package/vendor/theus-arsenal/skills/voz-de-marca/SKILL.md +0 -106
@@ -1,879 +0,0 @@
1
- ---
2
- name: e2e-escritorio-windows
3
- description: Testing E2E de aplicaciones de escritorio nativas de Windows (WPF, WinForms, Win32/MFC, Qt) usando pywinauto y Windows UI Automation. Incluye Page Object Model, aislamiento por niveles, CI y fallback por capturas.
4
- ---
5
-
6
- # Testing E2E de escritorio en Windows
7
-
8
- Testing end-to-end de aplicaciones de escritorio nativas de Windows usando **pywinauto** sobre Windows UI Automation (UIA). Cubre WPF, WinForms, Win32/MFC y Qt (5.x / 6.x) — con una sección dedicada a las particularidades de Qt.
9
-
10
- ## Cuándo activarla
11
-
12
- - Escribir o ejecutar tests E2E para una aplicación de escritorio nativa de Windows
13
- - Montar una suite de tests de GUI de escritorio desde cero
14
- - Diagnosticar tests de automatización de escritorio inestables o fallidos
15
- - Añadir testabilidad (AutomationId, nombres accesibles) a una app existente
16
- - Integrar E2E de escritorio en un pipeline CI/CD (GitHub Actions `windows-latest`)
17
-
18
- ### Cuándo NO usarla
19
-
20
- - Aplicaciones web → usa la skill `testing-e2e` (Playwright)
21
- - Apps Electron / CEF / WebView2 → la capa HTML necesita automatización de navegador, no UIA
22
- - Apps móviles → usa herramientas específicas de plataforma (UIAutomator, XCUITest)
23
- - Tests unitarios o de integración puros que no necesitan una GUI en ejecución
24
-
25
- ## Conceptos centrales
26
-
27
- Toda la automatización de escritorio en Windows se apoya en **UI Automation (UIA)**, una API de accesibilidad integrada en Windows. Cada framework soportado expone un árbol de elementos UIA con propiedades que el agente puede leer y sobre las que puede actuar:
28
-
29
- ```
30
- Tu test (Python)
31
- └── pywinauto (backend UIA)
32
- └── API Windows UI Automation ← integrada en Windows, agnóstica del framework
33
- └── Proveedor UIA de la app ← cada framework trae el suyo
34
- └── .exe en ejecución
35
- ```
36
-
37
- **Calidad de UIA por framework:**
38
-
39
- | Framework | AutomationId | Fiabilidad | Notas |
40
- |-----------|-------------|------------|-------|
41
- | WPF | 5/5 | Excelente | `x:Name` se mapea directamente a AutomationId |
42
- | WinForms | 4/5 | Buena | `AccessibleName` = AutomationId |
43
- | UWP / WinUI 3 | 5/5 | Excelente | Soporte completo de Microsoft |
44
- | Qt 6.x | 5/5 | Excelente | Accesibilidad habilitada por defecto; los nombres de clase cambian a `Qt6*` |
45
- | Qt 5.15+ | 4/5 | Buena | Módulo de accesibilidad mejorado |
46
- | Qt 5.7–5.14 | 3/5 | Regular | Necesita `QT_ACCESSIBILITY=1`; objectName manual |
47
- | Win32 / MFC | 3/5 | Regular | IDs de controles accesibles; el matching por texto es común |
48
-
49
- ## Instalación y prerrequisitos
50
-
51
- ```bash
52
- # Python 3.8+, solo Windows
53
- pip install pywinauto pytest pytest-html Pillow pytest-timeout
54
- # Opcional: grabación de pantalla
55
- # Instala ffmpeg y añádelo al PATH: https://ffmpeg.org/download.html
56
- ```
57
-
58
- Verifica que UIA es alcanzable:
59
-
60
- ```python
61
- from pywinauto import Desktop
62
- Desktop(backend="uia").windows() # lista todas las ventanas de nivel superior
63
- ```
64
-
65
- Instala **Accessibility Insights for Windows** (gratuito, de Microsoft) — tu equivalente a DevTools para inspeccionar el árbol de elementos UIA antes de escribir cualquier test.
66
-
67
- ## Preparar la testabilidad (por framework)
68
-
69
- Lo más impactante que puedes hacer es **dar a cada control interactivo un AutomationId estable** antes de escribir tests.
70
-
71
- ### WPF
72
-
73
- ```xml
74
- <!-- XAML: x:Name se convierte en AutomationId automáticamente -->
75
- <TextBox x:Name="usernameInput" />
76
- <PasswordBox x:Name="passwordInput" />
77
- <Button x:Name="btnLogin" Content="Login" />
78
- <TextBlock x:Name="lblError" />
79
- ```
80
-
81
- ### WinForms
82
-
83
- ```csharp
84
- // Se establece en el diseñador o en código
85
- usernameInput.AccessibleName = "usernameInput";
86
- passwordInput.AccessibleName = "passwordInput";
87
- btnLogin.AccessibleName = "btnLogin";
88
- lblError.AccessibleName = "lblError";
89
- ```
90
-
91
- ### Win32 / MFC
92
-
93
- ```cpp
94
- // Los IDs de recurso de controles del archivo .rc se exponen como strings de AutomationId
95
- // IDC_EDIT_USERNAME -> AutomationId "1001"
96
- // Prefiere SetWindowText para Name; añade IAccessible para soporte más rico
97
- ```
98
-
99
- ### Qt — ver la sección dedicada más abajo
100
-
101
- ---
102
-
103
- ## Page Object Model
104
-
105
- ```
106
- tests/
107
- ├── conftest.py # fixture de arranque de la app, captura en fallo
108
- ├── pytest.ini
109
- ├── config.py
110
- ├── pages/
111
- │ ├── __init__.py # requerido para los imports
112
- │ ├── base_page.py # localizadores, esperas, helpers de captura
113
- │ ├── login_page.py
114
- │ └── main_page.py
115
- ├── tests/
116
- │ ├── __init__.py
117
- │ ├── test_login.py
118
- │ └── test_main_flow.py
119
- └── artifacts/ # capturas, videos, logs
120
- ```
121
-
122
- ### base_page.py
123
-
124
- ```python
125
- import os, time
126
- from pywinauto import Desktop
127
- from config import ACTION_TIMEOUT, ARTIFACT_DIR
128
-
129
- class BasePage:
130
- def __init__(self, window):
131
- self.window = window
132
-
133
- # --- Localizadores (en orden de prioridad) ---
134
-
135
- def by_id(self, auto_id, **kw):
136
- """AutomationId — el más estable. Úsalo como primera opción."""
137
- return self.window.child_window(auto_id=auto_id, **kw)
138
-
139
- def by_name(self, name, **kw):
140
- """Texto visible / nombre accesible."""
141
- return self.window.child_window(title=name, **kw)
142
-
143
- def by_class(self, cls, index=0, **kw):
144
- """Clase del control + índice — frágil, evítalo si es posible."""
145
- return self.window.child_window(class_name=cls, found_index=index, **kw)
146
-
147
- # --- Esperas ---
148
-
149
- def wait_visible(self, spec, timeout=ACTION_TIMEOUT):
150
- spec.wait("visible", timeout=timeout)
151
- return spec
152
-
153
- def wait_gone(self, spec, timeout=ACTION_TIMEOUT):
154
- spec.wait_not("visible", timeout=timeout)
155
- return spec
156
-
157
- def wait_window(self, title, timeout=ACTION_TIMEOUT):
158
- """Espera una nueva ventana de nivel superior (diálogos, ventanas hijas)."""
159
- dlg = Desktop(backend="uia").window(title=title)
160
- dlg.wait("visible", timeout=timeout)
161
- return dlg
162
-
163
- def wait_until(self, fn, timeout=ACTION_TIMEOUT, interval=0.3):
164
- """Sondea una condición arbitraria — úsalo cuando los eventos UIA no son fiables."""
165
- deadline = time.time() + timeout
166
- while time.time() < deadline:
167
- try:
168
- if fn():
169
- return True
170
- except Exception:
171
- pass
172
- time.sleep(interval)
173
- raise TimeoutError(f"Condición no cumplida en {timeout}s")
174
-
175
- # --- Acciones ---
176
-
177
- def click(self, spec):
178
- self.wait_visible(spec)
179
- spec.click_input()
180
-
181
- def type_text(self, spec, text):
182
- self.wait_visible(spec)
183
- ctrl = spec.wrapper_object()
184
- try:
185
- ctrl.set_edit_text(text)
186
- except Exception as e:
187
- # Fallback para Qt 5.x: el Value Pattern de UIA puede estar incompleto
188
- import sys, pywinauto.keyboard as kb
189
- print(f"[e2e-escritorio-windows] set_edit_text falló ({e}), usando fallback de teclado", file=sys.stderr)
190
- ctrl.click_input()
191
- kb.send_keys("^a")
192
- kb.send_keys(text, with_spaces=True)
193
-
194
- def get_text(self, spec):
195
- ctrl = spec.wrapper_object()
196
- for attr in ("window_text", "get_value"):
197
- try:
198
- v = getattr(ctrl, attr)()
199
- if v:
200
- return v
201
- except Exception:
202
- pass
203
- return ""
204
-
205
- # --- Artefactos ---
206
-
207
- def screenshot(self, name):
208
- os.makedirs(ARTIFACT_DIR, exist_ok=True)
209
- path = os.path.join(ARTIFACT_DIR, f"{name}.png")
210
- self.window.capture_as_image().save(path)
211
- return path
212
- ```
213
-
214
- ### login_page.py
215
-
216
- ```python
217
- from pages.base_page import BasePage
218
-
219
- class LoginPage(BasePage):
220
- @property
221
- def username(self): return self.by_id("usernameInput")
222
-
223
- @property
224
- def password(self): return self.by_id("passwordInput")
225
-
226
- @property
227
- def btn_login(self): return self.by_id("btnLogin")
228
-
229
- @property
230
- def error_label(self): return self.by_id("lblError")
231
-
232
- def login(self, user, pwd):
233
- self.type_text(self.username, user)
234
- self.type_text(self.password, pwd)
235
- self.click(self.btn_login)
236
-
237
- def login_ok(self, user, pwd, main_title="Main Window"):
238
- self.login(user, pwd)
239
- return self.wait_window(main_title)
240
-
241
- def login_fail(self, user, pwd):
242
- self.login(user, pwd)
243
- self.wait_visible(self.error_label)
244
- return self.get_text(self.error_label)
245
- ```
246
-
247
- ### conftest.py
248
-
249
- > Para proyectos nuevos prefiere el **fixture sandbox de Nivel 1** (ver más abajo) — añade aislamiento de sistema de archivos a costo cero. Este fixture básico es solo para montajes mínimos o legados.
250
-
251
- ```python
252
- import os, pytest
253
- os.environ["QT_ACCESSIBILITY"] = "1" # Requerido para soporte UIA en Qt 5.x
254
-
255
- from pywinauto import Application
256
- from config import APP_PATH, MAIN_WINDOW_TITLE, LAUNCH_TIMEOUT, ARTIFACT_DIR
257
-
258
- @pytest.fixture
259
- def app(request):
260
- if not APP_PATH:
261
- pytest.exit("La variable de entorno APP_PATH no está definida", returncode=1)
262
- proc = Application(backend="uia").start(APP_PATH, timeout=LAUNCH_TIMEOUT)
263
- win = proc.window(title=MAIN_WINDOW_TITLE)
264
- win.wait("visible", timeout=LAUNCH_TIMEOUT)
265
- yield win
266
- # Captura de pantalla en caso de fallo
267
- if getattr(getattr(request.node, "rep_call", None), "failed", False):
268
- os.makedirs(ARTIFACT_DIR, exist_ok=True)
269
- try:
270
- win.capture_as_image().save(
271
- os.path.join(ARTIFACT_DIR, f"FAIL_{request.node.name}.png")
272
- )
273
- except Exception:
274
- pass
275
- # Salida ordenada primero, kill forzado como respaldo
276
- # proc es una Application de pywinauto — usa wait_for_process_exit(), no wait_for_process()
277
- try:
278
- win.close()
279
- proc.wait_for_process_exit(timeout=5)
280
- except Exception:
281
- proc.kill()
282
-
283
- @pytest.hookimpl(tryfirst=True, hookwrapper=True)
284
- def pytest_runtest_makereport(item, call):
285
- outcome = yield
286
- setattr(item, f"rep_{outcome.get_result().when}", outcome.get_result())
287
- ```
288
-
289
- ### config.py
290
-
291
- ```python
292
- import os
293
- APP_PATH = os.environ.get("APP_PATH", "") # se define por env — sin ruta por defecto
294
- MAIN_WINDOW_TITLE = os.environ.get("APP_TITLE", "")
295
- LAUNCH_TIMEOUT = int(os.environ.get("LAUNCH_TIMEOUT", "15"))
296
- ACTION_TIMEOUT = int(os.environ.get("ACTION_TIMEOUT", "10"))
297
- ARTIFACT_DIR = os.path.join(os.path.dirname(__file__), "artifacts")
298
- ```
299
-
300
- ### pytest.ini
301
-
302
- ```ini
303
- [pytest]
304
- testpaths = tests
305
- markers =
306
- smoke: tests de humo rápidos para rutas críticas
307
- flaky: tests conocidos como inestables
308
- addopts = -v --tb=short --html=artifacts/report.html --self-contained-html
309
- ```
310
-
311
- ## Estrategia de localizadores
312
-
313
- ```
314
- AutomationId > Name (texto) > ClassName + índice > XPath
315
- (estable) (legible) (frágil) (último recurso)
316
- ```
317
-
318
- Inspecciona con Accessibility Insights → panel **Properties** → busca `AutomationId` primero.
319
-
320
- ```python
321
- # Inspección en tiempo de ejecución — pégalo en un REPL para explorar el árbol
322
- win.print_control_identifiers()
323
- # o acota el alcance:
324
- win.child_window(auto_id="groupBox1").print_control_identifiers()
325
- ```
326
-
327
- ## Patrones de espera
328
-
329
- ```python
330
- # Esperar a que un control aparezca
331
- page.wait_visible(page.by_id("statusLabel"))
332
-
333
- # Esperar a que un control desaparezca (p. ej., spinner de carga)
334
- page.wait_gone(page.by_id("spinnerOverlay"))
335
-
336
- # Esperar a que aparezca un diálogo
337
- dlg = page.wait_window("Confirm Delete")
338
-
339
- # Condición personalizada (p. ej., cambio de texto)
340
- page.wait_until(lambda: page.get_text(page.by_id("lblStatus")) == "Ready")
341
- ```
342
-
343
- **Nunca uses `time.sleep()` como sincronización primaria** — usa `wait()` o `wait_until()`.
344
-
345
- ## Gestión de artefactos
346
-
347
- ```python
348
- # Captura bajo demanda
349
- page.screenshot("after_login")
350
-
351
- # Captura de pantalla completa (cuando la ventana está fuera de pantalla o minimizada)
352
- import pyautogui
353
- pyautogui.screenshot("artifacts/fullscreen.png")
354
-
355
- # Grabación de pantalla con ffmpeg (inicia antes del test, detén después)
356
- import subprocess
357
-
358
- def start_recording(name):
359
- return subprocess.Popen([
360
- "ffmpeg", "-f", "gdigrab", "-framerate", "10",
361
- "-i", "desktop", "-y", f"artifacts/videos/{name}.mp4"
362
- ], stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
363
-
364
- def stop_recording(proc):
365
- proc.stdin.write(b"q"); proc.stdin.flush(); proc.wait(timeout=10)
366
- ```
367
-
368
- ## Traza por paso (opt-in)
369
-
370
- La captura por defecto al fallar suele ser insuficiente para diagnosticar tests inestables. La traza a nivel de paso está **desactivada por defecto** — habilítala solo al reproducir un caso flaky.
371
-
372
- ### Habilitar
373
-
374
- ```bash
375
- E2E_TRACE=1 pytest tests/test_login.py -v
376
- # Incluir el texto tecleado en el log JSONL (NO usar en tests que teclean credenciales/PII):
377
- E2E_TRACE=1 E2E_TRACE_INCLUDE_TEXT=1 pytest ...
378
- ```
379
-
380
- ### Parche en BasePage
381
-
382
- ```python
383
- import os, json, time
384
- TRACE_ENABLED = os.environ.get("E2E_TRACE") == "1"
385
- TRACE_INCLUDE_TEXT = os.environ.get("E2E_TRACE_INCLUDE_TEXT") == "1"
386
-
387
- class BasePage:
388
- _step = 0
389
-
390
- def _trace(self, action, spec=None, text=None):
391
- if not TRACE_ENABLED:
392
- return
393
- BasePage._step += 1
394
- idx = f"{BasePage._step:03d}"
395
- os.makedirs(ARTIFACT_DIR, exist_ok=True)
396
- try:
397
- self.window.capture_as_image().save(
398
- os.path.join(ARTIFACT_DIR, f"step_{idx}_{action}.png"))
399
- except Exception:
400
- pass # un fallo de captura no debe romper el test
401
- rec = {
402
- "ts": time.time(), "step": BasePage._step, "action": action,
403
- "locator": getattr(spec, "criteria", None),
404
- "text": text if TRACE_INCLUDE_TEXT else ("<redactado>" if text else None),
405
- }
406
- with open(os.path.join(ARTIFACT_DIR, "trace.jsonl"), "a") as f:
407
- f.write(json.dumps(rec) + "\n")
408
-
409
- def click(self, spec):
410
- self.wait_visible(spec); self._trace("click_before", spec)
411
- spec.click_input(); self._trace("click_after", spec)
412
-
413
- def type_text(self, spec, text):
414
- self.wait_visible(spec); self._trace("type_before", spec, text)
415
- # ... el set_edit_text / fallback de teclado existente ...
416
- self._trace("type_after", spec)
417
- ```
418
-
419
- ### Advertencias
420
-
421
- - **PII / credenciales**: el contenido de `type_text` queda `<redactado>` por defecto. Nunca actives `E2E_TRACE_INCLUDE_TEXT=1` en flujos de login o de pago.
422
- - **Sobrecoste**: ~50–200 ms por acción + un PNG por paso en disco. No lo habilites en la matriz de CI por defecto — solo en un job dedicado a reproducir flakiness.
423
- - **Inflado de artefactos**: un flujo largo produce decenas de MB; ajusta `retention-days` en consecuencia.
424
- - **Higiene en paralelo/reintentos**: este ejemplo simple hace append a `trace.jsonl` y usa un contador a nivel de clase. Limpia el directorio de artefactos antes de reejecutar, y usa directorios de artefactos por worker para tests paralelos.
425
- - **Hueco de cobertura**: las acciones realizadas fuera de `BasePage` (llamadas crudas a `pywinauto` en el código del test) no quedan trazadas.
426
-
427
- ## Manejo de tests inestables
428
-
429
- ```python
430
- # Cuarentena — equivalente a test.fixme() de Playwright
431
- @pytest.mark.skip(reason="Flaky: carrera de animación en CI lento. Issue #42")
432
- def test_animated_transition(self, app): ...
433
-
434
- # Saltar solo en CI
435
- @pytest.mark.skipif(os.environ.get("CI") == "true", reason="Flaky en CI #43")
436
- def test_heavy_load(self, app): ...
437
- ```
438
-
439
- Causas comunes y soluciones:
440
-
441
- | Causa | Solución |
442
- |-------|----------|
443
- | Control no listo | Reemplaza `time.sleep` por `wait_visible` |
444
- | Ventana sin foco | Añade `win.set_focus()` antes de interactuar |
445
- | Animación en curso | `wait_until(lambda: not loading_indicator.exists())` |
446
- | Timing de diálogos | `wait_window(title, timeout=15)` |
447
- | Pantalla de CI no lista | Define `DISPLAY` o usa escritorio virtual en CI |
448
- | `set_edit_text` lanza NotImplementedError | Falta el ValuePattern de UIA (común en Qt 5.x) — `BasePage.type_text` ya cae a `keyboard.send_keys` |
449
- | El control existe pero `wait_visible` expira | Ventana minimizada o fuera de pantalla — llama a `win.restore()` + `win.set_focus()` antes de esperar |
450
-
451
- ## Aislamiento de tests y sandbox
452
-
453
- Tres niveles de aislamiento — usa el más ligero que satisfaga tus necesidades.
454
-
455
- ### Nivel 1 — Aislamiento de sistema de archivos (por defecto, úsalo siempre)
456
-
457
- Cada test recibe su propio `APPDATA` / `LOCALAPPDATA` / `TEMP` vía `subprocess.Popen` y `Application.connect()`. El fixture `tmp_path` de pytest se encarga de la limpieza automáticamente.
458
-
459
- ```python
460
- # conftest.py — reemplaza el fixture `app` básico por este
461
- import os, subprocess, pytest
462
- from pywinauto import Application
463
- from config import APP_PATH, APP_ARGS, APP_TITLE, LAUNCH_TIMEOUT, ACTION_TIMEOUT, ARTIFACT_DIR
464
-
465
- @pytest.fixture(scope="function")
466
- def app(request, tmp_path):
467
- """Proceso fresco + directorios de datos de usuario aislados por test."""
468
- if not APP_PATH:
469
- pytest.exit("APP_PATH no está definido", returncode=1)
470
-
471
- # Redirige todo el almacenamiento por usuario a un directorio tmp aislado
472
- sandbox_env = os.environ.copy()
473
- sandbox_env["QT_ACCESSIBILITY"] = "1"
474
- sandbox_env["APPDATA"] = str(tmp_path / "AppData" / "Roaming")
475
- sandbox_env["LOCALAPPDATA"] = str(tmp_path / "AppData" / "Local")
476
- sandbox_env["TEMP"] = sandbox_env["TMP"] = str(tmp_path / "Temp")
477
- for p in (sandbox_env["APPDATA"], sandbox_env["LOCALAPPDATA"], sandbox_env["TEMP"]):
478
- os.makedirs(p, exist_ok=True)
479
-
480
- if not APP_TITLE:
481
- pytest.exit("La variable de entorno APP_TITLE no está definida", returncode=1)
482
-
483
- # shlex.split maneja argumentos entrecomillados con espacios; split() plano se rompe con ellos
484
- import shlex
485
- # Arranca vía subprocess para poder pasar env; conecta pywinauto por PID
486
- proc = subprocess.Popen(
487
- [APP_PATH] + shlex.split(APP_ARGS),
488
- env=sandbox_env,
489
- )
490
- pw_app = Application(backend="uia").connect(process=proc.pid, timeout=LAUNCH_TIMEOUT)
491
- win = pw_app.window(title=APP_TITLE)
492
- win.wait("visible", timeout=LAUNCH_TIMEOUT)
493
- yield win
494
-
495
- if getattr(getattr(request.node, "rep_call", None), "failed", False):
496
- os.makedirs(ARTIFACT_DIR, exist_ok=True)
497
- try:
498
- win.capture_as_image().save(
499
- os.path.join(ARTIFACT_DIR, f"FAIL_{request.node.name}.png")
500
- )
501
- except Exception:
502
- pass
503
- try:
504
- win.close()
505
- proc.wait(timeout=5)
506
- except Exception:
507
- proc.kill()
508
- # pytest limpia tmp_path automáticamente
509
-
510
- @pytest.hookimpl(tryfirst=True, hookwrapper=True)
511
- def pytest_runtest_makereport(item, call):
512
- outcome = yield
513
- setattr(item, f"rep_{outcome.get_result().when}", outcome.get_result())
514
- ```
515
-
516
- ### Nivel 2 — Job Object de Windows (opcional: contención del ciclo de vida del proceso)
517
-
518
- Adjunta el proceso a un Job Object para que sea **terminado automáticamente** cuando el handle del job del fixture sea recolectado por el GC. También evita que la app genere procesos hijos que escapen a la limpieza del fixture.
519
-
520
- > **Alcance del aislamiento:** los Job Objects NO virtualizan el acceso al sistema de archivos ni bloquean el tráfico de red. El aislamiento de escritura de archivos y de red requiere AppContainer, reglas de Windows Firewall o el Nivel 3 (Windows Sandbox). Usa el Nivel 2 solo para contención del ciclo de vida del proceso y de procesos hijos.
521
-
522
- No requiere dependencias adicionales.
523
-
524
- ```python
525
- import ctypes, ctypes.wintypes as wt
526
-
527
- def restrict_process(pid: int):
528
- """
529
- Adjunta el proceso a un Job Object que le impide:
530
- - generar procesos fuera del job (LIMIT_KILL_ON_JOB_CLOSE)
531
- NO bloquea la red — usa reglas de Windows Firewall para eso.
532
- """
533
- JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x00002000
534
- # Derechos mínimos: SET_QUOTA (0x0100) | TERMINATE (0x0001)
535
- PROCESS_SET_QUOTA_AND_TERMINATE = 0x0101
536
-
537
- kernel32 = ctypes.windll.kernel32
538
- job = kernel32.CreateJobObjectW(None, None)
539
- hproc = kernel32.OpenProcess(PROCESS_SET_QUOTA_AND_TERMINATE, False, pid)
540
-
541
- # Layout correcto de la estructura — LimitFlags está en el offset +16, no +44
542
- class JOBOBJECT_BASIC_LIMIT_INFORMATION(ctypes.Structure):
543
- _fields_ = [
544
- ("PerProcessUserTimeLimit", wt.LARGE_INTEGER),
545
- ("PerJobUserTimeLimit", wt.LARGE_INTEGER),
546
- ("LimitFlags", wt.DWORD),
547
- ("MinimumWorkingSetSize", ctypes.c_size_t),
548
- ("MaximumWorkingSetSize", ctypes.c_size_t),
549
- ("ActiveProcessLimit", wt.DWORD),
550
- ("Affinity", ctypes.c_size_t),
551
- ("PriorityClass", wt.DWORD),
552
- ("SchedulingClass", wt.DWORD),
553
- ]
554
-
555
- info = JOBOBJECT_BASIC_LIMIT_INFORMATION()
556
- info.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
557
- ok = kernel32.SetInformationJobObject(job, 2, ctypes.byref(info), ctypes.sizeof(info))
558
- if not ok:
559
- raise ctypes.WinError()
560
- kernel32.AssignProcessToJobObject(job, hproc)
561
- kernel32.CloseHandle(hproc)
562
- return job # mantenlo vivo — el job se cierra (mata el proceso) al ser recolectado
563
-
564
- # Después de proc = subprocess.Popen(...): job = restrict_process(proc.pid)
565
- ```
566
-
567
- ### Nivel 3 — Windows Sandbox (aislamiento de SO completo en CI)
568
-
569
- Cuando necesitas una imagen limpia de Windows por ejecución (sin claves de registro residuales, sin estado de GPU compartido, aislamiento real), ejecuta **la suite completa** dentro de [Windows Sandbox](https://learn.microsoft.com/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-overview).
570
-
571
- **Requisito:** Windows 10/11 Pro o Enterprise, con virtualización habilitada.
572
-
573
- Crea `e2e-sandbox.wsb` en la raíz del proyecto:
574
-
575
- ```xml
576
- <Configuration>
577
- <MappedFolders>
578
- <!-- Binario de la app (solo lectura) -->
579
- <MappedFolder>
580
- <HostFolder>C:\ruta\a\tu\build\Release</HostFolder>
581
- <SandboxFolder>C:\app</SandboxFolder>
582
- <ReadOnly>true</ReadOnly>
583
- </MappedFolder>
584
- <!-- Suite de tests (lectura-escritura para los artefactos) -->
585
- <MappedFolder>
586
- <HostFolder>C:\ruta\a\tu\e2e_test</HostFolder>
587
- <SandboxFolder>C:\e2e_test</SandboxFolder>
588
- <ReadOnly>false</ReadOnly>
589
- </MappedFolder>
590
- </MappedFolders>
591
- <LogonCommand>
592
- <!--
593
- Windows Sandbox arranca sin Python. Instálalo en silencio primero,
594
- luego instala las dependencias y ejecuta los tests. Los artefactos se
595
- escriben de vuelta al host vía el MappedFolder de arriba.
596
- -->
597
- <Command>powershell -Command "
598
- winget install --id Python.Python.3.11 --silent --accept-package-agreements;
599
- $env:PATH += ';' + $env:LOCALAPPDATA + '\Programs\Python\Python311\Scripts';
600
- cd C:\e2e_test;
601
- pip install -r requirements.txt;
602
- pytest tests\ -v
603
- "</Command>
604
- </LogonCommand>
605
- </Configuration>
606
- ```
607
-
608
- Lanzamiento: `WindowsSandbox.exe e2e-sandbox.wsb`
609
-
610
- > pywinauto y la app corren ambos **dentro** del sandbox (se requiere la misma sesión).
611
- > Los artefactos se escriben de vuelta al host vía la carpeta mapeada.
612
-
613
- ### Comparación de niveles
614
-
615
- | Nivel | Aislamiento | Costo de montaje | Funciona en CI | Úsalo cuando |
616
- |-------|-------------|------------------|----------------|--------------|
617
- | 1 — Redirección env a `tmp_path` | Sistema de archivos | Cero | Siempre | Por defecto para todos los tests |
618
- | 2 — Job Object | Árbol de procesos | Bajo | Siempre | Evitar fugas de procesos hijos |
619
- | 3 — Windows Sandbox | SO completo | Medio | Necesita imagen Pro/Enterprise | Ejecuciones nocturnas en sala limpia |
620
-
621
- ### Prevenir tests colgados
622
-
623
- Añade `pytest-timeout` para acotar cualquier test individual. En `pytest.ini` define `timeout = 60` y `timeout_method = thread`. Nota: el método `thread` no puede matar subprocesos de apps Qt en Windows — añade `atexit.register(lambda: [p.kill() for p in psutil.Process().children(recursive=True)])` en `conftest.py` para recoger huérfanos.
624
-
625
- ## Integración CI/CD
626
-
627
- ```yaml
628
- # .github/workflows/e2e-desktop.yml
629
- name: Desktop E2E
630
- on: [push, pull_request]
631
-
632
- jobs:
633
- e2e:
634
- runs-on: windows-latest # entorno GUI real, no hace falta Xvfb
635
- steps:
636
- - uses: actions/checkout@v4
637
-
638
- - uses: actions/setup-python@v5
639
- with: { python-version: "3.11" }
640
-
641
- - name: Instalar dependencias
642
- run: pip install pywinauto pytest pytest-html Pillow
643
-
644
- - name: Compilar la app
645
- run: cmake --build build --config Release # ajusta a tu sistema de build
646
-
647
- - name: Ejecutar E2E
648
- env:
649
- APP_PATH: ${{ github.workspace }}\build\Release\MyApp.exe
650
- APP_TITLE: "My Application"
651
- CI: "true"
652
- run: pytest tests/ --html=artifacts/report.html --self-contained-html --junitxml=artifacts/results.xml -v
653
-
654
- - uses: actions/upload-artifact@v4
655
- if: always()
656
- with:
657
- name: e2e-artifacts
658
- path: artifacts/
659
- retention-days: 14
660
- ```
661
-
662
- ## Particularidades de Qt
663
-
664
- ### Habilitar UIA en Qt 5.x
665
-
666
- La accesibilidad de Qt 5.x está deshabilitada por defecto en algunos builds (especialmente 5.7–5.14). Define la variable de entorno **antes** de arrancar. Qt 6.x habilita la accesibilidad por defecto — omite este paso para Qt 6.
667
-
668
- ```python
669
- # conftest.py — añadir al inicio del módulo
670
- import os
671
- os.environ["QT_ACCESSIBILITY"] = "1"
672
- ```
673
-
674
- O expórtala en CI:
675
-
676
- ```yaml
677
- env:
678
- QT_ACCESSIBILITY: "1"
679
- ```
680
-
681
- ### Añadir identificadores estables a widgets Qt
682
-
683
- ```cpp
684
- // Preferido: tanto objectName como accessibleName
685
- void setTestId(QWidget* w, const char* id) {
686
- w->setObjectName(id);
687
- w->setAccessibleName(id); // se convierte en la propiedad Name de UIA
688
- }
689
-
690
- // En el constructor de tu diálogo:
691
- setTestId(ui->usernameEdit, "usernameInput");
692
- setTestId(ui->passwordEdit, "passwordInput");
693
- setTestId(ui->loginButton, "btnLogin");
694
- setTestId(ui->errorLabel, "lblError");
695
- ```
696
-
697
- Centraliza todos los IDs en un header para evitar erratas:
698
-
699
- ```cpp
700
- // test_ids.h
701
- #define TID_USERNAME "usernameInput"
702
- #define TID_PASSWORD "passwordInput"
703
- #define TID_BTN_LOGIN "btnLogin"
704
- #define TID_LBL_ERROR "lblError"
705
- ```
706
-
707
- ### Peculiaridades específicas de Qt
708
-
709
- **QComboBox** — el desplegable es una ventana de nivel superior separada:
710
-
711
- ```python
712
- from pywinauto import Desktop
713
-
714
- def select_combo_item(page, combo_spec, item_text):
715
- page.click(combo_spec)
716
- # El desplegable aparece como una nueva ventana raíz
717
- # class_name varía según la versión de Qt — verifica con Accessibility Insights
718
- # Qt 5.x: "Qt5QWindowIcon" | Qt 6.x: "Qt6QWindowIcon" — verifica con Accessibility Insights
719
- popup = Desktop(backend="uia").window(class_name_re="Qt[56]QWindowIcon")
720
- popup.wait("visible", timeout=5)
721
- popup.child_window(title=item_text).click_input()
722
- ```
723
-
724
- **QMessageBox / QDialog** — también son ventanas de nivel superior separadas:
725
-
726
- ```python
727
- dlg = page.wait_window("Confirm") # espera el título del diálogo
728
- dlg.child_window(title="OK").click_input() # clic en el botón interior
729
- ```
730
-
731
- **QTableWidget / QTableView** — acceso a filas/celdas:
732
-
733
- ```python
734
- table = page.by_id("tblUsers").wrapper_object()
735
- cell = table.cell(row=0, column=1)
736
- print(cell.window_text())
737
- ```
738
-
739
- **Controles autodibujados** (`paintEvent` puro, `QGraphicsView`, `QOpenGLWidget`) — UIA no puede ver su interior. Usa la sección de fallback más abajo.
740
-
741
- ## Fallback: modo de capturas
742
-
743
- Cuando un control no es alcanzable vía UIA (autodibujado, de terceros, motor de juego):
744
-
745
- ```bash
746
- pip install pyautogui Pillow opencv-python
747
- ```
748
-
749
- ```python
750
- import pyautogui, cv2, numpy as np
751
- from PIL import Image
752
-
753
- def find_image_on_screen(template_path, confidence=0.85):
754
- """Localiza una imagen plantilla en pantalla. Devuelve el centro (x, y) o None."""
755
- screen = np.array(pyautogui.screenshot())
756
- template = np.array(Image.open(template_path))
757
- result = cv2.matchTemplate(
758
- cv2.cvtColor(screen, cv2.COLOR_RGB2BGR),
759
- cv2.cvtColor(template, cv2.COLOR_RGB2BGR),
760
- cv2.TM_CCOEFF_NORMED,
761
- )
762
- _, max_val, _, max_loc = cv2.minMaxLoc(result)
763
- if max_val >= confidence:
764
- h, w = template.shape[:2]
765
- return max_loc[0] + w // 2, max_loc[1] + h // 2
766
- return None
767
-
768
- def click_image(template_path, confidence=0.85):
769
- pos = find_image_on_screen(template_path, confidence)
770
- if pos is None:
771
- raise RuntimeError(f"Imagen no encontrada en pantalla: {template_path}")
772
- pyautogui.click(*pos)
773
- ```
774
-
775
- ### Reglas de DPI / escalado (solo modo de capturas)
776
-
777
- El matching por capturas es brutalmente sensible al escalado de pantalla de Windows (100 % / 125 % / 150 %). Tres reglas duras:
778
-
779
- 1. **Captura las plantillas a la misma escala que la máquina objetivo.** No intentes rescatar un desajuste con `PIL.Image.resize` — `cv2.matchTemplate` es muy frágil frente a artefactos de remuestreo.
780
- 2. **Fija el escalado de pantalla en CI.** En `windows-latest` añade un paso como `Set-DisplayResolution 1920 1080 -Force` y deshabilita el escalado DPI por monitor, para que las dimensiones de las capturas sean reproducibles.
781
- 3. **Registra la escala junto a cada artefacto.** Al capturar, escribe `GetDpiForWindow(hwnd) / 96` en `artifacts/<test>/metadata.json` — los postmortems se vuelven obvios en lugar de adivinanzas.
782
-
783
- > La conciencia de DPI a nivel de proceso (`SetProcessDpiAwarenessContext`) **puede entrar en conflicto con la gestión de DPI propia de Qt** cuando la app bajo prueba es Qt. Prefiere "plantillas a la misma escala + fijar CI" antes que cambiar el modo DPI de todo el proceso en los fixtures.
784
-
785
- ### Depurar la confianza del match
786
-
787
- Al ajustar el umbral de `confidence`, el único flujo sensato es **ver** dónde cayó el match. El helper de abajo es solo para diagnóstico — no lo llames desde código de tests.
788
-
789
- ```python
790
- def debug_match(template_path, out="artifacts/match_debug.png", confidence=0.85):
791
- """Solo diagnóstico. Dibuja el rectángulo del mejor match + puntuación sobre la pantalla actual.
792
-
793
- NO es para tests de producción — úsalo al calibrar la confianza o al perseguir falsos matches.
794
- """
795
- import os, cv2, pyautogui, numpy as np
796
- screen = np.array(pyautogui.screenshot())[:, :, ::-1]
797
- tpl = cv2.imread(template_path)
798
- if tpl is None:
799
- raise RuntimeError(f"Plantilla ilegible: {template_path}")
800
- res = cv2.matchTemplate(screen, tpl, cv2.TM_CCOEFF_NORMED)
801
- _, mv, _, ml = cv2.minMaxLoc(res)
802
- h, w = tpl.shape[:2]
803
- colour = (0, 255, 0) if mv >= confidence else (0, 0, 255) # verde pasa / rojo falla
804
- cv2.rectangle(screen, ml, (ml[0]+w, ml[1]+h), colour, 2)
805
- cv2.putText(screen, f"score={mv:.3f} thr={confidence}",
806
- (ml[0], max(20, ml[1]-6)),
807
- cv2.FONT_HERSHEY_SIMPLEX, 0.7, colour, 2)
808
- os.makedirs(os.path.dirname(out) or ".", exist_ok=True)
809
- cv2.imwrite(out, screen)
810
- return mv
811
- ```
812
-
813
- **Úsalo con moderación** — el matching de imágenes se rompe con cambios de DPI, cambios de tema y oclusión parcial.
814
- Intenta siempre UIA primero; cae a capturas solo para controles genuinamente inalcanzables.
815
-
816
- ## Antipatrones
817
-
818
- ```python
819
- # MAL: sleep fijo
820
- time.sleep(3)
821
- page.click(page.by_id("btnSubmit"))
822
-
823
- # BIEN: espera por condición
824
- page.wait_visible(page.by_id("btnSubmit"))
825
- page.click(page.by_id("btnSubmit"))
826
- ```
827
-
828
- ```python
829
- # MAL: localizador frágil clase+índice como estrategia primaria
830
- page.by_class("Edit", index=2).type_keys("hola")
831
-
832
- # BIEN: AutomationId
833
- page.by_id("usernameInput").set_edit_text("hola")
834
- ```
835
-
836
- ```python
837
- # MAL: aserciones sobre coordenadas de píxeles
838
- assert btn.rectangle().left == 120
839
-
840
- # BIEN: aserciones sobre contenido / estado
841
- assert page.get_text(page.by_id("lblStatus")) == "Logged in"
842
- assert page.by_id("btnLogout").is_enabled()
843
- ```
844
-
845
- ```python
846
- # MAL: compartir la instancia de la app entre todos los tests (fugas de estado)
847
- @pytest.fixture(scope="session")
848
- def app(): ...
849
-
850
- # BIEN: proceso fresco por test (o por clase como máximo)
851
- @pytest.fixture(scope="function")
852
- def app(): ...
853
- ```
854
-
855
- ## Ejecutar los tests
856
-
857
- ```bash
858
- # Todos los tests
859
- pytest tests/ -v
860
-
861
- # Solo smoke
862
- pytest tests/ -m smoke -v
863
-
864
- # Un archivo específico
865
- pytest tests/test_login.py -v
866
-
867
- # Con ruta de app personalizada
868
- APP_PATH="C:\build\Release\MyApp.exe" APP_TITLE="MyApp" pytest tests/ -v
869
-
870
- # Detectar tests inestables (repetir cada uno 5 veces)
871
- pip install pytest-repeat
872
- pytest tests/test_login.py --count=5 -v
873
- ```
874
-
875
- ## Skills relacionadas
876
-
877
- - `testing-e2e` — E2E con Playwright para aplicaciones web
878
- - `testing-cpp` — testing unitario/de integración en C++ con GoogleTest
879
- - `estandares-cpp` — estilo y patrones de código C++