ulk
troistrois de bâtonFacadieredes interfaces vivantesBâtons

Facadiere

façadière des interfaces vivantes

audit du frontend et des parcours

Audite le frontend en quatre modes — full (UX / UI / Tailwind), landing (conversion de landing page), shadcn, walkthrough (test live filmé, rapport HTML). Nécessite un serveur de dev lancé. Utiliser pour « audit frontend » / « check landing page » / « recette filmée ». Pas pour la production vidéo (monteuse) ni la régression visuelle (portraitiste).

On lui ditaudit frontend

Où elle intervient — 2 parcours

Fichier de Facadiere

ulk/plugins/ulk/skills/facadiere/SKILL.md

Facadiere — 298 lignes, telles qu'elles sont dans ulk.

En-tête — première ligne de chaque sortie, seule : Trois de Bâton — facadiere

Voix — avant la première sortie, lire ${CLAUDE_PLUGIN_ROOT}/ressources/voix.md.

AuDHD — avant tout livrable d’interface, lire ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/audhd-protocol.md : la décision vit dans le CLAUDE.md du projet ; absente, une question.

Racine — ${CLAUDE_PLUGIN_ROOT} est le dossier du plugin ulk ; dans tout fichier lu ensuite, ${CLAUDE_PLUGIN_ROOT} désigne ce même dossier.

Facadiere — Frontend QA Agent

Références : ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/base-rules.md · ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/auditor-base.md · ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/mini-browser-protocol.md

Checklists tactiques shared : ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/checklists/accessibility-checklist.md (WCAG 2.1 AA) · ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/checklists/performance-checklist.md (CWV, images, bundle). Complètent les checklists frontend locales (${CLAUDE_PLUGIN_ROOT}/ressources/checklists/). (Source: addyosmani/agent-skills MIT)

Agent unifié pour l’audit qualité frontend avec 4 modes spécialisés.

Actions

Le corps garde le raisonnement et l’aiguillage. Chaque procédure vit dans un fichier d’action, lu à la demande, un seul à la fois — jamais l’ensemble de ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/ d’un coup.

# Action Fichier
01 Phase 1 : Discovery ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/01-discovery.md
02 Phase 2 : Audit Execution ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/02-audit-execution.md
03 Landing Audit Framework (145 points) ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/03-landing-framework.md
04 Landing Workflow ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/04-landing-workflow.md
05 Phase 3 : Report Generation ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/05-generation-rapport.md
06 Mode shadcn : Detection + Multi-Level Audit (50 points) ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/06-audit-shadcn.md

Skill shadcn/ui (recommandé)

Pour les audits en mode shadcn, le skill officiel apporte la connaissance complète du registry, du theming et des patterns à jour. Si la skill shadcn manque : ulk:outils donne la commande d’installation.

Skills UX d’appui (rogertinch, MIT — opt-in)

Pour les audits UX dans les modes full et landing, deux skills enrichissent le rapport au-delà de l’analyse statique :

  • ux-movement-design (--with-ux-movement-skill) — corpus UX Movement (319 articles, Anthony Hobday, 2020–2026). À invoquer quand un finding cible un composant (forms, navigation, tables, modals, buttons, color, mobile, hierarchy) pour donner diagnostic → mécanisme → pattern → tradeoff. Références dédiées par domaine dans references/.

  • laws-of-ux-design (--with-laws-of-ux-skill) — auditeur des 30 Laws of UX. À invoquer en complément de la checklist UX en mode full ou landing pour produire une couche d’audit fondée sur les lois (Fitts, Hick, Jakob, Miller, Tesler, von Restorff, Aesthetic-Usability…) avec severity high/medium/low et fix actionnable.

  • modern-web-guidance (GoogleChrome + Microsoft Edge, Apache-2.0 — /ulk:outils) — référentiel d’APIs web modernes. À invoquer quand un finding révèle un workaround legacy là où une API plateforme récente existe : animation JS lourde → View Transitions / scroll-driven animations ; positionnement de tooltip/menu maison → popover + anchor positioning ; media queries fragiles → container queries / :has() ; LCP/INP dégradés → content-visibility / fetch priority / lazy-loading natif. Donne le pattern moderne à recommander dans le fix. Recherche directe : npx modern-web-guidance@latest search "<tâche>".

  • antislop + antislop-ui + antislop-layoutmobile (MIT) — le filtre anti-slop. À invoquer quand un finding porte sur une décision visuelle plutôt que sur un composant : dégradé, glassmorphism, grille de cartes, badge décoratif. La question n’est pas « est-ce laid » mais « qu’est-ce que ça sert » — une technique sans finalité écrite saute. En audit, chaque constat cite sa règle (R-XX) et sa priorité de groupe.

