with one click
pr-triage
// PR triage: audit open PRs, deep review selected ones, draft and post review comments. Args: "all" to review all, PR numbers to focus (e.g. "42 57"), "en"/"fr" for language, no arg = audit only in French.
// PR triage: audit open PRs, deep review selected ones, draft and post review comments. Args: "all" to review all, PR numbers to focus (e.g. "42 57"), "en"/"fr" for language, no arg = audit only in French.
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | pr-triage |
| description | PR triage: audit open PRs, deep review selected ones, draft and post review comments. Args: "all" to review all, PR numbers to focus (e.g. "42 57"), "en"/"fr" for language, no arg = audit only in French. |
| allowed-tools | ["Bash","Read","Grep","Glob"] |
| effort | medium |
| tags | ["triage","pr","github","review","code-review","rtk"] |
| Skill | Usage | Output |
|---|---|---|
/pr-triage | Trier, reviewer, commenter les PRs | Tableau d'action + reviews + commentaires postés |
/repo-recap | Récap général pour partager avec l'équipe | Résumé Markdown (PRs + issues + releases) |
Déclencheurs :
/pr-triage ou /pr-triage all ou /pr-triage 42 57en ou english â tableaux et rĂ©sumĂ© en anglaisfr, french, ou pas d'argument â français (dĂ©faut)Workflow en 3 phases : audit automatique â deep review opt-in â commentaires avec validation obligatoire.
git rev-parse --is-inside-work-tree
gh auth status
Si l'un échoue, stop et expliquer ce qui manque.
# Identité du repo
gh repo view --json nameWithOwner -q .nameWithOwner
# PRs ouvertes avec métadonnées complÚtes (ajouter body pour cross-référence issues)
gh pr list --state open --limit 50 \
--json number,title,author,createdAt,updatedAt,additions,deletions,changedFiles,isDraft,mergeable,reviewDecision,statusCheckRollup,body
# Collaborateurs (pour distinguer "nos PRs" des externes)
gh api "repos/{owner}/{repo}/collaborators" --jq '.[].login'
Fallback collaborateurs : si gh api .../collaborators échoue (403/404) :
# Extraire les auteurs des 10 derniers PRs mergés
gh pr list --state merged --limit 10 --json author --jq '.[].author.login' | sort -u
Si toujours ambigu, demander Ă l'utilisateur via AskUserQuestion.
Pour chaque PR, récupérer reviews existantes ET fichiers modifiés :
gh api "repos/{owner}/{repo}/pulls/{num}/reviews" \
--jq '[.[] | .user.login + ":" + .state] | join(", ")'
# Fichiers modifiés (nécessaire pour overlap detection)
gh pr view {num} --json files --jq '[.files[].path] | join(",")'
Note rate-limiting : la rĂ©cupĂ©ration des fichiers est N appels API (1 par PR). Pour repos avec 20+ PRs, prioriser les PRs candidates Ă l'overlap (mĂȘme domaine fonctionnel, mĂȘme auteur).
Note : author est un objet {login: "..."} â toujours extraire .author.login.
Classification taille :
| Label | Additions |
|---|---|
| XS | < 50 |
| S | 50â200 |
| M | 200â500 |
| L | 500â1000 |
| XL | > 1000 |
Format taille : +{additions}/-{deletions}, {files} files ({label})
Détections :
statusCheckRollup â clean / unstable / dirtyLiens PR â Issues :
body de chaque PR pour fixes #N, closes #N, resolves #N (case-insensitive)Fixes #42 dans la colonne Action/StatusCatégorisation :
Nos PRs : auteur dans la liste des collaborateurs
Externes â PrĂȘtes : additions †1000 ET files †10 ET mergeable â CONFLICTING ET CI clean/unstable
Externes â ProblĂ©matiques : un des critĂšres suivants :
mergeable == CONFLICTING (conflit de merge)## PRs ouvertes ({count})
### Nos PRs
| PR | Titre | Taille | CI | Status |
| -- | ----- | ------ | -- | ------ |
### Externes â PrĂȘtes pour review
| PR | Auteur | Titre | Taille | CI | Reviews | Action |
| -- | ------ | ----- | ------ | -- | ------- | ------ |
### Externes â ProblĂ©matiques
| PR | Auteur | Titre | Taille | ProblÚme | Action recommandée |
| -- | ------ | ----- | ------ | -------- | ------------------ |
### Résumé
- Quick wins : {PRs XS/S prĂȘtes Ă merger}
- Risques : {overlaps, tailles XL, CI dirty}
- Clusters : {auteurs avec 3+ PRs}
- Stale : {PRs sans activité >14j}
- Overlaps : {PRs qui touchent les mĂȘmes fichiers}
0 PRs â afficher Aucune PR ouverte. et terminer.
AprĂšs affichage du tableau de triage, copier dans le presse-papier :
# Cross-platform clipboard
clip() {
if command -v pbcopy &>/dev/null; then pbcopy
elif command -v xclip &>/dev/null; then xclip -selection clipboard
elif command -v wl-copy &>/dev/null; then wl-copy
else cat
fi
}
clip <<'EOF'
{tableau de triage complet}
EOF
Confirmer : Tableau copié dans le presse-papier. (FR) / Triage table copied to clipboard. (EN)
Si argument passé :
"all" â toutes les PRs externes"42 57") â uniquement ces PRsAskUserQuestionSi pas d'argument, afficher :
question: "Quelles PRs voulez-vous reviewer en profondeur ?"
header: "Deep Review"
multiSelect: true
options:
- label: "Toutes les externes"
description: "Review {N} PRs externes avec agents code-reviewer en parallĂšle"
- label: "Problématiques uniquement"
description: "Focus sur les {M} PRs Ă risque (CI dirty, trop large, overlaps)"
- label: "PrĂȘtes uniquement"
description: "Review {K} PRs prĂȘtes Ă merger"
- label: "Passer"
description: "Terminer ici â juste l'audit"
Note sur les drafts :
42)Si "Passer" â fin du workflow.
Pour chaque PR sélectionnée, lancer un agent code-reviewer via Task tool en parallÚle :
subagent_type: code-reviewer
model: sonnet
prompt: |
Review PR #{num}: "{title}" by @{author}
**Metadata**: +{additions}/-{deletions}, {changedFiles} files ({size_label})
**CI**: {ci_status} | **Reviews**: {existing_reviews} | **Draft**: {isDraft}
**PR Body**:
{body}
**Diff**:
{gh pr diff {num} output}
Apply your security-guardian and backend-architect skills for this review.
Additionally, apply the RTK-specific checklist:
- lazy_static! regex (no inline Regex::new())
- anyhow::Result + .context() (no unwrap())
- Fallback to raw command on filter failure
- Exit code propagation
- Token savings â„60% in tests with real fixtures
- No async/tokio dependencies
Return structured review:
### Critical Issues đŽ
### Important Issues đĄ
### Suggestions đą
### What's Good â
Be specific: quote the file:line, explain why it's an issue, suggest the fix.
Récupérer le diff via :
gh pr diff {num}
gh pr view {num} --json body,title,author -q '{body: .body, title: .title, author: .author.login}'
Agréger tous les rapports. Afficher un résumé aprÚs toutes les reviews.
Pour chaque PR reviewée, générer un commentaire GitHub en utilisant le template templates/review-comment.md.
RĂšgles :
file.rs:42)Afficher TOUS les commentaires draftés au format :
---
### Draft â PR #{num}: {title}
{commentaire complet}
---
Puis demander validation via AskUserQuestion :
question: "Ces commentaires sont prĂȘts. Lesquels voulez-vous poster ?"
header: "Poster"
multiSelect: true
options:
- label: "Tous ({N} commentaires)"
description: "Poster sur toutes les PRs reviewées"
- label: "PR #{x} â {title_truncated}"
description: "Poster uniquement sur cette PR"
- label: "Aucun"
description: "Annuler â ne rien poster"
(Générer une option par PR + "Tous" + "Aucun")
Pour chaque commentaire validé :
gh pr comment {num} --body-file - <<'REVIEW_EOF'
{commentaire}
REVIEW_EOF
Confirmer chaque post : â
Commentaire posté sur PR #{num}: {title}
Si "Aucun" â Aucun commentaire postĂ©. Workflow terminĂ©.
| Situation | Comportement |
|---|---|
| 0 PRs ouvertes | Aucune PR ouverte. + terminer |
| PR en draft | Indiquer dans tableau, skip pour review sauf si sélectionnée explicitement |
| CI inconnu | Afficher ? dans colonne CI |
| Review agent timeout | Afficher erreur partielle, continuer avec les autres |
gh pr diff vide | Skip cette PR, notifier l'utilisateur |
| PR trÚs large (>5000 additions) | Avertir : "Review partielle, diff tronqué" |
| Collaborateurs API 403/404 | Fallback sur auteurs des 10 derniers PRs mergés |
gh repo view, jamais hardcodergh CLI (pas curl GitHub API) sauf pour la liste des collaborateursstatusCheckRollup peut ĂȘtre null â traiter comme ?mergeable peut ĂȘtre MERGEABLE, CONFLICTING, ou UNKNOWN â traiter UNKNOWN comme ?gh pr comment