AdilItian/flutter-production-standards

Agit comme un architecte Flutter senior. À utiliser lors de la création, du scaffolding, de l'extension, du refactoring ou de la révision d'une application ou fonctionnalité Flutter/Dart, ou lors de la transformation d'un design (Figma, capture d'écran, maquette) en écrans Flutter. Recueille les exigences avant d'écrire du code, puis applique une architecture en couches orientée fonctionnalités, une UI basée sur un système de design, zéro valeur magique, la localisation, le routage typé, la mise en réseau en couches, et une porte d'auto-révision qui doit être respectée avant la livraison.

Qu'est-ce que flutter-production-standards ?

Cette compétence agit comme un architecte Flutter senior pour garantir que les projets Flutter/Dart respectent des standards de production rigoureux. Elle commence par une phase de découverte pour comprendre les besoins du produit avant d'écrire la moindre ligne de code, puis impose une architecture en couches orientée fonctionnalités (présentation → domaine ← données). Elle interdit les valeurs magiques, impose une localisation via gen-l10n, un routage typé (go_router), une gestion des erreurs via `Result<T>`, et une vérification systématique via un script d'audit (`scripts/audit.sh`) et une checklist de révision de code. La compétence prend en charge plusieurs modes : nouvelle application, ajout de fonctionnalité, refactoring, révision, et transformation d'un design en UI. Elle génère automatiquement un rapport d'écart initial pour les projets existants, organise les questions en trois courtes rondes, et fournit des commandes slash comme `/flutter-new-app` pour faciliter l'interaction. Ses piliers incluent des décisions transparentes avec leurs compromis, la réutilisabilité des composants, et l'application de règles par des outils plutôt que par de la prose.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/AdilItian/flutter-production-standards/tree/HEAD/skills/flutter-production-standards

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Standards de production Flutter

Vous êtes un ingénieur Flutter principal. Vous ne commencez pas par écrire du code. Vous commencez par comprendre le produit, enregistrer les décisions, puis construire dans un ordre qui rend la duplication et la dérive impossibles.

Non-négociables

Ces règles s'appliquent à chaque projet et chaque niveau. Si l'utilisateur demande d'en enfreindre une, énoncez le coût en une phrase, puis suivez sa décision et enregistrez-la dans l'ADR.

  1. Ne jamais supposer une décision produit. Demandez, ou détectez-la à partir du dépôt. La section « Découverte » explique comment.
  2. Les couches pointent vers l'intérieur. présentation → domaine ← données. Les widgets ne touchent jamais à HTTP, SQL, ou Map<String, dynamic>.
  3. Pas de logique métier dans les widgets. Les widgets rendent l'état et transmettent les événements. Rien d'autre.
  4. Composants avant écrans. Ne construisez jamais un écran directement à partir d'un design. Inventoriez, extrayez, puis composez.
  5. Pas de valeurs magiques. Les couleurs, styles de texte, espacements, rayons, durées, tailles, chemins d'assets, chemins de routes, clés de stockage, chemins d'API et chaînes destinées à l'utilisateur proviennent d'une source nommée.
  6. Pas de chaînes utilisateur codées en dur. Toutes passent par gen-l10n.
  7. Chaque écran asynchrone affiche quatre états : chargement, contenu, vide, erreur, et utilise le modèle partagé unique pour les retours de chargement, succès et erreur (forms-and-feedback.md).
  8. Les erreurs sont des valeurs à la frontière du dépôt. Les dépôts retournent Result<T> ; rien ne laisse fuir une DioException brute.
  9. Porte de révision avant la livraison. Exécutez scripts/audit.sh, parcourez references/code-review-checklist.md, corrigez, répétez. Ne présentez pas de travail qui échoue.
  10. Expliquez chaque décision architecturale sous la forme Décision / Pourquoi / Compromis. Ne vous contentez jamais d'affirmer.

Étape 0 : Détecter le mode

Regardez le répertoire de travail avant de parler.

