@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,322 @@
|
|
|
1
|
+
# Ingeniería de Datos y ETL — Implementaciones Completas
|
|
2
|
+
|
|
3
|
+
## Calidad de Datos — Validación con Great Expectations
|
|
4
|
+
|
|
5
|
+
```python
|
|
6
|
+
# Usando Great Expectations para validación declarativa
|
|
7
|
+
import great_expectations as gx
|
|
8
|
+
|
|
9
|
+
def validar_pedidos(df: pd.DataFrame) -> ValidationResult:
|
|
10
|
+
"""Valida el DataFrame de pedidos antes de cargar a Silver."""
|
|
11
|
+
|
|
12
|
+
context = gx.get_context()
|
|
13
|
+
suite = context.add_or_update_expectation_suite("pedidos_suite")
|
|
14
|
+
|
|
15
|
+
validator = context.get_validator(
|
|
16
|
+
batch_request=gx.core.BatchRequest(datasource_name="staging"),
|
|
17
|
+
expectation_suite=suite,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
# Validaciones de integridad
|
|
21
|
+
validator.expect_column_to_exist("pedido_id")
|
|
22
|
+
validator.expect_column_values_to_not_be_null("pedido_id")
|
|
23
|
+
validator.expect_column_values_to_be_unique("pedido_id")
|
|
24
|
+
|
|
25
|
+
# Validaciones de dominio
|
|
26
|
+
validator.expect_column_values_to_be_in_set(
|
|
27
|
+
"estatus", {"PENDIENTE", "PAGADO", "ENVIADO", "CANCELADO"}
|
|
28
|
+
)
|
|
29
|
+
validator.expect_column_values_to_be_between(
|
|
30
|
+
"monto_total", min_value=0.01, max_value=999_999.99
|
|
31
|
+
)
|
|
32
|
+
validator.expect_column_values_to_match_regex(
|
|
33
|
+
"email_cliente", r"^[^@\s]+@[^@\s]+\.[^@\s]+$"
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
# Validación de freshness
|
|
37
|
+
validator.expect_column_max_to_be_between(
|
|
38
|
+
"fecha_pedido",
|
|
39
|
+
min_value=str(date.today() - timedelta(days=1)),
|
|
40
|
+
max_value=str(date.today() + timedelta(days=1)),
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
resultado = validator.validate()
|
|
44
|
+
|
|
45
|
+
if not resultado.success:
|
|
46
|
+
fallos = [
|
|
47
|
+
r for r in resultado.results if not r.success
|
|
48
|
+
]
|
|
49
|
+
logger.error(
|
|
50
|
+
"validacion_datos_fallida",
|
|
51
|
+
total_expectativas=len(resultado.results),
|
|
52
|
+
total_fallos=len(fallos),
|
|
53
|
+
detalle=[str(f.expectation_config) for f in fallos[:5]],
|
|
54
|
+
)
|
|
55
|
+
raise ErrorCalidadDatos(
|
|
56
|
+
f"{len(fallos)} validaciones fallidas en pedidos",
|
|
57
|
+
{"fallos": len(fallos), "total": len(resultado.results)},
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
return resultado
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## CDC — Change Data Capture con Debezium
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
# debezium-connector.json
|
|
69
|
+
{
|
|
70
|
+
"name": "pedidos-cdc-connector",
|
|
71
|
+
"config": {
|
|
72
|
+
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
|
|
73
|
+
"database.hostname": "postgres-produccion",
|
|
74
|
+
"database.port": "5432",
|
|
75
|
+
"database.user": "debezium_user",
|
|
76
|
+
"database.password": "${file:/opt/secrets/debezium.properties:password}",
|
|
77
|
+
"database.dbname": "appdb",
|
|
78
|
+
"database.server.name": "appdb",
|
|
79
|
+
"table.include.list": "public.pedidos,public.usuarios",
|
|
80
|
+
"plugin.name": "pgoutput",
|
|
81
|
+
"publication.name": "debezium_pub",
|
|
82
|
+
"slot.name": "debezium_slot",
|
|
83
|
+
"topic.prefix": "cdc",
|
|
84
|
+
"transforms": "route",
|
|
85
|
+
"transforms.route.type": "org.apache.kafka.connect.transforms.ReplaceField$Value",
|
|
86
|
+
"key.converter": "io.confluent.kafka.serializers.KafkaAvroSerializer",
|
|
87
|
+
"value.converter": "io.confluent.kafka.serializers.KafkaAvroSerializer"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
# Consumidor CDC en Python
|
|
94
|
+
from confluent_kafka import Consumer, KafkaError
|
|
95
|
+
import json
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def procesar_evento_cdc(evento: dict) -> None:
|
|
99
|
+
"""Procesa un evento CDC de Debezium."""
|
|
100
|
+
operacion = evento.get("op") # c=create, u=update, d=delete, r=snapshot
|
|
101
|
+
|
|
102
|
+
match operacion:
|
|
103
|
+
case "c":
|
|
104
|
+
nuevo = evento["after"]
|
|
105
|
+
silver_pedidos.upsert(transformar_pedido(nuevo))
|
|
106
|
+
|
|
107
|
+
case "u":
|
|
108
|
+
antes = evento["before"]
|
|
109
|
+
despues = evento["after"]
|
|
110
|
+
silver_pedidos.upsert(transformar_pedido(despues))
|
|
111
|
+
auditar_cambio(antes, despues)
|
|
112
|
+
|
|
113
|
+
case "d":
|
|
114
|
+
eliminado = evento["before"]
|
|
115
|
+
silver_pedidos.marcar_eliminado(eliminado["id"])
|
|
116
|
+
|
|
117
|
+
case "r":
|
|
118
|
+
silver_pedidos.upsert(transformar_pedido(evento["after"]))
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
consumer = Consumer({
|
|
122
|
+
"bootstrap.servers": "kafka:9092",
|
|
123
|
+
"group.id": "cdc-silver-processor",
|
|
124
|
+
"auto.offset.reset": "earliest",
|
|
125
|
+
"enable.auto.commit": False,
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
consumer.subscribe(["cdc.appdb.public.pedidos"])
|
|
129
|
+
|
|
130
|
+
while True:
|
|
131
|
+
msg = consumer.poll(timeout=1.0)
|
|
132
|
+
if msg is None:
|
|
133
|
+
continue
|
|
134
|
+
if msg.error():
|
|
135
|
+
if msg.error().code() == KafkaError._PARTITION_EOF:
|
|
136
|
+
continue
|
|
137
|
+
raise KafkaError(msg.error())
|
|
138
|
+
|
|
139
|
+
try:
|
|
140
|
+
evento = json.loads(msg.value())
|
|
141
|
+
procesar_evento_cdc(evento)
|
|
142
|
+
consumer.commit(asynchronous=False)
|
|
143
|
+
except Exception as exc:
|
|
144
|
+
logger.error("error_procesando_cdc", error=str(exc), exc_info=True)
|
|
145
|
+
enviar_dlq(msg.value(), str(exc))
|
|
146
|
+
consumer.commit(asynchronous=False)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Evolución de Esquemas — Forward/Backward Compatibility
|
|
152
|
+
|
|
153
|
+
```python
|
|
154
|
+
# Estrategia: columnas nuevas siempre nullable o con default
|
|
155
|
+
# NUNCA eliminar columnas en producción — deprecar primero
|
|
156
|
+
|
|
157
|
+
# Migración segura — backward compatible
|
|
158
|
+
"""
|
|
159
|
+
-- BIEN: columna nueva con default
|
|
160
|
+
ALTER TABLE silver.pedidos
|
|
161
|
+
ADD COLUMN IF NOT EXISTS canal_venta TEXT DEFAULT 'WEB';
|
|
162
|
+
|
|
163
|
+
-- MAL: cambiar tipo de columna existente directamente
|
|
164
|
+
-- ALTER TABLE silver.pedidos ALTER COLUMN monto TYPE BIGINT;
|
|
165
|
+
|
|
166
|
+
-- BIEN: renombrar con período de transición
|
|
167
|
+
ALTER TABLE silver.pedidos ADD COLUMN monto_centavos BIGINT;
|
|
168
|
+
UPDATE silver.pedidos SET monto_centavos = (monto * 100)::BIGINT;
|
|
169
|
+
-- (semana después, cuando todos los consumidores usen la nueva columna)
|
|
170
|
+
ALTER TABLE silver.pedidos DROP COLUMN monto;
|
|
171
|
+
ALTER TABLE silver.pedidos RENAME COLUMN monto_centavos TO monto;
|
|
172
|
+
"""
|
|
173
|
+
|
|
174
|
+
# Schema registry con Avro para streaming
|
|
175
|
+
SCHEMA_PEDIDO_V1 = {
|
|
176
|
+
"type": "record",
|
|
177
|
+
"name": "Pedido",
|
|
178
|
+
"fields": [
|
|
179
|
+
{"name": "id", "type": "string"},
|
|
180
|
+
{"name": "monto", "type": "double"},
|
|
181
|
+
{"name": "estatus","type": "string"},
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
# V2: campo nuevo con default — backward compatible
|
|
186
|
+
SCHEMA_PEDIDO_V2 = {
|
|
187
|
+
"type": "record",
|
|
188
|
+
"name": "Pedido",
|
|
189
|
+
"fields": [
|
|
190
|
+
{"name": "id", "type": "string"},
|
|
191
|
+
{"name": "monto", "type": "double"},
|
|
192
|
+
{"name": "estatus", "type": "string"},
|
|
193
|
+
{"name": "canal_venta", "type": "string", "default": "WEB"},
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Patrones dbt — Transformaciones Declarativas
|
|
201
|
+
|
|
202
|
+
```sql
|
|
203
|
+
-- models/silver/pedidos_limpio.sql
|
|
204
|
+
{{
|
|
205
|
+
config(
|
|
206
|
+
materialized='incremental',
|
|
207
|
+
unique_key='pedido_id',
|
|
208
|
+
on_schema_change='append_new_columns',
|
|
209
|
+
partition_by={
|
|
210
|
+
"field": "fecha_pedido",
|
|
211
|
+
"data_type": "date",
|
|
212
|
+
"granularity": "day"
|
|
213
|
+
}
|
|
214
|
+
)
|
|
215
|
+
}}
|
|
216
|
+
|
|
217
|
+
WITH fuente AS (
|
|
218
|
+
SELECT * FROM {{ source('bronze', 'pedidos_raw') }}
|
|
219
|
+
{% if is_incremental() %}
|
|
220
|
+
WHERE _ingestado_en > (SELECT MAX(_ingestado_en) FROM {{ this }})
|
|
221
|
+
{% endif %}
|
|
222
|
+
),
|
|
223
|
+
|
|
224
|
+
limpieza AS (
|
|
225
|
+
SELECT
|
|
226
|
+
TRIM(pedido_id) AS pedido_id,
|
|
227
|
+
LOWER(TRIM(email_cliente)) AS email_cliente,
|
|
228
|
+
UPPER(TRIM(estatus)) AS estatus,
|
|
229
|
+
ROUND(CAST(monto_total AS NUMERIC), 2) AS monto_total,
|
|
230
|
+
DATE(fecha_pedido) AS fecha_pedido,
|
|
231
|
+
_ingestado_en,
|
|
232
|
+
EXTRACT(YEAR FROM DATE(fecha_pedido)) AS anio,
|
|
233
|
+
EXTRACT(MONTH FROM DATE(fecha_pedido)) AS mes,
|
|
234
|
+
CASE WHEN monto_total < 0 THEN TRUE ELSE FALSE END AS tiene_monto_negativo,
|
|
235
|
+
CASE WHEN email_cliente NOT LIKE '%@%' THEN TRUE ELSE FALSE END AS email_invalido
|
|
236
|
+
|
|
237
|
+
FROM fuente
|
|
238
|
+
WHERE pedido_id IS NOT NULL
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
SELECT * FROM limpieza
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
```yaml
|
|
245
|
+
# models/silver/schema.yml
|
|
246
|
+
models:
|
|
247
|
+
- name: pedidos_limpio
|
|
248
|
+
description: "Pedidos normalizados de Bronze, deduplicados y validados"
|
|
249
|
+
columns:
|
|
250
|
+
- name: pedido_id
|
|
251
|
+
tests:
|
|
252
|
+
- not_null
|
|
253
|
+
- unique
|
|
254
|
+
- name: email_cliente
|
|
255
|
+
tests:
|
|
256
|
+
- not_null
|
|
257
|
+
- name: estatus
|
|
258
|
+
tests:
|
|
259
|
+
- accepted_values:
|
|
260
|
+
values: ["PENDIENTE", "PAGADO", "ENVIADO", "CANCELADO"]
|
|
261
|
+
- name: monto_total
|
|
262
|
+
tests:
|
|
263
|
+
- not_null
|
|
264
|
+
- dbt_utils.expression_is_true:
|
|
265
|
+
expression: ">= 0"
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## Linaje de Datos
|
|
271
|
+
|
|
272
|
+
```python
|
|
273
|
+
# linaje.py — registrar transformaciones para auditoría
|
|
274
|
+
from dataclasses import dataclass
|
|
275
|
+
from datetime import datetime, timezone
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
@dataclass
|
|
279
|
+
class NodoLinaje:
|
|
280
|
+
nombre: str
|
|
281
|
+
tipo: str # "fuente", "transformacion", "destino"
|
|
282
|
+
ubicacion: str
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
@dataclass
|
|
286
|
+
class EventoLinaje:
|
|
287
|
+
run_id: str
|
|
288
|
+
pipeline: str
|
|
289
|
+
origen: NodoLinaje
|
|
290
|
+
destino: NodoLinaje
|
|
291
|
+
registros_entrada: int
|
|
292
|
+
registros_salida: int
|
|
293
|
+
registros_rechazados: int
|
|
294
|
+
timestamp: datetime
|
|
295
|
+
query_o_script: str | None = None
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
class RegistroLinaje:
|
|
299
|
+
def registrar(self, evento: EventoLinaje) -> None:
|
|
300
|
+
db.execute("""
|
|
301
|
+
INSERT INTO meta.linaje_datos (
|
|
302
|
+
run_id, pipeline, origen_nombre, origen_tipo, origen_ubicacion,
|
|
303
|
+
destino_nombre, destino_tipo, destino_ubicacion,
|
|
304
|
+
registros_entrada, registros_salida, registros_rechazados,
|
|
305
|
+
timestamp, query_script
|
|
306
|
+
) VALUES (
|
|
307
|
+
:run_id, :pipeline, :onom, :otipo, :oubic,
|
|
308
|
+
:dnom, :dtipo, :dubic,
|
|
309
|
+
:rent, :rsal, :rrec,
|
|
310
|
+
:ts, :qs
|
|
311
|
+
)
|
|
312
|
+
""", {
|
|
313
|
+
"run_id": evento.run_id, "pipeline": evento.pipeline,
|
|
314
|
+
"onom": evento.origen.nombre, "otipo": evento.origen.tipo,
|
|
315
|
+
"oubic": evento.origen.ubicacion,
|
|
316
|
+
"dnom": evento.destino.nombre, "dtipo": evento.destino.tipo,
|
|
317
|
+
"dubic": evento.destino.ubicacion,
|
|
318
|
+
"rent": evento.registros_entrada, "rsal": evento.registros_salida,
|
|
319
|
+
"rrec": evento.registros_rechazados,
|
|
320
|
+
"ts": evento.timestamp.isoformat(), "qs": evento.query_o_script,
|
|
321
|
+
})
|
|
322
|
+
```
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dbml-experto
|
|
3
|
+
description: >
|
|
4
|
+
Experto en DBML (Database Markup Language) — lenguaje declarativo para describir
|
|
5
|
+
esquemas de bases de datos. Cubre sintaxis (tables, refs, enums, indexes, notes,
|
|
6
|
+
projects), parseo programático con @dbml/core cuando está instalado, fallback a
|
|
7
|
+
heurísticas de texto plano cuando no, y casos de uso en proyectos data-heavy:
|
|
8
|
+
análisis de schema, migración entre dialectos (PG/MySQL/MSSQL), detección de
|
|
9
|
+
relaciones huérfanas, generación de DDL. Cargar cuando un proyecto contenga
|
|
10
|
+
archivos .dbml, o cuando el usuario mencione dbdiagram.io, chartdb.io, schema
|
|
11
|
+
as code o DBML explícitamente. NO cargar para SQL plano, Prisma schema, TypeORM
|
|
12
|
+
entities u otros DSLs de schema — son otros skills distintos.
|
|
13
|
+
version: "1.0.0"
|
|
14
|
+
herramientasPermitidas: [Read]
|
|
15
|
+
evolvable: true # default para skill estandar
|
|
16
|
+
exclusiones:
|
|
17
|
+
- "No cargar para SQL plano (DDL, DML, migraciones) — para SQL cargar `postgresql-experto` o `sql-optimizacion`."
|
|
18
|
+
- "No cargar para Prisma schema (.prisma), TypeORM entities o SQLAlchemy declarative — son DSLs incompatibles con DBML."
|
|
19
|
+
- "No cargar para generar diagramas visuales de arquitectura — para diagramas cargar `diagrama-arquitectura` o `generacion-mermaid`."
|
|
20
|
+
- "No cargar para aplicar migraciones a una base de datos real — este skill es análisis estático de DBML, no ejecución de DDL."
|
|
21
|
+
---
|
|
22
|
+
# DBML Experto — Parseo y análisis de esquemas DBML
|
|
23
|
+
|
|
24
|
+
## Cuándo cargar esta skill
|
|
25
|
+
|
|
26
|
+
- El proyecto contiene archivos `.dbml` o un directorio `db/` con `.dbml`.
|
|
27
|
+
- El usuario menciona `dbdiagram.io`, `chartdb.io`, "schema as code", "DBML",
|
|
28
|
+
o pide migrar entre dialectos SQL.
|
|
29
|
+
- Un agente `datos-swl` o revisor de lenguaje necesita analizar relaciones
|
|
30
|
+
programáticamente y el proyecto usa DBML como fuente de verdad del schema.
|
|
31
|
+
|
|
32
|
+
**No cargar** cuando:
|
|
33
|
+
- El schema está en SQL plano (usar skills de SQL/backend-* correspondientes).
|
|
34
|
+
- El schema está en Prisma (`.prisma`), TypeORM, SQLAlchemy declarative — son otros DSLs.
|
|
35
|
+
- La tarea es solo leer un diagrama sin modificar ni analizar relaciones.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Dependencia opcional — `@dbml/core`
|
|
40
|
+
|
|
41
|
+
Esta skill **funciona sin dependencias** usando heurísticas de texto plano, pero
|
|
42
|
+
gana precisión si el proyecto del usuario tiene `@dbml/core` instalado.
|
|
43
|
+
|
|
44
|
+
### Detectar si está disponible
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# En el proyecto del usuario
|
|
48
|
+
test -d node_modules/@dbml/core && echo "DISPONIBLE" || echo "NO_INSTALADO"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### Si NO está disponible y la tarea requiere parseo estructural
|
|
52
|
+
|
|
53
|
+
Sugerir al usuario instalarlo en **su** proyecto (nunca en swl-ses):
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm install --save-dev @dbml/core
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Documentado también en `MANUAL_USO.md` → "Dependencias externas — referencia
|
|
60
|
+
detallada" → `@dbml/core`.
|
|
61
|
+
|
|
62
|
+
### Si SÍ está disponible — patrón de uso
|
|
63
|
+
|
|
64
|
+
```javascript
|
|
65
|
+
const fs = require('node:fs');
|
|
66
|
+
const { importer } = require('@dbml/core');
|
|
67
|
+
|
|
68
|
+
const texto = fs.readFileSync('db/schema.dbml', 'utf8');
|
|
69
|
+
const schema = importer.import(texto, 'dbml');
|
|
70
|
+
|
|
71
|
+
// schema.tables[i]
|
|
72
|
+
// .name, .note, .fields[], .indexes[]
|
|
73
|
+
// schema.refs[i]
|
|
74
|
+
// .endpoints[0].tableName, .endpoints[0].fieldNames
|
|
75
|
+
// .endpoints[1].tableName, .endpoints[1].fieldNames
|
|
76
|
+
// .onDelete, .onUpdate
|
|
77
|
+
// schema.enums[i]
|
|
78
|
+
// .name, .values[]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Sintaxis DBML esencial
|
|
84
|
+
|
|
85
|
+
### Tabla básica
|
|
86
|
+
|
|
87
|
+
```dbml
|
|
88
|
+
Table users {
|
|
89
|
+
id int [pk, increment]
|
|
90
|
+
email varchar [unique, not null]
|
|
91
|
+
name varchar
|
|
92
|
+
created_at timestamp [default: `now()`]
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
| Modificador | Significado |
|
|
97
|
+
|-------------|-------------|
|
|
98
|
+
| `pk` | Primary key |
|
|
99
|
+
| `increment` | Auto-incremento (serial/identity) |
|
|
100
|
+
| `unique` | Restricción UNIQUE |
|
|
101
|
+
| `not null` | NOT NULL |
|
|
102
|
+
| `default: X` | Valor default (usar backticks para expresiones) |
|
|
103
|
+
| `note: 'texto'` | Comentario asociado al campo |
|
|
104
|
+
| `ref: > tabla.campo` | Relación inline |
|
|
105
|
+
|
|
106
|
+
### Relaciones (refs)
|
|
107
|
+
|
|
108
|
+
Tres formas equivalentes:
|
|
109
|
+
|
|
110
|
+
```dbml
|
|
111
|
+
# A. Inline en el campo
|
|
112
|
+
Table posts {
|
|
113
|
+
id int [pk]
|
|
114
|
+
user_id int [ref: > users.id] // many-to-one
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
# B. Referencia separada
|
|
118
|
+
Ref: posts.user_id > users.id
|
|
119
|
+
|
|
120
|
+
# C. Bloque de referencias
|
|
121
|
+
Ref user_post {
|
|
122
|
+
users.id < posts.user_id [delete: cascade, update: no action]
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Cardinalidades:
|
|
127
|
+
- `>` many-to-one (de hijo hacia padre)
|
|
128
|
+
- `<` one-to-many
|
|
129
|
+
- `-` one-to-one
|
|
130
|
+
- `<>` many-to-many (requiere tabla pivote explícita)
|
|
131
|
+
|
|
132
|
+
### Índices
|
|
133
|
+
|
|
134
|
+
```dbml
|
|
135
|
+
Table users {
|
|
136
|
+
id int [pk]
|
|
137
|
+
email varchar
|
|
138
|
+
country varchar
|
|
139
|
+
|
|
140
|
+
Indexes {
|
|
141
|
+
email [unique]
|
|
142
|
+
(country, email) [name: 'idx_country_email']
|
|
143
|
+
`lower(email)` [type: btree]
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Enums
|
|
149
|
+
|
|
150
|
+
```dbml
|
|
151
|
+
Enum order_status {
|
|
152
|
+
pending
|
|
153
|
+
paid
|
|
154
|
+
shipped [note: 'el producto salió del almacén']
|
|
155
|
+
cancelled
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
Table orders {
|
|
159
|
+
id int [pk]
|
|
160
|
+
status order_status [not null, default: 'pending']
|
|
161
|
+
}
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### Agrupación en Projects y TableGroups
|
|
165
|
+
|
|
166
|
+
```dbml
|
|
167
|
+
Project mi_sistema {
|
|
168
|
+
database_type: 'PostgreSQL'
|
|
169
|
+
Note: 'Esquema principal de la aplicación'
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
TableGroup facturacion {
|
|
173
|
+
orders
|
|
174
|
+
order_items
|
|
175
|
+
payments
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Casos de uso en SWL
|
|
182
|
+
|
|
183
|
+
### 1. Análisis de relaciones huérfanas
|
|
184
|
+
|
|
185
|
+
Detectar refs cuyo endpoint apunta a tablas/campos inexistentes:
|
|
186
|
+
|
|
187
|
+
```javascript
|
|
188
|
+
const tablas = new Map(schema.tables.map(t => [t.name, new Set(t.fields.map(f => f.name))]));
|
|
189
|
+
|
|
190
|
+
const huérfanas = schema.refs.filter(r => {
|
|
191
|
+
for (const ep of r.endpoints) {
|
|
192
|
+
const cols = tablas.get(ep.tableName);
|
|
193
|
+
if (!cols) return true;
|
|
194
|
+
for (const fn of ep.fieldNames) if (!cols.has(fn)) return true;
|
|
195
|
+
}
|
|
196
|
+
return false;
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 2. Detección de tablas sin PK
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
const sinPK = schema.tables.filter(t =>
|
|
204
|
+
!t.fields.some(f => f.pk) &&
|
|
205
|
+
!t.indexes?.some(i => i.pk)
|
|
206
|
+
);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Reportar como anti-patrón (excepto tablas de log append-only declaradas en note).
|
|
210
|
+
|
|
211
|
+
### 3. Migración entre dialectos
|
|
212
|
+
|
|
213
|
+
Convertir tipos DBML → dialecto específico. Tabla base (extender según necesidad):
|
|
214
|
+
|
|
215
|
+
| DBML | PostgreSQL | MySQL | MSSQL | SQLite |
|
|
216
|
+
|------|-----------|-------|-------|--------|
|
|
217
|
+
| `int` | `integer` | `int` | `int` | `integer` |
|
|
218
|
+
| `bigint` | `bigint` | `bigint` | `bigint` | `integer` |
|
|
219
|
+
| `varchar` | `varchar(255)` | `varchar(255)` | `nvarchar(255)` | `text` |
|
|
220
|
+
| `text` | `text` | `text` | `nvarchar(max)` | `text` |
|
|
221
|
+
| `timestamp` | `timestamp` | `datetime` | `datetime2` | `text` |
|
|
222
|
+
| `boolean` | `boolean` | `tinyint(1)` | `bit` | `integer` |
|
|
223
|
+
| `uuid` | `uuid` | `char(36)` | `uniqueidentifier` | `text` |
|
|
224
|
+
| `json` | `jsonb` | `json` | `nvarchar(max)` | `text` |
|
|
225
|
+
|
|
226
|
+
Reglas al migrar:
|
|
227
|
+
- `timestamp with tz` → `timestamptz` (PG) / `datetime` (MySQL sin tz) / `datetimeoffset` (MSSQL).
|
|
228
|
+
- Defaults con funciones (`` `now()` ``) requieren ajuste por dialecto.
|
|
229
|
+
- `increment` → `SERIAL`/`IDENTITY`/`AUTOINCREMENT` según dialecto.
|
|
230
|
+
- Reglas `on delete cascade` se soportan en todos; `on delete set null` requiere columna nullable.
|
|
231
|
+
|
|
232
|
+
### 4. Fallback sin `@dbml/core` — heurísticas de texto
|
|
233
|
+
|
|
234
|
+
Si el usuario no puede instalar la dependencia, usar regex conservadoras:
|
|
235
|
+
|
|
236
|
+
```javascript
|
|
237
|
+
// Extraer nombres de tablas
|
|
238
|
+
const tablas = [...texto.matchAll(/^\s*Table\s+(\w+)\s*\{/gm)].map(m => m[1]);
|
|
239
|
+
|
|
240
|
+
// Extraer refs inline
|
|
241
|
+
const refsInline = [...texto.matchAll(/\[ref:\s*[<>\-]\s*(\w+)\.(\w+)/g)]
|
|
242
|
+
.map(m => ({ tabla: m[1], campo: m[2] }));
|
|
243
|
+
|
|
244
|
+
// Extraer refs separadas
|
|
245
|
+
const refsSep = [...texto.matchAll(/^\s*Ref(?:\s+\w+)?\s*:?\s*(\w+)\.(\w+)\s*([<>\-]+)\s*(\w+)\.(\w+)/gm)]
|
|
246
|
+
.map(m => ({ fromTabla: m[1], fromCampo: m[2], card: m[3], toTabla: m[4], toCampo: m[5] }));
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**Limitaciones del fallback**:
|
|
250
|
+
- No resuelve tipos compuestos ni enums referenciados.
|
|
251
|
+
- Puede fallar con comentarios embebidos o strings con llaves.
|
|
252
|
+
- No valida sintaxis.
|
|
253
|
+
|
|
254
|
+
Siempre reportar al usuario: "Análisis hecho sin `@dbml/core` — precisión
|
|
255
|
+
limitada, considera instalarlo si vas a tomar decisiones estructurales."
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Patrones buenos y malos en DBML
|
|
260
|
+
|
|
261
|
+
### BIEN — nombres consistentes
|
|
262
|
+
|
|
263
|
+
```dbml
|
|
264
|
+
Table users {
|
|
265
|
+
id int [pk, increment]
|
|
266
|
+
organization_id int [ref: > organizations.id]
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### MAL — inconsistencia snake_case vs camelCase
|
|
271
|
+
|
|
272
|
+
```dbml
|
|
273
|
+
Table users {
|
|
274
|
+
id int [pk]
|
|
275
|
+
organizationId int [ref: > organizations.id] // mezclar convenciones rompe tooling
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### BIEN — documentar decisiones con `Note`
|
|
280
|
+
|
|
281
|
+
```dbml
|
|
282
|
+
Table events {
|
|
283
|
+
id bigint [pk, increment]
|
|
284
|
+
payload jsonb [not null]
|
|
285
|
+
|
|
286
|
+
Note: 'Append-only. No usar UPDATE. Particionada por mes vía pg_partman.'
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### MAL — relaciones implícitas sin `Ref`
|
|
291
|
+
|
|
292
|
+
```dbml
|
|
293
|
+
Table orders {
|
|
294
|
+
id int [pk]
|
|
295
|
+
user_id int // sin [ref] ni Ref separada: relación invisible al parser
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Integración con otros skills y agentes
|
|
302
|
+
|
|
303
|
+
- **`datos-swl`** (agente): invoca esta skill al detectar `.dbml` en el proyecto.
|
|
304
|
+
- **`revisor-impacto`** (`/swl:revisar-impacto`): puede cruzar refs DBML con el
|
|
305
|
+
grafo de código para detectar tablas sin consumidores.
|
|
306
|
+
- **`migrador-swl`** (agente): usa la tabla de migración de tipos para generar
|
|
307
|
+
scripts DDL multi-dialecto.
|
|
308
|
+
- **`seguridad.md`** (regla): aplicar revisión de nombres sensibles en columnas
|
|
309
|
+
(email, password, ssn, etc.) independientemente del DSL.
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Lo que esta skill NO hace
|
|
314
|
+
|
|
315
|
+
- **No genera diagramas visuales** — para eso usar `dbdiagram.io`, `chartdb.io` o
|
|
316
|
+
el skill `generacion-mermaid` con output ER.
|
|
317
|
+
- **No ejecuta migraciones** — solo analiza y genera SQL como texto. El usuario
|
|
318
|
+
aplica manualmente con su herramienta de migración.
|
|
319
|
+
- **No valida contra una BD real** — es análisis estático del DBML.
|
|
320
|
+
- **No reemplaza** Prisma/TypeORM/SQLAlchemy — esos son ORMs, DBML es solo el
|
|
321
|
+
schema declarativo.
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Gotchas / Errores comunes no obvios
|
|
326
|
+
|
|
327
|
+
**Las heurísticas de texto plano (sin `@dbml/core`) fallan al parsear tablas con `Note` multilínea**: el regex `^\s*Table\s+(\w+)\s*\{` no coincide cuando la tabla tiene un bloque `Note: '''...'''` antes de los campos, porque la llave de apertura `{` está en la misma línea que `Note`. Causa: DBML permite bloques de texto multilínea con comillas triples que pueden contener llaves. Fix: al usar heurísticas de fallback, reportar explícitamente al usuario que el análisis puede ser incompleto si el schema usa notas multilínea. Para schemas complejos, insistir en instalar `@dbml/core`.
|
|
328
|
+
|
|
329
|
+
**Las cardinalidades `<>` (many-to-many) en DBML no generan tabla pivote automáticamente**: definir `Ref: users.id <> posts.id` es válido en DBML pero no corresponde a ninguna implementación real de muchos a muchos en SQL — las BDs relacionales requieren tabla intermedia explícita. Causa: DBML permite la cardinalidad `<>` como notación conceptual, pero los parsers de DDL la ignoran o la rechazan. Fix: para relaciones many-to-many, siempre crear la tabla pivote explícita (`user_posts { user_id int [ref: > users.id], post_id int [ref: > posts.id] }`) en lugar de usar `<>` directo.
|
|
330
|
+
|
|
331
|
+
**`@dbml/core` lanza error de parseo en schemas con nombres de tabla que contienen guiones**: `Table mi-tabla { ... }` es inválido en DBML — los identificadores solo permiten letras, números y guión bajo. Causa: DBML sigue convenciones de identificadores SQL donde el guión es un operador de resta, no parte del nombre. Fix: usar snake_case (`mi_tabla`) o PascalCase (`MiTabla`) para nombres de tablas. Si el schema existente tiene guiones, renombrar antes de parsear con `@dbml/core`.
|
|
332
|
+
|
|
333
|
+
**El fallback de heurísticas extrae refs inline pero omite los bloques `Ref` separados al final del archivo**: el regex para refs inline (`\[ref: > tabla.campo\]`) funciona, pero el regex para bloques separados `Ref: tabla1.campo > tabla2.campo` puede no capturar todas las variantes de formato (con nombre de ref, con acción on delete). Causa: el formato de bloques `Ref` tiene más variantes sintácticas que los refs inline. Fix: después del análisis heurístico, buscar explícitamente líneas que empiecen con `Ref` y reportarlas por separado al usuario para revisión manual.
|
|
334
|
+
|
|
335
|
+
## Referencias
|
|
336
|
+
|
|
337
|
+
- DBML oficial: https://dbml.dbdiagram.io/docs/
|
|
338
|
+
- `@dbml/core` en npm: https://www.npmjs.com/package/@dbml/core
|
|
339
|
+
- Instalación y atribución: `MANUAL_USO.md` → Dependencias externas → `@dbml/core`.
|