@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,308 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: azure-cloud
|
|
3
|
+
description: >
|
|
4
|
+
Microsoft Azure: Azure Container Apps y AKS para contenedores, Azure SQL y
|
|
5
|
+
Cosmos DB para datos, Azure Functions serverless, Service Bus para mensajería
|
|
6
|
+
async, Azure AD (Entra ID) para autenticación y Key Vault para secretos.
|
|
7
|
+
Cargar cuando se despliegue en Azure, se configure infraestructura con Terraform
|
|
8
|
+
o Bicep, se integre Azure AD o se diseñen soluciones con servicios Azure.
|
|
9
|
+
version: "1.0.0"
|
|
10
|
+
herramientasPermitidas: [Read, Bash, Grep]
|
|
11
|
+
evolvable: true # default para skill estandar
|
|
12
|
+
exclusiones:
|
|
13
|
+
- "No cargar para despliegues en AWS o GCP — para AWS cargar `cloud-aws`, para GCP cargar `gcp-cloud`."
|
|
14
|
+
- "No cargar para configurar Azure DevOps pipelines o GitHub Actions con self-hosted runners en Azure — para CI/CD pipelines cargar el skill de git-workflow y usar la documentación de Azure DevOps directamente."
|
|
15
|
+
- "No cargar para análisis de costos Azure o rightsizing de instancias — para optimización de costos cloud usar Azure Cost Management directamente o el skill de arquitectura cloud."
|
|
16
|
+
- "No cargar para diseño de estrategias de disaster recovery o backup multi-región — este skill cubre despliegue en una región; para DR multi-región consultar la documentación de Azure Site Recovery."
|
|
17
|
+
---
|
|
18
|
+
# Azure Cloud — Microsoft Azure
|
|
19
|
+
|
|
20
|
+
Skill para desplegar y operar sistemas en Microsoft Azure. Cubre Container Apps,
|
|
21
|
+
AKS, Azure SQL, Service Bus, Azure AD (Entra ID) y Key Vault. Para patrones AWS
|
|
22
|
+
ver `Skill("cloud-aws")`. Para GCP ver `Skill("gcp-cloud")`.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Cuándo NO cargar
|
|
27
|
+
|
|
28
|
+
- La tarea es desplegar en AWS: cargar `cloud-aws`.
|
|
29
|
+
- La tarea es desplegar en GCP: cargar `gcp-cloud`.
|
|
30
|
+
- La tarea es configurar Azure DevOps pipelines o GitHub Actions: usar la documentación de Azure DevOps directamente.
|
|
31
|
+
- La tarea es análisis de costos o rightsizing: usar Azure Cost Management directamente.
|
|
32
|
+
|
|
33
|
+
## Cuándo cargar este skill
|
|
34
|
+
|
|
35
|
+
- Al desplegar servicios en Azure Container Apps o AKS
|
|
36
|
+
- Al conectar a Azure SQL o Cosmos DB desde Python o Node
|
|
37
|
+
- Al configurar Service Bus para mensajería async entre servicios
|
|
38
|
+
- Al implementar autenticación con Azure AD (Entra ID) en APIs
|
|
39
|
+
- Al gestionar secretos con Key Vault
|
|
40
|
+
- Al escribir Bicep o Terraform para infraestructura Azure
|
|
41
|
+
- Al configurar Managed Identity para acceso sin credenciales explícitas
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 1. Azure Container Apps — contenedores serverless con Bicep
|
|
46
|
+
|
|
47
|
+
```bicep
|
|
48
|
+
// container-app.bicep
|
|
49
|
+
resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
|
|
50
|
+
name: 'mi-api'
|
|
51
|
+
location: location
|
|
52
|
+
identity: {
|
|
53
|
+
type: 'SystemAssigned' // Managed Identity para acceder a Key Vault sin credenciales
|
|
54
|
+
}
|
|
55
|
+
properties: {
|
|
56
|
+
managedEnvironmentId: environment.id
|
|
57
|
+
configuration: {
|
|
58
|
+
ingress: {
|
|
59
|
+
external: true
|
|
60
|
+
targetPort: 8000
|
|
61
|
+
transport: 'http'
|
|
62
|
+
}
|
|
63
|
+
secrets: [
|
|
64
|
+
{
|
|
65
|
+
name: 'db-connection-string'
|
|
66
|
+
keyVaultUrl: dbSecretUri
|
|
67
|
+
identity: 'system' // Usa la Managed Identity para leer el secreto
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
template: {
|
|
72
|
+
scale: {
|
|
73
|
+
minReplicas: 1
|
|
74
|
+
maxReplicas: 10
|
|
75
|
+
rules: [
|
|
76
|
+
{
|
|
77
|
+
name: 'http-scaling'
|
|
78
|
+
http: {
|
|
79
|
+
metadata: { concurrentRequests: '50' }
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
containers: [
|
|
85
|
+
{
|
|
86
|
+
name: 'api'
|
|
87
|
+
image: 'miregistry.azurecr.io/mi-api:latest'
|
|
88
|
+
resources: {
|
|
89
|
+
cpu: json('0.5')
|
|
90
|
+
memory: '1Gi'
|
|
91
|
+
}
|
|
92
|
+
env: [
|
|
93
|
+
{ name: 'DATABASE_URL', secretRef: 'db-connection-string' }
|
|
94
|
+
{ name: 'AZURE_TENANT_ID', value: tenantId }
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Puntos clave de Container Apps:**
|
|
104
|
+
- `identity.type: 'SystemAssigned'` habilita Managed Identity automáticamente
|
|
105
|
+
- Los secretos se leen de Key Vault usando la Managed Identity — sin credenciales en código
|
|
106
|
+
- `minReplicas: 1` para APIs REST que no toleran cold starts
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 2. Azure Service Bus — mensajería async
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
from azure.servicebus.aio import ServiceBusClient, ServiceBusMessage
|
|
114
|
+
from azure.identity.aio import DefaultAzureCredential
|
|
115
|
+
import json
|
|
116
|
+
import uuid
|
|
117
|
+
|
|
118
|
+
# DefaultAzureCredential usa Managed Identity en producción
|
|
119
|
+
# y credenciales del desarrollador localmente (az login)
|
|
120
|
+
credential = DefaultAzureCredential()
|
|
121
|
+
|
|
122
|
+
NAMESPACE = "mi-namespace"
|
|
123
|
+
|
|
124
|
+
async def enviar_mensaje(cola: str, datos: dict) -> None:
|
|
125
|
+
async with ServiceBusClient(
|
|
126
|
+
fully_qualified_namespace=f"{NAMESPACE}.servicebus.windows.net",
|
|
127
|
+
credential=credential,
|
|
128
|
+
) as client:
|
|
129
|
+
sender = client.get_queue_sender(queue_name=cola)
|
|
130
|
+
async with sender:
|
|
131
|
+
await sender.send_messages(
|
|
132
|
+
ServiceBusMessage(
|
|
133
|
+
json.dumps(datos, ensure_ascii=False),
|
|
134
|
+
content_type="application/json",
|
|
135
|
+
message_id=str(uuid.uuid4()), # Deduplicación de mensajes
|
|
136
|
+
subject=datos.get("tipo_evento", "evento"),
|
|
137
|
+
)
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
async def recibir_mensajes(cola: str, max_mensajes: int = 10) -> None:
|
|
141
|
+
async with ServiceBusClient(
|
|
142
|
+
fully_qualified_namespace=f"{NAMESPACE}.servicebus.windows.net",
|
|
143
|
+
credential=credential,
|
|
144
|
+
) as client:
|
|
145
|
+
receiver = client.get_queue_receiver(queue_name=cola)
|
|
146
|
+
async with receiver:
|
|
147
|
+
mensajes = await receiver.receive_messages(max_message_count=max_mensajes)
|
|
148
|
+
for mensaje in mensajes:
|
|
149
|
+
try:
|
|
150
|
+
datos = json.loads(str(mensaje))
|
|
151
|
+
await procesar_evento(datos)
|
|
152
|
+
await receiver.complete_message(mensaje)
|
|
153
|
+
except Exception:
|
|
154
|
+
await receiver.abandon_message(mensaje) # Reencola
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 3. Azure AD (Entra ID) — autenticación en APIs FastAPI
|
|
160
|
+
|
|
161
|
+
```python
|
|
162
|
+
from fastapi import Depends, HTTPException, status
|
|
163
|
+
from fastapi.security import OAuth2AuthorizationCodeBearer
|
|
164
|
+
from jose import jwt, JWTError
|
|
165
|
+
import httpx
|
|
166
|
+
|
|
167
|
+
TENANT_ID = "tu-tenant-id"
|
|
168
|
+
CLIENT_ID = "tu-client-id"
|
|
169
|
+
|
|
170
|
+
# JWKS endpoint de Azure AD para validar firmas
|
|
171
|
+
JWKS_URL = f"https://login.microsoftonline.com/{TENANT_ID}/discovery/v2.0/keys"
|
|
172
|
+
|
|
173
|
+
oauth2_scheme = OAuth2AuthorizationCodeBearer(
|
|
174
|
+
authorizationUrl=f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/authorize",
|
|
175
|
+
tokenUrl=f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token",
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
async def obtener_jwks() -> dict:
|
|
179
|
+
async with httpx.AsyncClient() as client:
|
|
180
|
+
resp = await client.get(JWKS_URL)
|
|
181
|
+
return resp.json()
|
|
182
|
+
|
|
183
|
+
async def get_current_user(token: str = Depends(oauth2_scheme)) -> dict:
|
|
184
|
+
try:
|
|
185
|
+
jwks = await obtener_jwks()
|
|
186
|
+
payload = jwt.decode(
|
|
187
|
+
token,
|
|
188
|
+
jwks,
|
|
189
|
+
algorithms=["RS256"],
|
|
190
|
+
audience=CLIENT_ID,
|
|
191
|
+
issuer=f"https://login.microsoftonline.com/{TENANT_ID}/v2.0",
|
|
192
|
+
)
|
|
193
|
+
return payload
|
|
194
|
+
except JWTError:
|
|
195
|
+
raise HTTPException(
|
|
196
|
+
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
197
|
+
detail="Token inválido o expirado",
|
|
198
|
+
headers={"WWW-Authenticate": "Bearer"},
|
|
199
|
+
)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## 4. Key Vault — gestión de secretos
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
from azure.keyvault.secrets.aio import SecretClient
|
|
208
|
+
from azure.identity.aio import DefaultAzureCredential
|
|
209
|
+
|
|
210
|
+
KEY_VAULT_URL = "https://mi-vault.vault.azure.net/"
|
|
211
|
+
|
|
212
|
+
async def get_secret(nombre: str) -> str:
|
|
213
|
+
"""Obtiene un secreto de Key Vault usando Managed Identity."""
|
|
214
|
+
credential = DefaultAzureCredential()
|
|
215
|
+
client = SecretClient(vault_url=KEY_VAULT_URL, credential=credential)
|
|
216
|
+
try:
|
|
217
|
+
secret = await client.get_secret(nombre)
|
|
218
|
+
return secret.value
|
|
219
|
+
finally:
|
|
220
|
+
await client.close()
|
|
221
|
+
await credential.close()
|
|
222
|
+
|
|
223
|
+
# Patrón recomendado: cachear secrets al inicio para evitar latencia
|
|
224
|
+
# en cada request. Usar Azure App Configuration para config dinámica.
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 5. Managed Identity — principio de mínimo privilegio
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# Otorgar acceso a Key Vault para la Managed Identity del Container App
|
|
233
|
+
az keyvault set-policy \
|
|
234
|
+
--name mi-vault \
|
|
235
|
+
--object-id $(az containerapp identity show \
|
|
236
|
+
--name mi-api \
|
|
237
|
+
--resource-group mi-rg \
|
|
238
|
+
--query principalId -o tsv) \
|
|
239
|
+
--secret-permissions get list
|
|
240
|
+
|
|
241
|
+
# Para Azure SQL: crear usuario en la base de datos vinculado a la Managed Identity
|
|
242
|
+
# (ejecutar en la base de datos como administrador)
|
|
243
|
+
# CREATE USER [mi-api] FROM EXTERNAL PROVIDER;
|
|
244
|
+
# ALTER ROLE db_datareader ADD MEMBER [mi-api];
|
|
245
|
+
# ALTER ROLE db_datawriter ADD MEMBER [mi-api];
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 6. Reglas obligatorias
|
|
251
|
+
|
|
252
|
+
| Regla | Justificación | Verificación |
|
|
253
|
+
|-------|--------------|--------------|
|
|
254
|
+
| Managed Identity en Container Apps y AKS | Los service principals con secretos rotan y se filtran | Verificar `identity.type: 'SystemAssigned'` en Bicep/Terraform |
|
|
255
|
+
| `DefaultAzureCredential` en el código | Funciona con Managed Identity en producción y `az login` en local sin cambios | Buscar `DefaultAzureCredential` en lugar de cadenas de conexión |
|
|
256
|
+
| Key Vault para todos los secretos | Las connection strings en variables de entorno aparecen en logs y dashboards | Verificar que no hay `SecretKeyRef` con valores hardcodeados |
|
|
257
|
+
| Diagnostic settings en todos los recursos | Sin logs en Log Analytics no hay observabilidad ni alertas | Revisar que cada recurso tiene `diagnosticSettings` en Bicep |
|
|
258
|
+
| Tags en recursos | Sin tags no se puede analizar costo por servicio ni equipo | `tags: { env: 'prod', equipo: 'backend' }` en cada recurso |
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 7. Anti-patrones
|
|
263
|
+
|
|
264
|
+
| MAL | BIEN |
|
|
265
|
+
|-----|------|
|
|
266
|
+
| Connection string en variable de entorno de Container App | Secreto en Key Vault + referencia `secretRef` |
|
|
267
|
+
| Service principal con client_secret en código | Managed Identity + `DefaultAzureCredential` |
|
|
268
|
+
| `Owner` o `Contributor` para el identity de CI/CD | Roles específicos: `AcrPush`, `Storage Blob Data Contributor` |
|
|
269
|
+
| `az login --service-principal` con credenciales en código | Workload Identity Federation para GitHub Actions |
|
|
270
|
+
| Puerto 1433 (Azure SQL) abierto a internet en NSG | Private Endpoint o acceso solo desde la VNET |
|
|
271
|
+
| Secretos rotados manualmente | Key Vault + rotación automática activada |
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## 8. Checklist de verificación
|
|
276
|
+
|
|
277
|
+
- [ ] Container Apps y AKS usan Managed Identity (`SystemAssigned` o `UserAssigned`)
|
|
278
|
+
- [ ] Todos los secretos están en Key Vault, no en variables de entorno planas
|
|
279
|
+
- [ ] El código usa `DefaultAzureCredential` (no strings de conexión con contraseña)
|
|
280
|
+
- [ ] Cada recurso tiene tags `env`, `equipo` y `gestion`
|
|
281
|
+
- [ ] Diagnostic settings apuntan a un Log Analytics Workspace
|
|
282
|
+
- [ ] Network Security Groups no tienen puertos innecesarios abiertos a internet
|
|
283
|
+
- [ ] CI/CD usa Workload Identity Federation (no service principal con secret)
|
|
284
|
+
- [ ] Azure SQL o Cosmos DB tienen Private Endpoint configurado
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 9. Referencias
|
|
289
|
+
|
|
290
|
+
| Tema | Recurso |
|
|
291
|
+
|------|---------|
|
|
292
|
+
| AKS: clusters, Workload Identity, HPA, configuración segura | [recursos/aks.md](recursos/aks.md) |
|
|
293
|
+
| Azure Container Apps documentación oficial | [learn.microsoft.com/azure/container-apps](https://learn.microsoft.com/azure/container-apps) |
|
|
294
|
+
| DefaultAzureCredential — flujo de autenticación | [learn.microsoft.com/azure/developer/python/sdk/authentication-overview](https://learn.microsoft.com/azure/developer/python/sdk/authentication-overview) |
|
|
295
|
+
| Key Vault — rotación automática de secretos | [learn.microsoft.com/azure/key-vault/secrets/tutorial-rotation](https://learn.microsoft.com/azure/key-vault/secrets/tutorial-rotation) |
|
|
296
|
+
| Workload Identity Federation para CI/CD | [learn.microsoft.com/azure/active-directory/workload-identities/workload-identity-federation](https://learn.microsoft.com/azure/active-directory/workload-identities/workload-identity-federation) |
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Gotchas / Errores comunes no obvios
|
|
301
|
+
|
|
302
|
+
**`DefaultAzureCredential` funciona localmente con `az login` pero falla en el Container App con `CredentialUnavailableError` porque la Managed Identity no tiene acceso al recurso aunque aparezca asignada**: el `az containerapp identity show` confirma que la Managed Identity existe y tiene `principalId`, pero `DefaultAzureCredential` falla al intentar obtener un token de Key Vault con `403 Forbidden`. Causa: asignar la Managed Identity al Container App es diferente a otorgarle permisos en el recurso destino. La identidad existe, pero Key Vault no tiene una política de acceso para ese `principalId`. Fix: ejecutar `az keyvault set-policy --name <vault> --object-id <principalId> --secret-permissions get list` o usar RBAC de Azure con `az role assignment create --role "Key Vault Secrets User" --assignee <principalId> --scope <vault-resource-id>`. Verificar con `az keyvault secret show --vault-name <vault> --name <secret>` usando las credenciales de la identidad.
|
|
303
|
+
|
|
304
|
+
**Service Bus con `abandon_message()` en el handler de errores reencola el mensaje inmediatamente sin backoff, causando que un mensaje con procesamiento fallido se procese cientos de veces por segundo saturando la cola**: un handler que falla por un error transitorio de red hace `await receiver.abandon_message(mensaje)`, y el mensaje vuelve al frente de la cola inmediatamente. Con 10 consumidores procesando el mismo mensaje fallido, se generan 100+ llamadas por segundo al servicio fallido. Causa: Service Bus Basic/Standard tier no tiene dead letter queue automática con backoff exponencial por defecto; `abandon` simplemente reincrementar el `delivery_count`. Fix: verificar `mensaje.delivery_count` antes de procesar; si supera el umbral (ej: 5), llamar `dead_letter_message(mensaje, reason="MaxDeliveryCountExceeded")` en lugar de `abandon`. Configurar el `max_delivery_count` en la cola (por defecto 10) y verificar periódicamente la dead letter queue.
|
|
305
|
+
|
|
306
|
+
**La validación de tokens Azure AD con `jwt.decode()` y el JWKS endpoint falla 1-2 veces por día porque Azure AD rota las claves de firma sin previo aviso y el caché de JWKS en memoria tiene las claves anteriores**: el primer request después de la rotación de claves devuelve `JWTError: Signature verification failed` hasta que se llama de nuevo a `obtener_jwks()`. Los usuarios reciben 401 intermitentes durante los minutos que tardan los workers en refrescar su caché de JWKS. Causa: Azure AD rota las claves de firma periódicamente como parte de su política de seguridad; las aplicaciones deben manejar la rotación sin downtime. Fix: implementar caché de JWKS con TTL de 24 horas, pero con refresh automático cuando la verificación de firma falla con un kid desconocido: `try: verify_with_cached_jwks() except UnknownKid: refresh_jwks_cache(); verify_with_fresh_jwks()`. No hacer el refresh en cada request fallido para evitar loops.
|
|
307
|
+
|
|
308
|
+
**Bicep con `identity.type: 'SystemAssigned'` no propaga automáticamente la Managed Identity a los secretos referenciados en `configuration.secrets` si el Container App y el Key Vault están en resource groups diferentes**: el Bicep despliega sin error, pero el Container App no puede leer los secretos de Key Vault y el contenedor falla al arrancar con `SecretNotFound`. Causa: Bicep crea la Managed Identity al momento del deployment, pero la política de acceso en Key Vault (en otro resource group) no se crea automáticamente; debe ser un recurso separado en el Bicep o un paso post-deployment. Fix: agregar explícitamente el recurso de política en el Bicep del Key Vault: `resource kvPolicy 'Microsoft.KeyVault/vaults/accessPolicies@2022-07-01' = { name: '${keyVaultName}/add' properties: { accessPolicies: [{ objectId: containerApp.identity.principalId ... }] } }`. Usar `dependsOn: [containerApp]` para garantizar el orden de creación.
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
# AKS — Azure Kubernetes Service: Workload Identity, HPA y Configuración Segura
|
|
2
|
+
|
|
3
|
+
Referencia de patrones para clusters AKS con Workload Identity, escalado automático y seguridad.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. Crear cluster AKS con configuración segura
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# Cluster con Workload Identity habilitado (OBLIGATORIO para acceder a servicios Azure)
|
|
11
|
+
az aks create \
|
|
12
|
+
--resource-group mi-rg \
|
|
13
|
+
--name mi-cluster-aks \
|
|
14
|
+
--location eastus \
|
|
15
|
+
--node-count 3 \
|
|
16
|
+
--min-count 2 \
|
|
17
|
+
--max-count 10 \
|
|
18
|
+
--enable-cluster-autoscaler \
|
|
19
|
+
--node-vm-size Standard_D4s_v3 \
|
|
20
|
+
--enable-oidc-issuer \
|
|
21
|
+
--enable-workload-identity \
|
|
22
|
+
--network-plugin azure \
|
|
23
|
+
--network-policy calico \
|
|
24
|
+
--enable-addons monitoring \
|
|
25
|
+
--workspace-resource-id $LOG_ANALYTICS_ID \
|
|
26
|
+
--generate-ssh-keys
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Opciones clave:**
|
|
30
|
+
- `--enable-oidc-issuer` y `--enable-workload-identity`: habilitan Workload Identity
|
|
31
|
+
para que los pods accedan a Azure sin montar archivos de credenciales
|
|
32
|
+
- `--network-policy calico`: habilita NetworkPolicy de Kubernetes para aislar pods
|
|
33
|
+
- `--enable-addons monitoring`: integración automática con Azure Monitor y Log Analytics
|
|
34
|
+
- `--enable-cluster-autoscaler`: escala los nodos según la demanda real
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 2. Node Pools — separación de cargas de trabajo
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Node pool para producción (siempre disponible)
|
|
42
|
+
az aks nodepool add \
|
|
43
|
+
--resource-group mi-rg \
|
|
44
|
+
--cluster-name mi-cluster-aks \
|
|
45
|
+
--name produccion \
|
|
46
|
+
--node-count 2 \
|
|
47
|
+
--min-count 2 \
|
|
48
|
+
--max-count 20 \
|
|
49
|
+
--enable-cluster-autoscaler \
|
|
50
|
+
--node-vm-size Standard_D4s_v3 \
|
|
51
|
+
--node-taints env=produccion:NoSchedule \
|
|
52
|
+
--labels env=produccion
|
|
53
|
+
|
|
54
|
+
# Node pool para jobs/workers (puede escalar a cero)
|
|
55
|
+
az aks nodepool add \
|
|
56
|
+
--resource-group mi-rg \
|
|
57
|
+
--cluster-name mi-cluster-aks \
|
|
58
|
+
--name workers \
|
|
59
|
+
--node-count 0 \
|
|
60
|
+
--min-count 0 \
|
|
61
|
+
--max-count 10 \
|
|
62
|
+
--enable-cluster-autoscaler \
|
|
63
|
+
--node-vm-size Standard_D8s_v3 \
|
|
64
|
+
--node-taints workload=batch:NoSchedule \
|
|
65
|
+
--labels workload=batch
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 3. Workload Identity — acceso seguro a Azure desde pods
|
|
71
|
+
|
|
72
|
+
Workload Identity vincula una Kubernetes Service Account (KSA) con una
|
|
73
|
+
Azure Managed Identity. Los pods usan la KSA y Azure autentica usando
|
|
74
|
+
la identidad vinculada. Sin archivos de credenciales, sin rotación manual.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# 1. Crear User-Assigned Managed Identity
|
|
78
|
+
az identity create \
|
|
79
|
+
--name mi-api-identity \
|
|
80
|
+
--resource-group mi-rg
|
|
81
|
+
|
|
82
|
+
# Capturar IDs necesarios
|
|
83
|
+
IDENTITY_CLIENT_ID=$(az identity show \
|
|
84
|
+
--name mi-api-identity \
|
|
85
|
+
--resource-group mi-rg \
|
|
86
|
+
--query clientId -o tsv)
|
|
87
|
+
|
|
88
|
+
IDENTITY_OBJECT_ID=$(az identity show \
|
|
89
|
+
--name mi-api-identity \
|
|
90
|
+
--resource-group mi-rg \
|
|
91
|
+
--query principalId -o tsv)
|
|
92
|
+
|
|
93
|
+
# 2. Obtener el OIDC Issuer URL del cluster
|
|
94
|
+
OIDC_ISSUER=$(az aks show \
|
|
95
|
+
--resource-group mi-rg \
|
|
96
|
+
--name mi-cluster-aks \
|
|
97
|
+
--query "oidcIssuerProfile.issuerUrl" -o tsv)
|
|
98
|
+
|
|
99
|
+
# 3. Crear la federación entre la KSA y la Managed Identity
|
|
100
|
+
az identity federated-credential create \
|
|
101
|
+
--name mi-api-federated-credential \
|
|
102
|
+
--identity-name mi-api-identity \
|
|
103
|
+
--resource-group mi-rg \
|
|
104
|
+
--issuer $OIDC_ISSUER \
|
|
105
|
+
--subject "system:serviceaccount:mi-namespace:mi-api-ksa" \
|
|
106
|
+
--audience api://AzureADTokenExchange
|
|
107
|
+
|
|
108
|
+
# 4. Otorgar permisos a la Managed Identity
|
|
109
|
+
az keyvault set-policy \
|
|
110
|
+
--name mi-vault \
|
|
111
|
+
--object-id $IDENTITY_OBJECT_ID \
|
|
112
|
+
--secret-permissions get list
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
# Kubernetes Service Account con anotación de Workload Identity
|
|
117
|
+
apiVersion: v1
|
|
118
|
+
kind: ServiceAccount
|
|
119
|
+
metadata:
|
|
120
|
+
name: mi-api-ksa
|
|
121
|
+
namespace: mi-namespace
|
|
122
|
+
annotations:
|
|
123
|
+
azure.workload.identity/client-id: "CLIENT_ID_DE_LA_MANAGED_IDENTITY"
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
```yaml
|
|
127
|
+
# Deployment con Workload Identity
|
|
128
|
+
apiVersion: apps/v1
|
|
129
|
+
kind: Deployment
|
|
130
|
+
metadata:
|
|
131
|
+
name: mi-api
|
|
132
|
+
namespace: mi-namespace
|
|
133
|
+
spec:
|
|
134
|
+
selector:
|
|
135
|
+
matchLabels:
|
|
136
|
+
app: mi-api
|
|
137
|
+
azure.workload.identity/use: "true" # Label obligatorio
|
|
138
|
+
template:
|
|
139
|
+
metadata:
|
|
140
|
+
labels:
|
|
141
|
+
app: mi-api
|
|
142
|
+
azure.workload.identity/use: "true" # Label obligatorio en el pod
|
|
143
|
+
spec:
|
|
144
|
+
serviceAccountName: mi-api-ksa # SA con anotación de Workload Identity
|
|
145
|
+
containers:
|
|
146
|
+
- name: api
|
|
147
|
+
image: miregistry.azurecr.io/mi-api:latest
|
|
148
|
+
resources:
|
|
149
|
+
requests:
|
|
150
|
+
cpu: "250m"
|
|
151
|
+
memory: "256Mi"
|
|
152
|
+
limits:
|
|
153
|
+
cpu: "1"
|
|
154
|
+
memory: "512Mi"
|
|
155
|
+
env:
|
|
156
|
+
- name: AZURE_TENANT_ID
|
|
157
|
+
valueFrom:
|
|
158
|
+
fieldRef:
|
|
159
|
+
fieldPath: metadata.annotations['azure.workload.identity/tenant-id']
|
|
160
|
+
- name: KEY_VAULT_URL
|
|
161
|
+
value: "https://mi-vault.vault.azure.net/"
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 4. Horizontal Pod Autoscaler (HPA)
|
|
167
|
+
|
|
168
|
+
```yaml
|
|
169
|
+
# HPA basado en CPU y memoria
|
|
170
|
+
apiVersion: autoscaling/v2
|
|
171
|
+
kind: HorizontalPodAutoscaler
|
|
172
|
+
metadata:
|
|
173
|
+
name: mi-api-hpa
|
|
174
|
+
namespace: mi-namespace
|
|
175
|
+
spec:
|
|
176
|
+
scaleTargetRef:
|
|
177
|
+
apiVersion: apps/v1
|
|
178
|
+
kind: Deployment
|
|
179
|
+
name: mi-api
|
|
180
|
+
minReplicas: 2
|
|
181
|
+
maxReplicas: 20
|
|
182
|
+
metrics:
|
|
183
|
+
- type: Resource
|
|
184
|
+
resource:
|
|
185
|
+
name: cpu
|
|
186
|
+
target:
|
|
187
|
+
type: Utilization
|
|
188
|
+
averageUtilization: 70
|
|
189
|
+
- type: Resource
|
|
190
|
+
resource:
|
|
191
|
+
name: memory
|
|
192
|
+
target:
|
|
193
|
+
type: Utilization
|
|
194
|
+
averageUtilization: 80
|
|
195
|
+
behavior:
|
|
196
|
+
scaleDown:
|
|
197
|
+
stabilizationWindowSeconds: 300 # Evita flapping
|
|
198
|
+
policies:
|
|
199
|
+
- type: Percent
|
|
200
|
+
value: 25
|
|
201
|
+
periodSeconds: 60
|
|
202
|
+
scaleUp:
|
|
203
|
+
stabilizationWindowSeconds: 0 # Escala hacia arriba inmediatamente
|
|
204
|
+
policies:
|
|
205
|
+
- type: Percent
|
|
206
|
+
value: 100
|
|
207
|
+
periodSeconds: 15
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 5. NetworkPolicy — aislar namespaces en AKS
|
|
213
|
+
|
|
214
|
+
```yaml
|
|
215
|
+
# Denegar todo tráfico por defecto y permitir solo lo necesario
|
|
216
|
+
apiVersion: networking.k8s.io/v1
|
|
217
|
+
kind: NetworkPolicy
|
|
218
|
+
metadata:
|
|
219
|
+
name: denegar-todo-por-defecto
|
|
220
|
+
namespace: mi-namespace
|
|
221
|
+
spec:
|
|
222
|
+
podSelector: {}
|
|
223
|
+
policyTypes:
|
|
224
|
+
- Ingress
|
|
225
|
+
- Egress
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
# Permitir tráfico desde el ingress controller al API
|
|
229
|
+
apiVersion: networking.k8s.io/v1
|
|
230
|
+
kind: NetworkPolicy
|
|
231
|
+
metadata:
|
|
232
|
+
name: permitir-ingress
|
|
233
|
+
namespace: mi-namespace
|
|
234
|
+
spec:
|
|
235
|
+
podSelector:
|
|
236
|
+
matchLabels:
|
|
237
|
+
app: mi-api
|
|
238
|
+
policyTypes:
|
|
239
|
+
- Ingress
|
|
240
|
+
ingress:
|
|
241
|
+
- from:
|
|
242
|
+
- namespaceSelector:
|
|
243
|
+
matchLabels:
|
|
244
|
+
kubernetes.io/metadata.name: ingress-nginx
|
|
245
|
+
ports:
|
|
246
|
+
- protocol: TCP
|
|
247
|
+
port: 8000
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
# Permitir DNS (obligatorio para que los pods resuelvan nombres)
|
|
251
|
+
apiVersion: networking.k8s.io/v1
|
|
252
|
+
kind: NetworkPolicy
|
|
253
|
+
metadata:
|
|
254
|
+
name: permitir-dns
|
|
255
|
+
namespace: mi-namespace
|
|
256
|
+
spec:
|
|
257
|
+
podSelector: {}
|
|
258
|
+
policyTypes:
|
|
259
|
+
- Egress
|
|
260
|
+
egress:
|
|
261
|
+
- ports:
|
|
262
|
+
- protocol: UDP
|
|
263
|
+
port: 53
|
|
264
|
+
- protocol: TCP
|
|
265
|
+
port: 53
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 6. Integración con Azure Container Registry (ACR)
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
# Vincular ACR al cluster AKS para pull automático sin credenciales
|
|
274
|
+
az aks update \
|
|
275
|
+
--resource-group mi-rg \
|
|
276
|
+
--name mi-cluster-aks \
|
|
277
|
+
--attach-acr mi-registry
|
|
278
|
+
|
|
279
|
+
# Verificar que el cluster puede hacer pull de imágenes
|
|
280
|
+
az aks check-acr \
|
|
281
|
+
--resource-group mi-rg \
|
|
282
|
+
--name mi-cluster-aks \
|
|
283
|
+
--acr mi-registry.azurecr.io
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 7. Checklist de seguridad AKS
|
|
289
|
+
|
|
290
|
+
- [ ] Workload Identity habilitado (`--enable-oidc-issuer --enable-workload-identity`)
|
|
291
|
+
- [ ] Network Policy habilitada (`--network-policy calico` o `azure`)
|
|
292
|
+
- [ ] Node pools separados para producción y workers/batch
|
|
293
|
+
- [ ] Todos los Deployments tienen `resources.requests` y `resources.limits`
|
|
294
|
+
- [ ] HPA configurado con `minReplicas >= 2` para servicios críticos
|
|
295
|
+
- [ ] ACR vinculado al cluster (no usar credenciales de registro en imagePullSecrets)
|
|
296
|
+
- [ ] Diagnostic settings configurados con Log Analytics (`--enable-addons monitoring`)
|
|
297
|
+
- [ ] Imágenes de contenedor con versión explícita (nunca `:latest` en producción)
|
|
298
|
+
- [ ] Private cluster habilitado para producción (`--enable-private-cluster`)
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## 8. Comandos frecuentes
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
# Obtener credenciales del cluster
|
|
306
|
+
az aks get-credentials \
|
|
307
|
+
--resource-group mi-rg \
|
|
308
|
+
--name mi-cluster-aks
|
|
309
|
+
|
|
310
|
+
# Ver estado del cluster
|
|
311
|
+
kubectl get nodes -o wide
|
|
312
|
+
kubectl top nodes
|
|
313
|
+
|
|
314
|
+
# Ver pods con service account y namespace
|
|
315
|
+
kubectl get pods -n mi-namespace -o wide
|
|
316
|
+
|
|
317
|
+
# Verificar que Workload Identity está funcionando
|
|
318
|
+
kubectl exec -it deployment/mi-api -n mi-namespace -- \
|
|
319
|
+
printenv | grep AZURE
|
|
320
|
+
|
|
321
|
+
# Ver logs en tiempo real con Azure Monitor
|
|
322
|
+
az aks show --resource-group mi-rg --name mi-cluster-aks \
|
|
323
|
+
--query "addonProfiles.omsagent.config.logAnalyticsWorkspaceResourceID"
|
|
324
|
+
|
|
325
|
+
# Escalar manualmente un deployment (para emergencias)
|
|
326
|
+
kubectl scale deployment mi-api --replicas=5 -n mi-namespace
|
|
327
|
+
```
|