CommunityImagegithub.com

lw-spec-mockup

À utiliser lorsqu'un cahier des charges ou un plan nécessite une image d'écran, d'état, de dialogue, de page de console ou de flux, lorsque l'utilisateur demande « où est le design », « dessine-le » ou « montre tous les états », et avant de valider ou de modifier une planche dans docs/specs/assets. Génère des planches SVG avec une seule bibliothèque. Ne concerne pas le texte du cahier des charges, qui relève de lw-spec-write.

Qu'est-ce que lw-spec-mockup ?

Cette compétence génère des maquettes visuelles (planches SVG) à partir de scripts Python, en utilisant une bibliothèque unique `boards.py`. Elle est destinée aux développeurs travaillant avec des agents d'IA comme Claude Code, et permet de créer des représentations précises d'interfaces utilisateur (écrans, états, dialogues, flux) sans édition manuelle des SVG. La compétence repose sur l'import de tokens de couleurs réels depuis les fichiers CSS du projet, l'utilisation d'icônes Lucide, et l'intégration de captures d'écran réelles pour la colonne « Aujourd'hui ». Chaque planche est générée par un script Python situé dans `docs/specs/assets/`, et doit être vérifiée visuellement via une capture PNG avant validation. La compétence s'applique à n'importe quel projet configuré avec un dossier d'adaptation, et nécessite Google Chrome ou Chromium pour le rendu.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/launchwrighthq/agent-harness/tree/HEAD/skills/lw-spec-mockup

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Maquettes de spécifications

Cette compétence explique comment dessiner. lw-spec-write indique où va le cahier des charges et comment la page s'affiche.

Informations produit

Le dossier d'adaptation provient de la configuration. Lisez-le d'abord :

ah config get harness.adapterDir

Lisez ensuite <adapterDir>/spec-mockup/. Le projet en est propriétaire. Il nomme :

InformationExemple
Les fichiers de tokens de chaque application, dans l'ordreapps/console/src/styles/tokens.css
Les sélecteurs des valeurs claires et sombres:root, .dark
Le dossier des icônes lucidenode_modules/lucide-react/dist/esm/icons
La navigation de chaque application avec une barre latérale, et d'où elle vientla table de routes de la console
La source du texte réelle catalogue i18n de l'application

Lorsque l'adaptateur est manquant, demandez à l'utilisateur le fichier de tokens avant de dessiner. N'inventez jamais de couleur.

Le format

SVG généré, dessiné avec une seule bibliothèque : boards.py à côté de ce fichier. Chaque spécification a un script, docs/specs/assets/<date>-<sujet>-boards.py. Il importe la bibliothèque et écrit dans docs/specs/assets/<date>-<sujet>/. Ne modifiez jamais un SVG généré à la main : changez le script et exécutez-le à nouveau. Lorsque la bibliothèque manque d'un élément, ajoutez-le au module d'aide du projet à côté du script, afin que la spécification suivante en bénéficie aussi.

example.py est une planche fonctionnelle : une page sur ordinateur de bureau et sur téléphone, avec des repères et une légende. Exécutez-la pour voir la forme :

python3 .claude/skills/lw-spec-mockup/example.py <scratchpad>/mock --render

Un script de spécification commence comme ceci :

import sys
from pathlib import Path

ROOT = Path(__file__).resolve().parents[3]
sys.path.insert(0, str(ROOT / ".claude/skills/lw-spec-mockup"))
from boards import GUTTER, Board, render, tokens