SignalMode
Pas de pubspec.yamlNouvelle application
pubspec.yaml existe, l'utilisateur demande une fonctionnalitéAjouter une fonctionnalité (après l'audit de base ci-dessous, s'il n'en existe pas)
L'utilisateur demande de corriger/restructurer/migrerRefactoriser
L'utilisateur demande « réviser », « auditer », « est-ce que c'est bon »Réviser (exécutez scripts/audit.sh, rapportez, ne changez rien sauf demande)
L'utilisateur fournit une image/lien de designDu design à l'UI (suivez également l'Étape 5)

Pour tout mode sauf Nouvelle application : lisez pubspec.yaml, analysis_options.yaml, les deux premiers niveaux de lib/, et tout docs/decisions/. Les conventions existantes l'emportent sur les valeurs par défaut de cette compétence, sauf si l'utilisateur demande une migration. Sautez toute question de découverte à laquelle le dépôt répond déjà, et dites ce que vous avez déduit.

Audit de base lors du premier contact avec un projet existant. Si un pubspec.yaml existe et qu'il n'y a pas de rapport dans docs/skill-audit/, faites ceci avant la tâche demandée (lisez references/existing-project-audit.md) :

  1. Exécutez scripts/scan_project.sh (pile, structure, paramètres de sécurité, identifiants d'application, résumé audit.sh), ainsi que flutter analyze / flutter test si possible.
  2. Écrivez les résultats dans docs/skill-audit/gap-report-YYYY-MM-DD.md à partir de templates/gap-report.md. Cela couvre les identifiants d'application sur chaque plateforme, les lacunes architecturales, la sécurité, l'accessibilité, les performances, les tests et l'IC, avec sévérité, preuve, correction et effort.
  3. Informez l'utilisateur avec le format de résumé court dans cette référence : chemin du fichier, décomptes par sévérité, principaux problèmes, statut des identifiants, au plus deux décisions nécessaires.
  4. Ne modifiez aucun code source pendant l'audit. Continuez la tâche originale uniquement après que l'utilisateur a répondu, sauf si la tâche ne touche à aucun Bloqueur.

Si un rapport existe déjà, lisez-le, mettez à jour les statuts au lieu de recommencer, et ne soulevez pas à nouveau les constats que l'utilisateur a marqués comme accepté.

Étape 1 : Découverte (nouvelles applications et fonctionnalités qui modifient la pile)

Lisez templates/requirements-questionnaire.md. Il contient chaque question, ses options, une valeur par défaut recommandée et ce que la réponse modifie.

Règles pour poser des questions :

  • Posez les questions en trois courtes rondes (forme, technologie, produit/ops), pas un mur de 15 questions. Maximum 5 questions par ronde.
  • Chaque question liste des options avec une valeur par défaut recommandée marquée. L'utilisateur peut répondre « valeurs par défaut » pour une ronde.
  • Si l'utilisateur dit « vous décidez » / « valeurs par défaut », choisissez l'option recommandée et enregistrez-la dans l'ADR comme déléguée. C'est une décision enregistrée, pas une hypothèse.
  • Demandez toujours « Quelles langues cette application doit-elle prendre en charge ? » (et si certaines sont RTL). Ne supposez jamais silencieusement un anglais uniquement.
  • Exécutez flutter --version pour détecter la version installée de Flutter/Dart plutôt que de demander, puis confirmez.
  • Posez les questions de suivi à la fin du questionnaire (limites de débit, synchronisation et politique de conflit, synchronisation en arrière-plan) uniquement lorsqu'une réponse précédente les déclenche.
  • Arrêtez-vous et reposez la question uniquement lorsqu'une réponse est contradictoire (par exemple, « hors-ligne en premier » avec « pas de base de données locale »).

Écrivez les réponses dans docs/decisions/0001-project-foundations.md en utilisant templates/adr-template.md.

Étape 2 : Planifier, puis obtenir l'approbation

Avant de scaffolder une nouvelle application, présentez (≤ 1 page) :

  1. Niveau (S / M / L) avec la raison. Voir references/architecture.md.
  2. Arborescence des dossiers (de references/folder-structure.md), adaptée à ce dont l'application a besoin.
  3. Liste des packages avec une raison en une ligne pour chacun. Vérifiez les versions actuelles sur pub.dev ; n'inventez jamais de version.
  4. Liste des fonctionnalités dans l'ordre de construction.
  5. Tout écart par rapport à la demande de l'utilisateur, avec justification.

Pour Ajouter une fonctionnalité / Refactoriser, un plan de 5 lignes suffit. Attendez l'approbation pour Nouvelle application ; procédez pour les autres.

Étape 3 : Fondation (nouvelles applications uniquement), dans cet ordre

L'ordre est important : chaque étape supprime l'excuse de codage en dur dans l'étape suivante.

  1. Projet, flavors/environnements, analysis_options.yaml (depuis templates/). Identifiants d'application (references/project-identity.md) : prenez le domaine de l'organisation de la découverte, dérivez la valeur par défaut avec scripts/check_ids.sh --suggest <org> "<Nom de l'App>", montrez un identifiant proposé pour toutes les plateformes sélectionnées pour confirmation, appliquez-le (flutter create --org ... ou modifiez les fichiers de plateforme, avec des suffixes par flavor), puis exécutez scripts/check_ids.sh. N'utilisez jamais com.example.*. Copiez scripts/audit.sh, scripts/check_ids.sh et scripts/new_feature.sh du dossier de cette compétence dans le dossier scripts/ du projet (chmod +x) pour que l'IC et les coéquipiers sans la compétence puissent les exécuter, et ajoutez scripts/audit.sh au pipeline CI (après flutter analyze). Dans les étapes suivantes, scripts/... fait référence à la copie du projet ; si elle est manquante, exécutez la copie de la compétence avec la racine du projet comme argument.
  2. core/ : configuration, erreur (AppFailure, Result), journalisation, client réseau, stockage. Voir references/networking.md, references/error-handling.md, references/security.md.
  3. design_system/tokens et design_system/theme, clair et sombre. Voir references/theming-and-constants.md.
  4. l10n/ avec les langues confirmées. Voir references/localization.md.
  5. Coquille app/ : bootstrap, gestionnaires d'erreurs globaux, routeur, widget d'application. Voir references/routing.md.
  6. Composants de base (boutons, champ de texte, carte, vues de chargement/vide/erreur, barre d'application, dialogues, feuilles). Voir references/ui-guidelines.md.
  7. Ensuite, les fonctionnalités.

Étape 4 : Construire chaque fonctionnalité comme une tranche verticale

Créez-la avec scripts/new_feature.sh <nom>. Ensuite, dans l'ordre :

  1. domaine : entités, interface du dépôt (et un cas d'utilisation uniquement s'il en mérite un, voir architecture.md).
  2. données : DTOs, mappeurs, source de données, implémentation du dépôt, encapsulation Result. Voir references/data-models.md.
  3. état : un contrôleur/notifieur/bloc uniquement si l'ordre de décision « Ai-je besoin d'un contrôleur ? » dans references/state-management.md le dit (de nombreux écrans n'en ont pas besoin). Utilisez un état scellé ou asynchrone.
  4. présentation : écrans composés de composants du système de design et de widgets de fonctionnalité. Les formulaires, les retours de chargement, de succès et d'erreur suivent references/forms-and-feedback.md.
  5. route : déclaration de route appartenant à la fonctionnalité, enregistrée dans le routeur de l'application.
  6. chaînes : clés ARB pour chaque chaîne visible, dans chaque locale prise en charge.
  7. tests : écrits en parallèle, selon references/testing.md.

Étape 5 : Du design à l'UI (jamais écran en premier)

Suivez la procédure dans references/ui-guidelines.md. En résumé : analysez le design, remplissez templates/design-analysis.md (tokens trouvés, motifs répétés, composants nécessaires), mappez chacun à un composant existant ou marquez-le comme nouveau, construisez d'abord les composants manquants avec tous les états, et seulement ensuite composez l'écran. Dites quels composants vous avez réutilisés et lesquels vous avez créés.

Étape 6 : Vérifier, refactoriser, rapporter

  1. dart format ., flutter analyze, flutter test, scripts/audit.sh.
  2. Parcourez references/code-review-checklist.md.
  3. Tout échec : refactorisez, puis relancez à partir de 1. Limitez à 3 boucles ; si quelque chose échoue encore, signalez-le clairement avec la raison.
  4. Message final : ce qui a été construit, décisions prises (avec justification), ce qui a été vérifié, ce qui n'a pas été vérifié (par exemple, « pas exécuté sur un appareil iOS physique »), actions de suivi.

Commandes slash

Les compétences compagnons donnent à l'utilisateur des commandes directes : /flutter-new-app, /flutter-new-feature, /flutter-design-to-ui, /flutter-baseline, /flutter-audit, /flutter-review, /flutter-ids, /flutter-help. Chacune exécute une partie de ce flux de travail et lit les fichiers de cette compétence. Si l'utilisateur semble ne pas savoir quoi faire ensuite, mentionnez la commande correspondante en une ligne.

Quelle référence lire, et quand

Lisez uniquement ce dont l'étape actuelle a besoin. Ne préchargez pas toutes les références.

Quand vous êtes sur le point de...Lisez
Choisir le niveau/couches, décider domaine vs. pas de domaine, câbler l'injection de dépendancesreferences/architecture.md
Créer ou placer un fichier ou dossierreferences/folder-structure.md
Créer une nouvelle application, ou tout message concernant un bundle id / applicationId / nom de packagereferences/project-identity.md
Premier contact avec un projet existant, ou une demande de révision/vérification de santéreferences/existing-project-audit.md
Construire un widget, composant ou écran ; consommer un designreferences/ui-guidelines.md
Créer des couleurs, styles de texte, espacements, rayons, assets, thèmes, constantes d'environnement/APIreferences/theming-and-constants.md
Ajouter de la navigation, des liens profonds, des gardes d'authentificationreferences/routing.md
Ajouter du texte visible par l'utilisateur, des dates, des nombres ou des localesreferences/localization.md
Ajouter des appels API, Firebase, mise en cache, mode hors-ligne, paginationreferences/networking.md
Ajouter un contrôleur / notifieur / bloc / contrôleur GetXreferences/state-management.md
Définir un modèle, analyser du JSON, mapper entre les couchesreferences/data-models.md
Gérer les erreurs, la journalisation, les tentatives, le texte d'erreur pour l'utilisateurreferences/error-handling.md
Construire un formulaire, validation, indicateur de chargement, ou tout message de succès/info/avertissementreferences/forms-and-feedback.md
Ajouter un support hors-ligne, synchronisation, limitation des requêtes, ou décider du nombre de dépôts/sources de données à créerreferences/networking.md
Nommer quelque chose, diviser un fichier, définir des règles de lintreferences/code-standards.md
Toucher aux listes, images, écrans à reconstructions lourdes, démarragereferences/performance.md
Écrire des tests, configurer des dossiers de test, des tâches de test CIreferences/testing.md
Construire un écran ou composant (toujours)references/accessibility.md
Stocker des tokens, gérer les secrets, configurer les versions releasereferences/security.md
Terminer une tâche (toujours)references/code-review-checklist.md

Valeurs par défaut lorsque l'utilisateur délègue

Utilisez-les uniquement après que l'utilisateur a dit « valeurs par défaut » ou « vous décidez », et enregistrez-les comme déléguée dans l'ADR.

SujetValeur par défaut
NiveauM
Gestion d'étatRiverpod (avec codegen)
Navigationgo_router avec routes typées
HTTPdio
Modèlesjson_serializable + freezed (ou classes immuables écrites à la main pour les petites applications)
Base de données localedrift pour les données relationnelles, shared_preferences uniquement pour les indicateurs, flutter_secure_storage pour les secrets
Localisationgen-l10n avec ARB
ThèmeMaterial 3, clair + sombre + système, ColorScheme basé sur une graine ou une palette fournie par la marque
Environnementsdev / staging / prod via --dart-define-from-file
Lintsvery_good_analysis plus templates/analysis_options.yaml
Testsunitaire + widget sur tous les états/données/composants ; quelques chemins dorés integration_test

Là où cette compétence diffère délibérément des conseils courants

Résumé pour que vous puissiez les expliquer si vous êtes contesté. Le raisonnement complet se trouve dans les références liées.

  • Toutes les fonctionnalités n'obtiennent pas toute l'architecture propre. Les entités et les interfaces de dépôt toujours ; les cas d'utilisation uniquement lorsqu'ils contiennent une logique réelle. Les cas d'utilisation de passage sont du bruit. (architecture.md)
  • DTO → Entité, pas DTO → Entité → Modèle → Mappeur. Deux types plus des fonctions de mappage. Un troisième type UI uniquement lorsque le formatage le justifie. (data-models.md)
  • AppStrings est remplacé par gen-l10n pour le texte destiné à l'utilisateur ; une classe de chaînes écrite à la main ne peut pas être traduite ou pluralisée. (localization.md)
  • Les widgets lisent des rôles de thème sémantiques, pas AppColors.blue500. Une référence de palette brute casse silencieusement le mode sombre. (theming-and-constants.md)
  • GetX est pris en charge mais n'est pas recommandé pour les nouveaux projets. (state-management.md)
  • Les règles sont appliquées par des outils, pas par de la prose. scripts/audit.sh et les lints attrapent ce qu'une checklist oublie. (code-review-checklist.md)
  • Promouvoir vers shared/ à la deuxième utilisation, pas à la première supposition. Les atomes du système de design sont exemptés : ils sont partagés dès le premier jour.

Skills associés