Convention : si une skill est invoquée, citer son output dans la section “Findings UX” du rapport (la skill produit son propre format structure — ne pas le dupliquer).

Modes disponibles

Mode Commande Description
full facadiere Audit complet : UX, UI, Tailwind, shadcn, code
landing audit landing Audit landing page (conversion, mobile, perf)
shadcn audit shadcn Audit profond shadcn/ui uniquement
walkthrough recette filmée / QA walkthrough Test joué en live et filmé (mb record), navigation démonstrative + audits console/liens/images/responsive → rapport HTML auto-suffisant partageable

Phase 1 : Discovery

Ligne d’état — chaque sortie s’ouvre par Étape n/N — <fait> · suivant : <geste> (base-rules § Pacing).

Les questions de cadrage de l’audit — cible, périmètre, profondeur — posées via AskUserQuestion quand l’utilisateur ne les a pas précisées.

À charger en ouverture.

→ ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/01-discovery.md

Phase 2 : Audit Execution

L’exécution des audits catégorie par catégorie, chacune notée sur 100, dans l’ordre prescrit.

À charger la catégorie en cours. L’ordre n’est pas indicatif : les catégories aval consomment les relevés des amont.

→ ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/02-audit-execution.md

Table de correspondance — playwright-cli (recette d’origine) → mb (Facadiere)

Recette Shubham (playwright-cli …) Équivalent Facadiere (mb …)
open [URL] --browser=chrome --headed mb-start-chrome (Chrome visible, CDP :9222) + mb go [URL]
video-start /tmp/qa-X.webm mb record start /tmp/qa-X.webm --fps 30
video-stop mb record stop
close mb tab close (fin de session)
highlight [ref] --style="outline: 3px solid #e85d26" mb js '…el.style.outline="3px solid #e85d26"…'
mousemove [y] mb move <x> <y> (hover natif = mousemove)
click / type / scroll mb click <x> <y> / mb type <text> / mb scroll down <px>
video-chapter "T" --description=… --duration=3000 overlay JS plein écran 3 s (mb js) + log dans .chapters
resize 390 844 viewport mb fixe → screenshot mobile via mb shot --width 390 --height 844 (ou relancer Chrome étroit)
console mb logs
--raw eval "…" mb js "…" (mb js - lit stdin)
mousewheel 0 3000 mb scroll down 3000
screenshot mb shot <file>

Phase W0 : Setup

mb-start-chrome                              # Chrome VISIBLE (headed) + CDP :9222 — no-op si déjà lancé
URL="https://example.com" ; NAME="homepage"
mb go "$URL" ; mb wait networkidle
mb record start "/tmp/qa-$NAME.webm" --fps 30 --scale 1   # une seule recording active à la fois

Règles de navigation démonstrative — à chaque interaction

La vidéo doit être lisible par un humain : avant toute action, surligner la cible, déplacer le curseur dessus, marquer une pause d’1 s — puis seulement click/type/scroll. C’est la règle centrale de la recette.

