add-dart-lint-validation-rule

# Instructions pour ajouter une nouvelle règle de validation et un drapeau CLI à dart_skills_lint ## Étapes 1. **Créer un fichier de règle** - Ajouter un nouveau fichier dans le répertoire `lib/rules/` - Implémenter la classe de règle qui étend `LintRule` - Définir les propriétés `name`, `description` et `severity` 2. **Implémenter la logique de validation** - Surcharger la méthode `validate()` dans votre classe de règle - Analyser le code Dart selon vos critères - Retourner une liste de violations détectées 3. **Enregistrer la règle** - Ajouter la nouvelle règle dans `lib/rules/registry.dart` - L'ajouter à la liste `availableRules` 4. **Ajouter le drapeau CLI** - Modifier `lib/cli/parser.dart` - Ajouter une nouvelle option avec `parser.addOption()` ou `parser.addFlag()` - Utiliser un nom descriptif en kebab-case 5. **Connecter la logique CLI** - Mettre à jour `bin/dart_skills_lint.dart` - Lire la valeur du drapeau depuis `results['flag-name']` - Passer la valeur à la logique de validation appropriée 6. **Ajouter des tests** - Créer un fichier test dans `test/rules/` - Tester les cas de succès et d'échec - Vérifier les messages d'erreur ## Exemple ```dart // lib/rules/custom_rule.dart class CustomRule extends LintRule { @override final String name = 'custom_rule'; @override final String description = 'Détecte les patterns personnalisés'; @override List<Violation> validate(String code) { final violations = <Violation>[]; // Logique de validation ici return violations; } } ```

npx skills add https://github.com/flutter/skills --skill add-dart-lint-validation-rule

Ajouter une Nouvelle Règle de Validation et un Flag

Utilisez cette compétence quand vous devez ajouter une nouvelle règle de validation au package dart_skills_lint, l'exposer comme un flag CLI basculable, et vérifier son comportement.


🛠️ Implémentation Étape par Étape

1. Créer la Classe de Règle

Créez un nouveau fichier dans lib/src/rules/ qui étend SkillRule.

// lib/src/rules/my_new_rule.dart

import '../models/analysis_severity.dart';
import '../models/skill_context.dart';
import '../models/skill_rule.dart';
import '../models/validation_error.dart';

class MyNewRule extends SkillRule {
  MyNewRule({super.severity});

  @override
  Future<List<ValidationError>> validate(SkillContext context) async {
    final errors = <ValidationError>[];
    // Ajoutez la logique de validation ici en utilisant context.rawContent ou context.directory
    return errors;
  }
}

2. Enregistrer la Règle dans lib/src/rule_registry.dart

Ajoutez une nouvelle instance CheckType à la liste RuleRegistry.allChecks. Cela expose automatiquement un flag CLI.

// lib/src/rule_registry.dart dans la liste allChecks

  const CheckType(
    name: MyNewRule.ruleName,
    defaultSeverity: MyNewRule.defaultSeverity,
    help: 'Description de ce que fait la règle pour l\'aide CLI.',
  ),

Ensuite, ajoutez un cas à RuleRegistry.createRule pour instancier votre règle :

// lib/src/rule_registry.dart dans la méthode createRule

  static SkillRule? createRule(String name, AnalysisSeverity severity) {
    switch (name) {
      // ... autres règles
      case MyNewRule.ruleName:
        return MyNewRule(severity: severity);
      default:
        return null;
    }
  }

3. Gérer les Règles Désactivées par Défaut (Si applicable)

Si la règle est désactivée par défaut (defaultSeverity: AnalysisSeverity.disabled), passer le flag --check-my-new-rule l'activera automatiquement avec la sévérité AnalysisSeverity.error (géré dans entry_point.dart).


🧪 Tester la Nouvelle Règle

Vous devez écrire des tests automatisés vérifiant que votre règle se déclenche quand elle le devrait et s'ignore quand elle ne devrait pas.

Approche Préférée : Tests Unitaires en Mémoire

Au lieu d'écrire des fichiers sur le disque, testez la règle directement en utilisant un mock SkillContext. C'est plus rapide et évite les dépendances d'E/S.

// test/my_new_rule_test.dart

import 'dart:io';
import 'package:dart_skills_lint/src/models/analysis_severity.dart';
import 'package:dart_skills_lint/src/models/skill_context.dart';
import 'package:dart_skills_lint/src/models/validation_error.dart';
import 'package:dart_skills_lint/src/rules/my_new_rule.dart';
import 'package:test/test.dart';

void main() {
  group('MyNewRule', () {
    test('flags invalid content', () async {
      final rule = MyNewRule(severity: AnalysisSeverity.warning);
      final context = SkillContext(
        directory: Directory('dummy'),
        rawContent: 'Invalid content',
      );

      final List<ValidationError> errors = await rule.validate(context);

      expect(errors, isNotEmpty);
      expect(errors.first.message, contains('Expected error message'));
    });

    test('passes valid content', () async {
      final rule = MyNewRule(severity: AnalysisSeverity.warning);
      final context = SkillContext(
        directory: Directory('dummy'),
        rawContent: 'Valid content',
      );

      final List<ValidationError> errors = await rule.validate(context);

      expect(errors, isEmpty);
    });
  });
}

Tests d'Intégration

Si la règle interagit avec des flags CLI ou des fichiers de configuration, ajoutez un test dans test/cli_integration_test.dart en utilisant TestProcess.

[!IMPORTANT] Lors de l'écriture de tests d'intégration qui utilisent des fichiers de configuration et TestProcess, assurez-vous que les chemins dans le fichier de configuration et les chemins passés à la CLI correspondent en style (tous relatifs ou tous absolus) pour éviter des problèmes de correspondance de chemins dans entry_point.dart.


📚 Mises à Jour de la Documentation

Quand une nouvelle règle est introduite, vérifiez que vous synchronisez les fichiers markdown frères !

  1. README.md :
    • Ajoutez votre flag sous les sections Usage et Flags pour que les utilisateurs sachent qu'il existe.
  2. documentation/knowledge/SPECIFICATION.md :
    • Documentez la contrainte formelle dans la spécification si elle définit un standard pour les fichiers skill.

🚦 Liste de Vérification Avant de Soumettre la PR

  • [ ] Classe de règle créée dans lib/src/rules/.
  • [ ] Règle enregistrée dans lib/src/rule_registry.dart.
  • [ ] Tests unitaires ajoutés dans test/ en utilisant SkillContext en mémoire.
  • [ ] Utilisation listée dans README.md.
  • [ ] Schéma documenté dans documentation/knowledge/SPECIFICATION.md (si applicable).
  • [ ] Exécutez dart format . pour formater le code.
  • [ ] Exécutez dart analyze --fatal-infos pour vous assurer qu'il n'y a pas de problèmes.
  • [ ] Exécutez dart test pour vous assurer que les tests réussissent.