@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,303 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orquestacion-async
|
|
3
|
+
description: >
|
|
4
|
+
Patrones de orquestación asíncrona para agentes: subagentes fire-and-forget,
|
|
5
|
+
gestión de tareas paralelas, corrección mid-task y supervisión no-bloqueante.
|
|
6
|
+
Basado en Deep Agents v0.5 (LangChain). Cargar cuando orquestador-swl necesite
|
|
7
|
+
ejecutar implementaciones en paralelo o gestionar agentes de larga duración.
|
|
8
|
+
version: "1.1.0"
|
|
9
|
+
evolved: true
|
|
10
|
+
evolved-from: "1.0.0"
|
|
11
|
+
evolved-at: "2026-04-24"
|
|
12
|
+
evolved-by: "aprender"
|
|
13
|
+
evolved-note: "Sección nueva: matriz agente × archivo con intersección vacía antes de lanzar paralelos"
|
|
14
|
+
herramientasPermitidas: [Read]
|
|
15
|
+
user-invocable: false
|
|
16
|
+
exclusiones:
|
|
17
|
+
- "No cargar para concurrencia Python pura con asyncio/aiohttp — si la tarea es I/O concurrente en código de aplicación (no orquestación de agentes SWL), cargar `async-python`."
|
|
18
|
+
- "No cargar para lanzar un solo agente secuencialmente — el overhead de las 5 herramientas de gestión solo vale si hay ≥2 agentes en paralelo o una tarea de larga duración que bloquea el supervisor."
|
|
19
|
+
- "No cargar para delegar un slice a un subagente sin necesidad de supervisión ni corrección mid-task — para delegación simple sin monitoreo, el orquestador puede invocar el agente directamente sin este patrón."
|
|
20
|
+
- "No cargar para pipelines de datos o ETL con pasos dependientes — los patrones fire-and-forget asumen independencia entre tareas; para pipelines ordenados con dependencias usar `datos-etl`."
|
|
21
|
+
evolvable: true # default para skill estandar
|
|
22
|
+
---
|
|
23
|
+
# Orquestación Asíncrona de Agentes
|
|
24
|
+
|
|
25
|
+
Patrones para supervisión no-bloqueante de subagentes, basados en Deep Agents v0.5
|
|
26
|
+
y adaptados al sistema de delegación de swl-ses.
|
|
27
|
+
|
|
28
|
+
## Cuándo NO cargar
|
|
29
|
+
|
|
30
|
+
- La tarea es concurrencia Python con asyncio/aiohttp (no agentes SWL) — cargar `async-python`.
|
|
31
|
+
- Se lanza un solo agente secuencialmente sin necesidad de supervisión — la delegación directa es más simple.
|
|
32
|
+
- El pipeline tiene pasos con dependencias ordenadas — para ETL con dependencias cargar `datos-etl`.
|
|
33
|
+
|
|
34
|
+
## Cuándo cargar
|
|
35
|
+
|
|
36
|
+
- `orquestador-swl` necesita lanzar múltiples implementaciones en paralelo
|
|
37
|
+
- Una tarea toma más de 3 minutos y bloquea la interacción con el usuario
|
|
38
|
+
- Se necesita corrección mid-task de un agente en ejecución
|
|
39
|
+
- Gestión de múltiples agentes concurrentes con diferentes prioridades
|
|
40
|
+
|
|
41
|
+
## Principio fundamental
|
|
42
|
+
|
|
43
|
+
> Un supervisor NUNCA debe bloquearse esperando a un subagente de larga duración.
|
|
44
|
+
> El supervisor debe poder: responder al usuario, lanzar más tareas, verificar
|
|
45
|
+
> progreso, y corregir el rumbo — todo mientras los subagentes trabajan.
|
|
46
|
+
|
|
47
|
+
## Patrón: 5 herramientas de gestión async
|
|
48
|
+
|
|
49
|
+
Inspirado en el modelo de Deep Agents v0.5:
|
|
50
|
+
|
|
51
|
+
### 1. `start_async_task` — Lanzar tarea
|
|
52
|
+
```
|
|
53
|
+
Entrada: { agente, prompt, prioridad, timeout }
|
|
54
|
+
Salida: { taskId, estado: "en_progreso" }
|
|
55
|
+
```
|
|
56
|
+
El supervisor recibe un ID de tarea inmediatamente y continúa operando.
|
|
57
|
+
|
|
58
|
+
### 2. `check_async_task` — Verificar estado
|
|
59
|
+
```
|
|
60
|
+
Entrada: { taskId }
|
|
61
|
+
Salida: { estado, progreso, resultado_parcial, errores }
|
|
62
|
+
```
|
|
63
|
+
Polling ligero — no bloquea, retorna estado actual.
|
|
64
|
+
|
|
65
|
+
### 3. `update_async_task` — Corrección mid-task
|
|
66
|
+
```
|
|
67
|
+
Entrada: { taskId, instrucciones_adicionales }
|
|
68
|
+
Salida: { aceptado: true/false }
|
|
69
|
+
```
|
|
70
|
+
Envía instrucciones de corrección al subagente en ejecución.
|
|
71
|
+
Solo funciona si el subagente está en estado "en_progreso".
|
|
72
|
+
|
|
73
|
+
### 4. `cancel_async_task` — Cancelar tarea
|
|
74
|
+
```
|
|
75
|
+
Entrada: { taskId, razon }
|
|
76
|
+
Salida: { cancelado: true, trabajo_parcial }
|
|
77
|
+
```
|
|
78
|
+
Cancela un subagente y recupera trabajo parcial.
|
|
79
|
+
|
|
80
|
+
### 5. `list_async_tasks` — Listar tareas
|
|
81
|
+
```
|
|
82
|
+
Entrada: { filtro_estado? }
|
|
83
|
+
Salida: [{ taskId, agente, estado, inicio, duracion }]
|
|
84
|
+
```
|
|
85
|
+
Vista general de todas las tareas gestionadas.
|
|
86
|
+
|
|
87
|
+
## Estados de una tarea async
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
┌─────────────┐
|
|
91
|
+
│ creada │
|
|
92
|
+
└──────┬──────┘
|
|
93
|
+
│ start
|
|
94
|
+
┌──────▼──────┐
|
|
95
|
+
┌───── │ en_progreso │ ─────┐
|
|
96
|
+
│ └──────┬──────┘ │
|
|
97
|
+
update│ │ │ cancel
|
|
98
|
+
│ ┌──────▼──────┐ │
|
|
99
|
+
└────► │ exitosa │ │
|
|
100
|
+
└─────────────┘ │
|
|
101
|
+
┌──────▼──────┐ │
|
|
102
|
+
│ fallida │ ◄────┘
|
|
103
|
+
└─────────────┘
|
|
104
|
+
┌─────────────┐
|
|
105
|
+
│ cancelada │
|
|
106
|
+
└─────────────┘
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Implementación en swl-ses
|
|
110
|
+
|
|
111
|
+
### Mapeo a herramientas existentes
|
|
112
|
+
|
|
113
|
+
| Herramienta async | Implementación swl-ses |
|
|
114
|
+
|-------------------|----------------------|
|
|
115
|
+
| `start_async_task` | `Agent()` con `run_in_background: true` |
|
|
116
|
+
| `check_async_task` | Verificar notificación de agente completado |
|
|
117
|
+
| `update_async_task` | `SendMessage` al agente con `to: agentId` |
|
|
118
|
+
| `cancel_async_task` | No disponible nativamente — requiere convención |
|
|
119
|
+
| `list_async_tasks` | `task-service.js` (hooks/lib/) |
|
|
120
|
+
|
|
121
|
+
### Patrón de uso en orquestador-swl
|
|
122
|
+
|
|
123
|
+
```markdown
|
|
124
|
+
## Fase de implementación paralela
|
|
125
|
+
|
|
126
|
+
1. Analizar el plan e identificar slices independientes
|
|
127
|
+
2. Para cada slice independiente:
|
|
128
|
+
- Lanzar Agent() con run_in_background: true
|
|
129
|
+
- Registrar taskId en task-service.js
|
|
130
|
+
3. Mientras los agentes trabajan:
|
|
131
|
+
- Responder al usuario sobre progreso
|
|
132
|
+
- Revisar resultados parciales si llegan notificaciones
|
|
133
|
+
- Lanzar nuevos agentes si hay más slices listos
|
|
134
|
+
4. Cuando todos completen:
|
|
135
|
+
- Verificar resultados con revisor-codigo-swl
|
|
136
|
+
- Resolver conflictos si dos agentes tocaron los mismos archivos
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Corrección mid-task
|
|
140
|
+
|
|
141
|
+
Cuando un agente en background necesita ajuste:
|
|
142
|
+
|
|
143
|
+
```markdown
|
|
144
|
+
1. Detectar desviación (por notificación o verificación manual)
|
|
145
|
+
2. Enviar SendMessage al agentId con instrucciones de corrección:
|
|
146
|
+
- "El endpoint cambió de /api/v1/users a /api/v2/users"
|
|
147
|
+
- "Usar SQLAlchemy async, no sync"
|
|
148
|
+
3. El agente recibe la corrección en su contexto y ajusta
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Resolución de conflictos
|
|
152
|
+
|
|
153
|
+
Cuando dos agentes modifican el mismo archivo:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
1. Detectar conflicto: edit-accumulator.js registra archivos tocados
|
|
157
|
+
2. Si hay solapamiento:
|
|
158
|
+
a. Revisar diffs de ambos agentes
|
|
159
|
+
b. Determinar si son complementarios o contradictorios
|
|
160
|
+
c. Complementarios → merge manual o automático
|
|
161
|
+
d. Contradictorios → escalar al usuario con ambas versiones
|
|
162
|
+
3. Nunca aplicar ciegamente el último cambio
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Límites y restricciones
|
|
166
|
+
|
|
167
|
+
### De swl-ses
|
|
168
|
+
- `MAX_DEPTH = 2` — Un agente puede delegar, pero el delegado no puede delegar
|
|
169
|
+
- `max_concurrent_children = 3` — Máximo 3 subagentes concurrentes (configurable)
|
|
170
|
+
- Agentes delegados NO escriben a memoria compartida (MEMORY.md)
|
|
171
|
+
- Agentes delegados NO interactúan con el usuario directamente
|
|
172
|
+
|
|
173
|
+
### Del runtime (Claude Code)
|
|
174
|
+
- Background agents notifican al completar — no hay polling periódico
|
|
175
|
+
- El contexto del agente padre no ve los tool calls internos del hijo
|
|
176
|
+
- SendMessage requiere el agentId exacto retornado por Agent()
|
|
177
|
+
|
|
178
|
+
## Escenarios de uso
|
|
179
|
+
|
|
180
|
+
### Escenario A: Feature con frontend + backend + tests
|
|
181
|
+
```
|
|
182
|
+
orquestador-swl:
|
|
183
|
+
1. Lanza backend-api-swl (Agent, background) → taskId_1
|
|
184
|
+
2. Lanza frontend-react-swl (Agent, background) → taskId_2
|
|
185
|
+
3. Espera notificaciones
|
|
186
|
+
4. Backend completa → lanza tdd-qa-swl para tests de API → taskId_3
|
|
187
|
+
5. Frontend completa → lanza tdd-qa-swl para tests de UI → taskId_4
|
|
188
|
+
6. Todos completan → revisor-codigo-swl verifica todo junto
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### Escenario B: Refactoring paralelo
|
|
192
|
+
```
|
|
193
|
+
orquestador-swl:
|
|
194
|
+
1. Divide módulos a refactorizar en grupos independientes
|
|
195
|
+
2. Lanza N agentes en paralelo (máx 3)
|
|
196
|
+
3. Cuando completa un grupo → verifica y lanza el siguiente
|
|
197
|
+
4. Al final → merge + test completo
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Escenario C: Investigación + implementación
|
|
201
|
+
```
|
|
202
|
+
orquestador-swl:
|
|
203
|
+
1. Lanza investigador-swl (background) para research
|
|
204
|
+
2. Mientras, prepara scaffold básico directamente
|
|
205
|
+
3. Investigador completa → lee resultados
|
|
206
|
+
4. Lanza implementador-swl con contexto del research
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Métricas de eficiencia
|
|
210
|
+
|
|
211
|
+
| Métrica | Fórmula | Objetivo |
|
|
212
|
+
|---------|---------|----------|
|
|
213
|
+
| Paralelismo efectivo | Tiempo secuencial / Tiempo real | ≥ 2.0x |
|
|
214
|
+
| Conflictos por tarea | Archivos con conflicto / Total archivos | ≤ 5% |
|
|
215
|
+
| Reintentos por corrección | Correcciones mid-task / Total tareas | ≤ 20% |
|
|
216
|
+
| Overhead de orquestación | Tokens orquestador / Tokens total | ≤ 15% |
|
|
217
|
+
|
|
218
|
+
## Gotchas / Errores comunes no obvios
|
|
219
|
+
|
|
220
|
+
- **`check_task_status` retorna `completada` pero el archivo generado por el subagente no existe en disco**: el subagente reportó éxito pero terminó antes de escribir el archivo por una excepción silenciada. Causa: el estado `completada` en el patrón de 5 herramientas refleja que el subagente terminó su ejecución sin lanzar excepción al supervisor — si el error fue interno y capturado silenciosamente, el output no existe aunque el estado sea correcto. Solución: la herramienta `get_task_result` debe verificar explícitamente que los artefactos de output existen antes de reportar `completada`; agregar validación de postcondición: `assert Path(archivo_esperado).exists()`.
|
|
221
|
+
- **Lanzar 8 subagentes en paralelo con `start_async_task` sin semáforo consume el presupuesto de tokens del orquestador en segundos**: cada invocación de subagente consume el contexto del orquestador mientras espera resultados de todos ellos. Causa: el patrón fire-and-forget no limita la concurrencia — 8 agentes en paralelo pueden disparar 8× el costo esperado si el supervisor los monitorea activamente. Solución: limitar con un semáforo de concurrencia máxima de 3-4 agentes simultáneos, y usar `check_task_status` con backoff para no encuestar continuamente.
|
|
222
|
+
- **Corrección mid-task con `modify_task_prompt` produce un subagente que ignora la corrección y continúa con el plan original**: el subagente ya tiene el plan congelado en su contexto y la corrección llega como un mensaje adicional que no modifica el plan original. Causa: `modify_task_prompt` agrega instrucciones al contexto del agente pero si el plan ya está en ejecución, el subagente puede priorizarlo sobre las instrucciones nuevas. Solución: la corrección mid-task debe ser explícita sobre qué cambiar: en lugar de agregar "también haz X", indicar "STOP el paso actual, cambia a Y" con autoridad clara sobre el paso en conflicto.
|
|
223
|
+
- **`cancel_task` no libera los archivos que el subagente dejó en estado parcial**: cancelar una tarea detiene el agente pero los archivos que ya escribió permanecen con contenido incompleto. Causa: el patrón de cancelación no tiene rollback de los artefactos ya generados — solo detiene la ejecución futura. Solución: antes de `cancel_task`, registrar los archivos que el subagente está modificando (via `check_task_status` que devuelve `archivos_en_progreso`), y después de la cancelación, revertir esos archivos con `git checkout -- archivos` si el trabajo no es recuperable.
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Matriz agente × archivo: partición explícita antes de lanzar paralelos
|
|
228
|
+
|
|
229
|
+
### Regla
|
|
230
|
+
|
|
231
|
+
Antes de lanzar **N agentes en paralelo** que modifican archivos, producir una
|
|
232
|
+
**matriz explícita** agente × archivo con **intersección vacía** entre filas.
|
|
233
|
+
Un archivo compartido por 2 agentes paralelos produce merge silencioso
|
|
234
|
+
impredecible: el último write gana, sin detección ni log.
|
|
235
|
+
|
|
236
|
+
### Por qué
|
|
237
|
+
|
|
238
|
+
Los agentes fire-and-forget no tienen coordinación entre sí. Si el agente A
|
|
239
|
+
está editando `core/service.py` y el agente B también, la secuencia real es:
|
|
240
|
+
|
|
241
|
+
1. A lee versión V0, piensa, escribe V1.
|
|
242
|
+
2. B lee versión V0 (no V1), piensa, escribe V2.
|
|
243
|
+
3. Resultado: los cambios de A desaparecen. Git no muestra conflicto porque
|
|
244
|
+
B ya "reconcilió" en su cabeza el archivo.
|
|
245
|
+
|
|
246
|
+
El patrón no se detecta por tests unitarios aislados. Solo se observa al leer
|
|
247
|
+
el diff final contra lo esperado — y suele descubrirse horas después.
|
|
248
|
+
|
|
249
|
+
### Patrón canónico: matriz explícita pre-lanzamiento
|
|
250
|
+
|
|
251
|
+
```markdown
|
|
252
|
+
## Matriz de partición — Sprint X
|
|
253
|
+
|
|
254
|
+
| Agente | Archivos (exclusivos) |
|
|
255
|
+
|--------|----------------------|
|
|
256
|
+
| backend-python-swl | api/routers/emaia.py, core/service_usuarios.py |
|
|
257
|
+
| frontend-react-swl | ui/pages/usuarios.tsx, ui/components/FormUsuario.tsx |
|
|
258
|
+
| datos-swl | core/db/models.py, alembic/versions/00XX_usuarios.py |
|
|
259
|
+
| tdd-qa-swl | tests/integration/test_usuarios.py (solo lectura en el resto) |
|
|
260
|
+
|
|
261
|
+
Verificación: intersección de archivos entre filas = ∅.
|
|
262
|
+
Archivos no listados: NO se tocan en este sprint.
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Protocolo operativo
|
|
266
|
+
|
|
267
|
+
1. **Antes de invocar agentes en paralelo**, el orquestador escribe la matriz
|
|
268
|
+
en `.planning/sprint-X/matriz-agentes.md` o equivalente.
|
|
269
|
+
2. **Cada agente delegado recibe explícitamente** su lista de archivos en
|
|
270
|
+
el prompt de delegación: `"Tus archivos asignados son X, Y, Z. No tocar
|
|
271
|
+
ningún otro archivo sin escalar al orquestador."`.
|
|
272
|
+
3. **Si un agente necesita tocar un archivo no asignado**, debe escalar
|
|
273
|
+
(pausar y reportar), no tomar decisión unilateral.
|
|
274
|
+
4. **Post-ejecución**: verificar que el diff de cada agente está contenido
|
|
275
|
+
en sus archivos asignados. Un agente que tocó un archivo ajeno es señal
|
|
276
|
+
de drift del scope y debe revertirse.
|
|
277
|
+
|
|
278
|
+
### Casos donde NO aplica
|
|
279
|
+
|
|
280
|
+
- **Tareas de un solo agente** (serial): la matriz es innecesaria.
|
|
281
|
+
- **Lecturas sin writes**: múltiples agentes pueden leer el mismo archivo
|
|
282
|
+
en paralelo sin riesgo; la matriz aplica a writes.
|
|
283
|
+
- **Archivos append-only con locking** (JSONL con `fs.appendFileSync`):
|
|
284
|
+
los appends atómicos no se pisan. Documentar explícitamente estos casos.
|
|
285
|
+
|
|
286
|
+
### Anti-patrón
|
|
287
|
+
|
|
288
|
+
```markdown
|
|
289
|
+
# MAL — delegación sin partición
|
|
290
|
+
"Lanzar backend-python-swl, frontend-react-swl y datos-swl en paralelo
|
|
291
|
+
para implementar la feature X."
|
|
292
|
+
|
|
293
|
+
# Cada agente descubre por sí mismo qué archivos toca. Garantizado:
|
|
294
|
+
# los 3 tocan `core/schemas.py` porque todos necesitan el tipo Usuario.
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Relacionado
|
|
298
|
+
|
|
299
|
+
- `checkpoints-verificacion` — cómo pausar agentes en checkpoints HITL.
|
|
300
|
+
- `git-worktrees-paralelo` — aislamiento físico con worktrees cuando la
|
|
301
|
+
matriz no se puede diseñar con intersección vacía.
|
|
302
|
+
- Regla en CLAUDE.md: "Matriz agente × archivo antes de lanzar paralelos
|
|
303
|
+
N≥3" — consolidar como regla del proyecto si el patrón se repite.
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: paid-media-tracking
|
|
3
|
+
description: >
|
|
4
|
+
Implementación técnica de herramientas para campañas de publicidad pagada:
|
|
5
|
+
Google Ads API, análisis de search terms, conversión tracking server-side,
|
|
6
|
+
auditoría de cuentas programática y dashboards de rendimiento. Cargar cuando
|
|
7
|
+
se construya una integración con Google Ads API, se implemente análisis
|
|
8
|
+
automático de search terms, se diseñe un sistema de medición de ROAS,
|
|
9
|
+
o se audite la implementación técnica de conversión tracking.
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
herramientasPermitidas: [Read]
|
|
12
|
+
evolvable: true # default para skill estandar
|
|
13
|
+
exclusiones:
|
|
14
|
+
- "No cargar para tracking de conversiones en el browser o server-side con GTM, GA4, Meta CAPI — para implementación de tracking web cargar `tracking-measurement`."
|
|
15
|
+
- "No cargar para estrategia de pujas, definición de presupuesto o copy de anuncios — esas son decisiones de negocio y marketing, no técnicas."
|
|
16
|
+
- "No cargar para integraciones con plataformas distintas a Google Ads (Meta Ads, TikTok Ads, LinkedIn Ads) sin relación con la API de Google — para otras plataformas usar el SDK correspondiente."
|
|
17
|
+
- "No cargar para dashboards de métricas generales de negocio sin datos de Google Ads — para dashboards de observabilidad de sistemas cargar `monitoring-alertas`."
|
|
18
|
+
---
|
|
19
|
+
# paid-media-tracking — Herramientas técnicas para publicidad pagada
|
|
20
|
+
|
|
21
|
+
## Cuándo NO cargar
|
|
22
|
+
|
|
23
|
+
- La tarea es tracking de conversiones en el browser o server-side (GTM, GA4, Meta CAPI): cargar `tracking-measurement`.
|
|
24
|
+
- La tarea es estrategia de pujas, presupuesto o copy de anuncios: son decisiones de negocio, no de ingeniería.
|
|
25
|
+
- La integración es con Meta Ads, TikTok Ads o LinkedIn Ads sin relación con Google Ads API: usar el SDK del proveedor.
|
|
26
|
+
- La tarea es un dashboard de métricas generales de negocio sin datos específicos de Google Ads: cargar `monitoring-alertas`.
|
|
27
|
+
|
|
28
|
+
## Cuándo cargar este skill
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
✅ Construir reportes automáticos de Google Ads (Python, Node)
|
|
32
|
+
✅ Implementar un sistema de alertas sobre rendimiento de campañas
|
|
33
|
+
✅ Integrar Google Ads API con un CRM o backend
|
|
34
|
+
✅ Diseñar el schema de dataLayer para campañas de e-commerce
|
|
35
|
+
✅ Construir un dashboard de ROAS con datos de la API
|
|
36
|
+
✅ Automatizar la gestión de negative keywords programáticamente
|
|
37
|
+
✅ Implementar auditoría técnica de cuentas Google Ads
|
|
38
|
+
❌ Definir estrategia de pujas (es trabajo del PPC strategist, no del ingeniero)
|
|
39
|
+
❌ Crear copys de anuncios (creativo, no técnico)
|
|
40
|
+
❌ Tomar decisiones de presupuesto (decisión de negocio)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
> Para tracking de conversiones browser/server-side (GTM, GA4, Meta CAPI),
|
|
44
|
+
> cargar `Skill("tracking-measurement")` en su lugar o en paralelo.
|
|
45
|
+
|
|
46
|
+
## Conceptos clave
|
|
47
|
+
|
|
48
|
+
- **ROAS** (Return on Ad Spend): `valor_conversiones / costo`. Métrica primaria de rentabilidad de campañas.
|
|
49
|
+
- **Micros**: Google Ads almacena costos en micros (millonésimas). `cost_micros / 1_000_000` = valor real.
|
|
50
|
+
- **GAQL**: Google Ads Query Language. SQL-like para consultar la API. Recursos, segmentos y métricas tienen nombres específicos.
|
|
51
|
+
- **MCC** (Manager Customer Center): cuenta paraguas que agrupa sub-cuentas. El `login_customer_id` debe apuntar al MCC.
|
|
52
|
+
- **Search Term View**: recurso de la API que expone los términos exactos que activaron los anuncios — diferente a las keywords configuradas.
|
|
53
|
+
|
|
54
|
+
## Reglas obligatorias
|
|
55
|
+
|
|
56
|
+
### Regla 1 — Siempre dividir `cost_micros` entre 1,000,000
|
|
57
|
+
|
|
58
|
+
Google Ads devuelve todos los costos en micros. Operar con micros produce
|
|
59
|
+
cifras de ROAS, CPA y presupuesto completamente erróneas.
|
|
60
|
+
|
|
61
|
+
```python
|
|
62
|
+
# MAL — opera con micros directamente
|
|
63
|
+
roas = conversiones_valor / row.metrics.cost_micros
|
|
64
|
+
|
|
65
|
+
# BIEN — convierte primero
|
|
66
|
+
costo = row.metrics.cost_micros / 1_000_000
|
|
67
|
+
roas = conversiones_valor / costo if costo > 0 else 0
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Verificación**: El costo de una campaña típica en MXN debe estar en
|
|
71
|
+
el rango de decenas a miles, nunca en millones.
|
|
72
|
+
|
|
73
|
+
### Regla 2 — Manejar `GoogleAdsException` siempre
|
|
74
|
+
|
|
75
|
+
La API devuelve errores granulares por campo y operación. Un `except Exception`
|
|
76
|
+
silencia información crítica (quota excedida, permiso denegado, ID inválido).
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
from google.ads.googleads.errors import GoogleAdsException
|
|
80
|
+
|
|
81
|
+
try:
|
|
82
|
+
response = ga_service.search(customer_id=customer_id, query=query)
|
|
83
|
+
except GoogleAdsException as ex:
|
|
84
|
+
for error in ex.failure.errors:
|
|
85
|
+
logger.error(
|
|
86
|
+
"Error Google Ads [%s]: %s",
|
|
87
|
+
error.error_code,
|
|
88
|
+
error.message,
|
|
89
|
+
)
|
|
90
|
+
raise
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Verificación**: Los logs deben mostrar `error_code` y `message` específicos,
|
|
94
|
+
no solo el texto genérico de la excepción.
|
|
95
|
+
|
|
96
|
+
### Regla 3 — `customer_id` sin guiones
|
|
97
|
+
|
|
98
|
+
La Google Ads API rechaza el formato `123-456-7890`. El formato correcto es
|
|
99
|
+
la cadena de dígitos sin guiones: `"1234567890"`.
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
# MAL
|
|
103
|
+
customer_id = "123-456-7890"
|
|
104
|
+
|
|
105
|
+
# BIEN
|
|
106
|
+
customer_id = "1234567890"
|
|
107
|
+
# O limpiar al recibir del usuario:
|
|
108
|
+
customer_id = customer_id.replace("-", "")
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Verificación**: Un `INVALID_CUSTOMER_ID` en los logs indica este problema.
|
|
112
|
+
|
|
113
|
+
### Regla 4 — Nunca hardcodear credenciales de la API
|
|
114
|
+
|
|
115
|
+
`developer_token`, `refresh_token` y `client_secret` son credenciales de
|
|
116
|
+
producción. Van en variables de entorno o en un gestor de secretos.
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
# MAL
|
|
120
|
+
client = GoogleAdsClient.load_from_dict({
|
|
121
|
+
"developer_token": "ABcDeFgHiJkLmNoPq",
|
|
122
|
+
"refresh_token": "1//0gXyz...",
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
# BIEN
|
|
126
|
+
client = GoogleAdsClient.load_from_dict({
|
|
127
|
+
"developer_token": settings.GOOGLE_ADS_DEVELOPER_TOKEN,
|
|
128
|
+
"client_id": settings.GOOGLE_ADS_CLIENT_ID,
|
|
129
|
+
"client_secret": settings.GOOGLE_ADS_CLIENT_SECRET,
|
|
130
|
+
"refresh_token": settings.GOOGLE_ADS_REFRESH_TOKEN,
|
|
131
|
+
"login_customer_id": settings.GOOGLE_ADS_MCC_ID,
|
|
132
|
+
})
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Regla 5 — Cachear respuestas de la API al menos 1 hora
|
|
136
|
+
|
|
137
|
+
La API tiene quota diaria limitada (1,000 operaciones/día en nivel básico).
|
|
138
|
+
Llamar la API en cada request HTTP agota la quota en minutos con tráfico real.
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
from functools import lru_cache
|
|
142
|
+
import time
|
|
143
|
+
|
|
144
|
+
_cache: dict = {}
|
|
145
|
+
_TTL = 3600 # 1 hora
|
|
146
|
+
|
|
147
|
+
def obtener_con_cache(clave: str, fn_obtener):
|
|
148
|
+
"""Caché simple con TTL para respuestas de Google Ads API."""
|
|
149
|
+
ahora = time.time()
|
|
150
|
+
if clave in _cache and (ahora - _cache[clave]["ts"]) < _TTL:
|
|
151
|
+
return _cache[clave]["data"]
|
|
152
|
+
datos = fn_obtener()
|
|
153
|
+
_cache[clave] = {"data": datos, "ts": ahora}
|
|
154
|
+
return datos
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Google Ads API — cliente Python
|
|
158
|
+
|
|
159
|
+
```python
|
|
160
|
+
from google.ads.googleads.client import GoogleAdsClient
|
|
161
|
+
from google.ads.googleads.errors import GoogleAdsException
|
|
162
|
+
|
|
163
|
+
client = GoogleAdsClient.load_from_dict({
|
|
164
|
+
"developer_token": settings.GOOGLE_ADS_DEVELOPER_TOKEN,
|
|
165
|
+
"client_id": settings.GOOGLE_ADS_CLIENT_ID,
|
|
166
|
+
"client_secret": settings.GOOGLE_ADS_CLIENT_SECRET,
|
|
167
|
+
"refresh_token": settings.GOOGLE_ADS_REFRESH_TOKEN,
|
|
168
|
+
"login_customer_id": settings.GOOGLE_ADS_MCC_ID,
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
def obtener_rendimiento_campanas(customer_id: str, dias: int = 30) -> list[dict]:
|
|
172
|
+
"""Obtiene métricas de rendimiento de campañas de los últimos N días."""
|
|
173
|
+
ga_service = client.get_service("GoogleAdsService")
|
|
174
|
+
|
|
175
|
+
query = f"""
|
|
176
|
+
SELECT
|
|
177
|
+
campaign.id,
|
|
178
|
+
campaign.name,
|
|
179
|
+
campaign.status,
|
|
180
|
+
metrics.impressions,
|
|
181
|
+
metrics.clicks,
|
|
182
|
+
metrics.conversions,
|
|
183
|
+
metrics.cost_micros,
|
|
184
|
+
metrics.conversions_value
|
|
185
|
+
FROM campaign
|
|
186
|
+
WHERE segments.date DURING LAST_{dias}_DAYS
|
|
187
|
+
AND campaign.status = 'ENABLED'
|
|
188
|
+
ORDER BY metrics.cost_micros DESC
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
try:
|
|
192
|
+
response = ga_service.search(customer_id=customer_id, query=query)
|
|
193
|
+
resultados = []
|
|
194
|
+
for row in response:
|
|
195
|
+
costo = row.metrics.cost_micros / 1_000_000
|
|
196
|
+
roas = (row.metrics.conversions_value / costo) if costo > 0 else 0
|
|
197
|
+
|
|
198
|
+
resultados.append({
|
|
199
|
+
"id": str(row.campaign.id),
|
|
200
|
+
"nombre": row.campaign.name,
|
|
201
|
+
"impresiones": row.metrics.impressions,
|
|
202
|
+
"clicks": row.metrics.clicks,
|
|
203
|
+
"conversiones": row.metrics.conversions,
|
|
204
|
+
"costo": round(costo, 2),
|
|
205
|
+
"roas": round(roas, 2),
|
|
206
|
+
})
|
|
207
|
+
return resultados
|
|
208
|
+
|
|
209
|
+
except GoogleAdsException as ex:
|
|
210
|
+
for error in ex.failure.errors:
|
|
211
|
+
raise ValueError(f"Error Google Ads: {error.message}") from ex
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
## Análisis de search terms para detección de desperdicio
|
|
215
|
+
|
|
216
|
+
Consultar la implementación completa de `analizar_search_terms` en
|
|
217
|
+
[recursos/auditoria-tracking.md](recursos/auditoria-tracking.md).
|
|
218
|
+
|
|
219
|
+
Patrón de detección de desperdicio: si `costo > 50` y `conversiones == 0`,
|
|
220
|
+
el término es candidato a negative keyword. Analizar bigramas y trigramas
|
|
221
|
+
(n=2 y n=3) sobre el vocabulario de search terms para encontrar patrones
|
|
222
|
+
de términos irrelevantes frecuentes.
|
|
223
|
+
|
|
224
|
+
## Detección de discrepancias entre plataformas
|
|
225
|
+
|
|
226
|
+
Consultar la función `ejecutar_auditoria_completa` en
|
|
227
|
+
[recursos/auditoria-tracking.md](recursos/auditoria-tracking.md).
|
|
228
|
+
|
|
229
|
+
Umbral aceptable: discrepancia < 15% entre Google Ads y GA4.
|
|
230
|
+
Causas frecuentes: ventanas de conversión distintas, modelos de atribución
|
|
231
|
+
diferentes (last-click vs data-driven), o conversiones offline no importadas.
|
|
232
|
+
|
|
233
|
+
## Anti-patrones críticos
|
|
234
|
+
|
|
235
|
+
| Anti-patrón | Problema | Solución |
|
|
236
|
+
|-------------|----------|----------|
|
|
237
|
+
| Operar con `cost_micros` sin convertir | ROAS y CPA erróneos por factor 1,000,000 | Dividir siempre entre `1_000_000` |
|
|
238
|
+
| `customer_id` con guiones `123-456-7890` | `INVALID_CUSTOMER_ID` de la API | `customer_id.replace("-", "")` |
|
|
239
|
+
| Llamar la API en cada request HTTP | Quota agotada en minutos | Caché con TTL de 1 hora mínimo |
|
|
240
|
+
| Credenciales en código fuente | Exposición en repositorio | Variables de entorno obligatorias |
|
|
241
|
+
| Filtrar sin considerar `campaign.status` | `PAUSED`/`REMOVED` contaminan reportes activos | Filtro explícito por status en GAQL |
|
|
242
|
+
| Usar `login_customer_id` de sub-cuenta en MCC | Accede a cuenta incorrecta o da error de permisos | Siempre el ID del MCC para cuentas administradas |
|
|
243
|
+
|
|
244
|
+
## Checklist de verificación
|
|
245
|
+
|
|
246
|
+
- [ ] `cost_micros` se divide entre `1_000_000` antes de cualquier operación aritmética
|
|
247
|
+
- [ ] `GoogleAdsException` capturada con iteración sobre `ex.failure.errors`
|
|
248
|
+
- [ ] `customer_id` sin guiones antes de llamar a la API
|
|
249
|
+
- [ ] Credenciales en variables de entorno (`settings.*`), no hardcodeadas
|
|
250
|
+
- [ ] Respuestas de la API con caché de al menos 1 hora
|
|
251
|
+
- [ ] Filtro de `campaign.status` en todas las queries de campañas activas
|
|
252
|
+
- [ ] `search_stream` usado para queries que puedan devolver >10,000 filas
|
|
253
|
+
|
|
254
|
+
## Referencias a recursos
|
|
255
|
+
|
|
256
|
+
| Tema | Archivo |
|
|
257
|
+
|------|---------|
|
|
258
|
+
| Google Ads API: autenticación, quota, GAQL avanzado, batch operations | [recursos/google-ads-api.md](recursos/google-ads-api.md) |
|
|
259
|
+
| Auditoría técnica: checklist de cuenta, métricas de calidad, reporte Python | [recursos/auditoria-tracking.md](recursos/auditoria-tracking.md) |
|
|
260
|
+
|
|
261
|
+
## Gotchas / Errores comunes no obvios
|
|
262
|
+
|
|
263
|
+
**La GAQL query con `WHERE segments.date DURING LAST_30_DAYS` incluye el día actual con datos parciales, inflando el conteo de conversiones del período**: si se corre el reporte a las 10 AM, el día de hoy tiene solo 10 horas de datos pero se incluye en el agregado de 30 días como si fuera un día completo. Para comparativas de períodos (mes actual vs mes anterior), esto produce distorsión. Causa: `LAST_N_DAYS` incluye el día actual con datos hasta el momento de la query. Fix: usar `BETWEEN YYYY-MM-DD AND YYYY-MM-DD` con fechas explícitas excluyendo el día actual, calculadas en Python: `fecha_fin = datetime.today() - timedelta(days=1)`.
|
|
264
|
+
|
|
265
|
+
**El `login_customer_id` correcto para MCC es el ID de la cuenta administradora, pero las queries retornan datos de TODAS las sub-cuentas mezclados si no se especifica `customer_id` por sub-cuenta**: si el MCC administra 50 cuentas y se hace una query de campañas sin filtrar por `customer_id`, la API devuelve campañas de todas las sub-cuentas con los mismos nombres, haciendo imposible distinguir a qué cuenta pertenece cada fila. Causa: el `login_customer_id` habilita el acceso al MCC pero `customer_id` en `search()` determina el scope. Fix: iterar sobre los sub-`customer_id` obtenidos de `CustomerService` y hacer una query por cuenta, o usar el campo `customer.id` en el `SELECT` de GAQL para incluir el ID de cuenta en cada fila del resultado.
|
|
266
|
+
|
|
267
|
+
**`search_stream` no puede usarse con queries que incluyen `ORDER BY` porque la API de streaming no garantiza orden y lanza `STREAMING_NOT_SUPPORTED_FOR_SORTED_QUERIES`**: al migrar de `search()` a `search_stream()` para manejar resultados grandes, las queries con `ORDER BY metrics.cost_micros DESC` fallan con un error poco descriptivo. Causa: el streaming de Google Ads API envía filas en el orden de procesamiento interno del servidor, no en el orden especificado. Fix: usar `search()` con paginación para queries ordenadas, y `search_stream()` solo para queries sin `ORDER BY`. Si se necesita orden + volumen grande, hacer el sort en Python después de recibir todos los resultados.
|
|
268
|
+
|
|
269
|
+
**Las conversiones de Google Ads tienen una ventana de atribución de 30-90 días, por lo que los datos de ROAS de los últimos 7 días siguen cambiando durante semanas después**: un reporte ejecutado el lunes puede mostrar ROAS de 2.1 para la semana anterior, pero el mismo período consultado 3 semanas después puede mostrar ROAS de 2.8 porque se atribuyeron conversiones tardías. Causa: la API devuelve los datos con las conversiones atribuidas hasta el momento de la query, no las del período. Fix: para reportes comparativos históricos, documentar la fecha de extracción y no comparar el período "de esta semana" contra períodos anteriores sin usar datos ya consolidados (más de 90 días atrás). Para dashboards en tiempo real, aceptar que los últimos 90 días tienen datos en evolución y mostrar la fecha de actualización.
|