Aller au contenu

Address PR Review Suggestions

Overview

Récupère automatiquement tous les commentaires GitHub non résolus contenant des suggestions de changements depuis la PR de la branche courante, puis génère un plan récapitulatif structuré. Cette commande ne modifie aucun code - elle génère uniquement un plan que l'utilisateur pourra ensuite implémenter manuellement ou via d'autres commandes.

Mode d'exécution

IMPORTANT : Cette commande doit être exécutée en mode "plan" dans Cursor.

Avant d'exécuter cette commande, vous devez :

  1. Générer d'abord un plan structuré en utilisant l'outil create_plan ou en présentant un plan détaillé à l'utilisateur
  2. Ne pas modifier de fichiers jusqu'à ce que le plan soit approuvé par l'utilisateur
  3. Attendre la confirmation explicite de l'utilisateur avant d'exécuter les étapes de récupération des données
  4. Présenter le plan récapitulatif des suggestions trouvées sans appliquer de modifications

Le plan généré doit être clair, structuré et prêt à être utilisé comme référence pour l'implémentation ultérieure.

Steps

Note : Exécuter ces étapes en mode plan - générer d'abord un plan structuré avant toute action.

1. Identifier la PR courante

D'abord, identifier la PR associée à la branche Git courante (en lecture seule, sans modification) :

gh pr view --json number,headRefName,url,repository

Si aucune PR n'est trouvée pour la branche courante, informer l'utilisateur qu'il doit être sur une branche avec une PR ouverte.

Extraire les informations suivantes :

  • number : numéro de la PR
  • headRefName : nom de la branche
  • url : URL de la PR
  • repository.owner.login : propriétaire du repo
  • repository.name : nom du repo

2. Récupérer les review threads non résolus

Utiliser l'API GraphQL de GitHub pour récupérer tous les review threads de la PR :

gh api graphql -f query='
query GetUnresolvedSuggestions($owner: String!, $repo: String!, $prNumber: Int!) {
  repository(owner: $owner, name: $repo) {
    pullRequest(number: $prNumber) {
      reviewThreads(first: 100) {
        pageInfo {
          hasNextPage
          endCursor
        }
        nodes {
          isResolved
          path
          line
          startLine
          comments(first: 10) {
            nodes {
              body
              bodyText
              author {
                login
              }
              createdAt
            }
          }
        }
      }
    }
  }
}' -f owner="$OWNER" -f repo="$REPO" -f prNumber=$PR_NUMBER

Filtrer uniquement les threads où isResolved == false - ce sont bien les commentaires non résolus qui seront inclus dans le plan.

3. Identifier et grouper les suggestions de changements

