@saulwade/swl-ses 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +238 -0
- package/README.md +560 -0
- package/_userland/agentes/.gitkeep +0 -0
- package/_userland/habilidades/.gitkeep +0 -0
- package/agentes/.evolved.json +9 -0
- package/agentes/accesibilidad-wcag-swl.md +692 -0
- package/agentes/arquitecto-swl.md +238 -0
- package/agentes/auto-evolucion-swl.md +854 -0
- package/agentes/backend-api-swl.md +470 -0
- package/agentes/backend-csharp-swl.md +418 -0
- package/agentes/backend-go-swl.md +388 -0
- package/agentes/backend-java-swl.md +279 -0
- package/agentes/backend-node-swl.md +477 -0
- package/agentes/backend-python-swl.md +608 -0
- package/agentes/backend-rust-swl.md +362 -0
- package/agentes/backend-workers-swl.md +480 -0
- package/agentes/cloud-infra-swl.md +485 -0
- package/agentes/consolidador-swl.md +539 -0
- package/agentes/datos-swl.md +584 -0
- package/agentes/depurador-swl.md +349 -0
- package/agentes/devops-ci-swl.md +374 -0
- package/agentes/disenador-ui-swl.md +558 -0
- package/agentes/documentador-swl.md +343 -0
- package/agentes/evals/arquitecto-swl.evals.json +56 -0
- package/agentes/evals/auto-evolucion-swl.evals.json +68 -0
- package/agentes/evals/implementador-swl.evals.json +56 -0
- package/agentes/evals/orquestador-swl.evals.json +60 -0
- package/agentes/evals/perfilador-usuario-swl.evals.json +60 -0
- package/agentes/evals/red-team-swl.evals.json +59 -0
- package/agentes/evals/revisor-codigo-swl.evals.json +59 -0
- package/agentes/frontend-angular-swl.md +627 -0
- package/agentes/frontend-css-swl.md +720 -0
- package/agentes/frontend-react-swl.md +696 -0
- package/agentes/frontend-swl.md +500 -0
- package/agentes/frontend-tailwind-swl.md +830 -0
- package/agentes/implementador-swl.md +328 -0
- package/agentes/investigador-swl.md +430 -0
- package/agentes/investigador-ux-swl.md +500 -0
- package/agentes/llm-apps-swl.md +276 -0
- package/agentes/migrador-swl.md +417 -0
- package/agentes/mobile-android-swl.md +509 -0
- package/agentes/mobile-cross-swl.md +539 -0
- package/agentes/mobile-ios-swl.md +500 -0
- package/agentes/mobile-testing-swl.md +300 -0
- package/agentes/notificador-swl.md +916 -0
- package/agentes/observabilidad-swl.md +436 -0
- package/agentes/orquestador-swl.md +884 -0
- package/agentes/pagos-swl.md +283 -0
- package/agentes/perfilador-usuario-swl.md +306 -0
- package/agentes/planificador-swl.md +402 -0
- package/agentes/producto-prd-swl.md +587 -0
- package/agentes/red-team-swl.md +216 -0
- package/agentes/release-manager-swl.md +568 -0
- package/agentes/rendimiento-swl.md +714 -0
- package/agentes/resolutor-build-swl.md +243 -0
- package/agentes/revisor-angular-swl.md +276 -0
- package/agentes/revisor-codigo-swl.md +348 -0
- package/agentes/revisor-csharp-swl.md +262 -0
- package/agentes/revisor-go-swl.md +257 -0
- package/agentes/revisor-java-swl.md +255 -0
- package/agentes/revisor-kotlin-swl.md +271 -0
- package/agentes/revisor-nextjs-swl.md +279 -0
- package/agentes/revisor-php-swl.md +269 -0
- package/agentes/revisor-react-swl.md +276 -0
- package/agentes/revisor-rust-swl.md +344 -0
- package/agentes/revisor-seguridad-swl.md +390 -0
- package/agentes/revisor-swift-swl.md +266 -0
- package/agentes/revisor-typescript-swl.md +344 -0
- package/agentes/sre-swl.md +265 -0
- package/agentes/tdd-qa-swl.md +354 -0
- package/agentes/ux-disenador-swl.md +501 -0
- package/bin/lib/bot-comandos.js +1030 -0
- package/bin/lib/bot-discovery.js +182 -0
- package/bin/lib/bot-git.js +142 -0
- package/bin/swl-ses.js +325 -0
- package/bin/swl-telegram-bot.js +442 -0
- package/bin/swl-telegram-bot.plist +21 -0
- package/bin/swl-telegram-bot.service +14 -0
- package/comandos/swl/.evolved.json +23 -0
- package/comandos/swl/actualizar.md +174 -0
- package/comandos/swl/adoptar-proyecto.md +207 -0
- package/comandos/swl/aprender.md +701 -0
- package/comandos/swl/auditar-deps.md +134 -0
- package/comandos/swl/autoresearch.md +170 -0
- package/comandos/swl/ayuda.md +224 -0
- package/comandos/swl/brainstorm.md +50 -0
- package/comandos/swl/checkpoint.md +330 -0
- package/comandos/swl/compactar.md +283 -0
- package/comandos/swl/configurar-ci.md +227 -0
- package/comandos/swl/contexto.md +112 -0
- package/comandos/swl/contribuir.md +233 -0
- package/comandos/swl/crear-skill.md +292 -0
- package/comandos/swl/cron.md +196 -0
- package/comandos/swl/dashboard.md +146 -0
- package/comandos/swl/discutir-fase.md +230 -0
- package/comandos/swl/ejecutar-fase.md +135 -0
- package/comandos/swl/evaluar-skill.md +487 -0
- package/comandos/swl/evolucion-estado.md +142 -0
- package/comandos/swl/evolucionar.md +259 -0
- package/comandos/swl/exportar-vault.md +189 -0
- package/comandos/swl/gateway.md +158 -0
- package/comandos/swl/inbox.md +116 -0
- package/comandos/swl/instalar.md +220 -0
- package/comandos/swl/instintos.md +86 -0
- package/comandos/swl/mapear-codebase.md +312 -0
- package/comandos/swl/mcp-status.md +175 -0
- package/comandos/swl/metricas.md +270 -0
- package/comandos/swl/modelo.md +102 -0
- package/comandos/swl/notificaciones.md +396 -0
- package/comandos/swl/nuevo-proyecto.md +154 -0
- package/comandos/swl/planear-fase.md +221 -0
- package/comandos/swl/plugins.md +256 -0
- package/comandos/swl/reflect-skills.md +125 -0
- package/comandos/swl/release.md +217 -0
- package/comandos/swl/revisar-impacto.md +206 -0
- package/comandos/swl/revisar.md +330 -0
- package/comandos/swl/salud.md +363 -0
- package/comandos/swl/sesiones.md +200 -0
- package/comandos/swl/skill-search.md +113 -0
- package/comandos/swl/verificar.md +585 -0
- package/comandos/swl/wiki.md +620 -0
- package/contextos/dev.md +32 -0
- package/contextos/research.md +30 -0
- package/contextos/review.md +31 -0
- package/habilidades/accesibilidad-a11y/SKILL.md +201 -0
- package/habilidades/accesibilidad-a11y/evals/evals.json +56 -0
- package/habilidades/accesibilidad-a11y/recursos/ejemplos-y-checklist-completo.md +441 -0
- package/habilidades/agent-browser/SKILL.md +218 -0
- package/habilidades/agentes-como-servicio/SKILL.md +218 -0
- package/habilidades/ai-runtime-security/SKILL.md +273 -0
- package/habilidades/angular-avanzado/SKILL.md +164 -0
- package/habilidades/angular-avanzado/recursos/ejemplos-avanzados.md +219 -0
- package/habilidades/angular-moderno/SKILL.md +186 -0
- package/habilidades/angular-moderno/evals/evals.json +45 -0
- package/habilidades/angular-moderno/recursos/ejemplos-avanzados.md +106 -0
- package/habilidades/api-rest-diseno/SKILL.md +191 -0
- package/habilidades/api-rest-diseno/recursos/openapi-template.yaml +506 -0
- package/habilidades/api-rest-diseno/recursos/referencia-api.md +140 -0
- package/habilidades/aprendizaje-continuo/SKILL.md +151 -0
- package/habilidades/aprendizaje-continuo/evals/evals.json +53 -0
- package/habilidades/aprendizaje-continuo/recursos/referencia-instintos.md +290 -0
- package/habilidades/async-python/SKILL.md +149 -0
- package/habilidades/async-python/evals/evals.json +47 -0
- package/habilidades/async-python/recursos/patrones-y-ejemplos-completos.md +292 -0
- package/habilidades/auth-patrones/.evolved.json +9 -0
- package/habilidades/auth-patrones/SKILL.md +413 -0
- package/habilidades/auth-patrones/recursos/implementaciones-completas.md +229 -0
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -0
- package/habilidades/auto-evolucion-protocolo/evals/evals.json +55 -0
- package/habilidades/auto-evolucion-protocolo/recursos/referencia-completa.md +145 -0
- package/habilidades/autoresearch/SKILL.md +268 -0
- package/habilidades/autoresearch/evals/evals.json +41 -0
- package/habilidades/autoresearch/recursos/checklist-template.md +191 -0
- package/habilidades/autoresearch/scripts/calcular-score.js +88 -0
- package/habilidades/azure-cloud/SKILL.md +308 -0
- package/habilidades/azure-cloud/recursos/aks.md +327 -0
- package/habilidades/backend-mcp-servidor/SKILL.md +270 -0
- package/habilidades/backend-production-resilience/SKILL.md +288 -0
- package/habilidades/brainstorming/SKILL.md +295 -0
- package/habilidades/brainstorming/recursos/componentes-html.md +247 -0
- package/habilidades/build-errors-cpp/SKILL.md +270 -0
- package/habilidades/build-errors-csharp/SKILL.md +265 -0
- package/habilidades/build-errors-go/SKILL.md +306 -0
- package/habilidades/build-errors-java/SKILL.md +278 -0
- package/habilidades/build-errors-kotlin/SKILL.md +303 -0
- package/habilidades/build-errors-nextjs/SKILL.md +312 -0
- package/habilidades/build-errors-php/SKILL.md +270 -0
- package/habilidades/build-errors-python/SKILL.md +292 -0
- package/habilidades/build-errors-rust/SKILL.md +284 -0
- package/habilidades/build-errors-swift/SKILL.md +272 -0
- package/habilidades/build-errors-typescript/SKILL.md +369 -0
- package/habilidades/checklist-calidad/SKILL.md +271 -0
- package/habilidades/checklist-calidad/recursos/quality-report-template.md +148 -0
- package/habilidades/checklist-seguridad/SKILL.md +285 -0
- package/habilidades/checkpoints-verificacion/SKILL.md +298 -0
- package/habilidades/checkpoints-verificacion/recursos/checkpoint-templates.md +360 -0
- package/habilidades/ci-cd-pipelines/SKILL.md +157 -0
- package/habilidades/ci-cd-pipelines/recursos/github-actions-template.yaml +403 -0
- package/habilidades/ci-cd-pipelines/recursos/pipelines-completos.md +487 -0
- package/habilidades/cloud-aws/SKILL.md +142 -0
- package/habilidades/cloud-aws/recursos/servicios-aws-referencia.md +321 -0
- package/habilidades/compactacion-contexto/SKILL.md +247 -0
- package/habilidades/contenedores-docker/SKILL.md +137 -0
- package/habilidades/contenedores-docker/recursos/dockerfile-template.dockerfile +160 -0
- package/habilidades/contenedores-docker/recursos/ejemplos-y-configuraciones.md +327 -0
- package/habilidades/context-builder/SKILL.md +170 -0
- package/habilidades/control-profundidad/SKILL.md +128 -0
- package/habilidades/csharp-experto/SKILL.md +322 -0
- package/habilidades/csharp-patrones/SKILL.md +316 -0
- package/habilidades/csharp-testing/SKILL.md +286 -0
- package/habilidades/css-moderno/SKILL.md +166 -0
- package/habilidades/css-moderno/evals/evals.json +43 -0
- package/habilidades/css-moderno/recursos/ejemplos-y-patrones-completos.md +337 -0
- package/habilidades/datos-etl/SKILL.md +129 -0
- package/habilidades/datos-etl/recursos/implementaciones-completas.md +322 -0
- package/habilidades/dbml-experto/SKILL.md +339 -0
- package/habilidades/dbml-experto/evals/evals.json +56 -0
- package/habilidades/dependencias-auditoria/SKILL.md +320 -0
- package/habilidades/deprecacion-migracion/SKILL.md +169 -0
- package/habilidades/deprecacion-migracion/recursos/implementaciones-completas.md +220 -0
- package/habilidades/design-tokens/SKILL.md +158 -0
- package/habilidades/design-tokens/recursos/tokens-y-configuracion.md +363 -0
- package/habilidades/devsecops-pipeline-security/SKILL.md +309 -0
- package/habilidades/diagrama-arquitectura/SKILL.md +165 -0
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -0
- package/habilidades/discutir-fase/SKILL.md +188 -0
- package/habilidades/diseno-herramientas-agente/SKILL.md +199 -0
- package/habilidades/diseno-responsivo/SKILL.md +186 -0
- package/habilidades/diseno-responsivo/recursos/ejemplos-layouts.md +156 -0
- package/habilidades/django-experto/SKILL.md +205 -0
- package/habilidades/django-experto/recursos/async-django.md +390 -0
- package/habilidades/django-experto/recursos/drf-patrones.md +438 -0
- package/habilidades/django-experto/recursos/orm-avanzado.md +382 -0
- package/habilidades/django-experto/recursos/referencia-completa.md +188 -0
- package/habilidades/django-experto/recursos/testing-django.md +415 -0
- package/habilidades/doc-sync/SKILL.md +280 -0
- package/habilidades/drift-detection/SKILL.md +179 -0
- package/habilidades/ejecutar-fase/SKILL.md +468 -0
- package/habilidades/estilo-sin-ai-isms/SKILL.md +775 -0
- package/habilidades/estilo-sin-ai-isms/evals/evals.json +63 -0
- package/habilidades/estilo-sin-ai-isms/scripts/detectar_aiisms.py +500 -0
- package/habilidades/estructura-proyecto-claude/SKILL.md +215 -0
- package/habilidades/estructura-proyecto-claude/recursos/claude-md-template.md +261 -0
- package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +176 -0
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +289 -0
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +77 -0
- package/habilidades/estructura-proyecto-claude/recursos/variantes-por-stack.md +177 -0
- package/habilidades/evaluacion-agentes/SKILL.md +314 -0
- package/habilidades/event-driven/SKILL.md +153 -0
- package/habilidades/event-driven/recursos/implementaciones-completas.md +423 -0
- package/habilidades/extraccion-documentos/SKILL.md +221 -0
- package/habilidades/extractor-de-aprendizajes/.evolved.json +9 -0
- package/habilidades/extractor-de-aprendizajes/SKILL.md +311 -0
- package/habilidades/extractor-de-aprendizajes/evals/evals.json +55 -0
- package/habilidades/fastapi-experto/SKILL.md +221 -0
- package/habilidades/fastapi-experto/recursos/async-patterns.md +438 -0
- package/habilidades/fastapi-experto/recursos/dependency-injection.md +330 -0
- package/habilidades/fastapi-experto/recursos/referencia-completa.md +79 -0
- package/habilidades/fastapi-experto/recursos/testing-httpx.md +420 -0
- package/habilidades/filament-admin/SKILL.md +290 -0
- package/habilidades/frontend-avanzado/SKILL.md +257 -0
- package/habilidades/frontend-avanzado/recursos/apis-nativas-ejemplos.md +341 -0
- package/habilidades/gcp-cloud/SKILL.md +260 -0
- package/habilidades/gcp-cloud/recursos/gke.md +234 -0
- package/habilidades/gcp-cloud/recursos/terraform-gcp.md +307 -0
- package/habilidades/generacion-mermaid/SKILL.md +229 -0
- package/habilidades/git-worktrees-paralelo/SKILL.md +270 -0
- package/habilidades/go-experto/SKILL.md +305 -0
- package/habilidades/go-patrones/SKILL.md +299 -0
- package/habilidades/go-testing/SKILL.md +291 -0
- package/habilidades/graphql-experto/SKILL.md +323 -0
- package/habilidades/guardrail-semantico/SKILL.md +282 -0
- package/habilidades/harness-claude-code/SKILL.md +299 -0
- package/habilidades/iam-secretos/SKILL.md +265 -0
- package/habilidades/iam-secretos/recursos/implementaciones-completas.md +356 -0
- package/habilidades/infra-github-actions/SKILL.md +166 -0
- package/habilidades/instalar-sistema/.evolved.json +9 -0
- package/habilidades/instalar-sistema/SKILL.md +221 -0
- package/habilidades/java-experto/SKILL.md +290 -0
- package/habilidades/java-patrones/SKILL.md +275 -0
- package/habilidades/java-testing/SKILL.md +288 -0
- package/habilidades/kotlin-compose/SKILL.md +278 -0
- package/habilidades/kotlin-compose/recursos/animaciones-performance.md +93 -0
- package/habilidades/kotlin-experto/SKILL.md +318 -0
- package/habilidades/kotlin-testing/SKILL.md +267 -0
- package/habilidades/kotlin-testing/recursos/testing-avanzado.md +74 -0
- package/habilidades/kubernetes-orquestacion/SKILL.md +152 -0
- package/habilidades/kubernetes-orquestacion/recursos/manifiestos-completos.md +452 -0
- package/habilidades/langchain-langraph/SKILL.md +386 -0
- package/habilidades/langchain-langraph/recursos/evaluacion-rag.md +321 -0
- package/habilidades/langchain-langraph/recursos/rag-maturity-model.md +225 -0
- package/habilidades/langchain-langraph/recursos/vectorstores.md +306 -0
- package/habilidades/legacy-code-rescue/SKILL.md +267 -0
- package/habilidades/likec4-experto/SKILL.md +412 -0
- package/habilidades/likec4-experto/evals/evals.json +69 -0
- package/habilidades/manejo-errores/.evolved.json +9 -0
- package/habilidades/manejo-errores/SKILL.md +407 -0
- package/habilidades/manejo-errores/recursos/implementaciones-completas.md +248 -0
- package/habilidades/mapear-codebase/SKILL.md +275 -0
- package/habilidades/memoria-busqueda/SKILL.md +194 -0
- package/habilidades/memoria-busqueda/evals/evals.json +44 -0
- package/habilidades/meta-skills-estandar/SKILL.md +298 -0
- package/habilidades/meta-skills-estandar/recursos/anti-patrones-y-leyes.md +205 -0
- package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +107 -0
- package/habilidades/meta-skills-estandar/recursos/idiomas-framework.md +60 -0
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -0
- package/habilidades/microservicios/SKILL.md +155 -0
- package/habilidades/microservicios/recursos/patrones-y-ejemplos-completos.md +325 -0
- package/habilidades/mobile-flutter/SKILL.md +199 -0
- package/habilidades/mobile-flutter/recursos/ejemplos-completos.md +319 -0
- package/habilidades/mobile-react-native/SKILL.md +176 -0
- package/habilidades/mobile-react-native/recursos/ejemplos-completos.md +216 -0
- package/habilidades/mongodb-experto/SKILL.md +302 -0
- package/habilidades/monitoring-alertas/SKILL.md +201 -0
- package/habilidades/monitoring-alertas/recursos/instrumentacion-y-alertas.md +301 -0
- package/habilidades/nestjs-experto/SKILL.md +307 -0
- package/habilidades/nestjs-experto/recursos/guards-interceptors.md +339 -0
- package/habilidades/nestjs-experto/recursos/modulos-di.md +287 -0
- package/habilidades/nestjs-experto/recursos/testing-nestjs.md +354 -0
- package/habilidades/nextjs-experto/SKILL.md +335 -0
- package/habilidades/nextjs-patrones/SKILL.md +303 -0
- package/habilidades/nextjs-testing/SKILL.md +331 -0
- package/habilidades/node-experto/.evolved.json +9 -0
- package/habilidades/node-experto/SKILL.md +266 -0
- package/habilidades/node-experto/recursos/patrones-completos.md +283 -0
- package/habilidades/notificaciones-multicanal/SKILL.md +159 -0
- package/habilidades/notificaciones-multicanal/recursos/config-template.json +115 -0
- package/habilidades/notificaciones-multicanal/recursos/configuracion-y-templates.md +303 -0
- package/habilidades/nuevo-proyecto/SKILL.md +204 -0
- package/habilidades/orquestacion-async/SKILL.md +303 -0
- package/habilidades/paid-media-tracking/SKILL.md +269 -0
- package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +220 -0
- package/habilidades/paid-media-tracking/recursos/google-ads-api.md +215 -0
- package/habilidades/patrones-python/SKILL.md +228 -0
- package/habilidades/patrones-python/evals/evals.json +56 -0
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -0
- package/habilidades/patrones-python/recursos/referencia-completa.md +202 -0
- package/habilidades/perfil-usuario/SKILL.md +200 -0
- package/habilidades/perfil-usuario/evals/evals.json +55 -0
- package/habilidades/performance-baseline/SKILL.md +297 -0
- package/habilidades/php-experto/SKILL.md +291 -0
- package/habilidades/php-patrones/SKILL.md +306 -0
- package/habilidades/php-testing/SKILL.md +280 -0
- package/habilidades/planear-fase/SKILL.md +269 -0
- package/habilidades/postgresql-experto/SKILL.md +151 -0
- package/habilidades/postgresql-experto/evals/evals.json +53 -0
- package/habilidades/postgresql-experto/recursos/referencia-completa.md +215 -0
- package/habilidades/prevencion-racionalizacion/SKILL.md +175 -0
- package/habilidades/prevencion-sobreingenieria/SKILL.md +323 -0
- package/habilidades/privacy-memoria/SKILL.md +141 -0
- package/habilidades/privacy-memoria/evals/evals.json +43 -0
- package/habilidades/prompt-engineering/SKILL.md +518 -0
- package/habilidades/prompt-engineering/recursos/patrones-avanzados.md +467 -0
- package/habilidades/rag-arquitectura/SKILL.md +338 -0
- package/habilidades/rails-experto/SKILL.md +237 -0
- package/habilidades/rails-experto/recursos/active-record.md +260 -0
- package/habilidades/rails-experto/recursos/hotwire-turbo.md +293 -0
- package/habilidades/rails-experto/recursos/testing-rspec.md +362 -0
- package/habilidades/react-experto/SKILL.md +209 -0
- package/habilidades/react-experto/evals/evals.json +55 -0
- package/habilidades/react-experto/recursos/patrones-y-ejemplos-completos.md +240 -0
- package/habilidades/react-optimizacion/SKILL.md +174 -0
- package/habilidades/react-optimizacion/recursos/patrones-avanzados.md +138 -0
- package/habilidades/redis-experto/SKILL.md +305 -0
- package/habilidades/release-semver/.evolved.json +9 -0
- package/habilidades/release-semver/SKILL.md +248 -0
- package/habilidades/release-semver/scripts/generar-changelog.sh +238 -0
- package/habilidades/rust-experto/SKILL.md +400 -0
- package/habilidades/rust-patrones/SKILL.md +296 -0
- package/habilidades/rust-testing/SKILL.md +311 -0
- package/habilidades/seguridad-skills-ia/SKILL.md +262 -0
- package/habilidades/sql-optimizacion/SKILL.md +200 -0
- package/habilidades/sql-optimizacion/evals/evals.json +54 -0
- package/habilidades/sql-optimizacion/recursos/patrones-sql-avanzados.md +131 -0
- package/habilidades/sre-patrones/SKILL.md +333 -0
- package/habilidades/sre-patrones/recursos/chaos-engineering.md +241 -0
- package/habilidades/sre-patrones/recursos/oncall-design.md +236 -0
- package/habilidades/stripe-pagos/SKILL.md +550 -0
- package/habilidades/stripe-pagos/recursos/errores-reintentos.md +390 -0
- package/habilidades/stripe-pagos/recursos/stripe-connect.md +290 -0
- package/habilidades/structured-outputs/SKILL.md +343 -0
- package/habilidades/swift-experto/SKILL.md +320 -0
- package/habilidades/swift-experto/recursos/keychain-y-wrappers.md +110 -0
- package/habilidades/swift-patrones/SKILL.md +313 -0
- package/habilidades/swift-patrones/recursos/tca-ejemplo-completo.md +113 -0
- package/habilidades/swift-testing/SKILL.md +254 -0
- package/habilidades/swift-testing/recursos/xcuitest-planes.md +143 -0
- package/habilidades/swl-dashboard/SKILL.md +370 -0
- package/habilidades/swl-markitdown/SKILL.md +285 -0
- package/habilidades/swl-markitdown/evals/evals.json +52 -0
- package/habilidades/swl-revisar-impacto/SKILL.md +233 -0
- package/habilidades/tailwind-experto/SKILL.md +240 -0
- package/habilidades/tailwind-experto/recursos/referencia-completa.md +184 -0
- package/habilidades/tdd-workflow/SKILL.md +293 -0
- package/habilidades/terraform-experto/SKILL.md +321 -0
- package/habilidades/testing-python/SKILL.md +340 -0
- package/habilidades/testing-python/recursos/ejemplos-completos.md +167 -0
- package/habilidades/threat-model-lite/SKILL.md +246 -0
- package/habilidades/tracing-processor/SKILL.md +212 -0
- package/habilidades/tracking-measurement/SKILL.md +239 -0
- package/habilidades/tracking-measurement/recursos/consent-mode.md +231 -0
- package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +216 -0
- package/habilidades/tracking-measurement/recursos/meta-capi.md +262 -0
- package/habilidades/typescript-avanzado/SKILL.md +144 -0
- package/habilidades/typescript-avanzado/evals/evals.json +55 -0
- package/habilidades/typescript-avanzado/recursos/patrones-y-ejemplos-completos.md +298 -0
- package/habilidades/typescript-diagnosticos/SKILL.md +513 -0
- package/habilidades/ux-diseno/SKILL.md +116 -0
- package/habilidades/ux-diseno/evals/evals.json +43 -0
- package/habilidades/ux-diseno/recursos/patrones-ux-referencia.md +214 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +136 -0
- package/habilidades/validacion-ci-sistema/recursos/validadores-completos.md +369 -0
- package/habilidades/validacion-ci-sistema/scripts/validar-sistema.sh +286 -0
- package/habilidades/verificacion-evidencia/SKILL.md +160 -0
- package/habilidades/verificar-trabajo/SKILL.md +303 -0
- package/habilidades/verificar-trabajo/recursos/plantilla-verificacion.md +60 -0
- package/habilidades/wiki-conocimiento/SKILL.md +276 -0
- package/habilidades/wireframes-flujos/SKILL.md +212 -0
- package/habilidades/wireframes-flujos/recursos/referencia-completa.md +192 -0
- package/habilidades/workflow-claude-code/SKILL.md +260 -0
- package/habilidades/workflow-claude-code/recursos/referencia-completa.md +109 -0
- package/hooks/_run-hook.sh +57 -0
- package/hooks/actualizar-perfil-usuario.js +364 -0
- package/hooks/agente-lifecycle.js +71 -0
- package/hooks/aiisms-detector.js +173 -0
- package/hooks/audit-trail.js +204 -0
- package/hooks/auto-background.js +97 -0
- package/hooks/auto-consolidacion.js +178 -0
- package/hooks/auto-evolucion.js +666 -0
- package/hooks/auto-restaurar-settings.js +360 -0
- package/hooks/calidad-pre-commit.js +929 -0
- package/hooks/calidad-typescript.js +511 -0
- package/hooks/captura-feedback-usuario.js +148 -0
- package/hooks/check-update.js +211 -0
- package/hooks/clasificador-mensajes.js +271 -0
- package/hooks/degradacion-instintos.js +272 -0
- package/hooks/escaneo-secretos.js +389 -0
- package/hooks/extraccion-aprendizajes.js +763 -0
- package/hooks/grafo-contexto.js +129 -0
- package/hooks/graph-update.js +67 -0
- package/hooks/guardrail-modelo.js +247 -0
- package/hooks/inbox-aviso.js +75 -0
- package/hooks/inyeccion-contexto.js +246 -0
- package/hooks/lib/abort-registry.js +214 -0
- package/hooks/lib/agent-backend.js +210 -0
- package/hooks/lib/agent-comms.js +263 -0
- package/hooks/lib/agent-issue-codes.js +284 -0
- package/hooks/lib/agent-matcher.js +189 -0
- package/hooks/lib/async-hook-registry.js +252 -0
- package/hooks/lib/atomic-write.js +130 -0
- package/hooks/lib/auto-consolidator.js +335 -0
- package/hooks/lib/canary-skills.js +187 -0
- package/hooks/lib/consolidation-lock.js +291 -0
- package/hooks/lib/context-builder.js +430 -0
- package/hooks/lib/context-compressor.js +657 -0
- package/hooks/lib/convergence-detector.js +105 -0
- package/hooks/lib/delegation-tracker.js +198 -0
- package/hooks/lib/detectar-package-manager.js +423 -0
- package/hooks/lib/edit-accumulator.js +171 -0
- package/hooks/lib/error-classifier.js +308 -0
- package/hooks/lib/event-bus.js +112 -0
- package/hooks/lib/evolution-tracker.js +442 -0
- package/hooks/lib/execution-state.js +316 -0
- package/hooks/lib/fingerprint-id.js +135 -0
- package/hooks/lib/gateway-notify.js +116 -0
- package/hooks/lib/graph-security.js +75 -0
- package/hooks/lib/guardrail-metrics.js +202 -0
- package/hooks/lib/hook-circuit-breaker.js +206 -0
- package/hooks/lib/loop-detector.js +267 -0
- package/hooks/lib/mcp-health.js +184 -0
- package/hooks/lib/mcp-pool.js +436 -0
- package/hooks/lib/memory-search.js +506 -0
- package/hooks/lib/merkle-audit.js +96 -0
- package/hooks/lib/model-router.js +222 -0
- package/hooks/lib/normalize-error.js +324 -0
- package/hooks/lib/normalize-input.js +65 -0
- package/hooks/lib/nudge-tracker.js +306 -0
- package/hooks/lib/otlp-exporter.js +365 -0
- package/hooks/lib/performance-marks.js +239 -0
- package/hooks/lib/privacy-filter.js +128 -0
- package/hooks/lib/prompt-injection-scanner.js +209 -0
- package/hooks/lib/provenance-tracker.js +183 -0
- package/hooks/lib/rate-limit-tracker.js +253 -0
- package/hooks/lib/reflect-classifier.js +164 -0
- package/hooks/lib/resource-quota.js +122 -0
- package/hooks/lib/retry-jitter.js +165 -0
- package/hooks/lib/risk-engine.js +368 -0
- package/hooks/lib/run-log.js +408 -0
- package/hooks/lib/session-fts.js +379 -0
- package/hooks/lib/session-store.js +293 -0
- package/hooks/lib/singleton-guard.js +159 -0
- package/hooks/lib/skill-auditor.js +588 -0
- package/hooks/lib/sync-status.js +228 -0
- package/hooks/lib/taint-tracker.js +107 -0
- package/hooks/lib/task-service.js +295 -0
- package/hooks/lib/tech-skills-map.js +146 -0
- package/hooks/lib/telegram-cliente.js +159 -0
- package/hooks/lib/telegram-config.js +170 -0
- package/hooks/lib/token-budget.js +156 -0
- package/hooks/lib/token-estimator.js +420 -0
- package/hooks/lib/toon-compressor.js +245 -0
- package/hooks/lib/usage-model.js +183 -0
- package/hooks/lib/variable-resolver.js +230 -0
- package/hooks/linea-estado.js +324 -0
- package/hooks/metricas-evolucion.js +209 -0
- package/hooks/monitor-contexto.js +325 -0
- package/hooks/notificacion-sesion-stop.js +198 -0
- package/hooks/notificacion-telegram-notification.js +4 -0
- package/hooks/notificacion-telegram-subagent.js +4 -0
- package/hooks/notificacion-telegram.js +267 -0
- package/hooks/preservar-estado-pre-compact.js +150 -0
- package/hooks/proteccion-rutas.js +366 -0
- package/hooks/registro-turnos.js +209 -0
- package/hooks/resumen-sesion.js +249 -0
- package/hooks/risk-scoring.js +323 -0
- package/hooks/rotar-audit-auto.js +122 -0
- package/hooks/sugerir-regenerar-inventario.js +170 -0
- package/hooks/telemetria-agentes.js +167 -0
- package/hooks/tracking-costos.js +688 -0
- package/instintos/global.yaml +8 -0
- package/instintos/perfil-usuario.yaml +53 -0
- package/instintos/prompt-appendices.yaml +57 -0
- package/instintos/proyecto.yaml +372 -0
- package/manifiestos/gateway-config.json +77 -0
- package/manifiestos/handoff-context.json +223 -0
- package/manifiestos/hook-profiles.json +44 -0
- package/manifiestos/hooks-config.json +360 -0
- package/manifiestos/modulos.json +1173 -0
- package/manifiestos/perfiles.json +404 -0
- package/package.json +86 -0
- package/plantillas/ESTADO.md +109 -0
- package/plantillas/HOJA-RUTA.md +143 -0
- package/plantillas/PROYECTO.md +122 -0
- package/plantillas/REQUISITOS.md +132 -0
- package/plantillas/auditor-veto-template.md +105 -0
- package/plantillas/github-workflows/README.md +47 -0
- package/plantillas/github-workflows/release-please.yml +44 -0
- package/plantillas/github-workflows/swl-ci.yml +107 -0
- package/plantillas/github-workflows/swl-security.yml +51 -0
- package/plantillas/mcp-mineru.json +13 -0
- package/plantillas/research/ARQUITECTURA.md +220 -0
- package/plantillas/research/FUNCIONALIDADES.md +175 -0
- package/plantillas/research/RESUMEN.md +165 -0
- package/plantillas/research/STACK.md +233 -0
- package/plantillas/research/TRAMPAS.md +299 -0
- package/plantillas/skill-evals-template.json +44 -0
- package/plugin.json +343 -0
- package/reglas/accesibilidad.md +269 -0
- package/reglas/api-diseno.md +400 -0
- package/reglas/arquitectura.md +352 -0
- package/reglas/brevedad-output.md +124 -0
- package/reglas/cloud-infra.md +247 -0
- package/reglas/docs.md +245 -0
- package/reglas/estilo-codigo.md +201 -0
- package/reglas/git-workflow.md +245 -0
- package/reglas/gobernanza.md +271 -0
- package/reglas/harness-claude-code.md +213 -0
- package/reglas/hooks.md +186 -0
- package/reglas/lenguajes/csharp/estilo-codigo.md +231 -0
- package/reglas/lenguajes/csharp/hooks.md +281 -0
- package/reglas/lenguajes/csharp/patrones.md +226 -0
- package/reglas/lenguajes/csharp/seguridad.md +258 -0
- package/reglas/lenguajes/csharp/testing.md +176 -0
- package/reglas/lenguajes/go/estilo-codigo.md +195 -0
- package/reglas/lenguajes/go/hooks.md +249 -0
- package/reglas/lenguajes/go/patrones.md +249 -0
- package/reglas/lenguajes/go/seguridad.md +225 -0
- package/reglas/lenguajes/go/testing.md +272 -0
- package/reglas/lenguajes/java/estilo-codigo.md +217 -0
- package/reglas/lenguajes/java/hooks.md +251 -0
- package/reglas/lenguajes/java/patrones.md +226 -0
- package/reglas/lenguajes/java/seguridad.md +233 -0
- package/reglas/lenguajes/java/testing.md +238 -0
- package/reglas/lenguajes/kotlin/estilo-codigo.md +208 -0
- package/reglas/lenguajes/kotlin/hooks.md +245 -0
- package/reglas/lenguajes/kotlin/patrones.md +201 -0
- package/reglas/lenguajes/kotlin/seguridad.md +202 -0
- package/reglas/lenguajes/kotlin/testing.md +236 -0
- package/reglas/lenguajes/nextjs/estilo-codigo.md +175 -0
- package/reglas/lenguajes/nextjs/hooks.md +186 -0
- package/reglas/lenguajes/nextjs/patrones.md +225 -0
- package/reglas/lenguajes/nextjs/seguridad.md +216 -0
- package/reglas/lenguajes/nextjs/testing.md +193 -0
- package/reglas/lenguajes/php/estilo-codigo.md +228 -0
- package/reglas/lenguajes/php/hooks.md +165 -0
- package/reglas/lenguajes/php/patrones.md +233 -0
- package/reglas/lenguajes/php/seguridad.md +186 -0
- package/reglas/lenguajes/php/testing.md +205 -0
- package/reglas/lenguajes/rust/estilo-codigo.md +207 -0
- package/reglas/lenguajes/rust/hooks.md +240 -0
- package/reglas/lenguajes/rust/patrones.md +250 -0
- package/reglas/lenguajes/rust/seguridad.md +221 -0
- package/reglas/lenguajes/rust/testing.md +194 -0
- package/reglas/lenguajes/swift/estilo-codigo.md +238 -0
- package/reglas/lenguajes/swift/hooks.md +257 -0
- package/reglas/lenguajes/swift/patrones.md +235 -0
- package/reglas/lenguajes/swift/seguridad.md +248 -0
- package/reglas/lenguajes/swift/testing.md +242 -0
- package/reglas/markitdown.md +60 -0
- package/reglas/memoria-consolidada.md +209 -0
- package/reglas/patrones.md +225 -0
- package/reglas/performance.md +195 -0
- package/reglas/pruebas.md +159 -0
- package/reglas/seguridad-agentes.md +351 -0
- package/reglas/seguridad.md +151 -0
- package/reglas/skills-estandar.md +373 -0
- package/reglas/testing.md +193 -0
- package/schemas/agent-contract.json +176 -0
- package/schemas/agent-frontmatter.schema.json +149 -0
- package/schemas/agent-message.schema.json +53 -0
- package/schemas/agent-output-implementacion.schema.json +85 -0
- package/schemas/agent-output-planificacion.schema.json +113 -0
- package/schemas/agent-output-review.schema.json +78 -0
- package/schemas/diary-entry.schema.json +80 -0
- package/schemas/hook-profiles.schema.json +39 -0
- package/schemas/hooks-config.schema.json +74 -0
- package/schemas/instinct.schema.json +115 -0
- package/schemas/modulos.schema.json +29 -0
- package/schemas/perfiles.schema.json +28 -0
- package/schemas/plugin.schema.json +64 -0
- package/schemas/skill-evals.schema.json +95 -0
- package/schemas/skill-frontmatter.schema.json +170 -0
- package/scripts/actualizar.js +145 -0
- package/scripts/audit-skills.sh +78 -0
- package/scripts/auditar-agentes-gaps.js +149 -0
- package/scripts/auditar-cobertura-frameworks.js +241 -0
- package/scripts/auditar-skills-gaps.js +206 -0
- package/scripts/bootstrap-instintos.js +259 -0
- package/scripts/check-update.js +109 -0
- package/scripts/comandos/agents.js +105 -0
- package/scripts/comandos/info.js +108 -0
- package/scripts/comandos/install-asistido.js +186 -0
- package/scripts/comandos/skills.js +211 -0
- package/scripts/configurar-branch-protection.js +418 -0
- package/scripts/daemon-swl.py +388 -0
- package/scripts/desinstalar.js +130 -0
- package/scripts/doctor.js +559 -0
- package/scripts/field-report.js +199 -0
- package/scripts/generar-inventario.js +317 -0
- package/scripts/inbox-tmux-inject.js +161 -0
- package/scripts/inferir-herramientas-permitidas.js +586 -0
- package/scripts/inicializar.js +133 -0
- package/scripts/instalador.js +1031 -0
- package/scripts/instalar-git-hook.js +122 -0
- package/scripts/lib/agp-frontmatter.js +222 -0
- package/scripts/lib/append-con-marcadores.js +199 -0
- package/scripts/lib/artefactos-python.js +43 -0
- package/scripts/lib/audit-query.js +221 -0
- package/scripts/lib/autostart-linux.js +347 -0
- package/scripts/lib/autostart-macos.js +360 -0
- package/scripts/lib/autostart-windows.js +307 -0
- package/scripts/lib/budget-enforcer.js +252 -0
- package/scripts/lib/claude-sessions.js +285 -0
- package/scripts/lib/configurar-ci.js +380 -0
- package/scripts/lib/console-span-exporter.js +92 -0
- package/scripts/lib/contadores-inventario.js +217 -0
- package/scripts/lib/dashboard-widgets.js +290 -0
- package/scripts/lib/detectar-runtime.js +279 -0
- package/scripts/lib/detectar-stack.js +187 -0
- package/scripts/lib/diary-entry.js +234 -0
- package/scripts/lib/drift-detector.js +545 -0
- package/scripts/lib/estado.js +124 -0
- package/scripts/lib/gestor-componentes.js +243 -0
- package/scripts/lib/gitignore-manifest.js +305 -0
- package/scripts/lib/graph-analyze.py +556 -0
- package/scripts/lib/graph-builder.py +485 -0
- package/scripts/lib/graph-cluster.py +259 -0
- package/scripts/lib/health-row.js +168 -0
- package/scripts/lib/hooks-settings.js +789 -0
- package/scripts/lib/manifiestos.js +138 -0
- package/scripts/lib/mc-client.js +137 -0
- package/scripts/lib/notificaciones-telegram.js +1107 -0
- package/scripts/lib/npm-version.js +261 -0
- package/scripts/lib/paquetes-conocidos.js +50 -0
- package/scripts/lib/preservar-usuario.js +586 -0
- package/scripts/lib/prompt-builder.js +264 -0
- package/scripts/lib/resolver-externo.js +332 -0
- package/scripts/lib/schedule-parser.js +305 -0
- package/scripts/lib/scoring-instintos.js +240 -0
- package/scripts/lib/seguridad.js +160 -0
- package/scripts/lib/selector-interactivo.js +152 -0
- package/scripts/lib/semantic-search.js +242 -0
- package/scripts/lib/skill-discovery.js +234 -0
- package/scripts/lib/skill-metrics.js +246 -0
- package/scripts/lib/skill-normalizer.js +112 -0
- package/scripts/lib/skills-hub.js +340 -0
- package/scripts/lib/span-schema.js +134 -0
- package/scripts/lib/tool-cost-analyzer.js +255 -0
- package/scripts/lib/tracing-processor-interface.js +286 -0
- package/scripts/lib/transformadores/base.js +80 -0
- package/scripts/lib/transformadores/claude.js +124 -0
- package/scripts/lib/transformadores/codex.js +115 -0
- package/scripts/lib/transformadores/copilot.js +106 -0
- package/scripts/lib/transformadores/gemini.js +74 -0
- package/scripts/lib/transformadores/index.js +35 -0
- package/scripts/lib/transformadores/opencode.js +75 -0
- package/scripts/lib/ui.js +259 -0
- package/scripts/limpiar-artefactos-python.js +131 -0
- package/scripts/mcp-orchestrator.py +386 -0
- package/scripts/mcp-pool-manager.py +352 -0
- package/scripts/mcp-telemetry.py +378 -0
- package/scripts/poblar-evolvable.js +226 -0
- package/scripts/publicar.js +287 -0
- package/scripts/reflect-skills.js +403 -0
- package/scripts/rotar-audit-logs.js +185 -0
- package/scripts/run-skill-evals.js +242 -0
- package/scripts/smoke-test.js +374 -0
- package/scripts/token-analysis.py +471 -0
- package/scripts/validar-manifest.js +195 -0
- package/scripts/validar-memoria.js +321 -0
- package/scripts/validar-tests-aislamiento.js +184 -0
- package/scripts/validar-tokens-test.js +208 -0
- package/scripts/validar.js +147 -0
- package/scripts/validate-markdown.py +339 -0
- package/scripts/validate-skills.py +385 -0
- package/scripts/vendor/claude-usage/README.md +116 -0
- package/scripts/vendor/claude-usage/cli.py +334 -0
- package/scripts/vendor/claude-usage/dashboard.py +795 -0
- package/scripts/vendor/claude-usage/scanner.py +467 -0
- package/scripts/vendor/markitdown/cli.py +194 -0
- package/scripts/verificar-evolucion.js +289 -0
- package/scripts/verificar-release.js +494 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Regla: Hooks de Pre-commit y CI — PHP / Laravel
|
|
2
|
+
|
|
3
|
+
Los hooks automatizan la detección de errores antes de que lleguen al repositorio.
|
|
4
|
+
Esta regla define qué verificaciones correr en qué momento y qué debe bloquear
|
|
5
|
+
el commit o el merge.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## PHP-CS-Fixer / Pint — verificación de formato
|
|
10
|
+
|
|
11
|
+
Ejecutar antes de cada commit como verificación sin modificar:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Laravel Pint
|
|
15
|
+
./vendor/bin/pint --test
|
|
16
|
+
|
|
17
|
+
# PHP-CS-Fixer
|
|
18
|
+
./vendor/bin/php-cs-fixer fix --dry-run --diff
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- Si produce diferencias: **bloquear el commit**.
|
|
22
|
+
- El desarrollador aplica el fix y vuelve a commitear:
|
|
23
|
+
```bash
|
|
24
|
+
./vendor/bin/pint # aplica correcciones
|
|
25
|
+
git add -u && git commit
|
|
26
|
+
```
|
|
27
|
+
- CI también lo ejecuta como verificación. No se auto-corrige en CI.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## PHPStan — análisis estático antes de merge
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
./vendor/bin/phpstan analyse --level=6 app/ --error-format=github
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
- Ejecutar en CI en cada push a una rama con PR abierto.
|
|
38
|
+
- Bloquear el merge si hay errores de nivel 6 o superior.
|
|
39
|
+
- Los warnings se tratan como errores: `--no-progress --error-format=github`.
|
|
40
|
+
- El flag `--error-format=github` genera anotaciones en la UI de GitHub Actions.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Detección de debug output en código no-test
|
|
45
|
+
|
|
46
|
+
Detectar `var_dump`, `dd`, `dump`, `print_r`, `var_export` fuera de `tests/`:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# En hook pre-commit o CI
|
|
50
|
+
git diff --cached --name-only | grep '\.php$' | xargs grep -n \
|
|
51
|
+
'\bvar_dump\b\|\bdd\b\|\bdump\b\|\bprint_r\b\|\bvar_export\b' \
|
|
52
|
+
2>/dev/null | grep -v '^tests/' | grep -v '^vendor/'
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Si encuentra coincidencias en código fuera de `tests/`: **bloquear el commit**.
|
|
56
|
+
Los desarrolladores deben eliminar el debug output antes de commitear.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Detección de env() fuera de config/
|
|
61
|
+
|
|
62
|
+
En Laravel, llamar `env()` directamente en código de aplicación (fuera de `config/`)
|
|
63
|
+
rompe el caché de configuración (`php artisan config:cache`):
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Detectar env() fuera de config/
|
|
67
|
+
grep -rn "env(" app/ bootstrap/ routes/ 2>/dev/null \
|
|
68
|
+
| grep -v "config(" \
|
|
69
|
+
| grep -v "^.*#"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
- Si encuentra `env()` en `app/` o `routes/`: **bloquear el merge** con mensaje:
|
|
73
|
+
"Usar `config('seccion.clave')` en lugar de `env()` fuera de `config/`."
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## composer audit — vulnerabilidades en dependencias
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
composer audit --no-dev --format=json
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
- Ejecutar en CI en cada push.
|
|
84
|
+
- Bloquear el merge si reporta vulnerabilidades de severidad **HIGH** o **CRITICAL**.
|
|
85
|
+
- Vulnerabilidades **MEDIUM** generan warning pero no bloquean (registrar en JIRA).
|
|
86
|
+
- Ejecutar también semanalmente de forma programada para detectar CVEs nuevos
|
|
87
|
+
en dependencias que no cambiaron recientemente.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Verificación de rutas con artisan
|
|
92
|
+
|
|
93
|
+
En CI, después de cada cambio en `routes/`:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
php artisan route:list --json > /dev/null
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
- Si falla: hay una ruta con controller o middleware inexistente. **Bloquear el merge**.
|
|
100
|
+
- Verificación adicional que el middleware de autenticación está presente en rutas de API:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
php artisan route:list --path=api --columns=method,uri,middleware \
|
|
104
|
+
| grep -v "api/auth" \
|
|
105
|
+
| grep -v "sanctum\|auth"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Cualquier ruta de API sin middleware de autenticación es una alerta que debe
|
|
109
|
+
revisarse manualmente antes de aprobar el PR.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Script de pre-commit completo (referencia)
|
|
114
|
+
|
|
115
|
+
Guardar como `.git/hooks/pre-commit` o con `husky`/`captain-hook`:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
#!/usr/bin/env bash
|
|
119
|
+
set -e
|
|
120
|
+
|
|
121
|
+
echo "==> Verificando formato (Pint)..."
|
|
122
|
+
./vendor/bin/pint --test || {
|
|
123
|
+
echo "ERROR: Hay errores de formato. Ejecuta ./vendor/bin/pint para corregir."
|
|
124
|
+
exit 1
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
echo "==> Detectando debug output..."
|
|
128
|
+
ARCHIVOS_PHP=$(git diff --cached --name-only | grep '\.php$' | grep -v '^tests/' || true)
|
|
129
|
+
if [ -n "$ARCHIVOS_PHP" ]; then
|
|
130
|
+
if echo "$ARCHIVOS_PHP" | xargs grep -ln '\bvar_dump\b\|\bdd(\b\|\bdump(\b' 2>/dev/null; then
|
|
131
|
+
echo "ERROR: Eliminar var_dump/dd/dump antes de commitear."
|
|
132
|
+
exit 1
|
|
133
|
+
fi
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
echo "==> Verificando env() fuera de config/..."
|
|
137
|
+
if grep -rn "env(" app/ routes/ 2>/dev/null | grep -qv "config("; then
|
|
138
|
+
echo "ADVERTENCIA: Se encontró env() fuera de config/. Verificar manualmente."
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
echo "==> Pre-commit: OK"
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Resumen de qué bloquea qué
|
|
147
|
+
|
|
148
|
+
| Verificación | Pre-commit | CI / PR | Severidad |
|
|
149
|
+
|-------------|-----------|---------|-----------|
|
|
150
|
+
| Formato (Pint) | Bloquea | Bloquea | Error |
|
|
151
|
+
| PHPStan nivel 6 | No | Bloquea merge | Error |
|
|
152
|
+
| var_dump / dd / dump | Bloquea | Bloquea | Error |
|
|
153
|
+
| `env()` fuera de config/ | Advertencia | Bloquea merge | Error |
|
|
154
|
+
| `composer audit` HIGH/CRITICAL | No | Bloquea merge | Error |
|
|
155
|
+
| Rutas inválidas | No | Bloquea merge | Error |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Checklist de hooks antes de activar en un proyecto nuevo
|
|
160
|
+
|
|
161
|
+
- [ ] `pint.json` o `.php-cs-fixer.php` versionado en el repositorio
|
|
162
|
+
- [ ] `phpstan.neon` con nivel 6 versionado
|
|
163
|
+
- [ ] Hook pre-commit instalado (`./vendor/bin/captain-hook install` o `husky`)
|
|
164
|
+
- [ ] Pipeline de CI tiene los pasos: pint, phpstan, audit, route:list
|
|
165
|
+
- [ ] El equipo conoce cómo ejecutar cada verificación localmente
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# Regla: Patrones de Arquitectura — PHP / Laravel
|
|
2
|
+
|
|
3
|
+
Aplica a todo código PHP en proyectos Laravel. Estos patrones separan las
|
|
4
|
+
responsabilidades entre capas, facilitan el testing y reducen el acoplamiento.
|
|
5
|
+
Un controller gordo que contiene lógica de negocio y queries es deuda técnica
|
|
6
|
+
inmediata — esta regla establece cómo evitarla.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Service Container y Dependency Injection
|
|
11
|
+
|
|
12
|
+
- Registrar toda clase de negocio en el Service Container de Laravel.
|
|
13
|
+
- Inyectar dependencias por constructor, nunca instanciarlas dentro de la clase.
|
|
14
|
+
- Bind interfaces a implementaciones concretas en `AppServiceProvider`:
|
|
15
|
+
|
|
16
|
+
```php
|
|
17
|
+
// AppServiceProvider::register()
|
|
18
|
+
$this->app->bind(FacturaRepositoryInterface::class, EloquentFacturaRepository::class);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- En producción, usar `$this->app->singleton()` para servicios sin estado.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Facades: con criterio
|
|
26
|
+
|
|
27
|
+
- Las Facades de Laravel son cómodas pero dificultan el testing cuando se usan
|
|
28
|
+
en lógica de negocio profunda.
|
|
29
|
+
- Facades **aceptables** en controllers y middleware (capa de entrada):
|
|
30
|
+
`Auth::user()`, `Cache::get()`, `Log::error()`.
|
|
31
|
+
- Facades **prohibidas** en Services, Repositories y Jobs: inyectar la interfaz
|
|
32
|
+
correspondiente para que sea mockeable en tests.
|
|
33
|
+
|
|
34
|
+
```php
|
|
35
|
+
// MAL — Facade en service, imposible de testear sin mock estático
|
|
36
|
+
class FacturaService
|
|
37
|
+
{
|
|
38
|
+
public function emitir(int $facturaId): void
|
|
39
|
+
{
|
|
40
|
+
$factura = Factura::find($facturaId); // Facade implícita de Eloquent
|
|
41
|
+
Mail::send(...); // Facade de Mail no inyectada
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// BIEN — dependencias inyectadas
|
|
46
|
+
class FacturaService
|
|
47
|
+
{
|
|
48
|
+
public function __construct(
|
|
49
|
+
private readonly FacturaRepositoryInterface $facturas,
|
|
50
|
+
private readonly MailerInterface $mailer,
|
|
51
|
+
) {}
|
|
52
|
+
|
|
53
|
+
public function emitir(int $facturaId): void
|
|
54
|
+
{
|
|
55
|
+
$factura = $this->facturas->findOrFail($facturaId);
|
|
56
|
+
$this->mailer->enviarFactura($factura);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Repository Pattern sobre Eloquent directo en controllers
|
|
64
|
+
|
|
65
|
+
- Los controllers no deben contener queries Eloquent.
|
|
66
|
+
- Definir una interfaz del repositorio y una implementación Eloquent:
|
|
67
|
+
|
|
68
|
+
```php
|
|
69
|
+
// Interfaz
|
|
70
|
+
interface FacturaRepositoryInterface
|
|
71
|
+
{
|
|
72
|
+
public function findOrFail(int $id): Factura;
|
|
73
|
+
/** @return Collection<int, Factura> */
|
|
74
|
+
public function listarPorEmpresa(int $empresaId, EstatusFactura $estatus): Collection;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Implementación
|
|
78
|
+
class EloquentFacturaRepository implements FacturaRepositoryInterface
|
|
79
|
+
{
|
|
80
|
+
public function findOrFail(int $id): Factura
|
|
81
|
+
{
|
|
82
|
+
return Factura::with(['items', 'cliente'])->findOrFail($id);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public function listarPorEmpresa(int $empresaId, EstatusFactura $estatus): Collection
|
|
86
|
+
{
|
|
87
|
+
return Factura::where('empresa_id', $empresaId)
|
|
88
|
+
->where('estatus', $estatus)
|
|
89
|
+
->with('cliente')
|
|
90
|
+
->orderByDesc('fecha_emision')
|
|
91
|
+
->get();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## Form Requests para validación
|
|
99
|
+
|
|
100
|
+
- Toda validación de entrada HTTP va en una clase `FormRequest`, nunca en el controller.
|
|
101
|
+
- Las reglas de autorización también van en el `FormRequest`:
|
|
102
|
+
|
|
103
|
+
```php
|
|
104
|
+
class EmitirFacturaRequest extends FormRequest
|
|
105
|
+
{
|
|
106
|
+
public function authorize(): bool
|
|
107
|
+
{
|
|
108
|
+
return $this->user()->can('emitir-facturas');
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public function rules(): array
|
|
112
|
+
{
|
|
113
|
+
return [
|
|
114
|
+
'cliente_id' => ['required', 'integer', 'exists:clientes,id'],
|
|
115
|
+
'items' => ['required', 'array', 'min:1'],
|
|
116
|
+
'items.*.sku' => ['required', 'string', 'max:50'],
|
|
117
|
+
'items.*.qty' => ['required', 'integer', 'min:1'],
|
|
118
|
+
];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Events y Listeners para desacoplamiento
|
|
126
|
+
|
|
127
|
+
- Acciones con efectos secundarios múltiples (enviar email, actualizar reporte,
|
|
128
|
+
notificar terceros) se publican como eventos, no se llaman directamente:
|
|
129
|
+
|
|
130
|
+
```php
|
|
131
|
+
// En el service — solo dispara el evento
|
|
132
|
+
event(new FacturaEmitida($factura));
|
|
133
|
+
|
|
134
|
+
// Listeners separados, registrados en EventServiceProvider
|
|
135
|
+
FacturaEmitida::class => [
|
|
136
|
+
EnviarEmailFacturaListener::class,
|
|
137
|
+
GenerarPdfFacturaListener::class,
|
|
138
|
+
NotificarSatListener::class,
|
|
139
|
+
],
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Jobs y Queues para procesamiento asíncrono
|
|
145
|
+
|
|
146
|
+
- Todo proceso que tarde más de 500ms o que pueda fallar y reintentarse va en un Job:
|
|
147
|
+
|
|
148
|
+
```php
|
|
149
|
+
class GenerarReporteFacturacionJob implements ShouldQueue
|
|
150
|
+
{
|
|
151
|
+
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
|
152
|
+
|
|
153
|
+
public int $tries = 3;
|
|
154
|
+
public int $backoff = 60; // segundos entre reintentos
|
|
155
|
+
|
|
156
|
+
public function __construct(private readonly int $empresaId) {}
|
|
157
|
+
|
|
158
|
+
public function handle(ReporteService $reportes): void
|
|
159
|
+
{
|
|
160
|
+
$reportes->generarFacturacionMensual($this->empresaId);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Despachar desde el controller
|
|
165
|
+
GenerarReporteFacturacionJob::dispatch($empresaId)->onQueue('reportes');
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Policies para autorización
|
|
171
|
+
|
|
172
|
+
- Las reglas de quién puede hacer qué sobre un modelo van en una Policy, no en el controller:
|
|
173
|
+
|
|
174
|
+
```php
|
|
175
|
+
class FacturaPolicy
|
|
176
|
+
{
|
|
177
|
+
public function cancelar(User $user, Factura $factura): bool
|
|
178
|
+
{
|
|
179
|
+
return $user->empresa_id === $factura->empresa_id
|
|
180
|
+
&& $user->hasRole('admin')
|
|
181
|
+
&& ! $factura->estatus->esTerminal();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// En el controller
|
|
186
|
+
$this->authorize('cancelar', $factura);
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## API Resources para transformación de respuestas
|
|
192
|
+
|
|
193
|
+
- NUNCA devolver modelos Eloquent directamente en respuestas JSON.
|
|
194
|
+
Un `->toArray()` de Eloquent expone todos los campos incluyendo timestamps internos.
|
|
195
|
+
- Usar `JsonResource` para controlar exactamente qué se expone:
|
|
196
|
+
|
|
197
|
+
```php
|
|
198
|
+
class FacturaResource extends JsonResource
|
|
199
|
+
{
|
|
200
|
+
public function toArray(Request $request): array
|
|
201
|
+
{
|
|
202
|
+
return [
|
|
203
|
+
'id' => $this->id,
|
|
204
|
+
'folio' => $this->folio,
|
|
205
|
+
'total' => $this->total,
|
|
206
|
+
'estatus' => $this->estatus,
|
|
207
|
+
'fecha_emision' => $this->fecha_emision->toISOString(),
|
|
208
|
+
'cliente' => new ClienteResource($this->whenLoaded('cliente')),
|
|
209
|
+
'items' => FacturaItemResource::collection($this->whenLoaded('items')),
|
|
210
|
+
];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Middleware para cross-cutting concerns
|
|
218
|
+
|
|
219
|
+
- Lógica que aplica a múltiples rutas (autenticación, rate limiting, logging de auditoría,
|
|
220
|
+
verificación de suscripción) va en middleware, no en cada controller.
|
|
221
|
+
- Nunca duplicar lógica de middleware dentro de métodos de controller.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Checklist de patrones antes de merge
|
|
226
|
+
|
|
227
|
+
- [ ] Ningun controller contiene queries Eloquent directas
|
|
228
|
+
- [ ] Toda validación HTTP en FormRequest, no en controller
|
|
229
|
+
- [ ] Efectos secundarios múltiples publicados como eventos
|
|
230
|
+
- [ ] Procesos lentos o con reintentos en Jobs con `ShouldQueue`
|
|
231
|
+
- [ ] Reglas de autorización en Policies, no en controllers ni services
|
|
232
|
+
- [ ] Respuestas JSON devueltas con JsonResource, no con `->toArray()`
|
|
233
|
+
- [ ] Interfaces definidas para repositorios y servicios externos
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
# Regla: Seguridad — PHP / Laravel
|
|
2
|
+
|
|
3
|
+
PHP es históricamente el lenguaje con más vectores de ataque web documentados.
|
|
4
|
+
Laravel mitiga la mayoría de ellos por defecto, pero solo si se usan sus
|
|
5
|
+
mecanismos correctamente. Esta regla es OBLIGATORIA sin excepciones.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## SQL Injection: Eloquent y Query Builder siempre
|
|
10
|
+
|
|
11
|
+
- NUNCA construir queries con interpolación de strings o concatenación:
|
|
12
|
+
|
|
13
|
+
```php
|
|
14
|
+
// MAL — vulnerable a SQL injection
|
|
15
|
+
$facturas = DB::select("SELECT * FROM facturas WHERE empresa_id = $empresaId");
|
|
16
|
+
|
|
17
|
+
// MAL — DB::raw sin binding
|
|
18
|
+
$facturas = Factura::whereRaw("empresa_id = $empresaId")->get();
|
|
19
|
+
|
|
20
|
+
// BIEN — Eloquent con binding automático
|
|
21
|
+
$facturas = Factura::where('empresa_id', $empresaId)->get();
|
|
22
|
+
|
|
23
|
+
// BIEN — DB::raw con bindings separados cuando es necesario
|
|
24
|
+
$facturas = Factura::whereRaw('empresa_id = ? AND total > ?', [$empresaId, $minimo])->get();
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
- Cada aparición de `DB::statement(` o `DB::unprepared(` requiere revisión de seguridad
|
|
28
|
+
explícita con comentario documentando por qué es seguro.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## XSS: Blade escapa por defecto
|
|
33
|
+
|
|
34
|
+
- `{{ $variable }}` en Blade escapa HTML automáticamente. Usar siempre.
|
|
35
|
+
- `{!! $variable !!}` NO escapa. Prohibido salvo en casos específicos documentados:
|
|
36
|
+
|
|
37
|
+
```blade
|
|
38
|
+
{{-- MAL — XSS si $contenido viene del usuario --}}
|
|
39
|
+
{!! $contenido !!}
|
|
40
|
+
|
|
41
|
+
{{-- BIEN — escapado por defecto --}}
|
|
42
|
+
{{ $contenido }}
|
|
43
|
+
|
|
44
|
+
{{-- BIEN — HTML permitido solo de fuente confiable (CMS interno, no usuario) --}}
|
|
45
|
+
{{-- NOTA: $plantilla proviene de CMS interno administrado por el equipo, no de input de usuario --}}
|
|
46
|
+
{!! $plantilla->html_cuerpo !!}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- Si se necesita renderizar HTML de usuario (editor WYSIWYG), sanitizar con
|
|
50
|
+
`HTMLPurifier` o `League\HTMLToMarkdown` antes de almacenar, nunca al mostrar.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## CSRF: middleware activo en todas las rutas web
|
|
55
|
+
|
|
56
|
+
- El middleware `VerifyCsrfToken` debe estar activo en el grupo `web`.
|
|
57
|
+
- No agregar rutas a `$except` en `VerifyCsrfToken` sin documentar explícitamente por qué.
|
|
58
|
+
- Las rutas de API que usan tokens de portador (Bearer) son inmunes a CSRF por diseño.
|
|
59
|
+
Documentar esto en el controller si se desactiva el middleware para esa ruta.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Mass Assignment: $fillable en todos los modelos
|
|
64
|
+
|
|
65
|
+
- Todo modelo Eloquent DEBE declarar `$fillable` o `$guarded`.
|
|
66
|
+
- Preferir `$fillable` (lista de permitidos) sobre `$guarded` (lista de bloqueados).
|
|
67
|
+
- NUNCA `protected $guarded = []` — permite asignación masiva sin restricción:
|
|
68
|
+
|
|
69
|
+
```php
|
|
70
|
+
// MAL — permite asignar cualquier campo incluyendo is_admin, empresa_id
|
|
71
|
+
class Usuario extends Model
|
|
72
|
+
{
|
|
73
|
+
protected $guarded = [];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// BIEN — solo los campos que el usuario puede enviar
|
|
77
|
+
class Usuario extends Model
|
|
78
|
+
{
|
|
79
|
+
protected $fillable = [
|
|
80
|
+
'nombre',
|
|
81
|
+
'email',
|
|
82
|
+
'password',
|
|
83
|
+
];
|
|
84
|
+
// empresa_id, is_admin, etc. solo se asignan explícitamente en el service
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Autenticación: Laravel Sanctum o Passport
|
|
91
|
+
|
|
92
|
+
- NUNCA implementar autenticación custom con hashing manual y generación de tokens.
|
|
93
|
+
- APIs de primera parte (SPA, mobile): **Laravel Sanctum**.
|
|
94
|
+
- OAuth2 para terceros: **Laravel Passport**.
|
|
95
|
+
- Configuración mínima de Sanctum para seguridad:
|
|
96
|
+
|
|
97
|
+
```php
|
|
98
|
+
// config/sanctum.php
|
|
99
|
+
'expiration' => 60 * 24, // tokens expiran en 24 horas
|
|
100
|
+
'token_prefix' => env('APP_ENV'), // prefijo diferente por ambiente
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- Los tokens de refresh van en cookies `httpOnly`, nunca en `localStorage`.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Secretos en .env, nunca en config/
|
|
108
|
+
|
|
109
|
+
- Las credenciales se leen desde variables de entorno, nunca hardcodeadas:
|
|
110
|
+
|
|
111
|
+
```php
|
|
112
|
+
// MAL — credencial en código
|
|
113
|
+
class StripeService
|
|
114
|
+
{
|
|
115
|
+
private string $apiKey = 'sk_live_abc123...';
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// MAL — en archivo de config versionado
|
|
119
|
+
// config/servicios.php
|
|
120
|
+
return ['stripe' => ['key' => 'sk_live_abc123...']];
|
|
121
|
+
|
|
122
|
+
// BIEN — desde variable de entorno
|
|
123
|
+
return ['stripe' => ['key' => env('STRIPE_SECRET_KEY')]];
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
- Ejecutar `php artisan config:cache` antes de deploy para que `.env` no sea
|
|
127
|
+
necesario en producción (las variables se inyectan por el sistema de deployment).
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## PHPStan/Psalm en CI
|
|
132
|
+
|
|
133
|
+
- Nivel mínimo de análisis estático: **nivel 6** (PHPStan) o **nivel 3** (Psalm).
|
|
134
|
+
- Configurar en `phpstan.neon`:
|
|
135
|
+
```yaml
|
|
136
|
+
parameters:
|
|
137
|
+
level: 6
|
|
138
|
+
paths:
|
|
139
|
+
- app
|
|
140
|
+
excludePaths:
|
|
141
|
+
- app/Http/Middleware/TrustProxies.php
|
|
142
|
+
```
|
|
143
|
+
- CI falla si PHPStan reporta errores. Los errores ignorados se documentan
|
|
144
|
+
con `// @phpstan-ignore-next-line` y comentario explicativo.
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Rate limiting en rutas de autenticación
|
|
149
|
+
|
|
150
|
+
```php
|
|
151
|
+
// routes/api.php
|
|
152
|
+
Route::middleware('throttle:5,1')->group(function () {
|
|
153
|
+
Route::post('/login', [AuthController::class, 'login']);
|
|
154
|
+
Route::post('/registro', [AuthController::class, 'registrar']);
|
|
155
|
+
Route::post('/contrasena/recuperar', [AuthController::class, 'recuperarContrasena']);
|
|
156
|
+
});
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
- Máximo 5 intentos por minuto por IP en rutas de autenticación.
|
|
160
|
+
- Bloqueo temporal de 15 minutos al superar el límite.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Headers de seguridad
|
|
165
|
+
|
|
166
|
+
- Agregar middleware con headers de seguridad en el grupo `web` y `api`:
|
|
167
|
+
|
|
168
|
+
```php
|
|
169
|
+
// Middleware SecurityHeaders::handle()
|
|
170
|
+
$response->headers->set('X-Frame-Options', 'DENY');
|
|
171
|
+
$response->headers->set('X-Content-Type-Options', 'nosniff');
|
|
172
|
+
$response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin');
|
|
173
|
+
$response->headers->set('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Checklist de seguridad antes de merge
|
|
179
|
+
|
|
180
|
+
- [ ] Sin interpolación de strings en queries SQL
|
|
181
|
+
- [ ] Sin `{!! !!}` en Blade sin comentario que justifique la fuente confiable
|
|
182
|
+
- [ ] `$fillable` declarado en todos los modelos nuevos
|
|
183
|
+
- [ ] Sin credenciales hardcodeadas (verificar con `git grep -rn "sk_live\|password.*=.*'[^']"`)
|
|
184
|
+
- [ ] Rutas de auth con `throttle` configurado
|
|
185
|
+
- [ ] PHPStan nivel 6 pasa sin errores en `app/`
|
|
186
|
+
- [ ] `composer audit` sin vulnerabilidades HIGH o CRITICAL
|