theus-cli-linux-x64 1.2.1 → 1.3.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 (772) hide show
  1. package/README.md +15 -0
  2. package/RELEASE.json +6 -6
  3. package/bin/theus +0 -0
  4. package/package.json +1 -1
  5. package/vendor/chrome-extension/README.md +142 -0
  6. package/vendor/chrome-extension/background.js +540 -0
  7. package/vendor/chrome-extension/cdp-core.js +400 -0
  8. package/vendor/chrome-extension/cdp-core.test.ts +321 -0
  9. package/vendor/chrome-extension/cdp.js +672 -0
  10. package/vendor/chrome-extension/icons/icon128.png +0 -0
  11. package/vendor/chrome-extension/icons/icon16.png +0 -0
  12. package/vendor/chrome-extension/icons/icon32.png +0 -0
  13. package/vendor/chrome-extension/icons/icon48.png +0 -0
  14. package/vendor/chrome-extension/manifest.json +36 -0
  15. package/vendor/chrome-extension/popup.html +78 -0
  16. package/vendor/chrome-extension/popup.js +47 -0
  17. package/vendor/chrome-extension/recorder.js +316 -0
  18. package/vendor/higiene-motor/PARCHES.md +244 -0
  19. package/vendor/higiene-motor/audit_dir.py +166 -0
  20. package/vendor/higiene-motor/audit_lib.py +333 -0
  21. package/vendor/higiene-motor/audit_website.py +635 -0
  22. package/vendor/higiene-motor/av_meta.py +498 -0
  23. package/vendor/higiene-motor/check_staged.py +71 -0
  24. package/vendor/higiene-motor/clean_ctrlregen.py +212 -0
  25. package/vendor/higiene-motor/clean_file.py +237 -0
  26. package/vendor/higiene-motor/clean_image.py +218 -0
  27. package/vendor/higiene-motor/clean_staged.py +143 -0
  28. package/vendor/higiene-motor/clean_text.py +108 -0
  29. package/vendor/higiene-motor/common.py +486 -0
  30. package/vendor/higiene-motor/container_meta.py +2522 -0
  31. package/vendor/higiene-motor/detect_gumbel.py +308 -0
  32. package/vendor/higiene-motor/detect_text_watermark.py +613 -0
  33. package/vendor/higiene-motor/format_dispatch.py +157 -0
  34. package/vendor/higiene-motor/hook_written_file.py +253 -0
  35. package/vendor/higiene-motor/image_meta.py +2171 -0
  36. package/vendor/higiene-motor/inspect_file.py +138 -0
  37. package/vendor/higiene-motor/inspect_image.py +72 -0
  38. package/vendor/higiene-motor/inspect_text.py +86 -0
  39. package/vendor/higiene-motor/markdiffusion_harness.py +533 -0
  40. package/vendor/higiene-motor/rewrite_text.py +737 -0
  41. package/vendor/higiene-motor/score_stylometry.py +460 -0
  42. package/vendor/higiene-motor/score_synthid.py +165 -0
  43. package/vendor/higiene-motor/server.py +1059 -0
  44. package/vendor/higiene-motor/synthid_score_server.py +176 -0
  45. package/vendor/higiene-motor/text_detectors.py +433 -0
  46. package/vendor/higiene-motor/text_unicode.py +730 -0
  47. package/vendor/theus-arsenal/.arsenal-nombres-ola2.json +0 -6
  48. package/vendor/theus-arsenal/.arsenal-nombres-ola3.json +0 -72
  49. package/vendor/theus-arsenal/.mailmap +0 -2
  50. package/vendor/theus-arsenal/.theus-plugin/marketplace.json +0 -25
  51. package/vendor/theus-arsenal/.theus-plugin/plugin.json +0 -20
  52. package/vendor/theus-arsenal/AUTHORS.md +0 -8
  53. package/vendor/theus-arsenal/CLEANROOM_REPLACEMENT_PLAN.md +0 -11
  54. package/vendor/theus-arsenal/LICENSE +0 -26
  55. package/vendor/theus-arsenal/PROVENANCE.md +0 -9
  56. package/vendor/theus-arsenal/README.md +0 -41
  57. package/vendor/theus-arsenal/THIRD_PARTY.md +0 -80
  58. package/vendor/theus-arsenal/agents/actualizador-docs.md +0 -123
  59. package/vendor/theus-arsenal/agents/analista-comentarios.md +0 -53
  60. package/vendor/theus-arsenal/agents/analista-conversaciones.md +0 -60
  61. package/vendor/theus-arsenal/agents/analista-tests-pr.md +0 -53
  62. package/vendor/theus-arsenal/agents/analista-tipos.md +0 -49
  63. package/vendor/theus-arsenal/agents/arquitecto-accesibilidad.md +0 -148
  64. package/vendor/theus-arsenal/agents/arquitecto-codigo.md +0 -79
  65. package/vendor/theus-arsenal/agents/arquitecto-homelab.md +0 -90
  66. package/vendor/theus-arsenal/agents/arquitecto-redes.md +0 -116
  67. package/vendor/theus-arsenal/agents/arquitecto-sistemas.md +0 -219
  68. package/vendor/theus-arsenal/agents/bifurcador-opensource.md +0 -206
  69. package/vendor/theus-arsenal/agents/cazador-fallos-silenciosos.md +0 -58
  70. package/vendor/theus-arsenal/agents/consultor-documentacion.md +0 -76
  71. package/vendor/theus-arsenal/agents/diagnosticador-redes.md +0 -135
  72. package/vendor/theus-arsenal/agents/ejecutor-e2e.md +0 -96
  73. package/vendor/theus-arsenal/agents/empaquetador-opensource.md +0 -257
  74. package/vendor/theus-arsenal/agents/escaner-secretos.md +0 -196
  75. package/vendor/theus-arsenal/agents/especialista-seo.md +0 -70
  76. package/vendor/theus-arsenal/agents/estratega-marketing.md +0 -158
  77. package/vendor/theus-arsenal/agents/evaluador-agentes.md +0 -214
  78. package/vendor/theus-arsenal/agents/evaluador-harness.md +0 -217
  79. package/vendor/theus-arsenal/agents/explorador-codigo.md +0 -79
  80. package/vendor/theus-arsenal/agents/extractor-specs.md +0 -214
  81. package/vendor/theus-arsenal/agents/generador-harness.md +0 -139
  82. package/vendor/theus-arsenal/agents/guia-tdd.md +0 -99
  83. package/vendor/theus-arsenal/agents/jefe-de-gabinete.md +0 -162
  84. package/vendor/theus-arsenal/agents/limpiador-refactors.md +0 -93
  85. package/vendor/theus-arsenal/agents/optimizador-rendimiento.md +0 -454
  86. package/vendor/theus-arsenal/agents/planificador-harness.md +0 -107
  87. package/vendor/theus-arsenal/agents/planificador.md +0 -221
  88. package/vendor/theus-arsenal/agents/resolutor-apps-harmonyos.md +0 -181
  89. package/vendor/theus-arsenal/agents/resolutor-builds-cpp.md +0 -98
  90. package/vendor/theus-arsenal/agents/resolutor-builds-dart.md +0 -209
  91. package/vendor/theus-arsenal/agents/resolutor-builds-django.md +0 -253
  92. package/vendor/theus-arsenal/agents/resolutor-builds-go.md +0 -102
  93. package/vendor/theus-arsenal/agents/resolutor-builds-java.md +0 -274
  94. package/vendor/theus-arsenal/agents/resolutor-builds-kotlin.md +0 -128
  95. package/vendor/theus-arsenal/agents/resolutor-builds-pytorch.md +0 -128
  96. package/vendor/theus-arsenal/agents/resolutor-builds-react.md +0 -214
  97. package/vendor/theus-arsenal/agents/resolutor-builds-rust.md +0 -156
  98. package/vendor/theus-arsenal/agents/resolutor-builds-swift.md +0 -169
  99. package/vendor/theus-arsenal/agents/resolutor-builds.md +0 -122
  100. package/vendor/theus-arsenal/agents/revisor-bd.md +0 -97
  101. package/vendor/theus-arsenal/agents/revisor-codigo.md +0 -291
  102. package/vendor/theus-arsenal/agents/revisor-config-red.md +0 -116
  103. package/vendor/theus-arsenal/agents/revisor-cpp.md +0 -80
  104. package/vendor/theus-arsenal/agents/revisor-csharp.md +0 -109
  105. package/vendor/theus-arsenal/agents/revisor-django.md +0 -168
  106. package/vendor/theus-arsenal/agents/revisor-fastapi.md +0 -82
  107. package/vendor/theus-arsenal/agents/revisor-flutter.md +0 -251
  108. package/vendor/theus-arsenal/agents/revisor-go.md +0 -84
  109. package/vendor/theus-arsenal/agents/revisor-java.md +0 -192
  110. package/vendor/theus-arsenal/agents/revisor-kotlin.md +0 -171
  111. package/vendor/theus-arsenal/agents/revisor-ml.md +0 -159
  112. package/vendor/theus-arsenal/agents/revisor-php.md +0 -108
  113. package/vendor/theus-arsenal/agents/revisor-python.md +0 -106
  114. package/vendor/theus-arsenal/agents/revisor-react.md +0 -166
  115. package/vendor/theus-arsenal/agents/revisor-rust.md +0 -102
  116. package/vendor/theus-arsenal/agents/revisor-seguridad.md +0 -116
  117. package/vendor/theus-arsenal/agents/revisor-software-clinico.md +0 -95
  118. package/vendor/theus-arsenal/agents/revisor-swift.md +0 -115
  119. package/vendor/theus-arsenal/agents/revisor-typescript.md +0 -123
  120. package/vendor/theus-arsenal/agents/revisor-vue.md +0 -205
  121. package/vendor/theus-arsenal/agents/simplificador-codigo.md +0 -55
  122. package/vendor/theus-arsenal/commands/actualizar-docs.md +0 -88
  123. package/vendor/theus-arsenal/commands/actualizar-mapas-codigo.md +0 -78
  124. package/vendor/theus-arsenal/commands/aprender-evaluar.md +0 -109
  125. package/vendor/theus-arsenal/commands/aprender.md +0 -74
  126. package/vendor/theus-arsenal/commands/arreglar-build.md +0 -66
  127. package/vendor/theus-arsenal/commands/bucle-multiperspectiva.md +0 -153
  128. package/vendor/theus-arsenal/commands/build-cpp.md +0 -173
  129. package/vendor/theus-arsenal/commands/build-flutter.md +0 -164
  130. package/vendor/theus-arsenal/commands/build-go.md +0 -183
  131. package/vendor/theus-arsenal/commands/build-gradle.md +0 -75
  132. package/vendor/theus-arsenal/commands/build-kotlin.md +0 -176
  133. package/vendor/theus-arsenal/commands/build-react.md +0 -187
  134. package/vendor/theus-arsenal/commands/build-rust.md +0 -187
  135. package/vendor/theus-arsenal/commands/campana-marketing.md +0 -125
  136. package/vendor/theus-arsenal/commands/checkpoint.md +0 -78
  137. package/vendor/theus-arsenal/commands/cobertura-tests.md +0 -73
  138. package/vendor/theus-arsenal/commands/configurar-gestor-paquetes.md +0 -86
  139. package/vendor/theus-arsenal/commands/consulta.md +0 -164
  140. package/vendor/theus-arsenal/commands/control-calidad.md +0 -50
  141. package/vendor/theus-arsenal/commands/crear-skill.md +0 -77
  142. package/vendor/theus-arsenal/commands/enrutar-modelo.md +0 -30
  143. package/vendor/theus-arsenal/commands/epica-desbloquear.md +0 -17
  144. package/vendor/theus-arsenal/commands/epica-descomponer.md +0 -22
  145. package/vendor/theus-arsenal/commands/epica-publicar.md +0 -21
  146. package/vendor/theus-arsenal/commands/epica-reclamar.md +0 -25
  147. package/vendor/theus-arsenal/commands/epica-revisar.md +0 -22
  148. package/vendor/theus-arsenal/commands/epica-sincronizar.md +0 -21
  149. package/vendor/theus-arsenal/commands/epica-validar.md +0 -21
  150. package/vendor/theus-arsenal/commands/evolucionar.md +0 -176
  151. package/vendor/theus-arsenal/commands/funcionalidad.md +0 -49
  152. package/vendor/theus-arsenal/commands/guardar-sesion.md +0 -278
  153. package/vendor/theus-arsenal/commands/harness-build.md +0 -111
  154. package/vendor/theus-arsenal/commands/harness-diseno.md +0 -46
  155. package/vendor/theus-arsenal/commands/informe-costos.md +0 -90
  156. package/vendor/theus-arsenal/commands/iniciar-bucle.md +0 -36
  157. package/vendor/theus-arsenal/commands/instintos-estado.md +0 -53
  158. package/vendor/theus-arsenal/commands/instintos-exportar.md +0 -69
  159. package/vendor/theus-arsenal/commands/instintos-importar.md +0 -120
  160. package/vendor/theus-arsenal/commands/lienzo-planes.md +0 -48
  161. package/vendor/theus-arsenal/commands/limpiar-refactor.md +0 -84
  162. package/vendor/theus-arsenal/commands/modo-seguro.md +0 -96
  163. package/vendor/theus-arsenal/commands/orq-agregar-funcionalidad.md +0 -36
  164. package/vendor/theus-arsenal/commands/orq-cambiar-funcionalidad.md +0 -38
  165. package/vendor/theus-arsenal/commands/orq-construir-mvp.md +0 -36
  166. package/vendor/theus-arsenal/commands/orq-corregir-defecto.md +0 -40
  167. package/vendor/theus-arsenal/commands/orq-refinar-codigo.md +0 -44
  168. package/vendor/theus-arsenal/commands/orq-revisar.md +0 -135
  169. package/vendor/theus-arsenal/commands/plan-prd.md +0 -160
  170. package/vendor/theus-arsenal/commands/plan.md +0 -198
  171. package/vendor/theus-arsenal/commands/podar.md +0 -31
  172. package/vendor/theus-arsenal/commands/pr.md +0 -181
  173. package/vendor/theus-arsenal/commands/promover.md +0 -41
  174. package/vendor/theus-arsenal/commands/proyectos.md +0 -33
  175. package/vendor/theus-arsenal/commands/prp-commit.md +0 -112
  176. package/vendor/theus-arsenal/commands/prp-implementar.md +0 -385
  177. package/vendor/theus-arsenal/commands/prp-planificar.md +0 -501
  178. package/vendor/theus-arsenal/commands/reanudar-sesion.md +0 -160
  179. package/vendor/theus-arsenal/commands/revisar-codigo.md +0 -289
  180. package/vendor/theus-arsenal/commands/revisar-cpp.md +0 -132
  181. package/vendor/theus-arsenal/commands/revisar-fastapi.md +0 -39
  182. package/vendor/theus-arsenal/commands/revisar-flutter.md +0 -115
  183. package/vendor/theus-arsenal/commands/revisar-go.md +0 -148
  184. package/vendor/theus-arsenal/commands/revisar-kotlin.md +0 -140
  185. package/vendor/theus-arsenal/commands/revisar-pr.md +0 -37
  186. package/vendor/theus-arsenal/commands/revisar-python.md +0 -297
  187. package/vendor/theus-arsenal/commands/revisar-react.md +0 -170
  188. package/vendor/theus-arsenal/commands/revisar-rust.md +0 -142
  189. package/vendor/theus-arsenal/commands/revisar-vue.md +0 -174
  190. package/vendor/theus-arsenal/commands/salud-skills.md +0 -52
  191. package/vendor/theus-arsenal/commands/sesiones.md +0 -345
  192. package/vendor/theus-arsenal/commands/test-cpp.md +0 -252
  193. package/vendor/theus-arsenal/commands/test-flutter.md +0 -143
  194. package/vendor/theus-arsenal/commands/test-go.md +0 -268
  195. package/vendor/theus-arsenal/commands/test-kotlin.md +0 -312
  196. package/vendor/theus-arsenal/commands/test-react.md +0 -265
  197. package/vendor/theus-arsenal/commands/test-rust.md +0 -309
  198. package/vendor/theus-arsenal/commands/vigilancia-canary.md +0 -43
  199. package/vendor/theus-arsenal/hooks/hooks.json +0 -274
  200. package/vendor/theus-arsenal/package.json +0 -6
  201. package/vendor/theus-arsenal/rules/angular/coding-style.md +0 -182
  202. package/vendor/theus-arsenal/rules/angular/hooks.md +0 -25
  203. package/vendor/theus-arsenal/rules/angular/patterns.md +0 -249
  204. package/vendor/theus-arsenal/rules/angular/security.md +0 -87
  205. package/vendor/theus-arsenal/rules/angular/testing.md +0 -164
  206. package/vendor/theus-arsenal/rules/arkts/coding-style.md +0 -153
  207. package/vendor/theus-arsenal/rules/arkts/hooks.md +0 -80
  208. package/vendor/theus-arsenal/rules/arkts/patterns.md +0 -236
  209. package/vendor/theus-arsenal/rules/arkts/security.md +0 -141
  210. package/vendor/theus-arsenal/rules/arkts/testing.md +0 -126
  211. package/vendor/theus-arsenal/rules/common/agents.md +0 -49
  212. package/vendor/theus-arsenal/rules/common/code-review.md +0 -123
  213. package/vendor/theus-arsenal/rules/common/coding-style.md +0 -90
  214. package/vendor/theus-arsenal/rules/common/development-workflow.md +0 -44
  215. package/vendor/theus-arsenal/rules/common/git-workflow.md +0 -24
  216. package/vendor/theus-arsenal/rules/common/hooks.md +0 -32
  217. package/vendor/theus-arsenal/rules/common/patterns.md +0 -31
  218. package/vendor/theus-arsenal/rules/common/performance.md +0 -53
  219. package/vendor/theus-arsenal/rules/common/security.md +0 -29
  220. package/vendor/theus-arsenal/rules/common/testing.md +0 -57
  221. package/vendor/theus-arsenal/rules/cpp/coding-style.md +0 -44
  222. package/vendor/theus-arsenal/rules/cpp/hooks.md +0 -39
  223. package/vendor/theus-arsenal/rules/cpp/patterns.md +0 -51
  224. package/vendor/theus-arsenal/rules/cpp/security.md +0 -51
  225. package/vendor/theus-arsenal/rules/cpp/testing.md +0 -44
  226. package/vendor/theus-arsenal/rules/csharp/coding-style.md +0 -72
  227. package/vendor/theus-arsenal/rules/csharp/hooks.md +0 -25
  228. package/vendor/theus-arsenal/rules/csharp/patterns.md +0 -50
  229. package/vendor/theus-arsenal/rules/csharp/security.md +0 -58
  230. package/vendor/theus-arsenal/rules/csharp/testing.md +0 -50
  231. package/vendor/theus-arsenal/rules/dart/coding-style.md +0 -159
  232. package/vendor/theus-arsenal/rules/dart/hooks.md +0 -68
  233. package/vendor/theus-arsenal/rules/dart/patterns.md +0 -261
  234. package/vendor/theus-arsenal/rules/dart/security.md +0 -135
  235. package/vendor/theus-arsenal/rules/dart/testing.md +0 -215
  236. package/vendor/theus-arsenal/rules/fsharp/coding-style.md +0 -112
  237. package/vendor/theus-arsenal/rules/fsharp/hooks.md +0 -26
  238. package/vendor/theus-arsenal/rules/fsharp/patterns.md +0 -111
  239. package/vendor/theus-arsenal/rules/fsharp/security.md +0 -76
  240. package/vendor/theus-arsenal/rules/fsharp/testing.md +0 -62
  241. package/vendor/theus-arsenal/rules/golang/coding-style.md +0 -32
  242. package/vendor/theus-arsenal/rules/golang/hooks.md +0 -17
  243. package/vendor/theus-arsenal/rules/golang/patterns.md +0 -45
  244. package/vendor/theus-arsenal/rules/golang/security.md +0 -34
  245. package/vendor/theus-arsenal/rules/golang/testing.md +0 -31
  246. package/vendor/theus-arsenal/rules/java/coding-style.md +0 -114
  247. package/vendor/theus-arsenal/rules/java/hooks.md +0 -18
  248. package/vendor/theus-arsenal/rules/java/patterns.md +0 -147
  249. package/vendor/theus-arsenal/rules/java/security.md +0 -101
  250. package/vendor/theus-arsenal/rules/java/testing.md +0 -133
  251. package/vendor/theus-arsenal/rules/kotlin/coding-style.md +0 -86
  252. package/vendor/theus-arsenal/rules/kotlin/hooks.md +0 -17
  253. package/vendor/theus-arsenal/rules/kotlin/patterns.md +0 -146
  254. package/vendor/theus-arsenal/rules/kotlin/security.md +0 -82
  255. package/vendor/theus-arsenal/rules/kotlin/testing.md +0 -128
  256. package/vendor/theus-arsenal/rules/nuxt/coding-style.md +0 -47
  257. package/vendor/theus-arsenal/rules/nuxt/hooks.md +0 -39
  258. package/vendor/theus-arsenal/rules/nuxt/patterns.md +0 -54
  259. package/vendor/theus-arsenal/rules/nuxt/security.md +0 -48
  260. package/vendor/theus-arsenal/rules/nuxt/testing.md +0 -49
  261. package/vendor/theus-arsenal/rules/php/coding-style.md +0 -40
  262. package/vendor/theus-arsenal/rules/php/hooks.md +0 -24
  263. package/vendor/theus-arsenal/rules/php/patterns.md +0 -33
  264. package/vendor/theus-arsenal/rules/php/security.md +0 -37
  265. package/vendor/theus-arsenal/rules/php/testing.md +0 -38
  266. package/vendor/theus-arsenal/rules/python/coding-style.md +0 -42
  267. package/vendor/theus-arsenal/rules/python/fastapi.md +0 -58
  268. package/vendor/theus-arsenal/rules/python/hooks.md +0 -19
  269. package/vendor/theus-arsenal/rules/python/patterns.md +0 -39
  270. package/vendor/theus-arsenal/rules/python/security.md +0 -30
  271. package/vendor/theus-arsenal/rules/python/testing.md +0 -38
  272. package/vendor/theus-arsenal/rules/react/coding-style.md +0 -109
  273. package/vendor/theus-arsenal/rules/react/hooks.md +0 -187
  274. package/vendor/theus-arsenal/rules/react/patterns.md +0 -194
  275. package/vendor/theus-arsenal/rules/react/security.md +0 -180
  276. package/vendor/theus-arsenal/rules/react/testing.md +0 -208
  277. package/vendor/theus-arsenal/rules/react-native/accessibility.md +0 -55
  278. package/vendor/theus-arsenal/rules/react-native/coding-style.md +0 -71
  279. package/vendor/theus-arsenal/rules/react-native/hooks.md +0 -28
  280. package/vendor/theus-arsenal/rules/react-native/patterns.md +0 -88
  281. package/vendor/theus-arsenal/rules/react-native/performance.md +0 -45
  282. package/vendor/theus-arsenal/rules/react-native/production-readiness.md +0 -51
  283. package/vendor/theus-arsenal/rules/react-native/security.md +0 -43
  284. package/vendor/theus-arsenal/rules/react-native/testing.md +0 -52
  285. package/vendor/theus-arsenal/rules/ruby/coding-style.md +0 -46
  286. package/vendor/theus-arsenal/rules/ruby/hooks.md +0 -37
  287. package/vendor/theus-arsenal/rules/ruby/patterns.md +0 -44
  288. package/vendor/theus-arsenal/rules/ruby/security.md +0 -51
  289. package/vendor/theus-arsenal/rules/ruby/testing.md +0 -51
  290. package/vendor/theus-arsenal/rules/rust/coding-style.md +0 -151
  291. package/vendor/theus-arsenal/rules/rust/hooks.md +0 -16
  292. package/vendor/theus-arsenal/rules/rust/patterns.md +0 -168
  293. package/vendor/theus-arsenal/rules/rust/security.md +0 -141
  294. package/vendor/theus-arsenal/rules/rust/testing.md +0 -154
  295. package/vendor/theus-arsenal/rules/swift/coding-style.md +0 -47
  296. package/vendor/theus-arsenal/rules/swift/hooks.md +0 -20
  297. package/vendor/theus-arsenal/rules/swift/patterns.md +0 -66
  298. package/vendor/theus-arsenal/rules/swift/security.md +0 -33
  299. package/vendor/theus-arsenal/rules/swift/testing.md +0 -45
  300. package/vendor/theus-arsenal/rules/typescript/coding-style.md +0 -199
  301. package/vendor/theus-arsenal/rules/typescript/hooks.md +0 -22
  302. package/vendor/theus-arsenal/rules/typescript/patterns.md +0 -52
  303. package/vendor/theus-arsenal/rules/typescript/security.md +0 -28
  304. package/vendor/theus-arsenal/rules/typescript/testing.md +0 -18
  305. package/vendor/theus-arsenal/rules/vue/coding-style.md +0 -54
  306. package/vendor/theus-arsenal/rules/vue/hooks.md +0 -45
  307. package/vendor/theus-arsenal/rules/vue/patterns.md +0 -56
  308. package/vendor/theus-arsenal/rules/vue/security.md +0 -46
  309. package/vendor/theus-arsenal/rules/vue/testing.md +0 -53
  310. package/vendor/theus-arsenal/rules/web/coding-style.md +0 -108
  311. package/vendor/theus-arsenal/rules/web/design-quality.md +0 -75
  312. package/vendor/theus-arsenal/rules/web/hooks.md +0 -141
  313. package/vendor/theus-arsenal/rules/web/patterns.md +0 -91
  314. package/vendor/theus-arsenal/rules/web/performance.md +0 -76
  315. package/vendor/theus-arsenal/rules/web/security.md +0 -69
  316. package/vendor/theus-arsenal/rules/web/testing.md +0 -67
  317. package/vendor/theus-arsenal/scripts/hooks/bash-hook-dispatcher.js +0 -192
  318. package/vendor/theus-arsenal/scripts/hooks/block-no-verify.js +0 -556
  319. package/vendor/theus-arsenal/scripts/hooks/check-console-log.js +0 -92
  320. package/vendor/theus-arsenal/scripts/hooks/check-hook-enabled.js +0 -16
  321. package/vendor/theus-arsenal/scripts/hooks/config-protection.js +0 -171
  322. package/vendor/theus-arsenal/scripts/hooks/design-quality-check.js +0 -132
  323. package/vendor/theus-arsenal/scripts/hooks/doc-file-warning.js +0 -110
  324. package/vendor/theus-arsenal/scripts/hooks/modo-seguro.js +0 -158
  325. package/vendor/theus-arsenal/scripts/hooks/notificacion-escritorio.js +0 -208
  326. package/vendor/theus-arsenal/scripts/hooks/plugin-hook-bootstrap.js +0 -280
  327. package/vendor/theus-arsenal/scripts/hooks/post-bash-command-log.js +0 -87
  328. package/vendor/theus-arsenal/scripts/hooks/post-bash-dispatcher.js +0 -24
  329. package/vendor/theus-arsenal/scripts/hooks/post-bash-pr-created.js +0 -60
  330. package/vendor/theus-arsenal/scripts/hooks/post-edit-accumulator.js +0 -94
  331. package/vendor/theus-arsenal/scripts/hooks/post-edit-console-warn.js +0 -54
  332. package/vendor/theus-arsenal/scripts/hooks/post-edit-format.js +0 -110
  333. package/vendor/theus-arsenal/scripts/hooks/post-edit-typecheck.js +0 -98
  334. package/vendor/theus-arsenal/scripts/hooks/pre-bash-commit-quality.js +0 -447
  335. package/vendor/theus-arsenal/scripts/hooks/pre-bash-dev-server-block.js +0 -232
  336. package/vendor/theus-arsenal/scripts/hooks/pre-bash-dispatcher.js +0 -27
  337. package/vendor/theus-arsenal/scripts/hooks/pre-compact.js +0 -101
  338. package/vendor/theus-arsenal/scripts/hooks/pretooluse-visible-output.js +0 -49
  339. package/vendor/theus-arsenal/scripts/hooks/quality-gate.js +0 -168
  340. package/vendor/theus-arsenal/scripts/hooks/run-with-flags.js +0 -271
  341. package/vendor/theus-arsenal/scripts/hooks/salud-mcp.js +0 -749
  342. package/vendor/theus-arsenal/scripts/hooks/seguimiento-costos.js +0 -161
  343. package/vendor/theus-arsenal/scripts/hooks/session-end.js +0 -340
  344. package/vendor/theus-arsenal/scripts/hooks/session-start.js +0 -906
  345. package/vendor/theus-arsenal/scripts/hooks/stop-format-typecheck.js +0 -263
  346. package/vendor/theus-arsenal/scripts/hooks/suggest-compact.js +0 -286
  347. package/vendor/theus-arsenal/scripts/hooks/theus-context-monitor.js +0 -289
  348. package/vendor/theus-arsenal/scripts/hooks/verificacion-factual.js +0 -1278
  349. package/vendor/theus-arsenal/scripts/lib/agent-data-home.js +0 -96
  350. package/vendor/theus-arsenal/scripts/lib/cost-estimate.js +0 -66
  351. package/vendor/theus-arsenal/scripts/lib/hook-flags.js +0 -79
  352. package/vendor/theus-arsenal/scripts/lib/llm-summary.js +0 -185
  353. package/vendor/theus-arsenal/scripts/lib/loopback-guard.js +0 -54
  354. package/vendor/theus-arsenal/scripts/lib/observer-sessions.js +0 -237
  355. package/vendor/theus-arsenal/scripts/lib/package-manager.d.ts +0 -120
  356. package/vendor/theus-arsenal/scripts/lib/package-manager.js +0 -434
  357. package/vendor/theus-arsenal/scripts/lib/path-safety.js +0 -86
  358. package/vendor/theus-arsenal/scripts/lib/plan-canvas/markdown.js +0 -285
  359. package/vendor/theus-arsenal/scripts/lib/plan-canvas/sdk.js +0 -238
  360. package/vendor/theus-arsenal/scripts/lib/plan-canvas/server.js +0 -534
  361. package/vendor/theus-arsenal/scripts/lib/plan-canvas/sessions.js +0 -274
  362. package/vendor/theus-arsenal/scripts/lib/plan-canvas/ui.js +0 -546
  363. package/vendor/theus-arsenal/scripts/lib/project-detect.js +0 -451
  364. package/vendor/theus-arsenal/scripts/lib/resolve-formatter.js +0 -193
  365. package/vendor/theus-arsenal/scripts/lib/resolve-theus-root.js +0 -101
  366. package/vendor/theus-arsenal/scripts/lib/session-aliases.d.ts +0 -138
  367. package/vendor/theus-arsenal/scripts/lib/session-aliases.js +0 -483
  368. package/vendor/theus-arsenal/scripts/lib/session-bridge.js +0 -155
  369. package/vendor/theus-arsenal/scripts/lib/session-manager.d.ts +0 -137
  370. package/vendor/theus-arsenal/scripts/lib/session-manager.js +0 -555
  371. package/vendor/theus-arsenal/scripts/lib/shell-split.js +0 -86
  372. package/vendor/theus-arsenal/scripts/lib/shell-substitution.js +0 -501
  373. package/vendor/theus-arsenal/scripts/lib/skill-evolution/dashboard.js +0 -414
  374. package/vendor/theus-arsenal/scripts/lib/skill-evolution/health.js +0 -285
  375. package/vendor/theus-arsenal/scripts/lib/skill-evolution/index.js +0 -22
  376. package/vendor/theus-arsenal/scripts/lib/skill-evolution/provenance.js +0 -200
  377. package/vendor/theus-arsenal/scripts/lib/skill-evolution/tracker.js +0 -157
  378. package/vendor/theus-arsenal/scripts/lib/skill-evolution/versioning.js +0 -246
  379. package/vendor/theus-arsenal/scripts/lib/transcript-context.js +0 -232
  380. package/vendor/theus-arsenal/scripts/lib/utils.d.ts +0 -205
  381. package/vendor/theus-arsenal/scripts/lib/utils.js +0 -658
  382. package/vendor/theus-arsenal/scripts/plan-canvas.js +0 -341
  383. package/vendor/theus-arsenal/scripts/setup-package-manager.js +0 -46
  384. package/vendor/theus-arsenal/scripts/skills-health.js +0 -143
  385. package/vendor/theus-arsenal/skills/a11y-frontend/SKILL.md +0 -444
  386. package/vendor/theus-arsenal/skills/accesibilidad/SKILL.md +0 -144
  387. package/vendor/theus-arsenal/skills/acelerador-throughput-datos/SKILL.md +0 -72
  388. package/vendor/theus-arsenal/skills/agente-scraper-datos/SKILL.md +0 -771
  389. package/vendor/theus-arsenal/skills/analisis-plataformas-competencia/SKILL.md +0 -137
  390. package/vendor/theus-arsenal/skills/api-x/SKILL.md +0 -233
  391. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/SKILL.md +0 -335
  392. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer-loop.sh +0 -374
  393. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer.md +0 -188
  394. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/session-guardian.sh +0 -153
  395. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/start-observer.sh +0 -253
  396. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/config.json +0 -8
  397. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/hooks/observe.sh +0 -594
  398. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/detect-project.sh +0 -325
  399. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/instinct-cli.py +0 -1918
  400. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/lib/arsenal-dir.sh +0 -23
  401. package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/test_parse_instinct.py +0 -1420
  402. package/vendor/theus-arsenal/skills/arquitectura-hexagonal/SKILL.md +0 -275
  403. package/vendor/theus-arsenal/skills/arquitectura-limpia-android/SKILL.md +0 -340
  404. package/vendor/theus-arsenal/skills/arquitectura-pipelines-recomendacion/SKILL.md +0 -112
  405. package/vendor/theus-arsenal/skills/atlas-datos-prediccion/SKILL.md +0 -53
  406. package/vendor/theus-arsenal/skills/auditoria-arquitectura-agentes/SKILL.md +0 -257
  407. package/vendor/theus-arsenal/skills/auditoria-produccion/SKILL.md +0 -180
  408. package/vendor/theus-arsenal/skills/auditoria-rutas-clic/SKILL.md +0 -243
  409. package/vendor/theus-arsenal/skills/autoevaluacion-agente/SKILL.md +0 -180
  410. package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/high-score-example.md +0 -89
  411. package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/low-score-example.md +0 -87
  412. package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/evaluation-criteria.md +0 -71
  413. package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/hook-integration.md +0 -90
  414. package/vendor/theus-arsenal/skills/autoevaluacion-agente/scripts/evaluate.py +0 -409
  415. package/vendor/theus-arsenal/skills/autoevaluacion-agente/templates/evaluation-report.md +0 -86
  416. package/vendor/theus-arsenal/skills/automatizacion-ssh-netmiko/SKILL.md +0 -176
  417. package/vendor/theus-arsenal/skills/base-datos-pubmed/SKILL.md +0 -174
  418. package/vendor/theus-arsenal/skills/base-datos-uspto/SKILL.md +0 -173
  419. package/vendor/theus-arsenal/skills/benchmark/SKILL.md +0 -92
  420. package/vendor/theus-arsenal/skills/bitacora-crecimiento/SKILL.md +0 -120
  421. package/vendor/theus-arsenal/skills/bucle-verificacion/SKILL.md +0 -125
  422. package/vendor/theus-arsenal/skills/buscar-primero/SKILL.md +0 -184
  423. package/vendor/theus-arsenal/skills/busqueda-exa/SKILL.md +0 -111
  424. package/vendor/theus-arsenal/skills/cache-por-hash/SKILL.md +0 -160
  425. package/vendor/theus-arsenal/skills/campana-marketing/SKILL.md +0 -118
  426. package/vendor/theus-arsenal/skills/capacidad-producto/SKILL.md +0 -138
  427. package/vendor/theus-arsenal/skills/cazador-vulnerabilidades/SKILL.md +0 -104
  428. package/vendor/theus-arsenal/skills/compactacion-estrategica/SKILL.md +0 -115
  429. package/vendor/theus-arsenal/skills/comparador-baskets-prediccion/SKILL.md +0 -69
  430. package/vendor/theus-arsenal/skills/compras-energia/SKILL.md +0 -206
  431. package/vendor/theus-arsenal/skills/concurrencia-swift-6-2/SKILL.md +0 -224
  432. package/vendor/theus-arsenal/skills/consejo/SKILL.md +0 -201
  433. package/vendor/theus-arsenal/skills/construccion-harness-agentes/SKILL.md +0 -78
  434. package/vendor/theus-arsenal/skills/constructor-conectores/SKILL.md +0 -119
  435. package/vendor/theus-arsenal/skills/constructor-equipos/SKILL.md +0 -169
  436. package/vendor/theus-arsenal/skills/consulta-documentacion/SKILL.md +0 -92
  437. package/vendor/theus-arsenal/skills/consultas-genomicas-gget/SKILL.md +0 -170
  438. package/vendor/theus-arsenal/skills/contacto-inversores/SKILL.md +0 -95
  439. package/vendor/theus-arsenal/skills/corrutinas-flows-kotlin/SKILL.md +0 -284
  440. package/vendor/theus-arsenal/skills/creacion-video-remotion/SKILL.md +0 -46
  441. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/3d.md +0 -86
  442. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/animations.md +0 -29
  443. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/charts-bar-chart.tsx +0 -173
  444. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-typewriter.tsx +0 -100
  445. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-word-highlight.tsx +0 -108
  446. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets.md +0 -78
  447. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/audio.md +0 -172
  448. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/calculate-metadata.md +0 -104
  449. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/can-decode.md +0 -75
  450. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/charts.md +0 -58
  451. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/compositions.md +0 -146
  452. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/display-captions.md +0 -126
  453. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/extract-frames.md +0 -229
  454. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/fonts.md +0 -152
  455. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-audio-duration.md +0 -58
  456. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-dimensions.md +0 -68
  457. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-duration.md +0 -58
  458. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/gifs.md +0 -138
  459. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/images.md +0 -130
  460. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/import-srt-captions.md +0 -67
  461. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/lottie.md +0 -67
  462. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-dom-nodes.md +0 -34
  463. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-text.md +0 -143
  464. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/sequencing.md +0 -106
  465. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/tailwind.md +0 -11
  466. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/text-animations.md +0 -20
  467. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/timing.md +0 -179
  468. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transcribe-captions.md +0 -19
  469. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transitions.md +0 -122
  470. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/trimming.md +0 -52
  471. package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/videos.md +0 -171
  472. package/vendor/theus-arsenal/skills/cumplimiento-aduanero/SKILL.md +0 -270
  473. package/vendor/theus-arsenal/skills/cumplimiento-hipaa/SKILL.md +0 -78
  474. package/vendor/theus-arsenal/skills/datos-sensibles-salud/SKILL.md +0 -149
  475. package/vendor/theus-arsenal/skills/decimales-tokens-evm/SKILL.md +0 -128
  476. package/vendor/theus-arsenal/skills/decisiones-arquitectura/SKILL.md +0 -206
  477. package/vendor/theus-arsenal/skills/demos-ui/SKILL.md +0 -469
  478. package/vendor/theus-arsenal/skills/desarrollo-por-intencion/SKILL.md +0 -369
  479. package/vendor/theus-arsenal/skills/descubrimiento-marca/SKILL.md +0 -149
  480. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/10_proposito-porque.md +0 -42
  481. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/20_posicionamiento.md +0 -47
  482. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/30_audiencia-nicho.md +0 -53
  483. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/40_personalidad-arquetipo.md +0 -61
  484. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/50_voz-tono.md +0 -62
  485. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/60_narrativa-historia.md +0 -54
  486. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/70_tension-fundador.md +0 -50
  487. package/vendor/theus-arsenal/skills/descubrimiento-marca/references/90_SINTESIS.md +0 -133
  488. package/vendor/theus-arsenal/skills/descubrimiento-plugins-laravel/SKILL.md +0 -230
  489. package/vendor/theus-arsenal/skills/destilado-reglas/SKILL.md +0 -263
  490. package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-rules.sh +0 -58
  491. package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-skills.sh +0 -129
  492. package/vendor/theus-arsenal/skills/diagnostico-bgp/SKILL.md +0 -170
  493. package/vendor/theus-arsenal/skills/direccion-estetica/SKILL.md +0 -220
  494. package/vendor/theus-arsenal/skills/direccion-estetica/references/taxonomia-generos.md +0 -89
  495. package/vendor/theus-arsenal/skills/diseno-api/SKILL.md +0 -522
  496. package/vendor/theus-arsenal/skills/diseno-liquid-glass/SKILL.md +0 -282
  497. package/vendor/theus-arsenal/skills/e2e-escritorio-windows/SKILL.md +0 -879
  498. package/vendor/theus-arsenal/skills/edicion-video/SKILL.md +0 -289
  499. package/vendor/theus-arsenal/skills/enfoque-producto/SKILL.md +0 -91
  500. package/vendor/theus-arsenal/skills/entornos-flox/SKILL.md +0 -493
  501. package/vendor/theus-arsenal/skills/estandares-codigo/SKILL.md +0 -548
  502. package/vendor/theus-arsenal/skills/estandares-cpp/SKILL.md +0 -727
  503. package/vendor/theus-arsenal/skills/estandares-java/SKILL.md +0 -389
  504. package/vendor/theus-arsenal/skills/estilo-legado/SKILL.md +0 -149
  505. package/vendor/theus-arsenal/skills/estructura-informes-competencia/SKILL.md +0 -95
  506. package/vendor/theus-arsenal/skills/evaluacion-academica/SKILL.md +0 -165
  507. package/vendor/theus-arsenal/skills/explorador-skills/SKILL.md +0 -129
  508. package/vendor/theus-arsenal/skills/flujo-git/SKILL.md +0 -714
  509. package/vendor/theus-arsenal/skills/flujo-ingenieria-ml/SKILL.md +0 -343
  510. package/vendor/theus-arsenal/skills/flujo-tdd/SKILL.md +0 -584
  511. package/vendor/theus-arsenal/skills/forja-personas/SKILL.md +0 -298
  512. package/vendor/theus-arsenal/skills/forja-personas/gacha.py +0 -224
  513. package/vendor/theus-arsenal/skills/forja-personas/gacha.sh +0 -5
  514. package/vendor/theus-arsenal/skills/forja-personas/references/avatar-style.md +0 -123
  515. package/vendor/theus-arsenal/skills/forja-personas/references/boundary-rules.md +0 -53
  516. package/vendor/theus-arsenal/skills/forja-personas/references/error-handling.md +0 -53
  517. package/vendor/theus-arsenal/skills/forja-personas/references/identity-tension.md +0 -48
  518. package/vendor/theus-arsenal/skills/forja-personas/references/naming-system.md +0 -39
  519. package/vendor/theus-arsenal/skills/forja-personas/references/output-template.md +0 -166
  520. package/vendor/theus-arsenal/skills/fundamentos-animacion/SKILL.md +0 -296
  521. package/vendor/theus-arsenal/skills/generacion-iconos-ios/SKILL.md +0 -156
  522. package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/generate_icons.swift +0 -258
  523. package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/iconify_gen.sh +0 -235
  524. package/vendor/theus-arsenal/skills/gestion-excepciones-logisticas/SKILL.md +0 -208
  525. package/vendor/theus-arsenal/skills/gestion-transportistas/SKILL.md +0 -204
  526. package/vendor/theus-arsenal/skills/guia-adopcion-ml/SKILL.md +0 -64
  527. package/vendor/theus-arsenal/skills/harness-agente-autonomo/SKILL.md +0 -252
  528. package/vendor/theus-arsenal/skills/harness-eval-clinico/SKILL.md +0 -212
  529. package/vendor/theus-arsenal/skills/harness-evaluacion/SKILL.md +0 -296
  530. package/vendor/theus-arsenal/skills/harness-generador-evaluador/SKILL.md +0 -254
  531. package/vendor/theus-arsenal/skills/homelab-diseno-red/SKILL.md +0 -120
  532. package/vendor/theus-arsenal/skills/homelab-dns-pihole/SKILL.md +0 -264
  533. package/vendor/theus-arsenal/skills/homelab-preparacion-red/SKILL.md +0 -144
  534. package/vendor/theus-arsenal/skills/homelab-segmentacion-vlan/SKILL.md +0 -307
  535. package/vendor/theus-arsenal/skills/homelab-vpn-wireguard/SKILL.md +0 -299
  536. package/vendor/theus-arsenal/skills/ingenieria-agentica/SKILL.md +0 -96
  537. package/vendor/theus-arsenal/skills/inspeccion-animaciones-blender/SKILL.md +0 -164
  538. package/vendor/theus-arsenal/skills/instaladores-python/SKILL.md +0 -820
  539. package/vendor/theus-arsenal/skills/integracion-jira/SKILL.md +0 -307
  540. package/vendor/theus-arsenal/skills/inteligencia-leads/SKILL.md +0 -312
  541. package/vendor/theus-arsenal/skills/inteligencia-leads/agents/agente-enriquecimiento.md +0 -87
  542. package/vendor/theus-arsenal/skills/inteligencia-leads/agents/mapeador-mutuos.md +0 -76
  543. package/vendor/theus-arsenal/skills/inteligencia-leads/agents/puntuador-senales.md +0 -60
  544. package/vendor/theus-arsenal/skills/inteligencia-leads/agents/redactor-outreach.md +0 -102
  545. package/vendor/theus-arsenal/skills/inteligencia-mercados-prediccion/SKILL.md +0 -53
  546. package/vendor/theus-arsenal/skills/introspeccion-agente/SKILL.md +0 -150
  547. package/vendor/theus-arsenal/skills/inventario-skills/SKILL.md +0 -194
  548. package/vendor/theus-arsenal/skills/inventario-skills/scripts/quick-diff.sh +0 -87
  549. package/vendor/theus-arsenal/skills/inventario-skills/scripts/save-results.sh +0 -57
  550. package/vendor/theus-arsenal/skills/inventario-skills/scripts/scan.sh +0 -170
  551. package/vendor/theus-arsenal/skills/investigacion-mercado/SKILL.md +0 -87
  552. package/vendor/theus-arsenal/skills/investigacion-oraculos-prediccion/SKILL.md +0 -59
  553. package/vendor/theus-arsenal/skills/investigacion-profunda/SKILL.md +0 -161
  554. package/vendor/theus-arsenal/skills/keccak256-nodejs/SKILL.md +0 -100
  555. package/vendor/theus-arsenal/skills/libro-decisiones-recursivo/SKILL.md +0 -82
  556. package/vendor/theus-arsenal/skills/lienzo-planes/SKILL.md +0 -111
  557. package/vendor/theus-arsenal/skills/limpieza-configuracion/SKILL.md +0 -116
  558. package/vendor/theus-arsenal/skills/logistica-inversa-devoluciones/SKILL.md +0 -241
  559. package/vendor/theus-arsenal/skills/manejo-errores/SKILL.md +0 -375
  560. package/vendor/theus-arsenal/skills/materiales-inversores/SKILL.md +0 -101
  561. package/vendor/theus-arsenal/skills/memoria-por-proyecto/SKILL.md +0 -170
  562. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/forget.mjs +0 -44
  563. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/info.mjs +0 -24
  564. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/init.mjs +0 -152
  565. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/list.mjs +0 -40
  566. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/migrate.mjs +0 -214
  567. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/resume.mjs +0 -36
  568. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/save.mjs +0 -210
  569. package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/shared.mjs +0 -402
  570. package/vendor/theus-arsenal/skills/memoria-por-proyecto/hooks/session-start.mjs +0 -238
  571. package/vendor/theus-arsenal/skills/metodologia-benchmarks/SKILL.md +0 -131
  572. package/vendor/theus-arsenal/skills/migraciones-bd/SKILL.md +0 -430
  573. package/vendor/theus-arsenal/skills/modelos-fundacionales-en-dispositivo/SKILL.md +0 -244
  574. package/vendor/theus-arsenal/skills/modo-seguro/SKILL.md +0 -86
  575. package/vendor/theus-arsenal/skills/motion-avanzado/SKILL.md +0 -592
  576. package/vendor/theus-arsenal/skills/motor-de-contenido/SKILL.md +0 -136
  577. package/vendor/theus-arsenal/skills/no-conformidades-calidad/SKILL.md +0 -249
  578. package/vendor/theus-arsenal/skills/onboarding-codigo/SKILL.md +0 -244
  579. package/vendor/theus-arsenal/skills/operaciones-agentes-empresariales/SKILL.md +0 -51
  580. package/vendor/theus-arsenal/skills/operaciones-conocimiento/SKILL.md +0 -159
  581. package/vendor/theus-arsenal/skills/operaciones-correo/SKILL.md +0 -123
  582. package/vendor/theus-arsenal/skills/operaciones-facturacion/SKILL.md +0 -142
  583. package/vendor/theus-arsenal/skills/operaciones-flujo-proyectos/SKILL.md +0 -110
  584. package/vendor/theus-arsenal/skills/operaciones-github/SKILL.md +0 -143
  585. package/vendor/theus-arsenal/skills/operaciones-google-workspace/SKILL.md +0 -100
  586. package/vendor/theus-arsenal/skills/operaciones-investigacion/SKILL.md +0 -124
  587. package/vendor/theus-arsenal/skills/operaciones-mensajes/SKILL.md +0 -103
  588. package/vendor/theus-arsenal/skills/operaciones-terminal/SKILL.md +0 -110
  589. package/vendor/theus-arsenal/skills/optimizacion-benchmark/SKILL.md +0 -70
  590. package/vendor/theus-arsenal/skills/optimizacion-costos-llm/SKILL.md +0 -182
  591. package/vendor/theus-arsenal/skills/optimizador-conexiones/SKILL.md +0 -191
  592. package/vendor/theus-arsenal/skills/optimizador-paralelismo/SKILL.md +0 -75
  593. package/vendor/theus-arsenal/skills/optimizador-prompts/SKILL.md +0 -374
  594. package/vendor/theus-arsenal/skills/orq-agregar-funcionalidad/SKILL.md +0 -37
  595. package/vendor/theus-arsenal/skills/orq-cambiar-funcionalidad/SKILL.md +0 -36
  596. package/vendor/theus-arsenal/skills/orq-construir-mvp/SKILL.md +0 -38
  597. package/vendor/theus-arsenal/skills/orq-corregir-defecto/SKILL.md +0 -36
  598. package/vendor/theus-arsenal/skills/orq-pipeline/SKILL.md +0 -134
  599. package/vendor/theus-arsenal/skills/orq-refinar-codigo/SKILL.md +0 -49
  600. package/vendor/theus-arsenal/skills/orquestacion-equipos-agentes/SKILL.md +0 -117
  601. package/vendor/theus-arsenal/skills/pagos-agentes-x402/SKILL.md +0 -237
  602. package/vendor/theus-arsenal/skills/patrones-angular/SKILL.md +0 -153
  603. package/vendor/theus-arsenal/skills/patrones-angular/references/angular-animations.md +0 -160
  604. package/vendor/theus-arsenal/skills/patrones-angular/references/angular-aria.md +0 -410
  605. package/vendor/theus-arsenal/skills/patrones-angular/references/cli.md +0 -86
  606. package/vendor/theus-arsenal/skills/patrones-angular/references/component-harnesses.md +0 -59
  607. package/vendor/theus-arsenal/skills/patrones-angular/references/component-styling.md +0 -91
  608. package/vendor/theus-arsenal/skills/patrones-angular/references/components.md +0 -117
  609. package/vendor/theus-arsenal/skills/patrones-angular/references/creating-services.md +0 -97
  610. package/vendor/theus-arsenal/skills/patrones-angular/references/data-resolvers.md +0 -69
  611. package/vendor/theus-arsenal/skills/patrones-angular/references/define-routes.md +0 -67
  612. package/vendor/theus-arsenal/skills/patrones-angular/references/defining-providers.md +0 -72
  613. package/vendor/theus-arsenal/skills/patrones-angular/references/di-fundamentals.md +0 -120
  614. package/vendor/theus-arsenal/skills/patrones-angular/references/e2e-testing.md +0 -56
  615. package/vendor/theus-arsenal/skills/patrones-angular/references/effects.md +0 -83
  616. package/vendor/theus-arsenal/skills/patrones-angular/references/hierarchical-injectors.md +0 -43
  617. package/vendor/theus-arsenal/skills/patrones-angular/references/host-elements.md +0 -80
  618. package/vendor/theus-arsenal/skills/patrones-angular/references/injection-context.md +0 -63
  619. package/vendor/theus-arsenal/skills/patrones-angular/references/inputs.md +0 -101
  620. package/vendor/theus-arsenal/skills/patrones-angular/references/linked-signal.md +0 -59
  621. package/vendor/theus-arsenal/skills/patrones-angular/references/loading-strategies.md +0 -61
  622. package/vendor/theus-arsenal/skills/patrones-angular/references/mcp.md +0 -67
  623. package/vendor/theus-arsenal/skills/patrones-angular/references/navigate-to-routes.md +0 -69
  624. package/vendor/theus-arsenal/skills/patrones-angular/references/outputs.md +0 -86
  625. package/vendor/theus-arsenal/skills/patrones-angular/references/reactive-forms.md +0 -122
  626. package/vendor/theus-arsenal/skills/patrones-angular/references/rendering-strategies.md +0 -44
  627. package/vendor/theus-arsenal/skills/patrones-angular/references/resource.md +0 -77
  628. package/vendor/theus-arsenal/skills/patrones-angular/references/route-animations.md +0 -56
  629. package/vendor/theus-arsenal/skills/patrones-angular/references/route-guards.md +0 -52
  630. package/vendor/theus-arsenal/skills/patrones-angular/references/router-lifecycle.md +0 -45
  631. package/vendor/theus-arsenal/skills/patrones-angular/references/router-testing.md +0 -87
  632. package/vendor/theus-arsenal/skills/patrones-angular/references/show-routes-with-outlets.md +0 -68
  633. package/vendor/theus-arsenal/skills/patrones-angular/references/signal-forms.md +0 -795
  634. package/vendor/theus-arsenal/skills/patrones-angular/references/signals-overview.md +0 -94
  635. package/vendor/theus-arsenal/skills/patrones-angular/references/tailwind-css.md +0 -69
  636. package/vendor/theus-arsenal/skills/patrones-angular/references/template-driven-forms.md +0 -114
  637. package/vendor/theus-arsenal/skills/patrones-angular/references/testing-fundamentals.md +0 -65
  638. package/vendor/theus-arsenal/skills/patrones-animacion/SKILL.md +0 -432
  639. package/vendor/theus-arsenal/skills/patrones-backend/SKILL.md +0 -560
  640. package/vendor/theus-arsenal/skills/patrones-cdss-clinico/SKILL.md +0 -249
  641. package/vendor/theus-arsenal/skills/patrones-cisco-ios/SKILL.md +0 -148
  642. package/vendor/theus-arsenal/skills/patrones-clickhouse/SKILL.md +0 -443
  643. package/vendor/theus-arsenal/skills/patrones-compose-multiplatform/SKILL.md +0 -298
  644. package/vendor/theus-arsenal/skills/patrones-dart-flutter/SKILL.md +0 -566
  645. package/vendor/theus-arsenal/skills/patrones-despliegue/SKILL.md +0 -426
  646. package/vendor/theus-arsenal/skills/patrones-django/SKILL.md +0 -739
  647. package/vendor/theus-arsenal/skills/patrones-django-celery/SKILL.md +0 -456
  648. package/vendor/theus-arsenal/skills/patrones-docker/SKILL.md +0 -363
  649. package/vendor/theus-arsenal/skills/patrones-dotnet/SKILL.md +0 -321
  650. package/vendor/theus-arsenal/skills/patrones-emr-clinico/SKILL.md +0 -168
  651. package/vendor/theus-arsenal/skills/patrones-fastapi/SKILL.md +0 -513
  652. package/vendor/theus-arsenal/skills/patrones-frontend/SKILL.md +0 -655
  653. package/vendor/theus-arsenal/skills/patrones-go/SKILL.md +0 -674
  654. package/vendor/theus-arsenal/skills/patrones-jpa/SKILL.md +0 -156
  655. package/vendor/theus-arsenal/skills/patrones-kotlin/SKILL.md +0 -717
  656. package/vendor/theus-arsenal/skills/patrones-kotlin-exposed/SKILL.md +0 -724
  657. package/vendor/theus-arsenal/skills/patrones-kotlin-ktor/SKILL.md +0 -694
  658. package/vendor/theus-arsenal/skills/patrones-kubernetes/SKILL.md +0 -754
  659. package/vendor/theus-arsenal/skills/patrones-laravel/SKILL.md +0 -414
  660. package/vendor/theus-arsenal/skills/patrones-mcp/SKILL.md +0 -66
  661. package/vendor/theus-arsenal/skills/patrones-mysql/SKILL.md +0 -420
  662. package/vendor/theus-arsenal/skills/patrones-nestjs/SKILL.md +0 -229
  663. package/vendor/theus-arsenal/skills/patrones-nextjs/SKILL.md +0 -56
  664. package/vendor/theus-arsenal/skills/patrones-nuxt4/SKILL.md +0 -99
  665. package/vendor/theus-arsenal/skills/patrones-perl/SKILL.md +0 -508
  666. package/vendor/theus-arsenal/skills/patrones-postgres/SKILL.md +0 -141
  667. package/vendor/theus-arsenal/skills/patrones-prisma/SKILL.md +0 -399
  668. package/vendor/theus-arsenal/skills/patrones-python/SKILL.md +0 -750
  669. package/vendor/theus-arsenal/skills/patrones-pytorch/SKILL.md +0 -400
  670. package/vendor/theus-arsenal/skills/patrones-quarkus/SKILL.md +0 -729
  671. package/vendor/theus-arsenal/skills/patrones-react/SKILL.md +0 -339
  672. package/vendor/theus-arsenal/skills/patrones-react-native/SKILL.md +0 -325
  673. package/vendor/theus-arsenal/skills/patrones-redis/SKILL.md +0 -401
  674. package/vendor/theus-arsenal/skills/patrones-rust/SKILL.md +0 -504
  675. package/vendor/theus-arsenal/skills/patrones-springboot/SKILL.md +0 -314
  676. package/vendor/theus-arsenal/skills/patrones-swiftui/SKILL.md +0 -261
  677. package/vendor/theus-arsenal/skills/patrones-tinystruct/SKILL.md +0 -281
  678. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/architecture.md +0 -90
  679. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/data-handling.md +0 -60
  680. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/database.md +0 -99
  681. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/routing.md +0 -64
  682. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/system-usage.md +0 -97
  683. package/vendor/theus-arsenal/skills/patrones-tinystruct/references/testing.md +0 -72
  684. package/vendor/theus-arsenal/skills/patrones-vite/SKILL.md +0 -449
  685. package/vendor/theus-arsenal/skills/patrones-vue/SKILL.md +0 -469
  686. package/vendor/theus-arsenal/skills/persistencia-actores-swift/SKILL.md +0 -148
  687. package/vendor/theus-arsenal/skills/pipeline-opensource/SKILL.md +0 -254
  688. package/vendor/theus-arsenal/skills/planificacion-demanda-inventario/SKILL.md +0 -236
  689. package/vendor/theus-arsenal/skills/planificador-trades-prediccion/SKILL.md +0 -60
  690. package/vendor/theus-arsenal/skills/plano-tecnico/SKILL.md +0 -102
  691. package/vendor/theus-arsenal/skills/presentaciones-html/SKILL.md +0 -189
  692. package/vendor/theus-arsenal/skills/presentaciones-html/STYLE_PRESETS.md +0 -330
  693. package/vendor/theus-arsenal/skills/presentaciones-html/animation-patterns.md +0 -122
  694. package/vendor/theus-arsenal/skills/presentaciones-html/html-template.md +0 -419
  695. package/vendor/theus-arsenal/skills/presentaciones-html/scripts/export-pdf.sh +0 -418
  696. package/vendor/theus-arsenal/skills/presentaciones-html/scripts/extract-pptx.py +0 -96
  697. package/vendor/theus-arsenal/skills/presentaciones-html/viewport-base.css +0 -153
  698. package/vendor/theus-arsenal/skills/presupuesto-contexto/SKILL.md +0 -263
  699. package/vendor/theus-arsenal/skills/procesamiento-documentos-nutrient/SKILL.md +0 -168
  700. package/vendor/theus-arsenal/skills/programacion-produccion/SKILL.md +0 -220
  701. package/vendor/theus-arsenal/skills/publicacion-cruzada/SKILL.md +0 -117
  702. package/vendor/theus-arsenal/skills/publicador-social/SKILL.md +0 -121
  703. package/vendor/theus-arsenal/skills/puerta-de-entrega/SKILL.md +0 -164
  704. package/vendor/theus-arsenal/skills/puerta-de-entrega/hooks/puerta-entrega.py +0 -242
  705. package/vendor/theus-arsenal/skills/pulir-interfaces/SKILL.md +0 -126
  706. package/vendor/theus-arsenal/skills/qa-navegador/SKILL.md +0 -103
  707. package/vendor/theus-arsenal/skills/ranking-grafo-social/SKILL.md +0 -153
  708. package/vendor/theus-arsenal/skills/recuperacion-iterativa/SKILL.md +0 -236
  709. package/vendor/theus-arsenal/skills/redaccion-articulos/SKILL.md +0 -81
  710. package/vendor/theus-arsenal/skills/regex-vs-llm/SKILL.md +0 -221
  711. package/vendor/theus-arsenal/skills/regresion-codigo-ia/SKILL.md +0 -388
  712. package/vendor/theus-arsenal/skills/rendimiento-react/SKILL.md +0 -567
  713. package/vendor/theus-arsenal/skills/revision-codigo-flutter-dart/SKILL.md +0 -442
  714. package/vendor/theus-arsenal/skills/revision-literatura-cientifica/SKILL.md +0 -191
  715. package/vendor/theus-arsenal/skills/revision-multiperspectiva/SKILL.md +0 -302
  716. package/vendor/theus-arsenal/skills/revision-riesgo-prediccion/SKILL.md +0 -56
  717. package/vendor/theus-arsenal/skills/revision-seguridad/SKILL.md +0 -505
  718. package/vendor/theus-arsenal/skills/revision-seguridad/cloud-infrastructure-security.md +0 -361
  719. package/vendor/theus-arsenal/skills/runtime-bun/SKILL.md +0 -83
  720. package/vendor/theus-arsenal/skills/salud-codigo-codescene/SKILL.md +0 -163
  721. package/vendor/theus-arsenal/skills/salud-interfaces-red/SKILL.md +0 -143
  722. package/vendor/theus-arsenal/skills/seguimiento-costos/SKILL.md +0 -122
  723. package/vendor/theus-arsenal/skills/seguridad-agentes-trading/SKILL.md +0 -145
  724. package/vendor/theus-arsenal/skills/seguridad-amm-defi/SKILL.md +0 -166
  725. package/vendor/theus-arsenal/skills/seguridad-django/SKILL.md +0 -648
  726. package/vendor/theus-arsenal/skills/seguridad-laravel/SKILL.md +0 -945
  727. package/vendor/theus-arsenal/skills/seguridad-perl/SKILL.md +0 -507
  728. package/vendor/theus-arsenal/skills/seguridad-quarkus/SKILL.md +0 -474
  729. package/vendor/theus-arsenal/skills/seguridad-springboot/SKILL.md +0 -279
  730. package/vendor/theus-arsenal/skills/seo/SKILL.md +0 -166
  731. package/vendor/theus-arsenal/skills/sistema-diseno/SKILL.md +0 -81
  732. package/vendor/theus-arsenal/skills/sistema-operativo-agentico/SKILL.md +0 -375
  733. package/vendor/theus-arsenal/skills/sistemas-latencia-critica/SKILL.md +0 -65
  734. package/vendor/theus-arsenal/skills/tdd-django/SKILL.md +0 -735
  735. package/vendor/theus-arsenal/skills/tdd-laravel/SKILL.md +0 -673
  736. package/vendor/theus-arsenal/skills/tdd-quarkus/SKILL.md +0 -817
  737. package/vendor/theus-arsenal/skills/tdd-springboot/SKILL.md +0 -165
  738. package/vendor/theus-arsenal/skills/testing-cpp/SKILL.md +0 -328
  739. package/vendor/theus-arsenal/skills/testing-csharp/SKILL.md +0 -321
  740. package/vendor/theus-arsenal/skills/testing-e2e/SKILL.md +0 -325
  741. package/vendor/theus-arsenal/skills/testing-go/SKILL.md +0 -719
  742. package/vendor/theus-arsenal/skills/testing-kotlin/SKILL.md +0 -829
  743. package/vendor/theus-arsenal/skills/testing-perl/SKILL.md +0 -479
  744. package/vendor/theus-arsenal/skills/testing-protocolos-di-swift/SKILL.md +0 -196
  745. package/vendor/theus-arsenal/skills/testing-python/SKILL.md +0 -815
  746. package/vendor/theus-arsenal/skills/testing-react/SKILL.md +0 -421
  747. package/vendor/theus-arsenal/skills/testing-rust/SKILL.md +0 -506
  748. package/vendor/theus-arsenal/skills/tours-de-codigo/SKILL.md +0 -252
  749. package/vendor/theus-arsenal/skills/traduccion-documentos-visado/SKILL.md +0 -121
  750. package/vendor/theus-arsenal/skills/ui-a-vue/SKILL.md +0 -141
  751. package/vendor/theus-arsenal/skills/validacion-config-red/SKILL.md +0 -211
  752. package/vendor/theus-arsenal/skills/verificacion-django/SKILL.md +0 -470
  753. package/vendor/theus-arsenal/skills/verificacion-factual/SKILL.md +0 -142
  754. package/vendor/theus-arsenal/skills/verificacion-laravel/SKILL.md +0 -184
  755. package/vendor/theus-arsenal/skills/verificacion-quarkus/SKILL.md +0 -485
  756. package/vendor/theus-arsenal/skills/verificacion-springboot/SKILL.md +0 -237
  757. package/vendor/theus-arsenal/skills/videodb/SKILL.md +0 -374
  758. package/vendor/theus-arsenal/skills/videodb/reference/api-reference.md +0 -550
  759. package/vendor/theus-arsenal/skills/videodb/reference/capture-reference.md +0 -407
  760. package/vendor/theus-arsenal/skills/videodb/reference/capture.md +0 -101
  761. package/vendor/theus-arsenal/skills/videodb/reference/editor.md +0 -443
  762. package/vendor/theus-arsenal/skills/videodb/reference/generative.md +0 -331
  763. package/vendor/theus-arsenal/skills/videodb/reference/rtstream-reference.md +0 -564
  764. package/vendor/theus-arsenal/skills/videodb/reference/rtstream.md +0 -65
  765. package/vendor/theus-arsenal/skills/videodb/reference/search.md +0 -230
  766. package/vendor/theus-arsenal/skills/videodb/reference/streaming.md +0 -406
  767. package/vendor/theus-arsenal/skills/videodb/reference/use-cases.md +0 -118
  768. package/vendor/theus-arsenal/skills/videodb/scripts/ws_listener.py +0 -279
  769. package/vendor/theus-arsenal/skills/videos-manim/SKILL.md +0 -91
  770. package/vendor/theus-arsenal/skills/videos-manim/assets/network_graph_scene.py +0 -52
  771. package/vendor/theus-arsenal/skills/vigilancia-canary/SKILL.md +0 -108
  772. 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++