@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,246 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Hook: inyeccion-contexto.js
|
|
6
|
+
* Tipo: PostToolUse
|
|
7
|
+
*
|
|
8
|
+
* Inyecta automáticamente contexto de la sesión anterior al inicio
|
|
9
|
+
* de una nueva sesión. Inspirado en claude-mem's context injection.
|
|
10
|
+
*
|
|
11
|
+
* Comportamiento:
|
|
12
|
+
* - Solo actúa en la primera invocación de la sesión
|
|
13
|
+
* - Lee la sesión anterior desde .planning/sessions/latest.json
|
|
14
|
+
* - Genera un bloque de contexto con resumen, archivos, agentes
|
|
15
|
+
* - Lee instintos activos del proyecto (instintos/proyecto.yaml)
|
|
16
|
+
* - Escribe el contexto en stdout una sola vez
|
|
17
|
+
* - Marca como inyectado en bridge para no repetir
|
|
18
|
+
*
|
|
19
|
+
* Resultado:
|
|
20
|
+
* - Primera invocación con contexto previo: stdout con contexto
|
|
21
|
+
* - Invocaciones siguientes: exit 0 silencioso
|
|
22
|
+
* - Sin sesión previa: exit 0 silencioso
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const fs = require('fs');
|
|
26
|
+
const path = require('path');
|
|
27
|
+
const os = require('os');
|
|
28
|
+
|
|
29
|
+
const { getOrBuildSnapshot } = require('./lib/context-builder');
|
|
30
|
+
const { sanitize: scanInjection } = require('./lib/prompt-injection-scanner');
|
|
31
|
+
|
|
32
|
+
// Detección de stack para sugerencia de skills
|
|
33
|
+
let _techDetector = null;
|
|
34
|
+
try { _techDetector = require('./lib/tech-skills-map'); } catch (_) {}
|
|
35
|
+
|
|
36
|
+
// Solo inyectar en la primera invocación
|
|
37
|
+
const MAX_INVOCACION_PARA_INYECTAR = 1;
|
|
38
|
+
|
|
39
|
+
function leerSesionAnterior(cwd) {
|
|
40
|
+
const latestPath = path.join(cwd, '.planning', 'sessions', 'latest.json');
|
|
41
|
+
if (!fs.existsSync(latestPath)) return null;
|
|
42
|
+
|
|
43
|
+
try {
|
|
44
|
+
const { path: sessionPath } = JSON.parse(fs.readFileSync(latestPath, 'utf8'));
|
|
45
|
+
if (!sessionPath || !fs.existsSync(sessionPath)) return null;
|
|
46
|
+
return JSON.parse(fs.readFileSync(sessionPath, 'utf8'));
|
|
47
|
+
} catch (_) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function leerInstintosActivos(cwd) {
|
|
53
|
+
const instPath = path.join(cwd, 'instintos', 'proyecto.yaml');
|
|
54
|
+
if (!fs.existsSync(instPath)) return [];
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const contenido = fs.readFileSync(instPath, 'utf8');
|
|
58
|
+
// Parse simple YAML — extraer instintos con confidence > 0.7
|
|
59
|
+
const instintos = [];
|
|
60
|
+
const regex = /pattern:\s*"([^"]+)"[\s\S]*?confidence:\s*([\d.]+)/g;
|
|
61
|
+
let match;
|
|
62
|
+
while ((match = regex.exec(contenido)) !== null) {
|
|
63
|
+
const confidence = parseFloat(match[2]);
|
|
64
|
+
if (confidence >= 0.7) {
|
|
65
|
+
instintos.push({ pattern: match[1], confidence });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return instintos.sort((a, b) => b.confidence - a.confidence).slice(0, 5);
|
|
69
|
+
} catch (_) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function leerContextoActivo(cwd) {
|
|
75
|
+
const ctxPath = path.join(cwd, '.planning', 'CONTEXTO.md');
|
|
76
|
+
if (!fs.existsSync(ctxPath)) return 'dev';
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
const contenido = fs.readFileSync(ctxPath, 'utf8');
|
|
80
|
+
const match = contenido.match(/\*\*Modo\*\*:\s*(\w+)/);
|
|
81
|
+
return match ? match[1] : 'dev';
|
|
82
|
+
} catch (_) {
|
|
83
|
+
return 'dev';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function generarContexto(sesion, instintos, modo) {
|
|
88
|
+
const duracion = sesion.endTime
|
|
89
|
+
? `${Math.round((new Date(sesion.endTime) - new Date(sesion.startTime)) / 60000)} min`
|
|
90
|
+
: 'en progreso';
|
|
91
|
+
|
|
92
|
+
const archivos = (sesion.filesChanged || []).slice(0, 10);
|
|
93
|
+
const agentes = (sesion.agentsInvoked || []).slice(0, 5);
|
|
94
|
+
const topTools = Object.entries(sesion.metricas?.herramientas || {})
|
|
95
|
+
.sort((a, b) => b[1] - a[1])
|
|
96
|
+
.slice(0, 3)
|
|
97
|
+
.map(([tool, count]) => `${tool}(${count})`)
|
|
98
|
+
.join(', ');
|
|
99
|
+
|
|
100
|
+
const lineas = [
|
|
101
|
+
'',
|
|
102
|
+
'--- CONTEXTO DE SESIÓN ANTERIOR (inyectado automáticamente) ---',
|
|
103
|
+
` Sesión: ${sesion.id} | ${duracion} | Modo: ${modo}`,
|
|
104
|
+
` Tool calls: ${sesion.toolCalls} | Costo: ~$${(sesion.costEstimated || 0).toFixed(2)}`,
|
|
105
|
+
];
|
|
106
|
+
|
|
107
|
+
if (topTools) {
|
|
108
|
+
lineas.push(` Herramientas: ${topTools}`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (archivos.length > 0) {
|
|
112
|
+
lineas.push(` Archivos modificados: ${archivos.slice(0, 5).join(', ')}${archivos.length > 5 ? ` (+${archivos.length - 5} mas)` : ''}`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (agentes.length > 0) {
|
|
116
|
+
lineas.push(` Agentes: ${agentes.join(', ')}`);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (sesion.summary) {
|
|
120
|
+
lineas.push(` Resumen: ${sesion.summary.slice(0, 200)}`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (instintos.length > 0) {
|
|
124
|
+
lineas.push(' Instintos activos:');
|
|
125
|
+
for (const inst of instintos) {
|
|
126
|
+
lineas.push(` - ${inst.pattern} (${(inst.confidence * 100).toFixed(0)}%)`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
lineas.push('--- FIN CONTEXTO ANTERIOR ---');
|
|
131
|
+
lineas.push('');
|
|
132
|
+
|
|
133
|
+
return lineas.join('\n');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Detecta el stack del proyecto y genera sugerencia de skills de comunidad
|
|
138
|
+
* si hay tecnologías con skills disponibles en skills.sh que SWL no cubre.
|
|
139
|
+
*
|
|
140
|
+
* @param {string} cwd
|
|
141
|
+
* @returns {string} Bloque de texto con sugerencia, o '' si no aplica.
|
|
142
|
+
*/
|
|
143
|
+
function generarSugerenciaSkillsComunidad(cwd) {
|
|
144
|
+
if (!_techDetector) return '';
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
const { skills, agentes } = _techDetector.sugerirSkills(cwd);
|
|
148
|
+
if (skills.length === 0) return '';
|
|
149
|
+
|
|
150
|
+
// Verificar si ya hay skills de comunidad instalados (.agents/skills/)
|
|
151
|
+
const agentsSkillsDir = path.join(cwd, '.agents', 'skills');
|
|
152
|
+
const yaTieneComunidad = fs.existsSync(agentsSkillsDir);
|
|
153
|
+
|
|
154
|
+
// Generar resumen de stack
|
|
155
|
+
const resumen = _techDetector.generarResumenStack(cwd);
|
|
156
|
+
if (!resumen) return '';
|
|
157
|
+
|
|
158
|
+
const lineas = [
|
|
159
|
+
'',
|
|
160
|
+
'--- STACK DETECTADO ---',
|
|
161
|
+
` ${resumen.split('\n').slice(1).join('\n ')}`,
|
|
162
|
+
];
|
|
163
|
+
|
|
164
|
+
if (!yaTieneComunidad) {
|
|
165
|
+
// Solo sugerir si no tiene skills de comunidad aun
|
|
166
|
+
lineas.push(' Skills de comunidad: ejecuta `npx autoskills --dry-run` para ver skills oficiales disponibles');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
lineas.push('--- FIN STACK ---');
|
|
170
|
+
lineas.push('');
|
|
171
|
+
|
|
172
|
+
return lineas.join('\n');
|
|
173
|
+
} catch (_) {
|
|
174
|
+
return '';
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// --- Entrypoint ---
|
|
179
|
+
let inputRaw = '';
|
|
180
|
+
|
|
181
|
+
process.stdin.on('data', chunk => {
|
|
182
|
+
inputRaw += chunk;
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
process.stdin.on('end', () => {
|
|
186
|
+
try {
|
|
187
|
+
const data = JSON.parse(inputRaw);
|
|
188
|
+
const sessionId = String(data.session_id || 'default');
|
|
189
|
+
|
|
190
|
+
// Leer bridge para verificar si ya inyectamos
|
|
191
|
+
const bridgePath = path.join(os.tmpdir(), `swl-ctx-${sessionId}.json`);
|
|
192
|
+
let bridge = {};
|
|
193
|
+
try {
|
|
194
|
+
bridge = JSON.parse(fs.readFileSync(bridgePath, 'utf8'));
|
|
195
|
+
} catch (_) {}
|
|
196
|
+
|
|
197
|
+
// Solo inyectar en la primera invocacion
|
|
198
|
+
const invocaciones = bridge.invocaciones || 0;
|
|
199
|
+
if (invocaciones > MAX_INVOCACION_PARA_INYECTAR || bridge.contextoInyectado) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
const cwd = process.cwd();
|
|
204
|
+
const sesion = leerSesionAnterior(cwd);
|
|
205
|
+
|
|
206
|
+
// Solo inyectar si la sesion anterior tiene contenido util
|
|
207
|
+
if (!sesion || sesion.toolCalls < 5) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// No inyectar si la sesión anterior es la misma sesión activa
|
|
212
|
+
if (sesion.status === 'active') {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const instintos = leerInstintosActivos(cwd);
|
|
217
|
+
const modo = leerContextoActivo(cwd);
|
|
218
|
+
let contexto = generarContexto(sesion, instintos, modo);
|
|
219
|
+
|
|
220
|
+
// Escanear contexto por inyecciones de prompt antes de inyectar
|
|
221
|
+
const scanResult = scanInjection(contexto, 'contexto-sesion-anterior');
|
|
222
|
+
if (scanResult.blocked) {
|
|
223
|
+
contexto = scanResult.content; // Placeholder de bloqueo
|
|
224
|
+
} else {
|
|
225
|
+
contexto = scanResult.content; // Original o con advertencia
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Marcar como inyectado en bridge
|
|
229
|
+
try {
|
|
230
|
+
bridge.contextoInyectado = true;
|
|
231
|
+
bridge.contextoTimestamp = new Date().toISOString();
|
|
232
|
+
fs.writeFileSync(bridgePath, JSON.stringify(bridge, null, 2), 'utf8');
|
|
233
|
+
} catch (_) {}
|
|
234
|
+
|
|
235
|
+
// Emitir contexto de sesión anterior
|
|
236
|
+
process.stdout.write(contexto);
|
|
237
|
+
|
|
238
|
+
// Emitir sugerencia de stack y skills de comunidad
|
|
239
|
+
const stackSugerencia = generarSugerenciaSkillsComunidad(cwd);
|
|
240
|
+
if (stackSugerencia) {
|
|
241
|
+
process.stdout.write(stackSugerencia);
|
|
242
|
+
}
|
|
243
|
+
} catch (err) {
|
|
244
|
+
// No escribir a stderr — Claude Code lo reporta como hook error
|
|
245
|
+
}
|
|
246
|
+
});
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* abort-registry.js
|
|
5
|
+
*
|
|
6
|
+
* Registro de señales de abort para sesiones SWL. Portado del patrón
|
|
7
|
+
* InMemoryAbortRegistry de rowboat con adaptación a Claude Code hooks.
|
|
8
|
+
*
|
|
9
|
+
* Diferencia graceful vs force:
|
|
10
|
+
* graceful (abort) — Señal SIGTERM: el agente puede terminar limpiamente,
|
|
11
|
+
* cerrar conexiones MCP y escribir estado final.
|
|
12
|
+
* force (forceAbort) — Señal SIGKILL: termina inmediatamente, limpia todos
|
|
13
|
+
* los recursos sin esperar confirmaciones.
|
|
14
|
+
*
|
|
15
|
+
* Uso en hooks:
|
|
16
|
+
* const abortRegistry = require('./abort-registry');
|
|
17
|
+
*
|
|
18
|
+
* // En Stop hook o al detectar Ctrl+C:
|
|
19
|
+
* abortRegistry.abort(sessionId); // graceful
|
|
20
|
+
* abortRegistry.forceAbort(sessionId); // force
|
|
21
|
+
*
|
|
22
|
+
* // En tool execution:
|
|
23
|
+
* if (abortRegistry.isAborted(sessionId)) {
|
|
24
|
+
* // terminar limpiamente
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* // Obtener AbortSignal para pasarla a fetch/execFile:
|
|
28
|
+
* const signal = abortRegistry.getSignal(sessionId);
|
|
29
|
+
* await fetch(url, { signal });
|
|
30
|
+
*
|
|
31
|
+
* Zero-dependencies (solo AbortController nativo de Node.js 15+).
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Estado (singleton por proceso)
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
/** @type {Map<string, AbortController>} */
|
|
39
|
+
const controllers = new Map();
|
|
40
|
+
|
|
41
|
+
/** @type {Set<string>} sessionIds con force abort */
|
|
42
|
+
const forceAborted = new Set();
|
|
43
|
+
|
|
44
|
+
/** @type {Map<string, Array<() => void>>} callbacks de cleanup por sessionId */
|
|
45
|
+
const cleanupCallbacks = new Map();
|
|
46
|
+
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// API pública
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Obtiene (o crea) el AbortSignal asociado a una sesión.
|
|
53
|
+
* El signal se puede pasar a fetch(), execFile(), etc. para cancelación.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} sessionId
|
|
56
|
+
* @returns {AbortSignal}
|
|
57
|
+
*/
|
|
58
|
+
function getSignal(sessionId) {
|
|
59
|
+
if (!controllers.has(sessionId)) {
|
|
60
|
+
controllers.set(sessionId, new AbortController());
|
|
61
|
+
}
|
|
62
|
+
return controllers.get(sessionId).signal;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Abort graceful: señaliza que la sesión debe terminar limpiamente.
|
|
67
|
+
* Invoca todos los callbacks de cleanup registrados.
|
|
68
|
+
*
|
|
69
|
+
* @param {string} sessionId
|
|
70
|
+
*/
|
|
71
|
+
function abort(sessionId) {
|
|
72
|
+
const ctrl = controllers.get(sessionId);
|
|
73
|
+
if (ctrl && !ctrl.signal.aborted) {
|
|
74
|
+
ctrl.abort();
|
|
75
|
+
}
|
|
76
|
+
// Invocar callbacks de cleanup registrados
|
|
77
|
+
const callbacks = cleanupCallbacks.get(sessionId) || [];
|
|
78
|
+
for (const cb of callbacks) {
|
|
79
|
+
try { cb(); } catch (_) { /* nunca propagar errores de cleanup */ }
|
|
80
|
+
}
|
|
81
|
+
cleanupCallbacks.delete(sessionId);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Abort forzado: termina inmediatamente sin esperar cleanup.
|
|
86
|
+
* Marca la sesión como force-aborted y llama a abort().
|
|
87
|
+
*
|
|
88
|
+
* @param {string} sessionId
|
|
89
|
+
*/
|
|
90
|
+
function forceAbort(sessionId) {
|
|
91
|
+
forceAborted.add(sessionId);
|
|
92
|
+
abort(sessionId);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Verifica si una sesión ha sido abortada (graceful o force).
|
|
97
|
+
*
|
|
98
|
+
* @param {string} sessionId
|
|
99
|
+
* @returns {boolean}
|
|
100
|
+
*/
|
|
101
|
+
function isAborted(sessionId) {
|
|
102
|
+
const ctrl = controllers.get(sessionId);
|
|
103
|
+
return (ctrl?.signal.aborted) || forceAborted.has(sessionId);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Verifica si una sesión fue abortada con force (SIGKILL semantics).
|
|
108
|
+
*
|
|
109
|
+
* @param {string} sessionId
|
|
110
|
+
* @returns {boolean}
|
|
111
|
+
*/
|
|
112
|
+
function isForceAborted(sessionId) {
|
|
113
|
+
return forceAborted.has(sessionId);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Registra un callback de cleanup que se invocará al hacer abort().
|
|
118
|
+
* Útil para cerrar conexiones MCP, escribir estado final, etc.
|
|
119
|
+
*
|
|
120
|
+
* @param {string} sessionId
|
|
121
|
+
* @param {() => void} callback
|
|
122
|
+
* @returns {() => void} Función para desregistrar el callback.
|
|
123
|
+
*/
|
|
124
|
+
function onAbort(sessionId, callback) {
|
|
125
|
+
if (!cleanupCallbacks.has(sessionId)) {
|
|
126
|
+
cleanupCallbacks.set(sessionId, []);
|
|
127
|
+
}
|
|
128
|
+
cleanupCallbacks.get(sessionId).push(callback);
|
|
129
|
+
|
|
130
|
+
return function unregister() {
|
|
131
|
+
const lista = cleanupCallbacks.get(sessionId);
|
|
132
|
+
if (!lista) return;
|
|
133
|
+
const idx = lista.indexOf(callback);
|
|
134
|
+
if (idx !== -1) lista.splice(idx, 1);
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Limpia el estado de una sesión del registry (post-stop).
|
|
140
|
+
* Llamar desde el Stop hook después de procesar el resumen.
|
|
141
|
+
*
|
|
142
|
+
* @param {string} sessionId
|
|
143
|
+
*/
|
|
144
|
+
function cleanup(sessionId) {
|
|
145
|
+
controllers.delete(sessionId);
|
|
146
|
+
forceAborted.delete(sessionId);
|
|
147
|
+
cleanupCallbacks.delete(sessionId);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Estado del registry (para diagnóstico).
|
|
152
|
+
*
|
|
153
|
+
* @returns {{ active: string[], forceAborted: string[] }}
|
|
154
|
+
*/
|
|
155
|
+
function stats() {
|
|
156
|
+
return {
|
|
157
|
+
active: Array.from(controllers.keys()),
|
|
158
|
+
forceAborted: Array.from(forceAborted),
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// Integración con señales del proceso (para hooks Stop)
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
|
|
166
|
+
let _sesionActiva = null;
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Registra la sesión activa para manejo de señales del proceso.
|
|
170
|
+
* El Stop hook debe llamar esto al inicio para que SIGTERM/SIGINT
|
|
171
|
+
* disparen abort() automáticamente.
|
|
172
|
+
*
|
|
173
|
+
* @param {string} sessionId
|
|
174
|
+
*/
|
|
175
|
+
function registrarSesionActiva(sessionId) {
|
|
176
|
+
_sesionActiva = sessionId;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Instalar handlers de señal una sola vez
|
|
180
|
+
let _handlersInstalados = false;
|
|
181
|
+
function instalarHandlers() {
|
|
182
|
+
if (_handlersInstalados) return;
|
|
183
|
+
_handlersInstalados = true;
|
|
184
|
+
|
|
185
|
+
process.once('SIGTERM', () => {
|
|
186
|
+
if (_sesionActiva) abort(_sesionActiva);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// SIGINT (Ctrl+C) → primer hit graceful, segundo hit force
|
|
190
|
+
let _sigintCount = 0;
|
|
191
|
+
process.on('SIGINT', () => {
|
|
192
|
+
_sigintCount++;
|
|
193
|
+
if (!_sesionActiva) return;
|
|
194
|
+
if (_sigintCount === 1) {
|
|
195
|
+
abort(_sesionActiva);
|
|
196
|
+
} else {
|
|
197
|
+
forceAbort(_sesionActiva);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
instalarHandlers();
|
|
203
|
+
|
|
204
|
+
module.exports = {
|
|
205
|
+
getSignal,
|
|
206
|
+
abort,
|
|
207
|
+
forceAbort,
|
|
208
|
+
isAborted,
|
|
209
|
+
isForceAborted,
|
|
210
|
+
onAbort,
|
|
211
|
+
cleanup,
|
|
212
|
+
stats,
|
|
213
|
+
registrarSesionActiva,
|
|
214
|
+
};
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* agent-backend.js — Interfaz unificada de mensajes para ejecución de agentes.
|
|
5
|
+
*
|
|
6
|
+
* Portado del patrón Backend/Message/SessionResult de Multica.
|
|
7
|
+
* Define los tipos de mensaje que fluyen durante la ejecución de un agente SWL
|
|
8
|
+
* y proporciona factories para crear SessionResult estandarizados.
|
|
9
|
+
*
|
|
10
|
+
* Integra con event-bus.js para publicar eventos de agente en tiempo real.
|
|
11
|
+
* Zero-deps — solo módulos nativos de Node.js.
|
|
12
|
+
*
|
|
13
|
+
* Tipos de mensaje (alineados con Multica pkg/agent/agent.go):
|
|
14
|
+
* text — output textual del agente
|
|
15
|
+
* thinking — razonamiento interno (extended thinking)
|
|
16
|
+
* tool_use — herramienta siendo invocada
|
|
17
|
+
* tool_result — resultado de una herramienta
|
|
18
|
+
* status — cambio de estado del agente (running, paused, stopped)
|
|
19
|
+
* error — error durante la ejecución
|
|
20
|
+
* log — mensaje de log interno
|
|
21
|
+
*
|
|
22
|
+
* @module hooks/lib/agent-backend
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Tipos de mensaje
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
|
|
29
|
+
/** @enum {string} */
|
|
30
|
+
const MSG = {
|
|
31
|
+
TEXT: 'text',
|
|
32
|
+
THINKING: 'thinking',
|
|
33
|
+
TOOL_USE: 'tool_use',
|
|
34
|
+
TOOL_RESULT: 'tool_result',
|
|
35
|
+
STATUS: 'status',
|
|
36
|
+
ERROR: 'error',
|
|
37
|
+
LOG: 'log',
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** @enum {string} Estados posibles de un SessionResult */
|
|
41
|
+
const STATUS = {
|
|
42
|
+
SUCCESS: 'success',
|
|
43
|
+
FAILED: 'failed',
|
|
44
|
+
STOPPED: 'stopped',
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
// Factories
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Crea un objeto Message estandarizado.
|
|
53
|
+
*
|
|
54
|
+
* @param {string} type - Uno de MSG.*
|
|
55
|
+
* @param {string} content - Contenido del mensaje
|
|
56
|
+
* @param {object} [meta] - Metadatos opcionales (toolName, toolInput, etc.)
|
|
57
|
+
* @returns {{ type, content, meta, timestamp }}
|
|
58
|
+
*/
|
|
59
|
+
function crearMensaje(type, content, meta = {}) {
|
|
60
|
+
return {
|
|
61
|
+
type,
|
|
62
|
+
content: String(content || ''),
|
|
63
|
+
meta,
|
|
64
|
+
timestamp: new Date().toISOString(),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Crea un SessionResult estandarizado al finalizar la ejecución de un agente.
|
|
70
|
+
*
|
|
71
|
+
* @param {object} opts
|
|
72
|
+
* @param {'success'|'failed'|'stopped'} [opts.status] - Estado final
|
|
73
|
+
* @param {string} [opts.error] - Mensaje de error si status='failed'
|
|
74
|
+
* @param {number} [opts.inputTokens] - Tokens de entrada consumidos
|
|
75
|
+
* @param {number} [opts.outputTokens] - Tokens de salida producidos
|
|
76
|
+
* @param {number} [opts.cacheRead] - Tokens leídos de caché
|
|
77
|
+
* @param {string} [opts.agente] - Nombre del agente
|
|
78
|
+
* @param {string} [opts.slice] - Nombre del slice ejecutado
|
|
79
|
+
* @param {object[]} [opts.mensajes] - Array de mensajes producidos durante la sesión
|
|
80
|
+
* @returns {object} SessionResult completo
|
|
81
|
+
*/
|
|
82
|
+
function crearSessionResult(opts = {}) {
|
|
83
|
+
const inputTokens = Number(opts.inputTokens || 0);
|
|
84
|
+
const outputTokens = Number(opts.outputTokens || 0);
|
|
85
|
+
const cacheRead = Number(opts.cacheRead || 0);
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
status: opts.status || STATUS.SUCCESS,
|
|
89
|
+
error: opts.error || null,
|
|
90
|
+
agente: opts.agente || 'desconocido',
|
|
91
|
+
slice: opts.slice || '',
|
|
92
|
+
uso: {
|
|
93
|
+
inputTokens,
|
|
94
|
+
outputTokens,
|
|
95
|
+
totalTokens: inputTokens + outputTokens,
|
|
96
|
+
cacheRead,
|
|
97
|
+
},
|
|
98
|
+
mensajes: opts.mensajes || [],
|
|
99
|
+
timestamp: new Date().toISOString(),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Integración con event-bus
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Publica un evento de agente al event-bus.
|
|
109
|
+
* Importación lazy para evitar dependencia circular.
|
|
110
|
+
*
|
|
111
|
+
* @param {string} tipo - 'agent:started' | 'agent:message' | 'agent:completed' | 'agent:failed'
|
|
112
|
+
* @param {object} payload - Datos del evento
|
|
113
|
+
* @param {string} [runId] - ID de la sesión (default: 'default')
|
|
114
|
+
*/
|
|
115
|
+
function publicar(tipo, payload, runId = 'default') {
|
|
116
|
+
try {
|
|
117
|
+
const bus = require('./event-bus');
|
|
118
|
+
bus.publish({ type: tipo, runId, ...payload, timestamp: new Date().toISOString() });
|
|
119
|
+
} catch (_) {
|
|
120
|
+
// Silencioso — el bus puede no estar disponible en todos los contextos
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
// Helpers de ciclo de vida
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Emite el evento de inicio de un agente.
|
|
130
|
+
*
|
|
131
|
+
* @param {string} agente - Nombre del agente SWL
|
|
132
|
+
* @param {string} slice - Slice que ejecuta
|
|
133
|
+
* @param {string} [runId] - ID de sesión
|
|
134
|
+
*/
|
|
135
|
+
function emitirInicio(agente, slice, runId) {
|
|
136
|
+
publicar('agent:started', { agente, slice }, runId);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Emite un mensaje producido por el agente durante su ejecución.
|
|
141
|
+
*
|
|
142
|
+
* @param {object} mensaje - Objeto creado con crearMensaje()
|
|
143
|
+
* @param {string} agente - Nombre del agente
|
|
144
|
+
* @param {string} [runId]
|
|
145
|
+
*/
|
|
146
|
+
function emitirMensaje(mensaje, agente, runId) {
|
|
147
|
+
publicar('agent:message', { mensaje, agente }, runId);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Emite el evento de finalización de un agente con su SessionResult.
|
|
152
|
+
*
|
|
153
|
+
* @param {object} sessionResult - Objeto creado con crearSessionResult()
|
|
154
|
+
* @param {string} [runId]
|
|
155
|
+
*/
|
|
156
|
+
function emitirCompletado(sessionResult, runId) {
|
|
157
|
+
const tipo = sessionResult.status === STATUS.FAILED ? 'agent:failed' : 'agent:completed';
|
|
158
|
+
publicar(tipo, { resultado: sessionResult }, runId);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
// Extracción de SessionResult desde payload de hook PostToolUse
|
|
163
|
+
// ---------------------------------------------------------------------------
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Construye un SessionResult a partir del payload JSON que Claude Code envía
|
|
167
|
+
* al hook PostToolUse cuando la herramienta es 'Agent'.
|
|
168
|
+
*
|
|
169
|
+
* @param {object} hookPayload - Payload JSON del hook
|
|
170
|
+
* @returns {object} SessionResult
|
|
171
|
+
*/
|
|
172
|
+
function desdePayloadHook(hookPayload) {
|
|
173
|
+
const input = hookPayload.tool_input || {};
|
|
174
|
+
const result = hookPayload.tool_result || {};
|
|
175
|
+
const agente = String(input.subagent_type || 'general-purpose');
|
|
176
|
+
const slice = String(input.description || '').slice(0, 80);
|
|
177
|
+
|
|
178
|
+
// Detectar error en el resultado
|
|
179
|
+
const resultStr = typeof result === 'string' ? result : JSON.stringify(result || '');
|
|
180
|
+
const hayError = /\berror\b|\bfailed\b|\bexception\b/i.test(resultStr);
|
|
181
|
+
|
|
182
|
+
// Extraer tokens del payload si el runtime los expone
|
|
183
|
+
const usage = hookPayload.usage || hookPayload.tool_result?.usage || {};
|
|
184
|
+
|
|
185
|
+
return crearSessionResult({
|
|
186
|
+
status: hayError ? STATUS.FAILED : STATUS.SUCCESS,
|
|
187
|
+
error: hayError ? resultStr.slice(0, 200) : null,
|
|
188
|
+
agente,
|
|
189
|
+
slice,
|
|
190
|
+
inputTokens: Number(usage.input_tokens || usage.inputTokens || 0),
|
|
191
|
+
outputTokens: Number(usage.output_tokens || usage.outputTokens || 0),
|
|
192
|
+
cacheRead: Number(usage.cache_read_tokens || 0),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
// Exports
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
|
|
200
|
+
module.exports = {
|
|
201
|
+
MSG,
|
|
202
|
+
STATUS,
|
|
203
|
+
crearMensaje,
|
|
204
|
+
crearSessionResult,
|
|
205
|
+
publicar,
|
|
206
|
+
emitirInicio,
|
|
207
|
+
emitirMensaje,
|
|
208
|
+
emitirCompletado,
|
|
209
|
+
desdePayloadHook,
|
|
210
|
+
};
|