A Flue-powered GitHub issue triage bot. Other repos consume it via a composite GitHub Action.
Add this workflow to your repo (.github/workflows/issue-triage.yml):
name: Issue Triage
on:
issues:
types: [opened, labeled]
jobs:
analyze:
if: |
github.event.action == 'opened' ||
(github.event.action == 'labeled' && github.event.label.name == 'auto-triage')
runs-on: ubuntu-latest
permissions:
contents: read
issues: read
pull-requests: read
outputs:
decision: ${{ steps.triage.outputs.decision }}
steps:
- uses: actions/checkout@v4
- id: triage
uses: jpenilla/KennyBot/.github/actions/triage@main
with:
issue-number: ${{ github.event.issue.number }}
model: opencode-go/deepseek-v4-flash
env:
OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
process:
needs: analyze
if: ${{ needs.analyze.outputs.decision != '' }}
runs-on: ubuntu-latest
permissions:
issues: write
steps:
- uses: actions/checkout@v4
- uses: jpenilla/KennyBot/.github/actions/process@main
with:
decision: ${{ needs.analyze.outputs.decision }}
issue-number: ${{ github.event.issue.number }}
trigger-label: auto-triageSet the API key for your chosen model as a repo secret. See flueframework.com for available models and their env var names.
Open an issue — the bot will triage it.
Trigger triage on demand by adding a configured label to any issue. The process step removes the label automatically after the LLM finishes.
To enable, add labeled to the trigger types, add the if condition shown
above, and set trigger-label to your chosen label name. The example above
uses auto-triage.
Add a custom-skill-path input pointing at your own SKILL.md in your repo:
with:
issue-number: ${{ github.event.issue.number }}
custom-skill-path: .github/kennybot-triage.mdTwo jobs, strict separation of concerns:
- analyze (
issues: read) — The Flue agent reads the issue, searches for duplicates viagh, and returns a structured decision. - process (
issues: write) — A deterministic JS script parses the decision and calls Octokit. No LLM involvement.
| Decision | Action |
|---|---|
leave-open |
Comment (optional) + add labels, leave open |
close-invalid |
Comment explaining why, close |
close-duplicate |
Comment referencing the original issue, close |
close-done |
Comment noting already addressed, close |