@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,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../../schemas/skill-evals.schema.json",
|
|
3
|
+
"skill_name": "dbml-experto",
|
|
4
|
+
"artifact_type": "skill",
|
|
5
|
+
"schema_version": 1,
|
|
6
|
+
"description": "Evals para dbml-experto — parseo de DBML, migración de tipos, y fallback sin @dbml/core.",
|
|
7
|
+
"evals": [
|
|
8
|
+
{
|
|
9
|
+
"id": 0,
|
|
10
|
+
"prompt": "Comando minimal para instalar @dbml/core en el proyecto del usuario (no en swl-ses).",
|
|
11
|
+
"files": [],
|
|
12
|
+
"expectations": [
|
|
13
|
+
"La respuesta incluye `npm install --save-dev @dbml/core` (o equivalente --save-dev).",
|
|
14
|
+
"La respuesta NO sugiere instalarlo global (`-g`).",
|
|
15
|
+
"La respuesta aclara que se instala en el proyecto del usuario."
|
|
16
|
+
],
|
|
17
|
+
"tags": ["primary-flow"],
|
|
18
|
+
"weight": 1.0
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": 1,
|
|
22
|
+
"prompt": "Traduce el tipo DBML `timestamp` a PostgreSQL y MySQL mínimo.",
|
|
23
|
+
"files": [],
|
|
24
|
+
"expectations": [
|
|
25
|
+
"PostgreSQL: `timestamp` o `timestamptz` (con timezone).",
|
|
26
|
+
"MySQL: `datetime` (no `timestamp` porque difiere en semántica TZ).",
|
|
27
|
+
"Menciona que `timestamp with tz` requiere `timestamptz` en PG."
|
|
28
|
+
],
|
|
29
|
+
"tags": ["migration"]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "anti-pattern-dots-in-id",
|
|
33
|
+
"prompt": "¿`payment.api` es un identificador DBML válido?",
|
|
34
|
+
"files": [],
|
|
35
|
+
"expectations": [
|
|
36
|
+
"La respuesta indica que NO es un identificador válido.",
|
|
37
|
+
"La respuesta explica que los puntos son separadores de FQN, no caracteres de identificador.",
|
|
38
|
+
"La respuesta sugiere `payment-api` o `paymentApi` como alternativa."
|
|
39
|
+
],
|
|
40
|
+
"grading_guidance": "Failure si la respuesta dice que es válido o si omite la razón (punto como separador).",
|
|
41
|
+
"tags": ["anti-pattern"],
|
|
42
|
+
"weight": 1.5
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "fallback-sin-core",
|
|
46
|
+
"prompt": "El usuario no puede instalar @dbml/core. ¿Puede el skill seguir analizando schemas DBML?",
|
|
47
|
+
"files": [],
|
|
48
|
+
"expectations": [
|
|
49
|
+
"La respuesta afirma que sí, con heurísticas regex.",
|
|
50
|
+
"La respuesta menciona las limitaciones del fallback (no resuelve enums, puede fallar con comentarios).",
|
|
51
|
+
"La respuesta recomienda reportar esta limitación al usuario al ejecutar análisis estructurales."
|
|
52
|
+
],
|
|
53
|
+
"tags": ["fallback"]
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dependencias-auditoria
|
|
3
|
+
description: Auditoría completa de dependencias del proyecto. Detecta CVEs conocidos, licencias incompatibles con el uso comercial, dependencias abandonadas sin alternativa, y genera una estrategia de actualización priorizada. Aplica a proyectos Python, Node.js/TypeScript, y contenedores Docker.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
herramientasPermitidas: [Read, Bash]
|
|
6
|
+
evolvable: true # default para skill estandar
|
|
7
|
+
nist_csf: [ID.RA-01, GV.SC-07, PR.PS-01, DE.CM-09]
|
|
8
|
+
nist_ai_rmf: [MAP-1.6]
|
|
9
|
+
attack_techniques: [T1195.002]
|
|
10
|
+
exclusiones:
|
|
11
|
+
- "No cargar para revisión de seguridad del código fuente (OWASP, inyección, auth) — para seguridad de código cargar `checklist-seguridad`."
|
|
12
|
+
- "No cargar para actualizar versiones de dependencias con breaking changes — para migraciones de versión cargar `deprecacion-migracion`."
|
|
13
|
+
- "No cargar para análisis de rendimiento de bundles JavaScript (tree-shaking, code splitting) — para rendimiento cargar `react-optimizacion` o equivalente."
|
|
14
|
+
- "No cargar para gestión de secretos o rotación de credenciales de servicios externos — para secretos cargar `iam-secretos`."
|
|
15
|
+
---
|
|
16
|
+
# Habilidad: Auditoría de Dependencias
|
|
17
|
+
|
|
18
|
+
## Cuándo NO cargar
|
|
19
|
+
|
|
20
|
+
- La revisión es de seguridad del código fuente (inyección SQL, XSS, OWASP): cargar `checklist-seguridad`.
|
|
21
|
+
- La tarea es actualizar dependencias con breaking changes y guiar la migración: cargar `deprecacion-migracion`.
|
|
22
|
+
- El análisis es de rendimiento de bundles JS (tree-shaking, bundle size): cargar `react-optimizacion` o el skill de frontend correspondiente.
|
|
23
|
+
- La gestión es de secretos, credenciales o rotación de API keys: cargar `iam-secretos`.
|
|
24
|
+
|
|
25
|
+
## Propósito
|
|
26
|
+
|
|
27
|
+
Las dependencias son el vector de ataque más subestimado. El 80% de los ataques
|
|
28
|
+
de cadena de suministro (supply chain attacks) explotan dependencias con CVEs
|
|
29
|
+
conocidos y disponibles públicamente. Esta habilidad detecta el riesgo antes
|
|
30
|
+
de que se convierta en incidente.
|
|
31
|
+
|
|
32
|
+
## Cuándo activar
|
|
33
|
+
|
|
34
|
+
- Antes de cada deploy a producción
|
|
35
|
+
- Al comenzar a trabajar en un proyecto heredado
|
|
36
|
+
- Cuando se reporta una vulnerabilidad que podría afectar el stack
|
|
37
|
+
- Trimestralmente como revisión de mantenimiento
|
|
38
|
+
- Antes de una auditoría de seguridad o certificación
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Categorías de riesgo en dependencias
|
|
43
|
+
|
|
44
|
+
### Categoría 1 — CVEs conocidos (CRÍTICO)
|
|
45
|
+
|
|
46
|
+
Un CVE (Common Vulnerabilities and Exposures) en una dependencia directa o
|
|
47
|
+
transitiva es un riesgo activo. La severidad se mide con CVSS:
|
|
48
|
+
|
|
49
|
+
| CVSS Score | Severidad | Acción requerida |
|
|
50
|
+
|-----------|----------|-----------------|
|
|
51
|
+
| 9.0 - 10.0 | Crítica | Fix inmediato — bloquea deploy |
|
|
52
|
+
| 7.0 - 8.9 | Alta | Fix en 48 horas |
|
|
53
|
+
| 4.0 - 6.9 | Media | Fix en próximo sprint |
|
|
54
|
+
| 0.1 - 3.9 | Baja | Registrar, resolver en backlog |
|
|
55
|
+
|
|
56
|
+
### Categoría 2 — Licencias incompatibles (ALTO)
|
|
57
|
+
|
|
58
|
+
Dependencias con licencias restrictivas en proyectos comerciales:
|
|
59
|
+
|
|
60
|
+
| Licencia | Riesgo en proyecto comercial |
|
|
61
|
+
|----------|----------------------------|
|
|
62
|
+
| GPL v2/v3 | ALTO — puede requerir open-source del código propio |
|
|
63
|
+
| AGPL | CRÍTICO — cualquier uso de red activa la cláusula |
|
|
64
|
+
| LGPL | MEDIO — revisar caso a caso |
|
|
65
|
+
| SSPL | ALTO — restricciones en servicios cloud |
|
|
66
|
+
| MIT, Apache 2.0, BSD | Bajo riesgo — permisivas |
|
|
67
|
+
| ISC, 0BSD | Sin riesgo — extremadamente permisivas |
|
|
68
|
+
|
|
69
|
+
### Categoría 3 — Dependencias abandonadas (MEDIO)
|
|
70
|
+
|
|
71
|
+
Una dependencia abandonada es aquella que:
|
|
72
|
+
- Sin commits en el repositorio por más de 18 meses
|
|
73
|
+
- Sin versión nueva en más de 12 meses para proyectos activos
|
|
74
|
+
- Issues críticos sin respuesta por más de 6 meses
|
|
75
|
+
- El mantenedor ha declarado públicamente el abandono
|
|
76
|
+
|
|
77
|
+
### Categoría 4 — Dependencias desactualizadas (BAJO-MEDIO)
|
|
78
|
+
|
|
79
|
+
Versiones con 2+ versiones major de atraso acumulan:
|
|
80
|
+
- CVEs parcheados en versiones nuevas
|
|
81
|
+
- Incompatibilidades futuras con el ecosistema
|
|
82
|
+
- Pérdida de soporte técnico de la comunidad
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Herramientas y comandos por stack
|
|
87
|
+
|
|
88
|
+
### Python
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# pip-audit: CVEs en dependencias Python (recomendado)
|
|
92
|
+
pip install pip-audit
|
|
93
|
+
pip-audit --output=json > audit-python.json
|
|
94
|
+
pip-audit # Output legible para humanos
|
|
95
|
+
|
|
96
|
+
# safety: Base de datos de vulnerabilidades de PyUp.io
|
|
97
|
+
pip install safety
|
|
98
|
+
safety check --json > safety-report.json
|
|
99
|
+
|
|
100
|
+
# Licencias de todas las dependencias
|
|
101
|
+
pip install pip-licenses
|
|
102
|
+
pip-licenses --format=json --with-urls > licenses.json
|
|
103
|
+
pip-licenses --format=markdown # Output legible
|
|
104
|
+
|
|
105
|
+
# Dependencias desactualizadas
|
|
106
|
+
pip list --outdated --format=json
|
|
107
|
+
|
|
108
|
+
# Ver árbol completo de dependencias transitivas
|
|
109
|
+
pip install pipdeptree
|
|
110
|
+
pipdeptree --warn silence --json-tree > deptree.json
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Node.js / TypeScript
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# npm audit: CVEs en dependencias Node.js
|
|
117
|
+
npm audit --json > npm-audit.json
|
|
118
|
+
npm audit # Output legible
|
|
119
|
+
|
|
120
|
+
# Para yarn
|
|
121
|
+
yarn audit --json > yarn-audit.json
|
|
122
|
+
|
|
123
|
+
# Licencias
|
|
124
|
+
npx license-checker --json > npm-licenses.json
|
|
125
|
+
npx license-checker --excludePrivatePackages --onlyAllow \
|
|
126
|
+
"MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;0BSD"
|
|
127
|
+
|
|
128
|
+
# Dependencias desactualizadas
|
|
129
|
+
npm outdated --json
|
|
130
|
+
|
|
131
|
+
# Verificar dependencias no usadas
|
|
132
|
+
npx depcheck
|
|
133
|
+
|
|
134
|
+
# Tamaño del bundle por dependencia
|
|
135
|
+
npx cost-of-modules
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Docker / Contenedores
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Trivy: CVEs en imagen Docker (recomendado)
|
|
142
|
+
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
|
|
143
|
+
aquasec/trivy image --format json [nombre-imagen]:latest > trivy-report.json
|
|
144
|
+
|
|
145
|
+
# Grype: alternativa a Trivy
|
|
146
|
+
grype [nombre-imagen]:latest
|
|
147
|
+
|
|
148
|
+
# Ver imagen base y su historial
|
|
149
|
+
docker inspect [nombre-imagen] | jq '.[0].Config.Image'
|
|
150
|
+
|
|
151
|
+
# Verificar si la imagen base es reciente
|
|
152
|
+
# Comparar con el digest publicado en Docker Hub
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Proceso de auditoría paso a paso
|
|
158
|
+
|
|
159
|
+
### Paso 1 — Inventario inicial
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# Python: listar todas las dependencias con versión exacta
|
|
163
|
+
pip freeze > requirements-audit.txt
|
|
164
|
+
# Comparar con requirements.txt original para detectar dependencias no declaradas
|
|
165
|
+
|
|
166
|
+
# Node: listar todo el árbol
|
|
167
|
+
npm ls --all 2>/dev/null | head -100
|
|
168
|
+
|
|
169
|
+
# Verificar si hay dependencias directas no declaradas en package.json
|
|
170
|
+
npx depcheck
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Paso 2 — Escaneo de CVEs
|
|
174
|
+
|
|
175
|
+
Ejecutar todos los scanners disponibles para el stack. Los resultados se guardan
|
|
176
|
+
en formato JSON para procesamiento posterior.
|
|
177
|
+
|
|
178
|
+
### Paso 3 — Análisis de licencias
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
# Python: identificar licencias no permitidas
|
|
182
|
+
pip-licenses --fail-on="GPL;AGPL;LGPL;SSPL" 2>&1
|
|
183
|
+
# Exit code != 0 si encuentra licencias problemáticas
|
|
184
|
+
|
|
185
|
+
# Node: verificar lista blanca de licencias
|
|
186
|
+
npx license-checker --onlyAllow "MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC"
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Paso 4 — Identificar dependencias abandonadas
|
|
190
|
+
|
|
191
|
+
Para cada dependencia directa, verificar en su repositorio:
|
|
192
|
+
- Fecha del último commit
|
|
193
|
+
- Fecha del último release
|
|
194
|
+
- Issues abiertos sin respuesta
|
|
195
|
+
- Estado del repositorio (archived, deprecated)
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# Script para verificar última versión en PyPI
|
|
199
|
+
python -c "
|
|
200
|
+
import json, urllib.request
|
|
201
|
+
packages = open('requirements.txt').read().split()
|
|
202
|
+
for pkg in packages[:20]:
|
|
203
|
+
name = pkg.split('==')[0].split('>=')[0]
|
|
204
|
+
try:
|
|
205
|
+
url = f'https://pypi.org/pypi/{name}/json'
|
|
206
|
+
data = json.loads(urllib.request.urlopen(url).read())
|
|
207
|
+
last = max(data['releases'].keys())
|
|
208
|
+
print(f'{name}: última versión {last}')
|
|
209
|
+
except: pass
|
|
210
|
+
"
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Plantilla de reporte: `DEPENDENCIES-AUDIT.md`
|
|
216
|
+
|
|
217
|
+
```markdown
|
|
218
|
+
# DEPENDENCIES-AUDIT.md
|
|
219
|
+
**Fecha**: [fecha] **Stack**: [Python/Node/Docker/todos]
|
|
220
|
+
|
|
221
|
+
## Resumen ejecutivo
|
|
222
|
+
| Categoría | Críticos | Altos | Medios | Bajos |
|
|
223
|
+
|-----------|---------|-------|--------|-------|
|
|
224
|
+
| CVEs | | | | |
|
|
225
|
+
| Licencias | | | | |
|
|
226
|
+
| Abandonadas | | | | |
|
|
227
|
+
| Desactualizadas | | | | |
|
|
228
|
+
|
|
229
|
+
**Decisión de deploy**: BLOQUEADO / APROBADO CON PLAN / APROBADO
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## CVEs encontrados
|
|
234
|
+
|
|
235
|
+
### [CRÍTICO] [Nombre de la dependencia] v[X.Y.Z]
|
|
236
|
+
- **CVE**: CVE-XXXX-XXXXX
|
|
237
|
+
- **CVSS**: [score]
|
|
238
|
+
- **Descripción**: [qué hace vulnerable]
|
|
239
|
+
- **Versión parcheada**: [versión que resuelve el CVE]
|
|
240
|
+
- **Comando de actualización**: `pip install [paquete]==[version]`
|
|
241
|
+
- **Dependencia directa**: Sí / No (transitiva vía [paquete])
|
|
242
|
+
- **Plan de acción**: [actualizar / reemplazar / parchear temporalmente]
|
|
243
|
+
- **Deadline**: [fecha]
|
|
244
|
+
|
|
245
|
+
[Repetir para cada CVE]
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Licencias problemáticas
|
|
250
|
+
|
|
251
|
+
| Paquete | Versión | Licencia | Riesgo | Alternativa |
|
|
252
|
+
|---------|---------|---------|--------|------------|
|
|
253
|
+
| | | | | |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Dependencias abandonadas
|
|
258
|
+
|
|
259
|
+
| Paquete | Último commit | Último release | Alternativa recomendada |
|
|
260
|
+
|---------|-------------|---------------|------------------------|
|
|
261
|
+
| | | | |
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Dependencias desactualizadas (alta prioridad)
|
|
266
|
+
|
|
267
|
+
| Paquete | Versión actual | Última versión | Versiones de atraso | Prioridad |
|
|
268
|
+
|---------|---------------|----------------|--------------------| ----------|
|
|
269
|
+
| | | | | |
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Estrategia de actualización
|
|
274
|
+
|
|
275
|
+
### Sprint actual (bloqueos de deploy)
|
|
276
|
+
- [ ] [dependencia]: actualizar a [versión] — CVE crítico
|
|
277
|
+
|
|
278
|
+
### Próximo sprint
|
|
279
|
+
- [ ] [dependencia]: actualizar a [versión] — CVE alto
|
|
280
|
+
|
|
281
|
+
### Backlog de mantenimiento
|
|
282
|
+
- [ ] [dependencia]: evaluar reemplazo por [alternativa]
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Dependencias monitoreadas (sin acción inmediata)
|
|
287
|
+
| Paquete | Razón de monitoreo | Próxima revisión |
|
|
288
|
+
|---------|-------------------|-----------------|
|
|
289
|
+
| | | |
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Automatización recomendada
|
|
295
|
+
|
|
296
|
+
Integrar en el pipeline CI/CD:
|
|
297
|
+
|
|
298
|
+
```yaml
|
|
299
|
+
# GitHub Actions — auditoría automática en cada PR
|
|
300
|
+
- name: Auditoría de dependencias Python
|
|
301
|
+
run: |
|
|
302
|
+
pip-audit --fail-on-severity high
|
|
303
|
+
# Falla el pipeline si hay CVEs altos o críticos sin resolver
|
|
304
|
+
|
|
305
|
+
- name: Auditoría de dependencias Node
|
|
306
|
+
run: npm audit --audit-level=high
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Configurar renovación automática con Dependabot o Renovate Bot para dependencias
|
|
310
|
+
con actualizaciones de parche (patch) que no rompen la API.
|
|
311
|
+
|
|
312
|
+
## Gotchas / Errores comunes no obvios
|
|
313
|
+
|
|
314
|
+
**`pip-audit` reporta cero CVEs pero hay una dependencia transitiva vulnerable que `pip freeze` no muestra explícitamente**: `pip-audit` analiza el entorno instalado, pero si la dependencia vulnerable es transitiva de una dependencia directa desactualizada, puede no aparecer en `requirements.txt`. Causa: los entornos Python sin `pip freeze` completo tienen dependencias transitivas "flotantes" que se resuelven al instalar sin estar declaradas. Fix: ejecutar `pip freeze > requirements-full.txt` y auditar ese archivo completo, no solo `requirements.txt`. Alternativamente usar `pip-audit --requirement requirements-full.txt` o `pipdeptree` para ver el árbol completo.
|
|
315
|
+
|
|
316
|
+
**`npm audit` muestra 0 vulnerabilidades pero Trivy detecta CVEs en la imagen Docker**: `npm audit` analiza `node_modules/` en el sistema de archivos, mientras Trivy analiza las capas de la imagen donde las dependencias pueden diferir si el Dockerfile usa `npm ci --production` o tiene multi-stage builds. Causa: el entorno de desarrollo y el contenedor de producción pueden tener diferentes versiones si el lockfile no está commiteado o si se usa `--production`. Fix: ejecutar `trivy image` sobre la imagen de producción construida, no solo `npm audit` en el source. Son complementarios, no equivalentes.
|
|
317
|
+
|
|
318
|
+
**Una dependencia con licencia MIT tiene una subdependencia con licencia AGPL no detectada por `license-checker`**: `license-checker` analiza el campo `license` en `package.json`, pero una dependencia puede tener subdependencias con licencias diferentes que solo se ven en su árbol de dependencias transitivas. Causa: `license-checker --production` solo reporta las licencias declaradas en el nivel superior de cada paquete. Fix: para proyectos con requerimientos legales estrictos, usar `license-checker --failOn AGPL` para detectar AGPL en el árbol completo, y revisar manualmente las dependencias con licencias mixtas o duales.
|
|
319
|
+
|
|
320
|
+
**`pip-audit` en CI falla con "connection refused" porque el sistema no tiene acceso a la red de PyPI Vulnerability DB**: `pip-audit` por defecto consulta `https://osv.dev` para obtener las vulnerabilidades. En entornos CI con acceso a red restringido (firewalls corporativos, redes internas), la consulta falla silenciosamente o lanza error de red en lugar de decir "cero CVEs". Causa: la ausencia de resultados se confunde con "sin vulnerabilidades" cuando en realidad el scanner no pudo conectarse. Fix: configurar `pip-audit --local` para usar la base de datos local de OSV descargada previamente, o verificar que el exit code del comando es `0` (no errores) en lugar de solo ver el output de texto.
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deprecacion-migracion
|
|
3
|
+
description: >
|
|
4
|
+
Estrategias de deprecación y migración: avisos de deprecación, guías de migración,
|
|
5
|
+
compatibilidad hacia atrás, feature flags para migraciones, patrones de migración de
|
|
6
|
+
datos, migraciones sin tiempo de inactividad, patrón strangler fig.
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
herramientasPermitidas: [Read, Grep]
|
|
9
|
+
evolvable: true # default para skill estandar
|
|
10
|
+
exclusiones:
|
|
11
|
+
- "No cargar para migraciones de esquema de base de datos generadas automáticamente (Alembic autogenerate, Flyway) — para ORM migrations cargar `postgresql-experto`."
|
|
12
|
+
- "No cargar para auditoría de dependencias desactualizadas (CVEs, licencias) — para dependencias cargar `dependencias-auditoria`."
|
|
13
|
+
- "No cargar para refactoring de código sin cambio de interfaz pública — para refactoring sin deprecación usar directamente el skill del lenguaje."
|
|
14
|
+
- "No cargar para versionado semántico de releases — para SemVer y ciclo de release usar `/swl:release`."
|
|
15
|
+
---
|
|
16
|
+
# Deprecación y Migración — Estrategias de Producción
|
|
17
|
+
|
|
18
|
+
## Cuándo NO cargar
|
|
19
|
+
|
|
20
|
+
- La migración es de esquema de BD generada automáticamente (Alembic autogenerate, Flyway scripts): cargar `postgresql-experto`.
|
|
21
|
+
- La auditoría es de dependencias desactualizadas con CVEs: cargar `dependencias-auditoria`.
|
|
22
|
+
- El refactoring no cambia la interfaz pública de ningún módulo: usar directamente el skill del lenguaje sin periodo de deprecación.
|
|
23
|
+
- La tarea es gestionar el número de versión del release (SemVer, CHANGELOG): usar `/swl:release`.
|
|
24
|
+
|
|
25
|
+
## Principios Fundamentales
|
|
26
|
+
|
|
27
|
+
La deprecación no es eliminar — es guiar la transición.
|
|
28
|
+
Una buena deprecación tiene: **aviso anticipado**, **guía de migración**, **período de gracia**, **eliminación limpia**.
|
|
29
|
+
|
|
30
|
+
**Reglas de oro:**
|
|
31
|
+
1. Nunca eliminar sin deprecar primero (mínimo 1 versión de aviso).
|
|
32
|
+
2. Una API deprecada sigue funcionando durante el período de gracia.
|
|
33
|
+
3. Los mensajes de deprecación incluyen qué usar en su lugar y cuándo se eliminará.
|
|
34
|
+
4. Las migraciones de datos son reversibles hasta confirmar éxito.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Ciclo de Vida de una Deprecación
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
VIGENTE → DEPRECADO → ELIMINADO
|
|
42
|
+
|
|
43
|
+
Períodos mínimos de gracia:
|
|
44
|
+
- Librerías: 1 versión mayor
|
|
45
|
+
- APIs internas: 2 sprints
|
|
46
|
+
- APIs públicas: 6 meses mínimo
|
|
47
|
+
- Bases de datos: 3 meses mínimo
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Avisos de Deprecación en Python
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
import warnings
|
|
56
|
+
import functools
|
|
57
|
+
|
|
58
|
+
def deprecado(*, desde: str, eliminar_en: str, usar_en_su_lugar: str, razon: str = ""):
|
|
59
|
+
def decorador(func):
|
|
60
|
+
mensaje = (
|
|
61
|
+
f"`{func.__qualname__}` está deprecado desde v{desde} y será "
|
|
62
|
+
f"eliminado en v{eliminar_en}. Usar: {usar_en_su_lugar}."
|
|
63
|
+
)
|
|
64
|
+
@functools.wraps(func)
|
|
65
|
+
def wrapper(*args, **kwargs):
|
|
66
|
+
warnings.warn(mensaje, DeprecationWarning, stacklevel=2)
|
|
67
|
+
return func(*args, **kwargs)
|
|
68
|
+
return wrapper
|
|
69
|
+
return decorador
|
|
70
|
+
|
|
71
|
+
@deprecado(
|
|
72
|
+
desde="2.1.0", eliminar_en="3.0.0",
|
|
73
|
+
usar_en_su_lugar="calcular_descuento(precio, porcentaje, moneda='MXN')",
|
|
74
|
+
)
|
|
75
|
+
def calcular_descuento_v1(precio: float, porcentaje: float) -> float:
|
|
76
|
+
return precio * (1 - porcentaje / 100)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Deprecación de Endpoints REST
|
|
82
|
+
|
|
83
|
+
OBLIGATORIO: headers estándar de deprecación HTTP.
|
|
84
|
+
|
|
85
|
+
```python
|
|
86
|
+
@router.get("/v1/usuarios/{usuario_id}")
|
|
87
|
+
async def obtener_usuario_v1(usuario_id: str, response: Response) -> dict:
|
|
88
|
+
response.headers["Deprecation"] = "true"
|
|
89
|
+
response.headers["Sunset"] = "2026-09-01"
|
|
90
|
+
response.headers["Link"] = f'</v2/usuarios/{usuario_id}>; rel="successor-version"'
|
|
91
|
+
response.headers["Warning"] = (
|
|
92
|
+
'299 - "Endpoint deprecado. Migrar a /v2/usuarios/{id}"'
|
|
93
|
+
)
|
|
94
|
+
usuario = await servicio_usuarios.obtener(usuario_id)
|
|
95
|
+
return {"id": usuario.id, "nombre_completo": usuario.nombre}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Migraciones de Base de Datos sin Tiempo de Inactividad
|
|
101
|
+
|
|
102
|
+
### Estrategia: Expand-Contract (3 fases)
|
|
103
|
+
|
|
104
|
+
```sql
|
|
105
|
+
-- FASE 1: EXPAND — agregar lo nuevo sin eliminar lo viejo
|
|
106
|
+
ALTER TABLE usuarios ADD COLUMN nombre_display TEXT;
|
|
107
|
+
CREATE INDEX CONCURRENTLY idx_usuarios_nombre_display ON usuarios (nombre_display);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
# FASE 2: MIGRAR — rellenar en background, sin downtime
|
|
112
|
+
def migrar_nombres_display(batch_size: int = 1000) -> None:
|
|
113
|
+
ultimo_id = None
|
|
114
|
+
while True:
|
|
115
|
+
lote = db.execute(
|
|
116
|
+
f"SELECT id, nombre FROM usuarios WHERE nombre_display IS NULL "
|
|
117
|
+
f"{'AND id > :uid' if ultimo_id else ''} ORDER BY id LIMIT :bs",
|
|
118
|
+
{"uid": ultimo_id, "bs": batch_size},
|
|
119
|
+
).fetchall()
|
|
120
|
+
if not lote:
|
|
121
|
+
break
|
|
122
|
+
for fila in lote:
|
|
123
|
+
db.execute(
|
|
124
|
+
"UPDATE usuarios SET nombre_display = :nd WHERE id = :id",
|
|
125
|
+
{"nd": formatear_nombre(fila.nombre), "id": fila.id},
|
|
126
|
+
)
|
|
127
|
+
db.commit()
|
|
128
|
+
ultimo_id = lote[-1].id
|
|
129
|
+
time.sleep(0.1) # No saturar BD
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
```sql
|
|
133
|
+
-- FASE 3: CONTRACT — eliminar columna vieja (solo cuando TODOS los servicios migraron)
|
|
134
|
+
ALTER TABLE usuarios DROP COLUMN nombre;
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Implementaciones Completas
|
|
140
|
+
|
|
141
|
+
Para Feature Flags con rollout gradual, Patrón Strangler Fig (proxy de migración),
|
|
142
|
+
Plantilla de Guía de Migración para usuarios, y Monitoreo de uso de endpoints
|
|
143
|
+
deprecados, ver
|
|
144
|
+
[recursos/implementaciones-completas.md](recursos/implementaciones-completas.md).
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## Checklist de Revisión — Deprecación y Migración
|
|
149
|
+
|
|
150
|
+
- [ ] El aviso de deprecación incluye: versión desde, versión de eliminación, alternativa.
|
|
151
|
+
- [ ] El código deprecado sigue funcionando durante el período de gracia completo.
|
|
152
|
+
- [ ] Los endpoints deprecados retornan headers `Deprecation`, `Sunset` y `Link`.
|
|
153
|
+
- [ ] Hay una guía de migración publicada ANTES de deprecar, no después.
|
|
154
|
+
- [ ] Las migraciones de base de datos usan el patrón Expand-Contract (3 fases).
|
|
155
|
+
- [ ] Las migraciones de datos son idempotentes y se pueden re-ejecutar sin duplicados.
|
|
156
|
+
- [ ] Los índices se crean con `CREATE INDEX CONCURRENTLY` para no bloquear.
|
|
157
|
+
- [ ] Las migraciones del Strangler Fig tienen feature flags con rollout gradual.
|
|
158
|
+
- [ ] Hay un proceso para identificar y notificar clientes que aún usan APIs deprecadas.
|
|
159
|
+
- [ ] El plan de eliminación incluye qué retornar después: `410 Gone` con cuerpo explicativo.
|
|
160
|
+
|
|
161
|
+
## Gotchas / Errores comunes no obvios
|
|
162
|
+
|
|
163
|
+
**El decorator `@deprecado` emite `DeprecationWarning` pero los warnings de Python están silenciados por defecto en producción**: en CPython, los `DeprecationWarning` se suprimen a menos que el código corra en modo test o con `python -W default`. Causa: Python suprime `DeprecationWarning` deliberadamente para no saturar a los usuarios finales con warnings de bibliotecas. Fix: para asegurar visibilidad del aviso, complementar `warnings.warn` con un log estructurado en el wrapper: `logger.warning("deprecado: %s — migrar a %s", func.__qualname__, usar_en_su_lugar)`. El log pasa a través de cualquier configuración de Python warnings.
|
|
164
|
+
|
|
165
|
+
**La Fase 2 del patrón Expand-Contract con migración en background bloquea la tabla en PostgreSQL por el `UPDATE` masivo**: actualizar millones de filas con `UPDATE usuarios SET nombre_display = :nd WHERE nombre_display IS NULL` puede escalar a un lock de tabla que bloquea lecturas. Causa: PostgreSQL escala el lock de fila a lock de tabla cuando el porcentaje de filas actualizadas es alto. Fix: procesar siempre en lotes pequeños (máximo 1000 filas por transacción) con `time.sleep(0.1)` entre lotes. Usar `SELECT ... FOR UPDATE SKIP LOCKED` para evitar deadlocks si múltiples workers corren la migración en paralelo.
|
|
166
|
+
|
|
167
|
+
**El header `Sunset` en endpoints deprecados usa formato de fecha incorrecto y los clientes no lo parsean**: `response.headers["Sunset"] = "2026-09-01"` usa formato ISO 8601, pero el RFC 8594 especifica que `Sunset` debe usar formato HTTP-date: `"Mon, 01 Sep 2026 00:00:00 GMT"`. Causa: el estándar del header `Sunset` es diferente al formato de fecha que los desarrolladores usan intuitivamente. Fix: generar el valor con `email.utils.formatdate(time.mktime(fecha_sunset.timetuple()), usegmt=True)` en Python para producir el formato HTTP-date correcto.
|
|
168
|
+
|
|
169
|
+
**El Strangler Fig con feature flag al 100% nunca elimina el código legacy porque "ya está en producción sin problemas"**: el rollout llega al 100% gradualmente, el código nuevo funciona bien, pero el código legacy nunca se elimina porque "no hay urgencia". Causa: sin fecha de eliminación forzada, el Strangler Fig crea deuda técnica permanente — dos implementaciones que coexisten indefinidamente. Fix: establecer en el plan de migración una fecha de eliminación del código legacy como hito del proyecto, antes de llegar al 100% del rollout. El 100% en feature flag no es el final — la eliminación del código viejo lo es.
|