Les équipes d'ingénierie appliquent les modèles d'architecture et les conventions de code dans Cursor en migrant du fichier monolithique historique .cursorrules vers des règles de projet modulaires (.cursor/rules/*.mdc), en segmentant les directives via le frontmatter YAML entre invariants globaux et règles ciblées par chemins de fichiers (Globs), et en synchronisant ces règles sur plusieurs dépôts à l'aide de Cursor Team Rules ou de pipelines CI/CD automatisés.
Sans gouvernance explicite, le déploiement d'un assistant de programmation IA génère rapidement une « dérive architecturale » : styles hétérogènes entre développeurs, hallucinations de paquets internes dépréciés et contournement des couches d'abstraction du domaine. Définir des règles structurées et versionnées sous Git crée un cadre déterministe pour la génération de code tout en optimisant le budget de tokens du modèle.
Les défis de gouvernance de l'IA en équipe
Lorsque Cursor est déployé sans cadre centralisé, les modèles de langage s'appuient sur des données d'entraînement génériques plutôt que sur les choix d'architecture spécifiques de l'entreprise. En pratique, plusieurs anomalies récurrentes apparaissent :
- Rupture des frontières d'architecture : L'IA propose régulièrement d'injecter des requêtes de base de données directement dans des composants d'interface ou de passer des objets HTTP bruts aux services de domaine.
- Infiltration de dépendances obsolètes : Les modèles suggèrent des utilitaires internes dépréciés (comme invoquer
@company/legacy-uiau lieu du standard@company/design-system-v2) ou introduisent des bibliothèques externes non validées. - Divergence des paradigmes de code : Au sein d'un même projet, le code généré alterne entre styles fonctionnels et orientés objet, fragmentant la gestion des erreurs et la gestion d'état.
- Fragilisation de la couverture de tests : Les générateurs omettent fréquemment les cas aux limites, mélangent les bibliothèques de mock ou ignorent l'ajout de tests unitaires lors des refactorisations.
Pour surmonter ces écueils, les architectes logiciels doivent transformer les conventions de l'équipe en instructions persistantes intégrées directement aux dépôts de code.
Évolution de l'architecture des règles Cursor : de .cursorrules au format modulaire .mdc
Historiquement, Cursor utilisait un unique fichier .cursorrules placé à la racine du dépôt. Bien que rétrocompatible, ce format monolithique oblige le système à charger l'ensemble des règles à chaque interaction, saturant la fenêtre de contexte et diluant la précision des consignes.
Le moteur actuel de Cursor s'appuie désormais sur les Règles de Projet (Project Rules) situées dans le dossier .cursor/rules/, utilisant le format .mdc (Markdown Cursor) enrichi d'un en-tête frontmatter YAML.
Structure d'un fichier .mdc
Chaque fichier .mdc combine des métadonnées de configuration avec des directives techniques concrètes :
---
description: Limites des services de domaine et modèle de dépôt (repository)
globs: src/domains/**/*.ts, src/services/**/*.ts
alwaysApply: false
---
# Règles de la couche domaine
- Les services de domaine ne doivent jamais manipuler directement d'objets de requête HTTP bruts.
- Toutes les mutations en base de données doivent obligatoirement transiter par des interfaces de repository.
Modes de déclenchement du frontmatter
L'en-tête YAML contrôle précisément comment et quand la règle est injectée dans le contexte :
| Champ YAML | Types acceptés | Comportement | Cas d'usage privilégié |
|---|---|---|---|
alwaysApply: true | Booléen | Injecté à chaque invite dans Chat, Composer et les modifications en ligne. | Invariants universels non négociables, versions de la stack de base et paquets interdits. |
globs: "chemin/**" | Chaîne ou liste Glob | Règle chargée automatiquement lorsque les fichiers ouverts ou modifiés correspondent au motif. | Directives spécifiques à une couche (React Server Components, repositories de données, routes d'API). |
description: "..." | Résumé textuel | Évalué sémantiquement par le Cursor Agent pour déterminer la pertinence en l'absence de glob. | Processus ponctuels comme les migrations de base de données, audits de sécurité ou montées de version du SDK. |
| Mention manuelle | Non applicable | Invoqué explicitement par le développeur avec @nom-de-la-regle dans le chat ou Composer. | Plans de refactorisation complexes ou listes de vérification préalables au déploiement. |
Modèles de règles éprouvés pour architectes logiciels
Une configuration d'entreprise robuste découpe les directives en plusieurs fichiers .mdc à responsabilité unique. Voici trois modèles adaptés aux applications multi-niveaux.
1. Invariants d'architecture globaux (.cursor/rules/00-core-architecture.mdc)
S'applique en continu à l'ensemble du projet pour garantir le socle technique commun.
---
description: Invariants d'architecture globaux, stack technique de base et dépendances interdites
alwaysApply: true
---
# Invariants d'architecture transversaux
## Stack technique et versions
- Environnement d'exécution : Node.js v20 LTS
- TypeScript : v5.4+ avec `strict: true` activé
- Framework : Next.js App Router (v14+)
- Gestion d'état : Zustand (interdiction formelle d'introduire Redux ou MobX)
## Dépendances et motifs interdits
- INTERDIT : `axios` (utiliser le client natif `fetch` encapsulé dans `@lib/api-client`)
- INTERDIT : `@company/ui-core-v1` (déprécié ; utiliser `@company/design-system-v2`)
- INTERDIT : `moment.js` (utiliser exclusivement `date-fns`)
## Standards de qualité de code
- Aucun usage de `any` explicite. Utiliser `unknown` combiné avec des prédicats de types (type guards).
- Privilégier les retours anticipés (guard clauses) ; éviter les blocs `if/else` imbriqués sur plus de deux niveaux.
- Ne jamais coder en dur des identifiants, jetons d'accès ou clés d'API dans les fichiers sources.
2. Couche de domaine et Clean Architecture (.cursor/rules/backend-services.mdc)
Chargé dynamiquement uniquement lorsque le développeur travaille sur la logique métier du backend.
---
description: Architecture hexagonale et modèle de repository dans les services backend
globs: src/services/**/*.ts, src/domains/**/*.ts
alwaysApply: false
---
# Standards de la couche domaine backend
## Répartition des responsabilités
- Les contrôleurs assurent la sérialisation HTTP, la validation des paramètres et les codes de statut.
- Les services exécutent la logique métier pure. Ne jamais transmettre d'objets `req` ou `res` d'Express/Fastify aux services.
- Les repositories encapsulent la persistance. Les services doivent dépendre d'interfaces abstraites, et non d'instances directes d'ORM.
## Exemples comparatifs
```typescript
// ✅ CORRECT : Le service dépend d'une interface abstraite et manipule des entités de domaine
export class OrderService {
constructor(private readonly orderRepository: OrderRepositoryPort) {}
async processOrder(orderId: string): Promise<Result<Order>> {
const order = await this.orderRepository.findById(orderId);
if (!order) return Result.fail('Order not found');
order.markPaid();
await this.orderRepository.save(order);
return Result.ok(order);
}
}
// ❌ INTERDIT : Appels directs à l'ORM et requêtes SQL brutes dans la logique métier
export class OrderService {
async processOrder(orderId: string) {
await prisma.orders.update({ where: { id: orderId }, data: { status: 'PAID' } });
}
}
### 3. Standards pour tests automatisés (`.cursor/rules/testing-standards.mdc`)
Encadre la génération de tests IA selon les frameworks et pratiques de validation retenus.
```markdown
---
description: Standards de rédaction des tests unitaires et d'intégration
globs: **/*.test.ts, **/*.spec.ts, src/tests/**/*
alwaysApply: false
---
# Standards de tests automatisés
## Stack de test
- Exécuteur de tests : Vitest
- Outil de simulation : `vi.mock()` (ne pas importer de modules Jest)
- Assertions : `expect()` avec matchers explicites
## Organisation des tests
- Structurer chaque test selon le modèle Arrange-Act-Assert (Préparer-Agir-Vérifier).
- Placer les tests unitaires dans le même dossier que le fichier source : `feature.service.ts` et `feature.service.test.ts`.
- Simuler systématiquement les accès réseau et bases de données dans les tests unitaires.
- Inclure systématiquement les cas d'erreur aux limites (paramètres manquants, permissions refusées et exceptions).
Déploiement à grande échelle : approches Monorepo et Polyrepo
Garantir la cohérence des règles à travers des dizaines ou centaines de dépôts requiert une stratégie adaptée à la structure du code.
Gouvernance globale des règles
│
┌───────────────────────────────┴───────────────────────────────┐
▼ ▼
Stratégie Monorepo Stratégie Polyrepo
├── .cursor/rules/00-core.mdc ├── Dépôt central : org-cursor-rules
├── .cursor/rules/apps-web.mdc (Glob: apps/web/**) ├── Validation et synchronisation CI/CD
└── .cursor/rules/shared-ui.mdc (Glob: packages/**) └── Cursor Team Rules (Console d'administration)
Stratégie A : Cloisonnement hiérarchique en Monorepo
Dans un monorepo orchestré avec Turborepo, Nx ou pnpm workspaces, l'intégralité des règles se situe dans .cursor/rules/, mais s'isole via des motifs globs :
globs: ["apps/web/**/*"]: Règles Next.js pour le frontend, isolation des composants et utilitaires Tailwind.globs: ["apps/api/**/*"]: Contrats OpenAPI, migrations de schéma et architecture backend.globs: ["packages/ui/**/*"]: Rétrocompatibilité, exigences d'accessibilité (ARIA) et absence de dépendances lourdes.- Résultat : L'édition d'une interface utilisateur ne charge pas les règles de base de données, préservant la précision du contexte IA.
Stratégie B : Synchronisation en Polyrepo via CI/CD (Rules as Code)
Pour les organisations gérant de multiples microservices dans des dépôts distincts, les règles doivent être gérées comme des bibliothèques partagées versionnées :
- Dépôt central de gouvernance : Créer un dépôt Git dédié (par exemple
github.com/org/cursor-rules-standards) contenant les fichiers.mdcofficiels avec tags de version sémantique (v1.2.0). - Contrôle de dérive en CI : Ajouter une étape dans le pipeline CI de chaque projet qui vérifie que les fichiers
.cursor/rules/locaux correspondent à la dernière version validée. - Flux de mise à jour automatisé : Exécuter un workflow GitHub Actions ou GitLab CI pour créer automatiquement une Pull Request dès qu'une nouvelle version des règles est publiée.
Stratégie C : Distribution centralisée via Cursor Team Rules
Les entreprises disposant de licences Cursor Team ou Enterprise peuvent utiliser la gouvernance native dans le cloud :
- Déploiement depuis la console : Les administrateurs saisissent les règles globales dans l'interface de gestion, qui se propagent instantanément à tous les membres connectés.
- Règles obligatoires vs optionnelles : Les exigences critiques (sécurité, licences, stack socle) peuvent être configurées en mode « Enforced », empêchant toute désactivation locale par les développeurs.
- Prise en charge immédiate : Tout nouveau projet cloné ou tout nouvel arrivant hérite automatiquement des directives de l'entreprise sans manipulation manuelle.
Bonnes pratiques et pièges à éviter
| Objectif | Pratique recommandée | Erreur à éviter |
|---|---|---|
| Optimisation des tokens | Maintenir chaque fichier .mdc sous 400 lignes ; utiliser globs et sélecteurs sémantiques. | Déclarer alwaysApply: true sur toutes les règles, saturant inutilement le contexte. |
| Précision des consignes | Fournir des extraits de code comparant explicitement ✅ CORRECT et ❌ INTERDIT. | Se contenter de directives vagues telles que « Écrire un code modulaire et propre ». |
| Ancrage dans le code existant | Pointer vers des fichiers de référence réels avec la notation @chemin/fichier.ts. | Copier-coller de volumineux blocs de code source directement dans les règles Markdown. |
| Défense en profondeur | Utiliser les règles Cursor pour guider la génération tout en conservant les linters (ESLint, Biome) en CI. | Compter uniquement sur l'IA pour garantir la conformité et désactiver les contrôles statiques. |
| Cycle de vie des règles | Mettre à jour les fichiers .mdc dans la même Pull Request que les évolutions de bibliothèques. | Laisser les règles vieillir après des refactorisations, incitant l'IA à reproduire d'anciens modèles. |
En articulant les règles Cursor autour de fichiers .mdc modulaires ciblés par chemins et synchronisés via Git ou Cursor Team Rules, les équipes d'ingénierie maximisent l'efficacité du développement assisté par IA tout en maintenant une rigueur architecturale sans compromis sur l'ensemble de leurs dépôts.