1---2name: pwa-validation3description: Validation complète d'une PWA avant commit et déploiement — tests locaux via Caddy (.test), lint, typecheck, tests unitaires, build, Lighthouse, audits a11y/SEO/sécurité, checklist pré-commit. Charger avant chaque commit (via ops-quality) pour valider build, performances, accessibilité et sécurité.4license: MIT5---67# pwa-validation89## Ce que je fais10- Exécute la séquence complète de validation d'une PWA avant commit.11- Centralise l'ancienne skill pwa-tests-locaux + audits a11y/SEO/sécurité.1213## 1. Preview locale — Caddy + Docker Desktop (pas localhost)14- Caddy installé : `/opt/homebrew/bin/caddy`, config unique `~/.config/caddy/Caddyfile` (lancé via `caddy run --config ~/.config/caddy/Caddyfile`).15- App lancée via Docker Desktop (`docker compose -f docker-compose.dev.yml up`).16- Ajouter un bloc par projet dans Caddyfile (mappage vers le port exposé par le conteneur Docker) :17```caddy18mon-projet.test, mon-projet.localhost {19 tls internal20 reverse_proxy localhost:517321}22```23- Recharger après modification : `caddy reload --config ~/.config/caddy/Caddyfile`.24- **Ne jamais tester via `http://localhost:<port>`** — toujours le domaine `.test` (HTTPS local automatique).25- Vérifier qu'aucun service n'écoute déjà sur le port cible.26- Config de référence : `assets/configs/Caddyfile.test`.2728## 2. Séquence de validation (dans l'ordre, chaque étape doit passer)290. **Détection de secrets EN PREMIER** — bloquante et bon marché : inutile de lancer Lighthouse si une clé est commitée.30 - `gitleaks detect --source . --redact` (couvre aussi l'historique Git ; `brew install gitleaks` si absent).31 - Fallback grep : `sk-`, `AKIA`, `ghp_`, `password=`, `SECRET`, `TOKEN`.32 - `npm audit --audit-level=high` + vérifier que le lockfile est commité.331. **Lint** : `npm run lint` (ESLint / Biome) + `ruff check .` (si backend Python)342. **Typecheck** : `npm run typecheck` (TS) + `mypy .` / `pyright` (Python si configuré)353. **Tests unitaires** : `npm test` + `pytest` (si micro-services Python) — écrits par `lead-dev` / `integrations`, pas par `ops-quality`364. **Build** : `npm run build` sans erreur ni warning bloquant375. **Preview** : servir le **build de production** (`npm run preview`) via Caddy en **`https://mon-projet.test`** — jamais `localhost`, jamais le serveur de dev (scores non représentatifs).386. **Tests E2E** : `playwright-cli` — parcours réels (auth, paiement, CRUD, hors-ligne), screenshots succès/échec. Checklist : `assets/checklists/e2e.md`397. **Audit design automatisé** : `impeccable detect <src>` — 59 règles déterministes anti-slop ; sortie `--json` CI-friendly. **Épingler en devDependency** (`npm i -D impeccable`) — pas de `npx` à la volée sur un paquet non épinglé.408. **Lighthouse**, sur le build de prod servi en **HTTPS** :41 `npx lighthouse https://mon-projet.test --view --chrome-flags="--ignore-certificate-errors"`42 - Le Chrome lancé par Lighthouse doit accepter le certificat `tls internal` de Caddy, sinon l'audit échoue.43 - Cibles : Performance ≥ 80 (LCP < 2.5 s) · Accessibilité ≥ 90 · CLS < 0.1 · **TBT < 200 ms**.44 - ⚠️ La catégorie **« PWA installable » n'existe plus dans Lighthouse ≥ 12** → vérifier l'installabilité via la checklist PWA et le panneau Application de Chrome DevTools.45 - ⚠️ **INP** est une métrique terrain, non mesurable dans un audit de navigation : utiliser **TBT** comme proxy en labo.469. **Test hors-ligne** : DevTools → Application → Service Workers → Offline → page de repli + fonctions de base4748## 3. Audit accessibilité (a11y)49- Contraste ≥ 4.5:1 (WCAG AA) ; focus visible ; navigation clavier et tactile50- ARIA ; labels sur icônes ; `prefers-reduced-motion` ; safe areas51- Checklist : `assets/checklists/a11y.md`5253## 4. Audit SEO54- Title unique + meta description < 160 car. ; OpenGraph / Twitter Cards55- robots.txt, sitemap.xml ; données structurées JSON-LD56- Checklist : `assets/checklists/seo.md`5758## 5. Audit sécurité (complète l'étape 0)59- **Secrets** : `gitleaks` (historique Git inclus) ; `.env` non commité (vérifier .gitignore) ; aucun token dans logs/commentaires60- **Dépendances** : `npm audit` + lockfile commité61- **OWASP Top 10** : injection (SQL/shell/NoSQL), XSS (innerHTML non contrôlé), IDOR, stack traces exposées62- **PWA** : SW scope trop large, cache poisoning, permissions manifest excessives, HTTPS obligatoire, CSP restrictive, headers (X-Frame-Options, X-Content-Type-Options, Referrer-Policy), CORS explicite63- **Données** : pas de données sensibles en clair dans localStorage/IndexedDB ; transmission chiffrée64- Checklist : `assets/checklists/security.md`6566## 6. Checklist pré-commit67- Lint + typecheck OK · tests OK · build OK · PWA installable · hors-ligne OK · cibles tactiles ≥ 44px · contraste ≥ 4.5:1 · pas de scroll horizontal · aucun secret dans le code68- Checklist : `assets/checklists/pre-commit.md`6970## 7. Verdict71- ✅ **Prêt à commiter** → cycle Git (branche testing, commit conventionnel, tag, release) via ops-quality.72- ⚠️ **Corrections requises** → lister les points bloquants priorisés, retourner à `lead-dev` (ne pas corriger soi-même).73- ⛔ **Blocage sécurité** → ne pas commiter, ne pas tagger/release tant que levé.7475## Règles76- Ne pas modifier le code applicatif — signaler puis livrer.77- Toujours charger `shared-eco-tokens` pour un rapport concis.78- Outils externes : `playwright-cli` — paquet **`@playwright/cli`** (le paquet npm `playwright-cli` est déprécié) ; `impeccable` — à épingler en devDependency.7980## Assets81- `assets/checklists/pre-commit.md`82- `assets/checklists/security.md`83- `assets/checklists/seo.md`84- `assets/checklists/a11y.md`85- `assets/checklists/e2e.md`86- `assets/configs/Caddyfile.test`