An intelligent GitHub Action that automatically triages issues, asks targeted follow-up questions, validates completeness, and creates engineer-ready case packetsβsaving engineering time and improving issue quality.
When someone opens an issue in your repository, this bot:
- Categorizes the issue automatically (setup, build, runtime, bug, feature, docs)
- Extracts key information (error messages, steps to reproduce, environment details)
- Scores completeness against your customizable checklists
- Asks follow-up questions (up to 3 rounds) if information is missing
- Generates an engineer brief with symptoms, repro steps, and suggested next steps
- Routes issues with labels and assigns them to the right team members
- Suggests duplicate issues based on error signature matching
Result: Better quality issues, faster triage, less back-and-forth with reporters.
- β No External Database: State stored in hidden HTML comments in the issue itself
- β Deterministic Scoring: Completeness calculated with rulesβnot guesswork
- β AI-Powered Extraction: Uses OpenAI structured outputs for messy input
- β Configurable: Customize categories, checklists, validators, and routing via YAML
- β Serverless: Runs entirely on GitHub Actions (no server needed)
- β Eval Harness: Test scenarios with dry-run mode before production
Best for version-controlled integration and easy updates.
# 1. Add bot as submodule
git submodule add https://github.com/YOUR_USERNAME/github-issues-support-bot.git .github-bot
git submodule update --init --recursive
# 2. Copy workflow to your project
cp .github-bot/.github/workflows/support-bot.yml .github/workflows/
# 3. Copy config templates to your project
cp -r .github-bot/.supportbot .supportbot
# 4. Customize configuration for your project
# Edit .supportbot/categories.yaml, validators.yaml, routing.yaml
# 5. Commit changes
git add .gitmodules .github-bot .github/workflows/support-bot.yml .supportbot
git commit -m "Add GitHub Issues Support Bot"
git pushUpdate bot to latest version:
git submodule update --remote .github-bot
git commit -am "Update support bot"
git pushBest for quick setup or if you want to heavily customize the bot.
# 1. Clone this repository
git clone https://github.com/YOUR_USERNAME/github-issues-support-bot.git
# 2. Copy files to your project
cp -r github-issues-support-bot/src/SupportConcierge YOUR_PROJECT/src/
cp -r github-issues-support-bot/.supportbot YOUR_PROJECT/.supportbot
cp github-issues-support-bot/.github/workflows/support-bot.yml YOUR_PROJECT/.github/workflows/
# 3. Customize configuration
cd YOUR_PROJECT
# Edit .supportbot/categories.yaml, validators.yaml, routing.yaml
# 4. Commit to your repository
git add .
git commit -m "Add GitHub Issues Support Bot"
git pushBest if you want to heavily modify the bot and contribute changes back.
- Fork this repository on GitHub
- Clone your fork
- Make customizations
- Use your fork as a submodule in your projects
- GitHub repository with Issues enabled
- .NET 8 SDK (for local development/testing)
- OpenAI API key (GPT-4 or GPT-4o recommended)
- GitHub Actions enabled with Read and write permissions
Go to Settings β Actions β General β Workflow permissions:
- Select Read and write permissions
- Save changes
Go to Settings β Secrets and variables β Actions:
- Click New repository secret
- Name:
OPENAI_API_KEY - Value:
sk-...(your OpenAI API key) - Click Add secret
Edit files in .supportbot/ directory:
categories:
- name: setup
keywords: ["install", "setup", "configure", "environment"]
description: "Installation and setup issues"
- name: runtime
keywords: ["error", "crash", "exception", "fails"]
description: "Runtime errors and crashes"
- name: performance
keywords: ["slow", "memory", "cpu", "performance"]
description: "Performance and resource issues"checklists:
setup:
- field: "Operating System"
required: true
weight: 10
- field: "Steps Attempted"
required: true
weight: 15
- field: "Error Message"
required: true
weight: 20validators:
- name: "HasErrorMessage"
pattern: "(error|exception|failed|fatal)"
points: 20
- name: "HasReproSteps"
pattern: "(steps?|reproduce|repro)"
points: 15routing:
setup:
labels: ["setup", "needs-triage"]
assignees: ["setup-team"]
runtime:
labels: ["bug", "runtime"]
assignees: ["bug-team"]The bot activates on these events:
issues.opened- New issue createdissues.edited- Issue body editedissue_comment.created- Comment added (user responding to questions)
Bot state is stored in hidden HTML comments at the bottom of each issue:
<!-- SUPPORT_BOT_STATE: {"version":"1.0","round":2,"category":"runtime","completeness":85} -->This allows stateful conversations without external databases.
Issue Opened
β
Categorize (keywords + AI)
β
Extract Information
β
Score Completeness
β
ββ Completeness β₯ 80? β Generate Brief β Apply Labels β DONE
ββ Round < 3? β Ask Questions β Wait for Response
ββ Round β₯ 3? β Escalate to Maintainers β DONE
Formula: (matched_fields * weights) / total_possible * 100
- 80-100: Actionable (generates engineer brief)
- 60-79: Needs clarification (asks 1-2 questions)
- <60: Missing critical info (asks 3+ questions)
Test bot behavior without actually commenting on issues:
-
Add environment variable in workflow:
env: SUPPORTBOT_DRY_RUN: "true"
-
Check workflow logs to see what bot would do:
[DRY-RUN] Would comment: "Thanks for the issue! Can you provide..." [DRY-RUN] Would apply labels: ["bug", "needs-info"]
Run comprehensive test scenarios:
cd evals/EvalRunner
dotnet run --test-file ../scenarios/sample_issue_runtime_crash.jsonExample output:
β Scenario: Runtime Crash Issue
Category: runtime (correct)
Completeness: 92/100
Brief Generated: Yes
Labels Applied: bug, runtime
Grade: A
Add repository variable OPENAI_MODEL:
- Go to Settings β Secrets and variables β Actions β Variables
- Name:
OPENAI_MODEL - Value:
gpt-4o-2024-08-06(orgpt-4-turbo-preview)
Add repository variable SUPPORTBOT_SPEC_DIR:
- Name:
SUPPORTBOT_SPEC_DIR - Value:
.github/supportbot-config(or your custom path)
You can define as many categories as needed:
categories:
- name: setup
- name: build
- name: runtime
- name: performance
- name: feature-request
- name: documentation
- name: securityAdjust field weights based on importance:
checklists:
runtime:
- field: "Error Message"
weight: 30 # Most important
- field: "Steps to Reproduce"
weight: 25 # Very important
- field: "Expected Behavior"
weight: 15 # Important
- field: "Actual Behavior"
weight: 15 # Important
- field: "Environment"
weight: 15 # Moderately important# Build project
cd src/SupportConcierge
dotnet build
# Run locally (requires GitHub webhook payload)
dotnet run --issue-payload path/to/issue.json
# Run evaluation tests
cd ../../evals/EvalRunner
dotnet run --scenario ../scenarios/sample_issue_runtime_crash.jsonCreate .env file:
GITHUB_TOKEN=ghp_your_token_here
OPENAI_API_KEY=sk-your_key_here
GITHUB_REPOSITORY=your-username/your-repo
SUPPORTBOT_DRY_RUN=true # Safe for testingEnable verbose logging in workflow:
env:
SUPPORTBOT_DEBUG: "true".
βββ src/SupportConcierge/ # Main bot application
β βββ Program.cs # Entry point
β βββ Orchestration/
β β βββ Orchestrator.cs # Main workflow logic
β β βββ StateStore.cs # State management
β βββ Agents/
β β βββ OpenAiClient.cs # OpenAI integration
β β βββ Schemas.cs # JSON schemas
β βββ Scoring/
β β βββ CompletenessScorer.cs # Scoring engine
β β βββ Validators.cs # Validation rules
β βββ GitHub/
β β βββ GitHubApi.cs # GitHub API client
β βββ Reporting/
β βββ CommentComposer.cs # Comment generation
β
βββ evals/EvalRunner/ # Testing harness
β βββ Program.cs
β βββ scenarios/ # Test cases
β
βββ .supportbot/ # Configuration templates
β βββ categories.yaml
β βββ checklists.yaml
β βββ validators.yaml
β βββ routing.yaml
β
βββ .github/workflows/
β βββ support-bot.yml # GitHub Actions workflow
β
βββ docs/ # Documentation
βββ guides/ # Setup guides
βββ technical/ # Architecture docs
βββ reference/ # Reference materials
- New validators: Add domain-specific validation rules
- Language support: I18n for non-English issues
- Platform integrations: Jira, Linear, etc.
- Enhanced scoring: ML-based completeness prediction
- UI improvements: Better comment formatting
This project is licensed under the MIT License - see LICENSE file.