theus-cli-darwin-x64 0.2.84
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/LICENSE +42 -0
- package/README.md +295 -0
- package/RELEASE.json +18 -0
- package/assets/brand-official/v1.0/logo/theus-lockup-negative-official.png +0 -0
- package/assets/brand-official/v1.0/logo/theus-lockup-primary-dark-official.png +0 -0
- package/assets/fonts/satoshi/satoshi-300.woff2 +0 -0
- package/assets/fonts/satoshi/satoshi-400.woff2 +0 -0
- package/assets/fonts/satoshi/satoshi-500.woff2 +0 -0
- package/assets/fonts/satoshi/satoshi-700.woff2 +0 -0
- package/assets/fonts/satoshi/satoshi-900.woff2 +0 -0
- package/assets/windows-store/Square150x150Logo.png +0 -0
- package/assets/windows-store/Square44x44Logo.png +0 -0
- package/assets/windows-store/StoreLogo.png +0 -0
- package/assets/windows-store/theus-store-icon-master.png +0 -0
- package/bin/theus +0 -0
- package/package.json +18 -0
- package/vendor/theus-arsenal/.arsenal-nombres-ola2.json +6 -0
- package/vendor/theus-arsenal/.arsenal-nombres-ola3.json +72 -0
- package/vendor/theus-arsenal/.mailmap +2 -0
- package/vendor/theus-arsenal/.theus-plugin/marketplace.json +25 -0
- package/vendor/theus-arsenal/.theus-plugin/plugin.json +20 -0
- package/vendor/theus-arsenal/AUTHORS.md +8 -0
- package/vendor/theus-arsenal/CLEANROOM_REPLACEMENT_PLAN.md +11 -0
- package/vendor/theus-arsenal/LICENSE +26 -0
- package/vendor/theus-arsenal/PROVENANCE.md +9 -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/package.json +6 -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,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: patrones-nuxt4
|
|
3
|
+
description: Patrones de aplicaciones Nuxt 4 para seguridad de hidratación, rendimiento, route rules, carga perezosa y obtención de datos segura para SSR con useFetch y useAsyncData.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Patrones de Nuxt 4
|
|
7
|
+
|
|
8
|
+
Úsala al construir o depurar aplicaciones Nuxt 4 con SSR, renderizado híbrido, route rules u obtención de datos a nivel de página.
|
|
9
|
+
|
|
10
|
+
## Cuándo activarla
|
|
11
|
+
|
|
12
|
+
- Desajustes de hidratación entre el HTML del servidor y el estado del cliente
|
|
13
|
+
- Decisiones de renderizado por ruta como prerender, SWR, ISR o secciones solo de cliente
|
|
14
|
+
- Trabajo de rendimiento sobre carga perezosa, hidratación perezosa o tamaño del payload
|
|
15
|
+
- Obtención de datos de página o componente con `useFetch`, `useAsyncData` o `$fetch`
|
|
16
|
+
- Problemas de enrutamiento de Nuxt ligados a parámetros de ruta, middleware o diferencias SSR/cliente
|
|
17
|
+
|
|
18
|
+
## Seguridad de hidratación
|
|
19
|
+
|
|
20
|
+
- Mantén el primer render determinista. No pongas `Date.now()`, `Math.random()`, APIs exclusivas del navegador ni lecturas de storage directamente en el estado de plantilla renderizado por SSR.
|
|
21
|
+
- Mueve la lógica exclusiva del navegador detrás de `onMounted()`, `import.meta.client`, `ClientOnly` o un componente `.client.vue` cuando el servidor no pueda producir el mismo marcado.
|
|
22
|
+
- Usa el composable `useRoute()` de Nuxt, no el de `vue-router`.
|
|
23
|
+
- No uses `route.fullPath` para gobernar marcado renderizado por SSR. Los fragmentos de URL son solo de cliente, lo que puede crear desajustes de hidratación.
|
|
24
|
+
- Trata `ssr: false` como una vía de escape para zonas genuinamente exclusivas del navegador, no como solución por defecto a los desajustes.
|
|
25
|
+
|
|
26
|
+
## Obtención de datos
|
|
27
|
+
|
|
28
|
+
- Prefiere `await useFetch()` para lecturas de API seguras para SSR en páginas y componentes. Reenvía los datos obtenidos en el servidor al payload de Nuxt y evita una segunda petición en la hidratación.
|
|
29
|
+
- Usa `useAsyncData()` cuando el fetcher no sea una simple llamada a `$fetch()`, cuando necesites una clave personalizada o cuando compongas varias fuentes asíncronas.
|
|
30
|
+
- Dale a `useAsyncData()` una clave estable para reutilizar caché y tener un comportamiento de refresh predecible.
|
|
31
|
+
- Mantén los handlers de `useAsyncData()` libres de efectos secundarios. Pueden ejecutarse durante el SSR y la hidratación.
|
|
32
|
+
- Usa `$fetch()` para escrituras disparadas por el usuario o acciones solo de cliente, no para datos de página de nivel superior que deban hidratarse desde el SSR.
|
|
33
|
+
- Usa `lazy: true`, `useLazyFetch()` o `useLazyAsyncData()` para datos no críticos que no deban bloquear la navegación. Maneja `status === 'pending'` en la UI.
|
|
34
|
+
- Usa `server: false` solo para datos que no se necesiten para el SEO ni el primer pintado.
|
|
35
|
+
- Recorta el tamaño del payload con `pick` y prefiere payloads menos profundos cuando la reactividad profunda sea innecesaria.
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
const route = useRoute()
|
|
39
|
+
|
|
40
|
+
const { data: article, status, error, refresh } = await useAsyncData(
|
|
41
|
+
() => `article:${route.params.slug}`,
|
|
42
|
+
() => $fetch(`/api/articles/${route.params.slug}`),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
const { data: comments } = await useFetch(`/api/articles/${route.params.slug}/comments`, {
|
|
46
|
+
lazy: true,
|
|
47
|
+
server: false,
|
|
48
|
+
})
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Route rules
|
|
52
|
+
|
|
53
|
+
Prefiere `routeRules` en `nuxt.config.ts` para la estrategia de renderizado y caché:
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
export default defineNuxtConfig({
|
|
57
|
+
routeRules: {
|
|
58
|
+
'/': { prerender: true },
|
|
59
|
+
'/products/**': { swr: 3600 },
|
|
60
|
+
'/blog/**': { isr: true },
|
|
61
|
+
'/admin/**': { ssr: false },
|
|
62
|
+
'/api/**': { cache: { maxAge: 60 * 60 } },
|
|
63
|
+
},
|
|
64
|
+
})
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
- `prerender`: HTML estático en tiempo de build
|
|
68
|
+
- `swr`: servir contenido cacheado y revalidar en segundo plano
|
|
69
|
+
- `isr`: regeneración estática incremental en plataformas compatibles
|
|
70
|
+
- `ssr: false`: ruta renderizada en el cliente
|
|
71
|
+
- `cache` o `redirect`: comportamiento de respuesta a nivel de Nitro
|
|
72
|
+
|
|
73
|
+
Elige route rules por grupo de rutas, no globalmente. Las páginas de marketing, los catálogos, los dashboards y las APIs suelen necesitar estrategias distintas.
|
|
74
|
+
|
|
75
|
+
## Carga perezosa y rendimiento
|
|
76
|
+
|
|
77
|
+
- Nuxt ya divide el código por página y ruta. Mantén fronteras de ruta significativas antes de micro-optimizar la división por componentes.
|
|
78
|
+
- Usa el prefijo `Lazy` para importar dinámicamente componentes no críticos.
|
|
79
|
+
- Renderiza condicionalmente los componentes lazy con `v-if` para que el chunk no se cargue hasta que la UI realmente lo necesite.
|
|
80
|
+
- Usa hidratación perezosa para UI interactiva no crítica o por debajo del pliegue.
|
|
81
|
+
|
|
82
|
+
```vue
|
|
83
|
+
<template>
|
|
84
|
+
<LazyRecommendations v-if="showRecommendations" />
|
|
85
|
+
<LazyProductGallery hydrate-on-visible />
|
|
86
|
+
</template>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- Para estrategias personalizadas, usa `defineLazyHydrationComponent()` con una estrategia de visibilidad o de inactividad.
|
|
90
|
+
- La hidratación perezosa de Nuxt funciona con componentes de un solo archivo. Pasar props nuevas a un componente hidratado perezosamente dispara la hidratación de inmediato.
|
|
91
|
+
- Usa `NuxtLink` para la navegación interna para que Nuxt pueda prefetchear los componentes de ruta y los payloads generados.
|
|
92
|
+
|
|
93
|
+
## Lista de verificación de revisión
|
|
94
|
+
|
|
95
|
+
- El primer render SSR y el render hidratado del cliente producen el mismo marcado
|
|
96
|
+
- Los datos de página usan `useFetch` o `useAsyncData`, no `$fetch` de nivel superior
|
|
97
|
+
- Los datos no críticos son lazy y tienen UI de carga explícita
|
|
98
|
+
- Las route rules coinciden con los requisitos de SEO y frescura de la página
|
|
99
|
+
- Las islas interactivas pesadas se cargan o hidratan de forma perezosa
|
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: patrones-perl
|
|
3
|
+
description: Idiomas de Perl moderno 5.36+, buenas prácticas y convenciones para construir aplicaciones Perl robustas y mantenibles.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Patrones de desarrollo en Perl moderno
|
|
7
|
+
|
|
8
|
+
Patrones idiomáticos de Perl 5.36+ y buenas prácticas para construir aplicaciones robustas y mantenibles.
|
|
9
|
+
|
|
10
|
+
## Cuándo usarla
|
|
11
|
+
|
|
12
|
+
- Al escribir código o módulos Perl nuevos.
|
|
13
|
+
- Al revisar código Perl en busca de cumplimiento idiomático.
|
|
14
|
+
- Al refactorizar Perl heredado hacia estándares modernos.
|
|
15
|
+
- Al diseñar la arquitectura de módulos Perl.
|
|
16
|
+
- Al migrar código anterior a 5.36 a Perl moderno.
|
|
17
|
+
|
|
18
|
+
## Cómo funciona
|
|
19
|
+
|
|
20
|
+
Aplica estos patrones como un sesgo hacia los valores por defecto de Perl 5.36+ moderno: signatures, módulos explícitos, manejo de errores enfocado y fronteras testeables. Los ejemplos siguientes están pensados para copiarse como punto de partida y luego ajustarse a la aplicación real, la pila de dependencias y el modelo de despliegue que tengas delante.
|
|
21
|
+
|
|
22
|
+
## Principios fundamentales
|
|
23
|
+
|
|
24
|
+
### 1. Usa el pragma `v5.36`
|
|
25
|
+
|
|
26
|
+
Un único `use v5.36` reemplaza el boilerplate antiguo y habilita strict, warnings y signatures de subrutinas.
|
|
27
|
+
|
|
28
|
+
```perl
|
|
29
|
+
# Bien: preámbulo moderno
|
|
30
|
+
use v5.36;
|
|
31
|
+
|
|
32
|
+
sub greet($name) {
|
|
33
|
+
say "¡Hola, $name!";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Mal: boilerplate heredado
|
|
37
|
+
use strict;
|
|
38
|
+
use warnings;
|
|
39
|
+
use feature 'say', 'signatures';
|
|
40
|
+
no warnings 'experimental::signatures';
|
|
41
|
+
|
|
42
|
+
sub greet {
|
|
43
|
+
my ($name) = @_;
|
|
44
|
+
say "¡Hola, $name!";
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 2. Signatures de subrutinas
|
|
49
|
+
|
|
50
|
+
Usa signatures para dar claridad y comprobación automática de aridad.
|
|
51
|
+
|
|
52
|
+
```perl
|
|
53
|
+
use v5.36;
|
|
54
|
+
|
|
55
|
+
# Bien: signatures con valores por defecto
|
|
56
|
+
sub connect_db($host, $port = 5432, $timeout = 30) {
|
|
57
|
+
# $host es obligatorio; el resto tiene valores por defecto
|
|
58
|
+
return DBI->connect("dbi:Pg:host=$host;port=$port", undef, undef, {
|
|
59
|
+
RaiseError => 1,
|
|
60
|
+
PrintError => 0,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
# Bien: parámetro slurpy para argumentos variables
|
|
65
|
+
sub log_message($level, @details) {
|
|
66
|
+
say "[$level] " . join(' ', @details);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Mal: desempaquetado manual de argumentos
|
|
70
|
+
sub connect_db {
|
|
71
|
+
my ($host, $port, $timeout) = @_;
|
|
72
|
+
$port //= 5432;
|
|
73
|
+
$timeout //= 30;
|
|
74
|
+
# ...
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 3. Sensibilidad al contexto
|
|
79
|
+
|
|
80
|
+
Entiende el contexto escalar vs. lista — un concepto central de Perl.
|
|
81
|
+
|
|
82
|
+
```perl
|
|
83
|
+
use v5.36;
|
|
84
|
+
|
|
85
|
+
my @items = (1, 2, 3, 4, 5);
|
|
86
|
+
|
|
87
|
+
my @copy = @items; # Contexto de lista: todos los elementos
|
|
88
|
+
my $count = @items; # Contexto escalar: la cuenta (5)
|
|
89
|
+
say "Elementos: " . scalar @items; # Forzar contexto escalar
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 4. Desreferenciación postfija
|
|
93
|
+
|
|
94
|
+
Usa la sintaxis de desreferenciación postfija para mayor legibilidad con estructuras anidadas.
|
|
95
|
+
|
|
96
|
+
```perl
|
|
97
|
+
use v5.36;
|
|
98
|
+
|
|
99
|
+
my $data = {
|
|
100
|
+
users => [
|
|
101
|
+
{ name => 'Alice', roles => ['admin', 'user'] },
|
|
102
|
+
{ name => 'Bob', roles => ['user'] },
|
|
103
|
+
],
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
# Bien: desreferenciación postfija
|
|
107
|
+
my @users = $data->{users}->@*;
|
|
108
|
+
my @roles = $data->{users}[0]{roles}->@*;
|
|
109
|
+
my %first = $data->{users}[0]->%*;
|
|
110
|
+
|
|
111
|
+
# Mal: desreferenciación circunfija (más difícil de leer en cadenas)
|
|
112
|
+
my @users = @{ $data->{users} };
|
|
113
|
+
my @roles = @{ $data->{users}[0]{roles} };
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 5. El operador `isa` (5.32+)
|
|
117
|
+
|
|
118
|
+
Comprobación de tipo infija — reemplaza `blessed($o) && $o->isa('X')`.
|
|
119
|
+
|
|
120
|
+
```perl
|
|
121
|
+
use v5.36;
|
|
122
|
+
if ($obj isa 'My::Class') { $obj->do_something }
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Manejo de errores
|
|
126
|
+
|
|
127
|
+
### Patrón eval/die
|
|
128
|
+
|
|
129
|
+
```perl
|
|
130
|
+
use v5.36;
|
|
131
|
+
|
|
132
|
+
sub parse_config($path) {
|
|
133
|
+
my $content = eval { path($path)->slurp_utf8 };
|
|
134
|
+
die "Error de configuración: $@" if $@;
|
|
135
|
+
return decode_json($content);
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Try::Tiny (manejo fiable de excepciones)
|
|
140
|
+
|
|
141
|
+
```perl
|
|
142
|
+
use v5.36;
|
|
143
|
+
use Try::Tiny;
|
|
144
|
+
|
|
145
|
+
sub fetch_user($id) {
|
|
146
|
+
my $user = try {
|
|
147
|
+
$db->resultset('User')->find($id)
|
|
148
|
+
// die "Usuario $id no encontrado\n";
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
warn "No se pudo obtener el usuario $id: $_";
|
|
152
|
+
undef;
|
|
153
|
+
};
|
|
154
|
+
return $user;
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### try/catch nativo (5.40+)
|
|
159
|
+
|
|
160
|
+
```perl
|
|
161
|
+
use v5.40;
|
|
162
|
+
|
|
163
|
+
sub divide($x, $y) {
|
|
164
|
+
try {
|
|
165
|
+
die "División por cero" if $y == 0;
|
|
166
|
+
return $x / $y;
|
|
167
|
+
}
|
|
168
|
+
catch ($e) {
|
|
169
|
+
warn "Error: $e";
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## OO moderna con Moo
|
|
176
|
+
|
|
177
|
+
Prefiere Moo para OO moderna y ligera. Usa Moose solo cuando necesites su metaprotocolo.
|
|
178
|
+
|
|
179
|
+
```perl
|
|
180
|
+
# Bien: clase Moo
|
|
181
|
+
package User;
|
|
182
|
+
use Moo;
|
|
183
|
+
use Types::Standard qw(Str Int ArrayRef);
|
|
184
|
+
use namespace::autoclean;
|
|
185
|
+
|
|
186
|
+
has name => (is => 'ro', isa => Str, required => 1);
|
|
187
|
+
has email => (is => 'ro', isa => Str, required => 1);
|
|
188
|
+
has age => (is => 'ro', isa => Int, default => sub { 0 });
|
|
189
|
+
has roles => (is => 'ro', isa => ArrayRef[Str], default => sub { [] });
|
|
190
|
+
|
|
191
|
+
sub is_admin($self) {
|
|
192
|
+
return grep { $_ eq 'admin' } $self->roles->@*;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
sub greet($self) {
|
|
196
|
+
return "Hola, soy " . $self->name;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
1;
|
|
200
|
+
|
|
201
|
+
# Uso
|
|
202
|
+
my $user = User->new(
|
|
203
|
+
name => 'Alice',
|
|
204
|
+
email => 'alice@example.com',
|
|
205
|
+
roles => ['admin', 'user'],
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
# Mal: hashref bendecido (sin validación, sin accessors)
|
|
209
|
+
package User;
|
|
210
|
+
sub new {
|
|
211
|
+
my ($class, %args) = @_;
|
|
212
|
+
return bless \%args, $class;
|
|
213
|
+
}
|
|
214
|
+
sub name { return $_[0]->{name} }
|
|
215
|
+
1;
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Roles de Moo
|
|
219
|
+
|
|
220
|
+
```perl
|
|
221
|
+
package Role::Serializable;
|
|
222
|
+
use Moo::Role;
|
|
223
|
+
use JSON::MaybeXS qw(encode_json);
|
|
224
|
+
requires 'TO_HASH';
|
|
225
|
+
sub to_json($self) { encode_json($self->TO_HASH) }
|
|
226
|
+
1;
|
|
227
|
+
|
|
228
|
+
package User;
|
|
229
|
+
use Moo;
|
|
230
|
+
with 'Role::Serializable';
|
|
231
|
+
has name => (is => 'ro', required => 1);
|
|
232
|
+
has email => (is => 'ro', required => 1);
|
|
233
|
+
sub TO_HASH($self) { { name => $self->name, email => $self->email } }
|
|
234
|
+
1;
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Palabra clave nativa `class` (5.38+, Corinna)
|
|
238
|
+
|
|
239
|
+
```perl
|
|
240
|
+
use v5.38;
|
|
241
|
+
use feature 'class';
|
|
242
|
+
no warnings 'experimental::class';
|
|
243
|
+
|
|
244
|
+
class Point {
|
|
245
|
+
field $x :param;
|
|
246
|
+
field $y :param;
|
|
247
|
+
method magnitude() { sqrt($x**2 + $y**2) }
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
my $p = Point->new(x => 3, y => 4);
|
|
251
|
+
say $p->magnitude; # 5
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Expresiones regulares
|
|
255
|
+
|
|
256
|
+
### Capturas con nombre y flag `/x`
|
|
257
|
+
|
|
258
|
+
```perl
|
|
259
|
+
use v5.36;
|
|
260
|
+
|
|
261
|
+
# Bien: capturas con nombre y /x para legibilidad
|
|
262
|
+
my $log_re = qr{
|
|
263
|
+
^ (?<timestamp> \d{4}-\d{2}-\d{2} \s \d{2}:\d{2}:\d{2} )
|
|
264
|
+
\s+ \[ (?<level> \w+ ) \]
|
|
265
|
+
\s+ (?<message> .+ ) $
|
|
266
|
+
}x;
|
|
267
|
+
|
|
268
|
+
if ($line =~ $log_re) {
|
|
269
|
+
say "Hora: $+{timestamp}, Nivel: $+{level}";
|
|
270
|
+
say "Mensaje: $+{message}";
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
# Mal: capturas posicionales (difíciles de mantener)
|
|
274
|
+
if ($line =~ /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\s+\[(\w+)\]\s+(.+)$/) {
|
|
275
|
+
say "Hora: $1, Nivel: $2";
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Patrones precompilados
|
|
280
|
+
|
|
281
|
+
```perl
|
|
282
|
+
use v5.36;
|
|
283
|
+
|
|
284
|
+
# Bien: compilar una vez, usar muchas
|
|
285
|
+
my $email_re = qr/^[A-Za-z0-9._%+-]+\@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;
|
|
286
|
+
|
|
287
|
+
sub validate_emails(@emails) {
|
|
288
|
+
return grep { $_ =~ $email_re } @emails;
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Estructuras de datos
|
|
293
|
+
|
|
294
|
+
### Referencias y acceso profundo seguro
|
|
295
|
+
|
|
296
|
+
```perl
|
|
297
|
+
use v5.36;
|
|
298
|
+
|
|
299
|
+
# Referencias a hashes y arrays
|
|
300
|
+
my $config = {
|
|
301
|
+
database => {
|
|
302
|
+
host => 'localhost',
|
|
303
|
+
port => 5432,
|
|
304
|
+
options => ['utf8', 'sslmode=require'],
|
|
305
|
+
},
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
# Acceso profundo seguro (devuelve undef si falta algún nivel)
|
|
309
|
+
my $port = $config->{database}{port}; # 5432
|
|
310
|
+
my $missing = $config->{cache}{host}; # undef, sin error
|
|
311
|
+
|
|
312
|
+
# Slices de hash
|
|
313
|
+
my %subset;
|
|
314
|
+
@subset{qw(host port)} = @{$config->{database}}{qw(host port)};
|
|
315
|
+
|
|
316
|
+
# Slices de array
|
|
317
|
+
my @first_two = $config->{database}{options}->@[0, 1];
|
|
318
|
+
|
|
319
|
+
# Bucle for multivariable (experimental en 5.36, estable en 5.40)
|
|
320
|
+
use feature 'for_list';
|
|
321
|
+
no warnings 'experimental::for_list';
|
|
322
|
+
for my ($key, $val) (%$config) {
|
|
323
|
+
say "$key => $val";
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
## E/S de archivos
|
|
328
|
+
|
|
329
|
+
### Open de tres argumentos
|
|
330
|
+
|
|
331
|
+
```perl
|
|
332
|
+
use v5.36;
|
|
333
|
+
|
|
334
|
+
# Bien: open de tres argumentos con autodie (módulo core, elimina el 'or die')
|
|
335
|
+
use autodie;
|
|
336
|
+
|
|
337
|
+
sub read_file($path) {
|
|
338
|
+
open my $fh, '<:encoding(UTF-8)', $path;
|
|
339
|
+
local $/;
|
|
340
|
+
my $content = <$fh>;
|
|
341
|
+
close $fh;
|
|
342
|
+
return $content;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
# Mal: open de dos argumentos (riesgo de inyección de shell, ver seguridad-perl)
|
|
346
|
+
open FH, $path; # NUNCA hagas esto
|
|
347
|
+
open FH, "< $path"; # Sigue mal — datos de usuario en la cadena de modo
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### Path::Tiny para operaciones con archivos
|
|
351
|
+
|
|
352
|
+
```perl
|
|
353
|
+
use v5.36;
|
|
354
|
+
use Path::Tiny;
|
|
355
|
+
|
|
356
|
+
my $file = path('config', 'app.json');
|
|
357
|
+
my $content = $file->slurp_utf8;
|
|
358
|
+
$file->spew_utf8($new_content);
|
|
359
|
+
|
|
360
|
+
# Iterar un directorio
|
|
361
|
+
for my $child (path('src')->children(qr/\.pl$/)) {
|
|
362
|
+
say $child->basename;
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
## Organización de módulos
|
|
367
|
+
|
|
368
|
+
### Estructura estándar de proyecto
|
|
369
|
+
|
|
370
|
+
```text
|
|
371
|
+
MyApp/
|
|
372
|
+
├── lib/
|
|
373
|
+
│ └── MyApp/
|
|
374
|
+
│ ├── App.pm # Módulo principal
|
|
375
|
+
│ ├── Config.pm # Configuración
|
|
376
|
+
│ ├── DB.pm # Capa de base de datos
|
|
377
|
+
│ └── Util.pm # Utilidades
|
|
378
|
+
├── bin/
|
|
379
|
+
│ └── myapp # Script de entrada
|
|
380
|
+
├── t/
|
|
381
|
+
│ ├── 00-load.t # Tests de compilación
|
|
382
|
+
│ ├── unit/ # Tests unitarios
|
|
383
|
+
│ └── integration/ # Tests de integración
|
|
384
|
+
├── cpanfile # Dependencias
|
|
385
|
+
├── Makefile.PL # Sistema de build
|
|
386
|
+
└── .perlcriticrc # Configuración de linting
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Patrones con Exporter
|
|
390
|
+
|
|
391
|
+
```perl
|
|
392
|
+
package MyApp::Util;
|
|
393
|
+
use v5.36;
|
|
394
|
+
use Exporter 'import';
|
|
395
|
+
|
|
396
|
+
our @EXPORT_OK = qw(trim);
|
|
397
|
+
our %EXPORT_TAGS = (all => \@EXPORT_OK);
|
|
398
|
+
|
|
399
|
+
sub trim($str) { $str =~ s/^\s+|\s+$//gr }
|
|
400
|
+
|
|
401
|
+
1;
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
## Herramientas
|
|
405
|
+
|
|
406
|
+
### Configuración de perltidy (.perltidyrc)
|
|
407
|
+
|
|
408
|
+
```text
|
|
409
|
+
-i=4 # indentación de 4 espacios
|
|
410
|
+
-l=100 # líneas de 100 caracteres
|
|
411
|
+
-ci=4 # indentación de continuación
|
|
412
|
+
-ce # else "cuddled"
|
|
413
|
+
-bar # llave de apertura en la misma línea
|
|
414
|
+
-nolq # no desindentar strings entrecomillados largos
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
### Configuración de perlcritic (.perlcriticrc)
|
|
418
|
+
|
|
419
|
+
```ini
|
|
420
|
+
severity = 3
|
|
421
|
+
theme = core + pbp + security
|
|
422
|
+
|
|
423
|
+
[InputOutput::RequireCheckedSyscalls]
|
|
424
|
+
functions = :builtins
|
|
425
|
+
exclude_functions = say print
|
|
426
|
+
|
|
427
|
+
[Subroutines::ProhibitExplicitReturnUndef]
|
|
428
|
+
severity = 4
|
|
429
|
+
|
|
430
|
+
[ValuesAndExpressions::ProhibitMagicNumbers]
|
|
431
|
+
allowed_values = 0 1 2 -1
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### Gestión de dependencias (cpanfile + carton)
|
|
435
|
+
|
|
436
|
+
```bash
|
|
437
|
+
cpanm App::cpanminus Carton # Instalar herramientas
|
|
438
|
+
carton install # Instalar deps del cpanfile
|
|
439
|
+
carton exec -- perl bin/myapp # Ejecutar con deps locales
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
```perl
|
|
443
|
+
# cpanfile
|
|
444
|
+
requires 'Moo', '>= 2.005';
|
|
445
|
+
requires 'Path::Tiny';
|
|
446
|
+
requires 'JSON::MaybeXS';
|
|
447
|
+
requires 'Try::Tiny';
|
|
448
|
+
|
|
449
|
+
on test => sub {
|
|
450
|
+
requires 'Test2::V0';
|
|
451
|
+
requires 'Test::MockModule';
|
|
452
|
+
};
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
## Referencia rápida: idiomas de Perl moderno
|
|
456
|
+
|
|
457
|
+
| Patrón heredado | Reemplazo moderno |
|
|
458
|
+
|---|---|
|
|
459
|
+
| `use strict; use warnings;` | `use v5.36;` |
|
|
460
|
+
| `my ($x, $y) = @_;` | `sub foo($x, $y) { ... }` |
|
|
461
|
+
| `@{ $ref }` | `$ref->@*` |
|
|
462
|
+
| `%{ $ref }` | `$ref->%*` |
|
|
463
|
+
| `open FH, "< $file"` | `open my $fh, '<:encoding(UTF-8)', $file` |
|
|
464
|
+
| hashref bendecido | clase `Moo` con tipos |
|
|
465
|
+
| `$1, $2, $3` | `$+{name}` (capturas con nombre) |
|
|
466
|
+
| `eval { }; if ($@)` | `Try::Tiny` o `try/catch` nativo (5.40+) |
|
|
467
|
+
| `BEGIN { require Exporter; }` | `use Exporter 'import';` |
|
|
468
|
+
| Operaciones de archivo manuales | `Path::Tiny` |
|
|
469
|
+
| `blessed($o) && $o->isa('X')` | `$o isa 'X'` (5.32+) |
|
|
470
|
+
| `builtin::true / false` | `use builtin 'true', 'false';` (5.36+, experimental) |
|
|
471
|
+
|
|
472
|
+
## Antipatrones
|
|
473
|
+
|
|
474
|
+
```perl
|
|
475
|
+
# 1. Open de dos argumentos (riesgo de seguridad)
|
|
476
|
+
open FH, $filename; # NUNCA
|
|
477
|
+
|
|
478
|
+
# 2. Sintaxis de objeto indirecta (parseo ambiguo)
|
|
479
|
+
my $obj = new Foo(bar => 1); # Mal
|
|
480
|
+
my $obj = Foo->new(bar => 1); # Bien
|
|
481
|
+
|
|
482
|
+
# 3. Dependencia excesiva de $_
|
|
483
|
+
map { process($_) } grep { validate($_) } @items; # Difícil de seguir
|
|
484
|
+
my @valid = grep { validate($_) } @items; # Mejor: sepáralo
|
|
485
|
+
my @results = map { process($_) } @valid;
|
|
486
|
+
|
|
487
|
+
# 4. Desactivar strict refs
|
|
488
|
+
no strict 'refs'; # Casi siempre está mal
|
|
489
|
+
${"My::Package::$var"} = $value; # Usa un hash en su lugar
|
|
490
|
+
|
|
491
|
+
# 5. Variables globales como configuración
|
|
492
|
+
our $TIMEOUT = 30; # Mal: global mutable
|
|
493
|
+
use constant TIMEOUT => 30; # Mejor: constante
|
|
494
|
+
# Lo mejor: atributo Moo con valor por defecto
|
|
495
|
+
|
|
496
|
+
# 6. eval de string para cargar módulos
|
|
497
|
+
eval "require $module"; # Mal: riesgo de inyección de código
|
|
498
|
+
eval "use $module"; # Mal
|
|
499
|
+
use Module::Runtime 'require_module'; # Bien: carga segura de módulos
|
|
500
|
+
require_module($module);
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
**Recuerda**: el Perl moderno es limpio, legible y seguro. Deja que `use v5.36` se encargue del boilerplate, usa Moo para los objetos y prefiere los módulos de CPAN probados en batalla sobre las soluciones artesanales.
|
|
504
|
+
|
|
505
|
+
## Skills relacionadas
|
|
506
|
+
|
|
507
|
+
- `seguridad-perl`
|
|
508
|
+
- `testing-perl`
|