agentleFS
VincwebVincweb/caudron-plugin/skills/clean-code-audit/SKILL.md

clean-code-audit

Skill0 starsChanged 3 months agoMITView on GitHub

Audite la qualité du code TypeScript contre les standards de clean code Caudron — nommage, taille des fonctions, gestion d'erreurs, typage strict (any, enums, assertions), commentaires, code smells. Utiliser quand on demande un audit de clean code, une revue de qualité, ou une chasse à la dette technique.

The file

Files
SKILL.md

Skill: Clean Code Audit

Analyse le code source pour détecter les écarts avec les standards de clean code documentés.

Objectif

Comparer l'implémentation réelle du codebase avec les règles définies dans ${CLAUDE_PLUGIN_ROOT}/blueprints/clean-code/ et identifier les violations.

Prérequis

Lire les blueprints de référence embarqués dans le plugin :

  • ${CLAUDE_PLUGIN_ROOT}/blueprints/clean-code/naming.md
  • ${CLAUDE_PLUGIN_ROOT}/blueprints/clean-code/functions.md
  • ${CLAUDE_PLUGIN_ROOT}/blueprints/clean-code/error-handling.md
  • ${CLAUDE_PLUGIN_ROOT}/blueprints/clean-code/typescript.md
  • ${CLAUDE_PLUGIN_ROOT}/blueprints/clean-code/comments.md
  • ${CLAUDE_PLUGIN_ROOT}/blueprints/clean-code/principles.md
  • ${CLAUDE_PLUGIN_ROOT}/blueprints/clean-code/code-smells.md

Les chemins de code audités (src/, netlify/) sont relatifs à la racine du projet analysé.

Exécution

Sur un projet de taille non triviale, déléguer à l'agent clean-code-auditor (read-only) plutôt que de tout lire soi-même. Il peut tourner en parallèle de architecture-auditor et design-auditor si un audit complet est demandé.

Règles d'Audit

Nommage (NM-*)

IDRègleSévéritéPattern de Détection
NM-001Noms descriptifs, pas d'abréviationsMEDIUMChercher variables 1-2 lettres (hors i, x, y, err, e) dans src/, netlify/
NM-002Vocabulaire cohérent (get/create/update/delete)LOWChercher mélange fetch/retrieve/load vs get dans les hooks et services
NM-003Booléens avec préfixe is/has/can/shouldMEDIUMChercher const [a-z]+ assigné à un booléen sans préfixe is/has/can/should/was
NM-004Handlers handle*, callbacks on*LOWChercher handlers nommés autrement que handle* dans les composants
NM-005Fichiers nommés comme leur exportMEDIUMComparer nom fichier vs export principal dans src/components/, src/hooks/
NM-006Pas de fichiers génériques (utils.ts, helpers.ts)MEDIUMChercher fichiers nommés utils.ts, helpers.ts, misc.ts, common.ts
NM-007Types/interfaces PascalCase sans préfixe I/TLOWChercher interface I[A-Z] ou type T[A-Z]
NM-008Pas d'enum, utiliser as constMEDIUMChercher enum dans les fichiers TS

Fonctions (FN-*)

