pr-triage
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePR Triage
PR分类审查
Quand utiliser
使用场景
| Skill | Usage | Output |
|---|---|---|
| Trier, reviewer, commenter les PRs | Tableau d'action + reviews + commentaires postés |
| Récap général pour partager avec l'équipe | Résumé Markdown (PRs + issues + releases) |
Déclencheurs :
- Manuellement : ou
/pr-triageou/pr-triage all/pr-triage 42 57 - Proactivement : quand >5 PRs ouvertes sans review, ou PR stale >14j détectée
| 技能 | 使用方式 | 输出结果 |
|---|---|---|
| 分类、审查、评论PR | 操作表格 + 审查报告 + 已发布的评论 |
| 生成团队共享的仓库概览 | Markdown摘要(PR + 问题 + 版本发布) |
触发方式 :
- 手动触发:或
/pr-triage或/pr-triage all/pr-triage 42 57 - 自动触发:当存在超过5个未审查的开放PR,或检测到超过14天未更新的PR时
Langue
语言设置
- Vérifier l'argument passé au skill
- Si ou
en→ tableaux et résumé en anglaisenglish - Si ,
fr, ou pas d'argument → français (défaut)french - Note : les commentaires GitHub (Phase 3) restent TOUJOURS en anglais (audience internationale)
Workflow en 3 phases : audit automatique → deep review opt-in → commentaires avec validation obligatoire.
- 检查传递给技能的参数
- 若为或
en→ 表格和摘要使用英文english - 若为、
fr或无参数 → 使用法语(默认)french - 注意:GitHub评论(第三阶段)始终使用英文(面向国际受众)
三阶段工作流:自动审核 → 可选深度审查 → 需确认的评论发布
Préconditions
前置条件
bash
git rev-parse --is-inside-work-tree
gh auth statusSi l'un échoue, stop et expliquer ce qui manque.
bash
git rev-parse --is-inside-work-tree
gh auth status若任一命令失败,则停止并说明缺失的条件。
Phase 1 — Audit (toujours exécutée)
第一阶段 — 审核(始终执行)
Data Gathering (commandes en parallèle)
数据收集(并行执行命令)
bash
undefinedbash
undefinedIdentité du repo
仓库标识
gh repo view --json nameWithOwner -q .nameWithOwner
gh repo view --json nameWithOwner -q .nameWithOwner
PRs ouvertes avec métadonnées complètes (ajouter body pour cross-référence issues)
获取带完整元数据的开放PR(添加body字段用于关联问题)
gh pr list --state open --limit 50
--json number,title,author,createdAt,updatedAt,additions,deletions,changedFiles,isDraft,mergeable,reviewDecision,statusCheckRollup,body
--json number,title,author,createdAt,updatedAt,additions,deletions,changedFiles,isDraft,mergeable,reviewDecision,statusCheckRollup,body
gh pr list --state open --limit 50
--json number,title,author,createdAt,updatedAt,additions,deletions,changedFiles,isDraft,mergeable,reviewDecision,statusCheckRollup,body
--json number,title,author,createdAt,updatedAt,additions,deletions,changedFiles,isDraft,mergeable,reviewDecision,statusCheckRollup,body
Collaborateurs (pour distinguer "nos PRs" des externes)
获取协作者列表(区分内部PR和外部PR)
gh api "repos/{owner}/{repo}/collaborators" --jq '.[].login'
**Fallback collaborateurs** : si `gh api .../collaborators` échoue (403/404) :
```bashgh api "repos/{owner}/{repo}/collaborators" --jq '.[].login'
**协作者备选方案** : 若`gh api .../collaborators`执行失败(403/404错误):
```bashExtraire les auteurs des 10 derniers PRs mergés
提取最近10个已合并PR的作者
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 :
```bash
gh api "repos/{owner}/{repo}/pulls/{num}/reviews" \
--jq '[.[] | .user.login + ":" + .state] | join(", ")'gh pr list --state merged --limit 10 --json author --jq '.[].author.login' | sort -u
若仍存在歧义,则通过`AskUserQuestion`询问用户。
针对每个PR,获取现有审查记录和修改的文件:
```bash
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`.gh pr view {num} --json files --jq '[.files[].path] | join(",")'
**速率限制说明** : 文件获取需要N次API调用(每个PR一次)。对于拥有20个以上PR的仓库,优先处理可能存在重叠的PR(相同功能领域、相同作者)。
**注意** : `author`是一个`{login: "..."}`对象 — 始终提取`.author.login`字段。Analyse
分析
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 :
- Overlaps : comparer les listes de fichiers entre PRs — si >50% de fichiers en commun → cross-reference
- Clusters : auteur avec 3+ PRs ouvertes → suggérer ordre de review (plus petite en premier)
- Staleness : aucune activité depuis >14j → flag "stale"
- CI status : via →
statusCheckRollup/clean/unstabledirty - Reviews : approved / changes_requested / aucune
Liens PR ↔ Issues :
- Scanner le de chaque PR pour
body,fixes #N,closes #N(case-insensitive)resolves #N - Si trouvé, afficher dans le tableau : dans la colonne Action/Status
Fixes #42
Catégorisation :
Nos PRs : auteur dans la liste des collaborateurs
Externes — Prêtes : additions ≤ 1000 ET files ≤ 10 ET ≠ ET CI clean/unstable
mergeableCONFLICTINGExternes — Problématiques : un des critères suivants :
- additions > 1000 OU files > 10
- OU ==
mergeable(conflit de merge)CONFLICTING - OU CI dirty (statusCheckRollup contient des échecs)
- OU overlap avec une autre PR ouverte (>50% fichiers communs)
大小分类 :
| 标签 | 新增代码行数 |
|---|---|
| XS | < 50 |
| S | 50–200 |
| M | 200–500 |
| L | 500–1000 |
| XL | > 1000 |
大小格式 :
+{additions}/-{deletions}, {files} files ({label})检测项 :
- 重叠检测:比较PR之间的文件列表 — 若超过50%的文件相同,则进行交叉引用
- 集群检测:同一作者拥有3个以上开放PR → 建议审查顺序(先处理小PR)
- Stale检测:超过14天无活动 → 标记为"stale"
- CI状态:通过获取 →
statusCheckRollup/clean/unstabledirty - 审查状态:已批准/需要修改/无审查
PR与问题关联 :
- 扫描每个PR的内容,查找
body、fixes #N、closes #N(不区分大小写)resolves #N - 若找到,则在操作/状态列显示
Fixes #42
分类 :
内部PR : 作者在协作者列表中
外部PR — 待审查 : 新增代码行数 ≤ 1000 且 文件数 ≤ 10 且 ≠ 且 CI状态为clean/unstable
mergeableCONFLICTING外部PR — 存在问题 : 满足以下任一条件 :
- 新增代码行数 > 1000 或 文件数 > 10
- 或 ==
mergeable(存在合并冲突)CONFLICTING - 或 CI状态为dirty(包含失败项)
statusCheckRollup - 或与其他开放PR存在重叠(超过50%的文件相同)
Output — Tableau de triage
输出 — 分类审查表格
undefinedundefinedPRs ouvertes ({count})
开放的PR ({count})
Nos PRs
内部PR
| PR | Titre | Taille | CI | Status |
|---|
| PR | 标题 | 大小 | CI | 状态 |
|---|
Externes — Prêtes pour review
外部PR — 待审查
| PR | Auteur | Titre | Taille | CI | Reviews | Action |
|---|
| PR | 作者 | 标题 | 大小 | CI | 审查状态 | 操作建议 |
|---|
Externes — Problématiques
外部PR — 存在问题
| PR | Auteur | Titre | Taille | Problème | Action recommandée |
|---|
| PR | 作者 | 标题 | 大小 | 问题 | 建议操作 |
|---|
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.- 快速处理项 : {可合并的XS/S级PR}
- 风险项 : {重叠PR、XL级PR、CI失败PR}
- 集群项 : {拥有3个以上PR的作者}
- Stale项 : {超过14天无活动的PR}
- 重叠项 : {涉及相同文件的PR}
若无PR,则显示`Aucune PR ouverte.`(无开放PR)并结束流程。Copie automatique
自动复制
Après affichage du tableau de triage, copier dans le presse-papier :
bash
undefined显示分类审查表格后,将其复制到剪贴板:
bash
undefinedCross-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)
---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'
{完整的分类审查表格}
EOF
确认提示 : `Tableau copié dans le presse-papier.`(法语)/ `Triage table copied to clipboard.`(英语)
---Phase 2 — Deep Review (opt-in)
第二阶段 — 深度审查(可选)
Sélection des PRs
PR选择
Si argument passé :
- → toutes les PRs externes
"all" - Numéros () → uniquement ces PRs
"42 57" - Pas d'argument → proposer via
AskUserQuestion
Si 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 :
- Les PRs en draft sont EXCLUES des options "Toutes les externes" et "Prêtes uniquement"
- Les PRs en draft sont INCLUSES dans "Problématiques uniquement" (car elles nécessitent attention)
- Pour reviewer un draft : taper son numéro explicitement (ex: )
42
Si "Passer" → fin du workflow.
若传递参数 :
- → 所有外部PR
"all" - 编号()→ 仅这些PR
"42 57" - 无参数 → 通过提供选项
AskUserQuestion
若无参数,则显示:
question: "您想要深度审查哪些PR?"
header: "Deep Review"
multiSelect: true
options:
- label: "所有外部PR"
description: "使用代码审查Agent并行审查{N}个外部PR"
- label: "仅存在问题的PR"
description: "聚焦{M}个高风险PR(CI失败、规模过大、存在重叠)"
- label: "仅待审查PR"
description: "审查{K}个可合并的PR"
- label: "跳过"
description: "结束流程 — 仅完成审核"草稿PR说明 :
- 草稿PR被排除在"所有外部PR"和"仅待审查PR"选项之外
- 草稿PR被包含在"仅存在问题的PR"选项中(因为它们需要关注)
- 若要审查草稿PR:需明确输入其编号(例如)
42
若选择"跳过" → 结束工作流。
Exécution des Reviews
审查执行
Pour chaque PR sélectionnée, lancer un agent via Task tool en parallèle :
code-reviewersubagent_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 :
bash
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.
针对每个选定的PR,通过Task工具并行启动 Agent:
code-reviewersubagent_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}
运用您的安全防护和后端架构技能进行本次审查。
此外,需遵循RTK专属检查清单:
- lazy_static! regex (no inline Regex::new())
- anyhow::Result + .context() (no unwrap())
- 过滤失败时回退到原始命令
- 退出码传递
- 使用真实测试用例时,Token节省≥60%
- No async/tokio dependencies
返回结构化审查报告:
### Critical Issues 🔴
### Important Issues 🟡
### Suggestions 🟢
### What's Good ✅
请具体说明:引用文件:行号,解释问题原因,并提出修复建议。通过以下方式获取diff:
bash
gh pr diff {num}
gh pr view {num} --json body,title,author -q '{body: .body, title: .title, author: .author.login}'汇总所有审查报告。完成所有审查后显示摘要。
Phase 3 — Commentaires (validation obligatoire)
第三阶段 — 评论发布(需确认)
Génération des drafts
草稿生成
Pour chaque PR reviewée, générer un commentaire GitHub en utilisant le template .
templates/review-comment.mdRègles :
- Langue : anglais (audience internationale)
- Ton : professionnel, constructif, factuel
- Toujours inclure au moins 1 point positif
- Citer les lignes de code quand pertinent (format )
file.rs:42
针对每个已审查的PR,使用模板生成GitHub评论。
templates/review-comment.md规则 :
- 语言:英语(面向国际受众)
- 语气:专业、建设性、客观
- 始终包含至少一个积极评价点
- 必要时引用代码行(格式)
file.rs:42
Affichage et validation
显示与确认
Afficher TOUS les commentaires draftés au format :
---以以下格式显示所有草稿评论:
---Draft — PR #{num}: {title}
草稿 — 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"){完整评论内容}
然后通过`AskUserQuestion`请求确认:
question: "这些评论已准备就绪。您想要发布哪些?"
header: "发布"
multiSelect: true
options:
- label: "全部({N}条评论)" description: "发布到所有已审查的PR"
- label: "PR #{x} — {title_truncated}" description: "仅发布到该PR"
- label: "无" description: "取消 — 不发布任何评论"
(为每个PR生成一个选项 + "全部" + "无")Posting
发布
Pour chaque commentaire validé :
bash
gh pr comment {num} --body-file - <<'REVIEW_EOF'
{commentaire}
REVIEW_EOFConfirmer chaque post :
✅ Commentaire posté sur PR #{num}: {title}Si "Aucun" →
Aucun commentaire posté. Workflow terminé.针对每个确认发布的评论:
bash
gh pr comment {num} --body-file - <<'REVIEW_EOF'
{评论内容}
REVIEW_EOF确认每个发布:(评论已发布到PR #{num}: {title})
✅ Commentaire posté sur PR #{num}: {title}若选择"无" → (未发布任何评论。工作流结束)
Aucun commentaire posté. Workflow terminé.Gestion des cas limites
边界情况处理
| Situation | Comportement |
|---|---|
| 0 PRs ouvertes | |
| PR en draft | Indiquer dans tableau, skip pour review sauf si sélectionnée explicitement |
| CI inconnu | Afficher |
| Review agent timeout | Afficher erreur partielle, continuer avec les autres |
| 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 |
| 场景 | 处理方式 |
|---|---|
| 无开放PR | 显示 |
| 草稿PR | 在表格中标记,除非明确选择,否则跳过审查 |
| CI状态未知 | 在CI列显示 |
| 审查Agent超时 | 显示部分错误,继续处理其他PR |
| 跳过该PR,通知用户 |
| PR规模极大(新增代码>5000行) | 提示:"部分审查,diff已截断" |
| 协作者API返回403/404 | 回退到最近10个已合并PR的作者列表 |
Notes
注意事项
- Toujours dériver owner/repo via , jamais hardcoder
gh repo view - Utiliser CLI (pas
ghGitHub API) sauf pour la liste des collaborateurscurl - peut être null → traiter comme
statusCheckRollup? - peut être
mergeable,MERGEABLE, ouCONFLICTING→ traiterUNKNOWNcommeUNKNOWN? - Ne jamais poster sans validation explicite de l'utilisateur dans le chat
- Les commentaires draftés doivent être visibles AVANT tout
gh pr comment
- 始终通过获取owner/repo信息,绝不硬编码
gh repo view - 使用CLI(而非
gh调用GitHub API),协作者列表获取除外curl - 可能为null → 视为
statusCheckRollup? - 可能为
mergeable、MERGEABLE或CONFLICTING→ 将UNKNOWN视为UNKNOWN? - 未经用户在聊天中明确确认,绝不发布评论
- 草稿评论必须在执行前可见
gh pr comment