@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,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: css-moderno
|
|
3
|
+
description: CSS moderno 2024+. Cubre Container Queries, CSS Layers (@layer), Nesting nativo, Custom Properties avanzadas, funciones min/max/clamp/color-mix, propiedades lógicas (block/inline), View Transitions API, animaciones performantes solo-compositor, dark mode patterns y anti-patrones críticos.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
herramientasPermitidas: [Read, Grep]
|
|
6
|
+
exclusiones:
|
|
7
|
+
- "No cargar para Tailwind CSS (clases utilitarias, @theme, cva, responsive) — para Tailwind cargar `tailwind-experto`."
|
|
8
|
+
- "No cargar para accesibilidad visual (contraste, foco, ARIA) — para accesibilidad cargar `accesibilidad-a11y`."
|
|
9
|
+
- "No cargar para animaciones JavaScript (GSAP, Framer Motion) — este skill cubre solo animaciones CSS nativas."
|
|
10
|
+
- "No cargar para CSS-in-JS (styled-components, Emotion) — son patrones de componentes JavaScript, no CSS nativo."
|
|
11
|
+
evolvable: true # default para skill estandar
|
|
12
|
+
---
|
|
13
|
+
# CSS Moderno — 2024+
|
|
14
|
+
|
|
15
|
+
## Cuándo NO cargar
|
|
16
|
+
|
|
17
|
+
- La tarea usa Tailwind CSS: clases utilitarias, `@theme`, `cva`, breakpoints responsivos — cargar `tailwind-experto`.
|
|
18
|
+
- El tema es accesibilidad: contraste WCAG, anillo de foco visible, ARIA — cargar `accesibilidad-a11y`.
|
|
19
|
+
- Las animaciones son con JavaScript: GSAP, Framer Motion, Web Animations API — este skill cubre solo animaciones CSS nativas (`transition`, `animation`, `@keyframes`).
|
|
20
|
+
- El contexto es CSS-in-JS (styled-components, Emotion, vanilla-extract) — son patrones de componentes JavaScript, no CSS nativo.
|
|
21
|
+
|
|
22
|
+
## Filosofía
|
|
23
|
+
|
|
24
|
+
CSS moderno elimina la necesidad de preprocesadores para la mayoría de los casos.
|
|
25
|
+
Las características nativas del 2023-2024 cubren lo que antes requería Sass/Less,
|
|
26
|
+
con mejor rendimiento y sin dependencias de build.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Reglas Obligatorias
|
|
31
|
+
|
|
32
|
+
1. **SIEMPRE usar `@layer`** para controlar especificidad — NUNCA `!important`.
|
|
33
|
+
2. **SIEMPRE usar propiedades lógicas** (`margin-inline`, `padding-block`) en lugar de físicas para soporte de internacionalización.
|
|
34
|
+
3. **SOLO animar `transform` y `opacity`** — son las únicas propiedades que corren en el compositor (GPU) sin triggear layout ni paint.
|
|
35
|
+
4. **NUNCA usar `will-change`** salvo que haya un problema de rendimiento medido.
|
|
36
|
+
5. **SIEMPRE usar `rem`** para tipografía — nunca `px` fijos que ignoran preferencias de zoom del usuario.
|
|
37
|
+
6. **Container Queries sobre media queries** cuando el componente vive en contextos de tamaño variable.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Container Queries — Resumen
|
|
42
|
+
|
|
43
|
+
Los componentes responden al tamaño de su contenedor padre, no al viewport:
|
|
44
|
+
|
|
45
|
+
```css
|
|
46
|
+
.card-wrapper {
|
|
47
|
+
container-type: inline-size;
|
|
48
|
+
container-name: tarjeta;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@container tarjeta (min-width: 400px) {
|
|
52
|
+
.card { grid-template-columns: auto 1fr; }
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## CSS Layers (@layer) — Resumen
|
|
59
|
+
|
|
60
|
+
Declara el orden de capas: la última tiene mayor prioridad.
|
|
61
|
+
|
|
62
|
+
```css
|
|
63
|
+
@layer reset, base, componentes, utilidades, overrides;
|
|
64
|
+
|
|
65
|
+
@layer utilidades {
|
|
66
|
+
.mt-4 { margin-top: 1rem; }
|
|
67
|
+
}
|
|
68
|
+
/* Las utilidades siempre ganan sobre componentes, sin !important */
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## CSS Nesting Nativo — Resumen
|
|
74
|
+
|
|
75
|
+
```css
|
|
76
|
+
.nav {
|
|
77
|
+
display: flex;
|
|
78
|
+
gap: 1rem;
|
|
79
|
+
|
|
80
|
+
& a {
|
|
81
|
+
text-decoration: none;
|
|
82
|
+
&:hover { color: var(--color-primario); }
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@media (max-width: 768px) { flex-direction: column; }
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Funciones Matemáticas
|
|
92
|
+
|
|
93
|
+
```css
|
|
94
|
+
/* Tipografía fluida — sin media queries */
|
|
95
|
+
h1 { font-size: clamp(1.5rem, 4vw, 3rem); }
|
|
96
|
+
|
|
97
|
+
/* Contenedor con limites */
|
|
98
|
+
.tarjeta { width: clamp(300px, 50%, 600px); }
|
|
99
|
+
|
|
100
|
+
/* Padding adaptativo */
|
|
101
|
+
.seccion { padding-inline: max(1rem, (100% - 1200px) / 2); }
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Animaciones Performantes (Solo-compositor)
|
|
107
|
+
|
|
108
|
+
```css
|
|
109
|
+
/* BIEN: solo compositor */
|
|
110
|
+
.boton {
|
|
111
|
+
transition: transform 0.2s ease, opacity 0.2s ease;
|
|
112
|
+
}
|
|
113
|
+
.boton:hover {
|
|
114
|
+
transform: translateY(-2px) scale(1.02);
|
|
115
|
+
opacity: 0.9;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* MAL: trigerea layout (costoso) */
|
|
119
|
+
.boton:hover {
|
|
120
|
+
margin-top: -2px; /* layout thrashing */
|
|
121
|
+
width: 102%; /* layout thrashing */
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Anti-patrones Críticos
|
|
128
|
+
|
|
129
|
+
### !important — nunca
|
|
130
|
+
|
|
131
|
+
```css
|
|
132
|
+
/* MAL */
|
|
133
|
+
.titulo { color: red !important; }
|
|
134
|
+
|
|
135
|
+
/* BIEN: usar @layer para controlar especificidad */
|
|
136
|
+
@layer overrides { .titulo { color: red; } }
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Z-index wars
|
|
140
|
+
|
|
141
|
+
```css
|
|
142
|
+
/* MAL: z-index arbitrarios */
|
|
143
|
+
.modal { z-index: 9999; }
|
|
144
|
+
|
|
145
|
+
/* BIEN: sistema de capas con custom properties */
|
|
146
|
+
:root {
|
|
147
|
+
--z-base: 1;
|
|
148
|
+
--z-dropdown: 100;
|
|
149
|
+
--z-modal: 300;
|
|
150
|
+
--z-tooltip: 400;
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
Para ejemplos completos de Container Queries, CSS Layers, Nesting, Custom Properties avanzadas, @property tipadas, color-mix(), propiedades logicas, View Transitions API, dark mode patterns y anti-patrones extendidos, ver [recursos/ejemplos-y-patrones-completos.md](recursos/ejemplos-y-patrones-completos.md).
|
|
157
|
+
|
|
158
|
+
## Gotchas / Errores comunes no obvios
|
|
159
|
+
|
|
160
|
+
**CSS Nesting nativo con `& ` en selectores de clase hermana no funciona igual que Sass**: `& .hijo` selecciona descendientes, pero `.hermano & ` (con el padre al final) invierte el contexto — el comportamiento con pseudo-clases es diferente al de Sass. Además, en Chrome <112 y Firefox <117 el nesting nativo no estaba disponible. Causa: la especificación de CSS Nesting tiene semántica propia distinta de Sass. Fix: verificar soporte con `@supports selector(& a { })` o usar PostCSS `postcss-nesting` como fallback; preferir selectores directos sobre selectores contextuales complejos con nesting.
|
|
161
|
+
|
|
162
|
+
**`@layer` invierte la intuición de especificidad — una clase en `@layer base` siempre pierde contra una clase sin layer aunque tenga más selectores**: una regla fuera de cualquier `@layer` tiene mayor prioridad que cualquier regla dentro de un layer, independientemente de la especificidad. Causa: las reglas sin layer forman implícitamente una capa de mayor prioridad. Fix: si se integra una librería de terceros (Bootstrap, MaterialUI CSS) sin layers, todas las personalizaciones deben estar también fuera de layers o en un `@layer` declarado después de los de la librería.
|
|
163
|
+
|
|
164
|
+
**`container-type: inline-size` en un elemento con `position: absolute/fixed` puede no funcionar como contenedor de queries en algunos navegadores**: el contenedor crea un nuevo stacking context y en ciertos casos la query no se propaga correctamente a hijos con posicionamiento absoluto en Safari <17. Causa: bug de implementación en Safari relacionado con contenedores posicionados. Fix: en elementos con posicionamiento absoluto dentro de container queries, probar en Safari y usar un wrapper div sin posicionamiento como contenedor si hay problemas.
|
|
165
|
+
|
|
166
|
+
**`clamp()` con `vw` en la función intermedia no escala correctamente en pantallas muy anchas si no se acota con `max()`**: `font-size: clamp(1rem, 2vw, 2rem)` en un monitor de 2560px da `2vw = 51.2px`, que es mayor que el máximo de `2rem = 32px` — el clamp lo atrapa pero el cálculo puede ser confuso al depurar. Causa: el valor de `vw` crece sin límite. Fix: entender que `clamp(min, preferido, max)` garantiza que el resultado siempre está entre min y max — el valor preferido puede ser cualquier expresión, incluso mayor que max, y el clamp simplemente retorna max en ese caso. Verificar los tres valores en los tamaños de viewport objetivo.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../../../schemas/skill-evals.schema.json",
|
|
3
|
+
"skill_name": "css-moderno",
|
|
4
|
+
"artifact_type": "skill",
|
|
5
|
+
"schema_version": 1,
|
|
6
|
+
"description": "Evals para css-moderno — grid/flex, custom properties, container queries, cascade layers.",
|
|
7
|
+
"evals": [
|
|
8
|
+
{
|
|
9
|
+
"id": 0,
|
|
10
|
+
"prompt": "Layout 3 columnas responsive minimal, CSS moderno (no bootstrap).",
|
|
11
|
+
"files": [],
|
|
12
|
+
"expectations": [
|
|
13
|
+
"Usa CSS Grid con `grid-template-columns: repeat(auto-fit, minmax(...))`.",
|
|
14
|
+
"NO usa float layout.",
|
|
15
|
+
"NO requiere media queries (el auto-fit hace el trabajo)."
|
|
16
|
+
],
|
|
17
|
+
"tags": ["layout"]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "container-queries",
|
|
21
|
+
"prompt": "Componente que cambia layout según su propio ancho (no el viewport). ¿Qué uso?",
|
|
22
|
+
"files": [],
|
|
23
|
+
"expectations": [
|
|
24
|
+
"Container queries: `@container (min-width: ...)`.",
|
|
25
|
+
"Requiere `container-type: inline-size` en el padre.",
|
|
26
|
+
"NO usa `@media` (ese mide el viewport)."
|
|
27
|
+
],
|
|
28
|
+
"tags": ["modern"],
|
|
29
|
+
"weight": 1.5
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "anti-important",
|
|
33
|
+
"prompt": "El CSS tiene 12 `!important` regados. ¿Cómo lo limpio?",
|
|
34
|
+
"files": [],
|
|
35
|
+
"expectations": [
|
|
36
|
+
"La respuesta indica que es síntoma de specificity wars, no la causa.",
|
|
37
|
+
"Solución: `@layer` (cascade layers) para ordenar especificidad explícitamente.",
|
|
38
|
+
"Alternativa: aumentar specificity intencionalmente con selectores anidados."
|
|
39
|
+
],
|
|
40
|
+
"tags": ["anti-pattern"]
|
|
41
|
+
}
|
|
42
|
+
]
|
|
43
|
+
}
|
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
# CSS Moderno — Ejemplos y Patrones Completos
|
|
2
|
+
|
|
3
|
+
Referencia extendida de la skill `css-moderno`. Contiene ejemplos de código completos
|
|
4
|
+
para Container Queries, CSS Layers, Nesting, Custom Properties, View Transitions,
|
|
5
|
+
animaciones y dark mode.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Container Queries — Ejemplo completo
|
|
10
|
+
|
|
11
|
+
```css
|
|
12
|
+
/* Definir el contenedor */
|
|
13
|
+
.card-wrapper {
|
|
14
|
+
container-type: inline-size;
|
|
15
|
+
container-name: tarjeta;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.card {
|
|
19
|
+
display: grid;
|
|
20
|
+
grid-template-columns: 1fr;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@container tarjeta (min-width: 400px) {
|
|
24
|
+
.card {
|
|
25
|
+
grid-template-columns: auto 1fr;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@container tarjeta (min-width: 600px) {
|
|
30
|
+
.card {
|
|
31
|
+
grid-template-columns: 200px 1fr 100px;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Container Query con unidades de contenedor
|
|
37
|
+
|
|
38
|
+
```css
|
|
39
|
+
.card-titulo {
|
|
40
|
+
/* cqi = 1% del inline-size del contenedor */
|
|
41
|
+
font-size: clamp(1rem, 4cqi, 2rem);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## CSS Layers (@layer) — Ejemplo completo
|
|
48
|
+
|
|
49
|
+
```css
|
|
50
|
+
@layer reset, base, componentes, utilidades, overrides;
|
|
51
|
+
|
|
52
|
+
@layer reset {
|
|
53
|
+
*, *::before, *::after { box-sizing: border-box; }
|
|
54
|
+
* { margin: 0; }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@layer base {
|
|
58
|
+
body { font-family: system-ui, sans-serif; }
|
|
59
|
+
a { color: inherit; }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@layer componentes {
|
|
63
|
+
.btn {
|
|
64
|
+
padding: 0.5rem 1rem;
|
|
65
|
+
border-radius: 0.25rem;
|
|
66
|
+
background: var(--color-primario);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@layer utilidades {
|
|
71
|
+
.mt-4 { margin-top: 1rem; }
|
|
72
|
+
.text-center { text-align: center; }
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Importar estilos de terceros en capas
|
|
77
|
+
|
|
78
|
+
```css
|
|
79
|
+
@import url('normalize.css') layer(reset);
|
|
80
|
+
@import url('bootstrap.css') layer(frameworks);
|
|
81
|
+
|
|
82
|
+
@layer componentes {
|
|
83
|
+
.btn { /* Sobrescribe Bootstrap sin lucha de especificidad */ }
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## CSS Nesting Nativo — Ejemplos
|
|
90
|
+
|
|
91
|
+
```css
|
|
92
|
+
.nav {
|
|
93
|
+
display: flex;
|
|
94
|
+
gap: 1rem;
|
|
95
|
+
|
|
96
|
+
& a {
|
|
97
|
+
text-decoration: none;
|
|
98
|
+
color: var(--color-texto);
|
|
99
|
+
|
|
100
|
+
&:hover {
|
|
101
|
+
color: var(--color-primario);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
&.activo {
|
|
105
|
+
font-weight: bold;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@media (max-width: 768px) {
|
|
110
|
+
flex-direction: column;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Nesting con pseudo-elementos
|
|
116
|
+
|
|
117
|
+
```css
|
|
118
|
+
.card {
|
|
119
|
+
position: relative;
|
|
120
|
+
|
|
121
|
+
&::before {
|
|
122
|
+
content: '';
|
|
123
|
+
position: absolute;
|
|
124
|
+
inset: 0;
|
|
125
|
+
background: linear-gradient(to bottom, transparent, rgb(0 0 0 / 0.5));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
& > .card-content {
|
|
129
|
+
position: relative;
|
|
130
|
+
z-index: 1;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Custom Properties Avanzadas
|
|
138
|
+
|
|
139
|
+
### Design tokens completos
|
|
140
|
+
|
|
141
|
+
```css
|
|
142
|
+
:root {
|
|
143
|
+
/* Primitivos */
|
|
144
|
+
--azul-500: oklch(56% 0.2 250);
|
|
145
|
+
--azul-600: oklch(46% 0.2 250);
|
|
146
|
+
|
|
147
|
+
/* Semanticos */
|
|
148
|
+
--color-primario: var(--azul-500);
|
|
149
|
+
--color-primario-hover: var(--azul-600);
|
|
150
|
+
--color-superficie: #ffffff;
|
|
151
|
+
--color-texto: #0f172a;
|
|
152
|
+
|
|
153
|
+
/* Espaciado */
|
|
154
|
+
--espacio-1: 0.25rem;
|
|
155
|
+
--espacio-2: 0.5rem;
|
|
156
|
+
--espacio-4: 1rem;
|
|
157
|
+
|
|
158
|
+
/* Tipografia */
|
|
159
|
+
--fuente-base: 'Inter', system-ui, sans-serif;
|
|
160
|
+
--tamano-sm: 0.875rem;
|
|
161
|
+
--tamano-base: 1rem;
|
|
162
|
+
--tamano-lg: 1.125rem;
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Custom Properties con @property (tipadas)
|
|
167
|
+
|
|
168
|
+
```css
|
|
169
|
+
@property --porcentaje {
|
|
170
|
+
syntax: '<percentage>';
|
|
171
|
+
inherits: false;
|
|
172
|
+
initial-value: 0%;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.barra {
|
|
176
|
+
background: linear-gradient(to right, var(--color-primario) var(--porcentaje), #e2e8f0 var(--porcentaje));
|
|
177
|
+
transition: --porcentaje 0.3s ease;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.barra:hover {
|
|
181
|
+
--porcentaje: 75%;
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Funciones Matemáticas — Ejemplos extendidos
|
|
188
|
+
|
|
189
|
+
### round(), mod(), rem()
|
|
190
|
+
|
|
191
|
+
```css
|
|
192
|
+
.grid {
|
|
193
|
+
grid-template-columns: repeat(auto-fill, minmax(round(down, 100%, 150px), 1fr));
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### color-mix()
|
|
198
|
+
|
|
199
|
+
```css
|
|
200
|
+
.boton-hover {
|
|
201
|
+
--color-base: var(--color-primario);
|
|
202
|
+
background-color: color-mix(in oklch, var(--color-base) 80%, black);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.overlay {
|
|
206
|
+
background: color-mix(in srgb, var(--color-primario) 20%, transparent);
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Propiedades Lógicas
|
|
213
|
+
|
|
214
|
+
```css
|
|
215
|
+
/* Fisico — mal para internacionalizacion */
|
|
216
|
+
.elemento {
|
|
217
|
+
margin-left: 1rem;
|
|
218
|
+
padding-right: 2rem;
|
|
219
|
+
border-top: 1px solid;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* Logico — correcto para cualquier direccion */
|
|
223
|
+
.elemento {
|
|
224
|
+
margin-inline-start: 1rem;
|
|
225
|
+
padding-inline-end: 2rem;
|
|
226
|
+
border-block-start: 1px solid;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/* Atajos logicos */
|
|
230
|
+
.caja {
|
|
231
|
+
margin-inline: auto;
|
|
232
|
+
padding-block: 1rem;
|
|
233
|
+
inset-inline: 0;
|
|
234
|
+
border-start-start-radius: 8px;
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## View Transitions API
|
|
241
|
+
|
|
242
|
+
```css
|
|
243
|
+
::view-transition-old(root) {
|
|
244
|
+
animation: salir 0.3s ease-in;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
::view-transition-new(root) {
|
|
248
|
+
animation: entrar 0.3s ease-out;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.hero-imagen {
|
|
252
|
+
view-transition-name: hero;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
::view-transition-old(hero),
|
|
256
|
+
::view-transition-new(hero) {
|
|
257
|
+
object-fit: cover;
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
```javascript
|
|
262
|
+
document.startViewTransition(() => {
|
|
263
|
+
actualizarDOM();
|
|
264
|
+
});
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## Dark Mode — Patrón completo
|
|
270
|
+
|
|
271
|
+
```css
|
|
272
|
+
:root {
|
|
273
|
+
color-scheme: light dark;
|
|
274
|
+
|
|
275
|
+
--color-fondo: #ffffff;
|
|
276
|
+
--color-texto: #0f172a;
|
|
277
|
+
--color-borde: #e2e8f0;
|
|
278
|
+
--color-superficie: #f8fafc;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
@media (prefers-color-scheme: dark) {
|
|
282
|
+
:root {
|
|
283
|
+
--color-fondo: #0f172a;
|
|
284
|
+
--color-texto: #f1f5f9;
|
|
285
|
+
--color-borde: #1e293b;
|
|
286
|
+
--color-superficie: #1e293b;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* Con toggle manual */
|
|
291
|
+
[data-tema='claro'] { /* custom props de light */ }
|
|
292
|
+
[data-tema='oscuro'] { /* custom props de dark */ }
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Imágenes adaptadas
|
|
296
|
+
|
|
297
|
+
```css
|
|
298
|
+
.logo {
|
|
299
|
+
content: url('/logo-claro.svg');
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
@media (prefers-color-scheme: dark) {
|
|
303
|
+
.logo {
|
|
304
|
+
content: url('/logo-oscuro.svg');
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Anti-patrones extendidos
|
|
312
|
+
|
|
313
|
+
### Layout thrashing en JS
|
|
314
|
+
|
|
315
|
+
```javascript
|
|
316
|
+
// MAL: leer y escribir el DOM alternadamente
|
|
317
|
+
for (const el of elementos) {
|
|
318
|
+
const altura = el.offsetHeight;
|
|
319
|
+
el.style.height = (altura * 2) + 'px';
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// BIEN: separar lecturas de escrituras
|
|
323
|
+
const alturas = elementos.map(el => el.offsetHeight);
|
|
324
|
+
elementos.forEach((el, i) => {
|
|
325
|
+
el.style.height = (alturas[i] * 2) + 'px';
|
|
326
|
+
});
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Unidades fijas para tipografía
|
|
330
|
+
|
|
331
|
+
```css
|
|
332
|
+
/* MAL: ignora las preferencias de zoom del usuario */
|
|
333
|
+
body { font-size: 16px; }
|
|
334
|
+
|
|
335
|
+
/* BIEN: relativa a la preferencia del usuario */
|
|
336
|
+
body { font-size: 1rem; }
|
|
337
|
+
```
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: datos-etl
|
|
3
|
+
description: >
|
|
4
|
+
Ingeniería de datos y ETL: diseño de pipelines, calidad de datos, evolución de esquemas,
|
|
5
|
+
CDC (change data capture), validación de datos, linaje de datos, procesamiento batch vs
|
|
6
|
+
streaming, patrones dbt, patrones de data lake.
|
|
7
|
+
version: "1.0.0"
|
|
8
|
+
herramientasPermitidas: [Read, Grep]
|
|
9
|
+
evolvable: true # default para skill estandar
|
|
10
|
+
exclusiones:
|
|
11
|
+
- "No cargar para queries SQL de aplicación (ORM, endpoints de API) — para SQL de aplicación cargar `postgresql-experto` o `sql-optimizacion`."
|
|
12
|
+
- "No cargar para pipelines de ML/AI (feature engineering, entrenamiento de modelos) — este skill cubre ingeniería de datos operacional, no MLOps."
|
|
13
|
+
- "No cargar para migraciones de esquema de base de datos de aplicación (Alembic, Flyway) — para migraciones cargar `postgresql-experto` o `deprecacion-migracion`."
|
|
14
|
+
- "No cargar para arquitectura de microservicios con mensajería (Kafka, RabbitMQ como event bus) — para event-driven cargar `event-driven`."
|
|
15
|
+
---
|
|
16
|
+
# Ingeniería de Datos y ETL — Guía de Producción
|
|
17
|
+
|
|
18
|
+
## Cuándo NO cargar
|
|
19
|
+
|
|
20
|
+
- La tarea es queries SQL para endpoints de aplicación (ORM, reportes ad-hoc): cargar `postgresql-experto` o `sql-optimizacion`.
|
|
21
|
+
- El pipeline es de ML/AI (feature engineering, entrenamiento, serving de modelos): este skill cubre datos operacionales, no MLOps.
|
|
22
|
+
- La tarea es migración de esquema de base de datos de aplicación (Alembic, Flyway): cargar `postgresql-experto` o `deprecacion-migracion`.
|
|
23
|
+
- El uso de Kafka/RabbitMQ es como event bus de microservicios, no como ingesta de datos: cargar `event-driven`.
|
|
24
|
+
|
|
25
|
+
## Principios Fundamentales
|
|
26
|
+
|
|
27
|
+
Un pipeline de datos es software de producción: necesita tests, monitoreo, versioning y manejo de errores.
|
|
28
|
+
|
|
29
|
+
**Reglas de oro:**
|
|
30
|
+
1. Los pipelines fallan de forma predecible: idempotencia es obligatoria.
|
|
31
|
+
2. Un dato sin linaje es un dato sin confianza.
|
|
32
|
+
3. La calidad de datos se valida en la entrada, no al final.
|
|
33
|
+
4. Schema-on-write para datos de alta integridad; schema-on-read sólo para exploración.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Diseño de Pipelines — Estructura por Capas (Medallion)
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Fuentes Bronze (raw) Silver (limpio) Gold (negocio)
|
|
41
|
+
───────── → ──────────── → ──────────────── → ──────────────
|
|
42
|
+
CRM Replica 1:1 Deduplicado KPIs diarios
|
|
43
|
+
ERP Sin transforms Normalizado Reportes
|
|
44
|
+
APIs Auditado Validado ML features
|
|
45
|
+
Archivos Inmutable Enriquecido Dashboards
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Bronze es SIEMPRE inmutable
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
class IngestionBronze:
|
|
52
|
+
def ingestar(self, fuente: str, datos: list[dict]) -> str:
|
|
53
|
+
ahora = datetime.now(timezone.utc)
|
|
54
|
+
ruta = (
|
|
55
|
+
f"bronze/{fuente}/"
|
|
56
|
+
f"anio={ahora.year}/mes={ahora.month:02d}/dia={ahora.day:02d}/"
|
|
57
|
+
f"{ahora.isoformat()}.parquet"
|
|
58
|
+
)
|
|
59
|
+
df = pd.DataFrame(datos)
|
|
60
|
+
df["_ingestado_en"] = ahora.isoformat()
|
|
61
|
+
df["_fuente"] = fuente
|
|
62
|
+
df.to_parquet(ruta, compression="snappy", index=False)
|
|
63
|
+
return ruta
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Idempotencia en Pipelines
|
|
69
|
+
|
|
70
|
+
NUNCA insertar sin deduplicación. Usar patrón DELETE+INSERT por partición:
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
def procesar_pedidos(fecha: date) -> None:
|
|
74
|
+
"""Idempotente: ejecutar múltiples veces produce el mismo resultado."""
|
|
75
|
+
pedidos = extraer_pedidos(fecha)
|
|
76
|
+
pedidos_transformados = [transformar(p) for p in pedidos]
|
|
77
|
+
|
|
78
|
+
with destino.transaccion() as tx:
|
|
79
|
+
tx.execute(
|
|
80
|
+
"DELETE FROM silver.pedidos WHERE fecha_pedido = :fecha",
|
|
81
|
+
{"fecha": fecha},
|
|
82
|
+
)
|
|
83
|
+
tx.insertar_lote("silver.pedidos", pedidos_transformados)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Batch vs Streaming — Cuándo Usar Cada Uno
|
|
89
|
+
|
|
90
|
+
| Criterio | Batch | Streaming |
|
|
91
|
+
|----------|-------|-----------|
|
|
92
|
+
| Latencia aceptable | > 1 minuto | < 1 minuto |
|
|
93
|
+
| Volumen por ejecución | GB a TB | KB a MB por evento |
|
|
94
|
+
| Complejidad de estado | Baja | Alta (windows, joins) |
|
|
95
|
+
| Tolerancia a fallos | Reintentar batch completo | At-least-once / exactly-once |
|
|
96
|
+
| Costo infraestructura | Bajo (periódico) | Alto (siempre activo) |
|
|
97
|
+
| Casos de uso | Reportes nocturnos, ETL histórico | Alertas, fraude, dashboards live |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Implementaciones Completas
|
|
102
|
+
|
|
103
|
+
Para validación con Great Expectations, CDC con Debezium (Kafka), evolución de
|
|
104
|
+
esquemas (Avro), patrones dbt (modelos incrementales), y linaje de datos, ver
|
|
105
|
+
[recursos/implementaciones-completas.md](recursos/implementaciones-completas.md).
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Checklist de Revisión — ETL y Datos
|
|
110
|
+
|
|
111
|
+
- [ ] Todo pipeline es idempotente: re-ejecutar produce el mismo resultado.
|
|
112
|
+
- [ ] La capa Bronze es inmutable y no se modifica tras la ingesta.
|
|
113
|
+
- [ ] Las validaciones de calidad de datos ocurren ANTES de cargar a Silver.
|
|
114
|
+
- [ ] Los esquemas nuevos son backward-compatible (campos nuevos con default o nullable).
|
|
115
|
+
- [ ] El linaje está registrado para cada transformación (origen, destino, conteos).
|
|
116
|
+
- [ ] Los pipelines tienen tests unitarios para las funciones de transformación.
|
|
117
|
+
- [ ] Los errores de registro individual van a DLQ, no detienen el pipeline completo.
|
|
118
|
+
- [ ] Las métricas de calidad (% rechazados, % nulos) se exponen a Grafana/Prometheus.
|
|
119
|
+
- [ ] Los modelos dbt tienen tests de `not_null`, `unique` y `accepted_values` en columnas clave.
|
|
120
|
+
|
|
121
|
+
## Gotchas / Errores comunes no obvios
|
|
122
|
+
|
|
123
|
+
**Pipeline idempotente con `DELETE + INSERT` falla silenciosamente cuando la partición es incorrecta**: si el `DELETE` usa una cláusula `WHERE fecha_pedido = :fecha` pero los datos tienen timestamps con zona horaria y la comparación trunca la hora, el DELETE borra más registros de los esperados (o ninguno). Causa: la idempotencia depende de que el predicado del DELETE sea exactamente el mismo que identifica los datos del INSERT. Fix: verificar que la columna de partición tiene el mismo tipo y granularidad en fuente y destino. Para columnas con timestamp, usar `DATE_TRUNC('day', timestamp_col)` explícitamente en ambos lados.
|
|
124
|
+
|
|
125
|
+
**La capa Bronze "inmutable" se modifica porque el mismo script de ingesta sobreescribe el archivo Parquet existente**: el script usa `df.to_parquet(ruta)` donde `ruta` incluye la fecha pero no la hora — si se ejecuta dos veces el mismo día, sobrescribe la ingesta anterior. Causa: la "inmutabilidad" de Bronze depende de que las rutas incluyan suficiente granularidad temporal para ser únicas por ejecución. Fix: incluir el timestamp ISO completo (con hora y minutos) en la ruta de Bronze: `f"bronze/{fuente}/{ahora.isoformat()}.parquet"`. Si se necesita reejecutar, crear una nueva partición con sufijo `_rerun_N`.
|
|
126
|
+
|
|
127
|
+
**Validación con Great Expectations pasa en staging pero falla en producción con el mismo schema**: los expectations se definen sobre una muestra de datos de staging que puede no tener todos los valores posibles del dominio. Causa: un expectation de tipo `expect_column_values_to_be_in_set(["A","B","C"])` falla en producción cuando aparece un valor "D" válido que no existía en el sample de staging. Fix: para columnas con dominio abierto, usar `expect_column_values_to_not_be_null` en lugar de un set cerrado. Reservar sets cerrados solo para columnas con dominio verdaderamente finito y controlado (estados de máquina de estado, flags booleanos).
|
|
128
|
+
|
|
129
|
+
**El job de Spark/pandas falla en producción por OOM aunque funcionó bien en staging con datos de muestra**: el procesamiento en memoria de un DataFrame completo escala linealmente con el volumen de datos. En staging con 10K registros todo cabe en RAM; en producción con 10M registros el proceso muere. Causa: operaciones como `groupby + apply` con funciones Python puras no se pueden paralelizar ni distribuir automáticamente. Fix: para transformaciones sobre datasets grandes, usar procesamiento por chunks (`chunksize` en pandas) o migrar a Spark/DuckDB para operaciones distribuidas. Medir el uso de memoria en staging con el volumen máximo esperado en producción, no con la muestra de desarrollo.
|