Files
rafa 56ee1580b0 fix(content) + tools(e2e): rutas de imagen Joomla + suite E2E
- scripts/fix_image_paths.php: reescribe src/href "images/..." en wp_posts
  a "/fea/wp-content/uploads/..." cuando el fichero existe en uploads.
  Cubre comillas dobles/simples, urldecode antes de chequear filesystem.
  Resuelto contra issue #34 (458 posts, 465 refs) y completado con #36
  (124 posts, 128 refs tras recuperar 127 assets del backup producción).

- tools/e2e/: pipeline 3-tier para validar WP local con coste mínimo en
  tokens de Claude — Playwright (Tier 1, deterministas) + Gemma 4 vision
  en LM Studio (Tier 2, bajo demanda) + Claude solo lee report.md.
  Issue de diseño #37, suite inicial en sites/feadulta.json (13 URLs).

- .gitignore: excluir tools/e2e/node_modules y out/.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 10:26:04 -04:00

102 lines
3.4 KiB
Markdown

# tools/e2e — Suite E2E económica en tokens
Pipeline de revisión visual/funcional con coste mínimo en tokens de Claude. Diseño 3-tier:
| Tier | Quién | Coste tokens Claude |
|---|---|---|
| 1 — Programático | Playwright local | **0** |
| 2 — LLM local vision | Gemma 4 vision en LM Studio | 0 |
| 3 — Claude | Lee `report.md` (texto) | Mínimo |
Issue de diseño: rafa/feadulta#37.
## Setup
```bash
cd tools/e2e
npm install # instala playwright 1.58.2 (reaprovecha browsers ya en ~/.cache/ms-playwright/)
```
## Uso — Tier 1 (sin LLM)
```bash
# Suite completa
node run.js feadulta
# Una sola URL por slug
node run.js feadulta home-es
# Subconjunto
node run.js feadulta --only=home-es,effa-hub,carta-semana
```
Genera por cada pasada:
```
out/<site>/<timestamp>/
report.json # datos crudos
report.md # tabla legible
<slug>.png # screenshot full-page por URL
out/<site>/latest -> <timestamp> # symlink al último run
```
Métricas por URL: HTTP status, console errors/warnings, page errors, requests fallidas (≥400), `<img>` con `naturalWidth==0`, `<title>`, `<h1>`, word count, tiempo de carga.
Severity:
- `OK` — sin problemas detectados
- `WARN` — imágenes rotas, requests 4xx, console errors
- `FAIL` — HTTP ≥ 400 o error de navegación
## Uso — Tier 2 (vision Gemma 4)
```bash
# Pregunta ad hoc sobre una captura
node ask-vision.js out/feadulta/latest/post-tolle-44247.png \
"¿Se ve la foto de Eckhart Tolle? ¿Hay placeholders rotos?"
# Auto: pasa cada captura WARN/FAIL a la vision y escribe vision.md
node ask-vision.js --auto out/feadulta/latest
```
Variables de entorno (opcionales):
- `LMSTUDIO_URL` — default `http://172.19.128.1:1234/v1` (gateway WSL→Windows)
- `LMSTUDIO_MODEL` — default `google/gemma-4-e4b`
- `MAX_TOKENS` — default 800
- `TEMPERATURE` — default 0.2
Requisito: LM Studio cargado con un modelo multimodal y escuchando en `0.0.0.0:1234`.
## Añadir un sitio
Crear `sites/<nombre>.json`:
```json
{
"name": "ytsummaries",
"baseUrl": "https://farmer.taild3aaf6.ts.net",
"viewport": { "width": 1366, "height": 900 },
"timeoutMs": 30000,
"userAgent": "ytsummaries-e2e/0.1",
"urls": [
{ "slug": "home", "path": "/yt/" },
{ "slug": "admin", "path": "/yt/wp-admin/" }
]
}
```
`baseUrl + path` se concatena tal cual. Ejecutar con `node run.js ytsummaries`.
## Diseño
- **Sin LLM por defecto:** los checks deterministas (HTTP/console/`naturalWidth`) cubren los fallos reales.
- **Vision bajo demanda:** Gemma 4 solo entra cuando hace falta opinar sobre maquetación o cuando Tier 1 marca algo raro.
- **Claude solo lee texto:** `report.md` cabe en ~10 KB. Las PNG no entran al contexto salvo que el usuario lo pida.
- **Stateless:** cada pasada vive en su propia carpeta timestamp. `latest` es symlink.
- **Reutilizable:** el runner no sabe nada de feadulta; solo conoce el formato `sites/<x>.json`.
## Limitaciones conocidas
- Gemma 4 a veces escribe razonamiento antes de la respuesta final. `ask-vision.js` intenta extraer "Final Answer:" o la primera etiqueta `[OK]/[WARN]/[FAIL]`.
- No hay comparación con baseline aún. El runner solo describe el estado actual. Snapshot/pHash es trivial de añadir cuando se quiera detección de regresiones contra una pasada anterior.
- Playwright 1.58.2 está pineado para reaprovechar los browsers ya cacheados (`chromium_headless_shell-1208`). Subir a 1.60+ requiere `npx playwright install`.