@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,222 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* lib/model-router.js
|
|
5
|
+
* Model Router — Sugiere modelo optimo por complejidad de tarea.
|
|
6
|
+
*
|
|
7
|
+
* No fuerza el modelo (Claude Code lo decide), pero el orquestador
|
|
8
|
+
* puede usar esta sugerencia al delegar a subagentes.
|
|
9
|
+
*
|
|
10
|
+
* API publica:
|
|
11
|
+
* sugerirModelo(descripcionTarea, contexto) → { modelo, complejidad, razon, costoRelativo }
|
|
12
|
+
* MODELOS → { HAIKU, SONNET, OPUS }
|
|
13
|
+
* COMPLEJIDAD → { trivial, estandar, compleja }
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Constantes de modelos
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Identificadores canonicos de modelo por tier de capacidad.
|
|
22
|
+
*/
|
|
23
|
+
const MODELOS = {
|
|
24
|
+
HAIKU: 'haiku',
|
|
25
|
+
SONNET: 'sonnet',
|
|
26
|
+
OPUS: 'opus',
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Tabla de complejidad
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Mapa de nivel de complejidad a modelo recomendado e indicadores de deteccion.
|
|
35
|
+
*
|
|
36
|
+
* El orden de evaluacion es: compleja → trivial → estandar (fallback).
|
|
37
|
+
* Se usa el primer indicador que coincida en la descripcion de la tarea.
|
|
38
|
+
*/
|
|
39
|
+
const COMPLEJIDAD = {
|
|
40
|
+
trivial: {
|
|
41
|
+
modelo: MODELOS.HAIKU,
|
|
42
|
+
indicadores: [
|
|
43
|
+
'formateo',
|
|
44
|
+
'typo',
|
|
45
|
+
'renombrar',
|
|
46
|
+
'import',
|
|
47
|
+
'lint fix',
|
|
48
|
+
'comment',
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
estandar: {
|
|
52
|
+
modelo: MODELOS.SONNET,
|
|
53
|
+
indicadores: [
|
|
54
|
+
'implementar',
|
|
55
|
+
'test',
|
|
56
|
+
'review',
|
|
57
|
+
'refactor',
|
|
58
|
+
'endpoint',
|
|
59
|
+
'componente',
|
|
60
|
+
'fix bug',
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
compleja: {
|
|
64
|
+
modelo: MODELOS.OPUS,
|
|
65
|
+
indicadores: [
|
|
66
|
+
'arquitectura',
|
|
67
|
+
'migracion',
|
|
68
|
+
'seguridad',
|
|
69
|
+
'performance',
|
|
70
|
+
'disenar',
|
|
71
|
+
'planificar',
|
|
72
|
+
'debugging profundo',
|
|
73
|
+
'sistema completo',
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Logica de evaluacion
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Busca el primer indicador de una lista que aparezca en la descripcion.
|
|
84
|
+
*
|
|
85
|
+
* @param {string} descripcion - Texto en minusculas de la tarea.
|
|
86
|
+
* @param {string[]} indicadores - Lista de indicadores a buscar.
|
|
87
|
+
* @returns {string|null} El primer indicador encontrado, o null.
|
|
88
|
+
*/
|
|
89
|
+
function primerIndicadorCoincidente(descripcion, indicadores) {
|
|
90
|
+
for (const indicador of indicadores) {
|
|
91
|
+
if (descripcion.includes(indicador)) return indicador;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// API publica
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Evalua la complejidad de una tarea y sugiere el modelo optimo.
|
|
102
|
+
*
|
|
103
|
+
* Criterios de evaluacion (en orden de prioridad):
|
|
104
|
+
* 1. Contexto estructural: archivos afectados > 20 o lenguajes > 2 → opus
|
|
105
|
+
* 2. Indicadores de complejidad alta en la descripcion → opus
|
|
106
|
+
* 3. Indicadores de complejidad trivial + archivos <= 3 → haiku
|
|
107
|
+
* 4. Fallback: complejidad estandar → sonnet
|
|
108
|
+
*
|
|
109
|
+
* @param {string} descripcionTarea - Descripcion en lenguaje natural de la tarea.
|
|
110
|
+
* @param {object} [contexto={}] - Contexto adicional de la tarea.
|
|
111
|
+
* @param {number} [contexto.archivosAfectados=0] - Numero de archivos que tocara la tarea.
|
|
112
|
+
* @param {number} [contexto.lenguajesInvolucrados=1] - Numero de lenguajes de programacion.
|
|
113
|
+
* @returns {{ modelo: string, complejidad: string, razon: string, costoRelativo: string }}
|
|
114
|
+
* - modelo: Identificador del modelo sugerido ('haiku' | 'sonnet' | 'opus').
|
|
115
|
+
* - complejidad: Nivel detectado ('trivial' | 'estandar' | 'compleja').
|
|
116
|
+
* - razon: Justificacion legible de la sugerencia.
|
|
117
|
+
* - costoRelativo: Indicador visual de costo ('$' | '$$' | '$$$').
|
|
118
|
+
*/
|
|
119
|
+
function sugerirModelo(descripcionTarea, contexto = {}) {
|
|
120
|
+
const desc = (descripcionTarea || '').toLowerCase();
|
|
121
|
+
const numArchivos = contexto.archivosAfectados || 0;
|
|
122
|
+
const numLenguajes = contexto.lenguajesInvolucrados || 1;
|
|
123
|
+
|
|
124
|
+
// Criterio 1 — Contexto estructural de alta complejidad
|
|
125
|
+
if (numArchivos > 20 || numLenguajes > 2) {
|
|
126
|
+
return {
|
|
127
|
+
modelo: MODELOS.OPUS,
|
|
128
|
+
complejidad: 'compleja',
|
|
129
|
+
razon: `${numArchivos} archivos afectados, ${numLenguajes} lenguajes involucrados`,
|
|
130
|
+
costoRelativo: '$$$',
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Criterio 2 — Indicadores de complejidad alta en la descripcion
|
|
135
|
+
const indicadorComplejo = primerIndicadorCoincidente(desc, COMPLEJIDAD.compleja.indicadores);
|
|
136
|
+
if (indicadorComplejo) {
|
|
137
|
+
return {
|
|
138
|
+
modelo: MODELOS.OPUS,
|
|
139
|
+
complejidad: 'compleja',
|
|
140
|
+
razon: `indicador de alta complejidad detectado: "${indicadorComplejo}"`,
|
|
141
|
+
costoRelativo: '$$$',
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Criterio 3 — Indicadores triviales con alcance reducido
|
|
146
|
+
const indicadorTrivial = primerIndicadorCoincidente(desc, COMPLEJIDAD.trivial.indicadores);
|
|
147
|
+
if (indicadorTrivial && numArchivos <= 3) {
|
|
148
|
+
return {
|
|
149
|
+
modelo: MODELOS.HAIKU,
|
|
150
|
+
complejidad: 'trivial',
|
|
151
|
+
razon: `tarea de bajo alcance: indicador "${indicadorTrivial}", ${numArchivos} archivos`,
|
|
152
|
+
costoRelativo: '$',
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Criterio 4 — Fallback: complejidad estandar
|
|
157
|
+
return {
|
|
158
|
+
modelo: MODELOS.SONNET,
|
|
159
|
+
complejidad: 'estandar',
|
|
160
|
+
razon: 'complejidad estandar — ningun indicador de nivel trivial o complejo detectado',
|
|
161
|
+
costoRelativo: '$$',
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// ---------------------------------------------------------------------------
|
|
166
|
+
// Proveedores — estructura extensible para routing multi-proveedor
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Registro de proveedores de LLM.
|
|
171
|
+
*
|
|
172
|
+
* Actualmente swl-ses es mono-proveedor (Anthropic). Esta estructura
|
|
173
|
+
* permite evolucionar a multi-proveedor sin cambiar la API publica.
|
|
174
|
+
*
|
|
175
|
+
* Patron inspirado en instructor.from_provider() — interfaz unificada
|
|
176
|
+
* que abstrae el proveedor detrás de un string "proveedor/modelo".
|
|
177
|
+
*
|
|
178
|
+
* Para activar: setear PROVIDER en el contexto de sugerirModelo.
|
|
179
|
+
* Sin PROVIDER, el comportamiento es idéntico al actual (Anthropic).
|
|
180
|
+
*/
|
|
181
|
+
const PROVEEDORES = {
|
|
182
|
+
anthropic: {
|
|
183
|
+
nombre: 'Anthropic',
|
|
184
|
+
modelos: {
|
|
185
|
+
opus: 'claude-opus-4-7',
|
|
186
|
+
sonnet: 'claude-sonnet-4-6',
|
|
187
|
+
haiku: 'claude-haiku-4-5-20251001',
|
|
188
|
+
},
|
|
189
|
+
costoPorMillon: { opus: 15.0, sonnet: 3.0, haiku: 0.25 },
|
|
190
|
+
default: true,
|
|
191
|
+
},
|
|
192
|
+
// Proveedores futuros — descomentar al necesitar:
|
|
193
|
+
// openai: {
|
|
194
|
+
// nombre: 'OpenAI',
|
|
195
|
+
// modelos: { alto: 'gpt-4o', medio: 'gpt-4o-mini', bajo: 'gpt-3.5-turbo' },
|
|
196
|
+
// costoPorMillon: { alto: 5.0, medio: 0.15, bajo: 0.05 },
|
|
197
|
+
// },
|
|
198
|
+
// google: {
|
|
199
|
+
// nombre: 'Google',
|
|
200
|
+
// modelos: { alto: 'gemini-pro', medio: 'gemini-flash', bajo: 'gemini-flash-lite' },
|
|
201
|
+
// costoPorMillon: { alto: 3.5, medio: 0.35, bajo: 0.075 },
|
|
202
|
+
// },
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Resuelve el identificador completo del modelo para un proveedor dado.
|
|
207
|
+
*
|
|
208
|
+
* @param {string} tier - Tier del modelo ('opus'|'sonnet'|'haiku' para Anthropic).
|
|
209
|
+
* @param {string} [proveedor='anthropic'] - Identificador del proveedor.
|
|
210
|
+
* @returns {string} Identificador completo del modelo (ej: 'claude-sonnet-4-6').
|
|
211
|
+
*/
|
|
212
|
+
function resolverModeloCompleto(tier, proveedor = 'anthropic') {
|
|
213
|
+
const prov = PROVEEDORES[proveedor];
|
|
214
|
+
if (!prov) return tier; // fallback: devolver tier tal cual
|
|
215
|
+
return prov.modelos[tier] || tier;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// Exportaciones
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
|
|
222
|
+
module.exports = { sugerirModelo, resolverModeloCompleto, MODELOS, COMPLEJIDAD, PROVEEDORES };
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* normalize-error.js — Normalización de errores cross-contexto.
|
|
5
|
+
*
|
|
6
|
+
* Inspirado en tools/error-extractors.ts de Sim Studio (simstudioai/sim).
|
|
7
|
+
* Convierte errores de distintos orígenes en una estructura uniforme que
|
|
8
|
+
* facilita el logging, reporting y decisiones de recuperación en hooks y agentes.
|
|
9
|
+
*
|
|
10
|
+
* Estructura de error normalizado (NormalizedError):
|
|
11
|
+
* {
|
|
12
|
+
* codigo: string — clave semántica (RATE_LIMIT, NOT_FOUND, TIMEOUT, ...)
|
|
13
|
+
* mensaje: string — descripción legible en español
|
|
14
|
+
* categoria: string — 'api' | 'sistema' | 'hook' | 'agente' | 'herramienta' | 'desconocido'
|
|
15
|
+
* severidad: string — 'warning' | 'error' | 'fatal'
|
|
16
|
+
* recuperable: boolean — si se puede reintentar o hay workaround
|
|
17
|
+
* fuente: string — dónde se originó (nombre de módulo/hook)
|
|
18
|
+
* detalle: string — mensaje original del error
|
|
19
|
+
* sugerencia: string|null — acción recomendada al usuario
|
|
20
|
+
* }
|
|
21
|
+
*
|
|
22
|
+
* Uso:
|
|
23
|
+
* const { normalizar, formatear } = require('./lib/normalize-error');
|
|
24
|
+
* try { ... }
|
|
25
|
+
* catch (e) {
|
|
26
|
+
* const err = normalizar(e, { fuente: 'mi-hook' });
|
|
27
|
+
* process.stderr.write(formatear(err) + '\n');
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* Zero-dependencies: solo usa Node.js built-ins.
|
|
31
|
+
*
|
|
32
|
+
* @module hooks/lib/normalize-error
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
// Tabla de patrones conocidos
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Patrones de mensajes de error → código normalizado.
|
|
41
|
+
* Se evalúan en orden; el primero que coincida gana.
|
|
42
|
+
*
|
|
43
|
+
* @type {Array<PatronError>}
|
|
44
|
+
*
|
|
45
|
+
* @typedef {object} PatronError
|
|
46
|
+
* @property {RegExp} patron — Expresión regular contra el mensaje de error
|
|
47
|
+
* @property {string} codigo — Código semántico del error
|
|
48
|
+
* @property {string} categoria — Categoría del error
|
|
49
|
+
* @property {string} severidad — Nivel de severidad
|
|
50
|
+
* @property {boolean} recuperable — Si el error permite reintento
|
|
51
|
+
* @property {string|null} sugerencia — Acción recomendada
|
|
52
|
+
*/
|
|
53
|
+
const PATRONES = [
|
|
54
|
+
// Claude API — rate limiting
|
|
55
|
+
{
|
|
56
|
+
patron: /rate.?limit|429|too many requests/i,
|
|
57
|
+
codigo: 'RATE_LIMIT',
|
|
58
|
+
categoria: 'api',
|
|
59
|
+
severidad: 'warning',
|
|
60
|
+
recuperable: true,
|
|
61
|
+
sugerencia: 'Esperar 60 segundos y reintentar. Considerar reducir la concurrencia de agentes.',
|
|
62
|
+
},
|
|
63
|
+
// Claude API — sobrecargada
|
|
64
|
+
{
|
|
65
|
+
patron: /overloaded|529|service.?unavailable/i,
|
|
66
|
+
codigo: 'API_OVERLOADED',
|
|
67
|
+
categoria: 'api',
|
|
68
|
+
severidad: 'warning',
|
|
69
|
+
recuperable: true,
|
|
70
|
+
sugerencia: 'La API de Anthropic está sobrecargada. Reintentar en 30-60 segundos.',
|
|
71
|
+
},
|
|
72
|
+
// Claude API — ventana de contexto
|
|
73
|
+
{
|
|
74
|
+
patron: /context.?window|max.?token|too.?long|token.?limit|prompt.?too.?long/i,
|
|
75
|
+
codigo: 'CONTEXT_OVERFLOW',
|
|
76
|
+
categoria: 'api',
|
|
77
|
+
severidad: 'error',
|
|
78
|
+
recuperable: true,
|
|
79
|
+
sugerencia: 'Ejecutar /swl:compactar para reducir el contexto antes de continuar.',
|
|
80
|
+
},
|
|
81
|
+
// Claude API — autenticación
|
|
82
|
+
{
|
|
83
|
+
patron: /401|unauthorized|invalid.?api.?key|authentication.?failed/i,
|
|
84
|
+
codigo: 'AUTH_FAILED',
|
|
85
|
+
categoria: 'api',
|
|
86
|
+
severidad: 'fatal',
|
|
87
|
+
recuperable: false,
|
|
88
|
+
sugerencia: 'Verificar ANTHROPIC_API_KEY en el entorno. Ejecutar `claude login` si es necesario.',
|
|
89
|
+
},
|
|
90
|
+
// Claude API — forbidden
|
|
91
|
+
{
|
|
92
|
+
patron: /403|forbidden|access.?denied/i,
|
|
93
|
+
codigo: 'FORBIDDEN',
|
|
94
|
+
categoria: 'api',
|
|
95
|
+
severidad: 'fatal',
|
|
96
|
+
recuperable: false,
|
|
97
|
+
sugerencia: 'La cuenta no tiene acceso a este modelo o recurso. Verificar plan y permisos.',
|
|
98
|
+
},
|
|
99
|
+
// Red — conexión
|
|
100
|
+
{
|
|
101
|
+
patron: /ECONNREFUSED|ECONNRESET|ENOTFOUND|socket.?hang.?up|network.?error/i,
|
|
102
|
+
codigo: 'NETWORK_ERROR',
|
|
103
|
+
categoria: 'sistema',
|
|
104
|
+
severidad: 'error',
|
|
105
|
+
recuperable: true,
|
|
106
|
+
sugerencia: 'Verificar conectividad de red y que la API de Anthropic es accesible.',
|
|
107
|
+
},
|
|
108
|
+
// Red — timeout
|
|
109
|
+
{
|
|
110
|
+
patron: /ETIMEDOUT|timed.?out|timeout/i,
|
|
111
|
+
codigo: 'TIMEOUT',
|
|
112
|
+
categoria: 'sistema',
|
|
113
|
+
severidad: 'error',
|
|
114
|
+
recuperable: true,
|
|
115
|
+
sugerencia: 'La operación tardó demasiado. Reintentar con un timeout mayor o simplificar la tarea.',
|
|
116
|
+
},
|
|
117
|
+
// Sistema — archivo no encontrado
|
|
118
|
+
{
|
|
119
|
+
patron: /ENOENT|no such file|cannot find.+module|MODULE_NOT_FOUND/i,
|
|
120
|
+
codigo: 'NOT_FOUND',
|
|
121
|
+
categoria: 'sistema',
|
|
122
|
+
severidad: 'error',
|
|
123
|
+
recuperable: false,
|
|
124
|
+
sugerencia: 'Verificar que el archivo o módulo existe en la ruta indicada.',
|
|
125
|
+
},
|
|
126
|
+
// Sistema — permisos
|
|
127
|
+
{
|
|
128
|
+
patron: /EACCES|EPERM|permission.?denied/i,
|
|
129
|
+
codigo: 'PERMISSION_DENIED',
|
|
130
|
+
categoria: 'sistema',
|
|
131
|
+
severidad: 'error',
|
|
132
|
+
recuperable: false,
|
|
133
|
+
sugerencia: 'Verificar permisos del archivo o directorio. Puede requerir privilegios elevados.',
|
|
134
|
+
},
|
|
135
|
+
// JSON — parseo
|
|
136
|
+
{
|
|
137
|
+
patron: /unexpected.?token|JSON.?parse|invalid.?json|not.?valid.?json/i,
|
|
138
|
+
codigo: 'PARSE_ERROR',
|
|
139
|
+
categoria: 'herramienta',
|
|
140
|
+
severidad: 'error',
|
|
141
|
+
recuperable: false,
|
|
142
|
+
sugerencia: 'El output recibido no es JSON válido. Verificar la fuente de datos.',
|
|
143
|
+
},
|
|
144
|
+
// Proceso — exit code no-cero
|
|
145
|
+
{
|
|
146
|
+
patron: /exit.?code\s+[1-9]|non-?zero.?exit|exited.?with\s+[1-9]/i,
|
|
147
|
+
codigo: 'PROCESS_ERROR',
|
|
148
|
+
categoria: 'hook',
|
|
149
|
+
severidad: 'error',
|
|
150
|
+
recuperable: false,
|
|
151
|
+
sugerencia: 'El comando terminó con error. Ver el output de stderr para detalles.',
|
|
152
|
+
},
|
|
153
|
+
// Agente — fallo durante ejecución
|
|
154
|
+
{
|
|
155
|
+
patron: /agent.+fail|subagent.+error|agent.+error/i,
|
|
156
|
+
codigo: 'AGENT_FAILED',
|
|
157
|
+
categoria: 'agente',
|
|
158
|
+
severidad: 'error',
|
|
159
|
+
recuperable: true,
|
|
160
|
+
sugerencia: 'El subagente falló. Revisar el prompt y los parámetros de invocación.',
|
|
161
|
+
},
|
|
162
|
+
// Seguridad — inyección detectada
|
|
163
|
+
{
|
|
164
|
+
patron: /injection|prompt.?inject|malicious.?content/i,
|
|
165
|
+
codigo: 'SECURITY_BLOCKED',
|
|
166
|
+
categoria: 'hook',
|
|
167
|
+
severidad: 'fatal',
|
|
168
|
+
recuperable: false,
|
|
169
|
+
sugerencia: 'El sistema detectó un posible intento de inyección. Revisar el input antes de continuar.',
|
|
170
|
+
},
|
|
171
|
+
// Build — error de compilación
|
|
172
|
+
{
|
|
173
|
+
patron: /SyntaxError|CompileError|build.?failed|compilation.?error/i,
|
|
174
|
+
codigo: 'BUILD_ERROR',
|
|
175
|
+
categoria: 'herramienta',
|
|
176
|
+
severidad: 'error',
|
|
177
|
+
recuperable: false,
|
|
178
|
+
sugerencia: 'Error de compilación. Revisar la sintaxis del archivo afectado.',
|
|
179
|
+
},
|
|
180
|
+
];
|
|
181
|
+
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
// Descripciones legibles
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
|
|
186
|
+
const DESCRIPCIONES = {
|
|
187
|
+
RATE_LIMIT: 'Límite de velocidad de la API alcanzado',
|
|
188
|
+
API_OVERLOADED: 'API temporalmente sobrecargada',
|
|
189
|
+
CONTEXT_OVERFLOW: 'Ventana de contexto saturada',
|
|
190
|
+
AUTH_FAILED: 'Autenticación fallida',
|
|
191
|
+
FORBIDDEN: 'Acceso prohibido al recurso',
|
|
192
|
+
NETWORK_ERROR: 'Error de red o conexión',
|
|
193
|
+
TIMEOUT: 'Tiempo de espera agotado',
|
|
194
|
+
NOT_FOUND: 'Recurso o módulo no encontrado',
|
|
195
|
+
PERMISSION_DENIED: 'Permiso denegado',
|
|
196
|
+
PARSE_ERROR: 'Error al parsear datos JSON',
|
|
197
|
+
PROCESS_ERROR: 'Proceso terminó con código de error',
|
|
198
|
+
AGENT_FAILED: 'El agente falló durante la ejecución',
|
|
199
|
+
SECURITY_BLOCKED: 'Operación bloqueada por seguridad',
|
|
200
|
+
BUILD_ERROR: 'Error de compilación o sintaxis',
|
|
201
|
+
UNKNOWN_ERROR: 'Error no reconocido',
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
// API pública
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Extrae el mensaje de texto de cualquier tipo de error.
|
|
210
|
+
*
|
|
211
|
+
* @param {unknown} error
|
|
212
|
+
* @returns {string}
|
|
213
|
+
*/
|
|
214
|
+
function extraerMensaje(error) {
|
|
215
|
+
if (error === null || error === undefined) return '(error sin mensaje)';
|
|
216
|
+
if (typeof error === 'string') return error;
|
|
217
|
+
if (error instanceof Error) return error.message;
|
|
218
|
+
if (typeof error === 'object') {
|
|
219
|
+
return String(error.message || error.msg || error.error || JSON.stringify(error).slice(0, 500));
|
|
220
|
+
}
|
|
221
|
+
return String(error);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Normaliza cualquier error en la estructura uniforme de swl-ses.
|
|
226
|
+
*
|
|
227
|
+
* @param {unknown} error — El error a normalizar (Error, string, objeto, etc.)
|
|
228
|
+
* @param {object} [opts]
|
|
229
|
+
* @param {string} [opts.fuente='desconocida'] — Módulo o hook donde ocurrió
|
|
230
|
+
* @returns {NormalizedError}
|
|
231
|
+
*
|
|
232
|
+
* @typedef {object} NormalizedError
|
|
233
|
+
* @property {string} codigo
|
|
234
|
+
* @property {string} mensaje
|
|
235
|
+
* @property {string} categoria
|
|
236
|
+
* @property {string} severidad
|
|
237
|
+
* @property {boolean} recuperable
|
|
238
|
+
* @property {string} fuente
|
|
239
|
+
* @property {string} detalle
|
|
240
|
+
* @property {string|null} sugerencia
|
|
241
|
+
*/
|
|
242
|
+
function normalizar(error, opts = {}) {
|
|
243
|
+
const fuente = String(opts.fuente || 'desconocida');
|
|
244
|
+
const detalle = extraerMensaje(error);
|
|
245
|
+
|
|
246
|
+
// Buscar primer patrón coincidente
|
|
247
|
+
for (const p of PATRONES) {
|
|
248
|
+
if (p.patron.test(detalle)) {
|
|
249
|
+
return {
|
|
250
|
+
codigo: p.codigo,
|
|
251
|
+
mensaje: DESCRIPCIONES[p.codigo] || p.codigo,
|
|
252
|
+
categoria: p.categoria,
|
|
253
|
+
severidad: p.severidad,
|
|
254
|
+
recuperable: p.recuperable,
|
|
255
|
+
fuente,
|
|
256
|
+
detalle,
|
|
257
|
+
sugerencia: p.sugerencia,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Fallback — error desconocido
|
|
263
|
+
return {
|
|
264
|
+
codigo: 'UNKNOWN_ERROR',
|
|
265
|
+
mensaje: DESCRIPCIONES.UNKNOWN_ERROR,
|
|
266
|
+
categoria: 'desconocido',
|
|
267
|
+
severidad: 'error',
|
|
268
|
+
recuperable: false,
|
|
269
|
+
fuente,
|
|
270
|
+
detalle,
|
|
271
|
+
sugerencia: null,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Formatea un error normalizado como texto legible para logs o mensajes al usuario.
|
|
277
|
+
* Produce una línea principal + líneas de detalle y sugerencia si aplica.
|
|
278
|
+
*
|
|
279
|
+
* @param {NormalizedError} err
|
|
280
|
+
* @returns {string}
|
|
281
|
+
*/
|
|
282
|
+
function formatear(err) {
|
|
283
|
+
const iconos = { warning: '⚠', error: '✗', fatal: '✗✗' };
|
|
284
|
+
const icono = iconos[err.severidad] || '?';
|
|
285
|
+
const recuperable = err.recuperable ? ' (recuperable)' : '';
|
|
286
|
+
|
|
287
|
+
let txt = `${icono} [${err.codigo}] ${err.mensaje}${recuperable}`;
|
|
288
|
+
|
|
289
|
+
if (err.fuente && err.fuente !== 'desconocida') {
|
|
290
|
+
txt += ` — ${err.fuente}`;
|
|
291
|
+
}
|
|
292
|
+
if (err.detalle && err.detalle !== err.mensaje && err.detalle !== '(error sin mensaje)') {
|
|
293
|
+
txt += `\n Detalle: ${err.detalle.slice(0, 300)}`;
|
|
294
|
+
}
|
|
295
|
+
if (err.sugerencia) {
|
|
296
|
+
txt += `\n Sugerencia: ${err.sugerencia}`;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return txt;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Convierte a JSON compacto para logging estructurado en JSONL.
|
|
304
|
+
*
|
|
305
|
+
* @param {NormalizedError} err
|
|
306
|
+
* @returns {string} Una línea JSON
|
|
307
|
+
*/
|
|
308
|
+
function formatearJSON(err) {
|
|
309
|
+
return JSON.stringify({
|
|
310
|
+
ts: new Date().toISOString(),
|
|
311
|
+
codigo: err.codigo,
|
|
312
|
+
categoria: err.categoria,
|
|
313
|
+
severidad: err.severidad,
|
|
314
|
+
recuperable: err.recuperable,
|
|
315
|
+
fuente: err.fuente,
|
|
316
|
+
detalle: err.detalle?.slice(0, 200),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// ---------------------------------------------------------------------------
|
|
321
|
+
// Exports
|
|
322
|
+
// ---------------------------------------------------------------------------
|
|
323
|
+
|
|
324
|
+
module.exports = { normalizar, extraerMensaje, formatear, formatearJSON };
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Normalize Input — Normalización anti-bypass para detección de seguridad.
|
|
5
|
+
*
|
|
6
|
+
* Previene evasión de patrones de detección mediante:
|
|
7
|
+
* - Caracteres Unicode fullwidth (A→A, 0→0)
|
|
8
|
+
* - Secuencias ANSI escape (colores, movimiento de cursor)
|
|
9
|
+
* - Null bytes (\x00)
|
|
10
|
+
* - Caracteres de control (excepto \n y \t)
|
|
11
|
+
*
|
|
12
|
+
* Patrón adoptado de Hermes Agent (approval.py → _normalize_command_for_detection).
|
|
13
|
+
*
|
|
14
|
+
* @module hooks/lib/normalize-input
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Regex para secuencias ANSI escape.
|
|
19
|
+
*
|
|
20
|
+
* Cubre:
|
|
21
|
+
* - CSI (Control Sequence Introducer): \x1B[ ... letra
|
|
22
|
+
* - OSC (Operating System Command): \x1B] ... (BEL o ST)
|
|
23
|
+
* - DCS (Device Control String): \x1BP ... ST
|
|
24
|
+
* - 8-bit C1 control codes: \x80-\x9F
|
|
25
|
+
*/
|
|
26
|
+
const ANSI_ESCAPE_RE = /\x1B\[[0-9;]*[a-zA-Z]|\x1B\][^\x07\x1B]*(?:\x07|\x1B\\)|\x1BP[^\x1B]*\x1B\\|[\x80-\x9F]/g;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Regex para caracteres de control (excepto newline \x0A y tab \x09).
|
|
30
|
+
*/
|
|
31
|
+
const CONTROL_CHARS_RE = /[\x01-\x08\x0B\x0C\x0E-\x1F\x7F]/g;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Normaliza texto para detección de patrones de seguridad.
|
|
35
|
+
*
|
|
36
|
+
* Debe aplicarse ANTES de evaluar cualquier regex de detección
|
|
37
|
+
* (secretos, credenciales, comandos peligrosos, inyecciones de prompt).
|
|
38
|
+
*
|
|
39
|
+
* @param {string} text - Texto a normalizar.
|
|
40
|
+
* @returns {string} Texto normalizado.
|
|
41
|
+
*/
|
|
42
|
+
function normalizeForDetection(text) {
|
|
43
|
+
if (!text || typeof text !== 'string') return '';
|
|
44
|
+
|
|
45
|
+
let normalized = text;
|
|
46
|
+
|
|
47
|
+
// 1. Strip null bytes (técnica de bypass clásica)
|
|
48
|
+
normalized = normalized.replace(/\x00/g, '');
|
|
49
|
+
|
|
50
|
+
// 2. Strip ANSI escape sequences (ocultan contenido en terminales)
|
|
51
|
+
normalized = normalized.replace(ANSI_ESCAPE_RE, '');
|
|
52
|
+
|
|
53
|
+
// 3. Unicode NFKC normalization
|
|
54
|
+
// - Fullwidth Latin → ASCII (A→A, 0→0, rm→rm)
|
|
55
|
+
// - Halfwidth Katakana → regular
|
|
56
|
+
// - Compatibility decomposition + canonical composition
|
|
57
|
+
normalized = normalized.normalize('NFKC');
|
|
58
|
+
|
|
59
|
+
// 4. Strip caracteres de control (excepto newline y tab)
|
|
60
|
+
normalized = normalized.replace(CONTROL_CHARS_RE, '');
|
|
61
|
+
|
|
62
|
+
return normalized;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
module.exports = { normalizeForDetection };
|