t = tokens("apps/console/src/styles/tokens.css", "light")
b = Board(1440 + 2 * GUTTER, 1200, icons="node_modules/lucide-react/dist/esm/icons")
b.title("Tableau de bord : état vide")
f = b.sidebar_app(
    GUTTER,
    160,
    t["bg"],
    t["sidebar"],
    t["ink"],
    t["muted"],
    t["active"],
    ["Tableau de bord"],
    "Tableau de bord",
    "Console",
)
b.pin(f.x + f.left + 24, f.top + 30, 1)
b.legend(
    GUTTER, 1100, [(1, "L'état vide", "Aucun widget tant que le produit n'en nomme pas un.", "R1")], 1440
)
b.save("docs/specs/assets/<date>-<sujet>/desktop-empty.svg")
AppelDessine
tokens(fichiers, theme, base=, dark=, overlay=)Les valeurs --* résolues des fichiers de tokens. t["accent"]. Un token manquant déclenche une erreur. overlay est une proposition de restylage
phone(x, y, bg, ink, surface, url), desktop(x, y, bg, url)Un téléphone (web ou app), une fenêtre de navigateur
sidebar_app(x, y, ...)Une application avec une barre latérale gauche, comme une console. Copiez nav depuis la table de routes de l'application
screenshot(chemin, x, y), crop(chemin, ...)Une capture réelle de l'écran livré, ou une région de celui-ci, pour la colonne Aujourd'hui
icon(nom, x, y, taille, couleur)Un glyphe lucide depuis le dossier icons de la planche
image(chemin, ...), embed_font(famille, chemin)Un art réel et une police de marque depuis le dépôt
pin, legend, caption, column_head, row_label, titleLes notes. Une note de légende de plus de deux lignes déclenche une erreur
render(svg, png, w, h)La capture d'écran par Chrome sans tête pour la vérification ci-dessous

Fidélité

  • Les couleurs sont des tokens, via tokens(). Une valeur hexadécimale dans un script de spécification est incorrecte, sauf pour un art que le fichier de tokens ne contient pas.
  • Le texte est réel. Utilisez la chaîne du catalogue de l'application lorsqu'elle existe. Une nouvelle chaîne est courte : un libellé, une valeur, un état vide, une erreur ou une indication d'une ligne.
  • Les données sont réalistes. Utilisez des valeurs plausibles, et une valeur longue là où elle peut se produire.

Toile

SurfaceCadre
Téléphone390 x 844, marges de 48 px
Bureau1440 x 900
Plancheaussi large que ses cadres, aussi haute que ses rangées le nécessitent

Ce que dessine une spécification

  1. Aujourd'hui, puis cible. « Aujourd'hui » est une capture d'écran réelle de l'écran livré (today-*.png). « Cible » est le SVG. Placez-les côte à côte dans un tableau Markdown.
  2. Une ligne par état concerné : par défaut, vide, chargement, erreur, texte long, le contenu le plus petit et le plus grand.
  3. Repères et légende. Un repère numéroté sur chaque élément qui change. Sous le cadre, une légende numérotée : un titre en gras, deux lignes au maximum, et l'ID de spécification qu'elle sert.
  4. Une liste de composants dans la spécification à côté des planches : chaque élément, le composant qu'il réutilise, et chaque nouveau composant avec sa raison.

Noms

docs/specs/assets/<AAAA-MM-JJ>-<sujet>-boards.py
docs/specs/assets/<AAAA-MM-JJ>-<sujet>/<surface>-<état>.svg
docs/specs/assets/<AAAA-MM-JJ>-<sujet>/today-<surface>-<état>.png

La spécification nomme le nom de base de chaque fichier qu'elle contient dans assets/.

Examinez chaque planche avant de la valider

Un défaut d'une planche est invisible dans sa source et évident dans l'image. Affichez chaque planche et lisez le PNG avec l'outil de lecture. Écrivez le PNG dans le bloc-notes, pas dans docs/.

  • Aucun texte ne dépasse de son cadre, et aucun repère ne couvre une valeur.
  • Chaque chaîne dans l'interface utilisée dessinée est un libellé, une valeur, un état vide, une erreur ou une indication.
  • Pas d'art de substitution, et aucune couleur choisie à l'œil.
  • Chaque état et surface que la spécification touche a son cadre.
  • Aujourd'hui et cible sont côte à côte.

render nécessite google-chrome ou chromium dans le PATH.

Après la construction

La construction doit correspondre à la planche approuvée. Capturez l'écran construit et placez-le à côté de la planche. Une différence est un défaut de la construction, pas une raison de redessiner la planche.

Skills associés