Skills
Skill 2 of 14
Triage open issues and PRs of the current GitHub repo - find already-fixed, duplicate, and spam items, suggest labels, gauge demand from reactions and comments, then present a…
10 minutes · 2,210 words · 7 sections
Install
npx skills add antfu/skills --skill antfu-issue-triagenpx skills add antfu/skillsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
Go through the open issues and PRs of the current repo (gh repo view --json nameWithOwner) and propose clean-up actions. Maintainers decide; the agent investigates.
gh issue view, gh api GET, gh search) are fine.🤖 *Automated by an agent.*simple-english skill if available): 1-3 short sentences, active voice, no jargon, no filler. Write each comment fresh for the item. Do not reuse a fixed template. Always include the link (PR, commit, release, or canonical issue) that justifies the action.keep open (with labels if useful) instead of closing. Do not close items with active maintainer discussion, an open linked PR, or a milestone unless the user asks.gh issue list --state all --search "Triage digest in:title"). Read the one that matches this run (the unscoped digest for a full-repo run, the digest with the same focus for a focused run). If it exists: skip items already checked, re-check the unchecked ones, and scan only items newer than its recorded range plus items with new activity since its recorded date. Keep each item’s TASKxx code. If none matches, scan everything in scope. Also skim the other digests for codes already used and for items already tracked there (see Scoped digests).gh issue list --state open --limit 200 --json number,title,body,author,labels,createdAt,updatedAt,comments,reactionGroups,url,milestone
gh pr list --state open --limit 200 --json number,title,body,author,labels,isDraft,reviewDecision,closingIssuesReferences,url,reactionGroups
gh label list --limit 200 --json name,descriptionspam if missing) go in the Labels table and are created only after approval. Check how maintainers labeled similar items (gh issue list --state all --label <l>). Compare the repo’s labels with the Recommended Labels section below and note useful ones that are missing.gh api repos/{owner}/{repo}/issues/{n}/timeline --paginate): #123, URLs, closes/fixes, linked PRs, cross-repo links. Treat linked items as one cluster. Do not close an issue whose fix PR is still open. Do not mark linked items as duplicates of each other.gh pr list --state merged --search "<keywords>", git log -i --grep), changelog, docs, and current code. Find the first release with the fix (git tag --contains <sha> --sort=version:refname | head -1). Verify in the code, not just the title. A partial fix is not fixed: keep it open.gh issue list --state all --search "<text>"). Pick one canonical item: linked PR > maintainer response > best repro > most reactions > oldest. Close the others into it.low hanging fruit label for it. Skip items that are blocked, unclear, or large.TASKxx code (reuse the code from the digest if it has one, otherwise the next unused number).High / Medium / Low for the repo’s size and show the raw numbers. Recent activity on an old item means it is still wanted.&&). Do not batch many issues in one script or loop: bulk write commands can be blocked by the permission classifier. If a command is blocked, do not work around it. Split it into smaller per-issue commands, and tell the user.General labels. Map them to the repo’s existing labels first (same meaning, different name). Never rename or delete existing labels.
| Group | Labels | Meaning |
|---|---|---|
| Type | bug, enhancement, documentation, regression | What kind of item it is. regression: only appears after a new release. |
| Triage state | pending triage, needs reproduction | Where the item is stuck. |
| Resolution | duplicate, invalid, wontfix, spam | Why it was closed. |
| Priority | p1-chore, p2-nice-to-have, p2-edge-case, p3-minor-bug, p3-significant, p4-important, p5-urgent | How much it matters. Descriptions: p5 breaks most users and needs a release now; p4 breaks documented behavior; p3 is an edge case or a high-priority enhancement; p2 is nice to have or has a workaround; p1 changes no behavior. |
| Contribution | low hanging fruit | Quick for a maintainer to finish. |
| Context | has workaround, bug: upstream, <platform> only (e.g. windows only) | Extra facts that help the next reader. |
| Area | feat: <area> (one per major module of the repo) | Which part of the code it touches. Derive areas from the repo’s directories, docs, and past issues. |
| Bot | bot: maybe, bot: likely | Suspected bot or LLM content, short of spam. |
Rules:
feat: <area> labels backed by real clusters of issues over many speculative ones.(new label) rows) with name, color (match the repo’s palette), description, and the items that would use them. Create only after approval (gh label create <name> --description "..." --color <hex>), and before applying them to items.Short, friendly, and specific. Examples of the tone (do not copy verbatim). Each ends with the notice on its own line:
This was fixed in #456, released in v1.2.0. Please upgrade to get it. If it still happens, comment with a repro and we will reopen.
🤖 *Automated by an agent.*This is a duplicate of #123. Please follow that issue. Tell us if it is different and we will reopen.
🤖 *Automated by an agent.*Detected as a spam. Sorry if this was a mistake. Let us know and a maintainer can bring it back.
🤖 *Automated by an agent.*Rules per type:
not planned.spam label. Say it was detected as spam, with no reasoning. Say sorry if wrong, and say we can bring it back. Put the reasoning in the table, not in the comment. Close as not planned.Three tables. Close and Labels rows are numbered so the user can reply “apply 1-5, skip 3”. Needs attention rows carry their TASKxx code instead, so the user can say “do TASK03” now and in later runs. Show the full comment text in the table.
1. Close
| # | Item | Reason | Link (fix / canonical) | Comment |
|---|
Reason is fixed, duplicate, or spam. Spam rows also add the spam label, and their reasoning stays in this table, not in the comment.
2. Labels
| # | Item | Add | Reason |
|---|
Include low hanging fruit rows here. For a label the repo does not have, add a row with item (new label), the name, description, color, and which items will use it. Approved new labels are created first (gh label create), then applied.
3. Needs attention (no write action)
| Code | Status | Item | Demand | Reactions / comments | Note |
|---|
Code is the TASKxx code and Status is the emoji marker (empty if none), both exactly as they will appear in the digest, so the digest is a copy of this table.
Put the most recommended check-them-first items at the top, ranked by importance: high demand, regressions or build-breaking bugs, security reports, security-sensitive or long-waiting PRs, and items with active unanswered discussion. Say why in Note. Low hanging fruits go here too, after those, with the reason it is quick.
Do not close PRs for being stale unless asked; label or flag them instead.
After the actions are applied (or when the user only wants a report), offer to create a digest issue that records the Needs attention results, so later triage runs can pick up from it (Resume step). The digest is a copy of the Needs attention table; do not re-derive it. Creating an issue is a write action: ask first, show the full title and body, and create it only after approval. Skip the offer if the user declined or the list is empty.
Triage digest (YYYY-MM-DD), or Triage digest [<focus>] (YYYY-MM-DD) for a scoped digest (see Scoped digests). If an earlier digest with the same focus exists (gh issue list --state all --search "Triage digest in:title"), offer to update it (gh issue edit) instead of opening a new one, and keep checked items checked.Status paragraph (2-4 sentences): the overall state of open issues and PRs (rough counts, main themes or clusters, how healthy the backlog is, what is stale or blocked), then a Recommended start line naming the 1-3 items to do first and why.- [ ] `TASK00` 🚧 #134 - <concise recommendation>. Mark items already handled as - [x]. Keep each line to one short sentence: what to do and why (for example review and merge, CI green, small change).
TASKxx code (TASK01, TASK02, … zero-padded, numbered in order of appearance) so the maintainer can say “do TASK03 and TASK07”. Codes are stable: when updating an existing digest, keep each item’s code, give new items the next unused number, and never reuse or renumber. Codes are unique across all digests of the repo, not per digest (see Scoped digests).#134, or the full URL for another repo) right after the code and emoji.- [ ] `TASK04` #151 - ...).Prioritized - high demand, regressions, security, long-waiting items. Most important first.Low hanging fruit - quick wins, with the reason it is quick.Other - worth a look but neither urgent nor quick.Done in this run - items closed or fixed in this run, as - [x] lines with ✅ and their own code. A later run drops them once the digest has been updated again.---
- Focus: <"all", or the domain or feature, for example `router rewrite`>
- Selection: <for a focus: how items were chosen, for example "label feat: router, keywords navigation/guard, cluster of #120">
- Scanned: <repo>, open issues and PRs (<fetch filters used, or "all">)
- Date: <YYYY-MM-DD>
- Model: <model name or id>
- Newest item scanned: #<n> (<createdAt>)
- Counts: <n> issues, <n> PRs scanned; <n> closed, <n> labeled in this runrouter rewrite, SSR hydration, v2 release, Windows support). It is not a fetch filter. Fetch filters (limit, label, age for a large repo) only narrow what is scanned and go in the Scanned line; they do not make a scoped digest. Users can keep several scoped digests next to the full one.
Selection line, and list borderline items as ❓ rather than leaving them out silently.Focus metadata line, using a short stable phrase. The same phrase is how the next run finds its digest, so reuse it exactly.Recommended start says what to do first for this focus. The Status paragraph describes the focus (its open work, blockers, how close it is), not the whole backlog.(also in #<digest>) to the line.🤖 *Automated by an agent.* last line. Do not add labels or assignees unless asked.Triage open issues and PRs of the current GitHub repo - find already-fixed, duplicate, and spam items, suggest labels, gauge demand from reactions and comments, then present a table of proposed actions and comments for confirmation before touching anything. Use when asked to triage, organize, clean up, or groom issues and PRs.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 5 November 2026.SKILL.md, not by matching a directory convention. One layout observed: skills/*/SKILL.md.h1 and no skipped levels:/antfu/skills.md, and each skill at its own .md URL.