La version à fichier unique, et ses points de rupture
Le conseil de départ est pertinent. Cursor lit les fichiers .cursor/rules/*.mdc, chacun possédant un frontmatter qui contrôle son chargement : alwaysApply pour les règles toujours présentes dans le contexte, globs pour les règles qui s'activent lorsque des fichiers correspondants sont utilisés. Un seul fichier design.mdc avec alwaysApply: true permet déjà d'aller loin.
Ensuite, trois choses se produisent, dans cet ordre.
- 1
Le fichier s'allonge
Chaque fois que l'agent commet une erreur, quelqu'un ajoute une ligne. Au bout de six mois, on se retrouve avec quatre cents lignes couvrant les couleurs, la typographie, l'espacement, l'animation, l'accessibilité, les modèles de formulaires, les états vides et un paragraphe sur le ton employé. Le fichier est toujours dans le contexte, il concurrence la tâche actuelle pour attirer l'attention, et le respect de chaque ligne individuelle s'effondre.
- 2
Les règles commencent à se contredire
« Utilisez un espacement généreux » a été écrit pour le site marketing. « Gardez les tableaux denses » a été écrit pour le tableau de bord. Les deux sont dans le même fichier actif en permanence, donc les deux sont vrais partout, et donc aucun n'est plus une règle.
- 3
Quelqu'un limite la portée pour corriger cela, et la règle cesse de s'appliquer
La correction évidente est
globs: components/**. Mais quand l'agent écrit une nouvelle mise en page de page dansapp/, aucune règle de design ne s'active et le résultat est générique. Les nouvelles mises en page sont précisément là où les directives de design sont les plus cruciales, et c'est précisément ce qu'un glob de composants ignore.
La troisième étape est l'erreur auto-infligée la plus courante dans les configurations Cursor. Une règle de design qui ne s'applique qu'aux fichiers de composants est inactive lors de la création de pages, alors que c'est là que se prennent les décisions de composition, de hiérarchie et d'espacement.
Segmentez selon la condition de vérité, pas selon le sujet
L'instinct est de segmenter par sujet : colors.mdc, typography.mdc, spacing.mdc. C'est le mauvais axe. Ces trois éléments sont tous vrais en même temps ; les séparer ne change rien, si ce n'est le nombre de fichiers à maintenir.
Segmentez plutôt par portée de vérité. La question pour chaque règle est : quand est-ce que ceci est faux ? Si la réponse est « jamais », cela appartient au fichier actif en permanence. Si la réponse est « dans le tableau de bord », cela appartient à une règle limitée, et son opposé appartient à une autre.
| Segmentation par sujet | Segmentation par portée de vérité | |
|---|---|---|
| Fichiers | couleurs, typographie, espacement, mouvement | design (toujours), surfaces marketing, surfaces denses |
| Moment du chargement | Tout à la fois — ils partagent la même portée | Uniquement là où ils s'appliquent |
| Contradictions | Toujours dans le même contexte, mais s'annulent mutuellement | Jamais co-présents, permettant ainsi à chacun d'être absolu |
| Poids permanent | Tout, tout le temps | Uniquement les non-négociables |
C'est la même structure que celle adoptée indépendamment par les grands design systems — Encore de Spotify est une fondation avec des sous-systèmes spécialisés au-dessus, Carbon est un noyau avec des couches par domaine. Un répertoire de règles est une version miniature de ce même concept, et il échoue de la même manière lorsque la fondation absorbe des éléments qui devraient rester locaux.
Ce qui doit figurer dans la règle permanente
Limitez-vous à un seul écran. Son rôle n'est pas de contenir le design system — le design system réside dans DESIGN.md et dans votre fichier de tokens. Son rôle est de forcer l'agent à lire ces fichiers, et de détenir la poignée de contraintes qui ne doivent jamais être violées, peu importe où.
---
description: Design system policy for all UI work
alwaysApply: true
---
Before writing or editing any UI, read DESIGN.md at the repo root.
## Non-negotiable
- Never write a literal colour value. No hex, no rgb(), no named
CSS colours. Use the semantic tokens in DESIGN.md.
- Never introduce a font family that is not in DESIGN.md.
- Every spacing value comes from the scale. Any other value is a bug.
- Every interactive element has a visible focus state.
- Anything with a light-mode colour has a dark-mode counterpart.
## When unsure
Match the nearest existing component in this repo rather than
inventing a new pattern. If no similar component exists, say so
before writing one.Chaque ligne est une contrainte qui peut être vérifiée et violée. Aucune d'entre elles ne décrit une esthétique. C'est délibéré, et c'est la différence majeure entre un fichier de règles qui modifie le rendu et un qui ne le fait pas.
La dernière section est sous-estimée. « Associez le composant existant le plus proche, et si aucun n'existe, précisez-le avant d'en créer un » transforme l'échec le plus courant de l'agent — l'invention silencieuse d'un nouveau pattern — en une question. Ce seul paragraphe prévient plus de dérives qu'une page entière de description visuelle.
Pourquoi les interdictions, précisément
Nous avons échantillonné 299 fichiers DESIGN.md publics — le même type d'artefact qu'un fichier de règles de design, écrit dans le même but — et nous avons mesuré ce qu'ils contiennent réellement plutôt que ce qu'ils prétendent contenir.
| Part des fichiers | |
|---|---|
| Aucune interdiction d'aucune sorte | 76% |
| Couleurs en hex brut, sans rôle sémantique | 86% |
| Aucune définition du mode sombre | 69% |
| Aucun motif distinctif | 57% |
| Au moins un adjectif vague qui fait le travail | 54% |
| Aucune valeur de taille concrète nulle part | 44% |
Le chiffre des interdictions est le plus important. Les trois quarts de ces fichiers ne disent au modèle que ce qui est permis, ce qui laisse tout le reste autorisé par défaut — et tout le reste constitue la majeure partie d'une interface.
Considérez la différence concrètement. « Utilisez --color-primary pour les actions primaires » est respecté par une page qui utilise également la couleur primaire pour les titres, les liens, le remplissage des icônes, une bordure et un dégradé. Ajoutez « n'utilisez jamais l'accent pour le texte, les bordures, les arrière-plans ou les dégradés » et la même phrase produit désormais une interface sobre. La permission n'a pas changé. L'interdiction a fait tout le travail.
Une règle qui ne dit que ce qui est autorisé laisse tout le reste autorisé. Et tout le reste constitue la majeure partie de l'interface.
Le chiffre des adjectifs vagues aggrave la situation. « Clean » apparaît dans 39 % de ces fichiers et « modern » dans 36 %. Un modèle à qui l'on demande d'être « clean and modern » produit le centre statistique de ses données d'entraînement, ce qui est précisément la raison pour laquelle les interfaces générées par IA convergent vers le même aspect. Aucun de ces deux mots n'exclut quoi que ce soit.
Les règles ciblées
Une fois que la règle permanente ne contient plus que les universels, les règles spécifiques à la surface peuvent être absolues plutôt que nuancées. Deux exemples illustrant la structure :
---
description: Marketing and landing surfaces
globs: app/(marketing)/**, app/page.tsx, components/marketing/**
---
Spacing runs one step above the app scale. Sections breathe.
Display type (48px+) is allowed here and nowhere else.
Cards may use shadow elevation.
One primary call to action per section. Never two competing buttons.---
description: Dense application surfaces — tables, dashboards, settings
globs: app/(app)/**, components/table/**, components/dashboard/**
---
Compact spacing: controls 8-12px padding, table rows 32px.
Elevation is a surface step plus a 1px border. Never a shadow.
Type stays at body scale and below. No display type.
Status colours (success, warning, danger) are reserved for status.
Nothing decorative uses them.Aucune de ces deux règles ne contient de réserve, car aucune des deux n'est jamais en contexte avec l'autre. C'est tout l'avantage de la séparation.
Vérifiez vos globs par rapport à la réalité avant de leur faire confiance. Les groupes de routes, les préfixes src/ et les répertoires de composants colocalisés brisent tous les patterns naïfs, et un glob qui ne correspond à rien échoue silencieusement — vous obtenez un résultat générique sans aucune indication de la cause. Ouvrez un fichier dans la surface concernée et confirmez que la règle s'applique.
Ce que les règles ne doivent pas contenir
Trois éléments sont placés dans les fichiers de règles alors qu'ils appartiennent ailleurs, et chacun a un coût.
| Pourquoi cela échoue ici | Où cela devrait être | |
|---|---|---|
| La liste complète des tokens | Duplique le fichier de tokens. Les deux divergent, et l'agent se retrouve avec deux sources contradictoires | Votre fichier CSS ou de thème, référencé depuis DESIGN.md |
| Documentation de l'API des composants | Trop volumineux pour un contexte permanent et obsolète dès la version suivante | Un serveur MCP, interrogé à la demande |
| Description esthétique | "Sophistiqué, minimal, premium" ne contraint rien et consomme du contexte | Nulle part. Remplacez cela par les contraintes qui produisent cette impression |
Le problème de duplication de la première ligne mérite d'être approfondi. Dès qu'une valeur hexadécimale apparaît à la fois dans le fichier de règles et dans le fichier de tokens, l'un sera mis à jour et l'autre non, et l'agent utilisera avec assurance la version obsolète. Les règles doivent pointer vers la source de vérité, jamais la reformuler.
La couche sous les règles
Tout ce qui précède suppose qu'il y a quelque chose qui mérite d'être référencé. Un fichier de règles qui dit "lire DESIGN.md" n'est utile que si DESIGN.md l'est, et les données du corpus montrent que la plupart de ces fichiers ne sont qu'une palette accompagnée d'adjectifs.
Ce qui fait la différence est systématiquement la même liste : des couleurs définies comme des rôles sémantiques plutôt que des valeurs hexadécimales, une échelle typographique avec des valeurs réelles, une échelle d'espacement, un mode sombre défini plutôt que dérivé, des motifs qui précisent le comportement du design, et une liste explicite de ce qui est interdit. Une fois ces éléments consignés, le fichier de règles devient court, car il ne sert plus que de pointeur.
Les kits de design Identity Forge proposent exactement cette structure et se sérialisent en un fichier DESIGN.md. Installez-en un dans un projet Cursor avec npx --yes identityforge@latest install --client cursor, ou parcourez les kits au préalable. Le guide du design system pour Cursor explique comment configurer le serveur MCP associé.
Un ensemble opérationnel
Pour la plupart des projets, quatre fichiers sont le nombre idéal ; au-delà, c'est un signal d'alerte :
design.mdc—alwaysApply: true. Un seul écran. Pointe versDESIGN.md, contient les interdictions universelles et demande à l'agent de consulter avant d'inventer un pattern.surface-marketing.mdc— portée glob. Les règles qui ne s'appliquent que là où le lecteur scanne le contenu en quelques secondes.surface-app.mdc— portée glob. Les règles qui ne s'appliquent que là où l'utilisateur passe toute sa journée.a11y.mdc—alwaysApply: truesi votre équipe a besoin d'une mention séparée. États de focus, contrastes minimums, éléments sémantiques, exigences d'étiquetage.
Si vous ressentez le besoin d'un cinquième fichier, vérifiez s'il s'agit réellement d'un nouveau périmètre de vérité ou d'un sujet qui appartient à un fichier existant. Les sujets se multiplient à l'infini ; les périmètres, non.
Où se trouvent les règles Cursor ?
Dans .cursor/rules/ sous forme de fichiers .mdc, chacun avec un frontmatter contrôlant son chargement. alwaysApply: true maintient une règle en contexte pour chaque requête ; globs attache une règle lorsque des fichiers correspondants sont impliqués. Une règle de design devant s'appliquer lors de la création de pages doit être permanente, et non limitée aux composants via un glob.
Mon design system doit-il se trouver dans une règle Cursor ou dans DESIGN.md ?
Dans DESIGN.md, avec une règle qui pointe vers lui. Maintenir le système dans un fichier versionnable et agnostique permet à la même définition de servir Cursor, Claude Code, un serveur MCP et tout humain lisant le repo. Dupliquer les valeurs des tokens dans le fichier de règles garantit que les deux copies divergeront.
Quelle longueur doit avoir une règle de design Cursor ?
Une règle permanente doit tenir sur un seul écran. Au-delà, elle concurrence la tâche réelle pour l'attention du modèle, et le respect de chaque ligne diminue. Si elle s'allonge, c'est le signal qu'il faut déplacer le contenu vers DESIGN.md ou vers une règle spécifique, et non continuer à ajouter du texte.
Pourquoi l'agent ignore-t-il mes règles de design ?
Trois causes habituelles : la règle a une portée glob et ne s'active pas (vérifiez les chemins de fichiers réels), la règle décrit une esthétique plutôt que d'énoncer des contraintes pouvant être transgressées, ou le fichier permanent est devenu si volumineux qu'aucune ligne ne se démarque. Les interdictions dans un fichier court sont suivies bien plus fidèlement que les descriptions dans un fichier long.
Puis-je utiliser .cursorrules à la place ?
L'approche par fichier unique .cursorrules fonctionne toujours, mais elle ne permet pas de chargement conditionnel : chaque règle est donc toujours active, et le problème des contradictions survient plus rapidement. Le répertoire .cursor/rules/ existe précisément pour permettre l'application de différentes règles à différents endroits, ce qui est la structure dont un design system a besoin.