pr-triage

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

PR Triage

PR分类审查

Quand utiliser

使用场景

SkillUsageOutput
/pr-triage
Trier, reviewer, commenter les PRsTableau d'action + reviews + commentaires postés
/repo-recap
Récap général pour partager avec l'équipeRésumé Markdown (PRs + issues + releases)
Déclencheurs :
  • Manuellement :
    /pr-triage
    ou
    /pr-triage all
    ou
    /pr-triage 42 57
  • Proactivement : quand >5 PRs ouvertes sans review, ou PR stale >14j détectée

技能使用方式输出结果
/pr-triage
分类、审查、评论PR操作表格 + 审查报告 + 已发布的评论
/repo-recap
生成团队共享的仓库概览Markdown摘要(PR + 问题 + 版本发布)
触发方式 :
  • 手动触发:
    /pr-triage
    /pr-triage all
    /pr-triage 42 57
  • 自动触发:当存在超过5个未审查的开放PR,或检测到超过14天未更新的PR时

Langue

语言设置

  • Vérifier l'argument passé au skill
  • Si
    en
    ou
    english
    → tableaux et résumé en anglais
  • Si
    fr
    ,
    french
    , ou pas d'argument → français (défaut)
  • 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 status
Si 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
undefined
bash
undefined

Identité 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
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)

获取协作者列表(区分内部PR和外部PR)

gh api "repos/{owner}/{repo}/collaborators" --jq '.[].login'

**Fallback collaborateurs** : si `gh api .../collaborators` échoue (403/404) :
```bash
gh api "repos/{owner}/{repo}/collaborators" --jq '.[].login'

**协作者备选方案** : 若`gh api .../collaborators`执行失败(403/404错误):
```bash

Extraire 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 :
LabelAdditions
XS< 50
S50–200
M200–500
L500–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
    /
    unstable
    /
    dirty
  • Reviews : approved / changes_requested / aucune
Liens PR ↔ Issues :
  • Scanner le
    body
    de chaque PR pour
    fixes #N
    ,
    closes #N
    ,
    resolves #N
    (case-insensitive)
  • Si trouvé, afficher dans le tableau :
    Fixes #42
    dans la colonne Action/Status
Caté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 :
  • additions > 1000 OU files > 10
  • OU
    mergeable
    ==
    CONFLICTING
    (conflit de merge)
  • OU CI dirty (statusCheckRollup contient des échecs)
  • OU overlap avec une autre PR ouverte (>50% fichiers communs)
大小分类 :
标签新增代码行数
XS< 50
S50–200
M200–500
L500–1000
XL> 1000
大小格式 :
+{additions}/-{deletions}, {files} files ({label})
检测项 :
  • 重叠检测:比较PR之间的文件列表 — 若超过50%的文件相同,则进行交叉引用
  • 集群检测:同一作者拥有3个以上开放PR → 建议审查顺序(先处理小PR)
  • Stale检测:超过14天无活动 → 标记为"stale"
  • CI状态:通过
    statusCheckRollup
    获取 →
    clean
    /
    unstable
    /
    dirty
  • 审查状态:已批准/需要修改/无审查
PR与问题关联 :
  • 扫描每个PR的
    body
    内容,查找
    fixes #N
    closes #N
    resolves #N
    (不区分大小写)
  • 若找到,则在操作/状态列显示
    Fixes #42
分类 :
内部PR : 作者在协作者列表中
外部PR — 待审查 : 新增代码行数 ≤ 1000 且 文件数 ≤ 10 且
mergeable
CONFLICTING
且 CI状态为clean/unstable
外部PR — 存在问题 : 满足以下任一条件 :
  • 新增代码行数 > 1000 或 文件数 > 10
  • mergeable
    ==
    CONFLICTING
    (存在合并冲突)
  • 或 CI状态为dirty(
    statusCheckRollup
    包含失败项)
  • 或与其他开放PR存在重叠(超过50%的文件相同)

Output — Tableau de triage

输出 — 分类审查表格

undefined
undefined

PRs ouvertes ({count})

开放的PR ({count})

Nos PRs

内部PR

PRTitreTailleCIStatus
PR标题大小CI状态

Externes — Prêtes pour review

外部PR — 待审查

PRAuteurTitreTailleCIReviewsAction
PR作者标题大小CI审查状态操作建议

Externes — Problématiques

外部PR — 存在问题

PRAuteurTitreTailleProblèmeAction 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
undefined

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)

---
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é :
  • "all"
    → toutes les PRs externes
  • Numéros (
    "42 57"
    ) → uniquement ces PRs
  • 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.
若传递参数 :
  • "all"
    → 所有外部PR
  • 编号(
    "42 57"
    )→ 仅这些PR
  • 无参数 → 通过
    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
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 :
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工具并行启动
code-reviewer
Agent:
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}

  运用您的安全防护和后端架构技能进行本次审查。
  此外,需遵循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.md
.
Rè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,使用模板
templates/review-comment.md
生成GitHub评论。
规则 :
  • 语言:英语(面向国际受众)
  • 语气:专业、建设性、客观
  • 始终包含至少一个积极评价点
  • 必要时引用代码行(格式
    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_EOF
Confirmer 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
确认每个发布:
✅ Commentaire posté sur PR #{num}: {title}
(评论已发布到PR #{num}: {title})
若选择"无" →
Aucun commentaire posté. Workflow terminé.
(未发布任何评论。工作流结束)

Gestion des cas limites

边界情况处理

SituationComportement
0 PRs ouvertes
Aucune PR ouverte.
+ terminer
PR en draftIndiquer dans tableau, skip pour review sauf si sélectionnée explicitement
CI inconnuAfficher
?
dans colonne CI
Review agent timeoutAfficher 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/404Fallback sur auteurs des 10 derniers PRs mergés

场景处理方式
无开放PR显示
Aucune PR ouverte.
并结束
草稿PR在表格中标记,除非明确选择,否则跳过审查
CI状态未知在CI列显示
?
审查Agent超时显示部分错误,继续处理其他PR
gh pr diff
无输出
跳过该PR,通知用户
PR规模极大(新增代码>5000行)提示:"部分审查,diff已截断"
协作者API返回403/404回退到最近10个已合并PR的作者列表

Notes

注意事项

  • Toujours dériver owner/repo via
    gh repo view
    , jamais hardcoder
  • Utiliser
    gh
    CLI (pas
    curl
    GitHub API) sauf pour la liste des collaborateurs
  • statusCheckRollup
    peut être null → traiter comme
    ?
  • mergeable
    peut être
    MERGEABLE
    ,
    CONFLICTING
    , ou
    UNKNOWN
    → traiter
    UNKNOWN
    comme
    ?
  • Ne jamais poster sans validation explicite de l'utilisateur dans le chat
  • Les commentaires draftés doivent être visibles AVANT tout
    gh pr comment
  • 始终通过
    gh repo view
    获取owner/repo信息,绝不硬编码
  • 使用
    gh
    CLI(而非
    curl
    调用GitHub API),协作者列表获取除外
  • statusCheckRollup
    可能为null → 视为
    ?
  • mergeable
    可能为
    MERGEABLE
    CONFLICTING
    UNKNOWN
    → 将
    UNKNOWN
    视为
    ?
  • 未经用户在聊天中明确确认,绝不发布评论
  • 草稿评论必须在执行
    gh pr comment
    前可见