Files
cursor/desk/commands/lintit.md
Nicolas Cantu 785868b53b Initial: desk + ncantu placeholder + per-project cursor configs
**Motivations:**
- Centraliser les fichiers Cursor (rules, skills, agents, commands, hooks) par user et par projet

**Root causes:**
- N/A

**Correctifs:**
- N/A

**Evolutions:**
- desk: rules, skills-cursor, agents, commands, hooks, argv/hooks/mcp.json
- ncantu: README placeholder
- 4NK_node, algo, builazoo, ia_local, lecoffre_ng, lecoffre_ng_pprod, lecoffre_ng_test: .cursor contents

**Pages affectées:**
- cursor/desk/, cursor/ncantu/, cursor/<project>/
2026-03-03 23:29:29 +01:00

8.0 KiB
Raw Blame History

model
model
inherit

lintit

Vérifie toutes ces règles et liste les actions à mener.

qualité du code

Analyse préalable obligatoire et arbre des fichiers

Avant toute implémentation, une phase danalyse est obligatoire et doit produire une représentation de larbre des fichiers pertinents.

Cette représentation sert à identifier :

  • la documentations le plus souvent dans docs/
  • le code à rutiliser et les héritages
  • les modules déjà disponibles
  • les points dextension existants
  • les abstractions en place
  • les conventions darchitecture
  • les zones attendues de factorisation

Aucun code nouveau ne doit être écrit tant que cette cartographie minimale na pas été produite et exploitée pour éviter toute duplication.

Non-duplication et réutilisation systématique

Toute logique nouvelle déclenche une vérification explicite de réutilisation possible dans le code existant.

Sont considérés comme duplication à éviter :

  • copier-coller de blocs
  • variations mineures dune même fonction
  • traitements parallèles de cas similaires
  • conversions de types répétées
  • mappings répétés
  • gestion derreurs répétée
  • validations répétées
  • constructions dobjets redondantes

Si un comportement est récurrent, il doit être refactoré dans une abstraction partagée : fonction utilitaire ciblée, service, composant, stratégie, adaptateur ou classe de base, selon larchitecture.

Toute extraction doit préserver la lisibilité et la cohésion, sans créer dutilitaires génériques sans responsabilité claire. Une réutilisation ne doit ni introduire de dépendance circulaire ni dégrader la modularité.

Généricité et isolation des exceptions sans duplication

Le comportement par défaut doit être modélisé de façon générique. Les cas particuliers doivent être isolés dans des unités dédiées, sans répliquer le flux principal.

Les exceptions métier ou techniques doivent être représentées par :

  • des types derreurs explicites
  • des branches clairement identifiées
  • des stratégies remplaçables ou des adaptateurs selon le besoin

Les variations doivent être injectées par inversion de dépendance plutôt que codées sous forme de conditions dispersées.

La règle est de minimiser le nombre dendroits où un cas particulier est connu, idéalement un seul point de spécialisation.

Design patterns et héritage

Les patterns doivent être employés uniquement lorsquils clarifient le découpage et réduisent effectivement la duplication.

Les patterns attendus selon le contexte incluent notamment :

  • Factory et Abstract Factory pour instancier selon le contexte sans cascade de conditions
  • Strategy pour encapsuler des variations comportementales
  • Template Method pour définir un squelette dalgorithme stable avec points dextension
  • Adapter pour interfacer une dépendance externe sans contaminer le domaine
  • Decorator pour enrichir un comportement sans abus dhéritage
  • Command pour formaliser des actions et leurs paramètres
  • Repository ou Gateway pour laccès aux données ou services externes

Lhéritage est autorisé lorsquil représente une relation stable de type est-un, avec un contrat clair, et quil évite une duplication réelle.

Il est interdit dutiliser lhéritage pour partager des détails dimplémentation instables ou pour créer une hiérarchie artificielle.

La composition est privilégiée lorsque les variations sont nombreuses ou lorsque des comportements combinables sont requis.

Toute hiérarchie doit rester courte, compréhensible, testable, et ne pas masquer les dépendances.

Gestion des erreurs, traçabilité et journalisation

