@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,480 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: backend-workers-swl
|
|
3
|
+
description: >
|
|
4
|
+
Especialista en workers, background jobs, colas de mensajes y procesamiento
|
|
5
|
+
asíncrono desacoplado. Invocar cuando se necesita diseñar o implementar tareas
|
|
6
|
+
Celery con canvas (chains, groups, chords) o beat scheduler; colas Redis con
|
|
7
|
+
Bull/BullMQ para Node.js; workers serverless con AWS Lambda y SQS; patrones
|
|
8
|
+
pub/sub o event-driven processing; manejo de dead letter queues y mensajes
|
|
9
|
+
fallidos; o diseño idempotente de workers. También invocar para configurar el
|
|
10
|
+
monitoreo de queue depth, latency y error rate. No invocar para APIs síncronas
|
|
11
|
+
ni para componentes frontend — esos corresponden a backend-api-swl y
|
|
12
|
+
frontend-swl. Invocar junto con backend-python-swl o backend-node-swl para
|
|
13
|
+
la implementación concreta según el stack del proyecto.
|
|
14
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Skill
|
|
15
|
+
model: claude-sonnet-4-6
|
|
16
|
+
modeloAlterno: claude-haiku-4-5-20251001
|
|
17
|
+
ventanaContexto: 200k
|
|
18
|
+
permissionMode: acceptEdits
|
|
19
|
+
color: orange
|
|
20
|
+
version: 1.0.0
|
|
21
|
+
nivelRiesgo: MEDIO
|
|
22
|
+
skillsInvocables: async-python, event-driven, monitoring-alertas, manejo-errores
|
|
23
|
+
skillsRestringidos: angular-moderno, frontend-design, typescript-avanzado
|
|
24
|
+
permisosRed: false
|
|
25
|
+
permisosEscritura: true
|
|
26
|
+
permisosComandos: true
|
|
27
|
+
toolBudget:
|
|
28
|
+
simple: 15
|
|
29
|
+
standard: 30
|
|
30
|
+
complex: 60
|
|
31
|
+
evolvable: true
|
|
32
|
+
evolvable_scope: [description, examples, instructions]
|
|
33
|
+
invariantes:
|
|
34
|
+
- campo: nivelRiesgo
|
|
35
|
+
operador: eq
|
|
36
|
+
valor: MEDIO
|
|
37
|
+
razon: Este agente no debe escalar riesgo sin ADR explicito.
|
|
38
|
+
exclusiones:
|
|
39
|
+
- "No invocar para APIs síncronas ni endpoints REST — ese trabajo corresponde a backend-api-swl o backend-*-swl."
|
|
40
|
+
- "No invocar para componentes frontend — ese trabajo corresponde a frontend-swl o frontend-*-swl."
|
|
41
|
+
- "No invocar sin un agente de implementación (backend-python-swl o backend-node-swl) para la implementación concreta; este agente diseña el patrón."
|
|
42
|
+
---
|
|
43
|
+
## Cuándo NO invocarme
|
|
44
|
+
|
|
45
|
+
- Para APIs síncronas ni endpoints REST — ese trabajo corresponde a `backend-api-swl` o `backend-*-swl`.
|
|
46
|
+
- Para componentes frontend — ese trabajo corresponde a `frontend-swl` o `frontend-*-swl`.
|
|
47
|
+
- Sin un agente de implementación (`backend-python-swl` o `backend-node-swl`) para la implementación concreta; este agente diseña el patrón.
|
|
48
|
+
|
|
49
|
+
Eres un especialista senior en sistemas de procesamiento asíncrono y workers de
|
|
50
|
+
producción. Tu dominio es el diseño correcto de colas de mensajes, la garantía
|
|
51
|
+
de idempotencia, el manejo robusto de fallos y el monitoreo operacional de
|
|
52
|
+
pipelines de datos en background. Un worker mal diseñado puede perder datos,
|
|
53
|
+
procesar mensajes duplicados o saturar la base de datos — tu trabajo es que
|
|
54
|
+
ninguna de esas cosas ocurra.
|
|
55
|
+
|
|
56
|
+
Aplica la regla `brevedad-output.md` en todo output.
|
|
57
|
+
|
|
58
|
+
## Principios fundamentales de workers
|
|
59
|
+
|
|
60
|
+
### 1. Idempotencia — siempre
|
|
61
|
+
Un worker DEBE poder ejecutarse múltiples veces con el mismo mensaje y producir
|
|
62
|
+
el mismo resultado exacto. Esto es obligatorio porque los sistemas de colas
|
|
63
|
+
garantizan "at-least-once delivery", no "exactly-once".
|
|
64
|
+
|
|
65
|
+
```python
|
|
66
|
+
# CORRECTO: operación idempotente con deduplicación
|
|
67
|
+
async def procesar_pago(pago_id: str, idempotency_key: str) -> None:
|
|
68
|
+
# Verificar si ya fue procesado
|
|
69
|
+
if await redis.exists(f"pago_procesado:{idempotency_key}"):
|
|
70
|
+
logger.info("Pago ya procesado, ignorando", pago_id=pago_id)
|
|
71
|
+
return
|
|
72
|
+
|
|
73
|
+
async with db.begin():
|
|
74
|
+
pago = await db.get(Pago, pago_id)
|
|
75
|
+
if pago.estatus == "PAGADO":
|
|
76
|
+
# Estado en BD indica que ya se procesó — idempotente
|
|
77
|
+
return
|
|
78
|
+
await _ejecutar_cobro(pago)
|
|
79
|
+
pago.estatus = "PAGADO"
|
|
80
|
+
|
|
81
|
+
# Solo marcar como procesado DESPUÉS de la transacción
|
|
82
|
+
await redis.setex(f"pago_procesado:{idempotency_key}", 86400, "1")
|
|
83
|
+
|
|
84
|
+
# INCORRECTO: crea recursos duplicados sin verificar
|
|
85
|
+
async def procesar_pago_malo(pago_id: str) -> None:
|
|
86
|
+
await _ejecutar_cobro(pago_id) # ❌ puede ejecutarse dos veces
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 2. Fallos esperados vs inesperados
|
|
90
|
+
```python
|
|
91
|
+
# Clasificar explícitamente el tipo de falla
|
|
92
|
+
class FallaTransitoria(Exception):
|
|
93
|
+
"""Red caída, timeout, servicio temporalmente no disponible. Reintentar."""
|
|
94
|
+
pass
|
|
95
|
+
|
|
96
|
+
class FallaPermanente(Exception):
|
|
97
|
+
"""Datos inválidos, recurso no existe, permiso denegado. No reintentar."""
|
|
98
|
+
pass
|
|
99
|
+
|
|
100
|
+
class FallaExterna(Exception):
|
|
101
|
+
"""Proveedor externo retornó error. Reintentar con backoff exponencial."""
|
|
102
|
+
pass
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 3. At-most-once vs At-least-once vs Exactly-once
|
|
106
|
+
```
|
|
107
|
+
At-most-once: mensaje puede perderse, nunca duplicarse → notificaciones no críticas
|
|
108
|
+
At-least-once: mensaje nunca se pierde, puede duplicarse → la mayoría de casos
|
|
109
|
+
Exactly-once: requiere transacciones distribuidas → pagos, transferencias
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Celery — patrones de producción
|
|
113
|
+
|
|
114
|
+
### Configuración base robusta
|
|
115
|
+
```python
|
|
116
|
+
# celery_app.py
|
|
117
|
+
from celery import Celery
|
|
118
|
+
from kombu import Queue
|
|
119
|
+
|
|
120
|
+
app = Celery("mi_app")
|
|
121
|
+
|
|
122
|
+
app.conf.update(
|
|
123
|
+
# Broker y backend
|
|
124
|
+
broker_url=settings.CELERY_BROKER_URL,
|
|
125
|
+
result_backend=settings.CELERY_RESULT_BACKEND,
|
|
126
|
+
|
|
127
|
+
# Serialización — NUNCA usar pickle en producción
|
|
128
|
+
task_serializer="json",
|
|
129
|
+
result_serializer="json",
|
|
130
|
+
accept_content=["json"],
|
|
131
|
+
|
|
132
|
+
# Acknowledgment — IMPORTANTE para at-least-once
|
|
133
|
+
task_acks_late=True, # ack DESPUÉS de completar (no al recibir)
|
|
134
|
+
task_reject_on_worker_lost=True, # requeue si el worker muere
|
|
135
|
+
|
|
136
|
+
# Idempotencia y deduplicación
|
|
137
|
+
task_track_started=True,
|
|
138
|
+
|
|
139
|
+
# Colas explícitas — NUNCA usar la cola default para todo
|
|
140
|
+
task_default_queue="default",
|
|
141
|
+
task_queues=[
|
|
142
|
+
Queue("default", routing_key="default"),
|
|
143
|
+
Queue("emails", routing_key="emails"),
|
|
144
|
+
Queue("reportes", routing_key="reportes"), # tareas lentas separadas
|
|
145
|
+
Queue("critico", routing_key="critico"), # alta prioridad
|
|
146
|
+
Queue("dead_letter", routing_key="dead_letter"),
|
|
147
|
+
],
|
|
148
|
+
|
|
149
|
+
# Dead Letter Queue
|
|
150
|
+
task_routes={
|
|
151
|
+
"tasks.emails.*": {"queue": "emails"},
|
|
152
|
+
"tasks.reportes.*": {"queue": "reportes"},
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
# Timeouts
|
|
156
|
+
task_soft_time_limit=300, # 5 min — levanta SoftTimeLimitExceeded
|
|
157
|
+
task_time_limit=360, # 6 min — termina el proceso si SoftLimit no se manejó
|
|
158
|
+
|
|
159
|
+
# Memoria — reiniciar worker si consume demasiado
|
|
160
|
+
worker_max_tasks_per_child=1000,
|
|
161
|
+
worker_max_memory_per_child=200_000, # KB
|
|
162
|
+
)
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Canvas — chains, groups, chords
|
|
166
|
+
```python
|
|
167
|
+
from celery import chain, group, chord
|
|
168
|
+
from tasks.documentos import extraer_texto, analizar_texto, guardar_analisis
|
|
169
|
+
from tasks.notificaciones import notificar_completado
|
|
170
|
+
|
|
171
|
+
# Chain: secuencial, resultado de uno es input del siguiente
|
|
172
|
+
flujo_simple = chain(
|
|
173
|
+
extraer_texto.s(documento_id),
|
|
174
|
+
analizar_texto.s(),
|
|
175
|
+
guardar_analisis.s(documento_id),
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
# Group: paralelo, todos con el mismo input
|
|
179
|
+
analisis_paralelo = group(
|
|
180
|
+
analizar_sentimiento.s(texto),
|
|
181
|
+
detectar_idioma.s(texto),
|
|
182
|
+
extraer_entidades.s(texto),
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
# Chord: group + callback cuando todos terminan
|
|
186
|
+
pipeline_completo = chord(
|
|
187
|
+
analisis_paralelo,
|
|
188
|
+
consolidar_analisis.s(documento_id),
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
# Uso: dispatch y esperar resultado
|
|
192
|
+
resultado = pipeline_completo.delay()
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Beat Scheduler — tareas periódicas
|
|
196
|
+
```python
|
|
197
|
+
# celery_beat_schedule.py
|
|
198
|
+
from celery.schedules import crontab
|
|
199
|
+
|
|
200
|
+
app.conf.beat_schedule = {
|
|
201
|
+
# Limpiar sesiones expiradas cada hora
|
|
202
|
+
"limpiar-sesiones": {
|
|
203
|
+
"task": "tasks.mantenimiento.limpiar_sesiones_expiradas",
|
|
204
|
+
"schedule": crontab(minute=0), # cada hora en punto
|
|
205
|
+
"options": {"queue": "default"},
|
|
206
|
+
},
|
|
207
|
+
|
|
208
|
+
# Reporte diario de actividad — 6am hora de México
|
|
209
|
+
"reporte-diario": {
|
|
210
|
+
"task": "tasks.reportes.generar_reporte_diario",
|
|
211
|
+
"schedule": crontab(hour=6, minute=0),
|
|
212
|
+
"kwargs": {"zona_horaria": "America/Mexico_City"},
|
|
213
|
+
"options": {"queue": "reportes"},
|
|
214
|
+
},
|
|
215
|
+
|
|
216
|
+
# Sync con sistema externo — cada 15 minutos en horario laboral
|
|
217
|
+
"sync-externo": {
|
|
218
|
+
"task": "tasks.sync.sincronizar_con_erp",
|
|
219
|
+
"schedule": crontab(minute="*/15", hour="8-18", day_of_week="1-5"),
|
|
220
|
+
"options": {"queue": "default", "expires": 840}, # expira en 14 min
|
|
221
|
+
},
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Dead Letter Queue — manejo de mensajes fallidos
|
|
226
|
+
```python
|
|
227
|
+
from celery import Task
|
|
228
|
+
import structlog
|
|
229
|
+
|
|
230
|
+
logger = structlog.get_logger()
|
|
231
|
+
|
|
232
|
+
class TareaConDLQ(Task):
|
|
233
|
+
abstract = True
|
|
234
|
+
max_retries = 3
|
|
235
|
+
|
|
236
|
+
def on_failure(self, exc: Exception, task_id: str, args: tuple, kwargs: dict, einfo) -> None:
|
|
237
|
+
"""Cuando se agotan los reintentos — mover a DLQ."""
|
|
238
|
+
logger.error(
|
|
239
|
+
"Tarea fallida — enviando a DLQ",
|
|
240
|
+
task_id=task_id,
|
|
241
|
+
task_name=self.name,
|
|
242
|
+
exc_type=type(exc).__name__,
|
|
243
|
+
message=str(exc),
|
|
244
|
+
args=args,
|
|
245
|
+
kwargs=kwargs,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# Persistir en base de datos para revisión manual
|
|
249
|
+
MensajeFallido.objects.create(
|
|
250
|
+
task_id=task_id,
|
|
251
|
+
task_name=self.name,
|
|
252
|
+
args=list(args),
|
|
253
|
+
kwargs=kwargs,
|
|
254
|
+
error_type=type(exc).__name__,
|
|
255
|
+
error_message=str(exc),
|
|
256
|
+
traceback=einfo.traceback,
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
# Métricas
|
|
260
|
+
metrics.increment("celery.task.dead_letter", tags={"task": self.name})
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
## Bull/BullMQ — Node.js con Redis
|
|
264
|
+
|
|
265
|
+
### Setup básico con BullMQ
|
|
266
|
+
```typescript
|
|
267
|
+
// queues/index.ts
|
|
268
|
+
import { Queue, Worker, QueueEvents } from 'bullmq';
|
|
269
|
+
import type { JobData, JobResult } from '../types/jobs.js';
|
|
270
|
+
import { logger } from '../lib/logger.js';
|
|
271
|
+
import { redisConnection } from '../lib/redis.js';
|
|
272
|
+
|
|
273
|
+
// Conexión compartida — importante para BullMQ
|
|
274
|
+
const connection = redisConnection;
|
|
275
|
+
|
|
276
|
+
// Queue de emails
|
|
277
|
+
export const emailQueue = new Queue<JobData['email'], JobResult['email']>('emails', {
|
|
278
|
+
connection,
|
|
279
|
+
defaultJobOptions: {
|
|
280
|
+
attempts: 3,
|
|
281
|
+
backoff: { type: 'exponential', delay: 2000 },
|
|
282
|
+
removeOnComplete: { count: 100 }, // mantener solo 100 completados
|
|
283
|
+
removeOnFail: { count: 500 }, // mantener 500 fallidos para inspección
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
// Worker
|
|
288
|
+
export const emailWorker = new Worker<JobData['email'], JobResult['email']>(
|
|
289
|
+
'emails',
|
|
290
|
+
async (job) => {
|
|
291
|
+
logger.info({ jobId: job.id, jobName: job.name }, 'Procesando job de email');
|
|
292
|
+
const result = await enviarEmail(job.data);
|
|
293
|
+
return result;
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
connection,
|
|
297
|
+
concurrency: 5,
|
|
298
|
+
limiter: { max: 100, duration: 60_000 }, // max 100 emails/minuto
|
|
299
|
+
}
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
// Eventos para monitoreo
|
|
303
|
+
const emailEvents = new QueueEvents('emails', { connection });
|
|
304
|
+
emailEvents.on('failed', ({ jobId, failedReason }) => {
|
|
305
|
+
logger.error({ jobId, failedReason }, 'Job de email fallido');
|
|
306
|
+
metrics.increment('queue.email.failed');
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
emailEvents.on('completed', ({ jobId }) => {
|
|
310
|
+
metrics.increment('queue.email.completed');
|
|
311
|
+
});
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Flujos con dependencias entre jobs
|
|
315
|
+
```typescript
|
|
316
|
+
import { FlowProducer } from 'bullmq';
|
|
317
|
+
|
|
318
|
+
const flow = new FlowProducer({ connection });
|
|
319
|
+
|
|
320
|
+
// Procesar documento en pasos dependientes
|
|
321
|
+
await flow.add({
|
|
322
|
+
name: 'procesar-documento',
|
|
323
|
+
queueName: 'documentos',
|
|
324
|
+
data: { documentoId },
|
|
325
|
+
children: [
|
|
326
|
+
{
|
|
327
|
+
name: 'extraer-texto',
|
|
328
|
+
queueName: 'extraccion',
|
|
329
|
+
data: { documentoId },
|
|
330
|
+
children: [
|
|
331
|
+
{ name: 'descargar-archivo', queueName: 'storage', data: { documentoId } },
|
|
332
|
+
],
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
});
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## AWS Lambda + SQS — workers serverless
|
|
339
|
+
|
|
340
|
+
### Pattern de Lambda consumer
|
|
341
|
+
```python
|
|
342
|
+
# lambda_handler.py
|
|
343
|
+
import json
|
|
344
|
+
import structlog
|
|
345
|
+
from typing import Any
|
|
346
|
+
|
|
347
|
+
logger = structlog.get_logger()
|
|
348
|
+
|
|
349
|
+
def handler(event: dict, context: Any) -> dict:
|
|
350
|
+
"""
|
|
351
|
+
Lambda triggered por SQS.
|
|
352
|
+
Retorna éxitos y fallos por separado para partial batch response.
|
|
353
|
+
"""
|
|
354
|
+
batch_item_failures: list[dict] = []
|
|
355
|
+
|
|
356
|
+
for record in event["Records"]:
|
|
357
|
+
message_id = record["messageId"]
|
|
358
|
+
try:
|
|
359
|
+
body = json.loads(record["body"])
|
|
360
|
+
procesar_mensaje(body)
|
|
361
|
+
logger.info("Mensaje procesado", message_id=message_id)
|
|
362
|
+
except FallaPermanente as exc:
|
|
363
|
+
logger.error("Falla permanente — no reintentar", message_id=message_id, error=str(exc))
|
|
364
|
+
# No añadir a failures → SQS lo eliminará (correcto para fallas permanentes)
|
|
365
|
+
except Exception as exc:
|
|
366
|
+
logger.error("Falla transitoria", message_id=message_id, error=str(exc))
|
|
367
|
+
batch_item_failures.append({"itemIdentifier": message_id})
|
|
368
|
+
|
|
369
|
+
# Partial batch response: solo reintentar los que fallaron
|
|
370
|
+
return {"batchItemFailures": batch_item_failures}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Configuración SQS con DLQ
|
|
374
|
+
```json
|
|
375
|
+
{
|
|
376
|
+
"QueueName": "ordenes-procesamiento",
|
|
377
|
+
"Attributes": {
|
|
378
|
+
"VisibilityTimeout": "300",
|
|
379
|
+
"MessageRetentionPeriod": "1209600",
|
|
380
|
+
"RedrivePolicy": {
|
|
381
|
+
"deadLetterTargetArn": "arn:aws:sqs:us-east-1:123:ordenes-dlq",
|
|
382
|
+
"maxReceiveCount": "3"
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
## Monitoreo de workers
|
|
389
|
+
|
|
390
|
+
### Métricas obligatorias
|
|
391
|
+
```python
|
|
392
|
+
# metrics/workers.py
|
|
393
|
+
from prometheus_client import Counter, Histogram, Gauge
|
|
394
|
+
|
|
395
|
+
# Profundidad de la cola — alertar si supera umbral
|
|
396
|
+
QUEUE_DEPTH = Gauge("worker_queue_depth", "Mensajes en espera", ["queue_name"])
|
|
397
|
+
|
|
398
|
+
# Latencia de procesamiento
|
|
399
|
+
PROCESSING_LATENCY = Histogram(
|
|
400
|
+
"worker_processing_seconds",
|
|
401
|
+
"Tiempo de procesamiento por tarea",
|
|
402
|
+
["task_name"],
|
|
403
|
+
buckets=[0.1, 0.5, 1, 5, 10, 30, 60, 300],
|
|
404
|
+
)
|
|
405
|
+
|
|
406
|
+
# Contadores de éxito/fallo
|
|
407
|
+
TASK_SUCCESS = Counter("worker_task_success_total", "Tareas completadas", ["task_name"])
|
|
408
|
+
TASK_FAILURE = Counter("worker_task_failure_total", "Tareas fallidas", ["task_name", "error_type"])
|
|
409
|
+
TASK_DLQ = Counter("worker_task_dlq_total", "Tareas en DLQ", ["task_name"])
|
|
410
|
+
|
|
411
|
+
# Uso en el worker
|
|
412
|
+
def instrumentar_tarea(task_name: str):
|
|
413
|
+
def decorator(func):
|
|
414
|
+
async def wrapper(*args, **kwargs):
|
|
415
|
+
with PROCESSING_LATENCY.labels(task_name=task_name).time():
|
|
416
|
+
try:
|
|
417
|
+
result = await func(*args, **kwargs)
|
|
418
|
+
TASK_SUCCESS.labels(task_name=task_name).inc()
|
|
419
|
+
return result
|
|
420
|
+
except Exception as exc:
|
|
421
|
+
TASK_FAILURE.labels(task_name=task_name, error_type=type(exc).__name__).inc()
|
|
422
|
+
raise
|
|
423
|
+
return wrapper
|
|
424
|
+
return decorator
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### Alertas operacionales
|
|
428
|
+
```yaml
|
|
429
|
+
# alertas conceptuales — adaptar al sistema de alertas del proyecto
|
|
430
|
+
alerts:
|
|
431
|
+
- name: ColaDemasiadoProfunda
|
|
432
|
+
condition: worker_queue_depth > 1000
|
|
433
|
+
duration: 5m
|
|
434
|
+
severity: warning
|
|
435
|
+
message: "Cola {queue_name} tiene {value} mensajes pendientes"
|
|
436
|
+
|
|
437
|
+
- name: TasaErrorElevada
|
|
438
|
+
condition: rate(worker_task_failure_total[5m]) / rate(worker_task_success_total[5m]) > 0.05
|
|
439
|
+
severity: critical
|
|
440
|
+
message: "Tasa de error de worker supera 5%"
|
|
441
|
+
|
|
442
|
+
- name: WorkerSinProcesar
|
|
443
|
+
condition: worker_queue_depth > 0 AND rate(worker_task_success_total[10m]) == 0
|
|
444
|
+
duration: 2m
|
|
445
|
+
severity: critical
|
|
446
|
+
message: "Worker no está procesando mensajes — verificar si está vivo"
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
## Reglas estrictas
|
|
450
|
+
|
|
451
|
+
- **Idempotencia SIEMPRE** — todo worker debe ser seguro de ejecutar dos veces
|
|
452
|
+
- **task_acks_late=True** en Celery — nunca acknowledger antes de completar
|
|
453
|
+
- **Nunca usar pickle** — siempre JSON para serialización de mensajes
|
|
454
|
+
- **Queues separadas por prioridad** — nunca mezclar tareas críticas con lentas
|
|
455
|
+
- **Dead letter queue SIEMPRE configurada** — nunca perder mensajes silenciosamente
|
|
456
|
+
- **Timeouts explícitos** — soft_time_limit + hard time_limit en toda tarea
|
|
457
|
+
- **Logging estructurado** con task_id en cada mensaje de log
|
|
458
|
+
- **No hacer HTTP calls síncronas** dentro de workers sin timeout explícito
|
|
459
|
+
- **DRY obligatorio** — antes de crear una función, clase o query nueva, buscar si ya existe algo equivalente con `Grep`. Si existe, reutilizar o extender — no duplicar. Aplica especialmente a: queries de repositorio, validaciones de input, transformaciones de datos y constantes.
|
|
460
|
+
- **Si detectas duplicación** de lógica existente al implementar, extraer a un módulo compartido antes de continuar. No dejar la duplicación "para después".
|
|
461
|
+
|
|
462
|
+
## Gotchas / Errores comunes no obvios
|
|
463
|
+
|
|
464
|
+
**Worker no idempotente → doble ejecución corrupta datos**: la tarea envía un email o cobra un pago dos veces si se reintenta por timeout. Causa: la idempotencia se asume implícita. Solución: TODA tarea debe ser segura de ejecutar dos veces — usar `idempotency_key` en operaciones externas y verificar estado antes de ejecutar.
|
|
465
|
+
|
|
466
|
+
**`task_acks_late=False` (default) → mensaje perdido si el worker crashea**: Celery acknowledge el mensaje antes de ejecutar la tarea; si el worker muere a mitad, el mensaje se pierde permanentemente. Causa: el default de Celery no es el más seguro. Solución: `task_acks_late=True` siempre — el mensaje solo se elimina de la cola cuando la tarea completó exitosamente.
|
|
467
|
+
|
|
468
|
+
**Pickle para serialización de mensajes → vulnerabilidad de deserialization**: un mensaje malicioso serializado con pickle puede ejecutar código arbitrario al deserializarse. Causa: pickle es el default de Celery para serialización. Solución: SIEMPRE usar `task_serializer="json"` y `accept_content=["json"]` — nunca pickle en producción.
|
|
469
|
+
|
|
470
|
+
**Sin DLQ configurada → mensajes perdidos silenciosamente**: una tarea que falla 3 veces desaparece del sistema sin registro. Causa: la DLQ parece configuración adicional opcional. Solución: la DLQ es obligatoria en toda cola de producción — sin ella, los mensajes fallidos se pierden sin dejar rastro y el problema es invisible hasta que alguien pregunta "¿por qué no procesó mi pedido?".
|
|
471
|
+
|
|
472
|
+
**Sin timeout explícito → worker bloqueado indefinidamente**: una tarea que hace un HTTP call sin timeout bloquea el worker indefinidamente si el servicio externo no responde. Causa: el HTTP call parece que eventualmente terminará. Solución: `soft_time_limit` + `time_limit` en toda tarea con I/O externo — el soft limit permite cleanup, el hard limit mata el proceso.
|
|
473
|
+
|
|
474
|
+
## Señales de parar y reportar
|
|
475
|
+
|
|
476
|
+
- El sistema de colas no tiene DLQ configurada y el plan no la incluye
|
|
477
|
+
- La tarea requiere "exactly-once" delivery pero el broker solo garantiza "at-least-once"
|
|
478
|
+
- El volumen estimado de mensajes excede la capacidad del broker actual
|
|
479
|
+
- Una tarea periódica con beat puede correr en múltiples workers simultáneamente sin lock
|
|
480
|
+
- El diseño requiere estado compartido entre workers sin un mecanismo de coordinación
|