@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,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ci-cd-pipelines
|
|
3
|
+
description: CI/CD con GitHub Actions y GitLab CI. Stages de lint, test, build, deploy. Caching, artifacts, matrix builds, secrets management, deployment strategies, monorepos y quality gates.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
herramientasPermitidas: [Read, Bash]
|
|
6
|
+
exclusiones:
|
|
7
|
+
- "No cargar para Kubernetes Deployments o Helm releases — para Kubernetes cargar `kubernetes-orquestacion`."
|
|
8
|
+
- "No cargar para Terraform o infraestructura como código — para IaC cargar `terraform-experto`."
|
|
9
|
+
- "No cargar para SRE, SLOs, runbooks o post-mortems — para operaciones en producción cargar `sre-patrones`."
|
|
10
|
+
- "No cargar para Git workflow (branching, commits, PRs) — para workflow de git cargar la regla `git-workflow.md`."
|
|
11
|
+
evolvable: true # default para skill estandar
|
|
12
|
+
---
|
|
13
|
+
# CI/CD Pipelines — Integración y Entrega Continua
|
|
14
|
+
|
|
15
|
+
## Cuándo NO cargar
|
|
16
|
+
|
|
17
|
+
- La tarea es Kubernetes: manifiestos de Deployment, Helm releases, kubectl — cargar `kubernetes-orquestacion`.
|
|
18
|
+
- El trabajo es infraestructura como código con Terraform — cargar `terraform-experto`.
|
|
19
|
+
- El tema es SRE: SLOs, runbooks, alertas, post-mortems — cargar `sre-patrones`.
|
|
20
|
+
- La tarea es Git workflow: branching strategy, mensajes de commit, revisión de PRs — cargar la regla `git-workflow.md`.
|
|
21
|
+
|
|
22
|
+
Un pipeline bien diseñado detecta errores antes de producción, entrega valor continuamente
|
|
23
|
+
y construye confianza en el equipo. Este skill cubre patrones para Python, Node y containers.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Reglas Obligatorias
|
|
28
|
+
|
|
29
|
+
1. **Lint como primer gate** — no ejecutar tests si el código no formatea.
|
|
30
|
+
2. **Cobertura mínima como quality gate** — `--cov-fail-under=80`.
|
|
31
|
+
3. **Security scanning** — código, dependencias e imagen Docker.
|
|
32
|
+
4. **NUNCA credenciales hardcodeadas** en YAML — usar GitHub Secrets / GitLab CI Variables.
|
|
33
|
+
5. **`concurrency: cancel-in-progress: true`** — evitar deploys simultáneos.
|
|
34
|
+
6. **Imagen Docker con tag de versión exacta** — NUNCA `:latest` en producción.
|
|
35
|
+
7. **Smoke tests post-deploy** — verificar health endpoint después de cada deploy.
|
|
36
|
+
8. **Staging antes de producción** — sin excepción.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Estructura de Pipeline (GitHub Actions)
|
|
41
|
+
|
|
42
|
+
```yaml
|
|
43
|
+
# Orden de jobs con dependencias
|
|
44
|
+
jobs:
|
|
45
|
+
lint: # Primero: formato y types
|
|
46
|
+
test: # Segundo: requiere lint
|
|
47
|
+
needs: lint
|
|
48
|
+
security: # Paralelo a test: requiere lint
|
|
49
|
+
needs: lint
|
|
50
|
+
build: # Tercero: requiere test + security
|
|
51
|
+
needs: [test, security]
|
|
52
|
+
deploy-staging:
|
|
53
|
+
needs: build
|
|
54
|
+
if: github.ref == 'refs/heads/develop'
|
|
55
|
+
deploy-production:
|
|
56
|
+
needs: build
|
|
57
|
+
if: github.ref == 'refs/heads/main'
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Patrón clave: `concurrency` para cancelar runs previos del mismo PR:
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
concurrency:
|
|
64
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
65
|
+
cancel-in-progress: true
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Quality Gates — No Negociables
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
# 1. Cobertura mínima
|
|
74
|
+
pytest --cov-fail-under=80
|
|
75
|
+
|
|
76
|
+
# 2. Sin vulnerabilidades críticas
|
|
77
|
+
trivy image --exit-code 1 --severity CRITICAL mi-imagen:latest
|
|
78
|
+
|
|
79
|
+
# 3. Lint sin errores
|
|
80
|
+
ruff check . --exit-non-zero-on-fix
|
|
81
|
+
|
|
82
|
+
# 4. Type checking
|
|
83
|
+
mypy app/ --strict
|
|
84
|
+
|
|
85
|
+
# 5. No secrets en código
|
|
86
|
+
trufflehog filesystem --fail ./
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Caching — Reducir Tiempo de Pipeline
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
# Cache automático de pip
|
|
95
|
+
- uses: actions/setup-python@v5
|
|
96
|
+
with:
|
|
97
|
+
python-version: "3.12"
|
|
98
|
+
cache: pip
|
|
99
|
+
|
|
100
|
+
# Docker layer cache
|
|
101
|
+
- uses: docker/build-push-action@v5
|
|
102
|
+
with:
|
|
103
|
+
cache-from: type=gha
|
|
104
|
+
cache-to: type=gha,mode=max
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Secrets — Gestión Correcta
|
|
110
|
+
|
|
111
|
+
- SIEMPRE usar secrets del CI, NUNCA en código ni archivos de pipeline.
|
|
112
|
+
- Environment-scoped secrets: staging y prod tienen valores distintos.
|
|
113
|
+
- Rotar secrets periódicamente via CLI: `gh secret set API_KEY --env production`.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Anti-patrones de CI/CD
|
|
118
|
+
|
|
119
|
+
| Anti-patrón | Corrección |
|
|
120
|
+
|-------------|------------|
|
|
121
|
+
| Tests que dependen de orden | Tests independientes con fixtures |
|
|
122
|
+
| Credenciales en YAML | GitHub Secrets + env vars |
|
|
123
|
+
| Pipeline sin caché | `cache:` en dependencias |
|
|
124
|
+
| Deploy sin smoke tests | Health check post-deploy |
|
|
125
|
+
| Un solo job gigante | Jobs separados con `needs:` |
|
|
126
|
+
| Sin `concurrency:` | `cancel-in-progress: true` |
|
|
127
|
+
| `:latest` en producción | SHA o semver en imagen |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Checklist de Pipeline Productivo
|
|
132
|
+
|
|
133
|
+
- [ ] Lint y format check como primer gate
|
|
134
|
+
- [ ] Tests con BD real (no solo mocks)
|
|
135
|
+
- [ ] Cobertura mínima como quality gate
|
|
136
|
+
- [ ] Security scanning (código + deps + imagen)
|
|
137
|
+
- [ ] Docker build con cache habilitado
|
|
138
|
+
- [ ] Deploy a staging antes de producción
|
|
139
|
+
- [ ] Smoke tests post-deploy
|
|
140
|
+
- [ ] Notificaciones de fallo en canal de alertas
|
|
141
|
+
- [ ] Secrets en el sistema de CI (no en código)
|
|
142
|
+
- [ ] `concurrency` configurado
|
|
143
|
+
- [ ] Tiempo total < 15 minutos
|
|
144
|
+
|
|
145
|
+
Para pipelines completos de GitHub Actions y GitLab CI, matrix builds, monorepo y notificaciones, ver [recursos/pipelines-completos.md](recursos/pipelines-completos.md).
|
|
146
|
+
|
|
147
|
+
Para template de GitHub Actions reutilizable, ver [recursos/github-actions-template.yaml](recursos/github-actions-template.yaml).
|
|
148
|
+
|
|
149
|
+
## Gotchas / Errores comunes no obvios
|
|
150
|
+
|
|
151
|
+
**`actions/cache` no hace hit si el lock file cambia en la misma PR que agrega la dependencia**: la clave del cache incluye el hash del `package-lock.json` o `requirements.txt` — cuando el PR agrega una nueva dependencia, la clave cambia y el cache no existe aún, causando una instalación completa. Causa: es el comportamiento correcto y esperado, pero sorprende en PRs de "solo agrego una dependencia". Fix: aceptar que el primer build de una nueva dependencia siempre es lento — el cache se llenará en builds subsiguientes. Optimizar usando `restore-keys` para hit parcial.
|
|
152
|
+
|
|
153
|
+
**`concurrency: cancel-in-progress: true` cancela el deploy de staging cuando se pushea al PR antes de que el deploy termine**: si alguien hace dos pushes rápidos al mismo PR, el primer deploy de staging se cancela a la mitad. Causa: `cancel-in-progress` cancela cualquier run del mismo grupo de concurrencia, incluyendo deploys en progreso. Fix: para jobs de deploy, usar una concurrencia diferente: `group: deploy-staging-${{ github.ref }}` para agrupar solo deploys del mismo branch, y considerar `cancel-in-progress: false` para deploys que no deben cancelarse a la mitad.
|
|
154
|
+
|
|
155
|
+
**Secrets definidos en GitHub Actions no están disponibles en workflows de forks en PRs externas**: los workflows disparados por un PR de un fork (contribuidor externo) no tienen acceso a los secrets del repositorio por seguridad. Causa: prevención de exfiltración de secrets a forks maliciosos. Fix: usar el evento `pull_request_target` con cuidado para acceder a secrets en PRs de forks, pero solo para jobs que no ejecutan código del PR — los jobs de lint/test pueden correr sin secrets; los de deploy sí necesitan el evento `push` al branch base.
|
|
156
|
+
|
|
157
|
+
**`docker/build-push-action` con `cache-from: type=gha` puede hacer el build más lento si el cache es muy grande**: el cache de GitHub Actions (10GB límite) se llena con layers de Docker — si se usan imágenes base grandes y muchos stages, el cache puede alcanzar el límite y las layers más antiguas se evictan, causando rebuilds completos. Causa: el cache de GHA tiene límite de 10GB por repositorio. Fix: usar `cache-from: type=registry,ref=ghcr.io/org/app:cache` con un registro de contenedores para cache ilimitado, o usar `mode=min` en el cache para solo guardar las layers finales en lugar de todas las intermedias.
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
# ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
# Template de GitHub Actions CI/CD
|
|
3
|
+
# Cubre: lint, type-check, tests, build de Docker, deploy a staging y producción.
|
|
4
|
+
#
|
|
5
|
+
# INSTRUCCIONES DE USO:
|
|
6
|
+
# 1. Copiar a .github/workflows/ci-cd.yml
|
|
7
|
+
# 2. Reemplazar todos los valores entre [corchetes] con los reales
|
|
8
|
+
# 3. Configurar los secrets en Settings → Secrets and variables → Actions
|
|
9
|
+
# 4. Ajustar los jobs según el stack del proyecto (ver comentarios INSTRUCCIÓN)
|
|
10
|
+
#
|
|
11
|
+
# SECRETS REQUERIDOS (configurar en el repo antes de hacer push):
|
|
12
|
+
# REGISTRY_USERNAME Usuario del container registry
|
|
13
|
+
# REGISTRY_PASSWORD Token del container registry
|
|
14
|
+
# STAGING_DEPLOY_KEY SSH key o token para deploy a staging
|
|
15
|
+
# PRODUCTION_DEPLOY_KEY SSH key o token para deploy a producción
|
|
16
|
+
# SLACK_WEBHOOK_URL (opcional) para notificaciones de deploy
|
|
17
|
+
# ═══════════════════════════════════════════════════════════════════════════════
|
|
18
|
+
|
|
19
|
+
name: CI/CD Pipeline
|
|
20
|
+
|
|
21
|
+
on:
|
|
22
|
+
push:
|
|
23
|
+
branches:
|
|
24
|
+
- main
|
|
25
|
+
- develop
|
|
26
|
+
tags:
|
|
27
|
+
- "v*.*.*"
|
|
28
|
+
pull_request:
|
|
29
|
+
branches:
|
|
30
|
+
- main
|
|
31
|
+
- develop
|
|
32
|
+
|
|
33
|
+
# Cancelar runs previos del mismo PR o branch (ahorra minutos de CI)
|
|
34
|
+
concurrency:
|
|
35
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
36
|
+
cancel-in-progress: true
|
|
37
|
+
|
|
38
|
+
# ─── Variables globales ────────────────────────────────────────────────────────
|
|
39
|
+
env:
|
|
40
|
+
PYTHON_VERSION: "3.12"
|
|
41
|
+
NODE_VERSION: "20"
|
|
42
|
+
# INSTRUCCIÓN: reemplazar con el registry real (ghcr.io, docker.io, etc.)
|
|
43
|
+
REGISTRY: "ghcr.io"
|
|
44
|
+
IMAGE_NAME: "${{ github.repository }}"
|
|
45
|
+
|
|
46
|
+
# ═══════════════════════════════════════════════════════════════════════════════
|
|
47
|
+
jobs:
|
|
48
|
+
|
|
49
|
+
# ─── Job 1: Lint y type-check ────────────────────────────────────────────────
|
|
50
|
+
lint:
|
|
51
|
+
name: "Lint y Type Check"
|
|
52
|
+
runs-on: ubuntu-latest
|
|
53
|
+
timeout-minutes: 10
|
|
54
|
+
|
|
55
|
+
steps:
|
|
56
|
+
- name: "Checkout"
|
|
57
|
+
uses: actions/checkout@v4
|
|
58
|
+
|
|
59
|
+
- name: "Setup Python ${{ env.PYTHON_VERSION }}"
|
|
60
|
+
uses: actions/setup-python@v5
|
|
61
|
+
with:
|
|
62
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
63
|
+
cache: pip
|
|
64
|
+
|
|
65
|
+
- name: "Instalar herramientas de lint"
|
|
66
|
+
run: pip install ruff mypy types-requests
|
|
67
|
+
|
|
68
|
+
# INSTRUCCIÓN: ajustar según las herramientas que uses
|
|
69
|
+
- name: "Ruff — linter y formatter"
|
|
70
|
+
run: |
|
|
71
|
+
ruff check . --output-format=github
|
|
72
|
+
ruff format . --check
|
|
73
|
+
|
|
74
|
+
- name: "Mypy — type checking"
|
|
75
|
+
run: mypy . --ignore-missing-imports
|
|
76
|
+
|
|
77
|
+
# INSTRUCCIÓN: si hay frontend Angular/Node, agregar este bloque
|
|
78
|
+
# - name: "Setup Node ${{ env.NODE_VERSION }}"
|
|
79
|
+
# uses: actions/setup-node@v4
|
|
80
|
+
# with:
|
|
81
|
+
# node-version: ${{ env.NODE_VERSION }}
|
|
82
|
+
# cache: npm
|
|
83
|
+
# - name: "npm install"
|
|
84
|
+
# run: npm ci
|
|
85
|
+
# - name: "ESLint"
|
|
86
|
+
# run: npm run lint
|
|
87
|
+
|
|
88
|
+
# ─── Job 2: Tests ────────────────────────────────────────────────────────────
|
|
89
|
+
test:
|
|
90
|
+
name: "Tests"
|
|
91
|
+
runs-on: ubuntu-latest
|
|
92
|
+
timeout-minutes: 15
|
|
93
|
+
needs: [lint]
|
|
94
|
+
|
|
95
|
+
# INSTRUCCIÓN: ajustar los servicios según el stack del proyecto
|
|
96
|
+
services:
|
|
97
|
+
postgres:
|
|
98
|
+
image: postgres:16-alpine
|
|
99
|
+
env:
|
|
100
|
+
POSTGRES_USER: test_user
|
|
101
|
+
POSTGRES_PASSWORD: test_password
|
|
102
|
+
POSTGRES_DB: test_db
|
|
103
|
+
options: >-
|
|
104
|
+
--health-cmd pg_isready
|
|
105
|
+
--health-interval 10s
|
|
106
|
+
--health-timeout 5s
|
|
107
|
+
--health-retries 5
|
|
108
|
+
ports:
|
|
109
|
+
- 5432:5432
|
|
110
|
+
|
|
111
|
+
# INSTRUCCIÓN: descomentar si usas Redis
|
|
112
|
+
# redis:
|
|
113
|
+
# image: redis:7-alpine
|
|
114
|
+
# options: >-
|
|
115
|
+
# --health-cmd "redis-cli ping"
|
|
116
|
+
# --health-interval 10s
|
|
117
|
+
# --health-timeout 5s
|
|
118
|
+
# --health-retries 5
|
|
119
|
+
# ports:
|
|
120
|
+
# - 6379:6379
|
|
121
|
+
|
|
122
|
+
steps:
|
|
123
|
+
- name: "Checkout"
|
|
124
|
+
uses: actions/checkout@v4
|
|
125
|
+
|
|
126
|
+
- name: "Setup Python ${{ env.PYTHON_VERSION }}"
|
|
127
|
+
uses: actions/setup-python@v5
|
|
128
|
+
with:
|
|
129
|
+
python-version: ${{ env.PYTHON_VERSION }}
|
|
130
|
+
cache: pip
|
|
131
|
+
|
|
132
|
+
- name: "Instalar dependencias"
|
|
133
|
+
run: pip install -r requirements.txt -r requirements-test.txt
|
|
134
|
+
|
|
135
|
+
- name: "Aplicar migraciones de base de datos"
|
|
136
|
+
env:
|
|
137
|
+
DATABASE_URL: "postgresql://test_user:test_password@localhost:5432/test_db"
|
|
138
|
+
run: |
|
|
139
|
+
# INSTRUCCIÓN: ajustar al sistema de migraciones del proyecto
|
|
140
|
+
alembic upgrade head
|
|
141
|
+
|
|
142
|
+
- name: "Ejecutar tests con cobertura"
|
|
143
|
+
env:
|
|
144
|
+
DATABASE_URL: "postgresql://test_user:test_password@localhost:5432/test_db"
|
|
145
|
+
# INSTRUCCIÓN: agregar más variables de entorno que necesiten los tests
|
|
146
|
+
APP_ENV: "test"
|
|
147
|
+
SECRET_KEY: "test-secret-key-no-usar-en-produccion"
|
|
148
|
+
run: |
|
|
149
|
+
pytest \
|
|
150
|
+
--cov=[nombre-del-modulo] \
|
|
151
|
+
--cov-report=term-missing \
|
|
152
|
+
--cov-report=xml:coverage.xml \
|
|
153
|
+
--cov-fail-under=80 \
|
|
154
|
+
-v \
|
|
155
|
+
--tb=short
|
|
156
|
+
|
|
157
|
+
- name: "Subir reporte de cobertura"
|
|
158
|
+
uses: actions/upload-artifact@v4
|
|
159
|
+
if: always()
|
|
160
|
+
with:
|
|
161
|
+
name: coverage-report
|
|
162
|
+
path: coverage.xml
|
|
163
|
+
retention-days: 7
|
|
164
|
+
|
|
165
|
+
# INSTRUCCIÓN: descomentar para integración con Codecov
|
|
166
|
+
# - name: "Subir cobertura a Codecov"
|
|
167
|
+
# uses: codecov/codecov-action@v4
|
|
168
|
+
# with:
|
|
169
|
+
# file: ./coverage.xml
|
|
170
|
+
# fail_ci_if_error: true
|
|
171
|
+
|
|
172
|
+
# ─── Job 3: Build de imagen Docker ───────────────────────────────────────────
|
|
173
|
+
build:
|
|
174
|
+
name: "Build Docker Image"
|
|
175
|
+
runs-on: ubuntu-latest
|
|
176
|
+
timeout-minutes: 20
|
|
177
|
+
needs: [test]
|
|
178
|
+
# Solo construir en push a branches principales o en tags de release
|
|
179
|
+
if: github.event_name == 'push'
|
|
180
|
+
|
|
181
|
+
outputs:
|
|
182
|
+
image-tag: ${{ steps.meta.outputs.tags }}
|
|
183
|
+
image-digest: ${{ steps.build.outputs.digest }}
|
|
184
|
+
|
|
185
|
+
steps:
|
|
186
|
+
- name: "Checkout"
|
|
187
|
+
uses: actions/checkout@v4
|
|
188
|
+
|
|
189
|
+
- name: "Configurar Docker Buildx"
|
|
190
|
+
uses: docker/setup-buildx-action@v3
|
|
191
|
+
|
|
192
|
+
- name: "Login al container registry"
|
|
193
|
+
uses: docker/login-action@v3
|
|
194
|
+
with:
|
|
195
|
+
registry: ${{ env.REGISTRY }}
|
|
196
|
+
username: ${{ secrets.REGISTRY_USERNAME }}
|
|
197
|
+
password: ${{ secrets.REGISTRY_PASSWORD }}
|
|
198
|
+
|
|
199
|
+
- name: "Extraer metadata para el tag"
|
|
200
|
+
id: meta
|
|
201
|
+
uses: docker/metadata-action@v5
|
|
202
|
+
with:
|
|
203
|
+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
204
|
+
tags: |
|
|
205
|
+
type=ref,event=branch
|
|
206
|
+
type=semver,pattern={{version}}
|
|
207
|
+
type=semver,pattern={{major}}.{{minor}}
|
|
208
|
+
type=sha,prefix=sha-,format=short
|
|
209
|
+
labels: |
|
|
210
|
+
org.opencontainers.image.title=[Nombre de la aplicación]
|
|
211
|
+
org.opencontainers.image.description=[Descripción corta]
|
|
212
|
+
|
|
213
|
+
- name: "Build y Push"
|
|
214
|
+
id: build
|
|
215
|
+
uses: docker/build-push-action@v6
|
|
216
|
+
with:
|
|
217
|
+
context: .
|
|
218
|
+
push: true
|
|
219
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
220
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
221
|
+
# Cache: reutilizar capas de builds anteriores
|
|
222
|
+
cache-from: type=gha
|
|
223
|
+
cache-to: type=gha,mode=max
|
|
224
|
+
# Build args si el Dockerfile los necesita
|
|
225
|
+
build-args: |
|
|
226
|
+
PYTHON_VERSION=${{ env.PYTHON_VERSION }}
|
|
227
|
+
|
|
228
|
+
- name: "Escanear imagen por vulnerabilidades"
|
|
229
|
+
uses: aquasecurity/trivy-action@master
|
|
230
|
+
with:
|
|
231
|
+
image-ref: "${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}"
|
|
232
|
+
format: "sarif"
|
|
233
|
+
output: "trivy-results.sarif"
|
|
234
|
+
exit-code: "1"
|
|
235
|
+
severity: "CRITICAL,HIGH"
|
|
236
|
+
|
|
237
|
+
- name: "Subir resultados de Trivy a GitHub Security"
|
|
238
|
+
uses: github/codeql-action/upload-sarif@v3
|
|
239
|
+
if: always()
|
|
240
|
+
with:
|
|
241
|
+
sarif_file: "trivy-results.sarif"
|
|
242
|
+
|
|
243
|
+
# ─── Job 4: Deploy a Staging ─────────────────────────────────────────────────
|
|
244
|
+
deploy-staging:
|
|
245
|
+
name: "Deploy → Staging"
|
|
246
|
+
runs-on: ubuntu-latest
|
|
247
|
+
timeout-minutes: 15
|
|
248
|
+
needs: [build]
|
|
249
|
+
# Solo desplegar en el branch develop
|
|
250
|
+
if: github.ref == 'refs/heads/develop' && github.event_name == 'push'
|
|
251
|
+
environment:
|
|
252
|
+
name: staging
|
|
253
|
+
url: "https://[tu-app-staging.com]"
|
|
254
|
+
|
|
255
|
+
steps:
|
|
256
|
+
- name: "Checkout"
|
|
257
|
+
uses: actions/checkout@v4
|
|
258
|
+
|
|
259
|
+
# INSTRUCCIÓN: ajustar según la estrategia de deploy del proyecto
|
|
260
|
+
# Opción A: Deploy via SSH
|
|
261
|
+
- name: "Deploy via SSH a staging"
|
|
262
|
+
uses: appleboy/ssh-action@v1
|
|
263
|
+
with:
|
|
264
|
+
host: "[staging-server.com]"
|
|
265
|
+
username: "deploy"
|
|
266
|
+
key: ${{ secrets.STAGING_DEPLOY_KEY }}
|
|
267
|
+
script: |
|
|
268
|
+
cd /opt/[nombre-app]
|
|
269
|
+
docker compose pull
|
|
270
|
+
docker compose up -d --no-deps --force-recreate [nombre-servicio]
|
|
271
|
+
docker compose exec -T [nombre-servicio] alembic upgrade head
|
|
272
|
+
docker system prune -f
|
|
273
|
+
|
|
274
|
+
# INSTRUCCIÓN: Opción B: Deploy via kubectl (Kubernetes)
|
|
275
|
+
# - name: "Setup kubectl"
|
|
276
|
+
# uses: azure/setup-kubectl@v4
|
|
277
|
+
# - name: "Deploy a Kubernetes staging"
|
|
278
|
+
# run: |
|
|
279
|
+
# kubectl set image deployment/[nombre-app] \
|
|
280
|
+
# [nombre-app]=${{ needs.build.outputs.image-tag }} \
|
|
281
|
+
# -n staging
|
|
282
|
+
|
|
283
|
+
- name: "Verificar health check"
|
|
284
|
+
run: |
|
|
285
|
+
sleep 15
|
|
286
|
+
curl -f https://[tu-app-staging.com]/health || exit 1
|
|
287
|
+
|
|
288
|
+
- name: "Notificar deploy exitoso"
|
|
289
|
+
if: success()
|
|
290
|
+
run: |
|
|
291
|
+
curl -s -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" \
|
|
292
|
+
-H "Content-Type: application/json" \
|
|
293
|
+
-d "{\"text\": \"Deploy a staging exitoso: ${{ github.sha }} — <https://[tu-app-staging.com]|Ver staging>\"}"
|
|
294
|
+
|
|
295
|
+
# ─── Job 5: Deploy a Producción ──────────────────────────────────────────────
|
|
296
|
+
deploy-production:
|
|
297
|
+
name: "Deploy → Producción"
|
|
298
|
+
runs-on: ubuntu-latest
|
|
299
|
+
timeout-minutes: 20
|
|
300
|
+
needs: [build]
|
|
301
|
+
# Solo desplegar en tags de release (v*.*.*)
|
|
302
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
303
|
+
environment:
|
|
304
|
+
name: production
|
|
305
|
+
url: "https://[tu-app-produccion.com]"
|
|
306
|
+
# Requiere aprobación manual en GitHub Environments antes de ejecutar
|
|
307
|
+
|
|
308
|
+
steps:
|
|
309
|
+
- name: "Checkout"
|
|
310
|
+
uses: actions/checkout@v4
|
|
311
|
+
|
|
312
|
+
- name: "Validar que el tag coincide con el changelog"
|
|
313
|
+
run: |
|
|
314
|
+
VERSION="${GITHUB_REF#refs/tags/v}"
|
|
315
|
+
if ! grep -q "## \[${VERSION}\]" CHANGELOG.md 2>/dev/null; then
|
|
316
|
+
echo "ERROR: CHANGELOG.md no tiene entrada para la versión ${VERSION}"
|
|
317
|
+
echo "Ejecuta: bash habilidades/release-semver/scripts/generar-changelog.sh"
|
|
318
|
+
exit 1
|
|
319
|
+
fi
|
|
320
|
+
|
|
321
|
+
# INSTRUCCIÓN: misma estrategia que staging pero apuntando a producción
|
|
322
|
+
- name: "Deploy via SSH a producción"
|
|
323
|
+
uses: appleboy/ssh-action@v1
|
|
324
|
+
with:
|
|
325
|
+
host: "[prod-server.com]"
|
|
326
|
+
username: "deploy"
|
|
327
|
+
key: ${{ secrets.PRODUCTION_DEPLOY_KEY }}
|
|
328
|
+
script: |
|
|
329
|
+
set -e
|
|
330
|
+
cd /opt/[nombre-app]
|
|
331
|
+
|
|
332
|
+
# Backup de la base de datos antes del deploy
|
|
333
|
+
docker compose exec -T postgres pg_dump -U [db_user] [db_name] \
|
|
334
|
+
> /backups/pre-deploy-$(date +%Y%m%d-%H%M%S).sql
|
|
335
|
+
|
|
336
|
+
# Deploy con zero-downtime (rolling update)
|
|
337
|
+
docker compose pull
|
|
338
|
+
docker compose up -d --no-deps --force-recreate [nombre-servicio]
|
|
339
|
+
|
|
340
|
+
# Migraciones
|
|
341
|
+
docker compose exec -T [nombre-servicio] alembic upgrade head
|
|
342
|
+
|
|
343
|
+
# Limpiar imágenes antiguas
|
|
344
|
+
docker system prune -f --filter "until=24h"
|
|
345
|
+
|
|
346
|
+
- name: "Verificar health check de producción"
|
|
347
|
+
run: |
|
|
348
|
+
sleep 20
|
|
349
|
+
for i in {1..5}; do
|
|
350
|
+
curl -f https://[tu-app-produccion.com]/health && break
|
|
351
|
+
echo "Intento $i fallido, esperando 10s..."
|
|
352
|
+
sleep 10
|
|
353
|
+
done
|
|
354
|
+
|
|
355
|
+
- name: "Crear GitHub Release"
|
|
356
|
+
uses: softprops/action-gh-release@v2
|
|
357
|
+
with:
|
|
358
|
+
generate_release_notes: false
|
|
359
|
+
body_path: CHANGELOG.md
|
|
360
|
+
# INSTRUCCIÓN: agregar artefactos del release si corresponde
|
|
361
|
+
# files: |
|
|
362
|
+
# dist/*.whl
|
|
363
|
+
# dist/*.tar.gz
|
|
364
|
+
|
|
365
|
+
- name: "Notificar release a producción"
|
|
366
|
+
if: success()
|
|
367
|
+
run: |
|
|
368
|
+
VERSION="${GITHUB_REF#refs/tags/v}"
|
|
369
|
+
curl -s -X POST "${{ secrets.SLACK_WEBHOOK_URL }}" \
|
|
370
|
+
-H "Content-Type: application/json" \
|
|
371
|
+
-d "{\"text\": \"Release v${VERSION} desplegado a producción exitosamente\"}"
|
|
372
|
+
|
|
373
|
+
- name: "Rollback automático si el health check falla"
|
|
374
|
+
if: failure()
|
|
375
|
+
uses: appleboy/ssh-action@v1
|
|
376
|
+
with:
|
|
377
|
+
host: "[prod-server.com]"
|
|
378
|
+
username: "deploy"
|
|
379
|
+
key: ${{ secrets.PRODUCTION_DEPLOY_KEY }}
|
|
380
|
+
script: |
|
|
381
|
+
cd /opt/[nombre-app]
|
|
382
|
+
# Revertir a la imagen anterior
|
|
383
|
+
docker compose up -d --no-deps --force-recreate [nombre-servicio]
|
|
384
|
+
echo "ROLLBACK ejecutado — revisar logs manualmente"
|
|
385
|
+
|
|
386
|
+
# ═══════════════════════════════════════════════════════════════════════════════
|
|
387
|
+
# CONFIGURACIÓN ADICIONAL RECOMENDADA:
|
|
388
|
+
#
|
|
389
|
+
# 1. Branch protection rules (Settings → Branches → Add rule para 'main'):
|
|
390
|
+
# - Require status checks: lint, test
|
|
391
|
+
# - Require pull request reviews before merging
|
|
392
|
+
# - Require signed commits
|
|
393
|
+
# - Do not allow bypassing
|
|
394
|
+
#
|
|
395
|
+
# 2. Environments (Settings → Environments):
|
|
396
|
+
# - staging: sin restricciones de revisores
|
|
397
|
+
# - production: required reviewers = [tu usuario]
|
|
398
|
+
#
|
|
399
|
+
# 3. Secrets necesarios (Settings → Secrets → Actions):
|
|
400
|
+
# REGISTRY_USERNAME, REGISTRY_PASSWORD
|
|
401
|
+
# STAGING_DEPLOY_KEY, PRODUCTION_DEPLOY_KEY
|
|
402
|
+
# SLACK_WEBHOOK_URL (opcional)
|
|
403
|
+
# ═══════════════════════════════════════════════════════════════════════════════
|