theus-cli 0.2.36 → 0.2.37
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/cli.js +434 -143
- package/package.json +6 -4
- package/vendor/theus-arsenal/.theus-plugin/marketplace.json +25 -0
- package/vendor/theus-arsenal/.theus-plugin/plugin.json +20 -0
- package/vendor/theus-arsenal/LICENSE +26 -0
- package/vendor/theus-arsenal/README.md +41 -0
- package/vendor/theus-arsenal/THIRD_PARTY.md +80 -0
- package/vendor/theus-arsenal/agents/actualizador-docs.md +123 -0
- package/vendor/theus-arsenal/agents/analista-comentarios.md +53 -0
- package/vendor/theus-arsenal/agents/analista-conversaciones.md +60 -0
- package/vendor/theus-arsenal/agents/analista-tests-pr.md +53 -0
- package/vendor/theus-arsenal/agents/analista-tipos.md +49 -0
- package/vendor/theus-arsenal/agents/arquitecto-accesibilidad.md +148 -0
- package/vendor/theus-arsenal/agents/arquitecto-codigo.md +79 -0
- package/vendor/theus-arsenal/agents/arquitecto-homelab.md +90 -0
- package/vendor/theus-arsenal/agents/arquitecto-redes.md +116 -0
- package/vendor/theus-arsenal/agents/arquitecto-sistemas.md +219 -0
- package/vendor/theus-arsenal/agents/bifurcador-opensource.md +206 -0
- package/vendor/theus-arsenal/agents/cazador-fallos-silenciosos.md +58 -0
- package/vendor/theus-arsenal/agents/consultor-documentacion.md +76 -0
- package/vendor/theus-arsenal/agents/diagnosticador-redes.md +135 -0
- package/vendor/theus-arsenal/agents/ejecutor-e2e.md +96 -0
- package/vendor/theus-arsenal/agents/empaquetador-opensource.md +257 -0
- package/vendor/theus-arsenal/agents/escaner-secretos.md +196 -0
- package/vendor/theus-arsenal/agents/especialista-seo.md +70 -0
- package/vendor/theus-arsenal/agents/estratega-marketing.md +158 -0
- package/vendor/theus-arsenal/agents/evaluador-agentes.md +214 -0
- package/vendor/theus-arsenal/agents/evaluador-harness.md +217 -0
- package/vendor/theus-arsenal/agents/explorador-codigo.md +79 -0
- package/vendor/theus-arsenal/agents/extractor-specs.md +214 -0
- package/vendor/theus-arsenal/agents/generador-harness.md +139 -0
- package/vendor/theus-arsenal/agents/guia-tdd.md +99 -0
- package/vendor/theus-arsenal/agents/jefe-de-gabinete.md +162 -0
- package/vendor/theus-arsenal/agents/limpiador-refactors.md +93 -0
- package/vendor/theus-arsenal/agents/optimizador-rendimiento.md +454 -0
- package/vendor/theus-arsenal/agents/planificador-harness.md +107 -0
- package/vendor/theus-arsenal/agents/planificador.md +221 -0
- package/vendor/theus-arsenal/agents/resolutor-apps-harmonyos.md +181 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-cpp.md +98 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-dart.md +209 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-django.md +253 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-go.md +102 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-java.md +274 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-kotlin.md +128 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-pytorch.md +128 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-react.md +214 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-rust.md +156 -0
- package/vendor/theus-arsenal/agents/resolutor-builds-swift.md +169 -0
- package/vendor/theus-arsenal/agents/resolutor-builds.md +122 -0
- package/vendor/theus-arsenal/agents/revisor-bd.md +97 -0
- package/vendor/theus-arsenal/agents/revisor-codigo.md +291 -0
- package/vendor/theus-arsenal/agents/revisor-config-red.md +116 -0
- package/vendor/theus-arsenal/agents/revisor-cpp.md +80 -0
- package/vendor/theus-arsenal/agents/revisor-csharp.md +109 -0
- package/vendor/theus-arsenal/agents/revisor-django.md +168 -0
- package/vendor/theus-arsenal/agents/revisor-fastapi.md +82 -0
- package/vendor/theus-arsenal/agents/revisor-flutter.md +251 -0
- package/vendor/theus-arsenal/agents/revisor-go.md +84 -0
- package/vendor/theus-arsenal/agents/revisor-java.md +192 -0
- package/vendor/theus-arsenal/agents/revisor-kotlin.md +171 -0
- package/vendor/theus-arsenal/agents/revisor-ml.md +159 -0
- package/vendor/theus-arsenal/agents/revisor-php.md +108 -0
- package/vendor/theus-arsenal/agents/revisor-python.md +106 -0
- package/vendor/theus-arsenal/agents/revisor-react.md +166 -0
- package/vendor/theus-arsenal/agents/revisor-rust.md +102 -0
- package/vendor/theus-arsenal/agents/revisor-seguridad.md +116 -0
- package/vendor/theus-arsenal/agents/revisor-software-clinico.md +95 -0
- package/vendor/theus-arsenal/agents/revisor-swift.md +115 -0
- package/vendor/theus-arsenal/agents/revisor-typescript.md +123 -0
- package/vendor/theus-arsenal/agents/revisor-vue.md +205 -0
- package/vendor/theus-arsenal/agents/simplificador-codigo.md +55 -0
- package/vendor/theus-arsenal/commands/actualizar-docs.md +88 -0
- package/vendor/theus-arsenal/commands/actualizar-mapas-codigo.md +78 -0
- package/vendor/theus-arsenal/commands/aprender-evaluar.md +109 -0
- package/vendor/theus-arsenal/commands/aprender.md +74 -0
- package/vendor/theus-arsenal/commands/arreglar-build.md +66 -0
- package/vendor/theus-arsenal/commands/bucle-multiperspectiva.md +153 -0
- package/vendor/theus-arsenal/commands/build-cpp.md +173 -0
- package/vendor/theus-arsenal/commands/build-flutter.md +164 -0
- package/vendor/theus-arsenal/commands/build-go.md +183 -0
- package/vendor/theus-arsenal/commands/build-gradle.md +75 -0
- package/vendor/theus-arsenal/commands/build-kotlin.md +176 -0
- package/vendor/theus-arsenal/commands/build-react.md +187 -0
- package/vendor/theus-arsenal/commands/build-rust.md +187 -0
- package/vendor/theus-arsenal/commands/campana-marketing.md +125 -0
- package/vendor/theus-arsenal/commands/checkpoint.md +78 -0
- package/vendor/theus-arsenal/commands/cobertura-tests.md +73 -0
- package/vendor/theus-arsenal/commands/configurar-gestor-paquetes.md +86 -0
- package/vendor/theus-arsenal/commands/consulta.md +164 -0
- package/vendor/theus-arsenal/commands/control-calidad.md +50 -0
- package/vendor/theus-arsenal/commands/crear-skill.md +77 -0
- package/vendor/theus-arsenal/commands/enrutar-modelo.md +30 -0
- package/vendor/theus-arsenal/commands/epica-desbloquear.md +17 -0
- package/vendor/theus-arsenal/commands/epica-descomponer.md +22 -0
- package/vendor/theus-arsenal/commands/epica-publicar.md +21 -0
- package/vendor/theus-arsenal/commands/epica-reclamar.md +25 -0
- package/vendor/theus-arsenal/commands/epica-revisar.md +22 -0
- package/vendor/theus-arsenal/commands/epica-sincronizar.md +21 -0
- package/vendor/theus-arsenal/commands/epica-validar.md +21 -0
- package/vendor/theus-arsenal/commands/evolucionar.md +176 -0
- package/vendor/theus-arsenal/commands/funcionalidad.md +49 -0
- package/vendor/theus-arsenal/commands/guardar-sesion.md +278 -0
- package/vendor/theus-arsenal/commands/harness-build.md +111 -0
- package/vendor/theus-arsenal/commands/harness-diseno.md +46 -0
- package/vendor/theus-arsenal/commands/informe-costos.md +90 -0
- package/vendor/theus-arsenal/commands/iniciar-bucle.md +36 -0
- package/vendor/theus-arsenal/commands/instintos-estado.md +53 -0
- package/vendor/theus-arsenal/commands/instintos-exportar.md +69 -0
- package/vendor/theus-arsenal/commands/instintos-importar.md +120 -0
- package/vendor/theus-arsenal/commands/lienzo-planes.md +48 -0
- package/vendor/theus-arsenal/commands/limpiar-refactor.md +84 -0
- package/vendor/theus-arsenal/commands/modo-seguro.md +96 -0
- package/vendor/theus-arsenal/commands/orq-agregar-funcionalidad.md +36 -0
- package/vendor/theus-arsenal/commands/orq-cambiar-funcionalidad.md +38 -0
- package/vendor/theus-arsenal/commands/orq-construir-mvp.md +36 -0
- package/vendor/theus-arsenal/commands/orq-corregir-defecto.md +40 -0
- package/vendor/theus-arsenal/commands/orq-refinar-codigo.md +44 -0
- package/vendor/theus-arsenal/commands/orq-revisar.md +135 -0
- package/vendor/theus-arsenal/commands/plan-prd.md +160 -0
- package/vendor/theus-arsenal/commands/plan.md +198 -0
- package/vendor/theus-arsenal/commands/podar.md +31 -0
- package/vendor/theus-arsenal/commands/pr.md +181 -0
- package/vendor/theus-arsenal/commands/promover.md +41 -0
- package/vendor/theus-arsenal/commands/proyectos.md +33 -0
- package/vendor/theus-arsenal/commands/prp-commit.md +112 -0
- package/vendor/theus-arsenal/commands/prp-implementar.md +385 -0
- package/vendor/theus-arsenal/commands/prp-planificar.md +501 -0
- package/vendor/theus-arsenal/commands/reanudar-sesion.md +160 -0
- package/vendor/theus-arsenal/commands/revisar-codigo.md +289 -0
- package/vendor/theus-arsenal/commands/revisar-cpp.md +132 -0
- package/vendor/theus-arsenal/commands/revisar-fastapi.md +39 -0
- package/vendor/theus-arsenal/commands/revisar-flutter.md +115 -0
- package/vendor/theus-arsenal/commands/revisar-go.md +148 -0
- package/vendor/theus-arsenal/commands/revisar-kotlin.md +140 -0
- package/vendor/theus-arsenal/commands/revisar-pr.md +37 -0
- package/vendor/theus-arsenal/commands/revisar-python.md +297 -0
- package/vendor/theus-arsenal/commands/revisar-react.md +170 -0
- package/vendor/theus-arsenal/commands/revisar-rust.md +142 -0
- package/vendor/theus-arsenal/commands/revisar-vue.md +174 -0
- package/vendor/theus-arsenal/commands/salud-skills.md +52 -0
- package/vendor/theus-arsenal/commands/sesiones.md +345 -0
- package/vendor/theus-arsenal/commands/test-cpp.md +252 -0
- package/vendor/theus-arsenal/commands/test-flutter.md +143 -0
- package/vendor/theus-arsenal/commands/test-go.md +268 -0
- package/vendor/theus-arsenal/commands/test-kotlin.md +312 -0
- package/vendor/theus-arsenal/commands/test-react.md +265 -0
- package/vendor/theus-arsenal/commands/test-rust.md +309 -0
- package/vendor/theus-arsenal/commands/vigilancia-canary.md +43 -0
- package/vendor/theus-arsenal/hooks/hooks.json +274 -0
- package/vendor/theus-arsenal/rules/angular/coding-style.md +182 -0
- package/vendor/theus-arsenal/rules/angular/hooks.md +25 -0
- package/vendor/theus-arsenal/rules/angular/patterns.md +249 -0
- package/vendor/theus-arsenal/rules/angular/security.md +87 -0
- package/vendor/theus-arsenal/rules/angular/testing.md +164 -0
- package/vendor/theus-arsenal/rules/arkts/coding-style.md +153 -0
- package/vendor/theus-arsenal/rules/arkts/hooks.md +80 -0
- package/vendor/theus-arsenal/rules/arkts/patterns.md +236 -0
- package/vendor/theus-arsenal/rules/arkts/security.md +141 -0
- package/vendor/theus-arsenal/rules/arkts/testing.md +126 -0
- package/vendor/theus-arsenal/rules/common/agents.md +49 -0
- package/vendor/theus-arsenal/rules/common/code-review.md +123 -0
- package/vendor/theus-arsenal/rules/common/coding-style.md +90 -0
- package/vendor/theus-arsenal/rules/common/development-workflow.md +44 -0
- package/vendor/theus-arsenal/rules/common/git-workflow.md +24 -0
- package/vendor/theus-arsenal/rules/common/hooks.md +32 -0
- package/vendor/theus-arsenal/rules/common/patterns.md +31 -0
- package/vendor/theus-arsenal/rules/common/performance.md +53 -0
- package/vendor/theus-arsenal/rules/common/security.md +29 -0
- package/vendor/theus-arsenal/rules/common/testing.md +57 -0
- package/vendor/theus-arsenal/rules/cpp/coding-style.md +44 -0
- package/vendor/theus-arsenal/rules/cpp/hooks.md +39 -0
- package/vendor/theus-arsenal/rules/cpp/patterns.md +51 -0
- package/vendor/theus-arsenal/rules/cpp/security.md +51 -0
- package/vendor/theus-arsenal/rules/cpp/testing.md +44 -0
- package/vendor/theus-arsenal/rules/csharp/coding-style.md +72 -0
- package/vendor/theus-arsenal/rules/csharp/hooks.md +25 -0
- package/vendor/theus-arsenal/rules/csharp/patterns.md +50 -0
- package/vendor/theus-arsenal/rules/csharp/security.md +58 -0
- package/vendor/theus-arsenal/rules/csharp/testing.md +50 -0
- package/vendor/theus-arsenal/rules/dart/coding-style.md +159 -0
- package/vendor/theus-arsenal/rules/dart/hooks.md +68 -0
- package/vendor/theus-arsenal/rules/dart/patterns.md +261 -0
- package/vendor/theus-arsenal/rules/dart/security.md +135 -0
- package/vendor/theus-arsenal/rules/dart/testing.md +215 -0
- package/vendor/theus-arsenal/rules/fsharp/coding-style.md +112 -0
- package/vendor/theus-arsenal/rules/fsharp/hooks.md +26 -0
- package/vendor/theus-arsenal/rules/fsharp/patterns.md +111 -0
- package/vendor/theus-arsenal/rules/fsharp/security.md +76 -0
- package/vendor/theus-arsenal/rules/fsharp/testing.md +62 -0
- package/vendor/theus-arsenal/rules/golang/coding-style.md +32 -0
- package/vendor/theus-arsenal/rules/golang/hooks.md +17 -0
- package/vendor/theus-arsenal/rules/golang/patterns.md +45 -0
- package/vendor/theus-arsenal/rules/golang/security.md +34 -0
- package/vendor/theus-arsenal/rules/golang/testing.md +31 -0
- package/vendor/theus-arsenal/rules/java/coding-style.md +114 -0
- package/vendor/theus-arsenal/rules/java/hooks.md +18 -0
- package/vendor/theus-arsenal/rules/java/patterns.md +147 -0
- package/vendor/theus-arsenal/rules/java/security.md +101 -0
- package/vendor/theus-arsenal/rules/java/testing.md +133 -0
- package/vendor/theus-arsenal/rules/kotlin/coding-style.md +86 -0
- package/vendor/theus-arsenal/rules/kotlin/hooks.md +17 -0
- package/vendor/theus-arsenal/rules/kotlin/patterns.md +146 -0
- package/vendor/theus-arsenal/rules/kotlin/security.md +82 -0
- package/vendor/theus-arsenal/rules/kotlin/testing.md +128 -0
- package/vendor/theus-arsenal/rules/nuxt/coding-style.md +47 -0
- package/vendor/theus-arsenal/rules/nuxt/hooks.md +39 -0
- package/vendor/theus-arsenal/rules/nuxt/patterns.md +54 -0
- package/vendor/theus-arsenal/rules/nuxt/security.md +48 -0
- package/vendor/theus-arsenal/rules/nuxt/testing.md +49 -0
- package/vendor/theus-arsenal/rules/php/coding-style.md +40 -0
- package/vendor/theus-arsenal/rules/php/hooks.md +24 -0
- package/vendor/theus-arsenal/rules/php/patterns.md +33 -0
- package/vendor/theus-arsenal/rules/php/security.md +37 -0
- package/vendor/theus-arsenal/rules/php/testing.md +38 -0
- package/vendor/theus-arsenal/rules/python/coding-style.md +42 -0
- package/vendor/theus-arsenal/rules/python/fastapi.md +58 -0
- package/vendor/theus-arsenal/rules/python/hooks.md +19 -0
- package/vendor/theus-arsenal/rules/python/patterns.md +39 -0
- package/vendor/theus-arsenal/rules/python/security.md +30 -0
- package/vendor/theus-arsenal/rules/python/testing.md +38 -0
- package/vendor/theus-arsenal/rules/react/coding-style.md +109 -0
- package/vendor/theus-arsenal/rules/react/hooks.md +187 -0
- package/vendor/theus-arsenal/rules/react/patterns.md +194 -0
- package/vendor/theus-arsenal/rules/react/security.md +180 -0
- package/vendor/theus-arsenal/rules/react/testing.md +208 -0
- package/vendor/theus-arsenal/rules/react-native/accessibility.md +55 -0
- package/vendor/theus-arsenal/rules/react-native/coding-style.md +71 -0
- package/vendor/theus-arsenal/rules/react-native/hooks.md +28 -0
- package/vendor/theus-arsenal/rules/react-native/patterns.md +88 -0
- package/vendor/theus-arsenal/rules/react-native/performance.md +45 -0
- package/vendor/theus-arsenal/rules/react-native/production-readiness.md +51 -0
- package/vendor/theus-arsenal/rules/react-native/security.md +43 -0
- package/vendor/theus-arsenal/rules/react-native/testing.md +52 -0
- package/vendor/theus-arsenal/rules/ruby/coding-style.md +46 -0
- package/vendor/theus-arsenal/rules/ruby/hooks.md +37 -0
- package/vendor/theus-arsenal/rules/ruby/patterns.md +44 -0
- package/vendor/theus-arsenal/rules/ruby/security.md +51 -0
- package/vendor/theus-arsenal/rules/ruby/testing.md +51 -0
- package/vendor/theus-arsenal/rules/rust/coding-style.md +151 -0
- package/vendor/theus-arsenal/rules/rust/hooks.md +16 -0
- package/vendor/theus-arsenal/rules/rust/patterns.md +168 -0
- package/vendor/theus-arsenal/rules/rust/security.md +141 -0
- package/vendor/theus-arsenal/rules/rust/testing.md +154 -0
- package/vendor/theus-arsenal/rules/swift/coding-style.md +47 -0
- package/vendor/theus-arsenal/rules/swift/hooks.md +20 -0
- package/vendor/theus-arsenal/rules/swift/patterns.md +66 -0
- package/vendor/theus-arsenal/rules/swift/security.md +33 -0
- package/vendor/theus-arsenal/rules/swift/testing.md +45 -0
- package/vendor/theus-arsenal/rules/typescript/coding-style.md +199 -0
- package/vendor/theus-arsenal/rules/typescript/hooks.md +22 -0
- package/vendor/theus-arsenal/rules/typescript/patterns.md +52 -0
- package/vendor/theus-arsenal/rules/typescript/security.md +28 -0
- package/vendor/theus-arsenal/rules/typescript/testing.md +18 -0
- package/vendor/theus-arsenal/rules/vue/coding-style.md +54 -0
- package/vendor/theus-arsenal/rules/vue/hooks.md +45 -0
- package/vendor/theus-arsenal/rules/vue/patterns.md +56 -0
- package/vendor/theus-arsenal/rules/vue/security.md +46 -0
- package/vendor/theus-arsenal/rules/vue/testing.md +53 -0
- package/vendor/theus-arsenal/rules/web/coding-style.md +108 -0
- package/vendor/theus-arsenal/rules/web/design-quality.md +75 -0
- package/vendor/theus-arsenal/rules/web/hooks.md +141 -0
- package/vendor/theus-arsenal/rules/web/patterns.md +91 -0
- package/vendor/theus-arsenal/rules/web/performance.md +76 -0
- package/vendor/theus-arsenal/rules/web/security.md +69 -0
- package/vendor/theus-arsenal/rules/web/testing.md +67 -0
- package/vendor/theus-arsenal/scripts/hooks/bash-hook-dispatcher.js +192 -0
- package/vendor/theus-arsenal/scripts/hooks/block-no-verify.js +556 -0
- package/vendor/theus-arsenal/scripts/hooks/check-console-log.js +92 -0
- package/vendor/theus-arsenal/scripts/hooks/check-hook-enabled.js +16 -0
- package/vendor/theus-arsenal/scripts/hooks/config-protection.js +171 -0
- package/vendor/theus-arsenal/scripts/hooks/design-quality-check.js +132 -0
- package/vendor/theus-arsenal/scripts/hooks/doc-file-warning.js +110 -0
- package/vendor/theus-arsenal/scripts/hooks/modo-seguro.js +158 -0
- package/vendor/theus-arsenal/scripts/hooks/notificacion-escritorio.js +208 -0
- package/vendor/theus-arsenal/scripts/hooks/plugin-hook-bootstrap.js +280 -0
- package/vendor/theus-arsenal/scripts/hooks/post-bash-command-log.js +87 -0
- package/vendor/theus-arsenal/scripts/hooks/post-bash-dispatcher.js +24 -0
- package/vendor/theus-arsenal/scripts/hooks/post-bash-pr-created.js +60 -0
- package/vendor/theus-arsenal/scripts/hooks/post-edit-accumulator.js +94 -0
- package/vendor/theus-arsenal/scripts/hooks/post-edit-console-warn.js +54 -0
- package/vendor/theus-arsenal/scripts/hooks/post-edit-format.js +110 -0
- package/vendor/theus-arsenal/scripts/hooks/post-edit-typecheck.js +98 -0
- package/vendor/theus-arsenal/scripts/hooks/pre-bash-commit-quality.js +447 -0
- package/vendor/theus-arsenal/scripts/hooks/pre-bash-dev-server-block.js +232 -0
- package/vendor/theus-arsenal/scripts/hooks/pre-bash-dispatcher.js +27 -0
- package/vendor/theus-arsenal/scripts/hooks/pre-compact.js +101 -0
- package/vendor/theus-arsenal/scripts/hooks/pretooluse-visible-output.js +49 -0
- package/vendor/theus-arsenal/scripts/hooks/quality-gate.js +168 -0
- package/vendor/theus-arsenal/scripts/hooks/run-with-flags.js +271 -0
- package/vendor/theus-arsenal/scripts/hooks/salud-mcp.js +749 -0
- package/vendor/theus-arsenal/scripts/hooks/seguimiento-costos.js +161 -0
- package/vendor/theus-arsenal/scripts/hooks/session-end.js +340 -0
- package/vendor/theus-arsenal/scripts/hooks/session-start.js +906 -0
- package/vendor/theus-arsenal/scripts/hooks/stop-format-typecheck.js +263 -0
- package/vendor/theus-arsenal/scripts/hooks/suggest-compact.js +286 -0
- package/vendor/theus-arsenal/scripts/hooks/theus-context-monitor.js +289 -0
- package/vendor/theus-arsenal/scripts/hooks/verificacion-factual.js +1278 -0
- package/vendor/theus-arsenal/scripts/lib/agent-data-home.js +96 -0
- package/vendor/theus-arsenal/scripts/lib/cost-estimate.js +66 -0
- package/vendor/theus-arsenal/scripts/lib/hook-flags.js +79 -0
- package/vendor/theus-arsenal/scripts/lib/llm-summary.js +185 -0
- package/vendor/theus-arsenal/scripts/lib/loopback-guard.js +54 -0
- package/vendor/theus-arsenal/scripts/lib/observer-sessions.js +237 -0
- package/vendor/theus-arsenal/scripts/lib/package-manager.d.ts +120 -0
- package/vendor/theus-arsenal/scripts/lib/package-manager.js +434 -0
- package/vendor/theus-arsenal/scripts/lib/path-safety.js +86 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/markdown.js +285 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/sdk.js +238 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/server.js +534 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/sessions.js +274 -0
- package/vendor/theus-arsenal/scripts/lib/plan-canvas/ui.js +546 -0
- package/vendor/theus-arsenal/scripts/lib/project-detect.js +451 -0
- package/vendor/theus-arsenal/scripts/lib/resolve-formatter.js +193 -0
- package/vendor/theus-arsenal/scripts/lib/resolve-theus-root.js +101 -0
- package/vendor/theus-arsenal/scripts/lib/session-aliases.d.ts +138 -0
- package/vendor/theus-arsenal/scripts/lib/session-aliases.js +483 -0
- package/vendor/theus-arsenal/scripts/lib/session-bridge.js +155 -0
- package/vendor/theus-arsenal/scripts/lib/session-manager.d.ts +137 -0
- package/vendor/theus-arsenal/scripts/lib/session-manager.js +555 -0
- package/vendor/theus-arsenal/scripts/lib/shell-split.js +86 -0
- package/vendor/theus-arsenal/scripts/lib/shell-substitution.js +501 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/dashboard.js +414 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/health.js +285 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/index.js +22 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/provenance.js +200 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/tracker.js +157 -0
- package/vendor/theus-arsenal/scripts/lib/skill-evolution/versioning.js +246 -0
- package/vendor/theus-arsenal/scripts/lib/transcript-context.js +232 -0
- package/vendor/theus-arsenal/scripts/lib/utils.d.ts +205 -0
- package/vendor/theus-arsenal/scripts/lib/utils.js +658 -0
- package/vendor/theus-arsenal/scripts/plan-canvas.js +341 -0
- package/vendor/theus-arsenal/scripts/setup-package-manager.js +46 -0
- package/vendor/theus-arsenal/scripts/skills-health.js +143 -0
- package/vendor/theus-arsenal/skills/a11y-frontend/SKILL.md +444 -0
- package/vendor/theus-arsenal/skills/accesibilidad/SKILL.md +144 -0
- package/vendor/theus-arsenal/skills/acelerador-throughput-datos/SKILL.md +72 -0
- package/vendor/theus-arsenal/skills/agente-scraper-datos/SKILL.md +771 -0
- package/vendor/theus-arsenal/skills/analisis-plataformas-competencia/SKILL.md +137 -0
- package/vendor/theus-arsenal/skills/api-x/SKILL.md +233 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/SKILL.md +335 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer-loop.sh +374 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/observer.md +188 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/session-guardian.sh +153 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/agents/start-observer.sh +253 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/config.json +8 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/hooks/observe.sh +594 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/detect-project.sh +325 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/instinct-cli.py +1918 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/lib/arsenal-dir.sh +23 -0
- package/vendor/theus-arsenal/skills/aprendizaje-continuo-v2/scripts/test_parse_instinct.py +1420 -0
- package/vendor/theus-arsenal/skills/arquitectura-hexagonal/SKILL.md +275 -0
- package/vendor/theus-arsenal/skills/arquitectura-limpia-android/SKILL.md +340 -0
- package/vendor/theus-arsenal/skills/arquitectura-pipelines-recomendacion/SKILL.md +112 -0
- package/vendor/theus-arsenal/skills/atlas-datos-prediccion/SKILL.md +53 -0
- package/vendor/theus-arsenal/skills/auditoria-arquitectura-agentes/SKILL.md +257 -0
- package/vendor/theus-arsenal/skills/auditoria-produccion/SKILL.md +180 -0
- package/vendor/theus-arsenal/skills/auditoria-rutas-clic/SKILL.md +243 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/SKILL.md +180 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/high-score-example.md +89 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/examples/low-score-example.md +87 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/evaluation-criteria.md +71 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/references/hook-integration.md +90 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/scripts/evaluate.py +409 -0
- package/vendor/theus-arsenal/skills/autoevaluacion-agente/templates/evaluation-report.md +86 -0
- package/vendor/theus-arsenal/skills/automatizacion-ssh-netmiko/SKILL.md +176 -0
- package/vendor/theus-arsenal/skills/base-datos-pubmed/SKILL.md +174 -0
- package/vendor/theus-arsenal/skills/base-datos-uspto/SKILL.md +173 -0
- package/vendor/theus-arsenal/skills/benchmark/SKILL.md +92 -0
- package/vendor/theus-arsenal/skills/bitacora-crecimiento/SKILL.md +120 -0
- package/vendor/theus-arsenal/skills/bucle-verificacion/SKILL.md +125 -0
- package/vendor/theus-arsenal/skills/buscar-primero/SKILL.md +184 -0
- package/vendor/theus-arsenal/skills/busqueda-exa/SKILL.md +111 -0
- package/vendor/theus-arsenal/skills/cache-por-hash/SKILL.md +160 -0
- package/vendor/theus-arsenal/skills/campana-marketing/SKILL.md +118 -0
- package/vendor/theus-arsenal/skills/capacidad-producto/SKILL.md +138 -0
- package/vendor/theus-arsenal/skills/cazador-vulnerabilidades/SKILL.md +104 -0
- package/vendor/theus-arsenal/skills/compactacion-estrategica/SKILL.md +115 -0
- package/vendor/theus-arsenal/skills/comparador-baskets-prediccion/SKILL.md +69 -0
- package/vendor/theus-arsenal/skills/compras-energia/SKILL.md +206 -0
- package/vendor/theus-arsenal/skills/concurrencia-swift-6-2/SKILL.md +224 -0
- package/vendor/theus-arsenal/skills/consejo/SKILL.md +201 -0
- package/vendor/theus-arsenal/skills/construccion-harness-agentes/SKILL.md +78 -0
- package/vendor/theus-arsenal/skills/constructor-conectores/SKILL.md +119 -0
- package/vendor/theus-arsenal/skills/constructor-equipos/SKILL.md +169 -0
- package/vendor/theus-arsenal/skills/consulta-documentacion/SKILL.md +92 -0
- package/vendor/theus-arsenal/skills/consultas-genomicas-gget/SKILL.md +170 -0
- package/vendor/theus-arsenal/skills/contacto-inversores/SKILL.md +95 -0
- package/vendor/theus-arsenal/skills/corrutinas-flows-kotlin/SKILL.md +284 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/SKILL.md +46 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/3d.md +86 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/animations.md +29 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/charts-bar-chart.tsx +173 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-typewriter.tsx +100 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/assets.md +78 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/audio.md +172 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/calculate-metadata.md +104 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/can-decode.md +75 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/charts.md +58 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/compositions.md +146 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/display-captions.md +126 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/extract-frames.md +229 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/fonts.md +152 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-audio-duration.md +58 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-dimensions.md +68 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/get-video-duration.md +58 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/gifs.md +138 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/images.md +130 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/import-srt-captions.md +67 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/lottie.md +67 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-dom-nodes.md +34 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/measuring-text.md +143 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/sequencing.md +106 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/tailwind.md +11 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/text-animations.md +20 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/timing.md +179 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transcribe-captions.md +19 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/transitions.md +122 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/trimming.md +52 -0
- package/vendor/theus-arsenal/skills/creacion-video-remotion/rules/videos.md +171 -0
- package/vendor/theus-arsenal/skills/cumplimiento-aduanero/SKILL.md +270 -0
- package/vendor/theus-arsenal/skills/cumplimiento-hipaa/SKILL.md +78 -0
- package/vendor/theus-arsenal/skills/datos-sensibles-salud/SKILL.md +149 -0
- package/vendor/theus-arsenal/skills/decimales-tokens-evm/SKILL.md +128 -0
- package/vendor/theus-arsenal/skills/decisiones-arquitectura/SKILL.md +206 -0
- package/vendor/theus-arsenal/skills/demos-ui/SKILL.md +469 -0
- package/vendor/theus-arsenal/skills/desarrollo-por-intencion/SKILL.md +369 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/SKILL.md +149 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/10_proposito-porque.md +42 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/20_posicionamiento.md +47 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/30_audiencia-nicho.md +53 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/40_personalidad-arquetipo.md +61 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/50_voz-tono.md +62 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/60_narrativa-historia.md +54 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/70_tension-fundador.md +50 -0
- package/vendor/theus-arsenal/skills/descubrimiento-marca/references/90_SINTESIS.md +133 -0
- package/vendor/theus-arsenal/skills/descubrimiento-plugins-laravel/SKILL.md +230 -0
- package/vendor/theus-arsenal/skills/destilado-reglas/SKILL.md +263 -0
- package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-rules.sh +58 -0
- package/vendor/theus-arsenal/skills/destilado-reglas/scripts/scan-skills.sh +129 -0
- package/vendor/theus-arsenal/skills/diagnostico-bgp/SKILL.md +170 -0
- package/vendor/theus-arsenal/skills/direccion-estetica/SKILL.md +220 -0
- package/vendor/theus-arsenal/skills/direccion-estetica/references/taxonomia-generos.md +89 -0
- package/vendor/theus-arsenal/skills/diseno-api/SKILL.md +522 -0
- package/vendor/theus-arsenal/skills/diseno-liquid-glass/SKILL.md +282 -0
- package/vendor/theus-arsenal/skills/e2e-escritorio-windows/SKILL.md +879 -0
- package/vendor/theus-arsenal/skills/edicion-video/SKILL.md +289 -0
- package/vendor/theus-arsenal/skills/enfoque-producto/SKILL.md +91 -0
- package/vendor/theus-arsenal/skills/entornos-flox/SKILL.md +493 -0
- package/vendor/theus-arsenal/skills/estandares-codigo/SKILL.md +548 -0
- package/vendor/theus-arsenal/skills/estandares-cpp/SKILL.md +727 -0
- package/vendor/theus-arsenal/skills/estandares-java/SKILL.md +389 -0
- package/vendor/theus-arsenal/skills/estilo-legado/SKILL.md +149 -0
- package/vendor/theus-arsenal/skills/estructura-informes-competencia/SKILL.md +95 -0
- package/vendor/theus-arsenal/skills/evaluacion-academica/SKILL.md +165 -0
- package/vendor/theus-arsenal/skills/explorador-skills/SKILL.md +129 -0
- package/vendor/theus-arsenal/skills/flujo-git/SKILL.md +714 -0
- package/vendor/theus-arsenal/skills/flujo-ingenieria-ml/SKILL.md +343 -0
- package/vendor/theus-arsenal/skills/flujo-tdd/SKILL.md +584 -0
- package/vendor/theus-arsenal/skills/forja-personas/SKILL.md +298 -0
- package/vendor/theus-arsenal/skills/forja-personas/gacha.py +224 -0
- package/vendor/theus-arsenal/skills/forja-personas/gacha.sh +5 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/avatar-style.md +123 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/boundary-rules.md +53 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/error-handling.md +53 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/identity-tension.md +48 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/naming-system.md +39 -0
- package/vendor/theus-arsenal/skills/forja-personas/references/output-template.md +166 -0
- package/vendor/theus-arsenal/skills/fundamentos-animacion/SKILL.md +296 -0
- package/vendor/theus-arsenal/skills/generacion-iconos-ios/SKILL.md +156 -0
- package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/generate_icons.swift +258 -0
- package/vendor/theus-arsenal/skills/generacion-iconos-ios/scripts/iconify_gen.sh +235 -0
- package/vendor/theus-arsenal/skills/gestion-excepciones-logisticas/SKILL.md +208 -0
- package/vendor/theus-arsenal/skills/gestion-transportistas/SKILL.md +204 -0
- package/vendor/theus-arsenal/skills/guia-adopcion-ml/SKILL.md +64 -0
- package/vendor/theus-arsenal/skills/harness-agente-autonomo/SKILL.md +252 -0
- package/vendor/theus-arsenal/skills/harness-eval-clinico/SKILL.md +212 -0
- package/vendor/theus-arsenal/skills/harness-evaluacion/SKILL.md +296 -0
- package/vendor/theus-arsenal/skills/harness-generador-evaluador/SKILL.md +254 -0
- package/vendor/theus-arsenal/skills/homelab-diseno-red/SKILL.md +120 -0
- package/vendor/theus-arsenal/skills/homelab-dns-pihole/SKILL.md +264 -0
- package/vendor/theus-arsenal/skills/homelab-preparacion-red/SKILL.md +144 -0
- package/vendor/theus-arsenal/skills/homelab-segmentacion-vlan/SKILL.md +307 -0
- package/vendor/theus-arsenal/skills/homelab-vpn-wireguard/SKILL.md +299 -0
- package/vendor/theus-arsenal/skills/ingenieria-agentica/SKILL.md +96 -0
- package/vendor/theus-arsenal/skills/inspeccion-animaciones-blender/SKILL.md +164 -0
- package/vendor/theus-arsenal/skills/instaladores-python/SKILL.md +820 -0
- package/vendor/theus-arsenal/skills/integracion-jira/SKILL.md +307 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/SKILL.md +312 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/agente-enriquecimiento.md +87 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/mapeador-mutuos.md +76 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/puntuador-senales.md +60 -0
- package/vendor/theus-arsenal/skills/inteligencia-leads/agents/redactor-outreach.md +102 -0
- package/vendor/theus-arsenal/skills/inteligencia-mercados-prediccion/SKILL.md +53 -0
- package/vendor/theus-arsenal/skills/introspeccion-agente/SKILL.md +150 -0
- package/vendor/theus-arsenal/skills/inventario-skills/SKILL.md +194 -0
- package/vendor/theus-arsenal/skills/inventario-skills/scripts/quick-diff.sh +87 -0
- package/vendor/theus-arsenal/skills/inventario-skills/scripts/save-results.sh +57 -0
- package/vendor/theus-arsenal/skills/inventario-skills/scripts/scan.sh +170 -0
- package/vendor/theus-arsenal/skills/investigacion-mercado/SKILL.md +87 -0
- package/vendor/theus-arsenal/skills/investigacion-oraculos-prediccion/SKILL.md +59 -0
- package/vendor/theus-arsenal/skills/investigacion-profunda/SKILL.md +161 -0
- package/vendor/theus-arsenal/skills/keccak256-nodejs/SKILL.md +100 -0
- package/vendor/theus-arsenal/skills/libro-decisiones-recursivo/SKILL.md +82 -0
- package/vendor/theus-arsenal/skills/lienzo-planes/SKILL.md +111 -0
- package/vendor/theus-arsenal/skills/limpieza-configuracion/SKILL.md +116 -0
- package/vendor/theus-arsenal/skills/logistica-inversa-devoluciones/SKILL.md +241 -0
- package/vendor/theus-arsenal/skills/manejo-errores/SKILL.md +375 -0
- package/vendor/theus-arsenal/skills/materiales-inversores/SKILL.md +101 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/SKILL.md +170 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/forget.mjs +44 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/info.mjs +24 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/init.mjs +152 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/list.mjs +40 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/migrate.mjs +214 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/resume.mjs +36 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/save.mjs +210 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/commands/shared.mjs +402 -0
- package/vendor/theus-arsenal/skills/memoria-por-proyecto/hooks/session-start.mjs +238 -0
- package/vendor/theus-arsenal/skills/metodologia-benchmarks/SKILL.md +131 -0
- package/vendor/theus-arsenal/skills/migraciones-bd/SKILL.md +430 -0
- package/vendor/theus-arsenal/skills/modelos-fundacionales-en-dispositivo/SKILL.md +244 -0
- package/vendor/theus-arsenal/skills/modo-seguro/SKILL.md +86 -0
- package/vendor/theus-arsenal/skills/motion-avanzado/SKILL.md +592 -0
- package/vendor/theus-arsenal/skills/motor-de-contenido/SKILL.md +136 -0
- package/vendor/theus-arsenal/skills/no-conformidades-calidad/SKILL.md +249 -0
- package/vendor/theus-arsenal/skills/onboarding-codigo/SKILL.md +244 -0
- package/vendor/theus-arsenal/skills/operaciones-agentes-empresariales/SKILL.md +51 -0
- package/vendor/theus-arsenal/skills/operaciones-conocimiento/SKILL.md +159 -0
- package/vendor/theus-arsenal/skills/operaciones-correo/SKILL.md +123 -0
- package/vendor/theus-arsenal/skills/operaciones-facturacion/SKILL.md +142 -0
- package/vendor/theus-arsenal/skills/operaciones-flujo-proyectos/SKILL.md +110 -0
- package/vendor/theus-arsenal/skills/operaciones-github/SKILL.md +143 -0
- package/vendor/theus-arsenal/skills/operaciones-google-workspace/SKILL.md +100 -0
- package/vendor/theus-arsenal/skills/operaciones-investigacion/SKILL.md +124 -0
- package/vendor/theus-arsenal/skills/operaciones-mensajes/SKILL.md +103 -0
- package/vendor/theus-arsenal/skills/operaciones-terminal/SKILL.md +110 -0
- package/vendor/theus-arsenal/skills/optimizacion-benchmark/SKILL.md +70 -0
- package/vendor/theus-arsenal/skills/optimizacion-costos-llm/SKILL.md +182 -0
- package/vendor/theus-arsenal/skills/optimizador-conexiones/SKILL.md +191 -0
- package/vendor/theus-arsenal/skills/optimizador-paralelismo/SKILL.md +75 -0
- package/vendor/theus-arsenal/skills/optimizador-prompts/SKILL.md +374 -0
- package/vendor/theus-arsenal/skills/orq-agregar-funcionalidad/SKILL.md +37 -0
- package/vendor/theus-arsenal/skills/orq-cambiar-funcionalidad/SKILL.md +36 -0
- package/vendor/theus-arsenal/skills/orq-construir-mvp/SKILL.md +38 -0
- package/vendor/theus-arsenal/skills/orq-corregir-defecto/SKILL.md +36 -0
- package/vendor/theus-arsenal/skills/orq-pipeline/SKILL.md +134 -0
- package/vendor/theus-arsenal/skills/orq-refinar-codigo/SKILL.md +49 -0
- package/vendor/theus-arsenal/skills/orquestacion-equipos-agentes/SKILL.md +117 -0
- package/vendor/theus-arsenal/skills/pagos-agentes-x402/SKILL.md +237 -0
- package/vendor/theus-arsenal/skills/patrones-angular/SKILL.md +153 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/angular-animations.md +160 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/angular-aria.md +410 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/cli.md +86 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/component-harnesses.md +59 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/component-styling.md +91 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/components.md +117 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/creating-services.md +97 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/data-resolvers.md +69 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/define-routes.md +67 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/defining-providers.md +72 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/di-fundamentals.md +120 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/e2e-testing.md +56 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/effects.md +83 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/hierarchical-injectors.md +43 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/host-elements.md +80 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/injection-context.md +63 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/inputs.md +101 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/linked-signal.md +59 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/loading-strategies.md +61 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/mcp.md +67 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/navigate-to-routes.md +69 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/outputs.md +86 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/reactive-forms.md +122 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/rendering-strategies.md +44 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/resource.md +77 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/route-animations.md +56 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/route-guards.md +52 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/router-lifecycle.md +45 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/router-testing.md +87 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/show-routes-with-outlets.md +68 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/signal-forms.md +795 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/signals-overview.md +94 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/tailwind-css.md +69 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/template-driven-forms.md +114 -0
- package/vendor/theus-arsenal/skills/patrones-angular/references/testing-fundamentals.md +65 -0
- package/vendor/theus-arsenal/skills/patrones-animacion/SKILL.md +432 -0
- package/vendor/theus-arsenal/skills/patrones-backend/SKILL.md +560 -0
- package/vendor/theus-arsenal/skills/patrones-cdss-clinico/SKILL.md +249 -0
- package/vendor/theus-arsenal/skills/patrones-cisco-ios/SKILL.md +148 -0
- package/vendor/theus-arsenal/skills/patrones-clickhouse/SKILL.md +443 -0
- package/vendor/theus-arsenal/skills/patrones-compose-multiplatform/SKILL.md +298 -0
- package/vendor/theus-arsenal/skills/patrones-dart-flutter/SKILL.md +566 -0
- package/vendor/theus-arsenal/skills/patrones-despliegue/SKILL.md +426 -0
- package/vendor/theus-arsenal/skills/patrones-django/SKILL.md +739 -0
- package/vendor/theus-arsenal/skills/patrones-django-celery/SKILL.md +456 -0
- package/vendor/theus-arsenal/skills/patrones-docker/SKILL.md +363 -0
- package/vendor/theus-arsenal/skills/patrones-dotnet/SKILL.md +321 -0
- package/vendor/theus-arsenal/skills/patrones-emr-clinico/SKILL.md +168 -0
- package/vendor/theus-arsenal/skills/patrones-fastapi/SKILL.md +513 -0
- package/vendor/theus-arsenal/skills/patrones-frontend/SKILL.md +655 -0
- package/vendor/theus-arsenal/skills/patrones-go/SKILL.md +674 -0
- package/vendor/theus-arsenal/skills/patrones-jpa/SKILL.md +156 -0
- package/vendor/theus-arsenal/skills/patrones-kotlin/SKILL.md +717 -0
- package/vendor/theus-arsenal/skills/patrones-kotlin-exposed/SKILL.md +724 -0
- package/vendor/theus-arsenal/skills/patrones-kotlin-ktor/SKILL.md +694 -0
- package/vendor/theus-arsenal/skills/patrones-kubernetes/SKILL.md +754 -0
- package/vendor/theus-arsenal/skills/patrones-laravel/SKILL.md +414 -0
- package/vendor/theus-arsenal/skills/patrones-mcp/SKILL.md +66 -0
- package/vendor/theus-arsenal/skills/patrones-mysql/SKILL.md +420 -0
- package/vendor/theus-arsenal/skills/patrones-nestjs/SKILL.md +229 -0
- package/vendor/theus-arsenal/skills/patrones-nextjs/SKILL.md +56 -0
- package/vendor/theus-arsenal/skills/patrones-nuxt4/SKILL.md +99 -0
- package/vendor/theus-arsenal/skills/patrones-perl/SKILL.md +508 -0
- package/vendor/theus-arsenal/skills/patrones-postgres/SKILL.md +141 -0
- package/vendor/theus-arsenal/skills/patrones-prisma/SKILL.md +399 -0
- package/vendor/theus-arsenal/skills/patrones-python/SKILL.md +750 -0
- package/vendor/theus-arsenal/skills/patrones-pytorch/SKILL.md +400 -0
- package/vendor/theus-arsenal/skills/patrones-quarkus/SKILL.md +729 -0
- package/vendor/theus-arsenal/skills/patrones-react/SKILL.md +339 -0
- package/vendor/theus-arsenal/skills/patrones-react-native/SKILL.md +325 -0
- package/vendor/theus-arsenal/skills/patrones-redis/SKILL.md +401 -0
- package/vendor/theus-arsenal/skills/patrones-rust/SKILL.md +504 -0
- package/vendor/theus-arsenal/skills/patrones-springboot/SKILL.md +314 -0
- package/vendor/theus-arsenal/skills/patrones-swiftui/SKILL.md +261 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/SKILL.md +281 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/architecture.md +90 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/data-handling.md +60 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/database.md +99 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/routing.md +64 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/system-usage.md +97 -0
- package/vendor/theus-arsenal/skills/patrones-tinystruct/references/testing.md +72 -0
- package/vendor/theus-arsenal/skills/patrones-vite/SKILL.md +449 -0
- package/vendor/theus-arsenal/skills/patrones-vue/SKILL.md +469 -0
- package/vendor/theus-arsenal/skills/persistencia-actores-swift/SKILL.md +148 -0
- package/vendor/theus-arsenal/skills/pipeline-opensource/SKILL.md +254 -0
- package/vendor/theus-arsenal/skills/planificacion-demanda-inventario/SKILL.md +236 -0
- package/vendor/theus-arsenal/skills/planificador-trades-prediccion/SKILL.md +60 -0
- package/vendor/theus-arsenal/skills/plano-tecnico/SKILL.md +102 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/SKILL.md +189 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/STYLE_PRESETS.md +330 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/animation-patterns.md +122 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/html-template.md +419 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/scripts/export-pdf.sh +418 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/scripts/extract-pptx.py +96 -0
- package/vendor/theus-arsenal/skills/presentaciones-html/viewport-base.css +153 -0
- package/vendor/theus-arsenal/skills/presupuesto-contexto/SKILL.md +263 -0
- package/vendor/theus-arsenal/skills/procesamiento-documentos-nutrient/SKILL.md +168 -0
- package/vendor/theus-arsenal/skills/programacion-produccion/SKILL.md +220 -0
- package/vendor/theus-arsenal/skills/publicacion-cruzada/SKILL.md +117 -0
- package/vendor/theus-arsenal/skills/publicador-social/SKILL.md +121 -0
- package/vendor/theus-arsenal/skills/puerta-de-entrega/SKILL.md +164 -0
- package/vendor/theus-arsenal/skills/puerta-de-entrega/hooks/puerta-entrega.py +242 -0
- package/vendor/theus-arsenal/skills/pulir-interfaces/SKILL.md +126 -0
- package/vendor/theus-arsenal/skills/qa-navegador/SKILL.md +103 -0
- package/vendor/theus-arsenal/skills/ranking-grafo-social/SKILL.md +153 -0
- package/vendor/theus-arsenal/skills/recuperacion-iterativa/SKILL.md +236 -0
- package/vendor/theus-arsenal/skills/redaccion-articulos/SKILL.md +81 -0
- package/vendor/theus-arsenal/skills/regex-vs-llm/SKILL.md +221 -0
- package/vendor/theus-arsenal/skills/regresion-codigo-ia/SKILL.md +388 -0
- package/vendor/theus-arsenal/skills/rendimiento-react/SKILL.md +567 -0
- package/vendor/theus-arsenal/skills/revision-codigo-flutter-dart/SKILL.md +442 -0
- package/vendor/theus-arsenal/skills/revision-literatura-cientifica/SKILL.md +191 -0
- package/vendor/theus-arsenal/skills/revision-multiperspectiva/SKILL.md +302 -0
- package/vendor/theus-arsenal/skills/revision-riesgo-prediccion/SKILL.md +56 -0
- package/vendor/theus-arsenal/skills/revision-seguridad/SKILL.md +505 -0
- package/vendor/theus-arsenal/skills/revision-seguridad/cloud-infrastructure-security.md +361 -0
- package/vendor/theus-arsenal/skills/runtime-bun/SKILL.md +83 -0
- package/vendor/theus-arsenal/skills/salud-codigo-codescene/SKILL.md +163 -0
- package/vendor/theus-arsenal/skills/salud-interfaces-red/SKILL.md +143 -0
- package/vendor/theus-arsenal/skills/seguimiento-costos/SKILL.md +122 -0
- package/vendor/theus-arsenal/skills/seguridad-agentes-trading/SKILL.md +145 -0
- package/vendor/theus-arsenal/skills/seguridad-amm-defi/SKILL.md +166 -0
- package/vendor/theus-arsenal/skills/seguridad-django/SKILL.md +648 -0
- package/vendor/theus-arsenal/skills/seguridad-laravel/SKILL.md +945 -0
- package/vendor/theus-arsenal/skills/seguridad-perl/SKILL.md +507 -0
- package/vendor/theus-arsenal/skills/seguridad-quarkus/SKILL.md +474 -0
- package/vendor/theus-arsenal/skills/seguridad-springboot/SKILL.md +279 -0
- package/vendor/theus-arsenal/skills/seo/SKILL.md +166 -0
- package/vendor/theus-arsenal/skills/sistema-diseno/SKILL.md +81 -0
- package/vendor/theus-arsenal/skills/sistema-operativo-agentico/SKILL.md +375 -0
- package/vendor/theus-arsenal/skills/sistemas-latencia-critica/SKILL.md +65 -0
- package/vendor/theus-arsenal/skills/tdd-django/SKILL.md +735 -0
- package/vendor/theus-arsenal/skills/tdd-laravel/SKILL.md +673 -0
- package/vendor/theus-arsenal/skills/tdd-quarkus/SKILL.md +817 -0
- package/vendor/theus-arsenal/skills/tdd-springboot/SKILL.md +165 -0
- package/vendor/theus-arsenal/skills/testing-cpp/SKILL.md +328 -0
- package/vendor/theus-arsenal/skills/testing-csharp/SKILL.md +321 -0
- package/vendor/theus-arsenal/skills/testing-e2e/SKILL.md +325 -0
- package/vendor/theus-arsenal/skills/testing-go/SKILL.md +719 -0
- package/vendor/theus-arsenal/skills/testing-kotlin/SKILL.md +829 -0
- package/vendor/theus-arsenal/skills/testing-perl/SKILL.md +479 -0
- package/vendor/theus-arsenal/skills/testing-protocolos-di-swift/SKILL.md +196 -0
- package/vendor/theus-arsenal/skills/testing-python/SKILL.md +815 -0
- package/vendor/theus-arsenal/skills/testing-react/SKILL.md +421 -0
- package/vendor/theus-arsenal/skills/testing-rust/SKILL.md +506 -0
- package/vendor/theus-arsenal/skills/tours-de-codigo/SKILL.md +252 -0
- package/vendor/theus-arsenal/skills/traduccion-documentos-visado/SKILL.md +121 -0
- package/vendor/theus-arsenal/skills/ui-a-vue/SKILL.md +141 -0
- package/vendor/theus-arsenal/skills/validacion-config-red/SKILL.md +211 -0
- package/vendor/theus-arsenal/skills/verificacion-django/SKILL.md +470 -0
- package/vendor/theus-arsenal/skills/verificacion-factual/SKILL.md +142 -0
- package/vendor/theus-arsenal/skills/verificacion-laravel/SKILL.md +184 -0
- package/vendor/theus-arsenal/skills/verificacion-quarkus/SKILL.md +485 -0
- package/vendor/theus-arsenal/skills/verificacion-springboot/SKILL.md +237 -0
- package/vendor/theus-arsenal/skills/videodb/SKILL.md +374 -0
- package/vendor/theus-arsenal/skills/videodb/reference/api-reference.md +550 -0
- package/vendor/theus-arsenal/skills/videodb/reference/capture-reference.md +407 -0
- package/vendor/theus-arsenal/skills/videodb/reference/capture.md +101 -0
- package/vendor/theus-arsenal/skills/videodb/reference/editor.md +443 -0
- package/vendor/theus-arsenal/skills/videodb/reference/generative.md +331 -0
- package/vendor/theus-arsenal/skills/videodb/reference/rtstream-reference.md +564 -0
- package/vendor/theus-arsenal/skills/videodb/reference/rtstream.md +65 -0
- package/vendor/theus-arsenal/skills/videodb/reference/search.md +230 -0
- package/vendor/theus-arsenal/skills/videodb/reference/streaming.md +406 -0
- package/vendor/theus-arsenal/skills/videodb/reference/use-cases.md +118 -0
- package/vendor/theus-arsenal/skills/videodb/scripts/ws_listener.py +279 -0
- package/vendor/theus-arsenal/skills/videos-manim/SKILL.md +91 -0
- package/vendor/theus-arsenal/skills/videos-manim/assets/network_graph_scene.py +52 -0
- package/vendor/theus-arsenal/skills/vigilancia-canary/SKILL.md +108 -0
- package/vendor/theus-arsenal/skills/voz-de-marca/SKILL.md +106 -0
|
@@ -0,0 +1,717 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: patrones-kotlin
|
|
3
|
+
description: Patrones idiomáticos de Kotlin para aplicaciones robustas y mantenibles — null safety, inmutabilidad, sealed classes, corrutinas y Flow, funciones de extensión, builders DSL y Gradle Kotlin DSL.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Patrones de desarrollo en Kotlin
|
|
7
|
+
|
|
8
|
+
Patrones idiomáticos de Kotlin y buenas prácticas para construir aplicaciones robustas, eficientes y mantenibles.
|
|
9
|
+
|
|
10
|
+
## Cuándo usarla
|
|
11
|
+
|
|
12
|
+
- Al escribir código Kotlin nuevo
|
|
13
|
+
- Al revisar código Kotlin
|
|
14
|
+
- Al refactorizar código Kotlin existente
|
|
15
|
+
- Al diseñar módulos o librerías en Kotlin
|
|
16
|
+
- Al configurar builds con Gradle Kotlin DSL
|
|
17
|
+
|
|
18
|
+
## Cómo funciona
|
|
19
|
+
|
|
20
|
+
Esta skill impone convenciones idiomáticas de Kotlin en siete áreas clave: null safety mediante el sistema de tipos y los operadores de llamada segura, inmutabilidad con `val` y `copy()` en data classes, sealed classes e interfaces para jerarquías de tipos exhaustivas, concurrencia estructurada con corrutinas y `Flow`, funciones de extensión para añadir comportamiento sin herencia, builders DSL con seguridad de tipos usando `@DslMarker` y lambdas con receptor, y Gradle Kotlin DSL para la configuración del build.
|
|
21
|
+
|
|
22
|
+
## Ejemplos
|
|
23
|
+
|
|
24
|
+
**Null safety con el operador Elvis:**
|
|
25
|
+
```kotlin
|
|
26
|
+
fun getUserEmail(userId: String): String {
|
|
27
|
+
val user = userRepository.findById(userId)
|
|
28
|
+
return user?.email ?: "desconocido@example.com"
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Sealed class para resultados exhaustivos:**
|
|
33
|
+
```kotlin
|
|
34
|
+
sealed class Result<out T> {
|
|
35
|
+
data class Success<T>(val data: T) : Result<T>()
|
|
36
|
+
data class Failure(val error: AppError) : Result<Nothing>()
|
|
37
|
+
data object Loading : Result<Nothing>()
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**Concurrencia estructurada con async/await:**
|
|
42
|
+
```kotlin
|
|
43
|
+
suspend fun fetchUserWithPosts(userId: String): UserProfile =
|
|
44
|
+
coroutineScope {
|
|
45
|
+
val user = async { userService.getUser(userId) }
|
|
46
|
+
val posts = async { postService.getUserPosts(userId) }
|
|
47
|
+
UserProfile(user = user.await(), posts = posts.await())
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Principios fundamentales
|
|
52
|
+
|
|
53
|
+
### 1. Null safety
|
|
54
|
+
|
|
55
|
+
El sistema de tipos de Kotlin distingue tipos anulables y no anulables. Aprovéchalo al máximo.
|
|
56
|
+
|
|
57
|
+
```kotlin
|
|
58
|
+
// Bien: tipos no anulables por defecto
|
|
59
|
+
fun getUser(id: String): User {
|
|
60
|
+
return userRepository.findById(id)
|
|
61
|
+
?: throw UserNotFoundException("Usuario $id no encontrado")
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Bien: llamadas seguras y operador Elvis
|
|
65
|
+
fun getUserEmail(userId: String): String {
|
|
66
|
+
val user = userRepository.findById(userId)
|
|
67
|
+
return user?.email ?: "desconocido@example.com"
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Mal: desempaquetado forzado de tipos anulables
|
|
71
|
+
fun getUserEmail(userId: String): String {
|
|
72
|
+
val user = userRepository.findById(userId)
|
|
73
|
+
return user!!.email // Lanza NPE si es null
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 2. Inmutabilidad por defecto
|
|
78
|
+
|
|
79
|
+
Prefiere `val` sobre `var` y colecciones inmutables sobre mutables.
|
|
80
|
+
|
|
81
|
+
```kotlin
|
|
82
|
+
// Bien: datos inmutables
|
|
83
|
+
data class User(
|
|
84
|
+
val id: String,
|
|
85
|
+
val name: String,
|
|
86
|
+
val email: String,
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
// Bien: transformar con copy()
|
|
90
|
+
fun updateEmail(user: User, newEmail: String): User =
|
|
91
|
+
user.copy(email = newEmail)
|
|
92
|
+
|
|
93
|
+
// Bien: colecciones inmutables
|
|
94
|
+
val users: List<User> = listOf(user1, user2)
|
|
95
|
+
val filtered = users.filter { it.email.isNotBlank() }
|
|
96
|
+
|
|
97
|
+
// Mal: estado mutable
|
|
98
|
+
var currentUser: User? = null // Evita el estado global mutable
|
|
99
|
+
val mutableUsers = mutableListOf<User>() // Evítalo salvo que sea realmente necesario
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 3. Cuerpos de expresión y funciones de una sola expresión
|
|
103
|
+
|
|
104
|
+
Usa cuerpos de expresión para funciones concisas y legibles.
|
|
105
|
+
|
|
106
|
+
```kotlin
|
|
107
|
+
// Bien: cuerpo de expresión
|
|
108
|
+
fun isAdult(age: Int): Boolean = age >= 18
|
|
109
|
+
|
|
110
|
+
fun formatFullName(first: String, last: String): String =
|
|
111
|
+
"$first $last".trim()
|
|
112
|
+
|
|
113
|
+
fun User.displayName(): String =
|
|
114
|
+
name.ifBlank { email.substringBefore('@') }
|
|
115
|
+
|
|
116
|
+
// Bien: when como expresión
|
|
117
|
+
fun statusMessage(code: Int): String = when (code) {
|
|
118
|
+
200 -> "OK"
|
|
119
|
+
404 -> "No encontrado"
|
|
120
|
+
500 -> "Error interno del servidor"
|
|
121
|
+
else -> "Estado desconocido: $code"
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Mal: cuerpo de bloque innecesario
|
|
125
|
+
fun isAdult(age: Int): Boolean {
|
|
126
|
+
return age >= 18
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 4. Data classes para objetos de valor
|
|
131
|
+
|
|
132
|
+
Usa data classes para tipos cuyo propósito principal es contener datos.
|
|
133
|
+
|
|
134
|
+
```kotlin
|
|
135
|
+
// Bien: data class con copy, equals, hashCode, toString
|
|
136
|
+
data class CreateUserRequest(
|
|
137
|
+
val name: String,
|
|
138
|
+
val email: String,
|
|
139
|
+
val role: Role = Role.USER,
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
// Bien: value class para seguridad de tipos (cero coste en tiempo de ejecución)
|
|
143
|
+
@JvmInline
|
|
144
|
+
value class UserId(val value: String) {
|
|
145
|
+
init {
|
|
146
|
+
require(value.isNotBlank()) { "UserId no puede estar en blanco" }
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@JvmInline
|
|
151
|
+
value class Email(val value: String) {
|
|
152
|
+
init {
|
|
153
|
+
require('@' in value) { "Email inválido: $value" }
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
fun getUser(id: UserId): User = userRepository.findById(id)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Sealed classes e interfaces
|
|
161
|
+
|
|
162
|
+
### Modelar jerarquías restringidas
|
|
163
|
+
|
|
164
|
+
```kotlin
|
|
165
|
+
// Bien: sealed class para when exhaustivo
|
|
166
|
+
sealed class Result<out T> {
|
|
167
|
+
data class Success<T>(val data: T) : Result<T>()
|
|
168
|
+
data class Failure(val error: AppError) : Result<Nothing>()
|
|
169
|
+
data object Loading : Result<Nothing>()
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
fun <T> Result<T>.getOrNull(): T? = when (this) {
|
|
173
|
+
is Result.Success -> data
|
|
174
|
+
is Result.Failure -> null
|
|
175
|
+
is Result.Loading -> null
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
fun <T> Result<T>.getOrThrow(): T = when (this) {
|
|
179
|
+
is Result.Success -> data
|
|
180
|
+
is Result.Failure -> throw error.toException()
|
|
181
|
+
is Result.Loading -> throw IllegalStateException("Aún cargando")
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Sealed interfaces para respuestas de API
|
|
186
|
+
|
|
187
|
+
```kotlin
|
|
188
|
+
sealed interface ApiError {
|
|
189
|
+
val message: String
|
|
190
|
+
|
|
191
|
+
data class NotFound(override val message: String) : ApiError
|
|
192
|
+
data class Unauthorized(override val message: String) : ApiError
|
|
193
|
+
data class Validation(
|
|
194
|
+
override val message: String,
|
|
195
|
+
val field: String,
|
|
196
|
+
) : ApiError
|
|
197
|
+
data class Internal(
|
|
198
|
+
override val message: String,
|
|
199
|
+
val cause: Throwable? = null,
|
|
200
|
+
) : ApiError
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
fun ApiError.toStatusCode(): Int = when (this) {
|
|
204
|
+
is ApiError.NotFound -> 404
|
|
205
|
+
is ApiError.Unauthorized -> 401
|
|
206
|
+
is ApiError.Validation -> 422
|
|
207
|
+
is ApiError.Internal -> 500
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
## Funciones de ámbito (scope functions)
|
|
212
|
+
|
|
213
|
+
### Cuándo usar cada una
|
|
214
|
+
|
|
215
|
+
```kotlin
|
|
216
|
+
// let: transformar un valor anulable o un resultado con ámbito
|
|
217
|
+
val length: Int? = name?.let { it.trim().length }
|
|
218
|
+
|
|
219
|
+
// apply: configurar un objeto (devuelve el objeto)
|
|
220
|
+
val user = User().apply {
|
|
221
|
+
name = "Alice"
|
|
222
|
+
email = "alice@example.com"
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// also: efectos secundarios (devuelve el objeto)
|
|
226
|
+
val user = createUser(request).also { logger.info("Usuario creado: ${it.id}") }
|
|
227
|
+
|
|
228
|
+
// run: ejecutar un bloque con receptor (devuelve el resultado)
|
|
229
|
+
val result = connection.run {
|
|
230
|
+
prepareStatement(sql)
|
|
231
|
+
executeQuery()
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// with: forma no-extensión de run
|
|
235
|
+
val csv = with(StringBuilder()) {
|
|
236
|
+
appendLine("name,email")
|
|
237
|
+
users.forEach { appendLine("${it.name},${it.email}") }
|
|
238
|
+
toString()
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Antipatrones
|
|
243
|
+
|
|
244
|
+
```kotlin
|
|
245
|
+
// Mal: anidar funciones de ámbito
|
|
246
|
+
user?.let { u ->
|
|
247
|
+
u.address?.let { addr ->
|
|
248
|
+
addr.city?.let { city ->
|
|
249
|
+
println(city) // Difícil de leer
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Bien: encadenar llamadas seguras
|
|
255
|
+
val city = user?.address?.city
|
|
256
|
+
city?.let { println(it) }
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Funciones de extensión
|
|
260
|
+
|
|
261
|
+
### Añadir funcionalidad sin herencia
|
|
262
|
+
|
|
263
|
+
```kotlin
|
|
264
|
+
// Bien: extensiones específicas del dominio
|
|
265
|
+
fun String.toSlug(): String =
|
|
266
|
+
lowercase()
|
|
267
|
+
.replace(Regex("[^a-z0-9\\s-]"), "")
|
|
268
|
+
.replace(Regex("\\s+"), "-")
|
|
269
|
+
.trim('-')
|
|
270
|
+
|
|
271
|
+
fun Instant.toLocalDate(zone: ZoneId = ZoneId.systemDefault()): LocalDate =
|
|
272
|
+
atZone(zone).toLocalDate()
|
|
273
|
+
|
|
274
|
+
// Bien: extensiones de colecciones
|
|
275
|
+
fun <T> List<T>.second(): T = this[1]
|
|
276
|
+
|
|
277
|
+
fun <T> List<T>.secondOrNull(): T? = getOrNull(1)
|
|
278
|
+
|
|
279
|
+
// Bien: extensiones con ámbito acotado (sin contaminar el espacio de nombres global)
|
|
280
|
+
class UserService {
|
|
281
|
+
private fun User.isActive(): Boolean =
|
|
282
|
+
status == Status.ACTIVE && lastLogin.isAfter(Instant.now().minus(30, ChronoUnit.DAYS))
|
|
283
|
+
|
|
284
|
+
fun getActiveUsers(): List<User> = userRepository.findAll().filter { it.isActive() }
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Corrutinas
|
|
289
|
+
|
|
290
|
+
### Concurrencia estructurada
|
|
291
|
+
|
|
292
|
+
```kotlin
|
|
293
|
+
// Bien: concurrencia estructurada con coroutineScope
|
|
294
|
+
suspend fun fetchUserWithPosts(userId: String): UserProfile =
|
|
295
|
+
coroutineScope {
|
|
296
|
+
val userDeferred = async { userService.getUser(userId) }
|
|
297
|
+
val postsDeferred = async { postService.getUserPosts(userId) }
|
|
298
|
+
|
|
299
|
+
UserProfile(
|
|
300
|
+
user = userDeferred.await(),
|
|
301
|
+
posts = postsDeferred.await(),
|
|
302
|
+
)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Bien: supervisorScope cuando los hijos pueden fallar de forma independiente
|
|
306
|
+
suspend fun fetchDashboard(userId: String): Dashboard =
|
|
307
|
+
supervisorScope {
|
|
308
|
+
val user = async { userService.getUser(userId) }
|
|
309
|
+
val notifications = async { notificationService.getRecent(userId) }
|
|
310
|
+
val recommendations = async { recommendationService.getFor(userId) }
|
|
311
|
+
|
|
312
|
+
Dashboard(
|
|
313
|
+
user = user.await(),
|
|
314
|
+
notifications = try {
|
|
315
|
+
notifications.await()
|
|
316
|
+
} catch (e: CancellationException) {
|
|
317
|
+
throw e
|
|
318
|
+
} catch (e: Exception) {
|
|
319
|
+
emptyList()
|
|
320
|
+
},
|
|
321
|
+
recommendations = try {
|
|
322
|
+
recommendations.await()
|
|
323
|
+
} catch (e: CancellationException) {
|
|
324
|
+
throw e
|
|
325
|
+
} catch (e: Exception) {
|
|
326
|
+
emptyList()
|
|
327
|
+
},
|
|
328
|
+
)
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Flow para streams reactivos
|
|
333
|
+
|
|
334
|
+
```kotlin
|
|
335
|
+
// Bien: flow frío con manejo de errores adecuado
|
|
336
|
+
fun observeUsers(): Flow<List<User>> = flow {
|
|
337
|
+
while (currentCoroutineContext().isActive) {
|
|
338
|
+
val users = userRepository.findAll()
|
|
339
|
+
emit(users)
|
|
340
|
+
delay(5.seconds)
|
|
341
|
+
}
|
|
342
|
+
}.catch { e ->
|
|
343
|
+
logger.error("Error observando usuarios", e)
|
|
344
|
+
emit(emptyList())
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Bien: operadores de Flow
|
|
348
|
+
fun searchUsers(query: Flow<String>): Flow<List<User>> =
|
|
349
|
+
query
|
|
350
|
+
.debounce(300.milliseconds)
|
|
351
|
+
.distinctUntilChanged()
|
|
352
|
+
.filter { it.length >= 2 }
|
|
353
|
+
.mapLatest { q -> userRepository.search(q) }
|
|
354
|
+
.catch { emit(emptyList()) }
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Cancelación y limpieza
|
|
358
|
+
|
|
359
|
+
```kotlin
|
|
360
|
+
// Bien: respetar la cancelación
|
|
361
|
+
suspend fun processItems(items: List<Item>) {
|
|
362
|
+
items.forEach { item ->
|
|
363
|
+
ensureActive() // Comprueba la cancelación antes de trabajo costoso
|
|
364
|
+
processItem(item)
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Bien: limpieza con try/finally
|
|
369
|
+
suspend fun acquireAndProcess() {
|
|
370
|
+
val resource = acquireResource()
|
|
371
|
+
try {
|
|
372
|
+
resource.process()
|
|
373
|
+
} finally {
|
|
374
|
+
withContext(NonCancellable) {
|
|
375
|
+
resource.release() // Libera siempre, incluso ante cancelación
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
## Delegación
|
|
382
|
+
|
|
383
|
+
### Delegación de propiedades
|
|
384
|
+
|
|
385
|
+
```kotlin
|
|
386
|
+
// Inicialización perezosa
|
|
387
|
+
val expensiveData: List<User> by lazy {
|
|
388
|
+
userRepository.findAll()
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
// Propiedad observable
|
|
392
|
+
var name: String by Delegates.observable("inicial") { _, old, new ->
|
|
393
|
+
logger.info("Nombre cambiado de '$old' a '$new'")
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Propiedades respaldadas por un mapa
|
|
397
|
+
class Config(private val map: Map<String, Any?>) {
|
|
398
|
+
val host: String by map
|
|
399
|
+
val port: Int by map
|
|
400
|
+
val debug: Boolean by map
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
val config = Config(mapOf("host" to "localhost", "port" to 8080, "debug" to true))
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### Delegación de interfaces
|
|
407
|
+
|
|
408
|
+
```kotlin
|
|
409
|
+
// Bien: delegar la implementación de una interfaz
|
|
410
|
+
class LoggingUserRepository(
|
|
411
|
+
private val delegate: UserRepository,
|
|
412
|
+
private val logger: Logger,
|
|
413
|
+
) : UserRepository by delegate {
|
|
414
|
+
// Sobrescribe solo lo que necesita logging
|
|
415
|
+
override suspend fun findById(id: String): User? {
|
|
416
|
+
logger.info("Buscando usuario por id: $id")
|
|
417
|
+
return delegate.findById(id).also {
|
|
418
|
+
logger.info("Usuario encontrado: ${it?.name ?: "null"}")
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
## Builders DSL
|
|
425
|
+
|
|
426
|
+
### Builders con seguridad de tipos
|
|
427
|
+
|
|
428
|
+
```kotlin
|
|
429
|
+
// Bien: DSL con @DslMarker
|
|
430
|
+
@DslMarker
|
|
431
|
+
annotation class HtmlDsl
|
|
432
|
+
|
|
433
|
+
@HtmlDsl
|
|
434
|
+
class HTML {
|
|
435
|
+
private val children = mutableListOf<Element>()
|
|
436
|
+
|
|
437
|
+
fun head(init: Head.() -> Unit) {
|
|
438
|
+
children += Head().apply(init)
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
fun body(init: Body.() -> Unit) {
|
|
442
|
+
children += Body().apply(init)
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
override fun toString(): String = children.joinToString("\n")
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
fun html(init: HTML.() -> Unit): HTML = HTML().apply(init)
|
|
449
|
+
|
|
450
|
+
// Uso
|
|
451
|
+
val page = html {
|
|
452
|
+
head { title("Mi página") }
|
|
453
|
+
body {
|
|
454
|
+
h1("Bienvenido")
|
|
455
|
+
p("¡Hola, mundo!")
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
```
|
|
459
|
+
|
|
460
|
+
### DSL de configuración
|
|
461
|
+
|
|
462
|
+
```kotlin
|
|
463
|
+
data class ServerConfig(
|
|
464
|
+
val host: String = "0.0.0.0",
|
|
465
|
+
val port: Int = 8080,
|
|
466
|
+
val ssl: SslConfig? = null,
|
|
467
|
+
val database: DatabaseConfig? = null,
|
|
468
|
+
)
|
|
469
|
+
|
|
470
|
+
data class SslConfig(val certPath: String, val keyPath: String)
|
|
471
|
+
data class DatabaseConfig(val url: String, val maxPoolSize: Int = 10)
|
|
472
|
+
|
|
473
|
+
class ServerConfigBuilder {
|
|
474
|
+
var host: String = "0.0.0.0"
|
|
475
|
+
var port: Int = 8080
|
|
476
|
+
private var ssl: SslConfig? = null
|
|
477
|
+
private var database: DatabaseConfig? = null
|
|
478
|
+
|
|
479
|
+
fun ssl(certPath: String, keyPath: String) {
|
|
480
|
+
ssl = SslConfig(certPath, keyPath)
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
fun database(url: String, maxPoolSize: Int = 10) {
|
|
484
|
+
database = DatabaseConfig(url, maxPoolSize)
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
fun build(): ServerConfig = ServerConfig(host, port, ssl, database)
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
fun serverConfig(init: ServerConfigBuilder.() -> Unit): ServerConfig =
|
|
491
|
+
ServerConfigBuilder().apply(init).build()
|
|
492
|
+
|
|
493
|
+
// Uso
|
|
494
|
+
val config = serverConfig {
|
|
495
|
+
host = "0.0.0.0"
|
|
496
|
+
port = 443
|
|
497
|
+
ssl("/certs/cert.pem", "/certs/key.pem")
|
|
498
|
+
database("jdbc:postgresql://localhost:5432/mydb", maxPoolSize = 20)
|
|
499
|
+
}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
## Sequences para evaluación perezosa
|
|
503
|
+
|
|
504
|
+
```kotlin
|
|
505
|
+
// Bien: usa sequences en colecciones grandes con varias operaciones encadenadas
|
|
506
|
+
val result = users.asSequence()
|
|
507
|
+
.filter { it.isActive }
|
|
508
|
+
.map { it.email }
|
|
509
|
+
.filter { it.endsWith("@empresa.com") }
|
|
510
|
+
.take(10)
|
|
511
|
+
.toList()
|
|
512
|
+
|
|
513
|
+
// Bien: generar secuencias infinitas
|
|
514
|
+
val fibonacci: Sequence<Long> = sequence {
|
|
515
|
+
var a = 0L
|
|
516
|
+
var b = 1L
|
|
517
|
+
while (true) {
|
|
518
|
+
yield(a)
|
|
519
|
+
val next = a + b
|
|
520
|
+
a = b
|
|
521
|
+
b = next
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
val first20 = fibonacci.take(20).toList()
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
## Gradle Kotlin DSL
|
|
529
|
+
|
|
530
|
+
### Configuración de build.gradle.kts
|
|
531
|
+
|
|
532
|
+
```kotlin
|
|
533
|
+
// Consulta las últimas versiones: https://kotlinlang.org/docs/releases.html
|
|
534
|
+
plugins {
|
|
535
|
+
kotlin("jvm") version "2.3.10"
|
|
536
|
+
kotlin("plugin.serialization") version "2.3.10"
|
|
537
|
+
id("io.ktor.plugin") version "3.4.0"
|
|
538
|
+
id("org.jetbrains.kotlinx.kover") version "0.9.7"
|
|
539
|
+
id("io.gitlab.arturbosch.detekt") version "1.23.8"
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
group = "com.example"
|
|
543
|
+
version = "1.0.0"
|
|
544
|
+
|
|
545
|
+
kotlin {
|
|
546
|
+
jvmToolchain(21)
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
dependencies {
|
|
550
|
+
// Ktor
|
|
551
|
+
implementation("io.ktor:ktor-server-core:3.4.0")
|
|
552
|
+
implementation("io.ktor:ktor-server-netty:3.4.0")
|
|
553
|
+
implementation("io.ktor:ktor-server-content-negotiation:3.4.0")
|
|
554
|
+
implementation("io.ktor:ktor-serialization-kotlinx-json:3.4.0")
|
|
555
|
+
|
|
556
|
+
// Exposed
|
|
557
|
+
implementation("org.jetbrains.exposed:exposed-core:1.0.0")
|
|
558
|
+
implementation("org.jetbrains.exposed:exposed-dao:1.0.0")
|
|
559
|
+
implementation("org.jetbrains.exposed:exposed-jdbc:1.0.0")
|
|
560
|
+
implementation("org.jetbrains.exposed:exposed-kotlin-datetime:1.0.0")
|
|
561
|
+
|
|
562
|
+
// Koin
|
|
563
|
+
implementation("io.insert-koin:koin-ktor:4.2.0")
|
|
564
|
+
|
|
565
|
+
// Corrutinas
|
|
566
|
+
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
|
|
567
|
+
|
|
568
|
+
// Testing
|
|
569
|
+
testImplementation("io.kotest:kotest-runner-junit5:6.1.4")
|
|
570
|
+
testImplementation("io.kotest:kotest-assertions-core:6.1.4")
|
|
571
|
+
testImplementation("io.kotest:kotest-property:6.1.4")
|
|
572
|
+
testImplementation("io.mockk:mockk:1.14.9")
|
|
573
|
+
testImplementation("io.ktor:ktor-server-test-host:3.4.0")
|
|
574
|
+
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.10.2")
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
tasks.withType<Test> {
|
|
578
|
+
useJUnitPlatform()
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
detekt {
|
|
582
|
+
config.setFrom(files("config/detekt/detekt.yml"))
|
|
583
|
+
buildUponDefaultConfig = true
|
|
584
|
+
}
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
## Patrones de manejo de errores
|
|
588
|
+
|
|
589
|
+
### Tipo Result para operaciones de dominio
|
|
590
|
+
|
|
591
|
+
```kotlin
|
|
592
|
+
// Bien: usa el Result de Kotlin o una sealed class propia
|
|
593
|
+
suspend fun createUser(request: CreateUserRequest): Result<User> = runCatching {
|
|
594
|
+
require(request.name.isNotBlank()) { "El nombre no puede estar en blanco" }
|
|
595
|
+
require('@' in request.email) { "Formato de email inválido" }
|
|
596
|
+
|
|
597
|
+
val user = User(
|
|
598
|
+
id = UserId(UUID.randomUUID().toString()),
|
|
599
|
+
name = request.name,
|
|
600
|
+
email = Email(request.email),
|
|
601
|
+
)
|
|
602
|
+
userRepository.save(user)
|
|
603
|
+
user
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
// Bien: encadenar resultados
|
|
607
|
+
val displayName = createUser(request)
|
|
608
|
+
.map { it.name }
|
|
609
|
+
.getOrElse { "Desconocido" }
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
### require, check, error
|
|
613
|
+
|
|
614
|
+
```kotlin
|
|
615
|
+
// Bien: precondiciones con mensajes claros
|
|
616
|
+
fun withdraw(account: Account, amount: Money): Account {
|
|
617
|
+
require(amount.value > 0) { "El importe debe ser positivo: $amount" }
|
|
618
|
+
check(account.balance >= amount) { "Saldo insuficiente: ${account.balance} < $amount" }
|
|
619
|
+
|
|
620
|
+
return account.copy(balance = account.balance - amount)
|
|
621
|
+
}
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
## Operaciones sobre colecciones
|
|
625
|
+
|
|
626
|
+
### Procesamiento idiomático de colecciones
|
|
627
|
+
|
|
628
|
+
```kotlin
|
|
629
|
+
// Bien: operaciones encadenadas
|
|
630
|
+
val activeAdminEmails: List<String> = users
|
|
631
|
+
.filter { it.role == Role.ADMIN && it.isActive }
|
|
632
|
+
.sortedBy { it.name }
|
|
633
|
+
.map { it.email }
|
|
634
|
+
|
|
635
|
+
// Bien: agrupación y agregación
|
|
636
|
+
val usersByRole: Map<Role, List<User>> = users.groupBy { it.role }
|
|
637
|
+
|
|
638
|
+
val oldestByRole: Map<Role, User?> = users.groupBy { it.role }
|
|
639
|
+
.mapValues { (_, users) -> users.minByOrNull { it.createdAt } }
|
|
640
|
+
|
|
641
|
+
// Bien: associate para crear mapas
|
|
642
|
+
val usersById: Map<UserId, User> = users.associateBy { it.id }
|
|
643
|
+
|
|
644
|
+
// Bien: partition para dividir
|
|
645
|
+
val (active, inactive) = users.partition { it.isActive }
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
## Referencia rápida: idiomas de Kotlin
|
|
649
|
+
|
|
650
|
+
| Idioma | Descripción |
|
|
651
|
+
|-------|-------------|
|
|
652
|
+
| `val` sobre `var` | Prefiere variables inmutables |
|
|
653
|
+
| `data class` | Para objetos de valor con equals/hashCode/copy |
|
|
654
|
+
| `sealed class/interface` | Para jerarquías de tipos restringidas |
|
|
655
|
+
| `value class` | Para envoltorios con seguridad de tipos y coste cero |
|
|
656
|
+
| `when` como expresión | Coincidencia de patrones exhaustiva |
|
|
657
|
+
| Llamada segura `?.` | Acceso a miembros seguro ante null |
|
|
658
|
+
| Elvis `?:` | Valor por defecto para anulables |
|
|
659
|
+
| `let`/`apply`/`also`/`run`/`with` | Funciones de ámbito para código limpio |
|
|
660
|
+
| Funciones de extensión | Añadir comportamiento sin herencia |
|
|
661
|
+
| `copy()` | Actualizaciones inmutables en data classes |
|
|
662
|
+
| `require`/`check` | Aserciones de precondiciones |
|
|
663
|
+
| Corrutinas `async`/`await` | Ejecución concurrente estructurada |
|
|
664
|
+
| `Flow` | Streams reactivos fríos |
|
|
665
|
+
| `sequence` | Evaluación perezosa |
|
|
666
|
+
| Delegación `by` | Reutilizar implementación sin herencia |
|
|
667
|
+
|
|
668
|
+
## Antipatrones a evitar
|
|
669
|
+
|
|
670
|
+
```kotlin
|
|
671
|
+
// Mal: desempaquetado forzado de tipos anulables
|
|
672
|
+
val name = user!!.name
|
|
673
|
+
|
|
674
|
+
// Mal: fuga de platform types desde Java
|
|
675
|
+
fun getLength(s: String) = s.length // Seguro
|
|
676
|
+
fun getLength(s: String?) = s?.length ?: 0 // Maneja nulls provenientes de Java
|
|
677
|
+
|
|
678
|
+
// Mal: data classes mutables
|
|
679
|
+
data class MutableUser(var name: String, var email: String)
|
|
680
|
+
|
|
681
|
+
// Mal: usar excepciones para control de flujo
|
|
682
|
+
try {
|
|
683
|
+
val user = findUser(id)
|
|
684
|
+
} catch (e: NotFoundException) {
|
|
685
|
+
// No uses excepciones para casos esperados
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
// Bien: usa retorno anulable o Result
|
|
689
|
+
val user: User? = findUserOrNull(id)
|
|
690
|
+
|
|
691
|
+
// Mal: ignorar el ámbito de las corrutinas
|
|
692
|
+
GlobalScope.launch { /* Evita GlobalScope */ }
|
|
693
|
+
|
|
694
|
+
// Bien: usa concurrencia estructurada
|
|
695
|
+
coroutineScope {
|
|
696
|
+
launch { /* Correctamente acotado */ }
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// Mal: funciones de ámbito profundamente anidadas
|
|
700
|
+
user?.let { u ->
|
|
701
|
+
u.address?.let { a ->
|
|
702
|
+
a.city?.let { c -> process(c) }
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
// Bien: cadena directa segura ante null
|
|
707
|
+
user?.address?.city?.let { process(it) }
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
**Recuerda**: el código Kotlin debe ser conciso pero legible. Aprovecha el sistema de tipos para la seguridad, prefiere la inmutabilidad y usa corrutinas para la concurrencia. Ante la duda, deja que el compilador te ayude.
|
|
711
|
+
|
|
712
|
+
## Skills relacionadas
|
|
713
|
+
|
|
714
|
+
- `testing-kotlin` — patrones de testing con Kotest, MockK y Kover
|
|
715
|
+
- `corrutinas-flows-kotlin` — corrutinas y Flow en profundidad
|
|
716
|
+
- `patrones-kotlin-ktor` — patrones de servidor con Ktor
|
|
717
|
+
- `patrones-kotlin-exposed` — acceso a datos con Exposed
|