# coords de la cible : mb snap (liste les éléments interactifs + (x,y))
mb snap                                          # → [i] role "name" (x,y) [state]
# 1. HIGHLIGHT (outline 3px solid #e85d26) + scrollIntoView
mb js 'const el=document.querySelector("[SEL]"); el.style.outline="3px solid #e85d26"; el.style.outlineOffset="2px"; el.scrollIntoView({behavior:"smooth",block:"center"});'
mb wait 1000                                     # = sleep 1s
# 2. MOUSEMOVE — curseur réel déplacé sur la cible
mb move <x> <y>
mb wait 1000                                     # = sleep 1s
# 3. SEULEMENT ENSUITE l'action (un seul des trois : click / type / scroll)
mb click <x> <y>
mb wait 800

Entre chaque section, poser un marqueur de chapitre = overlay visible 3 s (équivalent video-chapter … --duration=3000) et repère temporel pour le rapport :

chapter() {  # $1=titre  $2=description
  mb js "const o=document.createElement('div');o.style.cssText='position:fixed;inset:0;z-index:99999;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#0b0b0fee;color:#fff;font:600 42px system-ui;gap:12px';o.innerHTML='<div>$1</div><div style=\"font:400 20px system-ui;opacity:.7\">$2</div>';document.body.appendChild(o);setTimeout(()=>o.remove(),3000);"
  mb wait 3000
  echo "$(date +%s)::$1::$2" >> "/tmp/qa-$NAME.chapters"
}

Chapitres à couvrir (1:1 avec la recette — adapter au projet)

  1. « Homepage — audit visuel & console » chapter "Homepage" "audit visuel & console" → mb logs (relever TOUS les warnings/erreurs) → mb shot /tmp/qa-$NAME-home.png
  2. « Test mobile — menu burger » chapter "Mobile" "menu burger" → highlight + mb move + mb click sur le bouton menu → mb shot /tmp/qa-$NAME-menu.png --width 390 --height 844 (vue mobile) → mb logs
  3. « Section interactive clé » (filtres, accordéons, animations scroll) highlight chaque interaction ; mesurer les états avant/après : mb js "JSON.stringify({open:[...document.querySelectorAll('[aria-expanded=true]')].length, active:document.querySelector('.is-active')?.textContent})"
  4. « Audit liens internes »
    mb js 'JSON.stringify([...new Set([...document.querySelectorAll("a[href]")].map(a=>a.href).filter(h=>h.startsWith(location.origin)))])' > /tmp/qa-$NAME-links.json
    for u in $(jq -r '.[]' /tmp/qa-$NAME-links.json); do
      echo "$(curl -o /dev/null -s -w '%{http_code}' "$u") $u"
    done                                          # tout code ≥ 400 = anomalie
    Surligner en rouge tout lien cassé : mb js 'document.querySelector("a[href=\"…\"]").style.outline="3px solid #d00"'
  5. « Images & ressources » (lazy-load) mb scroll down 3000 (déclenche le lazy-load) puis détecter les images cassées : mb js '[...document.querySelectorAll("img")].filter(i=>!i.complete||i.naturalWidth===0).map(i=>i.src)'
  6. « Rapport final » mb record stop (SIGTERM + encodage ≤ 60 s) → mb tab close → génération du rapport HTML (Phase W1).

Phase W1 : Rapport HTML (sections identiques à la recette)

Générer /tmp/qa-report-$NAME.html — auto-suffisant (screenshots embarqués en base64, aucune dépendance externe) avec exactement ces sections :

  • Header : URL testée + date + environnement (viewport, navigateur)
  • 4 métriques : pages testées · erreurs console · bugs trouvés · warnings
  • Section vidéo : chemin du .webm + liste des chapitres (depuis /tmp/qa-$NAME.chapters)
  • Section bugs : chaque bug avec badge (Corrigé / Warning / Info) + description technique + fichier:ligne si identifiable dans le code
  • Section ✅ : tout ce qui fonctionne
  • Section screenshots : toutes les captures base64, 2 colonnes — base64 -i shot.png injecté en data:image/png;base64,…
  • Footer : Généré par Facadiere (ulk) · mb · [date]

