[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C55PB2B52ADBYHV6H0NMHD":3,"skill-same:01M6C55PB2B52ADBYHV6H0NMHD":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":51,"install":52,"resources":65},"01M6C55PB2B52ADBYHV6H0NMHD","pr-triage",null,"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\"\u002F\"fr\" for language, no arg = audit only in French.","MDMAtk\u002FTormentNexus","MDMAtk","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F288684999?v=4","01M6C54H4AG0BYB3HTFA4C0CBJ","01M6C54H8146YDG94N9KWXV521",13,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fpr-triage\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],"triage","pr","pr triage","review","github","code","code-review","deep review","audit","open","Bash","grep","read","only","rtk","2026-11-10 10:12:30",false,"---\nname: pr-triage\ndescription: >\n  PR triage: audit open PRs, deep review selected ones, draft and post review comments.\n  Args: \"all\" to review all, PR numbers to focus (e.g. \"42 57\"), \"en\"\u002F\"fr\" for language, no arg = audit only in French.\nallowed-tools:\n  - Bash\n  - Read\n  - Grep\n  - Glob\neffort: medium\ntags: [triage, pr, github, review, code-review, rtk]\n---\n\n# PR Triage\n\n## Quand utiliser\n\n| Skill | Usage | Output |\n|-------|-------|--------|\n| `\u002Fpr-triage` | Trier, reviewer, commenter les PRs | Tableau d'action + reviews + commentaires postés |\n| `\u002Frepo-recap` | Récap général pour partager avec l'équipe | Résumé Markdown (PRs + issues + releases) |\n\n**Déclencheurs** :\n- Manuellement : `\u002Fpr-triage` ou `\u002Fpr-triage all` ou `\u002Fpr-triage 42 57`\n- Proactivement : quand >5 PRs ouvertes sans review, ou PR stale >14j détectée\n\n---\n\n## Langue\n\n- Vérifier l'argument passé au skill\n- Si `en` ou `english` → tableaux et résumé en anglais\n- Si `fr`, `french`, ou pas d'argument → français (défaut)\n- Note : les commentaires GitHub (Phase 3) restent TOUJOURS en anglais (audience internationale)\n\n---\n\nWorkflow en 3 phases : audit automatique → deep review opt-in → commentaires avec validation obligatoire.\n\n## Préconditions\n\n```bash\ngit rev-parse --is-inside-work-tree\ngh auth status\n```\n\nSi l'un échoue, stop et expliquer ce qui manque.\n\n---\n\n## Phase 1 — Audit (toujours exécutée)\n\n### Data Gathering (commandes en parallèle)\n\n```bash\n# Identité du repo\ngh repo view --json nameWithOwner -q .nameWithOwner\n\n# PRs ouvertes avec métadonnées complètes (ajouter body pour cross-référence issues)\ngh pr list --state open --limit 50 \\\n  --json number,title,author,createdAt,updatedAt,additions,deletions,changedFiles,isDraft,mergeable,reviewDecision,statusCheckRollup,body\n\n# Collaborateurs (pour distinguer \"nos PRs\" des externes)\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fcollaborators\" --jq '.[].login'\n```\n\n**Fallback collaborateurs** : si `gh api ...\u002Fcollaborators` échoue (403\u002F404) :\n```bash\n# Extraire les auteurs des 10 derniers PRs mergés\ngh pr list --state merged --limit 10 --json author --jq '.[].author.login' | sort -u\n```\nSi toujours ambigu, demander à l'utilisateur via `AskUserQuestion`.\n\nPour chaque PR, récupérer reviews existantes ET fichiers modifiés :\n\n```bash\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fpulls\u002F{num}\u002Freviews\" \\\n  --jq '[.[] | .user.login + \":\" + .state] | join(\", \")'\n\n# Fichiers modifiés (nécessaire pour overlap detection)\ngh pr view {num} --json files --jq '[.files[].path] | join(\",\")'\n```\n\n**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).\n\n**Note** : `author` est un objet `{login: \"...\"}` — toujours extraire `.author.login`.\n\n### Analyse\n\n**Classification taille** :\n| Label | Additions |\n|-------|-----------|\n| XS | \u003C 50 |\n| S | 50–200 |\n| M | 200–500 |\n| L | 500–1000 |\n| XL | > 1000 |\n\nFormat taille : `+{additions}\u002F-{deletions}, {files} files ({label})`\n\n**Détections** :\n- **Overlaps** : comparer les listes de fichiers entre PRs — si >50% de fichiers en commun → cross-reference\n- **Clusters** : auteur avec 3+ PRs ouvertes → suggérer ordre de review (plus petite en premier)\n- **Staleness** : aucune activité depuis >14j → flag \"stale\"\n- **CI status** : via `statusCheckRollup` → `clean` \u002F `unstable` \u002F `dirty`\n- **Reviews** : approved \u002F changes_requested \u002F aucune\n\n**Liens PR ↔ Issues** :\n- Scanner le `body` de chaque PR pour `fixes #N`, `closes #N`, `resolves #N` (case-insensitive)\n- Si trouvé, afficher dans le tableau : `Fixes #42` dans la colonne Action\u002FStatus\n\n**Catégorisation** :\n\n_Nos PRs_ : auteur dans la liste des collaborateurs\n\n_Externes — Prêtes_ : additions ≤ 1000 ET files ≤ 10 ET `mergeable` ≠ `CONFLICTING` ET CI clean\u002Funstable\n\n_Externes — Problématiques_ : un des critères suivants :\n- additions > 1000 OU files > 10\n- OU `mergeable` == `CONFLICTING` (conflit de merge)\n- OU CI dirty (statusCheckRollup contient des échecs)\n- OU overlap avec une autre PR ouverte (>50% fichiers communs)\n\n### Output — Tableau de triage\n\n```\n## PRs ouvertes ({count})\n\n### Nos PRs\n| PR | Titre | Taille | CI | Status |\n| -- | ----- | ------ | -- | ------ |\n\n### Externes — Prêtes pour review\n| PR | Auteur | Titre | Taille | CI | Reviews | Action |\n| -- | ------ | ----- | ------ | -- | ------- | ------ |\n\n### Externes — Problématiques\n| PR | Auteur | Titre | Taille | Problème | Action recommandée |\n| -- | ------ | ----- | ------ | -------- | ------------------ |\n\n### Résumé\n- Quick wins : {PRs XS\u002FS prêtes à merger}\n- Risques : {overlaps, tailles XL, CI dirty}\n- Clusters : {auteurs avec 3+ PRs}\n- Stale : {PRs sans activité >14j}\n- Overlaps : {PRs qui touchent les mêmes fichiers}\n```\n\n0 PRs → afficher `Aucune PR ouverte.` et terminer.\n\n### Copie automatique\n\nAprès affichage du tableau de triage, copier dans le presse-papier :\n```bash\n# Cross-platform clipboard\nclip() {\n  if command -v pbcopy &>\u002Fdev\u002Fnull; then pbcopy\n  elif command -v xclip &>\u002Fdev\u002Fnull; then xclip -selection clipboard\n  elif command -v wl-copy &>\u002Fdev\u002Fnull; then wl-copy\n  else cat\n  fi\n}\n\nclip \u003C\u003C'EOF'\n{tableau de triage complet}\nEOF\n```\nConfirmer : `Tableau copié dans le presse-papier.` (FR) \u002F `Triage table copied to clipboard.` (EN)\n\n---\n\n## Phase 2 — Deep Review (opt-in)\n\n### Sélection des PRs\n\n**Si argument passé** :\n- `\"all\"` → toutes les PRs externes\n- Numéros (`\"42 57\"`) → uniquement ces PRs\n- Pas d'argument → proposer via `AskUserQuestion`\n\n**Si pas d'argument**, afficher :\n\n```\nquestion: \"Quelles PRs voulez-vous reviewer en profondeur ?\"\nheader: \"Deep Review\"\nmultiSelect: true\noptions:\n  - label: \"Toutes les externes\"\n    description: \"Review {N} PRs externes avec agents code-reviewer en parallèle\"\n  - label: \"Problématiques uniquement\"\n    description: \"Focus sur les {M} PRs à risque (CI dirty, trop large, overlaps)\"\n  - label: \"Prêtes uniquement\"\n    description: \"Review {K} PRs prêtes à merger\"\n  - label: \"Passer\"\n    description: \"Terminer ici — juste l'audit\"\n```\n\n**Note sur les drafts** :\n- Les PRs en draft sont EXCLUES des options \"Toutes les externes\" et \"Prêtes uniquement\"\n- Les PRs en draft sont INCLUSES dans \"Problématiques uniquement\" (car elles nécessitent attention)\n- Pour reviewer un draft : taper son numéro explicitement (ex: `42`)\n\nSi \"Passer\" → fin du workflow.\n\n### Exécution des Reviews\n\nPour chaque PR sélectionnée, lancer un agent `code-reviewer` via **Task tool en parallèle** :\n\n```\nsubagent_type: code-reviewer\nmodel: sonnet\nprompt: |\n  Review PR #{num}: \"{title}\" by @{author}\n\n  **Metadata**: +{additions}\u002F-{deletions}, {changedFiles} files ({size_label})\n  **CI**: {ci_status} | **Reviews**: {existing_reviews} | **Draft**: {isDraft}\n\n  **PR Body**:\n  {body}\n\n  **Diff**:\n  {gh pr diff {num} output}\n\n  Apply your security-guardian and backend-architect skills for this review.\n  Additionally, apply the RTK-specific checklist:\n  - lazy_static! regex (no inline Regex::new())\n  - anyhow::Result + .context() (no unwrap())\n  - Fallback to raw command on filter failure\n  - Exit code propagation\n  - Token savings ≥60% in tests with real fixtures\n  - No async\u002Ftokio dependencies\n\n  Return structured review:\n  ### Critical Issues ?\n  ### Important Issues ?\n  ### Suggestions ?\n  ### What's Good ✅\n\n  Be specific: quote the file:line, explain why it's an issue, suggest the fix.\n```\n\nRécupérer le diff via :\n```bash\ngh pr diff {num}\ngh pr view {num} --json body,title,author -q '{body: .body, title: .title, author: .author.login}'\n```\n\nAgréger tous les rapports. Afficher un résumé après toutes les reviews.\n\n---\n\n## Phase 3 — Commentaires (validation obligatoire)\n\n### Génération des drafts\n\nPour chaque PR reviewée, générer un commentaire GitHub en utilisant le template `templates\u002Freview-comment.md`.\n\n**Règles** :\n- Langue : **anglais** (audience internationale)\n- Ton : professionnel, constructif, factuel\n- Toujours inclure au moins 1 point positif\n- Citer les lignes de code quand pertinent (format `file.rs:42`)\n\n### Affichage et validation\n\n**Afficher TOUS les commentaires draftés** au format :\n\n```\n---\n### Draft — PR #{num}: {title}\n\n{commentaire complet}\n\n---\n```\n\nPuis demander validation via `AskUserQuestion` :\n\n```\nquestion: \"Ces commentaires sont prêts. Lesquels voulez-vous poster ?\"\nheader: \"Poster\"\nmultiSelect: true\noptions:\n  - label: \"Tous ({N} commentaires)\"\n    description: \"Poster sur toutes les PRs reviewées\"\n  - label: \"PR #{x} — {title_truncated}\"\n    description: \"Poster uniquement sur cette PR\"\n  - label: \"Aucun\"\n    description: \"Annuler — ne rien poster\"\n```\n\n(Générer une option par PR + \"Tous\" + \"Aucun\")\n\n### Posting\n\nPour chaque commentaire validé :\n\n```bash\ngh pr comment {num} --body-file - \u003C\u003C'REVIEW_EOF'\n{commentaire}\nREVIEW_EOF\n```\n\nConfirmer chaque post : `✅ Commentaire posté sur PR #{num}: {title}`\n\nSi \"Aucun\" → `Aucun commentaire posté. Workflow terminé.`\n\n---\n\n## Gestion des cas limites\n\n| Situation | Comportement |\n|-----------|--------------|\n| 0 PRs ouvertes | `Aucune PR ouverte.` + terminer |\n| PR en draft | Indiquer dans tableau, skip pour review sauf si sélectionnée explicitement |\n| CI inconnu | Afficher `?` dans colonne CI |\n| Review agent timeout | Afficher erreur partielle, continuer avec les autres |\n| `gh pr diff` vide | Skip cette PR, notifier l'utilisateur |\n| PR très large (>5000 additions) | Avertir : \"Review partielle, diff tronqué\" |\n| Collaborateurs API 403\u002F404 | Fallback sur auteurs des 10 derniers PRs mergés |\n\n---\n\n## Notes\n\n- Toujours dériver owner\u002Frepo via `gh repo view`, jamais hardcoder\n- Utiliser `gh` CLI (pas `curl` GitHub API) sauf pour la liste des collaborateurs\n- `statusCheckRollup` peut être null → traiter comme `?`\n- `mergeable` peut être `MERGEABLE`, `CONFLICTING`, ou `UNKNOWN` → traiter `UNKNOWN` comme `?`\n- Ne jamais poster sans validation explicite de l'utilisateur dans le chat\n- Les commentaires draftés doivent être visibles AVANT tout `gh pr comment`\n","# PR Triage\n\n## Quand utiliser\n\n| Skill | Usage | Output |\n|-------|-------|--------|\n| `\u002Fpr-triage` | Trier, reviewer, commenter les PRs | Tableau d'action + reviews + commentaires postés |\n| `\u002Frepo-recap` | Récap général pour partager avec l'équipe | Résumé Markdown (PRs + issues + releases) |\n\n**Déclencheurs** :\n- Manuellement : `\u002Fpr-triage` ou `\u002Fpr-triage all` ou `\u002Fpr-triage 42 57`\n- Proactivement : quand >5 PRs ouvertes sans review, ou PR stale >14j détectée\n\n---\n\n## Langue\n\n- Vérifier l'argument passé au skill\n- Si `en` ou `english` → tableaux et résumé en anglais\n- Si `fr`, `french`, ou pas d'argument → français (défaut)\n- Note : les commentaires GitHub (Phase 3) restent TOUJOURS en anglais (audience internationale)\n\n---\n\nWorkflow en 3 phases : audit automatique → deep review opt-in → commentaires avec validation obligatoire.\n\n## Préconditions\n\n```bash\ngit rev-parse --is-inside-work-tree\ngh auth status\n```\n\nSi l'un échoue, stop et expliquer ce qui manque.\n\n---\n\n## Phase 1 — Audit (toujours exécutée)\n\n### Data Gathering (commandes en parallèle)\n\n```bash\n# Identité du repo\ngh repo view --json nameWithOwner -q .nameWithOwner\n\n# PRs ouvertes avec métadonnées complètes (ajouter body pour cross-référence issues)\ngh pr list --state open --limit 50 \\\n  --json number,title,author,createdAt,updatedAt,additions,deletions,changedFiles,isDraft,mergeable,reviewDecision,statusCheckRollup,body\n\n# Collaborateurs (pour distinguer \"nos PRs\" des externes)\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fcollaborators\" --jq '.[].login'\n```\n\n**Fallback collaborateurs** : si `gh api ...\u002Fcollaborators` échoue (403\u002F404) :\n```bash\n# Extraire les auteurs des 10 derniers PRs mergés\ngh pr list --state merged --limit 10 --json author --jq '.[].author.login' | sort -u\n```\nSi toujours ambigu, demander à l'utilisateur via `AskUserQuestion`.\n\nPour chaque PR, récupérer reviews existantes ET fichiers modifiés :\n\n```bash\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fpulls\u002F{num}\u002Freviews\" \\\n  --jq '[.[] | .user.login + \":\" + .state] | join(\", \")'\n\n# Fichiers modifiés (nécessaire pour overlap detection)\ngh pr view {num} --json files --jq '[.files[].path] | join(\",\")'\n```\n\n**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).\n\n**Note** : `author` est un objet `{login: \"...\"}` — toujours extraire `.author.login`.\n\n### Analyse\n\n**Classification taille** :\n| Label | Additions |\n|-------|-----------|\n| XS | \u003C 50 |\n| S | 50–200 |\n| M | 200–500 |\n| L | 500–1000 |\n| XL | > 1000 |\n\nFormat taille : `+{additions}\u002F-{deletions}, {files} files ({label})`\n\n**Détections** :\n- **Overlaps** : comparer les listes de fichiers entre PRs — si >50% de fichiers en commun → cross-reference\n- **Clusters** : auteur avec 3+ PRs ouvertes → suggérer ordre de review (plus petite en premier)\n- **Staleness** : aucune activité depuis >14j → flag \"stale\"\n- **CI status** : via `statusCheckRollup` → `clean` \u002F `unstable` \u002F `dirty`\n- **Reviews** : approved \u002F changes_requested \u002F aucune\n\n**Liens PR ↔ Issues** :\n- Scanner le `body` de chaque PR pour `fixes #N`, `closes #N`, `resolves #N` (case-insensitive)\n- Si trouvé, afficher dans le tableau : `Fixes #42` dans la colonne Action\u002FStatus\n\n**Catégorisation** :\n\n_Nos PRs_ : auteur dans la liste des collaborateurs\n\n_Externes — Prêtes_ : additions ≤ 1000 ET files ≤ 10 ET `mergeable` ≠ `CONFLICTING` ET CI clean\u002Funstable\n\n_Externes — Problématiques_ : un des critères suivants :\n- additions > 1000 OU files > 10\n- OU `mergeable` == `CONFLICTING` (conflit de merge)\n- OU CI dirty (statusCheckRollup contient des échecs)\n- OU overlap avec une autre PR ouverte (>50% fichiers communs)\n\n### Output — Tableau de triage\n\n```\n## PRs ouvertes ({count})\n\n### Nos PRs\n| PR | Titre | Taille | CI | Status |\n| -- | ----- | ------ | -- | ------ |\n\n### Externes — Prêtes pour review\n| PR | Auteur | Titre | Taille | CI | Reviews | Action |\n| -- | ------ | ----- | ------ | -- | ------- | ------ |\n\n### Externes — Problématiques\n| PR | Auteur | Titre | Taille | Problème | Action recommandée |\n| -- | ------ | ----- | ------ | -------- | ------------------ |\n\n### Résumé\n- Quick wins : {PRs XS\u002FS prêtes à merger}\n- Risques : {overlaps, tailles XL, CI dirty}\n- Clusters : {auteurs avec 3+ PRs}\n- Stale : {PRs sans activité >14j}\n- Overlaps : {PRs qui touchent les mêmes fichiers}\n```\n\n0 PRs → afficher `Aucune PR ouverte.` et terminer.\n\n### Copie automatique\n\nAprès affichage du tableau de triage, copier dans le presse-papier :\n```bash\n# Cross-platform clipboard\nclip() {\n  if command -v pbcopy &>\u002Fdev\u002Fnull; then pbcopy\n  elif command -v xclip &>\u002Fdev\u002Fnull; then xclip -selection clipboard\n  elif command -v wl-copy &>\u002Fdev\u002Fnull; then wl-copy\n  else cat\n  fi\n}\n\nclip \u003C\u003C'EOF'\n{tableau de triage complet}\nEOF\n```\nConfirmer : `Tableau copié dans le presse-papier.` (FR) \u002F `Triage table copied to clipboard.` (EN)\n\n---\n\n## Phase 2 — Deep Review (opt-in)\n\n### Sélection des PRs\n\n**Si argument passé** :\n- `\"all\"` → toutes les PRs externes\n- Numéros (`\"42 57\"`) → uniquement ces PRs\n- Pas d'argument → proposer via `AskUserQuestion`\n\n**Si pas d'argument**, afficher :\n\n```\nquestion: \"Quelles PRs voulez-vous reviewer en profondeur ?\"\nheader: \"Deep Review\"\nmultiSelect: true\noptions:\n  - label: \"Toutes les externes\"\n    description: \"Review {N} PRs externes avec agents code-reviewer en parallèle\"\n  - label: \"Problématiques uniquement\"\n    description: \"Focus sur les {M} PRs à risque (CI dirty, trop large, overlaps)\"\n  - label: \"Prêtes uniquement\"\n    description: \"Review {K} PRs prêtes à merger\"\n  - label: \"Passer\"\n    description: \"Terminer ici — juste l'audit\"\n```\n\n**Note sur les drafts** :\n- Les PRs en draft sont EXCLUES des options \"Toutes les externes\" et \"Prêtes uniquement\"\n- Les PRs en draft sont INCLUSES dans \"Problématiques uniquement\" (car elles nécessitent attention)\n- Pour reviewer un draft : taper son numéro explicitement (ex: `42`)\n\nSi \"Passer\" → fin du workflow.\n\n### Exécution des Reviews\n\nPour chaque PR sélectionnée, lancer un agent `code-reviewer` via **Task tool en parallèle** :\n\n```\nsubagent_type: code-reviewer\nmodel: sonnet\nprompt: |\n  Review PR #{num}: \"{title}\" by @{author}\n\n  **Metadata**: +{additions}\u002F-{deletions}, {changedFiles} files ({size_label})\n  **CI**: {ci_status} | **Reviews**: {existing_reviews} | **Draft**: {isDraft}\n\n  **PR Body**:\n  {body}\n\n  **Diff**:\n  {gh pr diff {num} output}\n\n  Apply your security-guardian and backend-architect skills for this review.\n  Additionally, apply the RTK-specific checklist:\n  - lazy_static! regex (no inline Regex::new())\n  - anyhow::Result + .context() (no unwrap())\n  - Fallback to raw command on filter failure\n  - Exit code propagation\n  - Token savings ≥60% in tests with real fixtures\n  - No async\u002Ftokio dependencies\n\n  Return structured review:\n  ### Critical Issues ?\n  ### Important Issues ?\n  ### Suggestions ?\n  ### What's Good ✅\n\n  Be specific: quote the file:line, explain why it's an issue, suggest the fix.\n```\n\nRécupérer le diff via :\n```bash\ngh pr diff {num}\ngh pr view {num} --json body,title,author -q '{body: .body, title: .title, author: .author.login}'\n```\n\nAgréger tous les rapports. Afficher un résumé après toutes les reviews.\n\n---\n\n## Phase 3 — Commentaires (validation obligatoire)\n\n### Génération des drafts\n\nPour chaque PR reviewée, générer un commentaire GitHub en utilisant le template `templates\u002Freview-comment.md`.\n\n**Règles** :\n- Langue : **anglais** (audience internationale)\n- Ton : professionnel, constructif, factuel\n- Toujours inclure au moins 1 point positif\n- Citer les lignes de code quand pertinent (format `file.rs:42`)\n\n### Affichage et validation\n\n**Afficher TOUS les commentaires draftés** au format :\n\n```\n---\n### Draft — PR #{num}: {title}\n\n{commentaire complet}\n\n---\n```\n\nPuis demander validation via `AskUserQuestion` :\n\n```\nquestion: \"Ces commentaires sont prêts. Lesquels voulez-vous poster ?\"\nheader: \"Poster\"\nmultiSelect: true\noptions:\n  - label: \"Tous ({N} commentaires)\"\n    description: \"Poster sur toutes les PRs reviewées\"\n  - label: \"PR #{x} — {title_truncated}\"\n    description: \"Poster uniquement sur cette PR\"\n  - label: \"Aucun\"\n    description: \"Annuler — ne rien poster\"\n```\n\n(Générer une option par PR + \"Tous\" + \"Aucun\")\n\n### Posting\n\nPour chaque commentaire validé :\n\n```bash\ngh pr comment {num} --body-file - \u003C\u003C'REVIEW_EOF'\n{commentaire}\nREVIEW_EOF\n```\n\nConfirmer chaque post : `✅ Commentaire posté sur PR #{num}: {title}`\n\nSi \"Aucun\" → `Aucun commentaire posté. Workflow terminé.`\n\n---\n\n## Gestion des cas limites\n\n| Situation | Comportement |\n|-----------|--------------|\n| 0 PRs ouvertes | `Aucune PR ouverte.` + terminer |\n| PR en draft | Indiquer dans tableau, skip pour review sauf si sélectionnée explicitement |\n| CI inconnu | Afficher `?` dans colonne CI |\n| Review agent timeout | Afficher erreur partielle, continuer avec les autres |\n| `gh pr diff` vide | Skip cette PR, notifier l'utilisateur |\n| PR très large (>5000 additions) | Avertir : \"Review partielle, diff tronqué\" |\n| Collaborateurs API 403\u002F404 | Fallback sur auteurs des 10 derniers PRs mergés |\n\n---\n\n## Notes\n\n- Toujours dériver owner\u002Frepo via `gh repo view`, jamais hardcoder\n- Utiliser `gh` CLI (pas `curl` GitHub API) sauf pour la liste des collaborateurs\n- `statusCheckRollup` peut être null → traiter comme `?`\n- `mergeable` peut être `MERGEABLE`, `CONFLICTING`, ou `UNKNOWN` → traiter `UNKNOWN` comme `?`\n- Ne jamais poster sans validation explicite de l'utilisateur dans le chat\n- Les commentaires draftés doivent être visibles AVANT tout `gh pr comment`\n",{"name":5,"tags":38,"effort":39,"description":40,"allowed-tools":41},[18,19,22,21,24,32],"medium","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\"\u002F\"fr\" for language, no arg = audit only in French.\n",[28,42,43,44],"Read","Grep","Glob","main","6079b2fd99329bb8a099e7708b0567b93edf8206","third_party\u002Frtk\u002F.claude\u002Fskills\u002Fpr-triage",2,"https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus","https:\u002F\u002Fgithub.com\u002FMDMAtk","2026-11-07 14:28:49",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":64},[54,57,60],{"tool":55,"command":56},"npx","npx skills add MDMAtk\u002FTormentNexus --skill pr-triage",{"tool":58,"command":59},"bunx","bunx skills add MDMAtk\u002FTormentNexus --skill pr-triage",{"tool":61,"command":62},"pnpm","pnpm dlx skills add MDMAtk\u002FTormentNexus --skill pr-triage","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fpr-triage\u002FSKILL.md",true,[66],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"templates\u002Freview-comment.md","REFERENCE","参考文档",2256,"https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fpr-triage\u002Ftemplates\u002Freview-comment.md",[73,104,117,130,145,162],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":84,"publishedAt":33},"01M6C5659TDGC363E5EWMQZJGZ","tdd-rust","TDD workflow for RTK filter development. Red-Green-Refactor with Rust idioms. Real fixtures, token savings assertions, snapshot tests with insta. Auto-triggers on new filter implementation.","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Ftdd-rust\u002FSKILL.md",[79],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[85,86,87,88,89,90,91,92,93,94,95,96,97,98,28,99,100,101,102,103],"tdd rust","tdd","rust","testing","implement","command","token-savings","snapshots","filters","red-green-refactor","test coverage","auto","fix","coverage","development","add command","write tests","test","workflow",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":33},"01M6C562NZPX3J6W8F6P4KZMV1","ship","Build, commit, push & version bump workflow - automates the complete release cycle","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fship\u002FSKILL.md",[],[106,111,112,113,114,30,29,28,115,116,103],"push","version","edit","write","release","commit",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":33},"01M6C55ZXSNWBB861V5GGYR775","security-guardian","CLI security expert for RTK - command injection, shell escaping, hook security","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fsecurity-guardian\u002FSKILL.md",[],[124,125,126,32,30,28,29,127,128,129,90],"security guardian","guardian","security","shell","injection","cli",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":33},"01M6C55XHCBK612DXDAD08GGE1","rtk-triage","Triage complet RTK : exécute issue-triage + pr-triage en parallèle, puis croise les données pour détecter doubles couvertures, trous sécurité, P0 sans PR, et conflits internes. Sauvegarde dans claudedocs\u002FRTK-YYYY-MM-DD.md. Args: \"en\"\u002F\"fr\" pour la langue (défaut: fr), \"save\" pour forcer la sauvegarde.","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Frtk-triage\u002FSKILL.md",[],[137,32,18,126,138,30,139,114,28,140,141,142,143,144,19],"rtk triage","orchestration","cross-analysis","save","analysis","sans","dd","issues",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":155,"publishedAt":33},"01M6C55V1RDCNFJ019HRA16ZHM","rtk-tdd","Enforces TDD (Red-Green-Refactor) for Rust development. Auto-triggers on implementation, testing, refactoring, and bug fixing tasks. Provides Rust-idiomatic testing patterns with anyhow\u002Fthiserror, cfg(test), and Arrange-Act-Assert workflow.","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Frtk-tdd\u002FSKILL.md",[151,154],{"categoryNo":152,"categoryName":153,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},[156,32,86,157,88,94,87,96,113,114,30,28,158,159,160,99,161,102,103],"rtk tdd","refactoring","CFG","testing patterns","refactor","tasks",{"skillNo":163,"name":164,"nameZh":6,"description":165,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":166,"categories":167,"keywords":168,"publishedAt":33},"01M6C55RQ5QH5MBSYXMC8KF0WV","repo-recap","Generate a comprehensive repo recap (PRs, issues, releases) for sharing with team. Pass \"en\" or \"fr\" as argument for language (default fr).","https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Frepo-recap\u002FSKILL.md",[],[169,170,171,28,29,144,172,173,174,30],"repo recap","recap","repo","team","sharing","generate"]