Skip to content
Development
Skill

/issue-triage

Issue triage: audit open issues, categorize, detect duplicates, cross-ref PRs, risk assessment, post comments. Args: "all" for deep analysis of all, issue numbers to focus (e.g. "42 57"), "en"/"fr" for language, no arg = audit only in French.

From plugin
rtk
75k12 skills6 agents9 commands
Install
$ npx -y skills add rtk-ai/rtk --skill issue-triage --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/issue-triage

Context preview

The summary Claude sees to decide when to auto-load this skill.

Issue triage: audit open issues, categorize, detect duplicates, cross-ref PRs, risk assessment, post comments. Args: "all" for deep analysis of all, issue numbers to focus (e.g. "42 57"), "en"/"fr" for language, no arg = audit only in French.

SKILL.md

issue-triage.SKILL.md
name: issue-triage
description: >
  Issue triage: audit open issues, categorize, detect duplicates, cross-ref PRs, risk assessment, post comments.
  Args: "all" for deep analysis of all, issue numbers to focus (e.g. "42 57"), "en"/"fr" for language, no arg = audit only in French.
allowed-tools:
  - Bash
  - Read
  - Grep
effort: medium
tags: [triage, issues, github, categorize, duplicates, risk]

Issue Triage

Quand utiliser

| Skill | Usage | Output | |-------|-------|--------| | `/issue-triage` | Trier, analyser, commenter les issues | Tableaux d'action + deep analysis + commentaires postés | | `/repo-recap` | Récap général pour partager avec l'équipe | Résumé Markdown (PRs + issues + releases) |

**Déclencheurs** :

  • Manuellement : `/issue-triage` ou `/issue-triage all` ou `/issue-triage 42 57`
  • Proactivement : quand >10 issues ouvertes sans triage, ou issue stale >30j détectée

---

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 analysis opt-in → commentaires avec validation obligatoire.

Préconditions

git rev-parse --is-inside-work-tree
gh auth status

Si l'un échoue, stop et expliquer ce qui manque.

---

Phase 1 — Audit (toujours exécutée)

Data Gathering (commandes en parallèle)

# Identité du repo
gh repo view --json nameWithOwner -q .nameWithOwner

# Issues ouvertes avec métadonnées complètes
gh issue list --state open --limit 100 \
  --json number,title,author,createdAt,updatedAt,labels,assignees,body,comments

# PRs ouvertes (pour cross-référence)
gh pr list --state open --limit 50 --json number,title,body

# Issues fermées récemment (pour détection doublons)
gh issue list --state closed --limit 20 \
  --json number,title,labels,closedAt

# Collaborateurs (pour protéger les issues des mainteneurs)
gh api "repos/{owner}/{repo}/collaborators" --jq '.[].login'

**Fallback collaborateurs** : si `gh api .../collaborators` échoue (403/404) :

gh pr list --state merged --limit 10 --json author --jq '.[].author.login' | sort -u

Si toujours ambigu, demander à l'utilisateur via `AskUserQuestion`.

**Note** : `author` est un objet `{login: "..."}` — toujours extraire `.author.login`.

Analyse — 6 dimensions

**1. Catégorisation** (labels existants > inférence titre/body) :

  • **Bug** : mots-clés `crash`, `error`, `fail`, `broken`, `regression`, `wrong`, `unexpected`
  • **Feature** : `add`, `implement`, `support`, `new`, `feat:`
  • **Enhancement** : `improve`, `optimize`, `better`, `enhance`, `refactor`
  • **Question/Support** : `how`, `why`, `help`, `unclear`, `docs`, `documentation`
  • **Duplicate Candidate** : voir dimension 3 ci-dessous

**2. Cross-ref PRs** :

  • Scanner `body` de chaque PR ouverte pour `fixes #N`, `closes #N`, `resolves #N` (case-insensitive, regex)
  • Construire un map : `issue_number -> [PR numbers]`
  • Une issue liée à une PR mergée → recommander fermeture

**3. Détection doublons** :

  • Normaliser les titres : lowercase, strip préfixes (`bug:`, `feat:`, `[bug]`, `[feature]`, etc.)
  • **Jaccard sur mots des titres** : si score > 60% entre deux issues → candidat doublon
  • **Keywords body overlap** > 50% → renforcement du signal
  • Comparer aussi avec issues fermées récentes (20 dernières)
  • Un faux positif peut être confirmé/écarté en Phase 2

**4. Classification risque** :

  • **Rouge** : mots-clés `CVE`, `vulnerability`, `injection`, `auth bypass`, `security`, `exploit`, `unsafe`, `credentials`, `leak`, `RCE`, `XSS`
  • **Jaune** : `breaking change`, `migration`, `deprecation`, `remove API`, `breaking`, `incompatible`
  • **Vert** : tout le reste

**5. Staleness** :

  • >30j sans activité (updatedAt) → **Stale**
  • >90j sans activité → **Very Stale**
  • Calculer depuis la date actuelle

**6. Recommandations d'action** :

  • `Accept & Prioritize` : issue claire, reproducible, dans scope
  • `Label needed` : issue sans label
  • `Comment needed` : info manquante, body insuffisant
  • `Linked to PR` : une PR ouverte référence cette issue
  • `Duplicate candidate` : candidat doublon identifié (préciser avec `#N`)
  • `Close candidate` : stale + aucune activité récente, ou hors scope (jamais si auteur est collaborateur)
  • `PR merged → close` : PR liée est mergée, issue encore ouverte

Output — 5 tableaux

## Issues ouvertes ({count})

### Critiques (risque rouge)
| # | Titre | Auteur | Âge | Labels | Action |
| - | ----- | ------ | --- | ------ | ------ |

### Liées à une PR
| # | Titre | Auteur | PR(s) liée(s) | Status PR | Action |
| - | ----- | ------ | ------------- | --------- | ------ |

### Actives
| # | Titre | Auteur | Catégorie | Âge | Labels | Action |
| - | ----- | ------ | --------- | --- | ------ | ------ |

### Doublons candidats
| # | Titre | Doublon de | Similarité | Action |
| - | ----- | ---------- | ---------- | ------ |

### Stale
| # | Titre | Auteur | Dernière activité | Action |
| - | ----- | ------ | ----------------- | ------ |

### Résumé
- Total : {N} issues ouvertes
- Critiques : {N} (risque sécurité ou breaking)
- Liées à PR : {N}
- Doublons candidats : {N}
- Stale (>30j) : {N} | Very Stale (>90j) : {N}
- Sans labels : {N}
- Quick wins (à fermer ou labeler rapidement) : {liste}

0 issues → afficher `Aucune issue ouverte.` et terminer.

**Note** : `Âge` = jours depuis `createdAt`, format `{N}j`. Si >30j, afficher en **gras**.

Copie automatique

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-p

Read more
Ships withrtk

CLI proxy that reduces LLM token consumption by 60-90% on common dev commands. Single Rust binary, zero dependencies

Get the whole plugin