Skill d'Investigation et de Planification d'Issue
Objectif
Investiguer une issue GitHub en détail et produire un plan d'implémentation structuré et actionnable. Le plan suit l'architecture en couches du projet (UI -> BLoC -> Repository -> Client) et inclut les fichiers à modifier, les étapes d'implémentation, la stratégie de test et l'évaluation des risques.
Flux de Travail
Phase 1 : Récupérer l'Issue
Récupérer le contexte complet de l'issue en utilisant la CLI gh et GraphQL.
# Obtenir les détails de l'issue
gh issue view <number> --json title,body,comments,labels,state,assignees
# Obtenir le type d'issue, la hiérarchie et les sous-issues
gh api graphql -f query='{ repository(owner: "divinevideo", name: "divine-mobile") {
issue(number: <NUMBER>) {
id
title
body
issueType { id name }
subIssues(first: 20) { nodes { number title state } }
parentIssue { number title }
}
} }'
Déterminer le type d'issue à partir de :
- Préfixe du titre :
fix:= Bug,feat:= Feature,task:= Task - Champ GraphQL
issueType - Labels (par exemple,
buglabel)
Extraire les informations clés :
- Bug : Étapes de reproduction, résultat réel vs attendu, environnement, preuves
- Feature : Exigences, critères d'acceptation, stories utilisateur
- Task : Description, périmètre, notes d'implémentation
Phase 2 : Explorer la Codebase
Rechercher dans la codebase pour comprendre le code pertinent. L'approche varie selon le type.
Pour les Bugs
- Rechercher des mots-clés de la description du bug (messages d'erreur, noms d'écrans, noms de widgets) avec
Grep - Identifier l'écran/page où le bug se manifeste en utilisant
Globsurlib/screens/etlib/widgets/ - Tracer le chemin du code à travers UI, BLoC, Repository jusqu'à Client
- Vérifier les tests associés en utilisant
Globsurtest/ - Si lié à Nostr, utiliser
mcp__nostr__read_kindoumcp__nostr__read_nippour le contexte du protocole
Pour les Features
- Rechercher des features similaires existantes avec
GrepetGlob - Identifier les couches architecturales nécessaires (nouveau BLoC ? Nouveau repository ? Nouveau package ?)
- Vérifier si des modèles/repositories associés existent déjà dans
mobile/packages/ - Consulter le routeur (
mobile/lib/router/) pour l'intégration de navigation - Si lié à Nostr, utiliser les outils
mcp__nostr__*pour comprendre les NIPs et kinds d'événements pertinents
Pour les Tasks
- Rechercher la zone de code spécifiée dans la task en utilisant
Grep - Comprendre l'état actuel d'implémentation
- Vérifier les tests existants qui devront être mis à jour
- Identifier les fichiers associés qui pourraient être affectés
Phase 3 : Analyser
Pour les Bugs
- Identifier la cause racine en lisant les fichiers sources pertinents
- Déterminer quelle(s) couche(s) contient le bug (UI ? BLoC ? Repository ? Client ?)
- Évaluer le risque de régression (qu'est-ce d'autre pourrait casser ?)
- Vérifier si les tests existants auraient dû attraper cela
Pour les Features
- Déterminer quelles couches nécessitent du nouveau code vs des modifications
- Concevoir le flux de données : Client -> Repository -> BLoC -> UI
- Identifier les nouveaux modèles, événements, états nécessaires
- Considérer l'intégration avec les features existantes (routeur, thème, BLoCs existants)
- Évaluer si de nouveaux packages sont nécessaires dans
mobile/packages/
Pour les Tasks
- Délimiter précisément la portée du changement
- Identifier tous les fichiers qui doivent être modifiés
- Déterminer si la task a des effets en cascade
Phase 4 : Planifier
Construire le plan d'implémentation en suivant l'architecture en couches du projet. Toujours ordonner les étapes d'implémentation de bas en haut :
- Modifications de la couche données (packages Client dans
mobile/packages/) - Modifications de la couche repository (packages Repository dans
mobile/packages/) - Modifications de la logique métier (BLoCs dans
mobile/lib/blocs/) - Modifications de la couche présentation (Screens/Widgets dans
mobile/lib/screens/oumobile/lib/widgets/) - Modifications du routeur (si la navigation est affectée)
- Plan de test (reflétant les couches d'implémentation)
Phase 5 : Sortie
Présenter le plan en utilisant le modèle de sortie ci-dessous.
Modèle de Sortie
## Plan : [Titre de l'Issue] (#[numéro])
**Type** : Bug | Feature | Task
**Issue** : [URL]
**Complexité** : Low | Medium | High
---
### Résumé de l'Issue
[Résumé en 1-2 phrases dans vos propres mots après investigation]
### [Bug Uniquement] Cause Racine
- **Couche** : [UI | BLoC | Repository | Client]
- **Fichier** : [chemin exact avec numéros de ligne]
- **Cause** : [explication claire de pourquoi cela se produit]
- **Preuves** : [snippet de code ou trace logique]
### [Feature Uniquement] Conception Architecturale
- **Nouveaux packages nécessaires** : [liste ou "Aucun"]
- **Couches affectées** : [lesquelles de UI, BLoC, Repository, Client]
- **Flux de données** : [description Client -> Repository -> BLoC -> UI]
- **Événements Nostr** : [kinds/NIPs pertinents si applicable]
### Fichiers Affectés
| Fichier | Action | Description |
|---------|--------|-------------|
| `path/to/file.dart` | Modify / Create / Delete | Quels changements |
### Étapes d'Implémentation
Étapes ordonnées de bas en haut (couche données d'abord, UI en dernier) :
1. **[Couche] : [Brève description]**
- Fichier : `path/to/file.dart`
- Changements : [changements spécifiques]
- Pourquoi : [justification]
2. ...
### Stratégie de Test
| Couche | Fichier de Test | Quoi Tester |
|--------|-----------------|-------------|
| [Couche] | `test/path/to/test.dart` | [cas de test spécifiques] |
### Risques et Considérations
- [Risque 1 et atténuation]
- [Risque 2 et atténuation]
Référence des Outils
| Besoin | Outil | Exemple |
|---|---|---|
| Récupérer une issue | gh issue view |
gh issue view 142 --json title,body,comments,labels |
| Hiérarchie d'issue | gh api graphql |
Sous-issues, problèmes parents, type d'issue |
| Trouver des fichiers par nom | Glob |
Glob("**/*video_feed*") |
| Rechercher dans le code | Grep |
Grep("VideoFeedBloc") |
| Lire les détails d'un fichier | Read |
Read("mobile/lib/blocs/video_feed/video_feed_bloc.dart") |
| Vérifier la santé du code | mcp__dart__analyze_files |
Analyser les packages affectés |
| Trouver des symboles Dart | mcp__dart__resolve_workspace_symbol |
Chercher les noms de classe/méthode |
| Protocole Nostr | mcp__nostr__read_nip |
Vérifier les spécifications NIP |
| Kinds d'événements Nostr | mcp__nostr__read_kind |
Comprendre la structure d'événement |
Directives de Complexité
| Complexité | Critères |
|---|---|
| Low | Couche unique, 1-3 fichiers, aucun nouveau modèle ni package |
| Medium | 2-3 couches, 4-10 fichiers, peut nécessiter de nouveaux événements/états BLoC |
| High | Toutes les couches, 10+ fichiers, nouveaux packages, nouveaux modèles, changements de protocole Nostr |
Référence Architecturale
- Ordre des couches : UI -> BLoC -> Repository -> Client
- Ordre d'implémentation : De bas en haut (Client d'abord, UI en dernier)
- Packages :
mobile/packages/ - BLoCs :
mobile/lib/blocs/ - Écrans :
mobile/lib/screens/ - Widgets :
mobile/lib/widgets/ - Routeur :
mobile/lib/router/ - Tests miroir :
mobile/test/reflètemobile/lib/ - Gestion d'état : BLoC pour les nouvelles features, Riverpod pour l'héritage
- Thème : Mode sombre uniquement, utiliser les constantes
VineTheme - IDs Nostr : Ne jamais tronquer, toujours un hex complet 64-caractères