@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,370 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swl-dashboard
|
|
3
|
+
description: >
|
|
4
|
+
Lanza el dashboard web interactivo de uso de Claude Code (claude-usage).
|
|
5
|
+
Muestra métricas históricas de tokens, costos por modelo, sesiones y proyectos
|
|
6
|
+
con gráficos interactivos. Requiere Python 3.8+. Subcomandos: dashboard (web),
|
|
7
|
+
today (resumen de hoy en terminal), stats (estadísticas históricas en terminal).
|
|
8
|
+
Activar cuando el usuario pide ver el dashboard, análisis histórico de costos,
|
|
9
|
+
métricas de sesiones anteriores o comparativa de modelos.
|
|
10
|
+
user-invocable: false
|
|
11
|
+
version: "1.0.0"
|
|
12
|
+
herramientasPermitidas: [Read, Bash, Glob]
|
|
13
|
+
exclusiones:
|
|
14
|
+
- "No cargar para ver métricas de la sesión actual en tiempo real — usar `/swl:metricas`; este skill requiere datos históricos de múltiples sesiones en `~/.claude/projects/**/*.jsonl`."
|
|
15
|
+
- "No cargar si `claude-usage` no está disponible y el objetivo es solo verificar el estado del sistema SWL — usar `/swl:salud` que no depende de la instalación de la herramienta vendor."
|
|
16
|
+
- "No cargar para diagnosticar por qué un agente falló — este skill muestra métricas de tokens y costos, no trazas de error de agentes; para eso usar `tracing-processor` o revisar `.planning/traces/`."
|
|
17
|
+
- "No cargar en entornos CI/headless donde no hay browser para abrir el dashboard web — usar el subcomando `stats` o `today` que salen en terminal sin servidor HTTP."
|
|
18
|
+
evolvable: true # default para skill estandar
|
|
19
|
+
---
|
|
20
|
+
# Skill: swl-dashboard
|
|
21
|
+
|
|
22
|
+
Lanza el análisis de uso histórico de Claude Code mediante claude-usage
|
|
23
|
+
(scripts/vendor/claude-usage/), una herramienta Python zero-dependencies
|
|
24
|
+
que parsea los JSONL de Claude Code y genera un dashboard web interactivo.
|
|
25
|
+
|
|
26
|
+
## Subcomandos
|
|
27
|
+
|
|
28
|
+
| Subcomando | Comportamiento |
|
|
29
|
+
|------------|---------------|
|
|
30
|
+
| (vacío) o `dashboard` | Escanea JSONL → abre dashboard web en http://localhost:8080 |
|
|
31
|
+
| `today` | Imprime en terminal el resumen de consumo del día actual |
|
|
32
|
+
| `stats` | Imprime estadísticas históricas completas (all-time) |
|
|
33
|
+
| `scan` | Solo sincroniza JSONL → SQLite sin abrir dashboard |
|
|
34
|
+
|
|
35
|
+
## Paso 0 — Verificar Python disponible
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
python3 --version 2>/dev/null || python --version 2>/dev/null
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Si Python < 3.8 o no está disponible:
|
|
42
|
+
```
|
|
43
|
+
⚠ swl-dashboard requiere Python 3.8+. No se encontró intérprete compatible.
|
|
44
|
+
Instala Python desde https://python.org o usa: winget install Python.Python.3
|
|
45
|
+
Alternativa: usa /swl:metricas para métricas de la sesión actual.
|
|
46
|
+
```
|
|
47
|
+
Detener y mostrar el mensaje anterior.
|
|
48
|
+
|
|
49
|
+
## Paso 1 — Detectar intérprete y localizar cli.py
|
|
50
|
+
|
|
51
|
+
Localizar `cli.py` con búsqueda en cascada (proyecto → global ~/.claude → npm → caché npx):
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# 1. Root del proyecto actual
|
|
55
|
+
PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
56
|
+
CLI_PY="$PROJECT_ROOT/scripts/vendor/claude-usage/cli.py"
|
|
57
|
+
|
|
58
|
+
# 2. Fallback: instalación global de swl-ses en cualquier runtime compatible
|
|
59
|
+
# Copiado automáticamente por `swl-ses install --global --target <runtime>`
|
|
60
|
+
# Cubre: claude, openclaude, opencode, gemini, copilot, codex
|
|
61
|
+
if [ ! -f "$CLI_PY" ]; then
|
|
62
|
+
for RUNTIME_DIR in "$HOME/.claude" "$HOME/.openclaude" "$HOME/.opencode" "$HOME/.gemini" "$HOME/.github" "$HOME/.codex"; do
|
|
63
|
+
CANDIDATE="$RUNTIME_DIR/scripts/vendor/claude-usage/cli.py"
|
|
64
|
+
if [ -f "$CANDIDATE" ]; then
|
|
65
|
+
CLI_PY="$CANDIDATE"
|
|
66
|
+
break
|
|
67
|
+
fi
|
|
68
|
+
done
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# 3. Fallback: instalación global de npm (paquete canónico o mirror)
|
|
72
|
+
if [ ! -f "$CLI_PY" ]; then
|
|
73
|
+
NPM_GLOBAL=$(npm root -g 2>/dev/null)
|
|
74
|
+
for SCOPE in "@saulwade/swl-ses" "@saul-wade/swl-ses"; do
|
|
75
|
+
CANDIDATE="$NPM_GLOBAL/$SCOPE/scripts/vendor/claude-usage/cli.py"
|
|
76
|
+
if [ -f "$CANDIDATE" ]; then
|
|
77
|
+
CLI_PY="$CANDIDATE"
|
|
78
|
+
break
|
|
79
|
+
fi
|
|
80
|
+
done
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# 4. Fallback: caché de npx (npx swl-ses sin instalar globalmente)
|
|
84
|
+
if [ ! -f "$CLI_PY" ]; then
|
|
85
|
+
NPX_CACHE=$(npm config get cache 2>/dev/null)/_npx
|
|
86
|
+
FOUND=$(find "$NPX_CACHE" -name "cli.py" -path "*/claude-usage/cli.py" 2>/dev/null | sort -r | head -1)
|
|
87
|
+
[ -n "$FOUND" ] && CLI_PY="$FOUND"
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
echo "CLI_PY=$CLI_PY"
|
|
91
|
+
[ -f "$CLI_PY" ] && echo "OK" || echo "MISSING"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Si el resultado es `MISSING` después de los cuatro intentos:
|
|
95
|
+
```
|
|
96
|
+
⚠ claude-usage no encontrado en ninguna ubicación conocida.
|
|
97
|
+
|
|
98
|
+
La herramienta requiere que swl-ses esté instalado globalmente.
|
|
99
|
+
Ejecuta desde el directorio del repo swl-ses:
|
|
100
|
+
|
|
101
|
+
swl-ses install --global --profile completo
|
|
102
|
+
|
|
103
|
+
Esto copia claude-usage a ~/.claude/scripts/vendor/claude-usage/ y lo hace
|
|
104
|
+
disponible en todos los proyectos automáticamente.
|
|
105
|
+
|
|
106
|
+
Alternativa inmediata: /swl:metricas para métricas de la sesión actual.
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
> **Nota**: guardar `CLI_PY` y el directorio padre `VENDOR_DIR=$(dirname "$CLI_PY")` para usarlos en el Paso 2.
|
|
110
|
+
|
|
111
|
+
## Paso 2 — Ejecutar según subcomando
|
|
112
|
+
|
|
113
|
+
> Usar `CLI_PY` y `VENDOR_DIR` detectados en el Paso 1.
|
|
114
|
+
> Todos los comandos necesitan `cd "$VENDOR_DIR"` previo para que los imports relativos (scanner.py, dashboard.py) funcionen.
|
|
115
|
+
|
|
116
|
+
### Subcomando: `today`
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
cd "$VENDOR_DIR"
|
|
120
|
+
python "$CLI_PY" scan 2>/dev/null
|
|
121
|
+
python "$CLI_PY" today
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Muestra el consumo del día en terminal. Ejemplo de salida esperada:
|
|
125
|
+
```
|
|
126
|
+
------------------------------------------------------------
|
|
127
|
+
Today's Usage (2026-04-08)
|
|
128
|
+
------------------------------------------------------------
|
|
129
|
+
claude-sonnet-4-6 turns=47 in=125.4K out=42.9K cost=$0.58
|
|
130
|
+
------------------------------------------------------------
|
|
131
|
+
TOTAL turns=47 in=125.4K out=42.9K cost=$0.58
|
|
132
|
+
Sessions today: 3
|
|
133
|
+
------------------------------------------------------------
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Subcomando: `stats`
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
cd "$VENDOR_DIR"
|
|
140
|
+
python "$CLI_PY" scan 2>/dev/null
|
|
141
|
+
python "$CLI_PY" stats
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Muestra estadísticas históricas all-time con desglose por modelo y top proyectos.
|
|
145
|
+
|
|
146
|
+
### Subcomando: `scan`
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
cd "$VENDOR_DIR"
|
|
150
|
+
python "$CLI_PY" scan
|
|
151
|
+
echo "✓ Base de datos actualizada: ~/.claude/usage.db"
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Subcomando: `dashboard` (o vacío)
|
|
155
|
+
|
|
156
|
+
`cli.py` detecta automáticamente el primer puerto libre (8888 → 9090 → 9191 …).
|
|
157
|
+
**Nota:** 8080 está excluido intencionalmente — suele estar ocupado por Postgres, IIS u otros servicios.
|
|
158
|
+
Si el usuario especificó un puerto con `/swl:dashboard --port 9090`, pasarlo explícitamente.
|
|
159
|
+
|
|
160
|
+
**IMPORTANTE:** No verificar disponibilidad con `curl http://localhost:8080` — ese puerto puede estar
|
|
161
|
+
ocupado por otro servicio y devolvería un falso positivo. Usar el flujo siguiente:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
cd "$VENDOR_DIR"
|
|
165
|
+
# Scan previo para asegurar datos actualizados
|
|
166
|
+
python "$CLI_PY" scan 2>/dev/null
|
|
167
|
+
|
|
168
|
+
# Detectar qué puerto está libre ANTES de iniciar (para saber cuál reportar al usuario)
|
|
169
|
+
DASHBOARD_PORT=$(python3 -c "
|
|
170
|
+
import socket
|
|
171
|
+
candidates = [8888, 9090, 9191, 7777, 7878, 8181, 8282, 8383]
|
|
172
|
+
for p in candidates:
|
|
173
|
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
174
|
+
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
175
|
+
try:
|
|
176
|
+
s.bind(('localhost', p))
|
|
177
|
+
print(p)
|
|
178
|
+
break
|
|
179
|
+
except OSError:
|
|
180
|
+
pass
|
|
181
|
+
" 2>/dev/null)
|
|
182
|
+
|
|
183
|
+
# Si el usuario especificó un puerto explícito, usarlo en su lugar
|
|
184
|
+
# DASHBOARD_PORT="${PUERTO_EXPLICITO:-$DASHBOARD_PORT}"
|
|
185
|
+
|
|
186
|
+
# Iniciar dashboard en background con el puerto detectado
|
|
187
|
+
python "$CLI_PY" dashboard --port "$DASHBOARD_PORT" &
|
|
188
|
+
sleep 3
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Después de ejecutar el último comando, mostrar al usuario:
|
|
192
|
+
```
|
|
193
|
+
Dashboard iniciando en http://localhost:<DASHBOARD_PORT>
|
|
194
|
+
|
|
195
|
+
Filtros disponibles:
|
|
196
|
+
• Rangos de tiempo: 7d, 30d, 90d, all
|
|
197
|
+
• Selección de modelos: checkboxes interactivos
|
|
198
|
+
• URLs bookmarkeables: ?range=7d&models=claude-sonnet-4-6
|
|
199
|
+
|
|
200
|
+
Presiona Ctrl+C en el terminal para detener el servidor.
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
> El dashboard se auto-refresca cada 30 segundos. Para sesiones activas,
|
|
204
|
+
> los datos se sincronizan al detener la sesión (Stop hook).
|
|
205
|
+
|
|
206
|
+
## Paso 3 — Si falla la ejecución
|
|
207
|
+
|
|
208
|
+
Si Python devuelve error al correr cli.py:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
cd "$VENDOR_DIR"
|
|
212
|
+
python "$CLI_PY" scan 2>&1
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Mostrar el error exacto y sugerir según el tipo:
|
|
216
|
+
|
|
217
|
+
| Error | Causa | Solución |
|
|
218
|
+
|-------|-------|----------|
|
|
219
|
+
| `No module named X` | cli.py es zero-dependencies; no debería ocurrir | Verifica integridad: `head -5 "$CLI_PY"` |
|
|
220
|
+
| `No such file ~/.claude/projects/` | Claude Code no ha creado sesiones aún | Inicia una sesión de trabajo normal primero |
|
|
221
|
+
| `PermissionError: [WinError 10013]` | Puerto reservado por Windows (Hyper-V, Docker, IIS) | El auto-detect de puertos debería evitarlo; si persiste: `python "$CLI_PY" dashboard --port 9999` |
|
|
222
|
+
| `No se encontró ningún puerto disponible` | Todos los puertos candidatos bloqueados | Especificar uno manualmente: `--port 9999` |
|
|
223
|
+
|
|
224
|
+
## Datos que visualiza el dashboard
|
|
225
|
+
|
|
226
|
+
| Métrica | Descripción |
|
|
227
|
+
|---------|-------------|
|
|
228
|
+
| Daily token usage | Gráfico de barras apiladas: input / output / cache read / cache creation por día |
|
|
229
|
+
| By model | Doughnut: distribución de tokens por modelo (sonnet vs opus vs haiku) |
|
|
230
|
+
| Top projects | Barras horizontales: top 10 proyectos por consumo |
|
|
231
|
+
| Sessions table | Tabla con: sesión, proyecto, duración, modelo, turns, tokens, costo estimado |
|
|
232
|
+
| Model cost table | Desglose de costo total por modelo |
|
|
233
|
+
|
|
234
|
+
## Dónde se almacenan los datos
|
|
235
|
+
|
|
236
|
+
- **Base de datos**: `~/.claude/usage.db` (SQLite, ~cero dependencias)
|
|
237
|
+
- **Fuente de datos**: `~/.claude/projects/**/*.jsonl` (logs de Claude Code)
|
|
238
|
+
- **Actualización**: al ejecutar `scan` o al inicio de cada subcomando
|
|
239
|
+
|
|
240
|
+
## Subcomando: `guardrails`
|
|
241
|
+
|
|
242
|
+
Muestra en terminal las métricas de activación y bloqueo de los guardrails (hooks bloqueantes)
|
|
243
|
+
de la sesión actual. Los datos provienen de `hooks/lib/guardrail-metrics.js`.
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
# Leer métricas de guardrails de la sesión actual desde /tmp/
|
|
247
|
+
SESSION_ID="${CLAUDE_SESSION_ID:-default}"
|
|
248
|
+
BRIDGE_FILE="/tmp/swl-guardrail-metrics-${SESSION_ID}.json"
|
|
249
|
+
|
|
250
|
+
if [ -f "$BRIDGE_FILE" ]; then
|
|
251
|
+
node -e "
|
|
252
|
+
const m = require('$BRIDGE_FILE');
|
|
253
|
+
const hooks = m.hooks || {};
|
|
254
|
+
const entries = Object.entries(hooks).sort(([,a],[,b]) => b.bloqueos - a.bloqueos);
|
|
255
|
+
if (entries.length === 0) {
|
|
256
|
+
console.log('Ningún guardrail se activó en esta sesión.');
|
|
257
|
+
} else {
|
|
258
|
+
console.log('\\nGuardrails — Activaciones de la sesión\\n');
|
|
259
|
+
console.log('Hook'.padEnd(30) + 'Activaciones'.padStart(13) + 'Bloqueos'.padStart(9) + 'Warnings'.padStart(9) + 'Tasa'.padStart(7));
|
|
260
|
+
console.log('-'.repeat(68));
|
|
261
|
+
for (const [nombre, datos] of entries) {
|
|
262
|
+
const tasa = datos.activaciones > 0 ? Math.round(datos.bloqueos / datos.activaciones * 100) + '%' : '0%';
|
|
263
|
+
console.log(nombre.replace('.js','').padEnd(30) + String(datos.activaciones).padStart(13) + String(datos.bloqueos).padStart(9) + String(datos.warnings).padStart(9) + tasa.padStart(7));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
"
|
|
267
|
+
else
|
|
268
|
+
echo "Sin datos de guardrails para esta sesión. (bridge: $BRIDGE_FILE)"
|
|
269
|
+
echo "Los guardrails registran métricas cuando se activan durante la sesión."
|
|
270
|
+
fi
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Después de mostrar la tabla, ejecutar diagnóstico automático:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
node -e "
|
|
277
|
+
try {
|
|
278
|
+
const { getMetrics, diagnosticar } = require('./hooks/lib/guardrail-metrics');
|
|
279
|
+
const SESSION_ID = process.env.CLAUDE_SESSION_ID || 'default';
|
|
280
|
+
const metricas = getMetrics(SESSION_ID);
|
|
281
|
+
const advertencias = diagnosticar(metricas);
|
|
282
|
+
if (advertencias.length > 0) {
|
|
283
|
+
console.log('\\n⚠ Diagnóstico:');
|
|
284
|
+
advertencias.forEach(a => console.log(' - ' + a));
|
|
285
|
+
} else {
|
|
286
|
+
console.log('\\n✓ Guardrails sin anomalías detectadas.');
|
|
287
|
+
}
|
|
288
|
+
} catch(e) { console.log('(sin datos disponibles)'); }
|
|
289
|
+
"
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
> El resumen de guardrails también aparece automáticamente al final de cada sesión
|
|
293
|
+
> (hook `resumen-sesion.js`) cuando hay advertencias de tasa anómala.
|
|
294
|
+
|
|
295
|
+
## Estructura por widgets (v2, inspirado en mission-control)
|
|
296
|
+
|
|
297
|
+
El módulo `scripts/lib/dashboard-widgets.js` define un catálogo estructurado de 19 widgets
|
|
298
|
+
distribuidos en 7 categorías. Permite organizar la salida del dashboard por bloques
|
|
299
|
+
categorizados en lugar del bloque monolítico actual.
|
|
300
|
+
|
|
301
|
+
### Categorías disponibles
|
|
302
|
+
|
|
303
|
+
| Categoría | Widgets incluidos | Modo |
|
|
304
|
+
|------------|-----------------------------------------------------------------|----------|
|
|
305
|
+
| health | health-score, health-row, health-componentes | offline |
|
|
306
|
+
| agentes | agentes-activos, agentes-top-uso, cadenas-delegacion | mixed |
|
|
307
|
+
| metricas | tokens-hoy, costo-hoy, costo-por-agente, costo-por-modelo | offline |
|
|
308
|
+
| evolucion | nudges-recientes, evoluciones-aplicadas, alertas-persistentes | offline |
|
|
309
|
+
| sesiones | sesiones-activas, sesiones-historial | offline |
|
|
310
|
+
| costos | costos-tendencia, costos-proyectos | offline |
|
|
311
|
+
| seguridad | security-posture, auditoria-reciente | online |
|
|
312
|
+
|
|
313
|
+
Modos: `offline` = funciona leyendo archivos locales; `online` = requiere conexión activa.
|
|
314
|
+
|
|
315
|
+
### Uso básico
|
|
316
|
+
|
|
317
|
+
```javascript
|
|
318
|
+
const { listarPorCategoria, listarPorModo, obtenerWidget, obtenerLayoutDefault } =
|
|
319
|
+
require('./scripts/lib/dashboard-widgets');
|
|
320
|
+
|
|
321
|
+
// Todos los widgets de salud disponibles sin conexión
|
|
322
|
+
const widgetsHealth = listarPorCategoria('health');
|
|
323
|
+
|
|
324
|
+
// Layout sugerido para sesión sin gateway
|
|
325
|
+
const layout = obtenerLayoutDefault('offline');
|
|
326
|
+
|
|
327
|
+
// Obtener un widget por ID
|
|
328
|
+
const w = obtenerWidget('health-score');
|
|
329
|
+
// → { id: 'health-score', label: 'Score de Salud', categoria: 'health', modos: ['offline'], tamanoDefault: 'sm', ... }
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Integración futura en la salida del comando
|
|
333
|
+
|
|
334
|
+
Al generar la salida de `/swl:dashboard`, iterar el layout default del modo detectado
|
|
335
|
+
y renderizar cada widget con su categoría como sección:
|
|
336
|
+
|
|
337
|
+
```javascript
|
|
338
|
+
const layout = obtenerLayoutDefault('offline');
|
|
339
|
+
for (const id of layout) {
|
|
340
|
+
const widget = obtenerWidget(id);
|
|
341
|
+
// Renderizar sección: `## ${widget.categoria} / ${widget.label}`
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
La integración real de datos por widget es responsabilidad del código de ejecución del
|
|
346
|
+
comando. El catálogo solo define la estructura — no accede a fuentes de datos.
|
|
347
|
+
|
|
348
|
+
## Relación con otros componentes SWL
|
|
349
|
+
|
|
350
|
+
| Componente SWL | Scope | Complemento |
|
|
351
|
+
|---------------|-------|-------------|
|
|
352
|
+
| `tracking-costos.js` (hook) | Sesión actual, tiempo real | swl-dashboard añade histórico multi-sesión |
|
|
353
|
+
| `/swl:metricas` (comando) | Sesión actual | swl-dashboard añade visualización gráfica |
|
|
354
|
+
| `.planning/METRICAS.md` | Persistencia por proyecto | swl-dashboard agrega consulta SQL cross-project |
|
|
355
|
+
| `resumen-sesion.js` (hook) | Resumen inline al Stop | swl-dashboard añade análisis post-hoc detallado |
|
|
356
|
+
| `guardrail-metrics.js` (lib) | Sesión actual | swl-dashboard `guardrails` muestra activaciones/bloqueos por hook |
|
|
357
|
+
|
|
358
|
+
## Cuándo NO cargar
|
|
359
|
+
|
|
360
|
+
- El usuario quiere ver métricas de la sesión activa actual — usar `/swl:metricas`; este skill procesa el historial persisitido en `~/.claude/projects/`, no el stream en tiempo real de la sesión.
|
|
361
|
+
- `claude-usage` no está instalado y el objetivo es diagnosticar la salud del sistema SWL — usar `/swl:salud`; no tiene sentido cargar este skill si la única acción posible sería indicar que hay que instalar la herramienta vendor.
|
|
362
|
+
- Se ejecuta en un entorno CI/headless o en un servidor remoto sin browser — los subcomandos `today` y `stats` funcionan en terminal, pero si el objetivo era el dashboard web interactivo, ese entorno no lo soporta.
|
|
363
|
+
- Se busca trazar el motivo de fallo de un agente específico — este skill visualiza consumo de tokens y costos; los detalles de error de agente están en `.planning/traces/` y se analizan con `tracing-processor`.
|
|
364
|
+
|
|
365
|
+
## Gotchas / Errores comunes no obvios
|
|
366
|
+
|
|
367
|
+
- **`curl http://localhost:8080` devuelve 200 pero no es el dashboard**: el skill advierte explícitamente que el puerto 8080 suele estar ocupado por Postgres, IIS u otros servicios y puede devolver falso positivo. Causa: verificar disponibilidad en lugar de dejar que `cli.py` detecte el primer puerto libre. Solución: no verificar con `curl` — el flujo correcto es detectar el puerto libre con el script Python de socket binding del Paso 2 y reportar ese puerto al usuario; si el usuario abre ese puerto, verá el dashboard correcto.
|
|
368
|
+
- **`cd "$VENDOR_DIR"` omitido antes de `python "$CLI_PY"`**: el script falla con `ModuleNotFoundError` porque `scanner.py` y `dashboard.py` se importan con rutas relativas. Causa: ejecutar `python $CLI_PY` desde el directorio de trabajo del proyecto en lugar de desde el directorio del vendor. Solución: siempre `cd "$VENDOR_DIR"` antes de cualquier invocación de `cli.py` — es el requisito documentado en el Paso 2 del skill.
|
|
369
|
+
- **Base de datos vacía después de ejecutar el dashboard**: el dashboard muestra gráficos vacíos aunque hay sesiones en `~/.claude/projects/`. Causa: `scan` no se ejecutó antes del subcomando principal. Solución: ejecutar `python "$CLI_PY" scan 2>/dev/null` como paso previo a cualquier subcomando — `scan` es quien parsea los JSONL y puebla `~/.claude/usage.db`.
|
|
370
|
+
- **Fallback a `~/.claude` cuando el repo tiene su propio vendor**: el script busca `CLI_PY` en el directorio del proyecto primero; si no lo encuentra, busca en instalaciones globales. Si el usuario tiene una versión global más antigua que la del repo, el skill usa la versión incorrecta. Causa: el Paso 1 resuelve los 4 fallbacks en orden pero no verifica versiones. Solución: si el repo tiene `scripts/vendor/claude-usage/cli.py`, esa siempre tiene precedencia — verificar con `head -1 "$CLI_PY"` que la versión encontrada es la del repo.
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: swl-markitdown
|
|
3
|
+
description: >
|
|
4
|
+
Convierte cualquier formato de documento a Markdown estructurado para su
|
|
5
|
+
consumo por agentes SWL. Soporta PDF, DOCX, XLSX, PPTX, Jupyter, EPUB,
|
|
6
|
+
ZIP, HTML, CSV, JSON, YouTube URLs y más. Wrapper sobre Microsoft MarkItDown
|
|
7
|
+
(AutoGen Team). Usar cuando el Read tool no soporta el formato del archivo.
|
|
8
|
+
Complementa WebFetch/agent-browser para URLs con contenido estructurado.
|
|
9
|
+
user-invocable: false
|
|
10
|
+
version: "1.0.0"
|
|
11
|
+
herramientasPermitidas: [Read, Bash, Glob, Grep, WebFetch]
|
|
12
|
+
evolved: false
|
|
13
|
+
fuente: "Microsoft AutoGen Team — markitdown v0.1.5 (2025)"
|
|
14
|
+
dependencias: "pip install markitdown[pdf,docx,pptx,xlsx]"
|
|
15
|
+
exclusiones:
|
|
16
|
+
- "No cargar para archivos .md, .txt o código fuente — el Read tool los soporta directamente y es más rápido sin el overhead de conversión."
|
|
17
|
+
- "No cargar para PDFs de ≤20 páginas sin tablas complejas — el Read tool con parámetro `pages:` es suficiente y no requiere la dependencia Python."
|
|
18
|
+
- "No cargar para URLs web genéricas sin contenido estructurado de documento — WebFetch es el camino correcto para HTML; swl-markitdown agrega valor cuando el HTML tiene estructura de documento (Wikipedia, documentación técnica con tablas)."
|
|
19
|
+
- "No cargar cuando el objetivo es buscar un patrón o string dentro de un archivo — Grep sobre el archivo original es más eficiente que convertir a Markdown primero."
|
|
20
|
+
evolvable: true # default para skill estandar
|
|
21
|
+
---
|
|
22
|
+
# Skill: swl-markitdown
|
|
23
|
+
|
|
24
|
+
Proporciona conversión universal de documentos a Markdown para agentes SWL.
|
|
25
|
+
Es el puente entre archivos en formatos propietarios (DOCX, XLSX, PPTX, PDF)
|
|
26
|
+
y el contexto de los agentes que solo consumen texto Markdown.
|
|
27
|
+
|
|
28
|
+
## Árbol de decisión: qué herramienta usar
|
|
29
|
+
|
|
30
|
+
| Fuente | Herramienta | Por qué |
|
|
31
|
+
|--------|-------------|---------|
|
|
32
|
+
| `.md`, `.txt` (local) | `Read` | Directo, sin overhead |
|
|
33
|
+
| `.pdf` ≤ 20 páginas (local) | `Read` con `pages:` | Read soporta PDFs nativamente |
|
|
34
|
+
| `.pdf` > 20 páginas o con tablas | **`swl-markitdown`** | Extrae tablas como Markdown |
|
|
35
|
+
| `.docx`, `.pptx` (local) | **`swl-markitdown`** | Read no soporta estos formatos |
|
|
36
|
+
| `.xlsx`, `.xls` (local) | **`swl-markitdown`** | Convierte hojas a tablas Markdown |
|
|
37
|
+
| `.ipynb` Jupyter (local) | **`swl-markitdown`** | Read devuelve JSON crudo |
|
|
38
|
+
| `.csv` (local) | `Read` o **`swl-markitdown`** | Ambos funcionan; MarkItDown da tabla formateada |
|
|
39
|
+
| URL estática (HTML simple) | `WebFetch` | Más rápido, sin overhead |
|
|
40
|
+
| URL dinámica (SPA, JS) | `agent-browser` | Renderiza JavaScript |
|
|
41
|
+
| URL de YouTube | **`swl-markitdown`** | Transcripción automática sin LLM |
|
|
42
|
+
| URL de Wikipedia | `WebFetch` o **`swl-markitdown`** | Ambos; MarkItDown da estructura más limpia |
|
|
43
|
+
| ZIP con documentos mixtos | **`swl-markitdown`** | Descomprime y convierte recursivamente |
|
|
44
|
+
|
|
45
|
+
## Paso 0 — Verificar disponibilidad
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Verificar que markitdown está instalado y funcional
|
|
49
|
+
CLI_PATH=$(git rev-parse --show-toplevel 2>/dev/null)/scripts/vendor/markitdown/cli.py
|
|
50
|
+
python "$CLI_PATH" --check 2>/dev/null | grep "Estado:" || echo "NO_DISPONIBLE"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Si devuelve `NO_DISPONIBLE` o falta el cli.py:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Instalar markitdown con soporte para formatos principales
|
|
57
|
+
pip install markitdown[pdf,docx,pptx,xlsx]
|
|
58
|
+
|
|
59
|
+
# Verificar instalación
|
|
60
|
+
python "$CLI_PATH" --check
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Si pip no está disponible, reportar al usuario:
|
|
64
|
+
```
|
|
65
|
+
swl-markitdown requiere Python 3.10+ y pip.
|
|
66
|
+
pip install markitdown[pdf,docx,pptx,xlsx]
|
|
67
|
+
|
|
68
|
+
El Read tool sigue disponible para .pdf (hasta 20 páginas), .txt y .md.
|
|
69
|
+
WebFetch y agent-browser siguen disponibles para URLs.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Paso 1 — Conversión básica
|
|
73
|
+
|
|
74
|
+
### Archivo local
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
PROJECT_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
78
|
+
CLI_PY="$PROJECT_ROOT/scripts/vendor/markitdown/cli.py"
|
|
79
|
+
|
|
80
|
+
# Convertir archivo a Markdown
|
|
81
|
+
OUTPUT=$(python "$CLI_PY" "/ruta/absoluta/al/archivo.docx" 2>/dev/null)
|
|
82
|
+
|
|
83
|
+
# Verificar que la conversión fue exitosa (output no vacío)
|
|
84
|
+
if [ -n "$OUTPUT" ]; then
|
|
85
|
+
echo "$OUTPUT"
|
|
86
|
+
else
|
|
87
|
+
echo "CONVERSION_FAILED — usar Read tool como fallback"
|
|
88
|
+
fi
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Guardar directamente a raw/ del wiki
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
FECHA=$(date +%Y%m%d)
|
|
95
|
+
NOMBRE=$(basename "ARCHIVO_FUENTE" | sed 's/\.[^.]*$//' | sed 's/[^a-zA-Z0-9]/-/g' | cut -c1-50)
|
|
96
|
+
DESTINO="$PROJECT_ROOT/.planning/knowledge/raw/${FECHA}-${NOMBRE}.md"
|
|
97
|
+
|
|
98
|
+
python "$CLI_PY" "/ruta/al/archivo.docx" > "$DESTINO" 2>/dev/null && \
|
|
99
|
+
echo "Guardado: $DESTINO" || \
|
|
100
|
+
echo "Error de conversion"
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### URL de YouTube (transcripción)
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Requiere: pip install youtube-transcript-api
|
|
107
|
+
OUTPUT=$(python "$CLI_PY" "https://www.youtube.com/watch?v=VIDEO_ID" 2>/dev/null)
|
|
108
|
+
[ -n "$OUTPUT" ] && echo "$OUTPUT" | head -50
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Paso 2 — Patrones de uso frecuentes
|
|
112
|
+
|
|
113
|
+
### Patrón A: Ingest masivo de documentación existente
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
PROJECT_ROOT=$(git rev-parse --show-toplevel)
|
|
117
|
+
CLI_PY="$PROJECT_ROOT/scripts/vendor/markitdown/cli.py"
|
|
118
|
+
RAW_DIR="$PROJECT_ROOT/.planning/knowledge/raw"
|
|
119
|
+
mkdir -p "$RAW_DIR"
|
|
120
|
+
|
|
121
|
+
# Procesar todos los archivos Office en un directorio
|
|
122
|
+
for FILE in ./docs/**/*.{docx,pptx,xlsx,pdf}; do
|
|
123
|
+
[ -f "$FILE" ] || continue
|
|
124
|
+
FECHA=$(date +%Y%m%d)
|
|
125
|
+
NOMBRE=$(basename "$FILE" | sed 's/\.[^.]*$//' | sed 's/[^a-zA-Z0-9]/-/g' | cut -c1-50)
|
|
126
|
+
DESTINO="$RAW_DIR/${FECHA}-${NOMBRE}.md"
|
|
127
|
+
|
|
128
|
+
if python "$CLI_PY" "$FILE" > "$DESTINO" 2>/dev/null; then
|
|
129
|
+
echo "[OK] $FILE -> $DESTINO"
|
|
130
|
+
else
|
|
131
|
+
echo "[SKIP] $FILE — formato no soportado o dependencia faltante"
|
|
132
|
+
rm -f "$DESTINO"
|
|
133
|
+
fi
|
|
134
|
+
done
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Patrón B: Comparar con Read tool para PDFs
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# Para PDFs cortos (≤20 páginas): Read tool es más rápido
|
|
141
|
+
# Para PDFs largos o con tablas: swl-markitdown extrae mejor
|
|
142
|
+
|
|
143
|
+
CLI_PY="$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py"
|
|
144
|
+
OUTPUT=$(python "$CLI_PY" "documento.pdf" 2>/dev/null)
|
|
145
|
+
|
|
146
|
+
# Verificar si hay tablas en el output (MarkItDown las extrae, Read no)
|
|
147
|
+
TIENE_TABLAS=$(echo "$OUTPUT" | grep -c "^|" || echo 0)
|
|
148
|
+
echo "Tablas detectadas: $TIENE_TABLAS"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Patrón C: Preprocesamiento antes de invocar agente
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# Convertir spec de requisitos DOCX a Markdown antes de pasarlo al planificador
|
|
155
|
+
CLI_PY="$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py"
|
|
156
|
+
|
|
157
|
+
SPEC_MD=$(python "$CLI_PY" "requisitos/spec-v2.docx" 2>/dev/null)
|
|
158
|
+
if [ -z "$SPEC_MD" ]; then
|
|
159
|
+
echo "ERROR: no se pudo convertir spec-v2.docx"
|
|
160
|
+
exit 1
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
# Guardar en .planning/ para que planificador-swl lo lea
|
|
164
|
+
echo "$SPEC_MD" > .planning/SPEC.md
|
|
165
|
+
echo "Spec convertida a .planning/SPEC.md — invocar planificador-swl"
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Patrón D: Notebook Jupyter para investigador-swl
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# Jupyter notebooks contienen código, outputs y análisis mezclados
|
|
172
|
+
# swl-markitdown los convierte preservando celdas de código y markdown
|
|
173
|
+
|
|
174
|
+
CLI_PY="$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py"
|
|
175
|
+
OUTPUT=$(python "$CLI_PY" "analisis/experimento.ipynb" 2>/dev/null)
|
|
176
|
+
|
|
177
|
+
# El output incluye:
|
|
178
|
+
# - Celdas markdown como texto normal
|
|
179
|
+
# - Celdas de código en bloques ```python
|
|
180
|
+
# - Outputs de celdas si están guardados en el notebook
|
|
181
|
+
echo "$OUTPUT" | head -100
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
## Paso 3 — Manejo de errores
|
|
185
|
+
|
|
186
|
+
| Código de salida | Causa | Acción |
|
|
187
|
+
|-----------------|-------|--------|
|
|
188
|
+
| `0` | Conversión exitosa | Usar el output |
|
|
189
|
+
| `1` | Formato no soportado | Intentar WebFetch o Read |
|
|
190
|
+
| `2` | Dependencia faltante | `pip install markitdown[<formato>]` |
|
|
191
|
+
| `3` | Error de conversión (archivo corrupto) | Reportar al usuario |
|
|
192
|
+
| `4` | Archivo no encontrado | Verificar la ruta |
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
CLI_PY="$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py"
|
|
196
|
+
python "$CLI_PY" "archivo.docx" > output.md 2>error.log
|
|
197
|
+
EXIT_CODE=$?
|
|
198
|
+
|
|
199
|
+
case $EXIT_CODE in
|
|
200
|
+
0) echo "OK — Markdown en output.md" ;;
|
|
201
|
+
1) echo "Formato no soportado — usar alternativa" ;;
|
|
202
|
+
2) cat error.log; echo "Instalar dependencia y reintentar" ;;
|
|
203
|
+
3) cat error.log; echo "Archivo probablemente corrupto" ;;
|
|
204
|
+
4) echo "Archivo no encontrado — verificar ruta" ;;
|
|
205
|
+
esac
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Paso 4 — Formatos soportados
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
# Ver todos los formatos con el estado de dependencias actual
|
|
212
|
+
python "$(git rev-parse --show-toplevel)/scripts/vendor/markitdown/cli.py" --formats
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Formatos siempre disponibles (sin dependencias extra)
|
|
216
|
+
|
|
217
|
+
| Formato | Extensión | Notas |
|
|
218
|
+
|---------|-----------|-------|
|
|
219
|
+
| HTML | `.html` `.htm` | Conversión completa con BeautifulSoup |
|
|
220
|
+
| Texto plano | `.txt` `.md` `.markdown` | Pass-through con detección de charset |
|
|
221
|
+
| CSV | `.csv` | Convertido a tabla Markdown |
|
|
222
|
+
| JSON | `.json` | Formateado estructuralmente |
|
|
223
|
+
| XML / RSS / Atom | `.xml` `.rss` `.atom` | Feeds formateados |
|
|
224
|
+
| ZIP | `.zip` | Descomprime y convierte todo el contenido |
|
|
225
|
+
| EPUB | `.epub` | Libros electrónicos |
|
|
226
|
+
| Jupyter | `.ipynb` | Celdas código + markdown |
|
|
227
|
+
| Wikipedia URLs | `wikipedia.org/*` | Extracción de contenido principal |
|
|
228
|
+
|
|
229
|
+
### Formatos con dependencias opcionales
|
|
230
|
+
|
|
231
|
+
| Formato | Dependencia | Instalar |
|
|
232
|
+
|---------|-------------|---------|
|
|
233
|
+
| PDF | `pdfminer.six`, `pdfplumber` | `pip install markitdown[pdf]` |
|
|
234
|
+
| Word (.docx) | `mammoth`, `lxml` | `pip install markitdown[docx]` |
|
|
235
|
+
| Excel (.xlsx) | `pandas`, `openpyxl` | `pip install markitdown[xlsx]` |
|
|
236
|
+
| Excel (.xls) | `pandas`, `xlrd` | `pip install markitdown[xls]` |
|
|
237
|
+
| PowerPoint (.pptx) | `python-pptx` | `pip install markitdown[pptx]` |
|
|
238
|
+
| YouTube | `youtube-transcript-api` | `pip install markitdown[youtube-transcription]` |
|
|
239
|
+
|
|
240
|
+
## Qué NO usar de MarkItDown en swl-ses
|
|
241
|
+
|
|
242
|
+
- **Azure Document Intelligence** — dependencia de nube, costo por página, conflicto con filosofía local-first
|
|
243
|
+
- **Audio transcription** (SpeechRecognition) — sin caso de uso en swl-ses
|
|
244
|
+
- **LLM Vision para imágenes** — Claude ya es multimodal; duplicidad
|
|
245
|
+
- **markitdown-ocr plugin** — requiere GPT-4o explícito; Claude lo haría en el contexto actual
|
|
246
|
+
|
|
247
|
+
## Integración con /swl:wiki
|
|
248
|
+
|
|
249
|
+
El skill es transparente para `/swl:wiki ingest`: cuando se detecta un formato
|
|
250
|
+
no-Markdown, el comando invoca `swl-markitdown` automáticamente antes de ingerir.
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
# El Paso I.1 del ingest decide la herramienta según extensión:
|
|
254
|
+
# .md .txt → Read tool
|
|
255
|
+
# .pdf .docx .xlsx .pptx .ipynb .epub .zip → swl-markitdown
|
|
256
|
+
# http:// https:// → WebFetch, con agent-browser como fallback
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
## Señales de que swl-markitdown completó correctamente
|
|
260
|
+
|
|
261
|
+
- Output tiene >100 palabras de contenido real (no solo metadatos)
|
|
262
|
+
- No hay mensajes de error en stderr
|
|
263
|
+
- El código de salida es 0
|
|
264
|
+
- El contenido tiene estructura Markdown (encabezados, tablas o listas)
|
|
265
|
+
|
|
266
|
+
## Señales de problema
|
|
267
|
+
|
|
268
|
+
- Output vacío con código 1 → el formato no está registrado (revisar extensión)
|
|
269
|
+
- Output vacío con código 2 → `pip install markitdown[<formato>]`
|
|
270
|
+
- Output solo de metadatos → el archivo puede estar protegido con contraseña
|
|
271
|
+
- Caracteres extraños → el archivo usa encoding no-UTF8; MarkItDown lo maneja internamente
|
|
272
|
+
|
|
273
|
+
## Cuándo NO cargar
|
|
274
|
+
|
|
275
|
+
- El archivo es `.md`, `.txt`, código fuente o cualquier texto plano — el Read tool lo lee directamente sin overhead de conversión ni dependencia Python.
|
|
276
|
+
- El archivo es un PDF de ≤20 páginas sin tablas complejas — el Read tool con `pages:` es suficiente; swl-markitdown agrega valor principalmente para tablas que Read no puede extraer estructuradamente.
|
|
277
|
+
- Se quiere acceder al contenido de una URL web genérica — WebFetch es el camino; swl-markitdown en URLs solo vale cuando son páginas con estructura de documento (Wikipedia, docs técnicas con tablas).
|
|
278
|
+
- El objetivo es encontrar un patrón específico dentro del documento — Grep sobre el archivo original es más directo que convertir a Markdown primero para luego buscar en el resultado.
|
|
279
|
+
|
|
280
|
+
## Gotchas / Errores comunes no obvios
|
|
281
|
+
|
|
282
|
+
- **`python "$CLI_PY" archivo.docx` ejecutado sin `cd "$VENDOR_DIR"` previo**: el script falla con `ImportError` porque los módulos auxiliares se importan con rutas relativas al directorio del vendor. Causa: ejecutar el CLI desde el directorio de trabajo del proyecto en lugar del vendor. Solución: siempre ejecutar `CLI_PY` como `cd "$VENDOR_DIR" && python "$CLI_PY" <ruta-absoluta-al-archivo>` — la ruta del archivo debe ser absoluta para que no sea relativa al vendor.
|
|
283
|
+
- **PDF con contraseña devuelve output vacío con código 0**: el agente asume que la conversión fue exitosa y pasa texto vacío al siguiente paso. Causa: algunos PDFs protegidos devuelven salida vacía sin código de error. Solución: verificar que el output tiene más de 100 palabras de contenido real (la sección "Señales de que swl-markitdown completó correctamente" lo documenta) antes de usar el output.
|
|
284
|
+
- **Excel (.xls) no convertido aunque markitdown[xlsx] está instalado**: el agente instala `markitdown[xlsx]` pero `.xls` requiere `xlrd` además de `openpyxl`. Causa: la tabla de dependencias del skill muestra extensiones diferentes para `.xlsx` y `.xls`. Solución: para `.xls` instalar `markitdown[xls]` (incluye `xlrd`), no `markitdown[xlsx]` — son extras distintos.
|
|
285
|
+
- **Ingest masivo con `for FILE in ./docs/**/*.docx` falla en bash sin globstar**: el globbing `**` no expande recursivamente en bash por defecto. Causa: `globstar` no está habilitado. Solución: usar `find ./docs -name "*.docx" -type f` en lugar de `**` glob, o habilitar explícitamente `shopt -s globstar` antes del loop — el Patrón A del skill usa `**` pero no activa globstar.
|