IDRègleSévéritéPattern de Détection
FN-001Fonctions courtes (max ~30 lignes)MEDIUMCompter les lignes des fonctions dans src/, netlify/
FN-002Max 3 paramètresMEDIUMChercher fonctions avec 4+ paramètres (hors objet d'options)
FN-003Pas de paramètres booléensLOWChercher (param: boolean) dans les signatures de fonctions
FN-004Retours anticipés, pas d'imbrication profondeHIGHChercher 4+ niveaux d'imbrication (if dans if dans if dans if)
FN-005Pas d'effets de bord dans les fonctions puresMEDIUMChercher mutation de variables externes dans des fonctions de calcul
FN-006Pas de patterns async mélangésLOWChercher .then( dans des fonctions async
FN-007Préférer les patterns fonctionnelsLOWChercher boucles for qui pourraient être map/filter/reduce

Gestion d'erreurs (EH-*)

IDRègleSévéritéPattern de Détection
EH-001Pas d'erreurs avalées silencieusementHIGHChercher catch avec bloc vide ou seul console.log
EH-002Pas d'exceptions pour le flux de contrôleMEDIUMChercher try/catch autour d'opérations non-async simples
EH-003Validation aux frontières seulementMEDIUMChercher validation manuelle (if (!param) throw) hors handlers
EH-004Logging structuré avec contexteLOWChercher logger.error avec seulement un string (pas d'objet contexte)
EH-005Error boundaries dans les pagesMEDIUMVérifier gestion de error et isLoading dans les composants qui fetch
EH-006Nettoyage dans finallyLOWChercher try avec opérations de ressource sans finally

TypeScript (TS-*)

IDRègleSévéritéPattern de Détection
TS-001Pas de anyHIGHChercher : any, as any, <any>
TS-002Pas d'enums, utiliser as constMEDIUMChercher enum
TS-003Pas d'annotations redondantesLOWChercher const x: string = '...', const x: number = 0, const x: boolean = true/false
TS-004Unions discriminées pour les étatsMEDIUMChercher interfaces avec data? + error? + isLoading (devrait être union)
TS-005Pas d'assertion non-null (!) hors testsHIGHChercher ! non-null assertion hors **/*.test.* et **/*.spec.*
TS-006Pas d'assertions as — préférer validationMEDIUMChercher as [A-Z] (hors as const, as unknown)
TS-007Utiliser readonly pour les configsLOWChercher interfaces de config sans readonly

Commentaires (CM-*)

IDRègleSévéritéPattern de Détection
CM-001Pas de commentaires "what"LOWChercher commentaires qui décrivent ce que fait le code (heuristique)
CM-002Pas de code commentéMEDIUMChercher blocs de code commentés (// const, // function, // if, // return)
CM-003TODO avec contexteLOWChercher // TODO sans référence de ticket ou explication
CM-004Pas de JSDoc redondant sur fonctions internesLOWChercher /** @param sur fonctions non exportées ou internes

Principes (PR-*)

IDRègleSévéritéPattern de Détection
PR-001Pas de God files (max ~200 lignes par fichier)MEDIUMCompter les lignes des fichiers dans src/, netlify/
PR-002Pas de duplication de logique métier frontend/backendHIGHChercher schémas Zod ou validation dupliqués entre src/ et netlify/
PR-003Immutabilité — pas de mutation des entréesMEDIUMChercher param.prop = ou .push( sur des paramètres de fonction

Code smells (CS-*)

IDRègleSévéritéPattern de Détection
CS-001Pas d'imbrication 4+ niveauxHIGHCompter les niveaux d'indentation dans les fonctions
CS-002Pas de nombres/chaînes magiquesMEDIUMChercher des littéraux numériques (hors 0, 1, -1) dans les conditions
CS-003Pas de prop drilling 3+ niveauxMEDIUMChercher même prop passée sur 3+ composants imbriqués
CS-004Composants max ~150 lignesMEDIUMCompter les lignes des composants React
CS-005Requêtes Drizzle ORM, pas SQL brutHIGHChercher db.execute(sql pour des requêtes simples

Commandes de Détection

TS-001: Pas d'any

grep -rE "(: any|as any|<any>)" src/ netlify/ --include="*.ts" --include="*.tsx"

TS-002 / NM-008: Pas d'enums

grep -rE "^(export )?enum " src/ netlify/ --include="*.ts" --include="*.tsx"

TS-005: Assertions non-null hors tests

grep -rE "\w+!" src/ netlify/ --include="*.ts" --include="*.tsx" | grep -v "\.test\." | grep -v "\.spec\."

TS-006: Assertions as Type

grep -rE " as [A-Z]" src/ netlify/ --include="*.ts" --include="*.tsx" | grep -v "as const" | grep -v "as unknown"

EH-001: Erreurs avalées

grep -rE "catch.*\{" src/ netlify/ --include="*.ts" --include="*.tsx" -A 2 | grep -E "^\s*\}|console\.log"

CM-002: Code commenté

grep -rE "^\s*//" src/ netlify/ --include="*.ts" --include="*.tsx" | grep -E "(const |let |function |return |if \(|import )"

CM-003: TODO sans contexte

grep -rE "// TODO[^(]" src/ netlify/ --include="*.ts" --include="*.tsx" | grep -v "#\|ADV-\|JIRA-\|FIX-"

FN-006: Patterns async mélangés

grep -rE "async.*\{" src/ netlify/ --include="*.ts" --include="*.tsx" -A 20 | grep "\.then("

NM-006: Fichiers génériques

find src/ netlify/ -name "utils.ts" -o -name "helpers.ts" -o -name "misc.ts" -o -name "common.ts"

CS-005: SQL brut pour requêtes simples

grep -rE "db\.execute\(sql" netlify/ --include="*.ts"

PR-001: Fichiers trop longs

find src/ netlify/ -name "*.ts" -o -name "*.tsx" | xargs wc -l | sort -rn | head -20

Classification des Sévérités

SévéritéCritères
HIGHPerte de type safety, bugs silencieux, maintenabilité fortement dégradée
MEDIUMDette technique, lisibilité dégradée, violation de convention
LOWStyle, opportunité d'amélioration, cohérence

Format de Rapport

Le rapport généré doit inclure :

  1. Résumé — Totaux par sévérité
  2. Violations par catégorie — NM-, FN-, EH-, TS-, CM-, PR-, CS-* avec fichier, ligne, description
  3. Tâches recommandées — Actions de remédiation priorisées
  4. Couverture des règles — Status PASS/FAIL par règle

Principes

  • Non-destructif : Ne jamais modifier le code source
  • Basé sur preuves : Chaque violation cite fichier et ligne
  • Actionnable : Chaque violation a une action de remédiation claire
  • Priorisé : Focus sur violations à fort impact
  • Déterministe : Même codebase = même rapport

Exceptions Connues

Certains patterns sont intentionnels :

  • Les assertions ! sont acceptées dans les fichiers de test (*.test.ts, *.spec.ts)
  • as const et as unknown ne sont pas des violations de TS-006
  • Les fichiers de migration Drizzle peuvent utiliser du SQL brut
  • Les fichiers index.ts de barrel exports peuvent dépasser 200 lignes
  • Les schémas Zod de validation ne comptent pas comme "God files"

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.