---
name: web-fetcher-routing
description: >
  Routing inteligente para fetching de URLs según dominio y formato:
  GitHub raw, PDF, sitios JS-heavy y default. Reduce tokens consumidos
  evitando WebFetch cuando hay alternativa más eficiente. Cargar antes
  de hacer WebFetch a URLs externas, especialmente repositorios GitHub,
  PDFs públicos, o sitios con paywall/Cloudflare/JS heavy.
version: "1.0.0"
exclusiones:
  - "No cargar para descarga de archivos binarios grandes (>10 MB) — el routing está optimizado para texto y HTML."
  - "No cargar cuando la URL ya es directa al recurso (raw GitHub, PDF, JSON API) y no hay duda de cómo procesarla."
  - "No cargar para web scraping con interacción (login, formularios) — eso es agent-browser."
  - "No cargar para fetching local de filesystem (file://) — usar Read tool."
---

# web-fetcher-routing

Selecciona la herramienta correcta para cada URL antes de intentar el fetch.
Un WebFetch al HTML de GitHub UI consume 10-30× más tokens que leer el raw.
Un PDF vía Read devuelve basura binaria. La elección equivocada cuesta tokens
reales; este skill la automatiza.

## Cuándo cargar

- Antes de hacer `WebFetch` a cualquier URL externa no trivial.
- Cuando la URL apunta a GitHub (repositorio, archivo o blob).
- Cuando la URL termina en `.pdf` o el contexto indica documento PDF.
- Cuando el fetch previo falló con 402, página de login o contenido vacío
  (señal de JS-heavy o Cloudflare).

## Cuándo NO cargar

- URLs internas del proyecto o localhost — usar `Read` directamente.
- Contenido ya cargado en el contexto de esta sesión — no re-fetchar.
- Cuando el usuario dictó explícitamente la herramienta a usar
  ("usa WebFetch", "lee con curl").

## Tabla de routing

| Patrón de URL | Herramienta | Razón |
|---|---|---|
| `github.com/[user]/[repo]/blob/[branch]/[path]` | Reescribir a `raw.githubusercontent.com/[user]/[repo]/[branch]/[path]` y hacer `WebFetch` con la URL reescrita | Evita el HTML de la UI de GitHub; 10-30× menos tokens |
| `raw.githubusercontent.com/...` | `WebFetch` directo | Ya es raw content |
| URL termina en `.pdf` | Invocar `Skill("swl-markitdown")` para conversión con `pdftotext` o `markitdown` | `Read` no soporta PDF; `WebFetch` devuelve binario o HTML de visor |
| `x.com`, `twitter.com`, cualquier host con CAPTCHA o Cloudflare detectado | Invocar `Skill("agent-browser")` con headless Chrome | `WebFetch` devuelve 402 o página de login; `agent-browser` usa accessibility tree (~82% menos tokens que screenshots) |
| `mp.weixin.qq.com`, `feishu.cn`, `larksuite.com` | Invocar `Skill("agent-browser")` | Plataformas chinas con autenticación o JS requerido |
| Todo lo demás | `WebFetch` directo | El caso común; probar primero antes de escalar |

## Algoritmo de decisión

1. Parsear la URL: extraer esquema, dominio y extensión del path.
2. Comparar con los patrones de la tabla, en orden de arriba hacia abajo.
3. Si el dominio es `github.com` con segmento `/blob/` en el path:
   reescribir la URL antes de hacer el fetch.
4. Invocar la herramienta asignada al patrón que coincide.
5. Si el resultado tiene señales de paywall o error (primeras 10 líneas
   contienen "Subscribe", "Sign in", "403", página vacía): escalar al
   patrón JS-heavy con `Skill("agent-browser")`.
6. Reportar qué método se usó y por qué, en una línea antes del contenido.

## Ejemplo de reescritura GitHub

```
# URL original
https://github.com/tw93/Waza/blob/main/skills/read/SKILL.md

# URL reescrita para raw
https://raw.githubusercontent.com/tw93/Waza/main/skills/read/SKILL.md
```

## Señales de fallo que activan escalado

| Señal en la respuesta | Acción |
|---|---|
| HTTP 402 | Escalar a `agent-browser` |
| Primeras líneas con "Sign in" o "Subscribe" | Detener, avisar al usuario |
| Contenido HTML con menos de 200 caracteres | Reintentar con método alternativo |
| Binario o caracteres ilegibles | Verificar si es PDF; si sí, usar `swl-markitdown` |

<!-- Adaptado de Waza/skills/read bajo MIT License (tw93/Waza) -->
