theus-cli 0.2.83 → 0.2.85

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