This repository contains shared GitHub Actions workflows and scripts used across the Nuxt organization.
AI-powered issue triage using GitHub Models. These workflows automatically:
- Categorize issues (bug, enhancement, documentation, spam)
- Add appropriate labels
- Translate non-English issues
- Check for reproduction information
- Reopen issues when new evidence is provided
| Workflow | Trigger | Description |
|---|---|---|
triage-opened.yml |
issues: [opened] |
Triage newly opened issues |
triage-comment.yml |
issue_comment: [created] |
Analyze comments for reproductions |
triage-edited.yml |
issues: [edited] |
Check edited issues for reproductions |
triage-spam-transfer.yml |
issues: [labeled] |
Transfer spam-labeled issues |
Create workflow files in your repository's .github/workflows/ directory:
name: triage
on:
issues:
types: [opened]
concurrency:
group: issue-triage-${{ github.event.issue.number }}
cancel-in-progress: true
jobs:
triage:
uses: nuxt/.github/.github/workflows/triage-opened.yml@main
with:
enable-translation: true
enable-body-translation: true
spam-repo-id: ${{ vars.TRIAGE_SPAM_REPO_ID }}
project-name: 'Your Project Name'
permissions:
contents: read
issues: write
models: readname: triage
on:
issue_comment:
types: [created]
concurrency:
group: llm-triage-comment-${{ github.event.issue.number }}
cancel-in-progress: false
jobs:
triage:
uses: nuxt/.github/.github/workflows/triage-comment.yml@main
permissions:
contents: read
issues: write
models: readname: triage
on:
issues:
types: [edited]
concurrency:
group: llm-triage-edit-${{ github.event.issue.number }}
cancel-in-progress: false
jobs:
triage:
uses: nuxt/.github/.github/workflows/triage-edited.yml@main
permissions:
contents: read
issues: write
models: readname: triage
on:
issues:
types: [labeled]
jobs:
transfer-spam:
if: |
github.event.label.name == 'spam' &&
vars.TRIAGE_SPAM_REPO_ID != ''
uses: nuxt/.github/.github/workflows/triage-spam-transfer.yml@main
with:
spam-repo-id: ${{ vars.TRIAGE_SPAM_REPO_ID }}
permissions:
contents: read
issues: writeSet these in your repository's Settings > Secrets and variables > Actions > Variables:
| Variable | Required | Default | Description |
|---|---|---|---|
TRIAGE_SPAM_REPO_ID |
No | - | Node ID of spam repository for issue transfers |
| Input | Type | Default | Description |
|---|---|---|---|
enable-translation |
boolean | true |
Translate non-English issue titles |
enable-body-translation |
boolean | true |
Also translate issue body |
spam-repo-id |
string | '' |
Node ID for spam transfer target |
scripts-ref |
string | 'main' |
Git ref for scripts |
add-pending-label |
boolean | true |
Add 'pending triage' to new issues |
project-name |
string | 'Nuxt.js framework' |
Project name for AI context |
| Input | Type | Default | Description |
|---|---|---|---|
scripts-ref |
string | 'main' |
Git ref for scripts |
| Input | Type | Required | Description |
|---|---|---|---|
spam-repo-id |
string | Yes | Node ID of spam repository |
All triage workflows require:
permissions:
contents: read # To checkout shared scripts
issues: write # To add labels, update issues
models: read # To use GitHub Models AIThe workflows use these labels (create them in your repository):
| Label | Description |
|---|---|
pending triage |
Issue awaiting review |
needs reproduction |
Bug report missing reproduction |
possible regression |
May be a regression from upgrade |
nitro |
Related to deployment/Nitro |
spam |
Spam content |
duplicate |
Duplicate issue |
- Adds
pending triagelabel to new issues without labels - Uses AI to categorize the issue
- For bugs without reproduction, adds
needs reproductionlabel - For possible regressions, adds
possible regressionlabel - Translates non-English issues (optional)
- Transfers spam to dedicated repository (optional)
- Checks if comment provides reproduction for
needs reproductionissues - For closed issues, analyzes if new evidence warrants reopening
- Removes
needs reproductionwhen valid reproduction is provided - Reopens issues when regression or new evidence is found
- Only runs on issues with
needs reproductionlabel - Checks if edited content now includes reproduction
- Removes label and reopens issue if applicable
- Triggers when
spamlabel is added - Transfers issue to dedicated spam repository
- Keeps main repository clean
To find a repository's Node ID for spam transfers:
gh api graphql -f query='
query {
repository(owner: "nuxt", name: "spam") {
id
}
}
'For production use, pin to a specific commit or tag:
uses: nuxt/.github/.github/workflows/[email protected]
# or
uses: nuxt/.github/.github/workflows/triage-opened.yml@abc1234