@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,283 @@
|
|
|
1
|
+
# Node.js Experto — Patrones Completos de Referencia
|
|
2
|
+
|
|
3
|
+
Implementaciones completas de Express, Fastify, streams, worker threads, ORMs y más.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Fastify — Setup Recomendado
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
// src/app.ts
|
|
11
|
+
import Fastify from 'fastify';
|
|
12
|
+
import { TypeBoxTypeProvider } from '@fastify/type-provider-typebox';
|
|
13
|
+
|
|
14
|
+
const app = Fastify({
|
|
15
|
+
logger: {
|
|
16
|
+
level: process.env.LOG_LEVEL ?? 'info',
|
|
17
|
+
transport: process.env.NODE_ENV === 'development'
|
|
18
|
+
? { target: 'pino-pretty' }
|
|
19
|
+
: undefined,
|
|
20
|
+
},
|
|
21
|
+
}).withTypeProvider<TypeBoxTypeProvider>();
|
|
22
|
+
|
|
23
|
+
await app.register(import('@fastify/cors'), {
|
|
24
|
+
origin: process.env.CORS_ORIGIN?.split(',') ?? false,
|
|
25
|
+
});
|
|
26
|
+
await app.register(import('@fastify/helmet'));
|
|
27
|
+
await app.register(import('./routes/usuarios'), { prefix: '/api/v1/usuarios' });
|
|
28
|
+
|
|
29
|
+
export { app };
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Express — Con TypeScript Moderno
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
import express, { Express } from 'express';
|
|
36
|
+
import { usuariosRouter } from './routes/usuarios';
|
|
37
|
+
import { errorMiddleware } from './middleware/error';
|
|
38
|
+
|
|
39
|
+
export function createApp(): Express {
|
|
40
|
+
const app = express();
|
|
41
|
+
app.use(express.json());
|
|
42
|
+
app.use(express.urlencoded({ extended: true }));
|
|
43
|
+
app.use('/api/v1/usuarios', usuariosRouter);
|
|
44
|
+
app.use(errorMiddleware);
|
|
45
|
+
return app;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Streams y Buffers — Ejemplos Completos
|
|
52
|
+
|
|
53
|
+
### Procesar archivo grande sin cargar en memoria
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import { createReadStream, createWriteStream } from 'fs';
|
|
57
|
+
import { pipeline } from 'stream/promises';
|
|
58
|
+
import { createGzip } from 'zlib';
|
|
59
|
+
import { Transform } from 'stream';
|
|
60
|
+
|
|
61
|
+
async function procesarArchivoGrande(entrada: string, salida: string): Promise<void> {
|
|
62
|
+
const transformador = new Transform({
|
|
63
|
+
objectMode: false,
|
|
64
|
+
transform(chunk: Buffer, _encoding, callback) {
|
|
65
|
+
const procesado = chunk.toString().toUpperCase();
|
|
66
|
+
callback(null, procesado);
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
await pipeline(createReadStream(entrada), transformador, createGzip(), createWriteStream(salida));
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Streaming HTTP response
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import { Readable } from 'stream';
|
|
77
|
+
|
|
78
|
+
app.get('/exportar', async (req, reply) => {
|
|
79
|
+
reply.header('Content-Type', 'text/csv');
|
|
80
|
+
reply.header('Content-Disposition', 'attachment; filename="export.csv"');
|
|
81
|
+
const stream = Readable.from(generarCSV());
|
|
82
|
+
return reply.send(stream);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
async function* generarCSV(): AsyncGenerator<string> {
|
|
86
|
+
yield 'id,nombre,email\n';
|
|
87
|
+
const cursor = db.usuario.cursor();
|
|
88
|
+
for await (const usuario of cursor) {
|
|
89
|
+
yield `${usuario.id},${usuario.nombre},${usuario.email}\n`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Worker Threads y Clustering
|
|
97
|
+
|
|
98
|
+
### Worker Threads
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
// src/workers/procesador.worker.ts
|
|
102
|
+
import { workerData, parentPort } from 'worker_threads';
|
|
103
|
+
|
|
104
|
+
function procesarIntensivo(datos: number[]): number {
|
|
105
|
+
return datos.reduce((acc, n) => acc + Math.sqrt(n), 0);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const resultado = procesarIntensivo(workerData.datos);
|
|
109
|
+
parentPort!.postMessage({ resultado });
|
|
110
|
+
|
|
111
|
+
// src/services/procesamiento.service.ts
|
|
112
|
+
import { Worker } from 'worker_threads';
|
|
113
|
+
import path from 'path';
|
|
114
|
+
|
|
115
|
+
export function procesarEnWorker(datos: number[]): Promise<number> {
|
|
116
|
+
return new Promise((resolve, reject) => {
|
|
117
|
+
const worker = new Worker(
|
|
118
|
+
path.resolve(__dirname, '../workers/procesador.worker.js'),
|
|
119
|
+
{ workerData: { datos } },
|
|
120
|
+
);
|
|
121
|
+
worker.once('message', ({ resultado }) => resolve(resultado));
|
|
122
|
+
worker.once('error', reject);
|
|
123
|
+
worker.once('exit', code => {
|
|
124
|
+
if (code !== 0) reject(new Error(`Worker salió con código ${code}`));
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Pool de workers con Piscina
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import { Piscina } from 'piscina';
|
|
134
|
+
|
|
135
|
+
const pool = new Piscina({
|
|
136
|
+
filename: path.resolve(__dirname, 'workers/procesador.worker.js'),
|
|
137
|
+
maxThreads: Math.max(1, os.cpus().length - 1),
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const resultado = await pool.run({ datos: arrayGrande });
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Clustering
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
import cluster from 'cluster';
|
|
147
|
+
import os from 'os';
|
|
148
|
+
|
|
149
|
+
if (cluster.isPrimary) {
|
|
150
|
+
const numCPUs = os.cpus().length;
|
|
151
|
+
for (let i = 0; i < numCPUs; i++) cluster.fork();
|
|
152
|
+
cluster.on('exit', (worker, code) => {
|
|
153
|
+
console.log(`Worker ${worker.process.pid} murió (código ${code}), reiniciando...`);
|
|
154
|
+
cluster.fork();
|
|
155
|
+
});
|
|
156
|
+
} else {
|
|
157
|
+
const { app } = await import('./app');
|
|
158
|
+
app.listen(3000, () => console.log(`Worker ${process.pid} escuchando en 3000`));
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Prisma — Patterns de Producción
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
import { PrismaClient } from '@prisma/client';
|
|
168
|
+
|
|
169
|
+
const globalForPrisma = globalThis as unknown as { prisma: PrismaClient };
|
|
170
|
+
|
|
171
|
+
export const prisma =
|
|
172
|
+
globalForPrisma.prisma ??
|
|
173
|
+
new PrismaClient({
|
|
174
|
+
log: process.env.NODE_ENV === 'development' ? ['query', 'warn', 'error'] : ['error'],
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
|
|
178
|
+
|
|
179
|
+
// Query tipada con include
|
|
180
|
+
const usuario = await prisma.usuario.findUniqueOrThrow({
|
|
181
|
+
where: { id },
|
|
182
|
+
include: { perfil: true, roles: { include: { permisos: true } } },
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
// Transacción
|
|
186
|
+
const resultado = await prisma.$transaction(async (tx) => {
|
|
187
|
+
const user = await tx.usuario.create({ data: usuarioData });
|
|
188
|
+
await tx.auditLog.create({ data: { accion: 'CREATE', entityId: user.id } });
|
|
189
|
+
return user;
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Drizzle — Schema y Queries
|
|
194
|
+
|
|
195
|
+
```typescript
|
|
196
|
+
import { pgTable, uuid, varchar, boolean, timestamp } from 'drizzle-orm/pg-core';
|
|
197
|
+
|
|
198
|
+
export const usuarios = pgTable('usuarios', {
|
|
199
|
+
id: uuid('id').defaultRandom().primaryKey(),
|
|
200
|
+
nombre: varchar('nombre', { length: 255 }).notNull(),
|
|
201
|
+
email: varchar('email', { length: 255 }).notNull().unique(),
|
|
202
|
+
activo: boolean('activo').default(true).notNull(),
|
|
203
|
+
creadoEn: timestamp('creado_en').defaultNow().notNull(),
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const activos = await db
|
|
207
|
+
.select().from(usuarios)
|
|
208
|
+
.where(eq(usuarios.activo, true))
|
|
209
|
+
.orderBy(asc(usuarios.nombre))
|
|
210
|
+
.limit(20);
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Validación con Zod
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
import { z } from 'zod';
|
|
219
|
+
|
|
220
|
+
export const UsuarioCreateSchema = z.object({
|
|
221
|
+
nombre: z.string().min(2, 'Nombre muy corto').max(100),
|
|
222
|
+
email: z.string().email('Email inválido'),
|
|
223
|
+
edad: z.number().int().min(18).max(120).optional(),
|
|
224
|
+
rol: z.enum(['admin', 'usuario', 'moderador']).default('usuario'),
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
export type UsuarioCreate = z.infer<typeof UsuarioCreateSchema>;
|
|
228
|
+
|
|
229
|
+
export function validar<T>(schema: z.ZodSchema<T>) {
|
|
230
|
+
return asyncHandler(async (req, _res, next) => {
|
|
231
|
+
const resultado = schema.safeParse(req.body);
|
|
232
|
+
if (!resultado.success) {
|
|
233
|
+
throw new ValidationError(
|
|
234
|
+
'Datos de entrada inválidos',
|
|
235
|
+
resultado.error.flatten().fieldErrors as Record<string, string[]>,
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
req.body = resultado.data;
|
|
239
|
+
next();
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## Graceful Shutdown
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
import { app } from './app';
|
|
250
|
+
import { prisma } from './lib/prisma';
|
|
251
|
+
import { logger } from './lib/logger';
|
|
252
|
+
|
|
253
|
+
const server = app.listen(3000);
|
|
254
|
+
|
|
255
|
+
async function shutdown(signal: string): Promise<void> {
|
|
256
|
+
logger.info(`Recibida señal ${signal}, iniciando graceful shutdown`);
|
|
257
|
+
server.close(async () => {
|
|
258
|
+
try {
|
|
259
|
+
await prisma.$disconnect();
|
|
260
|
+
logger.info('Graceful shutdown completado');
|
|
261
|
+
process.exit(0);
|
|
262
|
+
} catch (err) {
|
|
263
|
+
logger.error({ err }, 'Error durante graceful shutdown');
|
|
264
|
+
process.exit(1);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
setTimeout(() => {
|
|
268
|
+
logger.error('Graceful shutdown timeout — forzando cierre');
|
|
269
|
+
process.exit(1);
|
|
270
|
+
}, 10_000);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
274
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
275
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
276
|
+
logger.error({ reason, promise }, 'Unhandled Promise Rejection');
|
|
277
|
+
shutdown('unhandledRejection');
|
|
278
|
+
});
|
|
279
|
+
process.on('uncaughtException', (err) => {
|
|
280
|
+
logger.error({ err }, 'Uncaught Exception');
|
|
281
|
+
process.exit(1);
|
|
282
|
+
});
|
|
283
|
+
```
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: notificaciones-multicanal
|
|
3
|
+
description: Sistema de notificaciones para el agente notificador-swl. Cubre configuración de canales (desktop, Telegram, WhatsApp, email, webhook), formato de mensaje por canal, priorización de eventos, rate limiting, templates, integración con claude-notifications-go y ejemplos de config.json.
|
|
4
|
+
version: "1.0.0"
|
|
5
|
+
herramientasPermitidas: [Read, Bash]
|
|
6
|
+
evolvable: true # default para skill estandar
|
|
7
|
+
exclusiones:
|
|
8
|
+
- "No cargar para notificaciones push del navegador al usuario final (Web Push API, PWA notifications) — para notificaciones al usuario en el frontend cargar `frontend-avanzado`."
|
|
9
|
+
- "No cargar para alertas de monitoreo de sistemas en producción (Prometheus Alertmanager, PagerDuty, OpsGenie) — para alerting de observabilidad cargar `monitoring-alertas`."
|
|
10
|
+
- "No cargar para envío masivo de correos de marketing o transaccionales a usuarios finales (SendGrid, Mailchimp, SES para millones de destinatarios) — para email marketing cargar el skill del proveedor correspondiente."
|
|
11
|
+
- "No cargar para notificaciones en tiempo real dentro de la app de usuario (WebSockets, SSE para actualizar la UI) — para realtime en el cliente cargar `frontend-avanzado`."
|
|
12
|
+
---
|
|
13
|
+
# Notificaciones Multicanal — notificador-swl
|
|
14
|
+
|
|
15
|
+
## Cuándo NO cargar
|
|
16
|
+
|
|
17
|
+
- La tarea es notificaciones push del navegador al usuario final (Web Push, PWA): cargar `frontend-avanzado`.
|
|
18
|
+
- La tarea es alerting de monitoreo de sistemas (Prometheus Alertmanager, PagerDuty): cargar `monitoring-alertas`.
|
|
19
|
+
- La tarea es envío masivo de correos a usuarios finales (marketing, transaccional a millones): cargar el skill del proveedor de email.
|
|
20
|
+
- La tarea es actualizar la UI en tiempo real vía WebSockets o SSE: cargar `frontend-avanzado`.
|
|
21
|
+
|
|
22
|
+
## Visión General
|
|
23
|
+
|
|
24
|
+
El sistema de notificaciones multicanal permite que los agentes SWL comuniquen
|
|
25
|
+
eventos importantes al humano a través de múltiples canales, priorizando según
|
|
26
|
+
la urgencia y respetando el tiempo de atención del receptor.
|
|
27
|
+
|
|
28
|
+
El binario `claude-notifications-go` actúa como broker central:
|
|
29
|
+
recibe eventos via stdin (JSON) o HTTP local y los enruta al canal apropiado.
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Agente SWL
|
|
33
|
+
|
|
|
34
|
+
v
|
|
35
|
+
claude-notifications-go --> Desktop (nativo OS)
|
|
36
|
+
| --> Telegram Bot
|
|
37
|
+
| --> WhatsApp Business API
|
|
38
|
+
| --> Email (SMTP)
|
|
39
|
+
+-------------------> Webhook HTTP
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Reglas Obligatorias
|
|
45
|
+
|
|
46
|
+
1. **NUNCA hardcodear tokens en config.json** — usar siempre variables de entorno (`${TELEGRAM_BOT_TOKEN}`).
|
|
47
|
+
2. **La notificación es best-effort, NO bloqueante** — si falla, el hook NO debe fallar.
|
|
48
|
+
3. **SIEMPRE incluir `proyecto` en el payload** — sin él, es imposible filtrar en el historial.
|
|
49
|
+
4. **NUNCA usar prioridad `critico` para eventos rutinarios** — causa fatiga de alertas.
|
|
50
|
+
5. **SIEMPRE configurar horario No Molestar** — interrupciones fuera de horario son inaceptables.
|
|
51
|
+
6. **Canal email: máximo 1 vez por hora** — no para eventos de alta frecuencia.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Priorización de Eventos
|
|
56
|
+
|
|
57
|
+
| Nivel | Canales activados | Ejemplos |
|
|
58
|
+
|-------|------------------|---------|
|
|
59
|
+
| `critico` | Todos los canales simultáneamente | Error irreversible, pérdida de datos |
|
|
60
|
+
| `urgente` | Desktop + Telegram (simultáneo) | human-action bloqueante |
|
|
61
|
+
| `alta` | Desktop + Telegram (secuencial) | checkpoint decision |
|
|
62
|
+
| `normal` | Canal primario únicamente | human-verify, progreso |
|
|
63
|
+
| `baja` | Solo log local | Métricas, telemetría interna |
|
|
64
|
+
|
|
65
|
+
### Mapeo evento a prioridad
|
|
66
|
+
|
|
67
|
+
```jsonc
|
|
68
|
+
{
|
|
69
|
+
"mapeo": {
|
|
70
|
+
"checkpoint.human-action": "urgente",
|
|
71
|
+
"checkpoint.decision": "alta",
|
|
72
|
+
"checkpoint.human-verify": "normal",
|
|
73
|
+
"error.critico": "critico",
|
|
74
|
+
"error.recuperable": "alta",
|
|
75
|
+
"fase.completada": "normal",
|
|
76
|
+
"alerta.seguridad": "critico"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Integración con claude-notifications-go
|
|
84
|
+
|
|
85
|
+
### Envío desde hook (stdin)
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
// hooks/notify.js
|
|
89
|
+
const { execSync } = require('child_process');
|
|
90
|
+
|
|
91
|
+
function notificar(evento) {
|
|
92
|
+
const payload = JSON.stringify(evento);
|
|
93
|
+
try {
|
|
94
|
+
execSync('claude-notifications-go send', {
|
|
95
|
+
input: payload,
|
|
96
|
+
stdio: ['pipe', 'ignore', 'ignore'],
|
|
97
|
+
timeout: 5000,
|
|
98
|
+
});
|
|
99
|
+
} catch {
|
|
100
|
+
// Fallo silencioso — la notificación no es crítica para el flujo
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
notificar({
|
|
105
|
+
tipo: 'checkpoint.human-verify',
|
|
106
|
+
proyecto: process.env.PROJECT_NAME,
|
|
107
|
+
titulo: 'Slice 1 completado',
|
|
108
|
+
resumen: 'CRUD de usuarios implementado y testeado.',
|
|
109
|
+
accion_requerida: true,
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Envío via HTTP local
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
curl -s -X POST http://localhost:19999/notify \
|
|
117
|
+
-H "Content-Type: application/json" \
|
|
118
|
+
-d '{
|
|
119
|
+
"tipo": "checkpoint.decision",
|
|
120
|
+
"proyecto": "sigaf-backend",
|
|
121
|
+
"titulo": "Decision requerida: motor de base de datos",
|
|
122
|
+
"prioridad": "alta"
|
|
123
|
+
}'
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Comandos de gestión
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
claude-notifications-go start --config ~/.claude/notifications/config.json
|
|
130
|
+
claude-notifications-go status
|
|
131
|
+
claude-notifications-go test --canal telegram
|
|
132
|
+
claude-notifications-go log --ultimas 20
|
|
133
|
+
claude-notifications-go flush-queue
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Anti-patrones
|
|
139
|
+
|
|
140
|
+
- Enviar notificaciones de prioridad `critico` para eventos rutinarios (fatiga de alertas)
|
|
141
|
+
- Hardcodear tokens en `config.json` en lugar de usar variables de entorno
|
|
142
|
+
- No configurar el horario No Molestar (interrupciones fuera de horario)
|
|
143
|
+
- Fallar el hook si la notificación falla (la notificación es best-effort)
|
|
144
|
+
- Usar el canal email para eventos de alta frecuencia
|
|
145
|
+
- Omitir `proyecto` en el payload
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
Para configuración completa de canales (config.json), formato de mensaje por canal (Desktop, Telegram, WhatsApp, Email, Webhook), rate limiting, supresión de duplicados, templates de mensajes y flujo de diagnóstico, ver [recursos/configuracion-y-templates.md](recursos/configuracion-y-templates.md).
|
|
150
|
+
|
|
151
|
+
## Gotchas / Errores comunes no obvios
|
|
152
|
+
|
|
153
|
+
**El hook falla cuando `claude-notifications-go` no está en el PATH del proceso de Claude Code aunque esté instalado globalmente**: Claude Code ejecuta hooks con un PATH reducido (sin `~/.local/bin` ni `/usr/local/bin` en algunas configuraciones de shell). Si el binario está instalado fuera del PATH del sistema base, el `execSync('claude-notifications-go send')` lanza `ENOENT` y, si el catch está vacío como se recomienda, el hook silencia el error sin notificar nada. Causa: el PATH del proceso de hook depende del shell y la configuración del usuario, no del PATH interactivo. Fix: usar la ruta absoluta del binario: `which claude-notifications-go` para obtenerla y configurarla como variable en el hook, o añadir el directorio de instalación a `PATH` en el archivo de perfil del shell que Claude Code hereda.
|
|
154
|
+
|
|
155
|
+
**Los mensajes de Telegram con más de 4,096 caracteres son silenciosamente truncados por la API de Telegram sin error**: si el campo `resumen` del payload incluye stack traces o diffs largos, la API retorna `ok: true` pero el usuario recibe el mensaje cortado sin ningún indicador visual de que falta contenido. Causa: la API de Telegram Bot tiene un límite de 4,096 caracteres por mensaje en modo texto y 1,024 en modo caption. Fix: en el hook, truncar el `resumen` a 3,500 caracteres antes de enviar y agregar `"\n... [mensaje truncado]"` si se supera el límite. Alternativamente, enviar como archivo adjunto `.txt` para mensajes largos.
|
|
156
|
+
|
|
157
|
+
**El canal email falla silenciosamente cuando el servidor SMTP requiere TLS pero `claude-notifications-go` está configurado con `port: 25` (plaintext)**: la conexión se establece pero el servidor SMTP rechaza los comandos de autenticación sin TLS. El error del servidor (`534 Authentication required`) llega como respuesta SMTP pero `claude-notifications-go` lo registra en su log local, no lo propaga al hook. Causa: el puerto 25 es para relay servidor-a-servidor sin autenticación; los usuarios deben usar 587 (STARTTLS) o 465 (SSL/TLS). Fix: configurar `port: 587` con `tls: starttls` o `port: 465` con `tls: ssl` en `config.json` según el proveedor SMTP. Verificar con `claude-notifications-go test --canal email` que devuelve éxito.
|
|
158
|
+
|
|
159
|
+
**La prioridad `critico` activa todos los canales simultáneamente, y si el canal email tiene rate limiting de 1/hora, el segundo evento crítico en menos de una hora llega sin el correo aunque sí por Telegram y desktop**: el usuario recibe la notificación pero asume que "falta el email" es un fallo del sistema, cuando en realidad es el rate limiting configurado. Causa: el rate limiting por canal se aplica independientemente de la prioridad del evento. Fix: excluir el canal email del rate limiting para eventos de prioridad `critico`, ya que son raros por definición (si son frecuentes, el problema es el uso incorrecto de la prioridad). Documentar en el runbook qué canales tienen rate limiting para evitar confusión operacional.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_instrucciones": [
|
|
3
|
+
"Copiar este archivo a ~/.claude/notifications/config.json",
|
|
4
|
+
"Reemplazar los valores entre <angulos> con los valores reales",
|
|
5
|
+
"Las credenciales sensibles deben ir en variables de entorno (sintaxis ${VAR})",
|
|
6
|
+
"Borrar este campo '_instrucciones' antes de usar el archivo"
|
|
7
|
+
],
|
|
8
|
+
"version": "2",
|
|
9
|
+
"defaults": {
|
|
10
|
+
"canal_primario": "desktop",
|
|
11
|
+
"prioridad_minima": "normal",
|
|
12
|
+
"idioma": "es-MX",
|
|
13
|
+
"zona_horaria": "America/Mexico_City"
|
|
14
|
+
},
|
|
15
|
+
"notificaciones": {
|
|
16
|
+
"desktop": {
|
|
17
|
+
"enabled": true,
|
|
18
|
+
"motor": "auto",
|
|
19
|
+
"icono": "~/.claude/assets/swl-icon.png",
|
|
20
|
+
"sonido": true,
|
|
21
|
+
"duracion_ms": 5000,
|
|
22
|
+
"persistente_si_prioridad": "urgente"
|
|
23
|
+
},
|
|
24
|
+
"telegram": {
|
|
25
|
+
"enabled": false,
|
|
26
|
+
"bot_token": "${TELEGRAM_BOT_TOKEN}",
|
|
27
|
+
"chat_id": "${TELEGRAM_CHAT_ID}",
|
|
28
|
+
"parse_mode": "HTML",
|
|
29
|
+
"disable_preview": true,
|
|
30
|
+
"timeout_segundos": 10,
|
|
31
|
+
"_nota": "Crear bot en @BotFather, obtener token. Agregar bot al chat y obtener chat_id via /getUpdates"
|
|
32
|
+
},
|
|
33
|
+
"whatsapp": {
|
|
34
|
+
"enabled": false,
|
|
35
|
+
"proveedor": "twilio",
|
|
36
|
+
"account_sid": "${TWILIO_ACCOUNT_SID}",
|
|
37
|
+
"auth_token": "${TWILIO_AUTH_TOKEN}",
|
|
38
|
+
"from_number": "${TWILIO_WHATSAPP_FROM}",
|
|
39
|
+
"to_number": "${WHATSAPP_TO_NUMBER}",
|
|
40
|
+
"_nota": "Requiere cuenta Twilio con WhatsApp Sandbox habilitado. from_number formato: whatsapp:+14155238886"
|
|
41
|
+
},
|
|
42
|
+
"email": {
|
|
43
|
+
"enabled": false,
|
|
44
|
+
"smtp_host": "${SMTP_HOST}",
|
|
45
|
+
"smtp_port": 587,
|
|
46
|
+
"smtp_user": "${SMTP_USER}",
|
|
47
|
+
"smtp_password": "${SMTP_PASSWORD}",
|
|
48
|
+
"smtp_tls": true,
|
|
49
|
+
"from": "swl-notifier@<tu-dominio.com>",
|
|
50
|
+
"to": ["<destinatario@empresa.com>"],
|
|
51
|
+
"asunto_prefijo": "[SWL]",
|
|
52
|
+
"_nota": "Para Gmail usar smtp.gmail.com:587 con App Password (no la contraseña de la cuenta)"
|
|
53
|
+
},
|
|
54
|
+
"webhook": {
|
|
55
|
+
"enabled": false,
|
|
56
|
+
"url": "${WEBHOOK_URL}",
|
|
57
|
+
"metodo": "POST",
|
|
58
|
+
"headers": {
|
|
59
|
+
"Authorization": "Bearer ${WEBHOOK_TOKEN}",
|
|
60
|
+
"Content-Type": "application/json"
|
|
61
|
+
},
|
|
62
|
+
"timeout_segundos": 5,
|
|
63
|
+
"reintentos": 2,
|
|
64
|
+
"_nota": "El payload enviado sigue el esquema de webhook definido en la habilidad notificaciones-multicanal"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"prioridades": {
|
|
68
|
+
"mapeo": {
|
|
69
|
+
"checkpoint.human-action": "urgente",
|
|
70
|
+
"checkpoint.decision": "alta",
|
|
71
|
+
"checkpoint.human-verify": "normal",
|
|
72
|
+
"error.critico": "critico",
|
|
73
|
+
"error.recuperable": "alta",
|
|
74
|
+
"fase.completada": "normal",
|
|
75
|
+
"fase.iniciada": "baja",
|
|
76
|
+
"tarea.completada": "baja",
|
|
77
|
+
"alerta.seguridad": "critico"
|
|
78
|
+
},
|
|
79
|
+
"canales_por_nivel": {
|
|
80
|
+
"critico": ["desktop", "telegram", "email", "whatsapp"],
|
|
81
|
+
"urgente": ["desktop", "telegram"],
|
|
82
|
+
"alta": ["desktop", "telegram"],
|
|
83
|
+
"normal": ["desktop"],
|
|
84
|
+
"baja": []
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"rate_limiting": {
|
|
88
|
+
"ventana_segundos": 300,
|
|
89
|
+
"maximo_por_ventana": {
|
|
90
|
+
"desktop": 10,
|
|
91
|
+
"telegram": 20,
|
|
92
|
+
"whatsapp": 5,
|
|
93
|
+
"email": 3,
|
|
94
|
+
"webhook": 50
|
|
95
|
+
},
|
|
96
|
+
"excepcion_prioridades": ["critico", "urgente"]
|
|
97
|
+
},
|
|
98
|
+
"no_molestar": {
|
|
99
|
+
"habilitado": false,
|
|
100
|
+
"inicio": "22:00",
|
|
101
|
+
"fin": "08:00",
|
|
102
|
+
"zona_horaria": "America/Mexico_City",
|
|
103
|
+
"excepciones": ["critico"],
|
|
104
|
+
"acumulacion": {
|
|
105
|
+
"habilitada": true,
|
|
106
|
+
"resumen_en": "08:00",
|
|
107
|
+
"canal_resumen": "telegram"
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"deduplicacion": {
|
|
111
|
+
"habilitada": true,
|
|
112
|
+
"ventana_segundos": 60,
|
|
113
|
+
"clave": "evento.tipo + evento.proyecto + mensaje.titulo"
|
|
114
|
+
}
|
|
115
|
+
}
|