theus-cli-linux-arm64 1.2.2 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -11
- package/RELEASE.json +6 -6
- package/bin/theus +0 -0
- package/package.json +1 -1
- package/vendor/higiene-motor/PARCHES.md +244 -0
- package/vendor/higiene-motor/audit_dir.py +166 -0
- package/vendor/higiene-motor/audit_lib.py +333 -0
- package/vendor/higiene-motor/audit_website.py +635 -0
- package/vendor/higiene-motor/av_meta.py +498 -0
- package/vendor/higiene-motor/check_staged.py +71 -0
- package/vendor/higiene-motor/clean_ctrlregen.py +212 -0
- package/vendor/higiene-motor/clean_file.py +237 -0
- package/vendor/higiene-motor/clean_image.py +218 -0
- package/vendor/higiene-motor/clean_staged.py +143 -0
- package/vendor/higiene-motor/clean_text.py +108 -0
- package/vendor/higiene-motor/common.py +486 -0
- package/vendor/higiene-motor/container_meta.py +2522 -0
- package/vendor/higiene-motor/detect_gumbel.py +308 -0
- package/vendor/higiene-motor/detect_text_watermark.py +613 -0
- package/vendor/higiene-motor/format_dispatch.py +157 -0
- package/vendor/higiene-motor/hook_written_file.py +253 -0
- package/vendor/higiene-motor/image_meta.py +2171 -0
- package/vendor/higiene-motor/inspect_file.py +138 -0
- package/vendor/higiene-motor/inspect_image.py +72 -0
- package/vendor/higiene-motor/inspect_text.py +86 -0
- package/vendor/higiene-motor/markdiffusion_harness.py +533 -0
- package/vendor/higiene-motor/rewrite_text.py +737 -0
- package/vendor/higiene-motor/score_stylometry.py +460 -0
- package/vendor/higiene-motor/score_synthid.py +165 -0
- package/vendor/higiene-motor/server.py +1059 -0
- package/vendor/higiene-motor/synthid_score_server.py +176 -0
- package/vendor/higiene-motor/text_detectors.py +433 -0
- package/vendor/higiene-motor/text_unicode.py +730 -0
- package/vendor/theus-arsenal/.arsenal-nombres-ola2.json +0 -6
- package/vendor/theus-arsenal/.arsenal-nombres-ola3.json +0 -72
- package/vendor/theus-arsenal/.mailmap +0 -2
- package/vendor/theus-arsenal/.theus-plugin/marketplace.json +0 -25
- package/vendor/theus-arsenal/.theus-plugin/plugin.json +0 -20
- package/vendor/theus-arsenal/AUTHORS.md +0 -8
- package/vendor/theus-arsenal/CLEANROOM_REPLACEMENT_PLAN.md +0 -11
- package/vendor/theus-arsenal/LICENSE +0 -26
- package/vendor/theus-arsenal/PROVENANCE.md +0 -9
- package/vendor/theus-arsenal/README.md +0 -41
- package/vendor/theus-arsenal/THIRD_PARTY.md +0 -80
- package/vendor/theus-arsenal/agents/actualizador-docs.md +0 -123
- package/vendor/theus-arsenal/agents/analista-comentarios.md +0 -53
- package/vendor/theus-arsenal/agents/analista-conversaciones.md +0 -60
- package/vendor/theus-arsenal/agents/analista-tests-pr.md +0 -53
- package/vendor/theus-arsenal/agents/analista-tipos.md +0 -49
- package/vendor/theus-arsenal/agents/arquitecto-accesibilidad.md +0 -148
- package/vendor/theus-arsenal/agents/arquitecto-codigo.md +0 -79
- package/vendor/theus-arsenal/agents/arquitecto-homelab.md +0 -90
- package/vendor/theus-arsenal/agents/arquitecto-redes.md +0 -116
- package/vendor/theus-arsenal/agents/arquitecto-sistemas.md +0 -219
- package/vendor/theus-arsenal/agents/bifurcador-opensource.md +0 -206
- package/vendor/theus-arsenal/agents/cazador-fallos-silenciosos.md +0 -58
- package/vendor/theus-arsenal/agents/consultor-documentacion.md +0 -76
- package/vendor/theus-arsenal/agents/diagnosticador-redes.md +0 -135
- package/vendor/theus-arsenal/agents/ejecutor-e2e.md +0 -96
- package/vendor/theus-arsenal/agents/empaquetador-opensource.md +0 -257
- package/vendor/theus-arsenal/agents/escaner-secretos.md +0 -196
- package/vendor/theus-arsenal/agents/especialista-seo.md +0 -70
- package/vendor/theus-arsenal/agents/estratega-marketing.md +0 -158
- package/vendor/theus-arsenal/agents/evaluador-agentes.md +0 -214
- package/vendor/theus-arsenal/agents/evaluador-harness.md +0 -217
- package/vendor/theus-arsenal/agents/explorador-codigo.md +0 -79
- package/vendor/theus-arsenal/agents/extractor-specs.md +0 -214
- package/vendor/theus-arsenal/agents/generador-harness.md +0 -139
- package/vendor/theus-arsenal/agents/guia-tdd.md +0 -99
- package/vendor/theus-arsenal/agents/jefe-de-gabinete.md +0 -162
- package/vendor/theus-arsenal/agents/limpiador-refactors.md +0 -93
- package/vendor/theus-arsenal/agents/optimizador-rendimiento.md +0 -454
- package/vendor/theus-arsenal/agents/planificador-harness.md +0 -107
- package/vendor/theus-arsenal/agents/planificador.md +0 -221
- package/vendor/theus-arsenal/agents/resolutor-apps-harmonyos.md +0 -181
- package/vendor/theus-arsenal/agents/resolutor-builds-cpp.md +0 -98
- package/vendor/theus-arsenal/agents/resolutor-builds-dart.md +0 -209
- package/vendor/theus-arsenal/agents/resolutor-builds-django.md +0 -253
- package/vendor/theus-arsenal/agents/resolutor-builds-go.md +0 -102
- package/vendor/theus-arsenal/agents/resolutor-builds-java.md +0 -274
- package/vendor/theus-arsenal/agents/resolutor-builds-kotlin.md +0 -128
- package/vendor/theus-arsenal/agents/resolutor-builds-pytorch.md +0 -128
- package/vendor/theus-arsenal/agents/resolutor-builds-react.md +0 -214
- package/vendor/theus-arsenal/agents/resolutor-builds-rust.md +0 -156
- package/vendor/theus-arsenal/agents/resolutor-builds-swift.md +0 -169
- package/vendor/theus-arsenal/agents/resolutor-builds.md +0 -122
- package/vendor/theus-arsenal/agents/revisor-bd.md +0 -97
- package/vendor/theus-arsenal/agents/revisor-codigo.md +0 -291
- package/vendor/theus-arsenal/agents/revisor-config-red.md +0 -116
- package/vendor/theus-arsenal/agents/revisor-cpp.md +0 -80
- package/vendor/theus-arsenal/agents/revisor-csharp.md +0 -109
- package/vendor/theus-arsenal/agents/revisor-django.md +0 -168
- package/vendor/theus-arsenal/agents/revisor-fastapi.md +0 -82
- package/vendor/theus-arsenal/agents/revisor-flutter.md +0 -251
- package/vendor/theus-arsenal/agents/revisor-go.md +0 -84
- package/vendor/theus-arsenal/agents/revisor-java.md +0 -192
- package/vendor/theus-arsenal/agents/revisor-kotlin.md +0 -171
- package/vendor/theus-arsenal/agents/revisor-ml.md +0 -159
- package/vendor/theus-arsenal/agents/revisor-php.md +0 -108
- package/vendor/theus-arsenal/agents/revisor-python.md +0 -106
- package/vendor/theus-arsenal/agents/revisor-react.md +0 -166
- package/vendor/theus-arsenal/agents/revisor-rust.md +0 -102
- package/vendor/theus-arsenal/agents/revisor-seguridad.md +0 -116
- package/vendor/theus-arsenal/agents/revisor-software-clinico.md +0 -95
- package/vendor/theus-arsenal/agents/revisor-swift.md +0 -115
- package/vendor/theus-arsenal/agents/revisor-typescript.md +0 -123
- package/vendor/theus-arsenal/agents/revisor-vue.md +0 -205
- package/vendor/theus-arsenal/agents/simplificador-codigo.md +0 -55
- package/vendor/theus-arsenal/commands/actualizar-docs.md +0 -88
- package/vendor/theus-arsenal/commands/actualizar-mapas-codigo.md +0 -78
- package/vendor/theus-arsenal/commands/aprender-evaluar.md +0 -109
- package/vendor/theus-arsenal/commands/aprender.md +0 -74
- package/vendor/theus-arsenal/commands/arreglar-build.md +0 -66
- package/vendor/theus-arsenal/commands/bucle-multiperspectiva.md +0 -153
- package/vendor/theus-arsenal/commands/build-cpp.md +0 -173
- package/vendor/theus-arsenal/commands/build-flutter.md +0 -164
- package/vendor/theus-arsenal/commands/build-go.md +0 -183
- package/vendor/theus-arsenal/commands/build-gradle.md +0 -75
- package/vendor/theus-arsenal/commands/build-kotlin.md +0 -176
- package/vendor/theus-arsenal/commands/build-react.md +0 -187
- package/vendor/theus-arsenal/commands/build-rust.md +0 -187
- package/vendor/theus-arsenal/commands/campana-marketing.md +0 -125
- package/vendor/theus-arsenal/commands/checkpoint.md +0 -78
- package/vendor/theus-arsenal/commands/cobertura-tests.md +0 -73
- package/vendor/theus-arsenal/commands/configurar-gestor-paquetes.md +0 -86
- package/vendor/theus-arsenal/commands/consulta.md +0 -164
- package/vendor/theus-arsenal/commands/control-calidad.md +0 -50
- package/vendor/theus-arsenal/commands/crear-skill.md +0 -77
- package/vendor/theus-arsenal/commands/enrutar-modelo.md +0 -30
- package/vendor/theus-arsenal/commands/epica-desbloquear.md +0 -17
- package/vendor/theus-arsenal/commands/epica-descomponer.md +0 -22
- package/vendor/theus-arsenal/commands/epica-publicar.md +0 -21
- package/vendor/theus-arsenal/commands/epica-reclamar.md +0 -25
- package/vendor/theus-arsenal/commands/epica-revisar.md +0 -22
- package/vendor/theus-arsenal/commands/epica-sincronizar.md +0 -21
- package/vendor/theus-arsenal/commands/epica-validar.md +0 -21
- package/vendor/theus-arsenal/commands/evolucionar.md +0 -176
- package/vendor/theus-arsenal/commands/funcionalidad.md +0 -49
- package/vendor/theus-arsenal/commands/guardar-sesion.md +0 -278
- package/vendor/theus-arsenal/commands/harness-build.md +0 -111
- package/vendor/theus-arsenal/commands/harness-diseno.md +0 -46
- package/vendor/theus-arsenal/commands/informe-costos.md +0 -90
- package/vendor/theus-arsenal/commands/iniciar-bucle.md +0 -36
- package/vendor/theus-arsenal/commands/instintos-estado.md +0 -53
- package/vendor/theus-arsenal/commands/instintos-exportar.md +0 -69
- package/vendor/theus-arsenal/commands/instintos-importar.md +0 -120
- package/vendor/theus-arsenal/commands/lienzo-planes.md +0 -48
- package/vendor/theus-arsenal/commands/limpiar-refactor.md +0 -84
- package/vendor/theus-arsenal/commands/modo-seguro.md +0 -96
- package/vendor/theus-arsenal/commands/orq-agregar-funcionalidad.md +0 -36
- package/vendor/theus-arsenal/commands/orq-cambiar-funcionalidad.md +0 -38
- package/vendor/theus-arsenal/commands/orq-construir-mvp.md +0 -36
- package/vendor/theus-arsenal/commands/orq-corregir-defecto.md +0 -40
- package/vendor/theus-arsenal/commands/orq-refinar-codigo.md +0 -44
- package/vendor/theus-arsenal/commands/orq-revisar.md +0 -135
- package/vendor/theus-arsenal/commands/plan-prd.md +0 -160
- package/vendor/theus-arsenal/commands/plan.md +0 -198
- package/vendor/theus-arsenal/commands/podar.md +0 -31
- package/vendor/theus-arsenal/commands/pr.md +0 -181
- package/vendor/theus-arsenal/commands/promover.md +0 -41
- package/vendor/theus-arsenal/commands/proyectos.md +0 -33
- package/vendor/theus-arsenal/commands/prp-commit.md +0 -112
- package/vendor/theus-arsenal/commands/prp-implementar.md +0 -385
- package/vendor/theus-arsenal/commands/prp-planificar.md +0 -501
- package/vendor/theus-arsenal/commands/reanudar-sesion.md +0 -160
- package/vendor/theus-arsenal/commands/revisar-codigo.md +0 -289
- package/vendor/theus-arsenal/commands/revisar-cpp.md +0 -132
- package/vendor/theus-arsenal/commands/revisar-fastapi.md +0 -39
- package/vendor/theus-arsenal/commands/revisar-flutter.md +0 -115
- package/vendor/theus-arsenal/commands/revisar-go.md +0 -148
- package/vendor/theus-arsenal/commands/revisar-kotlin.md +0 -140
- package/vendor/theus-arsenal/commands/revisar-pr.md +0 -37
- package/vendor/theus-arsenal/commands/revisar-python.md +0 -297
- package/vendor/theus-arsenal/commands/revisar-react.md +0 -170
- package/vendor/theus-arsenal/commands/revisar-rust.md +0 -142
- package/vendor/theus-arsenal/commands/revisar-vue.md +0 -174
- package/vendor/theus-arsenal/commands/salud-skills.md +0 -52
- package/vendor/theus-arsenal/commands/sesiones.md +0 -345
- package/vendor/theus-arsenal/commands/test-cpp.md +0 -252
- package/vendor/theus-arsenal/commands/test-flutter.md +0 -143
- package/vendor/theus-arsenal/commands/test-go.md +0 -268
- package/vendor/theus-arsenal/commands/test-kotlin.md +0 -312
- package/vendor/theus-arsenal/commands/test-react.md +0 -265
- package/vendor/theus-arsenal/commands/test-rust.md +0 -309
- package/vendor/theus-arsenal/commands/vigilancia-canary.md +0 -43
- package/vendor/theus-arsenal/hooks/hooks.json +0 -274
- package/vendor/theus-arsenal/package.json +0 -6
- package/vendor/theus-arsenal/rules/angular/coding-style.md +0 -182
- package/vendor/theus-arsenal/rules/angular/hooks.md +0 -25
- package/vendor/theus-arsenal/rules/angular/patterns.md +0 -249
- package/vendor/theus-arsenal/rules/angular/security.md +0 -87
- package/vendor/theus-arsenal/rules/angular/testing.md +0 -164
- package/vendor/theus-arsenal/rules/arkts/coding-style.md +0 -153
- package/vendor/theus-arsenal/rules/arkts/hooks.md +0 -80
- package/vendor/theus-arsenal/rules/arkts/patterns.md +0 -236
- package/vendor/theus-arsenal/rules/arkts/security.md +0 -141
- package/vendor/theus-arsenal/rules/arkts/testing.md +0 -126
- package/vendor/theus-arsenal/rules/common/agents.md +0 -49
- package/vendor/theus-arsenal/rules/common/code-review.md +0 -123
- package/vendor/theus-arsenal/rules/common/coding-style.md +0 -90
- package/vendor/theus-arsenal/rules/common/development-workflow.md +0 -44
- package/vendor/theus-arsenal/rules/common/git-workflow.md +0 -24
- package/vendor/theus-arsenal/rules/common/hooks.md +0 -32
- package/vendor/theus-arsenal/rules/common/patterns.md +0 -31
- package/vendor/theus-arsenal/rules/common/performance.md +0 -53
- package/vendor/theus-arsenal/rules/common/security.md +0 -29
- package/vendor/theus-arsenal/rules/common/testing.md +0 -57
- package/vendor/theus-arsenal/rules/cpp/coding-style.md +0 -44
- package/vendor/theus-arsenal/rules/cpp/hooks.md +0 -39
- package/vendor/theus-arsenal/rules/cpp/patterns.md +0 -51
- package/vendor/theus-arsenal/rules/cpp/security.md +0 -51
- package/vendor/theus-arsenal/rules/cpp/testing.md +0 -44
- package/vendor/theus-arsenal/rules/csharp/coding-style.md +0 -72
- package/vendor/theus-arsenal/rules/csharp/hooks.md +0 -25
- package/vendor/theus-arsenal/rules/csharp/patterns.md +0 -50
- package/vendor/theus-arsenal/rules/csharp/security.md +0 -58
- package/vendor/theus-arsenal/rules/csharp/testing.md +0 -50
- package/vendor/theus-arsenal/rules/dart/coding-style.md +0 -159
- package/vendor/theus-arsenal/rules/dart/hooks.md +0 -68
- package/vendor/theus-arsenal/rules/dart/patterns.md +0 -261
- package/vendor/theus-arsenal/rules/dart/security.md +0 -135
- package/vendor/theus-arsenal/rules/dart/testing.md +0 -215
- package/vendor/theus-arsenal/rules/fsharp/coding-style.md +0 -112
- package/vendor/theus-arsenal/rules/fsharp/hooks.md +0 -26
- package/vendor/theus-arsenal/rules/fsharp/patterns.md +0 -111
- package/vendor/theus-arsenal/rules/fsharp/security.md +0 -76
- package/vendor/theus-arsenal/rules/fsharp/testing.md +0 -62
- package/vendor/theus-arsenal/rules/golang/coding-style.md +0 -32
- package/vendor/theus-arsenal/rules/golang/hooks.md +0 -17
- package/vendor/theus-arsenal/rules/golang/patterns.md +0 -45
- package/vendor/theus-arsenal/rules/golang/security.md +0 -34
- package/vendor/theus-arsenal/rules/golang/testing.md +0 -31
- package/vendor/theus-arsenal/rules/java/coding-style.md +0 -114
- package/vendor/theus-arsenal/rules/java/hooks.md +0 -18
- package/vendor/theus-arsenal/rules/java/patterns.md +0 -147
- package/vendor/theus-arsenal/rules/java/security.md +0 -101
- package/vendor/theus-arsenal/rules/java/testing.md +0 -133
- package/vendor/theus-arsenal/rules/kotlin/coding-style.md +0 -86
- package/vendor/theus-arsenal/rules/kotlin/hooks.md +0 -17
- package/vendor/theus-arsenal/rules/kotlin/patterns.md +0 -146
- package/vendor/theus-arsenal/rules/kotlin/security.md +0 -82
- package/vendor/theus-arsenal/rules/kotlin/testing.md +0 -128
- package/vendor/theus-arsenal/rules/nuxt/coding-style.md +0 -47
- package/vendor/theus-arsenal/rules/nuxt/hooks.md +0 -39
- package/vendor/theus-arsenal/rules/nuxt/patterns.md +0 -54
- package/vendor/theus-arsenal/rules/nuxt/security.md +0 -48
- package/vendor/theus-arsenal/rules/nuxt/testing.md +0 -49
- package/vendor/theus-arsenal/rules/php/coding-style.md +0 -40
- package/vendor/theus-arsenal/rules/php/hooks.md +0 -24
- package/vendor/theus-arsenal/rules/php/patterns.md +0 -33
- package/vendor/theus-arsenal/rules/php/security.md +0 -37
- package/vendor/theus-arsenal/rules/php/testing.md +0 -38
- package/vendor/theus-arsenal/rules/python/coding-style.md +0 -42
- package/vendor/theus-arsenal/rules/python/fastapi.md +0 -58
- package/vendor/theus-arsenal/rules/python/hooks.md +0 -19
- package/vendor/theus-arsenal/rules/python/patterns.md +0 -39
- package/vendor/theus-arsenal/rules/python/security.md +0 -30
- package/vendor/theus-arsenal/rules/python/testing.md +0 -38
- package/vendor/theus-arsenal/rules/react/coding-style.md +0 -109
- package/vendor/theus-arsenal/rules/react/hooks.md +0 -187
- package/vendor/theus-arsenal/rules/react/patterns.md +0 -194
- package/vendor/theus-arsenal/rules/react/security.md +0 -180
- package/vendor/theus-arsenal/rules/react/testing.md +0 -208
- package/vendor/theus-arsenal/rules/react-native/accessibility.md +0 -55
- package/vendor/theus-arsenal/rules/react-native/coding-style.md +0 -71
- package/vendor/theus-arsenal/rules/react-native/hooks.md +0 -28
- package/vendor/theus-arsenal/rules/react-native/patterns.md +0 -88
- package/vendor/theus-arsenal/rules/react-native/performance.md +0 -45
- package/vendor/theus-arsenal/rules/react-native/production-readiness.md +0 -51
- package/vendor/theus-arsenal/rules/react-native/security.md +0 -43
- package/vendor/theus-arsenal/rules/react-native/testing.md +0 -52
- package/vendor/theus-arsenal/rules/ruby/coding-style.md +0 -46
- package/vendor/theus-arsenal/rules/ruby/hooks.md +0 -37
- package/vendor/theus-arsenal/rules/ruby/patterns.md +0 -44
- package/vendor/theus-arsenal/rules/ruby/security.md +0 -51
- package/vendor/theus-arsenal/rules/ruby/testing.md +0 -51
- package/vendor/theus-arsenal/rules/rust/coding-style.md +0 -151
- package/vendor/theus-arsenal/rules/rust/hooks.md +0 -16
- package/vendor/theus-arsenal/rules/rust/patterns.md +0 -168
- package/vendor/theus-arsenal/rules/rust/security.md +0 -141
- package/vendor/theus-arsenal/rules/rust/testing.md +0 -154
- package/vendor/theus-arsenal/rules/swift/coding-style.md +0 -47
- package/vendor/theus-arsenal/rules/swift/hooks.md +0 -20
- package/vendor/theus-arsenal/rules/swift/patterns.md +0 -66
- package/vendor/theus-arsenal/rules/swift/security.md +0 -33
- package/vendor/theus-arsenal/rules/swift/testing.md +0 -45
- package/vendor/theus-arsenal/rules/typescript/coding-style.md +0 -199
- package/vendor/theus-arsenal/rules/typescript/hooks.md +0 -22
- package/vendor/theus-arsenal/rules/typescript/patterns.md +0 -52
- package/vendor/theus-arsenal/rules/typescript/security.md +0 -28
- package/vendor/theus-arsenal/rules/typescript/testing.md +0 -18
- package/vendor/theus-arsenal/rules/vue/coding-style.md +0 -54
- package/vendor/theus-arsenal/rules/vue/hooks.md +0 -45
- package/vendor/theus-arsenal/rules/vue/patterns.md +0 -56
- package/vendor/theus-arsenal/rules/vue/security.md +0 -46
- package/vendor/theus-arsenal/rules/vue/testing.md +0 -53
- package/vendor/theus-arsenal/rules/web/coding-style.md +0 -108
- package/vendor/theus-arsenal/rules/web/design-quality.md +0 -75
- package/vendor/theus-arsenal/rules/web/hooks.md +0 -141
- package/vendor/theus-arsenal/rules/web/patterns.md +0 -91
- package/vendor/theus-arsenal/rules/web/performance.md +0 -76
- package/vendor/theus-arsenal/rules/web/security.md +0 -69
- package/vendor/theus-arsenal/rules/web/testing.md +0 -67
- package/vendor/theus-arsenal/scripts/hooks/bash-hook-dispatcher.js +0 -192
- package/vendor/theus-arsenal/scripts/hooks/block-no-verify.js +0 -556
- package/vendor/theus-arsenal/scripts/hooks/check-console-log.js +0 -92
- package/vendor/theus-arsenal/scripts/hooks/check-hook-enabled.js +0 -16
- package/vendor/theus-arsenal/scripts/hooks/config-protection.js +0 -171
- package/vendor/theus-arsenal/scripts/hooks/design-quality-check.js +0 -132
- package/vendor/theus-arsenal/scripts/hooks/doc-file-warning.js +0 -110
- package/vendor/theus-arsenal/scripts/hooks/modo-seguro.js +0 -158
- package/vendor/theus-arsenal/scripts/hooks/notificacion-escritorio.js +0 -208
- package/vendor/theus-arsenal/scripts/hooks/plugin-hook-bootstrap.js +0 -280
- package/vendor/theus-arsenal/scripts/hooks/post-bash-command-log.js +0 -87
- package/vendor/theus-arsenal/scripts/hooks/post-bash-dispatcher.js +0 -24
- package/vendor/theus-arsenal/scripts/hooks/post-bash-pr-created.js +0 -60
- package/vendor/theus-arsenal/scripts/hooks/post-edit-accumulator.js +0 -94
- package/vendor/theus-arsenal/scripts/hooks/post-edit-console-warn.js +0 -54
- package/vendor/theus-arsenal/scripts/hooks/post-edit-format.js +0 -110
- package/vendor/theus-arsenal/scripts/hooks/post-edit-typecheck.js +0 -98
- package/vendor/theus-arsenal/scripts/hooks/pre-bash-commit-quality.js +0 -447
- package/vendor/theus-arsenal/scripts/hooks/pre-bash-dev-server-block.js +0 -232
- package/vendor/theus-arsenal/scripts/hooks/pre-bash-dispatcher.js +0 -27
- package/vendor/theus-arsenal/scripts/hooks/pre-compact.js +0 -101
- package/vendor/theus-arsenal/scripts/hooks/pretooluse-visible-output.js +0 -49
- package/vendor/theus-arsenal/scripts/hooks/quality-gate.js +0 -168
- package/vendor/theus-arsenal/scripts/hooks/run-with-flags.js +0 -271
- package/vendor/theus-arsenal/scripts/hooks/salud-mcp.js +0 -749
- package/vendor/theus-arsenal/scripts/hooks/seguimiento-costos.js +0 -161
- package/vendor/theus-arsenal/scripts/hooks/session-end.js +0 -340
- package/vendor/theus-arsenal/scripts/hooks/session-start.js +0 -906
- package/vendor/theus-arsenal/scripts/hooks/stop-format-typecheck.js +0 -263
- package/vendor/theus-arsenal/scripts/hooks/suggest-compact.js +0 -286
- package/vendor/theus-arsenal/scripts/hooks/theus-context-monitor.js +0 -289
- package/vendor/theus-arsenal/scripts/hooks/verificacion-factual.js +0 -1278
- package/vendor/theus-arsenal/scripts/lib/agent-data-home.js +0 -96
- package/vendor/theus-arsenal/scripts/lib/cost-estimate.js +0 -66
- package/vendor/theus-arsenal/scripts/lib/hook-flags.js +0 -79
- package/vendor/theus-arsenal/scripts/lib/llm-summary.js +0 -185
- package/vendor/theus-arsenal/scripts/lib/loopback-guard.js +0 -54
- package/vendor/theus-arsenal/scripts/lib/observer-sessions.js +0 -237
- package/vendor/theus-arsenal/scripts/lib/package-manager.d.ts +0 -120
- package/vendor/theus-arsenal/scripts/lib/package-manager.js +0 -434
- package/vendor/theus-arsenal/scripts/lib/path-safety.js +0 -86
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/markdown.js +0 -285
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/sdk.js +0 -238
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/server.js +0 -534
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/sessions.js +0 -274
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/ui.js +0 -546
- package/vendor/theus-arsenal/scripts/lib/project-detect.js +0 -451
- package/vendor/theus-arsenal/scripts/lib/resolve-formatter.js +0 -193
- package/vendor/theus-arsenal/scripts/lib/resolve-theus-root.js +0 -101
- package/vendor/theus-arsenal/scripts/lib/session-aliases.d.ts +0 -138
- package/vendor/theus-arsenal/scripts/lib/session-aliases.js +0 -483
- package/vendor/theus-arsenal/scripts/lib/session-bridge.js +0 -155
- package/vendor/theus-arsenal/scripts/lib/session-manager.d.ts +0 -137
- package/vendor/theus-arsenal/scripts/lib/session-manager.js +0 -555
- package/vendor/theus-arsenal/scripts/lib/shell-split.js +0 -86
- package/vendor/theus-arsenal/scripts/lib/shell-substitution.js +0 -501
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/dashboard.js +0 -414
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/health.js +0 -285
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/index.js +0 -22
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/provenance.js +0 -200
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/tracker.js +0 -157
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/versioning.js +0 -246
- package/vendor/theus-arsenal/scripts/lib/transcript-context.js +0 -232
- package/vendor/theus-arsenal/scripts/lib/utils.d.ts +0 -205
- package/vendor/theus-arsenal/scripts/lib/utils.js +0 -658
- package/vendor/theus-arsenal/scripts/plan-canvas.js +0 -341
- package/vendor/theus-arsenal/scripts/setup-package-manager.js +0 -46
- package/vendor/theus-arsenal/scripts/skills-health.js +0 -143
- package/vendor/theus-arsenal/skills/a11y-frontend/SKILL.md +0 -444
- package/vendor/theus-arsenal/skills/accesibilidad/SKILL.md +0 -144
- package/vendor/theus-arsenal/skills/acelerador-throughput-datos/SKILL.md +0 -72
- package/vendor/theus-arsenal/skills/agente-scraper-datos/SKILL.md +0 -771
- package/vendor/theus-arsenal/skills/analisis-plataformas-competencia/SKILL.md +0 -137
- package/vendor/theus-arsenal/skills/api-x/SKILL.md +0 -233
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/SKILL.md +0 -335
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer-loop.sh +0 -374
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer.md +0 -188
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/session-guardian.sh +0 -153
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/start-observer.sh +0 -253
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/config.json +0 -8
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/hooks/observe.sh +0 -594
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/detect-project.sh +0 -325
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/instinct-cli.py +0 -1918
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/lib/arsenal-dir.sh +0 -23
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/test_parse_instinct.py +0 -1420
- package/vendor/theus-arsenal/skills/arquitectura-hexagonal/SKILL.md +0 -275
- package/vendor/theus-arsenal/skills/arquitectura-limpia-android/SKILL.md +0 -340
- package/vendor/theus-arsenal/skills/arquitectura-pipelines-recomendacion/SKILL.md +0 -112
- package/vendor/theus-arsenal/skills/atlas-datos-prediccion/SKILL.md +0 -53
- package/vendor/theus-arsenal/skills/auditoria-arquitectura-agentes/SKILL.md +0 -257
- package/vendor/theus-arsenal/skills/auditoria-produccion/SKILL.md +0 -180
- package/vendor/theus-arsenal/skills/auditoria-rutas-clic/SKILL.md +0 -243
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/SKILL.md +0 -180
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/high-score-example.md +0 -89
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/low-score-example.md +0 -87
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/evaluation-criteria.md +0 -71
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/hook-integration.md +0 -90
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/scripts/evaluate.py +0 -409
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/templates/evaluation-report.md +0 -86
- package/vendor/theus-arsenal/skills/automatizacion-ssh-netmiko/SKILL.md +0 -176
- package/vendor/theus-arsenal/skills/base-datos-pubmed/SKILL.md +0 -174
- package/vendor/theus-arsenal/skills/base-datos-uspto/SKILL.md +0 -173
- package/vendor/theus-arsenal/skills/benchmark/SKILL.md +0 -92
- package/vendor/theus-arsenal/skills/bitacora-crecimiento/SKILL.md +0 -120
- package/vendor/theus-arsenal/skills/bucle-verificacion/SKILL.md +0 -125
- package/vendor/theus-arsenal/skills/buscar-primero/SKILL.md +0 -184
- package/vendor/theus-arsenal/skills/busqueda-exa/SKILL.md +0 -111
- package/vendor/theus-arsenal/skills/cache-por-hash/SKILL.md +0 -160
- package/vendor/theus-arsenal/skills/campana-marketing/SKILL.md +0 -118
- package/vendor/theus-arsenal/skills/capacidad-producto/SKILL.md +0 -138
- package/vendor/theus-arsenal/skills/cazador-vulnerabilidades/SKILL.md +0 -104
- package/vendor/theus-arsenal/skills/compactacion-estrategica/SKILL.md +0 -115
- package/vendor/theus-arsenal/skills/comparador-baskets-prediccion/SKILL.md +0 -69
- package/vendor/theus-arsenal/skills/compras-energia/SKILL.md +0 -206
- package/vendor/theus-arsenal/skills/concurrencia-swift-6-2/SKILL.md +0 -224
- package/vendor/theus-arsenal/skills/consejo/SKILL.md +0 -201
- package/vendor/theus-arsenal/skills/construccion-harness-agentes/SKILL.md +0 -78
- package/vendor/theus-arsenal/skills/constructor-conectores/SKILL.md +0 -119
- package/vendor/theus-arsenal/skills/constructor-equipos/SKILL.md +0 -169
- package/vendor/theus-arsenal/skills/consulta-documentacion/SKILL.md +0 -92
- package/vendor/theus-arsenal/skills/consultas-genomicas-gget/SKILL.md +0 -170
- package/vendor/theus-arsenal/skills/contacto-inversores/SKILL.md +0 -95
- package/vendor/theus-arsenal/skills/corrutinas-flows-kotlin/SKILL.md +0 -284
- package/vendor/theus-arsenal/skills/creacion-video-remotion/SKILL.md +0 -46
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/3d.md +0 -86
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/animations.md +0 -29
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/charts-bar-chart.tsx +0 -173
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-typewriter.tsx +0 -100
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-word-highlight.tsx +0 -108
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets.md +0 -78
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/audio.md +0 -172
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/calculate-metadata.md +0 -104
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/can-decode.md +0 -75
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/charts.md +0 -58
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/compositions.md +0 -146
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/display-captions.md +0 -126
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/extract-frames.md +0 -229
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/fonts.md +0 -152
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-audio-duration.md +0 -58
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-dimensions.md +0 -68
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-duration.md +0 -58
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/gifs.md +0 -138
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/images.md +0 -130
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/import-srt-captions.md +0 -67
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/lottie.md +0 -67
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-dom-nodes.md +0 -34
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-text.md +0 -143
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/sequencing.md +0 -106
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/tailwind.md +0 -11
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/text-animations.md +0 -20
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/timing.md +0 -179
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transcribe-captions.md +0 -19
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transitions.md +0 -122
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/trimming.md +0 -52
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/videos.md +0 -171
- package/vendor/theus-arsenal/skills/cumplimiento-aduanero/SKILL.md +0 -270
- package/vendor/theus-arsenal/skills/cumplimiento-hipaa/SKILL.md +0 -78
- package/vendor/theus-arsenal/skills/datos-sensibles-salud/SKILL.md +0 -149
- package/vendor/theus-arsenal/skills/decimales-tokens-evm/SKILL.md +0 -128
- package/vendor/theus-arsenal/skills/decisiones-arquitectura/SKILL.md +0 -206
- package/vendor/theus-arsenal/skills/demos-ui/SKILL.md +0 -469
- package/vendor/theus-arsenal/skills/desarrollo-por-intencion/SKILL.md +0 -369
- package/vendor/theus-arsenal/skills/descubrimiento-marca/SKILL.md +0 -149
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/10_proposito-porque.md +0 -42
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/20_posicionamiento.md +0 -47
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/30_audiencia-nicho.md +0 -53
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/40_personalidad-arquetipo.md +0 -61
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/50_voz-tono.md +0 -62
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/60_narrativa-historia.md +0 -54
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/70_tension-fundador.md +0 -50
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/90_SINTESIS.md +0 -133
- package/vendor/theus-arsenal/skills/descubrimiento-plugins-laravel/SKILL.md +0 -230
- package/vendor/theus-arsenal/skills/destilado-reglas/SKILL.md +0 -263
- package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-rules.sh +0 -58
- package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-skills.sh +0 -129
- package/vendor/theus-arsenal/skills/diagnostico-bgp/SKILL.md +0 -170
- package/vendor/theus-arsenal/skills/direccion-estetica/SKILL.md +0 -220
- package/vendor/theus-arsenal/skills/direccion-estetica/references/taxonomia-generos.md +0 -89
- package/vendor/theus-arsenal/skills/diseno-api/SKILL.md +0 -522
- package/vendor/theus-arsenal/skills/diseno-liquid-glass/SKILL.md +0 -282
- package/vendor/theus-arsenal/skills/e2e-escritorio-windows/SKILL.md +0 -879
- package/vendor/theus-arsenal/skills/edicion-video/SKILL.md +0 -289
- package/vendor/theus-arsenal/skills/enfoque-producto/SKILL.md +0 -91
- package/vendor/theus-arsenal/skills/entornos-flox/SKILL.md +0 -493
- package/vendor/theus-arsenal/skills/estandares-codigo/SKILL.md +0 -548
- package/vendor/theus-arsenal/skills/estandares-cpp/SKILL.md +0 -727
- package/vendor/theus-arsenal/skills/estandares-java/SKILL.md +0 -389
- package/vendor/theus-arsenal/skills/estilo-legado/SKILL.md +0 -149
- package/vendor/theus-arsenal/skills/estructura-informes-competencia/SKILL.md +0 -95
- package/vendor/theus-arsenal/skills/evaluacion-academica/SKILL.md +0 -165
- package/vendor/theus-arsenal/skills/explorador-skills/SKILL.md +0 -129
- package/vendor/theus-arsenal/skills/flujo-git/SKILL.md +0 -714
- package/vendor/theus-arsenal/skills/flujo-ingenieria-ml/SKILL.md +0 -343
- package/vendor/theus-arsenal/skills/flujo-tdd/SKILL.md +0 -584
- package/vendor/theus-arsenal/skills/forja-personas/SKILL.md +0 -298
- package/vendor/theus-arsenal/skills/forja-personas/gacha.py +0 -224
- package/vendor/theus-arsenal/skills/forja-personas/gacha.sh +0 -5
- package/vendor/theus-arsenal/skills/forja-personas/references/avatar-style.md +0 -123
- package/vendor/theus-arsenal/skills/forja-personas/references/boundary-rules.md +0 -53
- package/vendor/theus-arsenal/skills/forja-personas/references/error-handling.md +0 -53
- package/vendor/theus-arsenal/skills/forja-personas/references/identity-tension.md +0 -48
- package/vendor/theus-arsenal/skills/forja-personas/references/naming-system.md +0 -39
- package/vendor/theus-arsenal/skills/forja-personas/references/output-template.md +0 -166
- package/vendor/theus-arsenal/skills/fundamentos-animacion/SKILL.md +0 -296
- package/vendor/theus-arsenal/skills/generacion-iconos-ios/SKILL.md +0 -156
- package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/generate_icons.swift +0 -258
- package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/iconify_gen.sh +0 -235
- package/vendor/theus-arsenal/skills/gestion-excepciones-logisticas/SKILL.md +0 -208
- package/vendor/theus-arsenal/skills/gestion-transportistas/SKILL.md +0 -204
- package/vendor/theus-arsenal/skills/guia-adopcion-ml/SKILL.md +0 -64
- package/vendor/theus-arsenal/skills/harness-agente-autonomo/SKILL.md +0 -252
- package/vendor/theus-arsenal/skills/harness-eval-clinico/SKILL.md +0 -212
- package/vendor/theus-arsenal/skills/harness-evaluacion/SKILL.md +0 -296
- package/vendor/theus-arsenal/skills/harness-generador-evaluador/SKILL.md +0 -254
- package/vendor/theus-arsenal/skills/homelab-diseno-red/SKILL.md +0 -120
- package/vendor/theus-arsenal/skills/homelab-dns-pihole/SKILL.md +0 -264
- package/vendor/theus-arsenal/skills/homelab-preparacion-red/SKILL.md +0 -144
- package/vendor/theus-arsenal/skills/homelab-segmentacion-vlan/SKILL.md +0 -307
- package/vendor/theus-arsenal/skills/homelab-vpn-wireguard/SKILL.md +0 -299
- package/vendor/theus-arsenal/skills/ingenieria-agentica/SKILL.md +0 -96
- package/vendor/theus-arsenal/skills/inspeccion-animaciones-blender/SKILL.md +0 -164
- package/vendor/theus-arsenal/skills/instaladores-python/SKILL.md +0 -820
- package/vendor/theus-arsenal/skills/integracion-jira/SKILL.md +0 -307
- package/vendor/theus-arsenal/skills/inteligencia-leads/SKILL.md +0 -312
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/agente-enriquecimiento.md +0 -87
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/mapeador-mutuos.md +0 -76
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/puntuador-senales.md +0 -60
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/redactor-outreach.md +0 -102
- package/vendor/theus-arsenal/skills/inteligencia-mercados-prediccion/SKILL.md +0 -53
- package/vendor/theus-arsenal/skills/introspeccion-agente/SKILL.md +0 -150
- package/vendor/theus-arsenal/skills/inventario-skills/SKILL.md +0 -194
- package/vendor/theus-arsenal/skills/inventario-skills/scripts/quick-diff.sh +0 -87
- package/vendor/theus-arsenal/skills/inventario-skills/scripts/save-results.sh +0 -57
- package/vendor/theus-arsenal/skills/inventario-skills/scripts/scan.sh +0 -170
- package/vendor/theus-arsenal/skills/investigacion-mercado/SKILL.md +0 -87
- package/vendor/theus-arsenal/skills/investigacion-oraculos-prediccion/SKILL.md +0 -59
- package/vendor/theus-arsenal/skills/investigacion-profunda/SKILL.md +0 -161
- package/vendor/theus-arsenal/skills/keccak256-nodejs/SKILL.md +0 -100
- package/vendor/theus-arsenal/skills/libro-decisiones-recursivo/SKILL.md +0 -82
- package/vendor/theus-arsenal/skills/lienzo-planes/SKILL.md +0 -111
- package/vendor/theus-arsenal/skills/limpieza-configuracion/SKILL.md +0 -116
- package/vendor/theus-arsenal/skills/logistica-inversa-devoluciones/SKILL.md +0 -241
- package/vendor/theus-arsenal/skills/manejo-errores/SKILL.md +0 -375
- package/vendor/theus-arsenal/skills/materiales-inversores/SKILL.md +0 -101
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/SKILL.md +0 -170
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/forget.mjs +0 -44
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/info.mjs +0 -24
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/init.mjs +0 -152
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/list.mjs +0 -40
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/migrate.mjs +0 -214
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/resume.mjs +0 -36
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/save.mjs +0 -210
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/shared.mjs +0 -402
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/hooks/session-start.mjs +0 -238
- package/vendor/theus-arsenal/skills/metodologia-benchmarks/SKILL.md +0 -131
- package/vendor/theus-arsenal/skills/migraciones-bd/SKILL.md +0 -430
- package/vendor/theus-arsenal/skills/modelos-fundacionales-en-dispositivo/SKILL.md +0 -244
- package/vendor/theus-arsenal/skills/modo-seguro/SKILL.md +0 -86
- package/vendor/theus-arsenal/skills/motion-avanzado/SKILL.md +0 -592
- package/vendor/theus-arsenal/skills/motor-de-contenido/SKILL.md +0 -136
- package/vendor/theus-arsenal/skills/no-conformidades-calidad/SKILL.md +0 -249
- package/vendor/theus-arsenal/skills/onboarding-codigo/SKILL.md +0 -244
- package/vendor/theus-arsenal/skills/operaciones-agentes-empresariales/SKILL.md +0 -51
- package/vendor/theus-arsenal/skills/operaciones-conocimiento/SKILL.md +0 -159
- package/vendor/theus-arsenal/skills/operaciones-correo/SKILL.md +0 -123
- package/vendor/theus-arsenal/skills/operaciones-facturacion/SKILL.md +0 -142
- package/vendor/theus-arsenal/skills/operaciones-flujo-proyectos/SKILL.md +0 -110
- package/vendor/theus-arsenal/skills/operaciones-github/SKILL.md +0 -143
- package/vendor/theus-arsenal/skills/operaciones-google-workspace/SKILL.md +0 -100
- package/vendor/theus-arsenal/skills/operaciones-investigacion/SKILL.md +0 -124
- package/vendor/theus-arsenal/skills/operaciones-mensajes/SKILL.md +0 -103
- package/vendor/theus-arsenal/skills/operaciones-terminal/SKILL.md +0 -110
- package/vendor/theus-arsenal/skills/optimizacion-benchmark/SKILL.md +0 -70
- package/vendor/theus-arsenal/skills/optimizacion-costos-llm/SKILL.md +0 -182
- package/vendor/theus-arsenal/skills/optimizador-conexiones/SKILL.md +0 -191
- package/vendor/theus-arsenal/skills/optimizador-paralelismo/SKILL.md +0 -75
- package/vendor/theus-arsenal/skills/optimizador-prompts/SKILL.md +0 -374
- package/vendor/theus-arsenal/skills/orq-agregar-funcionalidad/SKILL.md +0 -37
- package/vendor/theus-arsenal/skills/orq-cambiar-funcionalidad/SKILL.md +0 -36
- package/vendor/theus-arsenal/skills/orq-construir-mvp/SKILL.md +0 -38
- package/vendor/theus-arsenal/skills/orq-corregir-defecto/SKILL.md +0 -36
- package/vendor/theus-arsenal/skills/orq-pipeline/SKILL.md +0 -134
- package/vendor/theus-arsenal/skills/orq-refinar-codigo/SKILL.md +0 -49
- package/vendor/theus-arsenal/skills/orquestacion-equipos-agentes/SKILL.md +0 -117
- package/vendor/theus-arsenal/skills/pagos-agentes-x402/SKILL.md +0 -237
- package/vendor/theus-arsenal/skills/patrones-angular/SKILL.md +0 -153
- package/vendor/theus-arsenal/skills/patrones-angular/references/angular-animations.md +0 -160
- package/vendor/theus-arsenal/skills/patrones-angular/references/angular-aria.md +0 -410
- package/vendor/theus-arsenal/skills/patrones-angular/references/cli.md +0 -86
- package/vendor/theus-arsenal/skills/patrones-angular/references/component-harnesses.md +0 -59
- package/vendor/theus-arsenal/skills/patrones-angular/references/component-styling.md +0 -91
- package/vendor/theus-arsenal/skills/patrones-angular/references/components.md +0 -117
- package/vendor/theus-arsenal/skills/patrones-angular/references/creating-services.md +0 -97
- package/vendor/theus-arsenal/skills/patrones-angular/references/data-resolvers.md +0 -69
- package/vendor/theus-arsenal/skills/patrones-angular/references/define-routes.md +0 -67
- package/vendor/theus-arsenal/skills/patrones-angular/references/defining-providers.md +0 -72
- package/vendor/theus-arsenal/skills/patrones-angular/references/di-fundamentals.md +0 -120
- package/vendor/theus-arsenal/skills/patrones-angular/references/e2e-testing.md +0 -56
- package/vendor/theus-arsenal/skills/patrones-angular/references/effects.md +0 -83
- package/vendor/theus-arsenal/skills/patrones-angular/references/hierarchical-injectors.md +0 -43
- package/vendor/theus-arsenal/skills/patrones-angular/references/host-elements.md +0 -80
- package/vendor/theus-arsenal/skills/patrones-angular/references/injection-context.md +0 -63
- package/vendor/theus-arsenal/skills/patrones-angular/references/inputs.md +0 -101
- package/vendor/theus-arsenal/skills/patrones-angular/references/linked-signal.md +0 -59
- package/vendor/theus-arsenal/skills/patrones-angular/references/loading-strategies.md +0 -61
- package/vendor/theus-arsenal/skills/patrones-angular/references/mcp.md +0 -67
- package/vendor/theus-arsenal/skills/patrones-angular/references/navigate-to-routes.md +0 -69
- package/vendor/theus-arsenal/skills/patrones-angular/references/outputs.md +0 -86
- package/vendor/theus-arsenal/skills/patrones-angular/references/reactive-forms.md +0 -122
- package/vendor/theus-arsenal/skills/patrones-angular/references/rendering-strategies.md +0 -44
- package/vendor/theus-arsenal/skills/patrones-angular/references/resource.md +0 -77
- package/vendor/theus-arsenal/skills/patrones-angular/references/route-animations.md +0 -56
- package/vendor/theus-arsenal/skills/patrones-angular/references/route-guards.md +0 -52
- package/vendor/theus-arsenal/skills/patrones-angular/references/router-lifecycle.md +0 -45
- package/vendor/theus-arsenal/skills/patrones-angular/references/router-testing.md +0 -87
- package/vendor/theus-arsenal/skills/patrones-angular/references/show-routes-with-outlets.md +0 -68
- package/vendor/theus-arsenal/skills/patrones-angular/references/signal-forms.md +0 -795
- package/vendor/theus-arsenal/skills/patrones-angular/references/signals-overview.md +0 -94
- package/vendor/theus-arsenal/skills/patrones-angular/references/tailwind-css.md +0 -69
- package/vendor/theus-arsenal/skills/patrones-angular/references/template-driven-forms.md +0 -114
- package/vendor/theus-arsenal/skills/patrones-angular/references/testing-fundamentals.md +0 -65
- package/vendor/theus-arsenal/skills/patrones-animacion/SKILL.md +0 -432
- package/vendor/theus-arsenal/skills/patrones-backend/SKILL.md +0 -560
- package/vendor/theus-arsenal/skills/patrones-cdss-clinico/SKILL.md +0 -249
- package/vendor/theus-arsenal/skills/patrones-cisco-ios/SKILL.md +0 -148
- package/vendor/theus-arsenal/skills/patrones-clickhouse/SKILL.md +0 -443
- package/vendor/theus-arsenal/skills/patrones-compose-multiplatform/SKILL.md +0 -298
- package/vendor/theus-arsenal/skills/patrones-dart-flutter/SKILL.md +0 -566
- package/vendor/theus-arsenal/skills/patrones-despliegue/SKILL.md +0 -426
- package/vendor/theus-arsenal/skills/patrones-django/SKILL.md +0 -739
- package/vendor/theus-arsenal/skills/patrones-django-celery/SKILL.md +0 -456
- package/vendor/theus-arsenal/skills/patrones-docker/SKILL.md +0 -363
- package/vendor/theus-arsenal/skills/patrones-dotnet/SKILL.md +0 -321
- package/vendor/theus-arsenal/skills/patrones-emr-clinico/SKILL.md +0 -168
- package/vendor/theus-arsenal/skills/patrones-fastapi/SKILL.md +0 -513
- package/vendor/theus-arsenal/skills/patrones-frontend/SKILL.md +0 -655
- package/vendor/theus-arsenal/skills/patrones-go/SKILL.md +0 -674
- package/vendor/theus-arsenal/skills/patrones-jpa/SKILL.md +0 -156
- package/vendor/theus-arsenal/skills/patrones-kotlin/SKILL.md +0 -717
- package/vendor/theus-arsenal/skills/patrones-kotlin-exposed/SKILL.md +0 -724
- package/vendor/theus-arsenal/skills/patrones-kotlin-ktor/SKILL.md +0 -694
- package/vendor/theus-arsenal/skills/patrones-kubernetes/SKILL.md +0 -754
- package/vendor/theus-arsenal/skills/patrones-laravel/SKILL.md +0 -414
- package/vendor/theus-arsenal/skills/patrones-mcp/SKILL.md +0 -66
- package/vendor/theus-arsenal/skills/patrones-mysql/SKILL.md +0 -420
- package/vendor/theus-arsenal/skills/patrones-nestjs/SKILL.md +0 -229
- package/vendor/theus-arsenal/skills/patrones-nextjs/SKILL.md +0 -56
- package/vendor/theus-arsenal/skills/patrones-nuxt4/SKILL.md +0 -99
- package/vendor/theus-arsenal/skills/patrones-perl/SKILL.md +0 -508
- package/vendor/theus-arsenal/skills/patrones-postgres/SKILL.md +0 -141
- package/vendor/theus-arsenal/skills/patrones-prisma/SKILL.md +0 -399
- package/vendor/theus-arsenal/skills/patrones-python/SKILL.md +0 -750
- package/vendor/theus-arsenal/skills/patrones-pytorch/SKILL.md +0 -400
- package/vendor/theus-arsenal/skills/patrones-quarkus/SKILL.md +0 -729
- package/vendor/theus-arsenal/skills/patrones-react/SKILL.md +0 -339
- package/vendor/theus-arsenal/skills/patrones-react-native/SKILL.md +0 -325
- package/vendor/theus-arsenal/skills/patrones-redis/SKILL.md +0 -401
- package/vendor/theus-arsenal/skills/patrones-rust/SKILL.md +0 -504
- package/vendor/theus-arsenal/skills/patrones-springboot/SKILL.md +0 -314
- package/vendor/theus-arsenal/skills/patrones-swiftui/SKILL.md +0 -261
- package/vendor/theus-arsenal/skills/patrones-tinystruct/SKILL.md +0 -281
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/architecture.md +0 -90
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/data-handling.md +0 -60
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/database.md +0 -99
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/routing.md +0 -64
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/system-usage.md +0 -97
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/testing.md +0 -72
- package/vendor/theus-arsenal/skills/patrones-vite/SKILL.md +0 -449
- package/vendor/theus-arsenal/skills/patrones-vue/SKILL.md +0 -469
- package/vendor/theus-arsenal/skills/persistencia-actores-swift/SKILL.md +0 -148
- package/vendor/theus-arsenal/skills/pipeline-opensource/SKILL.md +0 -254
- package/vendor/theus-arsenal/skills/planificacion-demanda-inventario/SKILL.md +0 -236
- package/vendor/theus-arsenal/skills/planificador-trades-prediccion/SKILL.md +0 -60
- package/vendor/theus-arsenal/skills/plano-tecnico/SKILL.md +0 -102
- package/vendor/theus-arsenal/skills/presentaciones-html/SKILL.md +0 -189
- package/vendor/theus-arsenal/skills/presentaciones-html/STYLE_PRESETS.md +0 -330
- package/vendor/theus-arsenal/skills/presentaciones-html/animation-patterns.md +0 -122
- package/vendor/theus-arsenal/skills/presentaciones-html/html-template.md +0 -419
- package/vendor/theus-arsenal/skills/presentaciones-html/scripts/export-pdf.sh +0 -418
- package/vendor/theus-arsenal/skills/presentaciones-html/scripts/extract-pptx.py +0 -96
- package/vendor/theus-arsenal/skills/presentaciones-html/viewport-base.css +0 -153
- package/vendor/theus-arsenal/skills/presupuesto-contexto/SKILL.md +0 -263
- package/vendor/theus-arsenal/skills/procesamiento-documentos-nutrient/SKILL.md +0 -168
- package/vendor/theus-arsenal/skills/programacion-produccion/SKILL.md +0 -220
- package/vendor/theus-arsenal/skills/publicacion-cruzada/SKILL.md +0 -117
- package/vendor/theus-arsenal/skills/publicador-social/SKILL.md +0 -121
- package/vendor/theus-arsenal/skills/puerta-de-entrega/SKILL.md +0 -164
- package/vendor/theus-arsenal/skills/puerta-de-entrega/hooks/puerta-entrega.py +0 -242
- package/vendor/theus-arsenal/skills/pulir-interfaces/SKILL.md +0 -126
- package/vendor/theus-arsenal/skills/qa-navegador/SKILL.md +0 -103
- package/vendor/theus-arsenal/skills/ranking-grafo-social/SKILL.md +0 -153
- package/vendor/theus-arsenal/skills/recuperacion-iterativa/SKILL.md +0 -236
- package/vendor/theus-arsenal/skills/redaccion-articulos/SKILL.md +0 -81
- package/vendor/theus-arsenal/skills/regex-vs-llm/SKILL.md +0 -221
- package/vendor/theus-arsenal/skills/regresion-codigo-ia/SKILL.md +0 -388
- package/vendor/theus-arsenal/skills/rendimiento-react/SKILL.md +0 -567
- package/vendor/theus-arsenal/skills/revision-codigo-flutter-dart/SKILL.md +0 -442
- package/vendor/theus-arsenal/skills/revision-literatura-cientifica/SKILL.md +0 -191
- package/vendor/theus-arsenal/skills/revision-multiperspectiva/SKILL.md +0 -302
- package/vendor/theus-arsenal/skills/revision-riesgo-prediccion/SKILL.md +0 -56
- package/vendor/theus-arsenal/skills/revision-seguridad/SKILL.md +0 -505
- package/vendor/theus-arsenal/skills/revision-seguridad/cloud-infrastructure-security.md +0 -361
- package/vendor/theus-arsenal/skills/runtime-bun/SKILL.md +0 -83
- package/vendor/theus-arsenal/skills/salud-codigo-codescene/SKILL.md +0 -163
- package/vendor/theus-arsenal/skills/salud-interfaces-red/SKILL.md +0 -143
- package/vendor/theus-arsenal/skills/seguimiento-costos/SKILL.md +0 -122
- package/vendor/theus-arsenal/skills/seguridad-agentes-trading/SKILL.md +0 -145
- package/vendor/theus-arsenal/skills/seguridad-amm-defi/SKILL.md +0 -166
- package/vendor/theus-arsenal/skills/seguridad-django/SKILL.md +0 -648
- package/vendor/theus-arsenal/skills/seguridad-laravel/SKILL.md +0 -945
- package/vendor/theus-arsenal/skills/seguridad-perl/SKILL.md +0 -507
- package/vendor/theus-arsenal/skills/seguridad-quarkus/SKILL.md +0 -474
- package/vendor/theus-arsenal/skills/seguridad-springboot/SKILL.md +0 -279
- package/vendor/theus-arsenal/skills/seo/SKILL.md +0 -166
- package/vendor/theus-arsenal/skills/sistema-diseno/SKILL.md +0 -81
- package/vendor/theus-arsenal/skills/sistema-operativo-agentico/SKILL.md +0 -375
- package/vendor/theus-arsenal/skills/sistemas-latencia-critica/SKILL.md +0 -65
- package/vendor/theus-arsenal/skills/tdd-django/SKILL.md +0 -735
- package/vendor/theus-arsenal/skills/tdd-laravel/SKILL.md +0 -673
- package/vendor/theus-arsenal/skills/tdd-quarkus/SKILL.md +0 -817
- package/vendor/theus-arsenal/skills/tdd-springboot/SKILL.md +0 -165
- package/vendor/theus-arsenal/skills/testing-cpp/SKILL.md +0 -328
- package/vendor/theus-arsenal/skills/testing-csharp/SKILL.md +0 -321
- package/vendor/theus-arsenal/skills/testing-e2e/SKILL.md +0 -325
- package/vendor/theus-arsenal/skills/testing-go/SKILL.md +0 -719
- package/vendor/theus-arsenal/skills/testing-kotlin/SKILL.md +0 -829
- package/vendor/theus-arsenal/skills/testing-perl/SKILL.md +0 -479
- package/vendor/theus-arsenal/skills/testing-protocolos-di-swift/SKILL.md +0 -196
- package/vendor/theus-arsenal/skills/testing-python/SKILL.md +0 -815
- package/vendor/theus-arsenal/skills/testing-react/SKILL.md +0 -421
- package/vendor/theus-arsenal/skills/testing-rust/SKILL.md +0 -506
- package/vendor/theus-arsenal/skills/tours-de-codigo/SKILL.md +0 -252
- package/vendor/theus-arsenal/skills/traduccion-documentos-visado/SKILL.md +0 -121
- package/vendor/theus-arsenal/skills/ui-a-vue/SKILL.md +0 -141
- package/vendor/theus-arsenal/skills/validacion-config-red/SKILL.md +0 -211
- package/vendor/theus-arsenal/skills/verificacion-django/SKILL.md +0 -470
- package/vendor/theus-arsenal/skills/verificacion-factual/SKILL.md +0 -142
- package/vendor/theus-arsenal/skills/verificacion-laravel/SKILL.md +0 -184
- package/vendor/theus-arsenal/skills/verificacion-quarkus/SKILL.md +0 -485
- package/vendor/theus-arsenal/skills/verificacion-springboot/SKILL.md +0 -237
- package/vendor/theus-arsenal/skills/videodb/SKILL.md +0 -374
- package/vendor/theus-arsenal/skills/videodb/reference/api-reference.md +0 -550
- package/vendor/theus-arsenal/skills/videodb/reference/capture-reference.md +0 -407
- package/vendor/theus-arsenal/skills/videodb/reference/capture.md +0 -101
- package/vendor/theus-arsenal/skills/videodb/reference/editor.md +0 -443
- package/vendor/theus-arsenal/skills/videodb/reference/generative.md +0 -331
- package/vendor/theus-arsenal/skills/videodb/reference/rtstream-reference.md +0 -564
- package/vendor/theus-arsenal/skills/videodb/reference/rtstream.md +0 -65
- package/vendor/theus-arsenal/skills/videodb/reference/search.md +0 -230
- package/vendor/theus-arsenal/skills/videodb/reference/streaming.md +0 -406
- package/vendor/theus-arsenal/skills/videodb/reference/use-cases.md +0 -118
- package/vendor/theus-arsenal/skills/videodb/scripts/ws_listener.py +0 -279
- package/vendor/theus-arsenal/skills/videos-manim/SKILL.md +0 -91
- package/vendor/theus-arsenal/skills/videos-manim/assets/network_graph_scene.py +0 -52
- package/vendor/theus-arsenal/skills/vigilancia-canary/SKILL.md +0 -108
- package/vendor/theus-arsenal/skills/voz-de-marca/SKILL.md +0 -106
|
@@ -1,829 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: testing-kotlin
|
|
3
|
-
description: Patrones de testing en Kotlin con Kotest, MockK, testing de corrutinas, testing basado en propiedades y cobertura con Kover, siguiendo la metodología TDD.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Patrones de testing en Kotlin
|
|
7
|
-
|
|
8
|
-
Patrones completos de testing en Kotlin para escribir pruebas fiables y mantenibles siguiendo la metodología TDD con Kotest y MockK.
|
|
9
|
-
|
|
10
|
-
## Cuándo usarla
|
|
11
|
-
|
|
12
|
-
- Al escribir nuevas funciones o clases en Kotlin
|
|
13
|
-
- Al añadir cobertura de pruebas a código Kotlin existente
|
|
14
|
-
- Al implementar pruebas basadas en propiedades
|
|
15
|
-
- Al seguir el flujo TDD en proyectos Kotlin
|
|
16
|
-
- Al configurar Kover para cobertura de código
|
|
17
|
-
|
|
18
|
-
## Cómo funciona
|
|
19
|
-
|
|
20
|
-
1. **Identifica el código objetivo** — encuentra la función, clase o módulo a probar
|
|
21
|
-
2. **Escribe una spec de Kotest** — elige un estilo de spec (StringSpec, FunSpec, BehaviorSpec) acorde al alcance de la prueba
|
|
22
|
-
3. **Mockea las dependencias** — usa MockK para aislar la unidad bajo prueba
|
|
23
|
-
4. **Ejecuta las pruebas (ROJO)** — verifica que la prueba falla con el error esperado
|
|
24
|
-
5. **Implementa el código (VERDE)** — escribe el código mínimo para pasar la prueba
|
|
25
|
-
6. **Refactoriza** — mejora la implementación manteniendo las pruebas en verde
|
|
26
|
-
7. **Comprueba la cobertura** — ejecuta `./gradlew koverHtmlReport` y verifica una cobertura de 80 % o más
|
|
27
|
-
|
|
28
|
-
## Ejemplos
|
|
29
|
-
|
|
30
|
-
Las siguientes secciones contienen ejemplos detallados y ejecutables de cada patrón de testing:
|
|
31
|
-
|
|
32
|
-
### Referencia rápida
|
|
33
|
-
|
|
34
|
-
- **Specs de Kotest** — ejemplos de StringSpec, FunSpec, BehaviorSpec, DescribeSpec en [Estilos de spec de Kotest](#estilos-de-spec-de-kotest)
|
|
35
|
-
- **Mocking** — configuración de MockK, mocking de corrutinas, captura de argumentos en [MockK](#mockk)
|
|
36
|
-
- **Recorrido TDD** — ciclo ROJO/VERDE/REFACTOR completo con EmailValidator en [Flujo TDD para Kotlin](#flujo-tdd-para-kotlin)
|
|
37
|
-
- **Cobertura** — configuración y comandos de Kover en [Cobertura con Kover](#cobertura-con-kover)
|
|
38
|
-
- **Testing de Ktor** — configuración de testApplication en [Testing con testApplication de Ktor](#testing-con-testapplication-de-ktor)
|
|
39
|
-
|
|
40
|
-
### Flujo TDD para Kotlin
|
|
41
|
-
|
|
42
|
-
#### El ciclo ROJO-VERDE-REFACTOR
|
|
43
|
-
|
|
44
|
-
```
|
|
45
|
-
ROJO -> Escribe primero una prueba que falle
|
|
46
|
-
VERDE -> Escribe el código mínimo para pasar la prueba
|
|
47
|
-
REFACTOR -> Mejora el código manteniendo las pruebas en verde
|
|
48
|
-
REPITE -> Continúa con el siguiente requisito
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
#### TDD paso a paso en Kotlin
|
|
52
|
-
|
|
53
|
-
```kotlin
|
|
54
|
-
// Paso 1: define la interfaz/firma
|
|
55
|
-
// EmailValidator.kt
|
|
56
|
-
package com.example.validator
|
|
57
|
-
|
|
58
|
-
fun validateEmail(email: String): Result<String> {
|
|
59
|
-
TODO("sin implementar")
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Paso 2: escribe la prueba que falla (ROJO)
|
|
63
|
-
// EmailValidatorTest.kt
|
|
64
|
-
package com.example.validator
|
|
65
|
-
|
|
66
|
-
import io.kotest.core.spec.style.StringSpec
|
|
67
|
-
import io.kotest.matchers.result.shouldBeFailure
|
|
68
|
-
import io.kotest.matchers.result.shouldBeSuccess
|
|
69
|
-
|
|
70
|
-
class EmailValidatorTest : StringSpec({
|
|
71
|
-
"un email válido devuelve success" {
|
|
72
|
-
validateEmail("user@example.com").shouldBeSuccess("user@example.com")
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
"un email vacío devuelve failure" {
|
|
76
|
-
validateEmail("").shouldBeFailure()
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
"un email sin @ devuelve failure" {
|
|
80
|
-
validateEmail("userexample.com").shouldBeFailure()
|
|
81
|
-
}
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
// Paso 3: ejecuta las pruebas - verifica que FALLAN
|
|
85
|
-
// $ ./gradlew test
|
|
86
|
-
// EmailValidatorTest > un email válido devuelve success FAILED
|
|
87
|
-
// kotlin.NotImplementedError: An operation is not implemented
|
|
88
|
-
|
|
89
|
-
// Paso 4: implementa el código mínimo (VERDE)
|
|
90
|
-
fun validateEmail(email: String): Result<String> {
|
|
91
|
-
if (email.isBlank()) return Result.failure(IllegalArgumentException("El email no puede estar en blanco"))
|
|
92
|
-
if ('@' !in email) return Result.failure(IllegalArgumentException("El email debe contener @"))
|
|
93
|
-
val regex = Regex("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$")
|
|
94
|
-
if (!regex.matches(email)) return Result.failure(IllegalArgumentException("Formato de email inválido"))
|
|
95
|
-
return Result.success(email)
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// Paso 5: ejecuta las pruebas - verifica que PASAN
|
|
99
|
-
// $ ./gradlew test
|
|
100
|
-
// EmailValidatorTest > un email válido devuelve success PASSED
|
|
101
|
-
// EmailValidatorTest > un email vacío devuelve failure PASSED
|
|
102
|
-
// EmailValidatorTest > un email sin @ devuelve failure PASSED
|
|
103
|
-
|
|
104
|
-
// Paso 6: refactoriza si hace falta y verifica que las pruebas siguen pasando
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### Estilos de spec de Kotest
|
|
108
|
-
|
|
109
|
-
#### StringSpec (el más simple)
|
|
110
|
-
|
|
111
|
-
```kotlin
|
|
112
|
-
class CalculatorTest : StringSpec({
|
|
113
|
-
"suma dos números positivos" {
|
|
114
|
-
Calculator.add(2, 3) shouldBe 5
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
"suma números negativos" {
|
|
118
|
-
Calculator.add(-1, -2) shouldBe -3
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
"suma cero" {
|
|
122
|
-
Calculator.add(0, 5) shouldBe 5
|
|
123
|
-
}
|
|
124
|
-
})
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
#### FunSpec (estilo JUnit)
|
|
128
|
-
|
|
129
|
-
```kotlin
|
|
130
|
-
class UserServiceTest : FunSpec({
|
|
131
|
-
val repository = mockk<UserRepository>()
|
|
132
|
-
val service = UserService(repository)
|
|
133
|
-
|
|
134
|
-
test("getUser devuelve el usuario cuando existe") {
|
|
135
|
-
val expected = User(id = "1", name = "Alice")
|
|
136
|
-
coEvery { repository.findById("1") } returns expected
|
|
137
|
-
|
|
138
|
-
val result = service.getUser("1")
|
|
139
|
-
|
|
140
|
-
result shouldBe expected
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
test("getUser lanza excepción cuando no existe") {
|
|
144
|
-
coEvery { repository.findById("999") } returns null
|
|
145
|
-
|
|
146
|
-
shouldThrow<UserNotFoundException> {
|
|
147
|
-
service.getUser("999")
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
})
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
#### BehaviorSpec (estilo BDD)
|
|
154
|
-
|
|
155
|
-
```kotlin
|
|
156
|
-
class OrderServiceTest : BehaviorSpec({
|
|
157
|
-
val repository = mockk<OrderRepository>()
|
|
158
|
-
val paymentService = mockk<PaymentService>()
|
|
159
|
-
val service = OrderService(repository, paymentService)
|
|
160
|
-
|
|
161
|
-
Given("una solicitud de pedido válida") {
|
|
162
|
-
val request = CreateOrderRequest(
|
|
163
|
-
userId = "user-1",
|
|
164
|
-
items = listOf(OrderItem("product-1", quantity = 2)),
|
|
165
|
-
)
|
|
166
|
-
|
|
167
|
-
When("se realiza el pedido") {
|
|
168
|
-
coEvery { paymentService.charge(any()) } returns PaymentResult.Success
|
|
169
|
-
coEvery { repository.save(any()) } answers { firstArg() }
|
|
170
|
-
|
|
171
|
-
val result = service.placeOrder(request)
|
|
172
|
-
|
|
173
|
-
Then("debe devolver un pedido confirmado") {
|
|
174
|
-
result.status shouldBe OrderStatus.CONFIRMED
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
Then("debe cobrar el pago") {
|
|
178
|
-
coVerify(exactly = 1) { paymentService.charge(any()) }
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
When("el pago falla") {
|
|
183
|
-
coEvery { paymentService.charge(any()) } returns PaymentResult.Declined
|
|
184
|
-
|
|
185
|
-
Then("debe lanzar PaymentException") {
|
|
186
|
-
shouldThrow<PaymentException> {
|
|
187
|
-
service.placeOrder(request)
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
})
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
#### DescribeSpec (estilo RSpec)
|
|
196
|
-
|
|
197
|
-
```kotlin
|
|
198
|
-
class UserValidatorTest : DescribeSpec({
|
|
199
|
-
describe("validateUser") {
|
|
200
|
-
val validator = UserValidator()
|
|
201
|
-
|
|
202
|
-
context("con entrada válida") {
|
|
203
|
-
it("acepta un usuario normal") {
|
|
204
|
-
val user = CreateUserRequest("Alice", "alice@example.com")
|
|
205
|
-
validator.validate(user).shouldBeValid()
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
context("con nombre inválido") {
|
|
210
|
-
it("rechaza un nombre en blanco") {
|
|
211
|
-
val user = CreateUserRequest("", "alice@example.com")
|
|
212
|
-
validator.validate(user).shouldBeInvalid()
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
it("rechaza un nombre que excede la longitud máxima") {
|
|
216
|
-
val user = CreateUserRequest("A".repeat(256), "alice@example.com")
|
|
217
|
-
validator.validate(user).shouldBeInvalid()
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
})
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
### Matchers de Kotest
|
|
225
|
-
|
|
226
|
-
#### Matchers básicos
|
|
227
|
-
|
|
228
|
-
```kotlin
|
|
229
|
-
import io.kotest.matchers.shouldBe
|
|
230
|
-
import io.kotest.matchers.shouldNotBe
|
|
231
|
-
import io.kotest.matchers.string.*
|
|
232
|
-
import io.kotest.matchers.collections.*
|
|
233
|
-
import io.kotest.matchers.nulls.*
|
|
234
|
-
|
|
235
|
-
// Igualdad
|
|
236
|
-
result shouldBe expected
|
|
237
|
-
result shouldNotBe unexpected
|
|
238
|
-
|
|
239
|
-
// Strings
|
|
240
|
-
name shouldStartWith "Al"
|
|
241
|
-
name shouldEndWith "ice"
|
|
242
|
-
name shouldContain "lic"
|
|
243
|
-
name shouldMatch Regex("[A-Z][a-z]+")
|
|
244
|
-
name.shouldBeBlank()
|
|
245
|
-
|
|
246
|
-
// Colecciones
|
|
247
|
-
list shouldContain "item"
|
|
248
|
-
list shouldHaveSize 3
|
|
249
|
-
list.shouldBeSorted()
|
|
250
|
-
list.shouldContainAll("a", "b", "c")
|
|
251
|
-
list.shouldBeEmpty()
|
|
252
|
-
|
|
253
|
-
// Nulls
|
|
254
|
-
result.shouldNotBeNull()
|
|
255
|
-
result.shouldBeNull()
|
|
256
|
-
|
|
257
|
-
// Tipos
|
|
258
|
-
result.shouldBeInstanceOf<User>()
|
|
259
|
-
|
|
260
|
-
// Números
|
|
261
|
-
count shouldBeGreaterThan 0
|
|
262
|
-
price shouldBeInRange 1.0..100.0
|
|
263
|
-
|
|
264
|
-
// Excepciones
|
|
265
|
-
shouldThrow<IllegalArgumentException> {
|
|
266
|
-
validateAge(-1)
|
|
267
|
-
}.message shouldBe "La edad debe ser positiva"
|
|
268
|
-
|
|
269
|
-
shouldNotThrow<Exception> {
|
|
270
|
-
validateAge(25)
|
|
271
|
-
}
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
#### Matchers personalizados
|
|
275
|
-
|
|
276
|
-
```kotlin
|
|
277
|
-
fun beActiveUser() = object : Matcher<User> {
|
|
278
|
-
override fun test(value: User) = MatcherResult(
|
|
279
|
-
value.isActive && value.lastLogin != null,
|
|
280
|
-
{ "El usuario ${value.id} debería estar activo con un último login" },
|
|
281
|
-
{ "El usuario ${value.id} no debería estar activo" },
|
|
282
|
-
)
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// Uso
|
|
286
|
-
user should beActiveUser()
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
### MockK
|
|
290
|
-
|
|
291
|
-
#### Mocking básico
|
|
292
|
-
|
|
293
|
-
```kotlin
|
|
294
|
-
class UserServiceTest : FunSpec({
|
|
295
|
-
val repository = mockk<UserRepository>()
|
|
296
|
-
val logger = mockk<Logger>(relaxed = true) // Relaxed: devuelve valores por defecto
|
|
297
|
-
val service = UserService(repository, logger)
|
|
298
|
-
|
|
299
|
-
beforeTest {
|
|
300
|
-
clearMocks(repository, logger)
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
test("findUser delega en el repositorio") {
|
|
304
|
-
val expected = User(id = "1", name = "Alice")
|
|
305
|
-
every { repository.findById("1") } returns expected
|
|
306
|
-
|
|
307
|
-
val result = service.findUser("1")
|
|
308
|
-
|
|
309
|
-
result shouldBe expected
|
|
310
|
-
verify(exactly = 1) { repository.findById("1") }
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
test("findUser devuelve null para un id desconocido") {
|
|
314
|
-
every { repository.findById(any()) } returns null
|
|
315
|
-
|
|
316
|
-
val result = service.findUser("desconocido")
|
|
317
|
-
|
|
318
|
-
result.shouldBeNull()
|
|
319
|
-
}
|
|
320
|
-
})
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
#### Mocking de corrutinas
|
|
324
|
-
|
|
325
|
-
```kotlin
|
|
326
|
-
class AsyncUserServiceTest : FunSpec({
|
|
327
|
-
val repository = mockk<UserRepository>()
|
|
328
|
-
val service = UserService(repository)
|
|
329
|
-
|
|
330
|
-
test("getUser como función suspendida") {
|
|
331
|
-
coEvery { repository.findById("1") } returns User(id = "1", name = "Alice")
|
|
332
|
-
|
|
333
|
-
val result = service.getUser("1")
|
|
334
|
-
|
|
335
|
-
result.name shouldBe "Alice"
|
|
336
|
-
coVerify { repository.findById("1") }
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
test("getUser con retardo") {
|
|
340
|
-
coEvery { repository.findById("1") } coAnswers {
|
|
341
|
-
delay(100) // Simula trabajo asíncrono
|
|
342
|
-
User(id = "1", name = "Alice")
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
val result = service.getUser("1")
|
|
346
|
-
result.name shouldBe "Alice"
|
|
347
|
-
}
|
|
348
|
-
})
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
#### Captura de argumentos
|
|
352
|
-
|
|
353
|
-
```kotlin
|
|
354
|
-
test("save captura el argumento user") {
|
|
355
|
-
val slot = slot<User>()
|
|
356
|
-
coEvery { repository.save(capture(slot)) } returns Unit
|
|
357
|
-
|
|
358
|
-
service.createUser(CreateUserRequest("Alice", "alice@example.com"))
|
|
359
|
-
|
|
360
|
-
slot.captured.name shouldBe "Alice"
|
|
361
|
-
slot.captured.email shouldBe "alice@example.com"
|
|
362
|
-
slot.captured.id.shouldNotBeNull()
|
|
363
|
-
}
|
|
364
|
-
```
|
|
365
|
-
|
|
366
|
-
#### Spy y mocking parcial
|
|
367
|
-
|
|
368
|
-
```kotlin
|
|
369
|
-
test("spy sobre un objeto real") {
|
|
370
|
-
val realService = UserService(repository)
|
|
371
|
-
val spy = spyk(realService)
|
|
372
|
-
|
|
373
|
-
every { spy.generateId() } returns "id-fijo"
|
|
374
|
-
|
|
375
|
-
spy.createUser(request)
|
|
376
|
-
|
|
377
|
-
verify { spy.generateId() } // Sobrescrito
|
|
378
|
-
// El resto de métodos usa la implementación real
|
|
379
|
-
}
|
|
380
|
-
```
|
|
381
|
-
|
|
382
|
-
### Testing de corrutinas
|
|
383
|
-
|
|
384
|
-
#### runTest para funciones suspendidas
|
|
385
|
-
|
|
386
|
-
```kotlin
|
|
387
|
-
import kotlinx.coroutines.test.runTest
|
|
388
|
-
|
|
389
|
-
class CoroutineServiceTest : FunSpec({
|
|
390
|
-
test("las descargas concurrentes terminan juntas") {
|
|
391
|
-
runTest {
|
|
392
|
-
val service = DataService(testScope = this)
|
|
393
|
-
|
|
394
|
-
val result = service.fetchAllData()
|
|
395
|
-
|
|
396
|
-
result.users.shouldNotBeEmpty()
|
|
397
|
-
result.products.shouldNotBeEmpty()
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
test("timeout tras el retardo") {
|
|
402
|
-
runTest {
|
|
403
|
-
val service = SlowService()
|
|
404
|
-
|
|
405
|
-
shouldThrow<TimeoutCancellationException> {
|
|
406
|
-
withTimeout(100) {
|
|
407
|
-
service.slowOperation() // Tarda > 100 ms
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
})
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
#### Testing de Flows
|
|
416
|
-
|
|
417
|
-
```kotlin
|
|
418
|
-
import io.kotest.matchers.collections.shouldContainInOrder
|
|
419
|
-
import kotlinx.coroutines.flow.MutableSharedFlow
|
|
420
|
-
import kotlinx.coroutines.flow.toList
|
|
421
|
-
import kotlinx.coroutines.launch
|
|
422
|
-
import kotlinx.coroutines.test.advanceTimeBy
|
|
423
|
-
import kotlinx.coroutines.test.runTest
|
|
424
|
-
|
|
425
|
-
class FlowServiceTest : FunSpec({
|
|
426
|
-
test("observeUsers emite actualizaciones") {
|
|
427
|
-
runTest {
|
|
428
|
-
val service = UserFlowService()
|
|
429
|
-
|
|
430
|
-
val emissions = service.observeUsers()
|
|
431
|
-
.take(3)
|
|
432
|
-
.toList()
|
|
433
|
-
|
|
434
|
-
emissions shouldHaveSize 3
|
|
435
|
-
emissions.last().shouldNotBeEmpty()
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
test("searchUsers aplica debounce a la entrada") {
|
|
440
|
-
runTest {
|
|
441
|
-
val service = SearchService()
|
|
442
|
-
val queries = MutableSharedFlow<String>()
|
|
443
|
-
|
|
444
|
-
val results = mutableListOf<List<User>>()
|
|
445
|
-
val job = launch {
|
|
446
|
-
service.searchUsers(queries).collect { results.add(it) }
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
queries.emit("a")
|
|
450
|
-
queries.emit("ab")
|
|
451
|
-
queries.emit("abc") // Solo esta debería disparar la búsqueda
|
|
452
|
-
advanceTimeBy(500)
|
|
453
|
-
|
|
454
|
-
results shouldHaveSize 1
|
|
455
|
-
job.cancel()
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
})
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
#### TestDispatcher
|
|
462
|
-
|
|
463
|
-
```kotlin
|
|
464
|
-
import kotlinx.coroutines.test.StandardTestDispatcher
|
|
465
|
-
import kotlinx.coroutines.test.advanceUntilIdle
|
|
466
|
-
|
|
467
|
-
class DispatcherTest : FunSpec({
|
|
468
|
-
test("usa un test dispatcher para ejecución controlada") {
|
|
469
|
-
val dispatcher = StandardTestDispatcher()
|
|
470
|
-
|
|
471
|
-
runTest(dispatcher) {
|
|
472
|
-
var completed = false
|
|
473
|
-
|
|
474
|
-
launch {
|
|
475
|
-
delay(1000)
|
|
476
|
-
completed = true
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
completed shouldBe false
|
|
480
|
-
advanceTimeBy(1000)
|
|
481
|
-
completed shouldBe true
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
})
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
### Testing basado en propiedades
|
|
488
|
-
|
|
489
|
-
#### Property testing con Kotest
|
|
490
|
-
|
|
491
|
-
```kotlin
|
|
492
|
-
import io.kotest.core.spec.style.FunSpec
|
|
493
|
-
import io.kotest.property.Arb
|
|
494
|
-
import io.kotest.property.arbitrary.*
|
|
495
|
-
import io.kotest.property.forAll
|
|
496
|
-
import io.kotest.property.checkAll
|
|
497
|
-
import kotlinx.serialization.json.Json
|
|
498
|
-
import kotlinx.serialization.encodeToString
|
|
499
|
-
import kotlinx.serialization.decodeFromString
|
|
500
|
-
|
|
501
|
-
// Nota: la prueba de ida y vuelta de serialización de abajo requiere que la data class User
|
|
502
|
-
// esté anotada con @Serializable (de kotlinx.serialization).
|
|
503
|
-
|
|
504
|
-
class PropertyTest : FunSpec({
|
|
505
|
-
test("invertir un string es involutivo") {
|
|
506
|
-
forAll<String> { s ->
|
|
507
|
-
s.reversed().reversed() == s
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
test("ordenar una lista es idempotente") {
|
|
512
|
-
forAll(Arb.list(Arb.int())) { list ->
|
|
513
|
-
list.sorted() == list.sorted().sorted()
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
test("la ida y vuelta de serialización preserva los datos") {
|
|
518
|
-
checkAll(Arb.bind(Arb.string(1..50), Arb.string(5..100)) { name, email ->
|
|
519
|
-
User(name = name, email = "$email@test.com")
|
|
520
|
-
}) { user ->
|
|
521
|
-
val json = Json.encodeToString(user)
|
|
522
|
-
val decoded = Json.decodeFromString<User>(json)
|
|
523
|
-
decoded shouldBe user
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
})
|
|
527
|
-
```
|
|
528
|
-
|
|
529
|
-
#### Generadores personalizados
|
|
530
|
-
|
|
531
|
-
```kotlin
|
|
532
|
-
val userArb: Arb<User> = Arb.bind(
|
|
533
|
-
Arb.string(minSize = 1, maxSize = 50),
|
|
534
|
-
Arb.email(),
|
|
535
|
-
Arb.enum<Role>(),
|
|
536
|
-
) { name, email, role ->
|
|
537
|
-
User(
|
|
538
|
-
id = UserId(UUID.randomUUID().toString()),
|
|
539
|
-
name = name,
|
|
540
|
-
email = Email(email),
|
|
541
|
-
role = role,
|
|
542
|
-
)
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
val moneyArb: Arb<Money> = Arb.bind(
|
|
546
|
-
Arb.long(1L..1_000_000L),
|
|
547
|
-
Arb.enum<Currency>(),
|
|
548
|
-
) { amount, currency ->
|
|
549
|
-
Money(amount, currency)
|
|
550
|
-
}
|
|
551
|
-
```
|
|
552
|
-
|
|
553
|
-
### Testing dirigido por datos
|
|
554
|
-
|
|
555
|
-
#### withData en Kotest
|
|
556
|
-
|
|
557
|
-
```kotlin
|
|
558
|
-
class ParserTest : FunSpec({
|
|
559
|
-
context("parseo de fechas válidas") {
|
|
560
|
-
withData(
|
|
561
|
-
"2026-01-15" to LocalDate(2026, 1, 15),
|
|
562
|
-
"2026-12-31" to LocalDate(2026, 12, 31),
|
|
563
|
-
"2000-01-01" to LocalDate(2000, 1, 1),
|
|
564
|
-
) { (input, expected) ->
|
|
565
|
-
parseDate(input) shouldBe expected
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
context("rechazo de fechas inválidas") {
|
|
570
|
-
withData(
|
|
571
|
-
nameFn = { "rechaza '$it'" },
|
|
572
|
-
"no-es-fecha",
|
|
573
|
-
"2026-13-01",
|
|
574
|
-
"2026-00-15",
|
|
575
|
-
"",
|
|
576
|
-
) { input ->
|
|
577
|
-
shouldThrow<DateParseException> {
|
|
578
|
-
parseDate(input)
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
})
|
|
583
|
-
```
|
|
584
|
-
|
|
585
|
-
### Ciclo de vida de las pruebas y fixtures
|
|
586
|
-
|
|
587
|
-
#### BeforeTest / AfterTest
|
|
588
|
-
|
|
589
|
-
```kotlin
|
|
590
|
-
class DatabaseTest : FunSpec({
|
|
591
|
-
lateinit var db: Database
|
|
592
|
-
|
|
593
|
-
beforeSpec {
|
|
594
|
-
db = Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1")
|
|
595
|
-
transaction(db) {
|
|
596
|
-
SchemaUtils.create(UsersTable)
|
|
597
|
-
}
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
afterSpec {
|
|
601
|
-
transaction(db) {
|
|
602
|
-
SchemaUtils.drop(UsersTable)
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
beforeTest {
|
|
607
|
-
transaction(db) {
|
|
608
|
-
UsersTable.deleteAll()
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
test("insertar y recuperar un usuario") {
|
|
613
|
-
transaction(db) {
|
|
614
|
-
UsersTable.insert {
|
|
615
|
-
it[name] = "Alice"
|
|
616
|
-
it[email] = "alice@example.com"
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
val users = transaction(db) {
|
|
621
|
-
UsersTable.selectAll().map { it[UsersTable.name] }
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
users shouldContain "Alice"
|
|
625
|
-
}
|
|
626
|
-
})
|
|
627
|
-
```
|
|
628
|
-
|
|
629
|
-
#### Extensiones de Kotest
|
|
630
|
-
|
|
631
|
-
```kotlin
|
|
632
|
-
// Extensión de prueba reutilizable
|
|
633
|
-
class DatabaseExtension : BeforeSpecListener, AfterSpecListener {
|
|
634
|
-
lateinit var db: Database
|
|
635
|
-
|
|
636
|
-
override suspend fun beforeSpec(spec: Spec) {
|
|
637
|
-
db = Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1")
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
override suspend fun afterSpec(spec: Spec) {
|
|
641
|
-
// limpieza
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
class UserRepositoryTest : FunSpec({
|
|
646
|
-
val dbExt = DatabaseExtension()
|
|
647
|
-
register(dbExt)
|
|
648
|
-
|
|
649
|
-
test("guardar y encontrar un usuario") {
|
|
650
|
-
val repo = UserRepository(dbExt.db)
|
|
651
|
-
// ...
|
|
652
|
-
}
|
|
653
|
-
})
|
|
654
|
-
```
|
|
655
|
-
|
|
656
|
-
### Cobertura con Kover
|
|
657
|
-
|
|
658
|
-
#### Configuración de Gradle
|
|
659
|
-
|
|
660
|
-
```kotlin
|
|
661
|
-
// build.gradle.kts
|
|
662
|
-
plugins {
|
|
663
|
-
id("org.jetbrains.kotlinx.kover") version "0.9.7"
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
kover {
|
|
667
|
-
reports {
|
|
668
|
-
total {
|
|
669
|
-
html { onCheck = true }
|
|
670
|
-
xml { onCheck = true }
|
|
671
|
-
}
|
|
672
|
-
filters {
|
|
673
|
-
excludes {
|
|
674
|
-
classes("*.generated.*", "*.config.*")
|
|
675
|
-
}
|
|
676
|
-
}
|
|
677
|
-
verify {
|
|
678
|
-
rule {
|
|
679
|
-
minBound(80) // Falla el build por debajo del 80 % de cobertura
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
```
|
|
685
|
-
|
|
686
|
-
#### Comandos de cobertura
|
|
687
|
-
|
|
688
|
-
```bash
|
|
689
|
-
# Ejecutar pruebas con cobertura
|
|
690
|
-
./gradlew koverHtmlReport
|
|
691
|
-
|
|
692
|
-
# Verificar umbrales de cobertura
|
|
693
|
-
./gradlew koverVerify
|
|
694
|
-
|
|
695
|
-
# Informe XML para CI
|
|
696
|
-
./gradlew koverXmlReport
|
|
697
|
-
|
|
698
|
-
# Ver el informe HTML (usa el comando de tu sistema)
|
|
699
|
-
# macOS: open build/reports/kover/html/index.html
|
|
700
|
-
# Linux: xdg-open build/reports/kover/html/index.html
|
|
701
|
-
# Windows: start build/reports/kover/html/index.html
|
|
702
|
-
```
|
|
703
|
-
|
|
704
|
-
#### Objetivos de cobertura
|
|
705
|
-
|
|
706
|
-
| Tipo de código | Objetivo |
|
|
707
|
-
|-----------|--------|
|
|
708
|
-
| Lógica de negocio crítica | 100 % |
|
|
709
|
-
| APIs públicas | 90 %+ |
|
|
710
|
-
| Código general | 80 %+ |
|
|
711
|
-
| Código generado / de configuración | Excluir |
|
|
712
|
-
|
|
713
|
-
### Testing con testApplication de Ktor
|
|
714
|
-
|
|
715
|
-
```kotlin
|
|
716
|
-
class ApiRoutesTest : FunSpec({
|
|
717
|
-
test("GET /users devuelve la lista") {
|
|
718
|
-
testApplication {
|
|
719
|
-
application {
|
|
720
|
-
configureRouting()
|
|
721
|
-
configureSerialization()
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
val response = client.get("/users")
|
|
725
|
-
|
|
726
|
-
response.status shouldBe HttpStatusCode.OK
|
|
727
|
-
val users = response.body<List<UserResponse>>()
|
|
728
|
-
users.shouldNotBeEmpty()
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
test("POST /users crea un usuario") {
|
|
733
|
-
testApplication {
|
|
734
|
-
application {
|
|
735
|
-
configureRouting()
|
|
736
|
-
configureSerialization()
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
val response = client.post("/users") {
|
|
740
|
-
contentType(ContentType.Application.Json)
|
|
741
|
-
setBody(CreateUserRequest("Alice", "alice@example.com"))
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
response.status shouldBe HttpStatusCode.Created
|
|
745
|
-
}
|
|
746
|
-
}
|
|
747
|
-
})
|
|
748
|
-
```
|
|
749
|
-
|
|
750
|
-
### Comandos de testing
|
|
751
|
-
|
|
752
|
-
```bash
|
|
753
|
-
# Ejecutar todas las pruebas
|
|
754
|
-
./gradlew test
|
|
755
|
-
|
|
756
|
-
# Ejecutar una clase de prueba concreta
|
|
757
|
-
./gradlew test --tests "com.example.UserServiceTest"
|
|
758
|
-
|
|
759
|
-
# Ejecutar una prueba concreta
|
|
760
|
-
./gradlew test --tests "com.example.UserServiceTest.getUser devuelve el usuario cuando existe"
|
|
761
|
-
|
|
762
|
-
# Ejecutar con salida detallada
|
|
763
|
-
./gradlew test --info
|
|
764
|
-
|
|
765
|
-
# Ejecutar con cobertura
|
|
766
|
-
./gradlew koverHtmlReport
|
|
767
|
-
|
|
768
|
-
# Ejecutar detekt (análisis estático)
|
|
769
|
-
./gradlew detekt
|
|
770
|
-
|
|
771
|
-
# Ejecutar ktlint (comprobación de formato)
|
|
772
|
-
./gradlew ktlintCheck
|
|
773
|
-
|
|
774
|
-
# Testing continuo
|
|
775
|
-
./gradlew test --continuous
|
|
776
|
-
```
|
|
777
|
-
|
|
778
|
-
### Buenas prácticas
|
|
779
|
-
|
|
780
|
-
**SÍ:**
|
|
781
|
-
- Escribe las pruebas PRIMERO (TDD)
|
|
782
|
-
- Usa los estilos de spec de Kotest de forma consistente en todo el proyecto
|
|
783
|
-
- Usa `coEvery`/`coVerify` de MockK para funciones suspendidas
|
|
784
|
-
- Usa `runTest` para el testing de corrutinas
|
|
785
|
-
- Prueba el comportamiento, no la implementación
|
|
786
|
-
- Usa testing basado en propiedades para funciones puras
|
|
787
|
-
- Usa fixtures de prueba con `data class` para mayor claridad
|
|
788
|
-
|
|
789
|
-
**NO:**
|
|
790
|
-
- No mezcles frameworks de testing (elige Kotest y mantente en él)
|
|
791
|
-
- No mockees data classes (usa instancias reales)
|
|
792
|
-
- No uses `Thread.sleep()` en pruebas de corrutinas (usa `advanceTimeBy`)
|
|
793
|
-
- No te saltes la fase ROJA del TDD
|
|
794
|
-
- No pruebes funciones privadas directamente
|
|
795
|
-
- No ignores las pruebas inestables (flaky)
|
|
796
|
-
|
|
797
|
-
### Integración con CI/CD
|
|
798
|
-
|
|
799
|
-
```yaml
|
|
800
|
-
# Ejemplo con GitHub Actions
|
|
801
|
-
test:
|
|
802
|
-
runs-on: ubuntu-latest
|
|
803
|
-
steps:
|
|
804
|
-
- uses: actions/checkout@v4
|
|
805
|
-
- uses: actions/setup-java@v4
|
|
806
|
-
with:
|
|
807
|
-
distribution: 'temurin'
|
|
808
|
-
java-version: '21'
|
|
809
|
-
|
|
810
|
-
- name: Ejecutar pruebas con cobertura
|
|
811
|
-
run: ./gradlew test koverXmlReport
|
|
812
|
-
|
|
813
|
-
- name: Verificar cobertura
|
|
814
|
-
run: ./gradlew koverVerify
|
|
815
|
-
|
|
816
|
-
- name: Subir cobertura
|
|
817
|
-
uses: codecov/codecov-action@v5
|
|
818
|
-
with:
|
|
819
|
-
files: build/reports/kover/report.xml
|
|
820
|
-
token: ${{ secrets.CODECOV_TOKEN }}
|
|
821
|
-
```
|
|
822
|
-
|
|
823
|
-
**Recuerda**: las pruebas son documentación. Muestran cómo se pretende usar tu código Kotlin. Usa los matchers expresivos de Kotest para que las pruebas sean legibles y MockK para un mocking limpio de las dependencias.
|
|
824
|
-
|
|
825
|
-
## Skills relacionadas
|
|
826
|
-
|
|
827
|
-
- `patrones-kotlin` — patrones idiomáticos de Kotlin
|
|
828
|
-
- `corrutinas-flows-kotlin` — corrutinas y Flow en profundidad
|
|
829
|
-
- `flujo-tdd` — el ciclo ROJO -> VERDE -> REFACTOR a nivel de repositorio
|