[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C55EX3VG4ZXW9102W4RDC6":3,"skill-same:01M6C55EX3VG4ZXW9102W4RDC6":77},{"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":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":52,"install":53,"resources":66},"01M6C55EX3VG4ZXW9102W4RDC6","issue-triage",null,"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\"\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\u002Fissue-triage\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"triage","issue triage","duplicates","github","categorize","only","read","grep","Bash","open","analysis","risk","audit","issues","deep analysis","assessment","risk assessment","2026-11-10 10:12:30",false,"---\nname: issue-triage\ndescription: >\n  Issue triage: audit open issues, categorize, detect duplicates, cross-ref PRs, risk assessment, post comments.\n  Args: \"all\" for deep analysis of all, issue 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\neffort: medium\ntags: [triage, issues, github, categorize, duplicates, risk]\n---\n\n# Issue Triage\n\n## Quand utiliser\n\n| Skill | Usage | Output |\n|-------|-------|--------|\n| `\u002Fissue-triage` | Trier, analyser, commenter les issues | Tableaux d'action + deep analysis + 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 : `\u002Fissue-triage` ou `\u002Fissue-triage all` ou `\u002Fissue-triage 42 57`\n- Proactivement : quand >10 issues ouvertes sans triage, ou issue stale >30j 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 analysis 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# Issues ouvertes avec métadonnées complètes\ngh issue list --state open --limit 100 \\\n  --json number,title,author,createdAt,updatedAt,labels,assignees,body,comments\n\n# PRs ouvertes (pour cross-référence)\ngh pr list --state open --limit 50 --json number,title,body\n\n# Issues fermées récemment (pour détection doublons)\ngh issue list --state closed --limit 20 \\\n  --json number,title,labels,closedAt\n\n# Collaborateurs (pour protéger les issues des mainteneurs)\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fcollaborators\" --jq '.[].login'\n```\n\n**Fallback collaborateurs** : si `gh api ...\u002Fcollaborators` échoue (403\u002F404) :\n```bash\ngh pr list --state merged --limit 10 --json author --jq '.[].author.login' | sort -u\n```\nSi toujours ambigu, demander à l'utilisateur via `AskUserQuestion`.\n\n**Note** : `author` est un objet `{login: \"...\"}` — toujours extraire `.author.login`.\n\n### Analyse — 6 dimensions\n\n**1. Catégorisation** (labels existants > inférence titre\u002Fbody) :\n- **Bug** : mots-clés `crash`, `error`, `fail`, `broken`, `regression`, `wrong`, `unexpected`\n- **Feature** : `add`, `implement`, `support`, `new`, `feat:`\n- **Enhancement** : `improve`, `optimize`, `better`, `enhance`, `refactor`\n- **Question\u002FSupport** : `how`, `why`, `help`, `unclear`, `docs`, `documentation`\n- **Duplicate Candidate** : voir dimension 3 ci-dessous\n\n**2. Cross-ref PRs** :\n- Scanner `body` de chaque PR ouverte pour `fixes #N`, `closes #N`, `resolves #N` (case-insensitive, regex)\n- Construire un map : `issue_number -> [PR numbers]`\n- Une issue liée à une PR mergée → recommander fermeture\n\n**3. Détection doublons** :\n- Normaliser les titres : lowercase, strip préfixes (`bug:`, `feat:`, `[bug]`, `[feature]`, etc.)\n- **Jaccard sur mots des titres** : si score > 60% entre deux issues → candidat doublon\n- **Keywords body overlap** > 50% → renforcement du signal\n- Comparer aussi avec issues fermées récentes (20 dernières)\n- Un faux positif peut être confirmé\u002Fécarté en Phase 2\n\n**4. Classification risque** :\n- **Rouge** : mots-clés `CVE`, `vulnerability`, `injection`, `auth bypass`, `security`, `exploit`, `unsafe`, `credentials`, `leak`, `RCE`, `XSS`\n- **Jaune** : `breaking change`, `migration`, `deprecation`, `remove API`, `breaking`, `incompatible`\n- **Vert** : tout le reste\n\n**5. Staleness** :\n- >30j sans activité (updatedAt) → **Stale**\n- >90j sans activité → **Very Stale**\n- Calculer depuis la date actuelle\n\n**6. Recommandations d'action** :\n- `Accept & Prioritize` : issue claire, reproducible, dans scope\n- `Label needed` : issue sans label\n- `Comment needed` : info manquante, body insuffisant\n- `Linked to PR` : une PR ouverte référence cette issue\n- `Duplicate candidate` : candidat doublon identifié (préciser avec `#N`)\n- `Close candidate` : stale + aucune activité récente, ou hors scope (jamais si auteur est collaborateur)\n- `PR merged → close` : PR liée est mergée, issue encore ouverte\n\n### Output — 5 tableaux\n\n```\n## Issues ouvertes ({count})\n\n### Critiques (risque rouge)\n| # | Titre | Auteur | Âge | Labels | Action |\n| - | ----- | ------ | --- | ------ | ------ |\n\n### Liées à une PR\n| # | Titre | Auteur | PR(s) liée(s) | Status PR | Action |\n| - | ----- | ------ | ------------- | --------- | ------ |\n\n### Actives\n| # | Titre | Auteur | Catégorie | Âge | Labels | Action |\n| - | ----- | ------ | --------- | --- | ------ | ------ |\n\n### Doublons candidats\n| # | Titre | Doublon de | Similarité | Action |\n| - | ----- | ---------- | ---------- | ------ |\n\n### Stale\n| # | Titre | Auteur | Dernière activité | Action |\n| - | ----- | ------ | ----------------- | ------ |\n\n### Résumé\n- Total : {N} issues ouvertes\n- Critiques : {N} (risque sécurité ou breaking)\n- Liées à PR : {N}\n- Doublons candidats : {N}\n- Stale (>30j) : {N} | Very Stale (>90j) : {N}\n- Sans labels : {N}\n- Quick wins (à fermer ou labeler rapidement) : {liste}\n```\n\n0 issues → afficher `Aucune issue ouverte.` et terminer.\n\n**Note** : `Âge` = jours depuis `createdAt`, format `{N}j`. Si >30j, afficher en **gras**.\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 Analysis (opt-in)\n\n### Sélection des issues\n\n**Si argument passé** :\n- `\"all\"` → toutes les issues ouvertes\n- Numéros (`\"42 57\"`) → uniquement ces issues\n- Pas d'argument → proposer via `AskUserQuestion`\n\n**Si pas d'argument**, afficher :\n\n```\nquestion: \"Quelles issues voulez-vous analyser en profondeur ?\"\nheader: \"Deep Analysis\"\nmultiSelect: true\noptions:\n  - label: \"Toutes ({N} issues)\"\n    description: \"Analyse approfondie de toutes les issues avec agents en parallèle\"\n  - label: \"Critiques uniquement\"\n    description: \"Focus sur les {M} issues à risque rouge\u002Fjaune\"\n  - label: \"Doublons candidats\"\n    description: \"Confirmer ou écarter les {K} doublons détectés\"\n  - label: \"Stale uniquement\"\n    description: \"Décision close\u002Fkeep sur les {J} issues stale\"\n  - label: \"Passer\"\n    description: \"Terminer ici — juste l'audit\"\n```\n\nSi \"Passer\" → fin du workflow.\n\n### Exécution de l'analyse\n\nPour chaque issue sélectionnée, lancer un agent via **Task tool en parallèle** :\n\n```\nsubagent_type: general-purpose\nmodel: sonnet\nprompt: |\n  Analyze GitHub issue #{num}: \"{title}\" by @{author}\n\n  **Metadata**: Created {createdAt}, last updated {updatedAt}, labels: {labels}\n\n  **Body**:\n  {body}\n\n  **Existing comments** ({comments_count} total, showing last 5):\n  {last_5_comments}\n\n  **Context**:\n  - Linked PRs: {linked_prs or \"none\"}\n  - Duplicate candidate of: {duplicate_of or \"none\"}\n  - Risk classification: {risk_color}\n\n  Analyze this issue and return a structured report:\n  ### Scope Assessment\n  What is this issue actually asking for? Is it clearly defined?\n\n  ### Missing Information\n  What's needed to act on this? (reproduction steps, version, environment, etc.)\n\n  ### Risk & Impact\n  Security risk? Breaking change? Who's affected?\n\n  ### Effort Estimate\n  XS (\u003C1h) \u002F S (1-4h) \u002F M (1-2d) \u002F L (3-5d) \u002F XL (>1 week)\n\n  ### Priority\n  P0 (critical, act now) \u002F P1 (high, this sprint) \u002F P2 (medium, backlog) \u002F P3 (low, someday)\n\n  ### Recommended Action\n  One of: Accept & Prioritize, Request More Info, Mark Duplicate (#N), Close (Stale), Close (Out of Scope), Link to Existing PR\n\n  ### Draft Comment\n  Draft a GitHub comment in English using the appropriate template from templates\u002Fissue-comment.md.\n  Be specific, helpful, and constructive.\n```\n\nSi issue a >50 commentaires, résumer les 5 derniers uniquement.\n\nAgréger tous les rapports. Afficher un résumé après toutes les analyses.\n\n---\n\n## Phase 3 — Actions (validation obligatoire)\n\n### Types d'actions possibles\n\n- **Commenter** : `gh issue comment {num} --body-file -`\n- **Labeler** : `gh issue edit {num} --add-label \"{label}\"` (skip si label déjà présent)\n- **Fermer** : `gh issue close {num} --reason \"not planned\"` (jamais sans validation)\n\n### Génération des drafts\n\nPour chaque issue analysée, générer les actions (commentaire + labels + fermeture si applicable) en utilisant `templates\u002Fissue-comment.md`.\n\n**Règles** :\n- Langue des commentaires : **anglais** (audience internationale)\n- Ton : professionnel, constructif, factuel\n- Ne jamais re-labeler une issue qui a déjà ce label\n- Ne jamais proposer \"close\" pour une issue d'un collaborateur\n- Toujours afficher le draft AVANT tout `gh issue comment`\n\n### Affichage et validation\n\n**Afficher TOUS les drafts** au format :\n\n```\n---\n### Draft — Issue #{num}: {title}\n\n**Actions proposées** : {Commentaire | Label: \"bug\" | Fermeture}\n\n**Commentaire** :\n{commentaire complet}\n\n---\n```\n\nPuis demander validation via `AskUserQuestion` :\n\n```\nquestion: \"Ces actions sont prêtes. Lesquelles voulez-vous exécuter ?\"\nheader: \"Exécuter\"\nmultiSelect: true\noptions:\n  - label: \"Toutes ({N} actions)\"\n    description: \"Commenter + labeler + fermer selon les drafts\"\n  - label: \"Issue #{x} — {title_truncated}\"\n    description: \"Exécuter uniquement les actions pour cette issue\"\n  - label: \"Aucune\"\n    description: \"Annuler — ne rien faire\"\n```\n\n(Générer une option par issue + \"Toutes\" + \"Aucune\")\n\n### Exécution\n\nPour chaque action validée, exécuter dans l'ordre : commenter → labeler → fermer.\n\n```bash\n# Commenter\ngh issue comment {num} --body-file - \u003C\u003C'COMMENT_EOF'\n{commentaire}\nCOMMENT_EOF\n\n# Labeler (si applicable)\ngh issue edit {num} --add-label \"{label}\"\n\n# Fermer (si applicable)\ngh issue close {num} --reason \"not planned\"\n```\n\nConfirmer chaque action : `Commentaire posté sur issue #{num}: {title}`\n\nSi \"Aucune\" → `Aucune action exécutée. Workflow terminé.`\n\n---\n\n## Gestion des cas limites\n\n| Situation | Comportement |\n|-----------|--------------|\n| 0 issues ouvertes | `Aucune issue ouverte.` + terminer |\n| Issue sans body | Catégoriser par titre, recommander `Comment needed` |\n| >50 commentaires | Résumer les 5 derniers uniquement |\n| Faux positif doublon | Phase 2 confirme\u002Fécarte — ne pas agir sur suspicion seule |\n| Labels déjà présents | Ne pas re-labeler, signaler \"label déjà appliqué\" |\n| Issue d'un collaborateur | Jamais `close candidate` automatique |\n| Rate limit GitHub API | Réduire `--limit`, notifier l'utilisateur |\n| PR mergée liée à issue ouverte | Recommander fermeture de l'issue |\n| Issue sans activité >90j | Very Stale — proposer fermeture avec message bienveillant |\n| Duplicate confirmed in Phase 2 | Poster commentaire + fermer en faveur de l'issue originale |\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- `updatedAt` peut être null sur certaines issues → traiter comme `createdAt`\n- Ne jamais poster ou fermer sans validation explicite de l'utilisateur dans le chat\n- Les commentaires draftés doivent être visibles AVANT tout `gh issue comment`\n- Similarité Jaccard = |intersection mots| \u002F |union mots| (exclure stop words : a, the, is, in, of, for, to, with, on, at, by)\n","# Issue Triage\n\n## Quand utiliser\n\n| Skill | Usage | Output |\n|-------|-------|--------|\n| `\u002Fissue-triage` | Trier, analyser, commenter les issues | Tableaux d'action + deep analysis + 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 : `\u002Fissue-triage` ou `\u002Fissue-triage all` ou `\u002Fissue-triage 42 57`\n- Proactivement : quand >10 issues ouvertes sans triage, ou issue stale >30j 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 analysis 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# Issues ouvertes avec métadonnées complètes\ngh issue list --state open --limit 100 \\\n  --json number,title,author,createdAt,updatedAt,labels,assignees,body,comments\n\n# PRs ouvertes (pour cross-référence)\ngh pr list --state open --limit 50 --json number,title,body\n\n# Issues fermées récemment (pour détection doublons)\ngh issue list --state closed --limit 20 \\\n  --json number,title,labels,closedAt\n\n# Collaborateurs (pour protéger les issues des mainteneurs)\ngh api \"repos\u002F{owner}\u002F{repo}\u002Fcollaborators\" --jq '.[].login'\n```\n\n**Fallback collaborateurs** : si `gh api ...\u002Fcollaborators` échoue (403\u002F404) :\n```bash\ngh pr list --state merged --limit 10 --json author --jq '.[].author.login' | sort -u\n```\nSi toujours ambigu, demander à l'utilisateur via `AskUserQuestion`.\n\n**Note** : `author` est un objet `{login: \"...\"}` — toujours extraire `.author.login`.\n\n### Analyse — 6 dimensions\n\n**1. Catégorisation** (labels existants > inférence titre\u002Fbody) :\n- **Bug** : mots-clés `crash`, `error`, `fail`, `broken`, `regression`, `wrong`, `unexpected`\n- **Feature** : `add`, `implement`, `support`, `new`, `feat:`\n- **Enhancement** : `improve`, `optimize`, `better`, `enhance`, `refactor`\n- **Question\u002FSupport** : `how`, `why`, `help`, `unclear`, `docs`, `documentation`\n- **Duplicate Candidate** : voir dimension 3 ci-dessous\n\n**2. Cross-ref PRs** :\n- Scanner `body` de chaque PR ouverte pour `fixes #N`, `closes #N`, `resolves #N` (case-insensitive, regex)\n- Construire un map : `issue_number -> [PR numbers]`\n- Une issue liée à une PR mergée → recommander fermeture\n\n**3. Détection doublons** :\n- Normaliser les titres : lowercase, strip préfixes (`bug:`, `feat:`, `[bug]`, `[feature]`, etc.)\n- **Jaccard sur mots des titres** : si score > 60% entre deux issues → candidat doublon\n- **Keywords body overlap** > 50% → renforcement du signal\n- Comparer aussi avec issues fermées récentes (20 dernières)\n- Un faux positif peut être confirmé\u002Fécarté en Phase 2\n\n**4. Classification risque** :\n- **Rouge** : mots-clés `CVE`, `vulnerability`, `injection`, `auth bypass`, `security`, `exploit`, `unsafe`, `credentials`, `leak`, `RCE`, `XSS`\n- **Jaune** : `breaking change`, `migration`, `deprecation`, `remove API`, `breaking`, `incompatible`\n- **Vert** : tout le reste\n\n**5. Staleness** :\n- >30j sans activité (updatedAt) → **Stale**\n- >90j sans activité → **Very Stale**\n- Calculer depuis la date actuelle\n\n**6. Recommandations d'action** :\n- `Accept & Prioritize` : issue claire, reproducible, dans scope\n- `Label needed` : issue sans label\n- `Comment needed` : info manquante, body insuffisant\n- `Linked to PR` : une PR ouverte référence cette issue\n- `Duplicate candidate` : candidat doublon identifié (préciser avec `#N`)\n- `Close candidate` : stale + aucune activité récente, ou hors scope (jamais si auteur est collaborateur)\n- `PR merged → close` : PR liée est mergée, issue encore ouverte\n\n### Output — 5 tableaux\n\n```\n## Issues ouvertes ({count})\n\n### Critiques (risque rouge)\n| # | Titre | Auteur | Âge | Labels | Action |\n| - | ----- | ------ | --- | ------ | ------ |\n\n### Liées à une PR\n| # | Titre | Auteur | PR(s) liée(s) | Status PR | Action |\n| - | ----- | ------ | ------------- | --------- | ------ |\n\n### Actives\n| # | Titre | Auteur | Catégorie | Âge | Labels | Action |\n| - | ----- | ------ | --------- | --- | ------ | ------ |\n\n### Doublons candidats\n| # | Titre | Doublon de | Similarité | Action |\n| - | ----- | ---------- | ---------- | ------ |\n\n### Stale\n| # | Titre | Auteur | Dernière activité | Action |\n| - | ----- | ------ | ----------------- | ------ |\n\n### Résumé\n- Total : {N} issues ouvertes\n- Critiques : {N} (risque sécurité ou breaking)\n- Liées à PR : {N}\n- Doublons candidats : {N}\n- Stale (>30j) : {N} | Very Stale (>90j) : {N}\n- Sans labels : {N}\n- Quick wins (à fermer ou labeler rapidement) : {liste}\n```\n\n0 issues → afficher `Aucune issue ouverte.` et terminer.\n\n**Note** : `Âge` = jours depuis `createdAt`, format `{N}j`. Si >30j, afficher en **gras**.\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 Analysis (opt-in)\n\n### Sélection des issues\n\n**Si argument passé** :\n- `\"all\"` → toutes les issues ouvertes\n- Numéros (`\"42 57\"`) → uniquement ces issues\n- Pas d'argument → proposer via `AskUserQuestion`\n\n**Si pas d'argument**, afficher :\n\n```\nquestion: \"Quelles issues voulez-vous analyser en profondeur ?\"\nheader: \"Deep Analysis\"\nmultiSelect: true\noptions:\n  - label: \"Toutes ({N} issues)\"\n    description: \"Analyse approfondie de toutes les issues avec agents en parallèle\"\n  - label: \"Critiques uniquement\"\n    description: \"Focus sur les {M} issues à risque rouge\u002Fjaune\"\n  - label: \"Doublons candidats\"\n    description: \"Confirmer ou écarter les {K} doublons détectés\"\n  - label: \"Stale uniquement\"\n    description: \"Décision close\u002Fkeep sur les {J} issues stale\"\n  - label: \"Passer\"\n    description: \"Terminer ici — juste l'audit\"\n```\n\nSi \"Passer\" → fin du workflow.\n\n### Exécution de l'analyse\n\nPour chaque issue sélectionnée, lancer un agent via **Task tool en parallèle** :\n\n```\nsubagent_type: general-purpose\nmodel: sonnet\nprompt: |\n  Analyze GitHub issue #{num}: \"{title}\" by @{author}\n\n  **Metadata**: Created {createdAt}, last updated {updatedAt}, labels: {labels}\n\n  **Body**:\n  {body}\n\n  **Existing comments** ({comments_count} total, showing last 5):\n  {last_5_comments}\n\n  **Context**:\n  - Linked PRs: {linked_prs or \"none\"}\n  - Duplicate candidate of: {duplicate_of or \"none\"}\n  - Risk classification: {risk_color}\n\n  Analyze this issue and return a structured report:\n  ### Scope Assessment\n  What is this issue actually asking for? Is it clearly defined?\n\n  ### Missing Information\n  What's needed to act on this? (reproduction steps, version, environment, etc.)\n\n  ### Risk & Impact\n  Security risk? Breaking change? Who's affected?\n\n  ### Effort Estimate\n  XS (\u003C1h) \u002F S (1-4h) \u002F M (1-2d) \u002F L (3-5d) \u002F XL (>1 week)\n\n  ### Priority\n  P0 (critical, act now) \u002F P1 (high, this sprint) \u002F P2 (medium, backlog) \u002F P3 (low, someday)\n\n  ### Recommended Action\n  One of: Accept & Prioritize, Request More Info, Mark Duplicate (#N), Close (Stale), Close (Out of Scope), Link to Existing PR\n\n  ### Draft Comment\n  Draft a GitHub comment in English using the appropriate template from templates\u002Fissue-comment.md.\n  Be specific, helpful, and constructive.\n```\n\nSi issue a >50 commentaires, résumer les 5 derniers uniquement.\n\nAgréger tous les rapports. Afficher un résumé après toutes les analyses.\n\n---\n\n## Phase 3 — Actions (validation obligatoire)\n\n### Types d'actions possibles\n\n- **Commenter** : `gh issue comment {num} --body-file -`\n- **Labeler** : `gh issue edit {num} --add-label \"{label}\"` (skip si label déjà présent)\n- **Fermer** : `gh issue close {num} --reason \"not planned\"` (jamais sans validation)\n\n### Génération des drafts\n\nPour chaque issue analysée, générer les actions (commentaire + labels + fermeture si applicable) en utilisant `templates\u002Fissue-comment.md`.\n\n**Règles** :\n- Langue des commentaires : **anglais** (audience internationale)\n- Ton : professionnel, constructif, factuel\n- Ne jamais re-labeler une issue qui a déjà ce label\n- Ne jamais proposer \"close\" pour une issue d'un collaborateur\n- Toujours afficher le draft AVANT tout `gh issue comment`\n\n### Affichage et validation\n\n**Afficher TOUS les drafts** au format :\n\n```\n---\n### Draft — Issue #{num}: {title}\n\n**Actions proposées** : {Commentaire | Label: \"bug\" | Fermeture}\n\n**Commentaire** :\n{commentaire complet}\n\n---\n```\n\nPuis demander validation via `AskUserQuestion` :\n\n```\nquestion: \"Ces actions sont prêtes. Lesquelles voulez-vous exécuter ?\"\nheader: \"Exécuter\"\nmultiSelect: true\noptions:\n  - label: \"Toutes ({N} actions)\"\n    description: \"Commenter + labeler + fermer selon les drafts\"\n  - label: \"Issue #{x} — {title_truncated}\"\n    description: \"Exécuter uniquement les actions pour cette issue\"\n  - label: \"Aucune\"\n    description: \"Annuler — ne rien faire\"\n```\n\n(Générer une option par issue + \"Toutes\" + \"Aucune\")\n\n### Exécution\n\nPour chaque action validée, exécuter dans l'ordre : commenter → labeler → fermer.\n\n```bash\n# Commenter\ngh issue comment {num} --body-file - \u003C\u003C'COMMENT_EOF'\n{commentaire}\nCOMMENT_EOF\n\n# Labeler (si applicable)\ngh issue edit {num} --add-label \"{label}\"\n\n# Fermer (si applicable)\ngh issue close {num} --reason \"not planned\"\n```\n\nConfirmer chaque action : `Commentaire posté sur issue #{num}: {title}`\n\nSi \"Aucune\" → `Aucune action exécutée. Workflow terminé.`\n\n---\n\n## Gestion des cas limites\n\n| Situation | Comportement |\n|-----------|--------------|\n| 0 issues ouvertes | `Aucune issue ouverte.` + terminer |\n| Issue sans body | Catégoriser par titre, recommander `Comment needed` |\n| >50 commentaires | Résumer les 5 derniers uniquement |\n| Faux positif doublon | Phase 2 confirme\u002Fécarte — ne pas agir sur suspicion seule |\n| Labels déjà présents | Ne pas re-labeler, signaler \"label déjà appliqué\" |\n| Issue d'un collaborateur | Jamais `close candidate` automatique |\n| Rate limit GitHub API | Réduire `--limit`, notifier l'utilisateur |\n| PR mergée liée à issue ouverte | Recommander fermeture de l'issue |\n| Issue sans activité >90j | Very Stale — proposer fermeture avec message bienveillant |\n| Duplicate confirmed in Phase 2 | Poster commentaire + fermer en faveur de l'issue originale |\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- `updatedAt` peut être null sur certaines issues → traiter comme `createdAt`\n- Ne jamais poster ou fermer sans validation explicite de l'utilisateur dans le chat\n- Les commentaires draftés doivent être visibles AVANT tout `gh issue comment`\n- Similarité Jaccard = |intersection mots| \u002F |union mots| (exclure stop words : a, the, is, in, of, for, to, with, on, at, by)\n",{"name":5,"tags":40,"effort":41,"description":42,"allowed-tools":43},[18,31,21,22,20,29],"medium","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\"\u002F\"fr\" for language, no arg = audit only in French.\n",[26,44,45],"Read","Grep","main","6079b2fd99329bb8a099e7708b0567b93edf8206","third_party\u002Frtk\u002F.claude\u002Fskills\u002Fissue-triage",2,"https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus","https:\u002F\u002Fgithub.com\u002FMDMAtk","2026-11-07 14:28:49",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add MDMAtk\u002FTormentNexus --skill issue-triage",{"tool":59,"command":60},"bunx","bunx skills add MDMAtk\u002FTormentNexus --skill issue-triage",{"tool":62,"command":63},"pnpm","pnpm dlx skills add MDMAtk\u002FTormentNexus --skill issue-triage","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fissue-triage\u002FSKILL.md",true,[67,73],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"agents\u002Fopenai.yaml","REFERENCE","参考文档",251,"https:\u002F\u002Fgithub.com\u002FTimothyMeadows\u002FHephaera\u002Fblob\u002Fmain\u002Fskills\u002Fdesign-ui-from-constraints\u002Fagents\u002Fopenai.yaml",{"path":74,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":75,"sourceHtmlUrl":76},"templates\u002Fissue-comment.md",4469,"https:\u002F\u002Fgithub.com\u002FMDMAtk\u002FTormentNexus\u002Fblob\u002Fmain\u002Fthird_party\u002Frtk\u002F.claude\u002Fskills\u002Fissue-triage\u002Ftemplates\u002Fissue-comment.md",[78,109,122,136,150,167],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":89,"publishedAt":35},"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",[84],{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[90,91,92,93,94,95,96,97,98,99,100,101,102,103,26,104,105,106,107,108],"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":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":35},"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",[],[111,116,117,118,119,24,25,26,120,121,108],"push","version","edit","write","release","commit",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":35},"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",[],[129,130,131,132,24,26,25,133,134,135,95],"security guardian","guardian","security","rtk","shell","injection","cli",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":35},"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",[],[143,132,18,131,144,24,145,119,26,146,28,147,148,31,149],"rtk triage","orchestration","cross-analysis","save","sans","dd","pr",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":160,"publishedAt":35},"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",[156,159],{"categoryNo":157,"categoryName":158,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},[161,132,91,162,93,99,92,101,118,119,24,26,163,164,165,104,166,107,108],"rtk tdd","refactoring","CFG","testing patterns","refactor","tasks",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":173,"publishedAt":35},"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",[],[174,175,176,26,25,31,177,178,179,24],"repo recap","recap","repo","team","sharing","generate"]