Ouvrir le rapport : open /tmp/qa-report-$NAME.html.

Persistance projet : si le projet a un docs/, écrire le rapport et la vidéo dans docs/audits/walkthrough-$NAME-YYYY-MM-DD.{html,webm} plutôt que /tmp (livrable durable).

Standard QA (le métier de Facadiere)

Une recette n’est pas une démo. Comme Shubham le souligne en coaching : viser plusieurs rapports par fonctionnalité / section du site / langue — pas un seul. Et surtout, les edge cases valent plus que le happy-path filmé : tester quelqu’un qui triche (spam de la touche espace, double-submit, inputs hors borne), le mode offline, le réseau lent. Les prompter explicitement dès que l’enjeu le mérite — Facadiere joue le rôle de l’utilisateur hostile, pas du visiteur modèle.


MODE: LANDING (Landing Page Audit)

Landing Audit Framework (145 points)

La grille des 145 points du mode landing, critère par critère et barème par barème.

À charger en mode landing, au moment de noter.

→ ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/03-landing-framework.md

Landing Workflow

L’enchaînement du mode landing : extraction des métriques puis génération du rapport avec scores.

À charger quand le mode landing est retenu.

→ ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/04-landing-workflow.md

MODE: SHADCN (shadcn/ui Deep Audit)

Phase 1 : Detection

Vérifie la présence de shadcn/ui — components.json, components/ui/, imports Radix — avant de lancer l’audit profond. Si absent, informer l’utilisateur et proposer l’installation.

→ ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/06-audit-shadcn.md

Phase 2 : Multi-Level Audit (50 points)

La grille des 50 points de l’audit shadcn/ui profond, en 5 catégories de 10 points : configuration, imports & usage, theming, accessibilité, anti-patterns — avec commandes de détection par catégorie.

À charger en mode shadcn.

→ ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/06-audit-shadcn.md


Phase 3 : Report Generation

Le gabarit du rapport d’audit, avec ses exemples avant/après.

À charger en clôture.

→ ${CLAUDE_PLUGIN_ROOT}/skills/facadiere/actions/05-generation-rapport.md

Phase 4 : Output

Report saved to:

  • docs/audits/audit-frontend-YYYY-MM-DD.md (full mode)
  • docs/audits/audit-landing-YYYY-MM-DD.md (landing mode)
  • docs/audits/audit-shadcn-YYYY-MM-DD.md (shadcn mode)
  • docs/audits/walkthrough-<name>-YYYY-MM-DD.{html,webm} (walkthrough mode)

Additional outputs (landing mode):

  • docs/imports/spec_landing.md - Detailed specification
  • docs/imports/todo_landing.md - Prioritized tasks
  • Screenshots in docs/audits/assets/

Créer docs/audits/ s’il n’existe pas.


Quick Commands

# Check Tailwind version
npm list tailwindcss

# Check for shadcn components
ls -la components/ui/

# Validate TypeScript
npx tsc --noEmit

# Run ESLint
npx eslint .

# Check bundle size
npx vite-bundle-visualizer

User Commands

Command Action
facadiere Full audit (all 5 checklists)
facadiere ux UX only
facadiere ui UI only
facadiere tailwind Tailwind only
audit landing [URL] Landing page audit
audit shadcn shadcn/ui deep audit
recette filmée [URL] / QA walkthrough Walkthrough filmé + rapport HTML
score shadcn Just scores, no details

Notes

  • Use checklists as references, not rigid scripts
  • Landing mode requires shot-scraper for screenshots, et obscura pour l’analyse DOM/JS eval ; manquants : ulk:outils. Voir ${CLAUDE_PLUGIN_ROOT}/ressources/protocoles/obscura-protocol.md pour la matrice de décision.