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,750 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: patrones-python
|
|
3
|
+
description: Idiomas pythónicos, estándares PEP 8, type hints y mejores prácticas para construir aplicaciones Python robustas, eficientes y mantenibles.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Patrones de desarrollo en Python
|
|
8
|
+
|
|
9
|
+
Patrones idiomáticos de Python y mejores prácticas para construir aplicaciones robustas, eficientes y mantenibles.
|
|
10
|
+
|
|
11
|
+
## Cuándo activar
|
|
12
|
+
|
|
13
|
+
- Al escribir código Python nuevo
|
|
14
|
+
- Al revisar código Python
|
|
15
|
+
- Al refactorizar código Python existente
|
|
16
|
+
- Al diseñar paquetes/módulos de Python
|
|
17
|
+
|
|
18
|
+
## Principios centrales
|
|
19
|
+
|
|
20
|
+
### 1. La legibilidad cuenta
|
|
21
|
+
|
|
22
|
+
Python prioriza la legibilidad. El código debe ser obvio y fácil de entender.
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
# Bien: claro y legible
|
|
26
|
+
def get_active_users(users: list[User]) -> list[User]:
|
|
27
|
+
"""Devuelve solo los usuarios activos de la lista proporcionada."""
|
|
28
|
+
return [user for user in users if user.is_active]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
# Mal: ingenioso pero confuso
|
|
32
|
+
def get_active_users(u):
|
|
33
|
+
return [x for x in u if x.a]
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 2. Explícito es mejor que implícito
|
|
37
|
+
|
|
38
|
+
Evita la magia; sé claro sobre lo que hace tu código.
|
|
39
|
+
|
|
40
|
+
```python
|
|
41
|
+
# Bien: configuración explícita
|
|
42
|
+
import logging
|
|
43
|
+
|
|
44
|
+
logging.basicConfig(
|
|
45
|
+
level=logging.INFO,
|
|
46
|
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
# Mal: efectos secundarios ocultos
|
|
50
|
+
import some_module
|
|
51
|
+
some_module.setup() # ¿Qué hace esto?
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 3. EAFP — es más fácil pedir perdón que permiso
|
|
55
|
+
|
|
56
|
+
Python prefiere el manejo de excepciones sobre la comprobación de condiciones.
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
# Bien: estilo EAFP
|
|
60
|
+
def get_value(dictionary: dict, key: str, default_value: Any = None) -> Any:
|
|
61
|
+
try:
|
|
62
|
+
return dictionary[key]
|
|
63
|
+
except KeyError:
|
|
64
|
+
return default_value
|
|
65
|
+
|
|
66
|
+
# Mal: estilo LBYL (Look Before You Leap)
|
|
67
|
+
def get_value(dictionary: dict, key: str, default_value: Any = None) -> Any:
|
|
68
|
+
if key in dictionary:
|
|
69
|
+
return dictionary[key]
|
|
70
|
+
else:
|
|
71
|
+
return default_value
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Type hints
|
|
75
|
+
|
|
76
|
+
### Anotaciones de tipo básicas
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
from typing import Optional, List, Dict, Any
|
|
80
|
+
|
|
81
|
+
def process_user(
|
|
82
|
+
user_id: str,
|
|
83
|
+
data: Dict[str, Any],
|
|
84
|
+
active: bool = True
|
|
85
|
+
) -> Optional[User]:
|
|
86
|
+
"""Procesa un usuario y devuelve el User actualizado o None."""
|
|
87
|
+
if not active:
|
|
88
|
+
return None
|
|
89
|
+
return User(user_id, data)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Type hints modernos (Python 3.9+)
|
|
93
|
+
|
|
94
|
+
```python
|
|
95
|
+
# Python 3.9+ — usa los tipos integrados
|
|
96
|
+
def process_items(items: list[str]) -> dict[str, int]:
|
|
97
|
+
return {item: len(item) for item in items}
|
|
98
|
+
|
|
99
|
+
# Python 3.8 y anteriores — usa el módulo typing
|
|
100
|
+
from typing import List, Dict
|
|
101
|
+
|
|
102
|
+
def process_items(items: List[str]) -> Dict[str, int]:
|
|
103
|
+
return {item: len(item) for item in items}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Alias de tipos y TypeVar
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
from typing import TypeVar, Union
|
|
110
|
+
|
|
111
|
+
# Alias de tipo para tipos complejos
|
|
112
|
+
JSON = Union[dict[str, Any], list[Any], str, int, float, bool, None]
|
|
113
|
+
|
|
114
|
+
def parse_json(data: str) -> JSON:
|
|
115
|
+
return json.loads(data)
|
|
116
|
+
|
|
117
|
+
# Tipos genéricos
|
|
118
|
+
T = TypeVar('T')
|
|
119
|
+
|
|
120
|
+
def first(items: list[T]) -> T | None:
|
|
121
|
+
"""Devuelve el primer elemento o None si la lista está vacía."""
|
|
122
|
+
return items[0] if items else None
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Duck typing basado en Protocol
|
|
126
|
+
|
|
127
|
+
```python
|
|
128
|
+
from typing import Protocol
|
|
129
|
+
|
|
130
|
+
class Renderable(Protocol):
|
|
131
|
+
def render(self) -> str:
|
|
132
|
+
"""Renderiza el objeto a un string."""
|
|
133
|
+
|
|
134
|
+
def render_all(items: list[Renderable]) -> str:
|
|
135
|
+
"""Renderiza todos los elementos que implementan el protocolo Renderable."""
|
|
136
|
+
return "\n".join(item.render() for item in items)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Patrones de manejo de errores
|
|
140
|
+
|
|
141
|
+
### Manejo de excepciones específicas
|
|
142
|
+
|
|
143
|
+
```python
|
|
144
|
+
# Bien: captura excepciones específicas
|
|
145
|
+
def load_config(path: str) -> Config:
|
|
146
|
+
try:
|
|
147
|
+
with open(path) as f:
|
|
148
|
+
return Config.from_json(f.read())
|
|
149
|
+
except FileNotFoundError as e:
|
|
150
|
+
raise ConfigError(f"Archivo de configuración no encontrado: {path}") from e
|
|
151
|
+
except json.JSONDecodeError as e:
|
|
152
|
+
raise ConfigError(f"JSON inválido en la configuración: {path}") from e
|
|
153
|
+
|
|
154
|
+
# Mal: except desnudo
|
|
155
|
+
def load_config(path: str) -> Config:
|
|
156
|
+
try:
|
|
157
|
+
with open(path) as f:
|
|
158
|
+
return Config.from_json(f.read())
|
|
159
|
+
except:
|
|
160
|
+
return None # ¡Fallo silencioso!
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Encadenamiento de excepciones
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
def process_data(data: str) -> Result:
|
|
167
|
+
try:
|
|
168
|
+
parsed = json.loads(data)
|
|
169
|
+
except json.JSONDecodeError as e:
|
|
170
|
+
# Encadena las excepciones para preservar el traceback
|
|
171
|
+
raise ValueError(f"No se pudieron parsear los datos: {data}") from e
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Jerarquía de excepciones personalizadas
|
|
175
|
+
|
|
176
|
+
```python
|
|
177
|
+
class AppError(Exception):
|
|
178
|
+
"""Excepción base para todos los errores de la aplicación."""
|
|
179
|
+
pass
|
|
180
|
+
|
|
181
|
+
class ValidationError(AppError):
|
|
182
|
+
"""Se lanza cuando falla la validación de la entrada."""
|
|
183
|
+
pass
|
|
184
|
+
|
|
185
|
+
class NotFoundError(AppError):
|
|
186
|
+
"""Se lanza cuando no se encuentra un recurso solicitado."""
|
|
187
|
+
pass
|
|
188
|
+
|
|
189
|
+
# Uso
|
|
190
|
+
def get_user(user_id: str) -> User:
|
|
191
|
+
user = db.find_user(user_id)
|
|
192
|
+
if not user:
|
|
193
|
+
raise NotFoundError(f"Usuario no encontrado: {user_id}")
|
|
194
|
+
return user
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Context managers
|
|
198
|
+
|
|
199
|
+
### Gestión de recursos
|
|
200
|
+
|
|
201
|
+
```python
|
|
202
|
+
# Bien: usando context managers
|
|
203
|
+
def process_file(path: str) -> str:
|
|
204
|
+
with open(path, 'r') as f:
|
|
205
|
+
return f.read()
|
|
206
|
+
|
|
207
|
+
# Mal: gestión manual de recursos
|
|
208
|
+
def process_file(path: str) -> str:
|
|
209
|
+
f = open(path, 'r')
|
|
210
|
+
try:
|
|
211
|
+
return f.read()
|
|
212
|
+
finally:
|
|
213
|
+
f.close()
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Context managers personalizados
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
from contextlib import contextmanager
|
|
220
|
+
|
|
221
|
+
@contextmanager
|
|
222
|
+
def timer(name: str):
|
|
223
|
+
"""Context manager para cronometrar un bloque de código."""
|
|
224
|
+
start = time.perf_counter()
|
|
225
|
+
yield
|
|
226
|
+
elapsed = time.perf_counter() - start
|
|
227
|
+
print(f"{name} tardó {elapsed:.4f} segundos")
|
|
228
|
+
|
|
229
|
+
# Uso
|
|
230
|
+
with timer("procesamiento de datos"):
|
|
231
|
+
process_large_dataset()
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Clases como context managers
|
|
235
|
+
|
|
236
|
+
```python
|
|
237
|
+
class DatabaseTransaction:
|
|
238
|
+
def __init__(self, connection):
|
|
239
|
+
self.connection = connection
|
|
240
|
+
|
|
241
|
+
def __enter__(self):
|
|
242
|
+
self.connection.begin_transaction()
|
|
243
|
+
return self
|
|
244
|
+
|
|
245
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
246
|
+
if exc_type is None:
|
|
247
|
+
self.connection.commit()
|
|
248
|
+
else:
|
|
249
|
+
self.connection.rollback()
|
|
250
|
+
return False # No suprimir excepciones
|
|
251
|
+
|
|
252
|
+
# Uso
|
|
253
|
+
with DatabaseTransaction(conn):
|
|
254
|
+
user = conn.create_user(user_data)
|
|
255
|
+
conn.create_profile(user.id, profile_data)
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Comprehensions y generadores
|
|
259
|
+
|
|
260
|
+
### List comprehensions
|
|
261
|
+
|
|
262
|
+
```python
|
|
263
|
+
# Bien: list comprehension para transformaciones simples
|
|
264
|
+
names = [user.name for user in users if user.is_active]
|
|
265
|
+
|
|
266
|
+
# Mal: bucle manual
|
|
267
|
+
names = []
|
|
268
|
+
for user in users:
|
|
269
|
+
if user.is_active:
|
|
270
|
+
names.append(user.name)
|
|
271
|
+
|
|
272
|
+
# Las comprehensions complejas deben expandirse
|
|
273
|
+
# Mal: demasiado complejo
|
|
274
|
+
result = [x * 2 for x in items if x > 0 if x % 2 == 0]
|
|
275
|
+
|
|
276
|
+
# Bien: usa una función generadora
|
|
277
|
+
def filter_and_transform(items: Iterable[int]) -> list[int]:
|
|
278
|
+
result = []
|
|
279
|
+
for x in items:
|
|
280
|
+
if x > 0 and x % 2 == 0:
|
|
281
|
+
result.append(x * 2)
|
|
282
|
+
return result
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Expresiones generadoras
|
|
286
|
+
|
|
287
|
+
```python
|
|
288
|
+
# Bien: generador para evaluación perezosa
|
|
289
|
+
total = sum(x * x for x in range(1_000_000))
|
|
290
|
+
|
|
291
|
+
# Mal: crea una lista intermedia grande
|
|
292
|
+
total = sum([x * x for x in range(1_000_000)])
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Funciones generadoras
|
|
296
|
+
|
|
297
|
+
```python
|
|
298
|
+
def read_large_file(path: str) -> Iterator[str]:
|
|
299
|
+
"""Lee un archivo grande línea por línea."""
|
|
300
|
+
with open(path) as f:
|
|
301
|
+
for line in f:
|
|
302
|
+
yield line.strip()
|
|
303
|
+
|
|
304
|
+
# Uso
|
|
305
|
+
for line in read_large_file("huge.txt"):
|
|
306
|
+
process(line)
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
## Data classes y named tuples
|
|
310
|
+
|
|
311
|
+
### Data classes
|
|
312
|
+
|
|
313
|
+
```python
|
|
314
|
+
from dataclasses import dataclass, field
|
|
315
|
+
from datetime import datetime
|
|
316
|
+
|
|
317
|
+
@dataclass
|
|
318
|
+
class User:
|
|
319
|
+
"""Entidad User con __init__, __repr__ y __eq__ automáticos."""
|
|
320
|
+
id: str
|
|
321
|
+
name: str
|
|
322
|
+
email: str
|
|
323
|
+
created_at: datetime = field(default_factory=datetime.now)
|
|
324
|
+
is_active: bool = True
|
|
325
|
+
|
|
326
|
+
# Uso
|
|
327
|
+
user = User(
|
|
328
|
+
id="123",
|
|
329
|
+
name="Alice",
|
|
330
|
+
email="alice@example.com"
|
|
331
|
+
)
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Data classes con validación
|
|
335
|
+
|
|
336
|
+
```python
|
|
337
|
+
@dataclass
|
|
338
|
+
class User:
|
|
339
|
+
email: str
|
|
340
|
+
age: int
|
|
341
|
+
|
|
342
|
+
def __post_init__(self):
|
|
343
|
+
# Valida el formato del email
|
|
344
|
+
if "@" not in self.email:
|
|
345
|
+
raise ValueError(f"Email inválido: {self.email}")
|
|
346
|
+
# Valida el rango de edad
|
|
347
|
+
if self.age < 0 or self.age > 150:
|
|
348
|
+
raise ValueError(f"Edad inválida: {self.age}")
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
### Named tuples
|
|
352
|
+
|
|
353
|
+
```python
|
|
354
|
+
from typing import NamedTuple
|
|
355
|
+
|
|
356
|
+
class Point(NamedTuple):
|
|
357
|
+
"""Punto 2D inmutable."""
|
|
358
|
+
x: float
|
|
359
|
+
y: float
|
|
360
|
+
|
|
361
|
+
def distance(self, other: 'Point') -> float:
|
|
362
|
+
return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5
|
|
363
|
+
|
|
364
|
+
# Uso
|
|
365
|
+
p1 = Point(0, 0)
|
|
366
|
+
p2 = Point(3, 4)
|
|
367
|
+
print(p1.distance(p2)) # 5.0
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
## Decoradores
|
|
371
|
+
|
|
372
|
+
### Decoradores de función
|
|
373
|
+
|
|
374
|
+
```python
|
|
375
|
+
import functools
|
|
376
|
+
import time
|
|
377
|
+
|
|
378
|
+
def timer(func: Callable) -> Callable:
|
|
379
|
+
"""Decorador para cronometrar la ejecución de una función."""
|
|
380
|
+
@functools.wraps(func)
|
|
381
|
+
def wrapper(*args, **kwargs):
|
|
382
|
+
start = time.perf_counter()
|
|
383
|
+
result = func(*args, **kwargs)
|
|
384
|
+
elapsed = time.perf_counter() - start
|
|
385
|
+
print(f"{func.__name__} tardó {elapsed:.4f}s")
|
|
386
|
+
return result
|
|
387
|
+
return wrapper
|
|
388
|
+
|
|
389
|
+
@timer
|
|
390
|
+
def slow_function():
|
|
391
|
+
time.sleep(1)
|
|
392
|
+
|
|
393
|
+
# slow_function() imprime: slow_function tardó 1.0012s
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Decoradores parametrizados
|
|
397
|
+
|
|
398
|
+
```python
|
|
399
|
+
def repeat(times: int):
|
|
400
|
+
"""Decorador para repetir una función varias veces."""
|
|
401
|
+
def decorator(func: Callable) -> Callable:
|
|
402
|
+
@functools.wraps(func)
|
|
403
|
+
def wrapper(*args, **kwargs):
|
|
404
|
+
results = []
|
|
405
|
+
for _ in range(times):
|
|
406
|
+
results.append(func(*args, **kwargs))
|
|
407
|
+
return results
|
|
408
|
+
return wrapper
|
|
409
|
+
return decorator
|
|
410
|
+
|
|
411
|
+
@repeat(times=3)
|
|
412
|
+
def greet(name: str) -> str:
|
|
413
|
+
return f"Hello, {name}!"
|
|
414
|
+
|
|
415
|
+
# greet("Alice") devuelve ["Hello, Alice!", "Hello, Alice!", "Hello, Alice!"]
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### Decoradores basados en clases
|
|
419
|
+
|
|
420
|
+
```python
|
|
421
|
+
class CountCalls:
|
|
422
|
+
"""Decorador que cuenta cuántas veces se llama a una función."""
|
|
423
|
+
def __init__(self, func: Callable):
|
|
424
|
+
functools.update_wrapper(self, func)
|
|
425
|
+
self.func = func
|
|
426
|
+
self.count = 0
|
|
427
|
+
|
|
428
|
+
def __call__(self, *args, **kwargs):
|
|
429
|
+
self.count += 1
|
|
430
|
+
print(f"{self.func.__name__} ha sido llamada {self.count} veces")
|
|
431
|
+
return self.func(*args, **kwargs)
|
|
432
|
+
|
|
433
|
+
@CountCalls
|
|
434
|
+
def process():
|
|
435
|
+
pass
|
|
436
|
+
|
|
437
|
+
# Cada llamada a process() imprime el conteo de llamadas
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
## Patrones de concurrencia
|
|
441
|
+
|
|
442
|
+
### Threading para tareas limitadas por I/O
|
|
443
|
+
|
|
444
|
+
```python
|
|
445
|
+
import concurrent.futures
|
|
446
|
+
import threading
|
|
447
|
+
|
|
448
|
+
def fetch_url(url: str) -> str:
|
|
449
|
+
"""Descarga una URL (operación limitada por I/O)."""
|
|
450
|
+
import urllib.request
|
|
451
|
+
with urllib.request.urlopen(url) as response:
|
|
452
|
+
return response.read().decode()
|
|
453
|
+
|
|
454
|
+
def fetch_all_urls(urls: list[str]) -> dict[str, str]:
|
|
455
|
+
"""Descarga varias URLs concurrentemente usando threads."""
|
|
456
|
+
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
|
|
457
|
+
future_to_url = {executor.submit(fetch_url, url): url for url in urls}
|
|
458
|
+
results = {}
|
|
459
|
+
for future in concurrent.futures.as_completed(future_to_url):
|
|
460
|
+
url = future_to_url[future]
|
|
461
|
+
try:
|
|
462
|
+
results[url] = future.result()
|
|
463
|
+
except Exception as e:
|
|
464
|
+
results[url] = f"Error: {e}"
|
|
465
|
+
return results
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Multiprocessing para tareas limitadas por CPU
|
|
469
|
+
|
|
470
|
+
```python
|
|
471
|
+
def process_data(data: list[int]) -> int:
|
|
472
|
+
"""Cómputo intensivo en CPU."""
|
|
473
|
+
return sum(x ** 2 for x in data)
|
|
474
|
+
|
|
475
|
+
def process_all(datasets: list[list[int]]) -> list[int]:
|
|
476
|
+
"""Procesa varios datasets usando múltiples procesos."""
|
|
477
|
+
with concurrent.futures.ProcessPoolExecutor() as executor:
|
|
478
|
+
results = list(executor.map(process_data, datasets))
|
|
479
|
+
return results
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
### Async/await para I/O concurrente
|
|
483
|
+
|
|
484
|
+
```python
|
|
485
|
+
import asyncio
|
|
486
|
+
|
|
487
|
+
async def fetch_async(url: str) -> str:
|
|
488
|
+
"""Descarga una URL de forma asíncrona."""
|
|
489
|
+
import aiohttp
|
|
490
|
+
async with aiohttp.ClientSession() as session:
|
|
491
|
+
async with session.get(url) as response:
|
|
492
|
+
return await response.text()
|
|
493
|
+
|
|
494
|
+
async def fetch_all(urls: list[str]) -> dict[str, str]:
|
|
495
|
+
"""Descarga varias URLs concurrentemente."""
|
|
496
|
+
tasks = [fetch_async(url) for url in urls]
|
|
497
|
+
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
498
|
+
return dict(zip(urls, results))
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
## Organización de paquetes
|
|
502
|
+
|
|
503
|
+
### Estructura estándar de proyecto
|
|
504
|
+
|
|
505
|
+
```
|
|
506
|
+
myproject/
|
|
507
|
+
├── src/
|
|
508
|
+
│ └── mypackage/
|
|
509
|
+
│ ├── __init__.py
|
|
510
|
+
│ ├── main.py
|
|
511
|
+
│ ├── api/
|
|
512
|
+
│ │ ├── __init__.py
|
|
513
|
+
│ │ └── routes.py
|
|
514
|
+
│ ├── models/
|
|
515
|
+
│ │ ├── __init__.py
|
|
516
|
+
│ │ └── user.py
|
|
517
|
+
│ └── utils/
|
|
518
|
+
│ ├── __init__.py
|
|
519
|
+
│ └── helpers.py
|
|
520
|
+
├── tests/
|
|
521
|
+
│ ├── __init__.py
|
|
522
|
+
│ ├── conftest.py
|
|
523
|
+
│ ├── test_api.py
|
|
524
|
+
│ └── test_models.py
|
|
525
|
+
├── pyproject.toml
|
|
526
|
+
├── README.md
|
|
527
|
+
└── .gitignore
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Convenciones de imports
|
|
531
|
+
|
|
532
|
+
```python
|
|
533
|
+
# Bien: orden de imports — stdlib, terceros, local
|
|
534
|
+
import os
|
|
535
|
+
import sys
|
|
536
|
+
from pathlib import Path
|
|
537
|
+
|
|
538
|
+
import requests
|
|
539
|
+
from fastapi import FastAPI
|
|
540
|
+
|
|
541
|
+
from mypackage.models import User
|
|
542
|
+
from mypackage.utils import format_name
|
|
543
|
+
|
|
544
|
+
# Bien: usa isort para ordenar imports automáticamente
|
|
545
|
+
# pip install isort
|
|
546
|
+
```
|
|
547
|
+
|
|
548
|
+
### __init__.py para exportaciones del paquete
|
|
549
|
+
|
|
550
|
+
```python
|
|
551
|
+
# mypackage/__init__.py
|
|
552
|
+
"""mypackage — Un paquete Python de ejemplo."""
|
|
553
|
+
|
|
554
|
+
__version__ = "1.0.0"
|
|
555
|
+
|
|
556
|
+
# Exporta las clases/funciones principales a nivel de paquete
|
|
557
|
+
from mypackage.models import User, Post
|
|
558
|
+
from mypackage.utils import format_name
|
|
559
|
+
|
|
560
|
+
__all__ = ["User", "Post", "format_name"]
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
## Memoria y rendimiento
|
|
564
|
+
|
|
565
|
+
### Uso de __slots__ para eficiencia de memoria
|
|
566
|
+
|
|
567
|
+
```python
|
|
568
|
+
# Mal: una clase normal usa __dict__ (más memoria)
|
|
569
|
+
class Point:
|
|
570
|
+
def __init__(self, x: float, y: float):
|
|
571
|
+
self.x = x
|
|
572
|
+
self.y = y
|
|
573
|
+
|
|
574
|
+
# Bien: __slots__ reduce el uso de memoria
|
|
575
|
+
class Point:
|
|
576
|
+
__slots__ = ['x', 'y']
|
|
577
|
+
|
|
578
|
+
def __init__(self, x: float, y: float):
|
|
579
|
+
self.x = x
|
|
580
|
+
self.y = y
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
### Generadores para datos grandes
|
|
584
|
+
|
|
585
|
+
```python
|
|
586
|
+
# Mal: devuelve la lista completa en memoria
|
|
587
|
+
def read_lines(path: str) -> list[str]:
|
|
588
|
+
with open(path) as f:
|
|
589
|
+
return [line.strip() for line in f]
|
|
590
|
+
|
|
591
|
+
# Bien: produce las líneas de una en una
|
|
592
|
+
def read_lines(path: str) -> Iterator[str]:
|
|
593
|
+
with open(path) as f:
|
|
594
|
+
for line in f:
|
|
595
|
+
yield line.strip()
|
|
596
|
+
```
|
|
597
|
+
|
|
598
|
+
### Evita la concatenación de strings en bucles
|
|
599
|
+
|
|
600
|
+
```python
|
|
601
|
+
# Mal: O(n²) por la inmutabilidad de los strings
|
|
602
|
+
result = ""
|
|
603
|
+
for item in items:
|
|
604
|
+
result += str(item)
|
|
605
|
+
|
|
606
|
+
# Bien: O(n) usando join
|
|
607
|
+
result = "".join(str(item) for item in items)
|
|
608
|
+
|
|
609
|
+
# Bien: usando StringIO para construir
|
|
610
|
+
from io import StringIO
|
|
611
|
+
|
|
612
|
+
buffer = StringIO()
|
|
613
|
+
for item in items:
|
|
614
|
+
buffer.write(str(item))
|
|
615
|
+
result = buffer.getvalue()
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
## Integración con el tooling de Python
|
|
619
|
+
|
|
620
|
+
### Comandos esenciales
|
|
621
|
+
|
|
622
|
+
```bash
|
|
623
|
+
# Formateo de código
|
|
624
|
+
black .
|
|
625
|
+
isort .
|
|
626
|
+
|
|
627
|
+
# Linting
|
|
628
|
+
ruff check .
|
|
629
|
+
pylint mypackage/
|
|
630
|
+
|
|
631
|
+
# Verificación de tipos
|
|
632
|
+
mypy .
|
|
633
|
+
|
|
634
|
+
# Testing
|
|
635
|
+
pytest --cov=mypackage --cov-report=html
|
|
636
|
+
|
|
637
|
+
# Escaneo de seguridad
|
|
638
|
+
bandit -r .
|
|
639
|
+
|
|
640
|
+
# Gestión de dependencias
|
|
641
|
+
pip-audit
|
|
642
|
+
safety check
|
|
643
|
+
```
|
|
644
|
+
|
|
645
|
+
### Configuración de pyproject.toml
|
|
646
|
+
|
|
647
|
+
```toml
|
|
648
|
+
[project]
|
|
649
|
+
name = "mypackage"
|
|
650
|
+
version = "1.0.0"
|
|
651
|
+
requires-python = ">=3.9"
|
|
652
|
+
dependencies = [
|
|
653
|
+
"requests>=2.31.0",
|
|
654
|
+
"pydantic>=2.0.0",
|
|
655
|
+
]
|
|
656
|
+
|
|
657
|
+
[project.optional-dependencies]
|
|
658
|
+
dev = [
|
|
659
|
+
"pytest>=7.4.0",
|
|
660
|
+
"pytest-cov>=4.1.0",
|
|
661
|
+
"black>=23.0.0",
|
|
662
|
+
"ruff>=0.1.0",
|
|
663
|
+
"mypy>=1.5.0",
|
|
664
|
+
]
|
|
665
|
+
|
|
666
|
+
[tool.black]
|
|
667
|
+
line-length = 88
|
|
668
|
+
target-version = ['py39']
|
|
669
|
+
|
|
670
|
+
[tool.ruff]
|
|
671
|
+
line-length = 88
|
|
672
|
+
select = ["E", "F", "I", "N", "W"]
|
|
673
|
+
|
|
674
|
+
[tool.mypy]
|
|
675
|
+
python_version = "3.9"
|
|
676
|
+
warn_return_any = true
|
|
677
|
+
warn_unused_configs = true
|
|
678
|
+
disallow_untyped_defs = true
|
|
679
|
+
|
|
680
|
+
[tool.pytest.ini_options]
|
|
681
|
+
testpaths = ["tests"]
|
|
682
|
+
addopts = "--cov=mypackage --cov-report=term-missing"
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
## Referencia rápida: idiomas de Python
|
|
686
|
+
|
|
687
|
+
| Idioma | Descripción |
|
|
688
|
+
|-------|-------------|
|
|
689
|
+
| EAFP | Es más fácil pedir perdón que permiso |
|
|
690
|
+
| Context managers | Usa `with` para la gestión de recursos |
|
|
691
|
+
| List comprehensions | Para transformaciones simples |
|
|
692
|
+
| Generadores | Para evaluación perezosa y datasets grandes |
|
|
693
|
+
| Type hints | Anota las firmas de las funciones |
|
|
694
|
+
| Dataclasses | Para contenedores de datos con métodos autogenerados |
|
|
695
|
+
| `__slots__` | Para optimización de memoria |
|
|
696
|
+
| f-strings | Para formateo de strings (Python 3.6+) |
|
|
697
|
+
| `pathlib.Path` | Para operaciones con rutas (Python 3.4+) |
|
|
698
|
+
| `enumerate` | Para pares índice-elemento en bucles |
|
|
699
|
+
|
|
700
|
+
## Anti-patrones a evitar
|
|
701
|
+
|
|
702
|
+
```python
|
|
703
|
+
# Mal: argumentos por defecto mutables
|
|
704
|
+
def append_to(item, items=[]):
|
|
705
|
+
items.append(item)
|
|
706
|
+
return items
|
|
707
|
+
|
|
708
|
+
# Bien: usa None y crea una lista nueva
|
|
709
|
+
def append_to(item, items=None):
|
|
710
|
+
if items is None:
|
|
711
|
+
items = []
|
|
712
|
+
items.append(item)
|
|
713
|
+
return items
|
|
714
|
+
|
|
715
|
+
# Mal: comprobar el tipo con type()
|
|
716
|
+
if type(obj) == list:
|
|
717
|
+
process(obj)
|
|
718
|
+
|
|
719
|
+
# Bien: usa isinstance
|
|
720
|
+
if isinstance(obj, list):
|
|
721
|
+
process(obj)
|
|
722
|
+
|
|
723
|
+
# Mal: comparar con None usando ==
|
|
724
|
+
if value == None:
|
|
725
|
+
process()
|
|
726
|
+
|
|
727
|
+
# Bien: usa is
|
|
728
|
+
if value is None:
|
|
729
|
+
process()
|
|
730
|
+
|
|
731
|
+
# Mal: from module import *
|
|
732
|
+
from os.path import *
|
|
733
|
+
|
|
734
|
+
# Bien: imports explícitos
|
|
735
|
+
from os.path import join, exists
|
|
736
|
+
|
|
737
|
+
# Mal: except desnudo
|
|
738
|
+
try:
|
|
739
|
+
risky_operation()
|
|
740
|
+
except:
|
|
741
|
+
pass
|
|
742
|
+
|
|
743
|
+
# Bien: excepción específica
|
|
744
|
+
try:
|
|
745
|
+
risky_operation()
|
|
746
|
+
except SpecificError as e:
|
|
747
|
+
logger.error(f"La operación falló: {e}")
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
__Recuerda__: el código Python debe ser legible, explícito y seguir el principio de la mínima sorpresa. Ante la duda, prioriza la claridad sobre la astucia.
|