frontend — des écrans qui fonctionnent pour chaque utilisateur, chaque état, et restent faciles à modifier
Suivez d'abord le CLAUDE.md du dépôt, docs/conventions.md et docs/design-system.md ; cette compétence comble les lacunes et ne les remplace jamais. Le travail visuel (tokens, mise en page, couleur, CSS) relève de css-design ; lancer l'application comme le fera l'utilisateur et le verdict final relèvent de verify-app.
Choisir la pile. Vue 3 et React sont tous deux de première classe et suivent les mêmes règles. Utilisez le framework que le dépôt utilise déjà ; pour une nouvelle application, utilisez le frontend par défaut du profil de livraison (voir le README du dépôt), sinon demandez une fois lors du tri. Vue : TypeScript + Vite (npm create vue@latest -- --ts --router --pinia --vitest --playwright --eslint --prettier) avec references/vue-patterns.md. React : TypeScript + Vite (ou le méta-framework du dépôt) avec references/react-patterns.md. Ne mélangez jamais les frameworks dans une même application. Besoin de SSR ou SSG pour le SEO ? Enregistrez Nuxt ou Next.js dans un ADR (architect) ; cette compétence couvre de toute façon les parties client.
Workflow
- Charger les conventions et l'inventaire du dépôt. Lisez
CLAUDE.md,docs/conventions.md,docs/design-system.md; listez les parties réutilisables (ls src/components src/features src/composables src/hooks src/stores). Détectez la couche de données, le routeur, les bibliothèques de formulaires et d'i18n (Vue :grep -E '"(@tanstack/vue-query|pinia|vue-router|vee-validate|vue-i18n)"' package.json; React :grep -E '"(@tanstack/react-query|@tanstack/react-router|react-router|react-hook-form|i18next|react-intl)"' package.json). N'ajoutez jamais une deuxième couche de données, routeur, store, formulaire ou bibliothèque d'i18n. Preuve : les notes de l'histoire listent les composants et composables/hooks réutilisés et tout nouveau, avec la raison. - Écrire le tableau d'état avant le code. Pour chaque vue : chaque donnée et où elle vit — serveur (query), URL (paramètres de route / recherche), client partagé (store Pinia, ou contexte React ou store du dépôt), local (
ref/useState), dérivée (computed/ une const dans le rendu), externe (un composable ouuseSyncExternalStoreencapsulant l'API du navigateur). Listez ensuite les quatre états (chargement, vide, erreur, succès) et les clés de copie pour chacun. Preuve : le tableau dans l'histoire. - Écrire d'abord les tests qui échouent. Vitest +
@testing-library/vueou@testing-library/react,userEvent.setup(), requêtes par rôle et nom accessible, un comportement par test, réseau simulé à la limite du service (MSW ou le client factice du dépôt danssrc/test-utils). Couvrez chaque état, le chemin clavier et un cas négatif. Preuve : l'exécution montre du rouge pour la bonne raison. - Construire dans le dossier de fonctionnalité.
src/features/<name>/services(appels API typés, pas de framework) →composables/hooks(useXencapsulantuseQuery/useMutationet une fabrique de clés) →components(Name.vueavec `<script setup lang=