theus-cli-linux-arm64 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,945 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seguridad-laravel
|
|
3
|
+
description: Buenas prácticas de seguridad en Laravel — autenticación, autorización, seguridad en Eloquent, CSRF, prevención de XSS, seguridad de APIs y configuraciones de despliegue seguras.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Buenas prácticas de seguridad en Laravel
|
|
7
|
+
|
|
8
|
+
Guía integral de seguridad para aplicaciones Laravel, orientada a protegerlas contra las vulnerabilidades más comunes.
|
|
9
|
+
|
|
10
|
+
## Cuándo activar
|
|
11
|
+
|
|
12
|
+
- Al configurar autenticación y autorización en Laravel (Sanctum, Passport, Jetstream, Breeze)
|
|
13
|
+
- Al implementar roles de usuario, permisos y policies
|
|
14
|
+
- Al configurar ajustes de seguridad de producción y variables de entorno
|
|
15
|
+
- Al revisar aplicaciones Laravel en busca de vulnerabilidades de seguridad
|
|
16
|
+
- Al desplegar aplicaciones Laravel a producción
|
|
17
|
+
- Al escribir consultas Eloquent y migraciones seguras
|
|
18
|
+
|
|
19
|
+
## Configuración de producción
|
|
20
|
+
|
|
21
|
+
### Ajustes esenciales de producción
|
|
22
|
+
|
|
23
|
+
```php
|
|
24
|
+
// config/app.php
|
|
25
|
+
'env' => env('APP_ENV', 'production'),
|
|
26
|
+
'debug' => (bool) env('APP_DEBUG', false), // CRÍTICO: nunca true en producción
|
|
27
|
+
'key' => env('APP_KEY'), // Debe estar definida: php artisan key:generate
|
|
28
|
+
|
|
29
|
+
// config/session.php
|
|
30
|
+
'secure' => env('SESSION_SECURE_COOKIE', true),
|
|
31
|
+
'http_only' => true,
|
|
32
|
+
'same_site' => 'lax',
|
|
33
|
+
|
|
34
|
+
// Verificar que APP_KEY esté definida en el arranque
|
|
35
|
+
// bootstrap/app.php o un service provider
|
|
36
|
+
if (empty(config('app.key'))) {
|
|
37
|
+
throw new RuntimeException('APP_KEY no está definida. Ejecuta: php artisan key:generate');
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Seguridad del archivo de entorno
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
# NUNCA subas el .env al control de versiones
|
|
45
|
+
# .gitignore ya incluye .env por defecto
|
|
46
|
+
|
|
47
|
+
# Usa .env.example con placeholders en su lugar
|
|
48
|
+
DB_PASSWORD=
|
|
49
|
+
APP_KEY=
|
|
50
|
+
SANCTUM_TOKEN_PREFIX=
|
|
51
|
+
|
|
52
|
+
# Valida las variables requeridas en el arranque
|
|
53
|
+
// En AppServiceProvider::boot()
|
|
54
|
+
$requiredKeys = ['app.key', 'database.connections.mysql.database', 'database.connections.mysql.username'];
|
|
55
|
+
foreach ($requiredKeys as $key) {
|
|
56
|
+
if (empty(config($key))) {
|
|
57
|
+
throw new RuntimeException("Falta la clave de configuración requerida: {$key}");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Forzar HTTPS
|
|
63
|
+
|
|
64
|
+
```php
|
|
65
|
+
// AppServiceProvider::boot() o middleware
|
|
66
|
+
if (app()->environment('production')) {
|
|
67
|
+
URL::forceScheme('https');
|
|
68
|
+
request()->server->set('HTTPS', 'on');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// config/app.php para proxies de confianza (balanceadores de carga)
|
|
72
|
+
// Usa rangos de IP específicos — * confía en todos y permite suplantar X-Forwarded-*
|
|
73
|
+
// AWS: '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'
|
|
74
|
+
'trusted_proxies' => ['10.0.0.0/8', '172.16.0.0/12'],
|
|
75
|
+
|
|
76
|
+
// Forzar HTTPS en producción vía middleware
|
|
77
|
+
// app/Http/Middleware/ForceHttps.php
|
|
78
|
+
public function handle($request, Closure $next)
|
|
79
|
+
{
|
|
80
|
+
if (!$request->secure() && app()->environment('production')) {
|
|
81
|
+
return redirect()->secure($request->getRequestUri());
|
|
82
|
+
}
|
|
83
|
+
return $next($request);
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Autenticación
|
|
88
|
+
|
|
89
|
+
### Sanctum (autenticación por token de API)
|
|
90
|
+
|
|
91
|
+
```php
|
|
92
|
+
// config/sanctum.php
|
|
93
|
+
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
|
|
94
|
+
'%s%s',
|
|
95
|
+
'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
|
|
96
|
+
env('APP_URL') ? ',' . parse_url(env('APP_URL'), PHP_URL_HOST) : ''
|
|
97
|
+
)));
|
|
98
|
+
|
|
99
|
+
'expiration' => 60 * 24, // Expiración del token en minutos (null = nunca)
|
|
100
|
+
'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''),
|
|
101
|
+
|
|
102
|
+
// Emitir tokens con habilidades (abilities)
|
|
103
|
+
$token = $user->createToken('api-token', ['read', 'write'])->plainTextToken;
|
|
104
|
+
|
|
105
|
+
// Validar habilidades en las rutas
|
|
106
|
+
Route::middleware('auth:sanctum')->group(function () {
|
|
107
|
+
Route::get('/orders', function () {
|
|
108
|
+
// El usuario debe tener la habilidad 'read'
|
|
109
|
+
abort_unless(Auth::user()->tokenCan('read'), 403);
|
|
110
|
+
// ...
|
|
111
|
+
})->middleware('abilities:read');
|
|
112
|
+
|
|
113
|
+
Route::post('/orders', function () {
|
|
114
|
+
// El usuario debe tener la habilidad 'write'
|
|
115
|
+
abort_unless(Auth::user()->tokenCan('write'), 403);
|
|
116
|
+
// ...
|
|
117
|
+
})->middleware('abilities:write');
|
|
118
|
+
});
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Seguridad de contraseñas
|
|
122
|
+
|
|
123
|
+
```php
|
|
124
|
+
// config/hashing.php
|
|
125
|
+
// El valor por defecto es bcrypt. Argon2id es más fuerte.
|
|
126
|
+
'bcrypt' => [
|
|
127
|
+
'rounds' => env('BCRYPT_ROUNDS', 12), // Aumenta para un hashing más fuerte
|
|
128
|
+
],
|
|
129
|
+
|
|
130
|
+
'argon' => [
|
|
131
|
+
'memory' => 65536,
|
|
132
|
+
'threads' => 4,
|
|
133
|
+
'time' => 4,
|
|
134
|
+
],
|
|
135
|
+
|
|
136
|
+
// Validación de contraseñas en RegisterRequest
|
|
137
|
+
public function rules(): array
|
|
138
|
+
{
|
|
139
|
+
return [
|
|
140
|
+
'password' => [
|
|
141
|
+
'required',
|
|
142
|
+
'confirmed',
|
|
143
|
+
Password::min(12)
|
|
144
|
+
->letters()
|
|
145
|
+
->mixedCase()
|
|
146
|
+
->numbers()
|
|
147
|
+
->symbols()
|
|
148
|
+
->uncompromised(), // Consulta haveibeenpwned
|
|
149
|
+
],
|
|
150
|
+
];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Limitar la tasa de intentos de inicio de sesión
|
|
154
|
+
// App\Http\Controllers\Auth\AuthenticatedSessionController
|
|
155
|
+
protected function authenticated(Request $request, $user)
|
|
156
|
+
{
|
|
157
|
+
if ($user->wasRecentlyLockedOut()) {
|
|
158
|
+
// Notificar al usuario de un inicio de sesión sospechoso
|
|
159
|
+
$user->notify(new SuspiciousLoginNotification($request->ip()));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Gestión de sesiones
|
|
165
|
+
|
|
166
|
+
```php
|
|
167
|
+
// config/session.php
|
|
168
|
+
'driver' => env('SESSION_DRIVER', 'database'), // database/redis > file
|
|
169
|
+
'lifetime' => env('SESSION_LIFETIME', 120),
|
|
170
|
+
'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
|
|
171
|
+
'encrypt' => env('SESSION_ENCRYPT', false),
|
|
172
|
+
|
|
173
|
+
// Regenerar la sesión al iniciar sesión
|
|
174
|
+
// App\Http\Controllers\Auth\AuthenticatedSessionController
|
|
175
|
+
public function store(LoginRequest $request): RedirectResponse
|
|
176
|
+
{
|
|
177
|
+
$request->authenticate();
|
|
178
|
+
$request->session()->regenerate(); // CRÍTICO: previene la fijación de sesión
|
|
179
|
+
return redirect()->intended(RouteServiceProvider::HOME);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Invalidar la sesión al cerrar sesión
|
|
183
|
+
public function destroy(Request $request): RedirectResponse
|
|
184
|
+
{
|
|
185
|
+
Auth::guard('web')->logout();
|
|
186
|
+
$request->session()->invalidate();
|
|
187
|
+
$request->session()->regenerateToken();
|
|
188
|
+
return redirect('/');
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Autorización
|
|
193
|
+
|
|
194
|
+
### Gates
|
|
195
|
+
|
|
196
|
+
```php
|
|
197
|
+
// App\Providers\AuthServiceProvider
|
|
198
|
+
use App\Models\Post;
|
|
199
|
+
use App\Models\User;
|
|
200
|
+
use Illuminate\Support\Facades\Gate;
|
|
201
|
+
|
|
202
|
+
public function boot(): void
|
|
203
|
+
{
|
|
204
|
+
Gate::define('update-post', function (User $user, Post $post): bool {
|
|
205
|
+
return $user->id === $post->user_id;
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
Gate::define('publish-post', function (User $user): bool {
|
|
209
|
+
return $user->role === 'editor' || $user->role === 'admin';
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// Usar before() para el override de super-admin
|
|
213
|
+
Gate::before(function (User $user, string $ability): ?bool {
|
|
214
|
+
if ($user->role === 'super-admin') {
|
|
215
|
+
return true; // Concede todas las habilidades
|
|
216
|
+
}
|
|
217
|
+
return null; // Continúa con las verificaciones normales
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Uso en controladores
|
|
222
|
+
public function update(Request $request, Post $post): RedirectResponse
|
|
223
|
+
{
|
|
224
|
+
Gate::authorize('update-post', $post);
|
|
225
|
+
// O: $this->authorize('update-post', $post);
|
|
226
|
+
// O: abort_unless(Auth::user()->can('update-post', $post), 403);
|
|
227
|
+
// ...
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Policies
|
|
232
|
+
|
|
233
|
+
```php
|
|
234
|
+
// App\Policies\PostPolicy
|
|
235
|
+
class PostPolicy
|
|
236
|
+
{
|
|
237
|
+
use HandlesAuthorization;
|
|
238
|
+
|
|
239
|
+
public function viewAny(?User $user): bool
|
|
240
|
+
{
|
|
241
|
+
return true; // Listado público
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
public function view(?User $user, Post $post): bool
|
|
245
|
+
{
|
|
246
|
+
return $post->is_published || ($user && $user->id === $post->user_id);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
public function create(User $user): bool
|
|
250
|
+
{
|
|
251
|
+
return $user->hasVerifiedEmail(); // Primero debe verificar su correo
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
public function update(User $user, Post $post): bool
|
|
255
|
+
{
|
|
256
|
+
return $user->id === $post->user_id;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
public function delete(User $user, Post $post): bool
|
|
260
|
+
{
|
|
261
|
+
return $user->id === $post->user_id && $post->created_at->diffInDays(now()) <= 30;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
public function restore(User $user, Post $post): bool
|
|
265
|
+
{
|
|
266
|
+
return $user->role === 'admin';
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
public function forceDelete(User $user, Post $post): bool
|
|
270
|
+
{
|
|
271
|
+
return $user->role === 'super-admin';
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Registrar en AuthServiceProvider
|
|
276
|
+
protected $policies = [
|
|
277
|
+
Post::class => PostPolicy::class,
|
|
278
|
+
];
|
|
279
|
+
|
|
280
|
+
// Uso en el controlador
|
|
281
|
+
public function show(Post $post): View
|
|
282
|
+
{
|
|
283
|
+
$this->authorize('view', $post);
|
|
284
|
+
return view('posts.show', compact('post'));
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Uso en Blade
|
|
288
|
+
@can('update', $post)
|
|
289
|
+
<a href="{{ route('posts.edit', $post) }}">Editar</a>
|
|
290
|
+
@endcan
|
|
291
|
+
|
|
292
|
+
@cannot('update', $post)
|
|
293
|
+
<span>No puedes editar esta publicación</span>
|
|
294
|
+
@endcannot
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Autorización con middleware
|
|
298
|
+
|
|
299
|
+
```php
|
|
300
|
+
// Usar middleware en las rutas
|
|
301
|
+
Route::put('/posts/{post}', [PostController::class, 'update'])
|
|
302
|
+
->middleware('can:update,post');
|
|
303
|
+
|
|
304
|
+
Route::get('/posts/create', [PostController::class, 'create'])
|
|
305
|
+
->middleware('can:create,App\Models\Post');
|
|
306
|
+
|
|
307
|
+
// Middleware de autorización personalizado
|
|
308
|
+
// app/Http/Middleware/CheckRole.php
|
|
309
|
+
class CheckRole
|
|
310
|
+
{
|
|
311
|
+
public function handle(Request $request, Closure $next, string $role): mixed
|
|
312
|
+
{
|
|
313
|
+
if (!$request->user() || $request->user()->role !== $role) {
|
|
314
|
+
abort(403, 'No autorizado. Esta área requiere el rol: ' . $role);
|
|
315
|
+
}
|
|
316
|
+
return $next($request);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Registrar en el Kernel
|
|
321
|
+
protected $routeMiddleware = [
|
|
322
|
+
'role' => \App\Http\Middleware\CheckRole::class,
|
|
323
|
+
];
|
|
324
|
+
|
|
325
|
+
// Uso en rutas
|
|
326
|
+
Route::middleware(['auth', 'role:admin'])->group(function () {
|
|
327
|
+
Route::get('/admin', [AdminController::class, 'index']);
|
|
328
|
+
});
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
## Seguridad en Eloquent
|
|
332
|
+
|
|
333
|
+
### Protección contra asignación masiva
|
|
334
|
+
|
|
335
|
+
```php
|
|
336
|
+
// MAL: $guarded = [] permite asignar TODAS las columnas de forma masiva
|
|
337
|
+
// NUNCA uses $guarded = [] en producción
|
|
338
|
+
|
|
339
|
+
// BIEN: lista blanca de atributos fillable
|
|
340
|
+
final class User extends Authenticatable
|
|
341
|
+
{
|
|
342
|
+
protected $fillable = [
|
|
343
|
+
'name',
|
|
344
|
+
'email',
|
|
345
|
+
'phone',
|
|
346
|
+
'avatar',
|
|
347
|
+
];
|
|
348
|
+
// NUNCA añadas 'role', 'is_admin', 'is_verified' aquí
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// BIEN: controla explícitamente qué campos pueden llenarse desde las requests
|
|
352
|
+
public function store(StoreUserRequest $request): RedirectResponse
|
|
353
|
+
{
|
|
354
|
+
$user = User::create($request->safe()->only([
|
|
355
|
+
'name', 'email', 'phone', 'avatar'
|
|
356
|
+
]));
|
|
357
|
+
// $request->safe() usa solo datos validados
|
|
358
|
+
// $request->only() por sí solo NO es seguro sin reglas de validación
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// MAL: crear un usuario con los datos de la request directamente
|
|
362
|
+
User::create($request->all()); // ¡VULNERABLE a asignación masiva!
|
|
363
|
+
|
|
364
|
+
// MEJOR: usar DTOs para la creación
|
|
365
|
+
$user = User::create($request->validated()); // Solo campos validados
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### Prevención de inyección SQL
|
|
369
|
+
|
|
370
|
+
```php
|
|
371
|
+
// BIEN: Eloquent parametriza las consultas automáticamente
|
|
372
|
+
User::where('email', $userInput)->first();
|
|
373
|
+
User::whereRaw('email = ?', [$userInput])->first();
|
|
374
|
+
|
|
375
|
+
// BIEN: el Query Builder también parametriza
|
|
376
|
+
DB::table('users')->where('email', $userInput)->first();
|
|
377
|
+
DB::select('SELECT * FROM users WHERE email = ?', [$userInput]);
|
|
378
|
+
|
|
379
|
+
// MAL: interpolación de strings en crudo
|
|
380
|
+
DB::select("SELECT * FROM users WHERE email = '{$userInput}'"); // ¡VULNERABLE!
|
|
381
|
+
User::whereRaw("email = '{$userInput}'")->first(); // ¡VULNERABLE!
|
|
382
|
+
|
|
383
|
+
// MAL: whereRaw/orderByRaw con entrada sin escapar
|
|
384
|
+
User::orderByRaw($userInput); // ¡VULNERABLE!
|
|
385
|
+
User::groupByRaw($userInput); // ¡VULNERABLE!
|
|
386
|
+
|
|
387
|
+
// MAL: DB::statement con concatenación
|
|
388
|
+
DB::statement("INSERT INTO users (email) VALUES ('{$userInput}')"); // ¡VULNERABLE!
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### Casting de atributos
|
|
392
|
+
|
|
393
|
+
```php
|
|
394
|
+
final class User extends Authenticatable
|
|
395
|
+
{
|
|
396
|
+
protected $casts = [
|
|
397
|
+
'email_verified_at' => 'datetime',
|
|
398
|
+
'is_admin' => 'boolean', // El cast a booleano previene inyección de strings
|
|
399
|
+
'settings' => 'array', // json_encode/json_decode automático
|
|
400
|
+
'metadata' => 'encrypted:array', // Casting cifrado en Laravel 11+
|
|
401
|
+
'password' => 'hashed', // Laravel 10+ hashea automáticamente al asignar
|
|
402
|
+
];
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### Seguridad del modelo
|
|
407
|
+
|
|
408
|
+
```php
|
|
409
|
+
final class User extends Authenticatable
|
|
410
|
+
{
|
|
411
|
+
// Ocultar atributos sensibles en respuestas JSON/API
|
|
412
|
+
protected $hidden = [
|
|
413
|
+
'password',
|
|
414
|
+
'remember_token',
|
|
415
|
+
'two_factor_secret',
|
|
416
|
+
'two_factor_recovery_codes',
|
|
417
|
+
];
|
|
418
|
+
|
|
419
|
+
// Añadir (append) solo atributos calculados seguros
|
|
420
|
+
protected $appends = ['full_name']; // seguro
|
|
421
|
+
// NUNCA añadas datos calculados sensibles
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
final class Post extends Model
|
|
425
|
+
{
|
|
426
|
+
// Global scope para filtrar registros con soft delete
|
|
427
|
+
use SoftDeletes;
|
|
428
|
+
|
|
429
|
+
// Prevenir N+1 restringiendo el lazy loading (modo estricto opcional)
|
|
430
|
+
// AppServiceProvider::boot()
|
|
431
|
+
// Model::preventLazyLoading(!app()->isProduction());
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
## Protección CSRF
|
|
436
|
+
|
|
437
|
+
### Protección por defecto
|
|
438
|
+
|
|
439
|
+
```php
|
|
440
|
+
// El CSRF de Laravel está habilitado por defecto vía el middleware VerifyCsrfToken
|
|
441
|
+
// app/Http/Kernel.php (protected $middlewareGroups['web'])
|
|
442
|
+
|
|
443
|
+
// Todos los formularios POST/PUT/PATCH/DELETE deben incluir @csrf
|
|
444
|
+
<form method="POST" action="/posts">
|
|
445
|
+
@csrf
|
|
446
|
+
<input type="text" name="title">
|
|
447
|
+
<button type="submit">Crear</button>
|
|
448
|
+
</form>
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Excluir rutas (con cuidado)
|
|
452
|
+
|
|
453
|
+
```php
|
|
454
|
+
// app/Http/Middleware/VerifyCsrfToken.php
|
|
455
|
+
class VerifyCsrfToken extends Middleware
|
|
456
|
+
{
|
|
457
|
+
// Excluye solo rutas que tengan protección CSRF externa (webhooks, etc.)
|
|
458
|
+
protected $except = [
|
|
459
|
+
'stripe/*', // Los webhooks de Stripe usan su propia verificación de firma
|
|
460
|
+
// Evita un 'api/*' genérico — las rutas stateful de Sanctum necesitan CSRF.
|
|
461
|
+
// Excluye solo rutas específicas de webhooks/endpoints sin estado.
|
|
462
|
+
];
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### CSRF con JavaScript
|
|
467
|
+
|
|
468
|
+
```html
|
|
469
|
+
<meta name="csrf-token" content="{{ csrf_token() }}">
|
|
470
|
+
|
|
471
|
+
<script>
|
|
472
|
+
// Ejemplo con Axios (Laravel incluye Axios)
|
|
473
|
+
axios.defaults.headers.common['X-CSRF-TOKEN'] = document.querySelector(
|
|
474
|
+
'meta[name="csrf-token"]'
|
|
475
|
+
).getAttribute('content');
|
|
476
|
+
|
|
477
|
+
// Ejemplo con Fetch
|
|
478
|
+
fetch('/posts', {
|
|
479
|
+
method: 'POST',
|
|
480
|
+
headers: {
|
|
481
|
+
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content'),
|
|
482
|
+
'Content-Type': 'application/json',
|
|
483
|
+
},
|
|
484
|
+
body: JSON.stringify(data),
|
|
485
|
+
});
|
|
486
|
+
</script>
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
## Prevención de XSS
|
|
490
|
+
|
|
491
|
+
### Seguridad en plantillas Blade
|
|
492
|
+
|
|
493
|
+
```blade
|
|
494
|
+
{{-- SEGURO: escapado automáticamente por Blade --}}
|
|
495
|
+
{{ $userInput }}
|
|
496
|
+
|
|
497
|
+
{{-- PELIGROSO: salida en crudo — NUNCA usar con entrada del usuario --}}
|
|
498
|
+
{!! $userInput !!}
|
|
499
|
+
|
|
500
|
+
{{-- SEGURO: usa {!! !!} solo con contenido de confianza que tú controlas --}}
|
|
501
|
+
{!! $trustedHtmlFromYourServer !!}
|
|
502
|
+
|
|
503
|
+
{{-- BIEN: usa directivas de escapado específicas --}}
|
|
504
|
+
@js($data) {{-- Codifica a JSON para JavaScript --}}
|
|
505
|
+
@json($data) {{-- Codifica a JSON en plantillas --}}
|
|
506
|
+
|
|
507
|
+
{{-- MAL: entrada del usuario directa en HTML crudo --}}
|
|
508
|
+
<div>{!! $user->bio !!}</div> {{-- VULNERABLE si el usuario provee la bio --}}
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### Manejo seguro de HTML
|
|
512
|
+
|
|
513
|
+
```php
|
|
514
|
+
// Cuando debas permitir algo de HTML, usa un enfoque de lista blanca
|
|
515
|
+
use HTMLPurifier; // Requiere: composer require ezyang/htmlpurifier
|
|
516
|
+
|
|
517
|
+
public function sanitizeHtml(string $dirty): string
|
|
518
|
+
{
|
|
519
|
+
$config = \HTMLPurifier_Config::createDefault();
|
|
520
|
+
$config->set('HTML.Allowed', 'p,b,i,a[href],ul,ol,li,br');
|
|
521
|
+
$config->set('URI.AllowedSchemes', ['http', 'https', 'mailto']);
|
|
522
|
+
$purifier = new \HTMLPurifier($config);
|
|
523
|
+
return $purifier->purify($dirty);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// En Blade:
|
|
527
|
+
<div>{!! $sanitizedContent !!}</div> {{-- Seguro tras la purificación --}}
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Escapado en contexto JavaScript
|
|
531
|
+
|
|
532
|
+
```blade
|
|
533
|
+
{{-- SEGURO: la directiva @js de Blade escapa para el contexto JavaScript --}}
|
|
534
|
+
<script>
|
|
535
|
+
const user = @js($user); // JSON + escapado para contexto JS
|
|
536
|
+
const settings = @json($settings); // Codificación JSON directa
|
|
537
|
+
</script>
|
|
538
|
+
|
|
539
|
+
{{-- PELIGROSO: JSON manual en contexto JS --}}
|
|
540
|
+
<script>
|
|
541
|
+
const user = {{ json_encode($user) }}; // ¡NO escapado para JS!
|
|
542
|
+
</script>
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
### Cabeceras HTTP para protección contra XSS
|
|
546
|
+
|
|
547
|
+
```php
|
|
548
|
+
// App\Http\Middleware\SecurityHeaders.php
|
|
549
|
+
class SecurityHeaders
|
|
550
|
+
{
|
|
551
|
+
public function handle(Request $request, Closure $next): mixed
|
|
552
|
+
{
|
|
553
|
+
$response = $next($request);
|
|
554
|
+
|
|
555
|
+
$response->headers->set('X-Content-Type-Options', 'nosniff');
|
|
556
|
+
$response->headers->set('X-Frame-Options', 'DENY');
|
|
557
|
+
$response->headers->set('X-XSS-Protection', '1; mode=block');
|
|
558
|
+
$response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin');
|
|
559
|
+
$response->headers->set(
|
|
560
|
+
'Content-Security-Policy',
|
|
561
|
+
"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self'; frame-ancestors 'none'"
|
|
562
|
+
);
|
|
563
|
+
|
|
564
|
+
return $response;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// Registrar en el kernel
|
|
569
|
+
protected $middleware = [
|
|
570
|
+
\App\Http\Middleware\SecurityHeaders::class,
|
|
571
|
+
];
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
## Validación de entrada
|
|
575
|
+
|
|
576
|
+
### Validación con form requests
|
|
577
|
+
|
|
578
|
+
```php
|
|
579
|
+
final class StorePostRequest extends FormRequest
|
|
580
|
+
{
|
|
581
|
+
public function authorize(): bool
|
|
582
|
+
{
|
|
583
|
+
return $this->user()?->can('create', Post::class) ?? false;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
public function rules(): array
|
|
587
|
+
{
|
|
588
|
+
return [
|
|
589
|
+
'title' => ['required', 'string', 'max:255', 'sanitize_html'],
|
|
590
|
+
'content' => ['required', 'string', 'max:10000'],
|
|
591
|
+
'image' => [
|
|
592
|
+
'required',
|
|
593
|
+
'image',
|
|
594
|
+
'mimes:jpg,jpeg,png,gif,webp', // Lista blanca de tipos específicos
|
|
595
|
+
'max:2048', // Máximo 2 MB
|
|
596
|
+
],
|
|
597
|
+
'tags' => ['array'],
|
|
598
|
+
'tags.*' => ['integer', 'exists:tags,id'],
|
|
599
|
+
];
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
public function messages(): array
|
|
603
|
+
{
|
|
604
|
+
return [
|
|
605
|
+
'title.max' => 'El título no debe exceder los 255 caracteres.',
|
|
606
|
+
'image.max' => 'La imagen debe pesar menos de 2 MB.',
|
|
607
|
+
];
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
// Sanitizar la entrada después de la validación
|
|
611
|
+
public function validated($key = null, $default = null): mixed
|
|
612
|
+
{
|
|
613
|
+
$validated = parent::validated();
|
|
614
|
+
$validated['title'] = strip_tags($validated['title']);
|
|
615
|
+
return $key ? ($validated[$key] ?? $default) : $validated;
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
### Reglas de validación personalizadas
|
|
621
|
+
|
|
622
|
+
```php
|
|
623
|
+
// app/Rules/StrongPassword.php
|
|
624
|
+
class StrongPassword implements Rule
|
|
625
|
+
{
|
|
626
|
+
public function passes($attribute, $value): bool
|
|
627
|
+
{
|
|
628
|
+
return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&#^()_\-+=])[A-Za-z\d@$!%*?&#^()_\-+=]{12,}$/', $value);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
public function message(): string
|
|
632
|
+
{
|
|
633
|
+
return 'El campo :attribute debe tener al menos 12 caracteres con mayúscula, minúscula, número y símbolo.';
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// app/Rules/NotBlacklistedDomain.php
|
|
638
|
+
class NotBlacklistedDomain implements Rule
|
|
639
|
+
{
|
|
640
|
+
private array $blacklisted = ['mailinator.com', 'guerrillamail.com'];
|
|
641
|
+
|
|
642
|
+
public function passes($attribute, $value): bool
|
|
643
|
+
{
|
|
644
|
+
$domain = substr(strrchr($value, '@'), 1);
|
|
645
|
+
return !in_array(strtolower($domain), $this->blacklisted);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
public function message(): string
|
|
649
|
+
{
|
|
650
|
+
return 'No se permiten correos de dominios desechables.';
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
## Seguridad de APIs
|
|
656
|
+
|
|
657
|
+
### Limitación de tasa (rate limiting)
|
|
658
|
+
|
|
659
|
+
```php
|
|
660
|
+
// App/Providers/RouteServiceProvider
|
|
661
|
+
protected function configureRateLimiting(): void
|
|
662
|
+
{
|
|
663
|
+
RateLimiter::for('api', function (Request $request) {
|
|
664
|
+
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
|
|
665
|
+
});
|
|
666
|
+
|
|
667
|
+
RateLimiter::for('auth', function (Request $request) {
|
|
668
|
+
return Limit::perMinute(5)->by($request->ip())
|
|
669
|
+
->response(function () {
|
|
670
|
+
return response()->json([
|
|
671
|
+
'message' => 'Demasiados intentos de inicio de sesión. Inténtalo de nuevo en 1 minuto.',
|
|
672
|
+
], 429);
|
|
673
|
+
});
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
RateLimiter::for('uploads', function (Request $request) {
|
|
677
|
+
return Limit::perHour(10)->by($request->user()?->id ?? $request->ip())
|
|
678
|
+
->response(function () {
|
|
679
|
+
return response()->json([
|
|
680
|
+
'message' => 'Límite de subidas alcanzado. Inténtalo más tarde.',
|
|
681
|
+
], 429);
|
|
682
|
+
});
|
|
683
|
+
});
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
// Uso en rutas
|
|
687
|
+
Route::middleware(['auth:sanctum', 'throttle:api'])->group(function () {
|
|
688
|
+
Route::apiResource('posts', PostController::class);
|
|
689
|
+
});
|
|
690
|
+
|
|
691
|
+
Route::post('/login', [AuthController::class, 'login'])
|
|
692
|
+
->middleware('throttle:auth');
|
|
693
|
+
```
|
|
694
|
+
|
|
695
|
+
### Autenticación de API — Sanctum vs Passport
|
|
696
|
+
|
|
697
|
+
```php
|
|
698
|
+
// Sanctum (recomendado para la mayoría de apps — simple, first-party, SPA)
|
|
699
|
+
// config/sanctum.php
|
|
700
|
+
'expiration' => 60 * 24, // Los tokens expiran a las 24 horas
|
|
701
|
+
'model' => User::class,
|
|
702
|
+
|
|
703
|
+
// Emitir tokens con alcances (scopes)
|
|
704
|
+
$token = $user->createToken('client-name', [
|
|
705
|
+
'posts:read',
|
|
706
|
+
'posts:write',
|
|
707
|
+
])->plainTextToken;
|
|
708
|
+
|
|
709
|
+
// Alcances vía middleware
|
|
710
|
+
Route::middleware('auth:sanctum')->group(function () {
|
|
711
|
+
Route::get('/posts', [PostController::class, 'index'])
|
|
712
|
+
->middleware('abilities:posts:read');
|
|
713
|
+
|
|
714
|
+
Route::post('/posts', [PostController::class, 'store'])
|
|
715
|
+
->middleware('abilities:posts:write');
|
|
716
|
+
});
|
|
717
|
+
|
|
718
|
+
// Passport (OAuth2 — para clientes de terceros o flujos de auth complejos)
|
|
719
|
+
// Instalar: composer require laravel/passport
|
|
720
|
+
Passport::tokensExpireIn(now()->addDays(15));
|
|
721
|
+
Passport::refreshTokensExpireIn(now()->addDays(30));
|
|
722
|
+
Passport::personalAccessTokensExpireIn(now()->addMonths(6));
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
### Configuración de CORS
|
|
726
|
+
|
|
727
|
+
```php
|
|
728
|
+
// config/cors.php
|
|
729
|
+
return [
|
|
730
|
+
'paths' => ['api/*', 'sanctum/csrf-cookie'],
|
|
731
|
+
'allowed_methods' => ['*'],
|
|
732
|
+
'allowed_origins' => explode(',', env('CORS_ALLOWED_ORIGINS', '')), // Lista blanca de orígenes específicos
|
|
733
|
+
'allowed_origins_patterns' => [],
|
|
734
|
+
'allowed_headers' => ['*'],
|
|
735
|
+
'exposed_headers' => ['X-Total-Count', 'X-Pagination-Page'],
|
|
736
|
+
'max_age' => 0,
|
|
737
|
+
'supports_credentials' => true, // Requerido para la auth SPA de Sanctum
|
|
738
|
+
];
|
|
739
|
+
|
|
740
|
+
// NUNCA: permitir todos los orígenes en producción salvo que sea absolutamente necesario
|
|
741
|
+
// 'allowed_origins' => ['*'], // Solo para APIs verdaderamente públicas
|
|
742
|
+
```
|
|
743
|
+
|
|
744
|
+
## Seguridad de subida de archivos
|
|
745
|
+
|
|
746
|
+
### Validación
|
|
747
|
+
|
|
748
|
+
```php
|
|
749
|
+
public function rules(): array
|
|
750
|
+
{
|
|
751
|
+
return [
|
|
752
|
+
'document' => [
|
|
753
|
+
'required',
|
|
754
|
+
'file',
|
|
755
|
+
'mimes:pdf,doc,docx,xls,xlsx', // Lista blanca de tipos MIME específicos
|
|
756
|
+
'max:10240', // 10 MB
|
|
757
|
+
'extensions:pdf,doc,docx,xls,xlsx', // Verificar que la extensión coincida con el MIME
|
|
758
|
+
],
|
|
759
|
+
'avatar' => [
|
|
760
|
+
'nullable',
|
|
761
|
+
'image', // Garantiza que sea una imagen válida
|
|
762
|
+
'mimes:jpg,jpeg,png,webp',
|
|
763
|
+
'max:2048',
|
|
764
|
+
'dimensions:min_width=100,min_height=100,max_width=2000,max_height=2000',
|
|
765
|
+
],
|
|
766
|
+
];
|
|
767
|
+
}
|
|
768
|
+
```
|
|
769
|
+
|
|
770
|
+
### Almacenamiento seguro
|
|
771
|
+
|
|
772
|
+
```php
|
|
773
|
+
// Almacena los archivos fuera del directorio público
|
|
774
|
+
$path = $request->file('document')->store('documents', 'local');
|
|
775
|
+
// Nunca uses el disco 'public' para documentos sensibles
|
|
776
|
+
|
|
777
|
+
// Usa URLs firmadas para acceso temporal a archivos
|
|
778
|
+
use Illuminate\Support\Facades\Storage;
|
|
779
|
+
|
|
780
|
+
public function download(Request $request, string $path)
|
|
781
|
+
{
|
|
782
|
+
// Generar URL firmada temporal (expira en 15 minutos)
|
|
783
|
+
$url = Storage::temporaryUrl($path, now()->addMinutes(15));
|
|
784
|
+
|
|
785
|
+
// Validar que el usuario tenga permiso
|
|
786
|
+
$this->authorize('download', $path);
|
|
787
|
+
|
|
788
|
+
return redirect($url);
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
// Configuración de almacenamiento en la nube con cifrado
|
|
792
|
+
// config/filesystems.php
|
|
793
|
+
's3' => [
|
|
794
|
+
'driver' => 's3',
|
|
795
|
+
'key' => env('AWS_ACCESS_KEY_ID'),
|
|
796
|
+
'secret' => env('AWS_SECRET_ACCESS_KEY'),
|
|
797
|
+
'region' => env('AWS_DEFAULT_REGION'),
|
|
798
|
+
'bucket' => env('AWS_BUCKET'),
|
|
799
|
+
'url' => env('AWS_URL'),
|
|
800
|
+
'endpoint' => env('AWS_ENDPOINT'),
|
|
801
|
+
'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
|
|
802
|
+
'throw' => false,
|
|
803
|
+
'server_side_encryption' => 'AES256', // Cifrado en reposo
|
|
804
|
+
],
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
## Dependencias y secretos
|
|
808
|
+
|
|
809
|
+
### Seguridad con Composer
|
|
810
|
+
|
|
811
|
+
```bash
|
|
812
|
+
# Audita siempre las dependencias en CI
|
|
813
|
+
composer audit
|
|
814
|
+
|
|
815
|
+
# Fija las versiones mayores en composer.json
|
|
816
|
+
"laravel/framework": "^11.0",
|
|
817
|
+
"spatie/laravel-permission": "^6.0"
|
|
818
|
+
|
|
819
|
+
# Verifica paquetes abandonados
|
|
820
|
+
composer why-not
|
|
821
|
+
|
|
822
|
+
# Mantén el lock file en el control de versiones (fija versiones exactas)
|
|
823
|
+
# Ejecuta `composer update` de forma deliberada, nunca en CI/CD
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
### Gestión de secretos
|
|
827
|
+
|
|
828
|
+
```bash
|
|
829
|
+
# Archivo .env (NUNCA subirlo al repositorio)
|
|
830
|
+
# .gitignore incluye .env por defecto
|
|
831
|
+
|
|
832
|
+
APP_KEY=base64:abc123...
|
|
833
|
+
DB_PASSWORD=secure_password
|
|
834
|
+
STRIPE_KEY=sk_live_...
|
|
835
|
+
SANCTUM_TOKEN_PREFIX=myapp_
|
|
836
|
+
|
|
837
|
+
# Para producción: usa un gestor de secretos
|
|
838
|
+
# Despliega con: env $(aws secretsmanager get-secret-value --secret-id prod/db | jq ...) php artisan serve
|
|
839
|
+
|
|
840
|
+
# Valida los secretos en el arranque (AppServiceProvider::boot)
|
|
841
|
+
$secrets = ['services.stripe.key', 'services.stripe.webhook_secret'];
|
|
842
|
+
foreach ($secrets as $key) {
|
|
843
|
+
if (empty(config($key))) {
|
|
844
|
+
Log::critical("Falta el secreto: {$key}");
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
```
|
|
848
|
+
|
|
849
|
+
## Seguridad de colas
|
|
850
|
+
|
|
851
|
+
```php
|
|
852
|
+
// Definir un rate limiter con nombre (típicamente en AppServiceProvider::boot())
|
|
853
|
+
RateLimiter::for('payments', fn () => Limit::perMinute(5));
|
|
854
|
+
```
|
|
855
|
+
|
|
856
|
+
```php
|
|
857
|
+
// Cifrar datos sensibles del job implementando la interfaz
|
|
858
|
+
final class ProcessPaymentJob implements ShouldQueue, ShouldBeEncrypted
|
|
859
|
+
{
|
|
860
|
+
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
|
861
|
+
|
|
862
|
+
public function __construct(
|
|
863
|
+
private readonly string $paymentIntentId, // Los IDs públicos están bien
|
|
864
|
+
private readonly string $cardFingerprint, // Cifrado vía ShouldBeEncrypted
|
|
865
|
+
) {}
|
|
866
|
+
|
|
867
|
+
public function handle(): void
|
|
868
|
+
{
|
|
869
|
+
// Procesar el pago
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
// Limitar reintentos y el retraso entre intentos
|
|
873
|
+
public function retryUntil(): Carbon
|
|
874
|
+
{
|
|
875
|
+
return now()->addMinutes(5);
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
// Limitar cuántos jobs de este tipo pueden ejecutarse
|
|
879
|
+
public function middleware(): array
|
|
880
|
+
{
|
|
881
|
+
return [
|
|
882
|
+
new RateLimited('payments'),
|
|
883
|
+
];
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
```
|
|
887
|
+
|
|
888
|
+
## Registro de eventos de seguridad
|
|
889
|
+
|
|
890
|
+
```php
|
|
891
|
+
// config/logging.php
|
|
892
|
+
'channels' => [
|
|
893
|
+
'security' => [
|
|
894
|
+
'driver' => 'single',
|
|
895
|
+
'path' => storage_path('logs/security.log'),
|
|
896
|
+
'level' => 'warning',
|
|
897
|
+
],
|
|
898
|
+
],
|
|
899
|
+
|
|
900
|
+
// Helper de log de auditoría
|
|
901
|
+
final class SecurityLogger
|
|
902
|
+
{
|
|
903
|
+
public static function log(string $event, array $context = []): void
|
|
904
|
+
{
|
|
905
|
+
Log::channel('security')->warning($event, array_merge([
|
|
906
|
+
'user_id' => Auth::id(),
|
|
907
|
+
'ip' => request()->ip(),
|
|
908
|
+
'user_agent' => request()->userAgent(),
|
|
909
|
+
'url' => request()->fullUrl(),
|
|
910
|
+
'timestamp' => now()->toIso8601String(),
|
|
911
|
+
], $context));
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
// Uso
|
|
916
|
+
SecurityLogger::log('failed_login_attempt', ['email' => $email]);
|
|
917
|
+
SecurityLogger::log('password_change');
|
|
918
|
+
SecurityLogger::log('role_change', ['target_user' => $targetId, 'new_role' => 'admin']);
|
|
919
|
+
SecurityLogger::log('suspicious_activity', ['reason' => 'multiple_attempts_from_different_ips']);
|
|
920
|
+
```
|
|
921
|
+
|
|
922
|
+
## Lista de verificación rápida de seguridad
|
|
923
|
+
|
|
924
|
+
| Verificación | Descripción |
|
|
925
|
+
|-------|-------------|
|
|
926
|
+
| `APP_DEBUG=false` | Nunca ejecutes con debug habilitado en producción |
|
|
927
|
+
| `APP_KEY` definida | Ejecuta siempre `php artisan key:generate` |
|
|
928
|
+
| HTTPS forzado | Fuerza HTTPS en producción vía middleware o proxy |
|
|
929
|
+
| `$fillable` en lista blanca | Nunca uses `$guarded = []` |
|
|
930
|
+
| CSRF activo | `@csrf` en todos los formularios que cambian estado |
|
|
931
|
+
| Sanctum/Passport configurado | Autenticación de API con abilities/scopes de token |
|
|
932
|
+
| Rate limiting aplicado | Limita la tasa en endpoints de API y de autenticación |
|
|
933
|
+
| Validación de entrada | FormRequest con reglas específicas, nunca `$request->all()` |
|
|
934
|
+
| Restricciones de subida de archivos | Valida tipos MIME, tamaño, dimensiones |
|
|
935
|
+
| `composer audit` en CI | Verifica dependencias con vulnerabilidades conocidas |
|
|
936
|
+
| `password_hash` / `password_verify` | Usa el hashing integrado de Laravel (bcrypt/Argon2) |
|
|
937
|
+
| Regeneración de sesión al iniciar sesión | Llama a `$request->session()->regenerate()` |
|
|
938
|
+
| Middleware de cabeceras de seguridad | CSP, X-Frame-Options, X-Content-Type-Options |
|
|
939
|
+
| Eventos de seguridad registrados | Log de auditoría para fallos de auth, cambios de rol, actividad sospechosa |
|
|
940
|
+
| `.env` no subido al repositorio | Verifica que `.gitignore` incluya `.env` |
|
|
941
|
+
|
|
942
|
+
## Skills relacionadas
|
|
943
|
+
|
|
944
|
+
- `patrones-laravel` — Arquitectura Laravel, routing, Eloquent y patrones de API
|
|
945
|
+
- `patrones-backend` — Patrones generales de APIs backend y bases de datos
|