Ruff Recursive Fix
Aperçu
Utilisez cette compétence pour appliquer la qualité du code avec Ruff dans un workflow itératif et contrôlé. Elle prend en charge :
- Limitation optionnelle du périmètre à un dossier spécifique.
- Paramètres par défaut du projet depuis
pyproject.toml. - Invocation flexible de Ruff (
uv,ruffdirect,python -m ruff, ou équivalent). - Surcharges optionnelles de règles par exécution (
--select,--ignore,--extend-select,--extend-ignore). - Autofixes automatiques sûrs puis non sûrs.
- Révision des diff après chaque passage de correction.
- Répétition récursive jusqu'à résolution des findings ou décision requise.
- Utilisation judicieuse de
# noqainline seulement quand la suppression est justifiée.
Entrées
Rassemblez ces entrées avant d'exécuter :
target_path(optionnel) : dossier ou fichier à vérifier. Vide signifie tout le repository.ruff_runner(optionnel) : préfixe de commande Ruff explicite (par exempleuv run,ruff,python -m ruff,pipx run ruff).rules_select(optionnel) : codes de règles séparés par des virgules à appliquer.rules_ignore(optionnel) : codes de règles séparés par des virgules à ignorer.extend_select(optionnel) : règles supplémentaires à ajouter sans remplacer les défauts configurés.extend_ignore(optionnel) : règles supplémentaires à ignorer sans remplacer les défauts configurés.allow_unsafe_fixes(défaut : true) : s'il faut exécuter les fixes non sûrs de Ruff.ask_on_ambiguity(défaut : true) : toujours demander à l'utilisateur quand plusieurs choix valides existent.
Construction de commandes
Construisez des commandes Ruff à partir des entrées.
0. Résoudre le runner Ruff
Déterminez un préfixe ruff_cmd réutilisable avant de construire les commandes.
Ordre de résolution :
- Si
ruff_runnerest fourni, utilisez-le tel quel. - Sinon, si
uvest disponible et que Ruff est géré viauv, utilisezuv run ruff. - Sinon, si
ruffest disponible dansPATH, utilisezruff. - Sinon, si Python est disponible et que Ruff est installé dans cet environnement, utilisez
python -m ruff. - Sinon, utilisez tout équivalent spécifique au projet qui invoque Ruff installé (par exemple
pipx run ruff), ou arrêtez et demandez à l'utilisateur.
Utilisez le même ruff_cmd résolu pour toutes les commandes check et format du workflow.
Commande de base :
<ruff_cmd> check
Commande du formateur :
<ruff_cmd> format
Avec cible optionnelle :
<ruff_cmd> format <target_path>
Ajoutez la cible optionnelle :
<ruff_cmd> check <target_path>
Ajoutez les surcharges optionnelles au besoin :
--select <codes>
--ignore <codes>
--extend-select <codes>
--extend-ignore <codes>
Exemples :
# Projet complet avec défauts de pyproject.toml
ruff check
# Un dossier avec défauts
python -m ruff check src/models
# Surcharge pour ignorer les règles docs et TODO-like pour cette exécution
uv run ruff check src --extend-ignore D,TD
# Vérifier seulement les règles sélectionnées dans un dossier
ruff check src/data --select F,E9,I
Workflow
1. Analyse de référence
- Exécutez
<ruff_cmd> checkavec le périmètre et les options sélectionnés. - Classifiez les findings par type :
- Autofixable sûr.
- Autofixable non sûr.
- Non autofixable.
- S'il ne reste aucun finding, arrêtez.
2. Passage d'autofix sûr
- Exécutez Ruff avec
--fixen utilisant le même périmètre/options. - Révisez le diff résultant attentivement pour la correction sémantique et la cohérence de style.
- Exécutez
<ruff_cmd> formatsur le même périmètre. - Réexécutez
<ruff_cmd> checkpour actualiser les findings restants.
3. Passage d'autofix non sûr
Exécutez seulement si des findings restent et allow_unsafe_fixes=true.
- Exécutez Ruff avec
--fix --unsafe-fixesen utilisant le même périmètre/options. - Révisez le diff résultant attentivement, en priorité sur les éditions sensibles au comportement.
- Exécutez
<ruff_cmd> formatsur le même périmètre. - Réexécutez
<ruff_cmd> check.
4. Passage de remédiation manuelle
Pour les findings restants :
- Corrigez directement dans le code quand il y a une correction claire et sûre.
- Gardez les éditions minimales et locales.
- Exécutez
<ruff_cmd> formatsur le même périmètre. - Réexécutez
<ruff_cmd> check.
5. Politique d'ambiguïté
S'il y a plusieurs solutions valides à n'importe quelle étape, posez toujours la question à l'utilisateur avant de procéder. Ne choisissez pas silencieusement entre options équivalentes.
6. Décision de suppression (# noqa)
Utilisez la suppression seulement quand toutes les conditions sont vraies :
- La règle entre en conflit avec un comportement requis, une API publique, des conventions de framework ou des objectifs de lisibilité.
- La refactorisation serait disproportionnée par rapport à la valeur de la règle.
- La suppression est étroite et spécifique (ligne unique, code explicite quand possible).
Directives :
- Préférez
# noqa: <RULE>au large# noqa. - Ajoutez un bref commentaire de raison pour les suppressions non évidentes.
- S'il existe deux ou plus résultats valides, posez toujours la question à l'utilisateur sur l'option à préférer.
7. Boucle récursive et critères d'arrêt
Répétez les étapes 2 à 6 jusqu'à l'un de ces résultats :
<ruff_cmd> checkretourne un état propre.- Les findings restants requièrent des décisions architecturales/produit.
- Les findings restants sont intentionnellement supprimés avec justification documentée.
- La boucle répétée ne progresse pas.
Chaque itération de boucle doit inclure <ruff_cmd> format avant le prochain <ruff_cmd> check.
Quand aucune progression n'est détectée :
- Résumez les règles bloquées et les fichiers affectés.
- Présentez les options valides et les compromis.
- Demandez à l'utilisateur de choisir.
Portes de qualité
Avant de déclarer l'achèvement :
- Ruff ne retourne pas de findings inattendus pour le périmètre/options choisi.
- Tous les diffs d'autofix sont révisés pour la correction.
- Aucune suppression n'est ajoutée sans justification explicite.
- Tout fix non sûr avec impact comportemental possible est mis en avant à l'utilisateur.
- Le formatage Ruff est exécuté à chaque itération.
Contrat de sortie
À la fin de l'exécution, rapportez :
- Périmètre et options Ruff utilisés.
- Nombre d'itérations effectuées.
- Résumé des findings corrigés.
- Liste des corrections manuelles.
- Liste des suppressions avec justification.
- Findings restants, le cas échéant, et décisions utilisateur requises.
Suggestions de prompt de démarrage
- « Exécutez ruff-recursive-fix sur l'intégralité du repo avec la config par défaut. »
- « Exécutez ruff-recursive-fix seulement sur src/models, ignorer les règles DOC. »
- « Exécutez ruff-recursive-fix sur tests avec select F,E9,I et pas de fixes non sûrs. »
- « Exécutez ruff-recursive-fix sur src/data et demandez-moi avant d'ajouter du noqa. »