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>
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
# 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`.
|
||||
Reference in New Issue
Block a user