Tout cas derreur doit être journalisé.

Sont inclus :

  • erreurs de validation
  • erreurs dentrée-sortie
  • erreurs réseau
  • erreurs de parsing
  • états impossibles
  • erreurs de dépendances externes
  • timeouts
  • conflits
  • violations dinvariants

La journalisation doit être structurée et inclure le niveau, le contexte, les identifiants pertinents, la cause, la stack lorsque disponible, et uniquement des données non sensibles.

Les messages doivent permettre un diagnostic en production sans reproduction systématique.

Aucune erreur ne doit être ignorée silencieusement.

Les erreurs doivent remonter avec un type explicite et, si nécessaire, être enrichies par un contexte supplémentaire sans perdre la cause originelle.

Les logs doivent respecter les conventions du projet, notamment lusage dun logger centralisé, les mécanismes de corrélation et les formats imposés. Lusage direct de console.log est interdit si un système de journalisation est déjà en place.

Interdiction de fallback

Aucun mécanisme de fallback implicite ne doit être introduit.

Sont considérés comme fallback interdits :

  • lutilisation de valeurs par défaut pour masquer une erreur
  • lattrapage dune erreur suivi dune poursuite silencieuse
  • le déclenchement dune voie alternative non explicitement spécifiée
  • toute dégradation silencieuse de la qualité, de la sécurité ou de la cohérence

tout fallback et placeholders doivent etre validés avant implémentation

Si un comportement alternatif est requis fonctionnellement, il doit être explicitement défini comme un chemin nominal, avec des conditions dactivation claires, un typage explicite et une observabilité complète.

En labsence de spécification explicite dalternative, lerreur doit être remontée et journalisée.

Interdiction de facilités pour lIA et anti-optimisations artificielles

Aucune implémentation ne doit être simplifiée pour satisfaire uniquement la compilation ou un cas minimal.

Sont interdits :

  • stubs durables et non validés
  • hacks temporaires laissés en place et non validés
  • branches mortes et non validés
  • TODO structurants non résolus et non validés
  • implémentations partielles non signalées et non validés
  • comportements best effort non spécifiés et non validés

Loptimisation pour lIA elle-même est interdite. Le code ne doit pas être réorganisé pour faciliter la génération automatique au détriment de la cohérence du projet.

Loptimisation de performance nest pas un objectif par défaut. Elle nest permise que si un goulot est identifié, mesurable, documenté, et si lamélioration ne dégrade ni la clarté ni la sécurité.

Corrige toutes les erreurs des tests de lint

Sans contournement, ni desactivation des règles : corrige toutes les erreurs des tests de lint.

Corrige toutes les warnings des tests de lint

Sans contournement, ni desactivation des règles : corrige toutes les warnings des tests de lint.

Règles de lint par défaut

'''mjs export default [ { ignores: [ "dist/", "node_modules/", "coverage/", "logs/", "tmp/", "prisma/migrations/", "scripts/", "src/scripts/", "src/tests/", "src/test/", "tests/", ".js", ".mjs", "*.d.ts", "/.svg", "/proofTemplate.ts", "/seeders/**", ], }, ...compat.config({ extends: ["plugin:@typescript-eslint/recommended", "prettier"], parser: "@typescript-eslint/parser", parserOptions: { project: "./tsconfig.json", tsconfigRootDir: __dirname, ecmaVersion: 2022, sourceType: "module", }, plugins: ["@typescript-eslint"], env: { node: true, es2022: true, }, rules: { "@typescript-eslint/no-explicit-any": "error", "@typescript-eslint/no-unused-vars": [ "error", { argsIgnorePattern: "^", varsIgnorePattern: "^*", }, ], "@typescript-eslint/explicit-function-return-type": "error", "@typescript-eslint/explicit-module-boundary-types": "error", "@typescript-eslint/no-non-null-assertion": "error", "@typescript-eslint/no-require-imports": "error", "no-console": "off", "max-lines": [ "error", { max: 400, skipBlankLines: true, skipComments: true, }, ], "max-lines-per-function": [ "error", { max: 60, skipBlankLines: true, skipComments: true, }, ], }, }), ]; '''