Pour chaque thread non résolu, analyser les commentaires pour détecter les suggestions :

  1. Parser le body du commentaire pour détecter les suggestions GitHub natives
  2. Rechercher les blocs de code avec le format ```suggestion ... ``` dans le champ body
  3. Extraire le code entre ces balises — c'est le code suggéré par le reviewer
  4. Le path et line/startLine du thread indiquent où appliquer la suggestion

  5. Grouper les commentaires par suggestion :

  6. Un thread peut contenir plusieurs commentaires (réponses, discussions)
  7. Grouper tous les commentaires d'un même thread ensemble car ils concernent la même suggestion
  8. Pour chaque thread (suggestion), extraire :

    • Fichier concerné (path)
    • Ligne de code (line ou startLine)
    • Code actuel (lire le fichier à la ligne indiquée pour contexte, avec quelques lignes avant/après)
    • Code suggéré (extrait du bloc ```suggestion ``` dans le body)
    • Tous les commentaires du thread (auteur, date, contenu textuel si présent)
    • Auteur principal (author.login du premier commentaire avec suggestion)
    • Date de création (createdAt du premier commentaire)
  9. Analyser la pertinence via la discussion du thread :

  10. Pour chaque thread non résolu (isResolved == false) contenant au moins une réponse, analyser le contenu de la conversation pour déterminer si la suggestion a été effectivement traitée
  11. Exclure le thread si la discussion indique clairement que le sujet est clos (accord mutuel, confirmation d'application, reviewer qui retire sa demande, etc.)
  12. Conserver le thread si : pas de réponse, désaccord non résolu, demande de précision en attente, ou dernier message qui insiste sur la suggestion
  13. En cas de doute, conserver le thread (mieux vaut présenter une suggestion déjà traitée que d'en manquer une pertinente)

4. Générer un plan structuré (mode plan)

À ce stade, vous devez utiliser l'outil create_plan pour générer un plan structuré que l'utilisateur pourra examiner avant toute action.

Créer un plan organisé par fichier avec le format suivant. IMPORTANT : Utiliser le format de citation de code Cursor pour créer des liens cliquables vers les fichiers et lignes.

Format type du plan :

# Plan d'application des suggestions de review

## PR: #{PR_NUMBER} - {PR_TITLE}

**Branche:** {BRANCH_NAME} | **URL:** {PR_URL}

### Résumé

- **Suggestions trouvées:** {nombre_total}
- **Suggestions exclues (résolues par discussion):** {nombre_exclus}
- **Fichiers concernés:** {nombre_fichiers}

---

## {chemin/vers/fichier}

### Suggestion - Ligne {line}

```{startLine}:{endLine}:{chemin/vers/fichier}
{code_actuel_avec_contexte_quelques_lignes_avant_et_après}
```

**Auteur:** @{author} | **Date:** {createdAt}

**Code suggéré:**

```{langage}
{code_suggéré}
```

{Si_commentaires_textuels_presents:}
**Commentaires:**

- @{author1}: {contenu_commentaire}
- @{author2}: {contenu_commentaire}

---

### Suggestion - Ligne {line}

```{startLine}:{endLine}:{chemin/vers/fichier}
{code_actuel_avec_contexte}
```

**Auteur:** @{author} | **Date:** {createdAt}

**Code suggéré:**

```{langage}
{code_suggéré}
```

---

Règles de formatage :

  1. Liens cliquables : Utiliser le format de citation Cursor ```{startLine}:{endLine}:{filepath} ... ``` directement dans le plan pour chaque suggestion. Le code affiché dans le lien doit inclure quelques lignes de contexte avant et après la ligne concernée.

  2. Structure :

  3. Un résumé en haut avec le nombre total de suggestions et fichiers
  4. Grouper par fichier
  5. Pour chaque suggestion, afficher le lien cliquable avec le code actuel, puis le code suggéré
  6. Afficher auteur et date sur une seule ligne séparés par |
  7. Ne pas afficher de Thread ID ou autres métadonnées techniques

  8. Commentaires : Afficher les commentaires textuels uniquement s'ils apportent des informations supplémentaires (pas juste le code suggéré)

  9. Lisibilité : Format concis, pas de sections redondantes, focus sur l'essentiel (fichier, ligne, code actuel, code suggéré)

5. Organiser les suggestions

  • Grouper toutes les suggestions par fichier
  • Grouper les commentaires par suggestion : Tous les commentaires d'un même thread (même path et line) doivent être regroupés ensemble car ils concernent la même suggestion
  • Pour chaque fichier, trier les suggestions par numéro de ligne (du haut vers le bas)
  • Indiquer le nombre total de suggestions par fichier
  • Créer une checklist pour suivre l'application (à remplir manuellement par l'utilisateur)

6. Générer le plan récapitulatif

Créer un plan récapitulatif en suivant exactement le format type défini dans la section 4. Le plan doit être :

  • Concis et lisible : Pas de métadonnées inutiles, focus sur l'essentiel
  • Structuré : Résumé en haut, puis groupé par fichier
  • Avec liens cliquables : Chaque suggestion doit avoir un lien cliquable vers le fichier et la ligne (format de citation Cursor)
  • Sans Thread ID : Ne jamais afficher de Thread ID ou autres IDs techniques
  • Format cohérent : Suivre exactement le format type fourni dans la section 4

Checklist d'exécution (mode plan)

Phase 1 : Génération du plan (sans modification)

  • [ ] Identifier la PR courante (lecture seule)
  • [ ] Récupérer les review threads non résolus (lecture seule via API)
  • [ ] Filtrer les threads avec suggestions
  • [ ] Analyser la discussion de chaque thread pour déterminer si la suggestion est encore pertinente
  • [ ] Extraire les détails de chaque suggestion (fichier, ligne, code actuel, code suggéré)
  • [ ] Grouper les commentaires par suggestion (regrouper les commentaires d'un même thread)
  • [ ] Organiser les suggestions par fichier
  • [ ] Créer des liens cliquables vers les fichiers et lignes (format de citation Cursor avec code actuel affiché dedans)
  • [ ] Ne pas inclure de Thread ID ou autres métadonnées techniques dans le plan
  • [ ] Générer le plan structuré avec l'outil create_plan
  • [ ] Présenter le plan récapitulatif à l'utilisateur pour examen
  • [ ] Attendre la confirmation de l'utilisateur avant toute action supplémentaire

Phase 2 : Implémentation (après approbation du plan)

  • Cette phase sera exécutée par l'utilisateur ou via d'autres commandes Cursor après examen du plan

Notes importantes

  • Cette commande doit être exécutée en mode "plan" - générer d'abord un plan structuré avant toute action
  • Cette commande ne modifie aucun code - elle génère uniquement un plan récapitulatif
  • Utiliser l'outil create_plan pour créer le plan structuré que l'utilisateur pourra examiner
  • Toutes les opérations de récupération de données doivent être en lecture seule (pas de modifications de fichiers)
  • L'utilisateur devra ensuite décider comment implémenter les suggestions (manuellement ou via d'autres commandes)
  • Certaines suggestions peuvent être obsolètes si le code a changé depuis la review - vérifier le contexte avant application
  • Si plusieurs suggestions concernent la même ligne, les présenter dans l'ordre chronologique (plus ancienne en premier)