@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,441 @@
|
|
|
1
|
+
# Accesibilidad A11y — Ejemplos Completos y Checklist
|
|
2
|
+
|
|
3
|
+
Referencia extendida con todos los ejemplos de código y checklist detallado.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Elementos Semánticos HTML5
|
|
8
|
+
|
|
9
|
+
```html
|
|
10
|
+
<!-- MAL: divs para todo, sin semántica -->
|
|
11
|
+
<div class="header">
|
|
12
|
+
<div class="nav">...</div>
|
|
13
|
+
</div>
|
|
14
|
+
<div class="content">
|
|
15
|
+
<div class="article">...</div>
|
|
16
|
+
<div class="sidebar">...</div>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="footer">...</div>
|
|
19
|
+
|
|
20
|
+
<!-- BIEN: elementos semánticos correctos -->
|
|
21
|
+
<header>
|
|
22
|
+
<nav aria-label="Navegación principal">...</nav>
|
|
23
|
+
</header>
|
|
24
|
+
<main>
|
|
25
|
+
<article>...</article>
|
|
26
|
+
<aside aria-label="Información complementaria">...</aside>
|
|
27
|
+
</main>
|
|
28
|
+
<footer>...</footer>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Landmarks y Skip Link
|
|
32
|
+
|
|
33
|
+
```html
|
|
34
|
+
<!-- Cada página DEBE tener exactamente un <main> -->
|
|
35
|
+
<main id="contenido-principal">
|
|
36
|
+
<!-- Contenido primario -->
|
|
37
|
+
</main>
|
|
38
|
+
|
|
39
|
+
<!-- Skip link OBLIGATORIO — primer elemento enfocable -->
|
|
40
|
+
<a href="#contenido-principal" class="skip-link">
|
|
41
|
+
Saltar al contenido principal
|
|
42
|
+
</a>
|
|
43
|
+
|
|
44
|
+
<!-- CSS para el skip link -->
|
|
45
|
+
<style>
|
|
46
|
+
.skip-link {
|
|
47
|
+
position: absolute;
|
|
48
|
+
top: -40px;
|
|
49
|
+
left: 0;
|
|
50
|
+
background: #005fcc;
|
|
51
|
+
color: white;
|
|
52
|
+
padding: 8px;
|
|
53
|
+
z-index: 100;
|
|
54
|
+
transition: top 0.2s;
|
|
55
|
+
}
|
|
56
|
+
.skip-link:focus {
|
|
57
|
+
top: 0; /* Visible solo al enfocar con teclado */
|
|
58
|
+
}
|
|
59
|
+
</style>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Atributos ARIA — Ejemplos Extendidos
|
|
65
|
+
|
|
66
|
+
### aria-label vs aria-labelledby vs aria-describedby
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<!-- aria-label: cuando no hay texto visible -->
|
|
70
|
+
<button aria-label="Cerrar diálogo de confirmación">
|
|
71
|
+
<svg aria-hidden="true"><!-- ícono X --></svg>
|
|
72
|
+
</button>
|
|
73
|
+
|
|
74
|
+
<!-- aria-labelledby: referenciar texto existente en el DOM -->
|
|
75
|
+
<h2 id="titulo-modal">Confirmar eliminación</h2>
|
|
76
|
+
<dialog aria-labelledby="titulo-modal">
|
|
77
|
+
<!-- El título del diálogo describe el modal -->
|
|
78
|
+
</dialog>
|
|
79
|
+
|
|
80
|
+
<!-- aria-describedby: información adicional (no el nombre) -->
|
|
81
|
+
<input
|
|
82
|
+
id="email"
|
|
83
|
+
type="email"
|
|
84
|
+
aria-describedby="email-hint email-error"
|
|
85
|
+
/>
|
|
86
|
+
<span id="email-hint">Usa tu correo corporativo @empresa.com.mx</span>
|
|
87
|
+
<span id="email-error" role="alert" aria-live="polite"></span>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Estados y propiedades ARIA comunes
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<!-- Menú expandible -->
|
|
94
|
+
<button
|
|
95
|
+
aria-expanded="false"
|
|
96
|
+
aria-controls="menu-opciones"
|
|
97
|
+
id="btn-menu"
|
|
98
|
+
>
|
|
99
|
+
Opciones
|
|
100
|
+
</button>
|
|
101
|
+
<ul id="menu-opciones" aria-labelledby="btn-menu" hidden>
|
|
102
|
+
<li><a href="/perfil">Mi perfil</a></li>
|
|
103
|
+
<li><a href="/salir">Cerrar sesión</a></li>
|
|
104
|
+
</ul>
|
|
105
|
+
|
|
106
|
+
<!-- Pestañas (tabs) -->
|
|
107
|
+
<div role="tablist" aria-label="Secciones del expediente">
|
|
108
|
+
<button
|
|
109
|
+
role="tab"
|
|
110
|
+
aria-selected="true"
|
|
111
|
+
aria-controls="panel-datos"
|
|
112
|
+
id="tab-datos"
|
|
113
|
+
>Datos generales</button>
|
|
114
|
+
<button
|
|
115
|
+
role="tab"
|
|
116
|
+
aria-selected="false"
|
|
117
|
+
aria-controls="panel-documentos"
|
|
118
|
+
id="tab-docs"
|
|
119
|
+
tabindex="-1"
|
|
120
|
+
>Documentos</button>
|
|
121
|
+
</div>
|
|
122
|
+
<div role="tabpanel" id="panel-datos" aria-labelledby="tab-datos">...</div>
|
|
123
|
+
<div role="tabpanel" id="panel-documentos" aria-labelledby="tab-docs" hidden>...</div>
|
|
124
|
+
|
|
125
|
+
<!-- Notificaciones en vivo -->
|
|
126
|
+
<div aria-live="polite" aria-atomic="true" class="sr-only" id="notificacion">
|
|
127
|
+
<!-- El lector anuncia cambios en este div automáticamente -->
|
|
128
|
+
</div>
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Contraste de Color — Ejemplos CSS
|
|
134
|
+
|
|
135
|
+
```css
|
|
136
|
+
/* MAL: contraste insuficiente */
|
|
137
|
+
.texto-secundario {
|
|
138
|
+
color: #999999; /* sobre #ffffff = ratio 2.85:1 — FALLA */
|
|
139
|
+
background: #ffffff;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* BIEN: contraste suficiente */
|
|
143
|
+
.texto-secundario {
|
|
144
|
+
color: #767676; /* sobre #ffffff = ratio 4.54:1 — PASA AA */
|
|
145
|
+
background: #ffffff;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* MAL: información solo por color (daltonismo) */
|
|
149
|
+
.error { color: red; }
|
|
150
|
+
.exito { color: green; }
|
|
151
|
+
|
|
152
|
+
/* BIEN: color + ícono/texto descriptivo */
|
|
153
|
+
.error {
|
|
154
|
+
color: #d32f2f;
|
|
155
|
+
background: #fdecea;
|
|
156
|
+
border-left: 4px solid #d32f2f;
|
|
157
|
+
}
|
|
158
|
+
.error::before {
|
|
159
|
+
content: "✗ Error: "; /* texto descriptivo adicional */
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Navegación por Teclado — Ejemplos Completos
|
|
166
|
+
|
|
167
|
+
### Orden de foco
|
|
168
|
+
|
|
169
|
+
```html
|
|
170
|
+
<!-- MAL: tabindex positivos crean orden artificial y frágil -->
|
|
171
|
+
<input tabindex="3" name="apellido" />
|
|
172
|
+
<input tabindex="1" name="nombre" />
|
|
173
|
+
<input tabindex="2" name="email" />
|
|
174
|
+
|
|
175
|
+
<!-- BIEN: orden natural del DOM + tabindex="0" solo si necesario -->
|
|
176
|
+
<input name="nombre" />
|
|
177
|
+
<input name="apellido" />
|
|
178
|
+
<input name="email" />
|
|
179
|
+
|
|
180
|
+
<!-- tabindex="-1": enfocable por JavaScript, no por teclado -->
|
|
181
|
+
<div id="mensaje-error" tabindex="-1">Error al guardar</div>
|
|
182
|
+
<script>
|
|
183
|
+
document.getElementById('mensaje-error').focus();
|
|
184
|
+
</script>
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Gestión de foco en modales
|
|
188
|
+
|
|
189
|
+
```javascript
|
|
190
|
+
// Trampa de foco — OBLIGATORIA en diálogos modales
|
|
191
|
+
function trapFocus(modal) {
|
|
192
|
+
const focusables = modal.querySelectorAll(
|
|
193
|
+
'a[href], button:not([disabled]), input:not([disabled]), ' +
|
|
194
|
+
'select:not([disabled]), textarea:not([disabled]), [tabindex="0"]'
|
|
195
|
+
);
|
|
196
|
+
const first = focusables[0];
|
|
197
|
+
const last = focusables[focusables.length - 1];
|
|
198
|
+
|
|
199
|
+
modal.addEventListener('keydown', (e) => {
|
|
200
|
+
if (e.key !== 'Tab') return;
|
|
201
|
+
if (e.shiftKey) {
|
|
202
|
+
if (document.activeElement === first) {
|
|
203
|
+
e.preventDefault();
|
|
204
|
+
last.focus();
|
|
205
|
+
}
|
|
206
|
+
} else {
|
|
207
|
+
if (document.activeElement === last) {
|
|
208
|
+
e.preventDefault();
|
|
209
|
+
first.focus();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
first.focus();
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
let triggerAnterior;
|
|
218
|
+
function abrirModal(modal, trigger) {
|
|
219
|
+
triggerAnterior = trigger;
|
|
220
|
+
modal.removeAttribute('hidden');
|
|
221
|
+
trapFocus(modal);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function cerrarModal(modal) {
|
|
225
|
+
modal.setAttribute('hidden', '');
|
|
226
|
+
triggerAnterior?.focus();
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
## Formularios Accesibles — Ejemplos Completos
|
|
233
|
+
|
|
234
|
+
### Mensajes de error accesibles
|
|
235
|
+
|
|
236
|
+
```html
|
|
237
|
+
<!-- BIEN: error asociado al input + role="alert" -->
|
|
238
|
+
<div>
|
|
239
|
+
<label for="correo">Correo electrónico</label>
|
|
240
|
+
<input
|
|
241
|
+
type="email"
|
|
242
|
+
id="correo"
|
|
243
|
+
name="correo"
|
|
244
|
+
aria-invalid="true"
|
|
245
|
+
aria-describedby="correo-error"
|
|
246
|
+
aria-required="true"
|
|
247
|
+
/>
|
|
248
|
+
<span id="correo-error" role="alert">
|
|
249
|
+
El formato del correo no es válido. Ejemplo: usuario@empresa.com.mx
|
|
250
|
+
</span>
|
|
251
|
+
</div>
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Grupos de controles relacionados
|
|
255
|
+
|
|
256
|
+
```html
|
|
257
|
+
<fieldset>
|
|
258
|
+
<legend>Tipo de contrato</legend>
|
|
259
|
+
<label>
|
|
260
|
+
<input type="radio" name="contrato" value="base" /> Base
|
|
261
|
+
</label>
|
|
262
|
+
<label>
|
|
263
|
+
<input type="radio" name="contrato" value="confianza" /> Confianza
|
|
264
|
+
</label>
|
|
265
|
+
<label>
|
|
266
|
+
<input type="radio" name="contrato" value="honorarios" /> Honorarios
|
|
267
|
+
</label>
|
|
268
|
+
</fieldset>
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Tablas Accesibles
|
|
274
|
+
|
|
275
|
+
```html
|
|
276
|
+
<!-- BIEN: tabla de datos completa -->
|
|
277
|
+
<table>
|
|
278
|
+
<caption>
|
|
279
|
+
Nómina quincenal — Enero 2026
|
|
280
|
+
<details>
|
|
281
|
+
<summary>Descripción de la tabla</summary>
|
|
282
|
+
Lista de empleados con su sueldo bruto para la quincena del 1 al 15 de enero.
|
|
283
|
+
</details>
|
|
284
|
+
</caption>
|
|
285
|
+
<thead>
|
|
286
|
+
<tr>
|
|
287
|
+
<th scope="col">Nombre</th>
|
|
288
|
+
<th scope="col">Apellido</th>
|
|
289
|
+
<th scope="col">Sueldo bruto</th>
|
|
290
|
+
</tr>
|
|
291
|
+
</thead>
|
|
292
|
+
<tbody>
|
|
293
|
+
<tr>
|
|
294
|
+
<td>Juan</td>
|
|
295
|
+
<td>Pérez</td>
|
|
296
|
+
<td>$50,000.00</td>
|
|
297
|
+
</tr>
|
|
298
|
+
</tbody>
|
|
299
|
+
</table>
|
|
300
|
+
|
|
301
|
+
<!-- Tablas complejas con headers múltiples -->
|
|
302
|
+
<table>
|
|
303
|
+
<tr>
|
|
304
|
+
<th id="nombre" scope="col">Nombre</th>
|
|
305
|
+
<th id="q1" scope="col">Q1</th>
|
|
306
|
+
<th id="q2" scope="col">Q2</th>
|
|
307
|
+
</tr>
|
|
308
|
+
<tr>
|
|
309
|
+
<td headers="nombre">Saúl</td>
|
|
310
|
+
<td headers="nombre q1">$10,000</td>
|
|
311
|
+
<td headers="nombre q2">$12,000</td>
|
|
312
|
+
</tr>
|
|
313
|
+
</table>
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
---
|
|
317
|
+
|
|
318
|
+
## Imágenes y Multimedia
|
|
319
|
+
|
|
320
|
+
```html
|
|
321
|
+
<!-- BIEN: alt descriptivo para imágenes informativas -->
|
|
322
|
+
<img
|
|
323
|
+
src="grafica-ventas.png"
|
|
324
|
+
alt="Gráfica de barras: ventas Q1=$500K, Q2=$750K, Q3=$600K, Q4=$900K"
|
|
325
|
+
/>
|
|
326
|
+
|
|
327
|
+
<!-- BIEN: alt vacío para imágenes decorativas -->
|
|
328
|
+
<img src="separador-decorativo.png" alt="" role="presentation" />
|
|
329
|
+
|
|
330
|
+
<!-- BIEN: SVG accesible -->
|
|
331
|
+
<svg role="img" aria-labelledby="svg-titulo svg-desc">
|
|
332
|
+
<title id="svg-titulo">Tendencia de crecimiento</title>
|
|
333
|
+
<desc id="svg-desc">Línea ascendente del 20% al 80% entre 2024 y 2026</desc>
|
|
334
|
+
</svg>
|
|
335
|
+
|
|
336
|
+
<!-- Video con subtítulos y audiodescripción -->
|
|
337
|
+
<video controls>
|
|
338
|
+
<source src="tutorial.mp4" type="video/mp4" />
|
|
339
|
+
<track kind="subtitles" src="subtitulos-es.vtt" srclang="es" label="Español" default />
|
|
340
|
+
<track kind="descriptions" src="audiodesc-es.vtt" srclang="es" label="Audiodescripción" />
|
|
341
|
+
<p>Tu navegador no soporta video. <a href="tutorial.mp4">Descargar tutorial</a></p>
|
|
342
|
+
</video>
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
## Lectores de Pantalla — Clase sr-only
|
|
348
|
+
|
|
349
|
+
```css
|
|
350
|
+
.sr-only {
|
|
351
|
+
position: absolute;
|
|
352
|
+
width: 1px;
|
|
353
|
+
height: 1px;
|
|
354
|
+
padding: 0;
|
|
355
|
+
margin: -1px;
|
|
356
|
+
overflow: hidden;
|
|
357
|
+
clip: rect(0, 0, 0, 0);
|
|
358
|
+
white-space: nowrap;
|
|
359
|
+
border: 0;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
.sr-only-focusable:focus {
|
|
363
|
+
position: static;
|
|
364
|
+
width: auto;
|
|
365
|
+
height: auto;
|
|
366
|
+
overflow: visible;
|
|
367
|
+
clip: auto;
|
|
368
|
+
white-space: normal;
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
```html
|
|
373
|
+
<button>
|
|
374
|
+
Eliminar
|
|
375
|
+
<span class="sr-only">expediente de Juan Pérez López</span>
|
|
376
|
+
</button>
|
|
377
|
+
|
|
378
|
+
<a href="/descargar/reporte.pdf">
|
|
379
|
+
<svg aria-hidden="true"><!-- ícono PDF --></svg>
|
|
380
|
+
<span class="sr-only">Descargar reporte de nómina en formato PDF</span>
|
|
381
|
+
</a>
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## Checklist WCAG 2.1 AA Completo
|
|
387
|
+
|
|
388
|
+
### Perceptible
|
|
389
|
+
- [ ] Toda imagen tiene `alt` descriptivo o `alt=""` si es decorativa
|
|
390
|
+
- [ ] Videos tienen subtítulos en español
|
|
391
|
+
- [ ] No se transmite información solo por color
|
|
392
|
+
- [ ] Contraste de texto normal >= 4.5:1
|
|
393
|
+
- [ ] Contraste de texto grande >= 3:1
|
|
394
|
+
- [ ] Contraste de UI (botones, inputs) >= 3:1
|
|
395
|
+
- [ ] El contenido no desaparece al hacer zoom al 200%
|
|
396
|
+
|
|
397
|
+
### Operable
|
|
398
|
+
- [ ] Todo lo clickeable es accesible por teclado (Tab, Enter, Escape, flechas)
|
|
399
|
+
- [ ] El foco es siempre visible
|
|
400
|
+
- [ ] No hay trampas de teclado (excepto modales intencionales)
|
|
401
|
+
- [ ] Hay skip link al contenido principal
|
|
402
|
+
- [ ] Los modales atrapan foco y regresan al trigger al cerrar
|
|
403
|
+
- [ ] No hay contenido que destelle más de 3 veces por segundo
|
|
404
|
+
|
|
405
|
+
### Comprensible
|
|
406
|
+
- [ ] El idioma del documento está declarado (`<html lang="es">`)
|
|
407
|
+
- [ ] Los mensajes de error son descriptivos (no solo "Error")
|
|
408
|
+
- [ ] Los labels están asociados a sus inputs
|
|
409
|
+
- [ ] Los campos requeridos están marcados con `aria-required="true"`
|
|
410
|
+
- [ ] Los errores de validación se anuncian con `role="alert"` o `aria-live`
|
|
411
|
+
|
|
412
|
+
### Robusto
|
|
413
|
+
- [ ] El HTML valida sin errores críticos
|
|
414
|
+
- [ ] Los elementos interactivos tienen nombres accesibles
|
|
415
|
+
- [ ] Los estados (expandido, seleccionado, inválido) se comunican via ARIA
|
|
416
|
+
- [ ] La página funciona con JS deshabilitado en funciones críticas
|
|
417
|
+
|
|
418
|
+
---
|
|
419
|
+
|
|
420
|
+
## Herramientas de Prueba
|
|
421
|
+
|
|
422
|
+
```bash
|
|
423
|
+
# axe-core en CLI
|
|
424
|
+
npm install -g @axe-core/cli
|
|
425
|
+
axe https://miapp.com --tags wcag2a,wcag2aa
|
|
426
|
+
|
|
427
|
+
# Lighthouse (accesibilidad)
|
|
428
|
+
lighthouse https://miapp.com --only-categories=accessibility
|
|
429
|
+
|
|
430
|
+
# Pa11y
|
|
431
|
+
npm install -g pa11y
|
|
432
|
+
pa11y https://miapp.com --standard WCAG2AA
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Pruebas manuales obligatorias
|
|
436
|
+
|
|
437
|
+
1. **Solo teclado**: navega toda la página sin ratón. Tab, Shift+Tab, Enter, Escape, flechas.
|
|
438
|
+
2. **NVDA + Firefox** o **VoiceOver + Safari**: escucha la página como lo haría un usuario ciego.
|
|
439
|
+
3. **Zoom 200%**: verifica que el layout no se rompe.
|
|
440
|
+
4. **Windows High Contrast Mode**: verifica visibilidad de controles.
|
|
441
|
+
5. **Desactivar CSS**: verifica que el orden del DOM sea lógico.
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-browser
|
|
3
|
+
description: >
|
|
4
|
+
Herramienta de scraping web que permite al agente controlar un navegador Chrome
|
|
5
|
+
real para extraer contenido de páginas dinámicas, detrás de login, con JavaScript
|
|
6
|
+
pesado o con lazy loading. Usa 82% menos tokens que Playwright MCP y permite
|
|
7
|
+
5-6x más páginas por sesión. Parte del stack de investigador-swl como fallback
|
|
8
|
+
cuando WebFetch devuelve contenido incompleto. También alimenta directamente
|
|
9
|
+
el wiki de proyecto (raw/) con fuentes verificadas.
|
|
10
|
+
user-invocable: false
|
|
11
|
+
version: "1.0.0"
|
|
12
|
+
herramientasPermitidas: [Read, Bash, WebFetch]
|
|
13
|
+
evolved: false
|
|
14
|
+
fuente: "Vercel Labs agent-browser — 26K+ GitHub stars (2026-04)"
|
|
15
|
+
evolvable: true # default para skill estandar
|
|
16
|
+
exclusiones:
|
|
17
|
+
- "No cargar para scraping de páginas estáticas simples — usar WebFetch directamente, es más rápido y sin overhead."
|
|
18
|
+
- "No cargar para descarga de PDFs desde URLs directas — usar WebFetch o Read tool según el caso."
|
|
19
|
+
- "No cargar para automatización de UI (formularios, clicks, flujos de usuario) — para automatización cargar `playwright-testing` o equivalente."
|
|
20
|
+
- "No cargar para integración de OCR sobre imágenes — agent-browser no tiene capacidad de reconocimiento de texto en imágenes."
|
|
21
|
+
---
|
|
22
|
+
# Skill: agent-browser
|
|
23
|
+
|
|
24
|
+
Proporciona al agente capacidad de scraping web mediante un navegador Chrome real
|
|
25
|
+
controlado desde CLI. Diseñado para ser el fallback de WebFetch cuando el contenido
|
|
26
|
+
requiere JavaScript, interacción o autenticación.
|
|
27
|
+
|
|
28
|
+
## Cuándo NO cargar
|
|
29
|
+
|
|
30
|
+
- La página es estática (HTML simple sin JS): usar `WebFetch` — es más rápido y sin overhead.
|
|
31
|
+
- Se descarga un PDF desde una URL directa: usar `WebFetch` con la URL del PDF.
|
|
32
|
+
- La tarea es automatización de UI (formularios, flujos, clicks programáticos): cargar `playwright-testing`.
|
|
33
|
+
- La tarea requiere OCR sobre capturas de pantalla: agent-browser no reconoce texto en imágenes.
|
|
34
|
+
|
|
35
|
+
## Cuándo usar este skill vs WebFetch
|
|
36
|
+
|
|
37
|
+
| Situación | Usar |
|
|
38
|
+
|-----------|------|
|
|
39
|
+
| Página estática (HTML simple) | `WebFetch` — más rápido y sin overhead |
|
|
40
|
+
| Página con JS dinámico (React, Vue, Angular) | `agent-browser` |
|
|
41
|
+
| Contenido detrás de login o paywall | `agent-browser` |
|
|
42
|
+
| Lazy loading / infinite scroll | `agent-browser` |
|
|
43
|
+
| WebFetch devuelve HTML vacío o parcial | `agent-browser` como fallback |
|
|
44
|
+
| Research intensivo (5+ páginas seguidas) | `agent-browser` — 82% menos tokens |
|
|
45
|
+
| PDF descargable desde URL | `WebFetch` con la URL directa del PDF |
|
|
46
|
+
|
|
47
|
+
**Regla de decisión rápida**: si `WebFetch` devuelve menos de 500 palabras de contenido
|
|
48
|
+
real en una página que visualmente tiene más contenido, usar `agent-browser`.
|
|
49
|
+
|
|
50
|
+
## Paso 0 — Verificar disponibilidad
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
agent-browser --version 2>/dev/null || echo "NOT_INSTALLED"
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Si devuelve `NOT_INSTALLED`:
|
|
57
|
+
|
|
58
|
+
### Instalación (una vez por máquina)
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Instalar CLI global
|
|
62
|
+
npm install -g agent-browser
|
|
63
|
+
|
|
64
|
+
# Descargar Chrome dedicado (requiere ~300MB de espacio)
|
|
65
|
+
agent-browser install
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Verificar instalación:
|
|
69
|
+
```bash
|
|
70
|
+
agent-browser --version
|
|
71
|
+
# Esperado: agent-browser/X.Y.Z
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Si npm no está disponible, reportar al usuario:
|
|
75
|
+
```
|
|
76
|
+
⚠ agent-browser requiere npm (Node.js). Si no tienes Node instalado:
|
|
77
|
+
Windows: winget install OpenJS.NodeJS.LTS
|
|
78
|
+
macOS: brew install node
|
|
79
|
+
Linux: apt install nodejs npm
|
|
80
|
+
|
|
81
|
+
Alternativa inmediata: usa WebFetch con la URL y acepta que el contenido
|
|
82
|
+
puede estar incompleto en páginas dinámicas.
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Paso 1 — Scraping básico
|
|
86
|
+
|
|
87
|
+
### Extraer texto de un artículo
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Abrir la página en el navegador controlado
|
|
91
|
+
agent-browser open https://url-del-articulo.com
|
|
92
|
+
|
|
93
|
+
# Extraer el texto del contenido principal
|
|
94
|
+
agent-browser get text "article"
|
|
95
|
+
|
|
96
|
+
# Alternativa si "article" no funciona (selector más amplio)
|
|
97
|
+
agent-browser get text "main"
|
|
98
|
+
agent-browser get text "body"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Guardar directamente a un archivo
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
agent-browser open https://url.com
|
|
105
|
+
agent-browser get text "article" > .planning/knowledge/raw/$(date +%Y%m%d)-nombre-fuente.md
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Páginas con navegación requerida
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Abrir y esperar a que cargue
|
|
112
|
+
agent-browser open https://url.com
|
|
113
|
+
agent-browser wait 2000 # esperar 2 segundos para JS
|
|
114
|
+
|
|
115
|
+
# Hacer scroll para cargar contenido lazy
|
|
116
|
+
agent-browser scroll down 3
|
|
117
|
+
|
|
118
|
+
# Extraer después del scroll
|
|
119
|
+
agent-browser get text "main"
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Paso 2 — Patrones de uso frecuentes
|
|
123
|
+
|
|
124
|
+
### Patrón A: Investigación de documentación técnica
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# Para cada URL en la lista de investigación:
|
|
128
|
+
for URL in "https://docs.fastapi.tiangolo.com/async/" "https://docs.python.org/3/library/asyncio.html"; do
|
|
129
|
+
agent-browser open "$URL"
|
|
130
|
+
FILENAME=$(echo "$URL" | sed 's|https://||' | sed 's|[/.]|-|g' | cut -c1-60)
|
|
131
|
+
agent-browser get text "main" > ".planning/knowledge/raw/${FILENAME}.md"
|
|
132
|
+
echo "✓ Guardado: $FILENAME.md"
|
|
133
|
+
done
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Patrón B: Scraping de página con login (manual)
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
# 1. Abrir en modo visible (el usuario puede hacer login manual)
|
|
140
|
+
agent-browser open https://sitio-con-login.com --headed
|
|
141
|
+
|
|
142
|
+
# 2. El agente espera a que el usuario complete el login
|
|
143
|
+
# (Pausar y pedir confirmación al usuario antes de continuar)
|
|
144
|
+
|
|
145
|
+
# 3. Navegar a la página deseada
|
|
146
|
+
agent-browser navigate https://sitio-con-login.com/docs/pagina-privada
|
|
147
|
+
|
|
148
|
+
# 4. Extraer contenido
|
|
149
|
+
agent-browser get text "article"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Patrón C: Comparar múltiples páginas (benchmark de librerías)
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
LIBBRERIAS=("fastapi" "flask" "django")
|
|
156
|
+
for LIB in "${LIBBRERIAS[@]}"; do
|
|
157
|
+
agent-browser open "https://pypi.org/project/${LIB}/"
|
|
158
|
+
agent-browser get text ".package-description" > ".planning/knowledge/raw/${LIB}-pypi.md"
|
|
159
|
+
done
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Paso 3 — Integración con el wiki de proyecto
|
|
163
|
+
|
|
164
|
+
Después de scrapear fuentes, ingerir al wiki:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# 1. Scrapear y guardar en raw/
|
|
168
|
+
agent-browser open https://url.com
|
|
169
|
+
agent-browser get text "article" > .planning/knowledge/raw/$(date +%Y%m%d)-fuente.md
|
|
170
|
+
|
|
171
|
+
# 2. Decirle al agente que ingiera en el wiki
|
|
172
|
+
# (El agente lee raw/, extrae knowledge, actualiza wiki/)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Luego ejecutar `/swl:wiki ingest .planning/knowledge/raw/YYYY-MM-DD-fuente.md`
|
|
176
|
+
para integrar la fuente al wiki del proyecto.
|
|
177
|
+
|
|
178
|
+
## Paso 4 — Limitaciones y workarounds
|
|
179
|
+
|
|
180
|
+
| Limitación | Workaround |
|
|
181
|
+
|-----------|------------|
|
|
182
|
+
| Páginas con captcha | No automatizable — usar WebFetch o copiar manualmente |
|
|
183
|
+
| Sitios que bloquean headless browsers | Agregar `--headed` para abrir Chrome visible |
|
|
184
|
+
| Contenido en iframes | `agent-browser get text "iframe"` o navegar directamente al src del iframe |
|
|
185
|
+
| PDFs embebidos | Descargar el PDF con su URL directa y leer con Read tool |
|
|
186
|
+
| Imágenes con texto (OCR) | agent-browser no tiene OCR — capturar con `agent-browser screenshot` y procesar aparte |
|
|
187
|
+
|
|
188
|
+
## Eficiencia de tokens
|
|
189
|
+
|
|
190
|
+
agent-browser usa **82% menos tokens que Playwright MCP** porque:
|
|
191
|
+
- No transmite el árbol DOM completo entre el navegador y el agente
|
|
192
|
+
- Solo extrae el selector solicitado, no toda la página
|
|
193
|
+
- No requiere que el agente genere código de automatización
|
|
194
|
+
|
|
195
|
+
**Implicación práctica**: Con Playwright MCP, una sesión de investigación de 10 páginas
|
|
196
|
+
puede consumir 50K tokens solo en overhead de scraping. Con agent-browser: ~9K tokens.
|
|
197
|
+
|
|
198
|
+
## Señales de que agent-browser completó correctamente
|
|
199
|
+
|
|
200
|
+
✓ Output tiene >200 palabras de contenido real (no solo tags HTML)
|
|
201
|
+
✓ El contenido incluye el texto principal del artículo/documentación
|
|
202
|
+
✓ No hay mensajes de error como "ERR_CONNECTION_REFUSED" o "Navigation timeout"
|
|
203
|
+
|
|
204
|
+
## Señales de problema
|
|
205
|
+
|
|
206
|
+
- Output vacío o <50 palabras → la página puede tener captcha o bloqueo activo
|
|
207
|
+
- Mensaje "Navigation timeout" → la URL no carga; verificar la URL
|
|
208
|
+
- Contenido solo de navegación (menús, headers) → el selector es incorrecto; probar "body" o "main"
|
|
209
|
+
|
|
210
|
+
## Gotchas / Errores comunes no obvios
|
|
211
|
+
|
|
212
|
+
**`agent-browser get text "article"` devuelve vacío aunque la página tenga contenido visible**: el selector CSS apunta a un elemento que no existe en el DOM real de la página. Causa: la página puede usar `<main>`, `<section>`, o un div con clase en lugar de `<article>` semántico. Fix: intentar selectores alternativos en orden: `"article"` → `"main"` → `".content"` → `"body"`. Si ninguno funciona, usar `agent-browser get text "body"` para capturar todo y filtrar manualmente.
|
|
213
|
+
|
|
214
|
+
**`agent-browser open` completa sin error pero el contenido todavía está cargando cuando se llama `get text`**: algunas SPAs cargan el contenido principal de forma asíncrona después del evento DOMContentLoaded. Causa: `open` espera el evento de carga inicial, no la hidratación completa de React/Vue/Angular. Fix: agregar `agent-browser wait 2000` entre `open` y `get text` para dar tiempo al JS de renderizar el contenido. Para páginas con lazy loading, combinar con `agent-browser scroll down 3` antes de extraer.
|
|
215
|
+
|
|
216
|
+
**Usar `agent-browser` en un loop con 10+ URLs causa que el proceso Chrome se quede sin memoria y falle silenciosamente**: el Chrome controlado no libera memoria entre páginas del mismo proceso. Causa: cada `open` reutiliza el mismo proceso Chrome sin reiniciarlo. Fix: para loops de investigación intensiva (>10 URLs), dividir en sub-lotes y reiniciar `agent-browser` entre grupos, o procesar en secuencia con pausa de 500ms entre páginas.
|
|
217
|
+
|
|
218
|
+
**`agent-browser navigate` a una página de login redirecciona a la URL original sin error**: si el sitio detecta el browser headless y redirecciona al login, el agente no recibe señal de fallo — simplemente extrae el contenido del formulario de login en lugar de la página deseada. Causa: sites como LinkedIn, Cloudflare-protected pages bloquean headless browsers. Fix: verificar que el output extraído contiene el contenido esperado (>200 palabras reales), no un formulario. Usar `--headed` para hacer el login visible y manual cuando el sitio requiere autenticación humana.
|