This directory contains all GitHub-specific configuration including workflows, issue templates, and automation.
.github/
βββ workflows/ # GitHub Actions workflows
β βββ issue-triage.yml # Automated issue labeling & duplicate detection
β βββ label-sync.yml # Label configuration synchronization
β βββ project-automation.yml # Stale issues, auto-assign, etc.
βββ ISSUE_TEMPLATE/ # Issue templates
β βββ bug_report.yml # Bug report template
β βββ feature_request.yml # Feature request template
β βββ documentation.yml # Documentation improvement template
β βββ config.yml # Template configuration
βββ bot-templates/ # Standardized bot comment templates
β βββ duplicate-detected.md
β βββ welcome-first-issue.md
β βββ needs-more-info.md
β βββ stale-issue.md
β βββ resolved-closing.md
βββ labels.yml # Label configuration (source of truth)
βββ TRIAGE_PROCESS.md # Comprehensive triage documentation
βββ MAINTAINER_GUIDE.md # Quick reference for maintainers
βββ README.md # This file
Opening an Issue:
- Search existing issues first
- Choose appropriate template
- Fill out all required fields
- Bot will auto-label and check for duplicates
- Maintainer will review and triage
Issue Templates:
- Bug Report - Report broken functionality
- Feature Request - Suggest improvements
- Documentation - Improve docs
Daily Triage:
# View issues needing triage
gh issue list --label "status/need-triage"
# Quick triage
gh issue edit <number> \
--remove-label "status/need-triage" \
--add-label "status/triaged,priority/p2"Resources:
- Maintainer Guide - Quick reference
- Triage Process - Full documentation
Triggers: Issue opened, edited, reopened
What it does:
- Analyzes issue content for keywords
- Applies area, priority, and kind labels
- Detects duplicate issues using TF-IDF similarity
- Posts welcome message for first-time contributors
- Flags issues needing more information
Example Output:
Labels Applied:
- status/need-triage
- area/frontend
- kind/bug
- priority/p2
Duplicates Found: 2
- #123 (85% similar)
- #456 (72% similar)Triggers: Push to main changing labels.yml, manual dispatch
What it does:
- Syncs repository labels with
labels.ymlconfiguration - Creates new labels
- Updates existing label descriptions/colors
- Does not delete labels (safety feature)
Triggers: Issues/PRs opened, labeled, closed; Daily schedule
What it does:
- Auto-assigns issues based on area labels
- Marks stale issues (60 days inactive)
- Closes stale issues (7 days after marked)
- Checks for missing information in bug reports
Schedule:
- Stale check: Daily at 00:00 UTC
Our label system follows this structure:
- Status: Workflow state (
status/*) - Area: Component affected (
area/*) - Priority: Severity level (
priority/*) - Kind: Issue type (
kind/*)
Labels are defined in labels.yml. Changes to this file automatically sync to the repository.
Adding a new label:
- name: area/new-component
color: "1F77B4"
description: "Description of the component"Color codes:
- Use 6-digit hex without
#prefix - Example:
FF0000not#FF0000
Our bot uses text similarity analysis to detect duplicates:
- TF-IDF Vectorization: Converts issue text to numerical vectors
- Cosine Similarity: Calculates similarity scores
- Threshold: 30% similarity triggers duplicate flag
- Results: Top 5 matches posted as comment
- Target: 60%+ duplicate detection rate
- False Positives: <10%
- Tuning: Adjust threshold in
issue-triage.yml
## Possible Duplicate Issues Detected
This issue appears similar to the following existing issues:
- π’ Open #123: [Similar title](link) (85% similar)
- π΄ Closed #456: [Another issue](link) (72% similar)
---
**Note**: This is automated detection. Please review linked issues.Standardized markdown templates in bot-templates/ ensure consistent messaging:
| Template | Usage |
|---|---|
duplicate-detected.md |
When duplicates are found |
welcome-first-issue.md |
First-time contributor greeting |
needs-more-info.md |
Requesting additional details |
stale-issue.md |
Marking inactive issues |
resolved-closing.md |
Closing resolved issues |
In workflow:
const template = fs.readFileSync('.github/bot-templates/duplicate-detected.md', 'utf8');
const comment = template.replace('{{DUPLICATE_LIST}}', duplicateList);Manual (via CLI):
gh issue comment <number> --body "$(cat .github/bot-templates/needs-more-info.md)"Track these to assess triage effectiveness:
| Metric | Target | How to Measure |
|---|---|---|
| Time to triage | <24 hours | Check status/need-triage age |
| Duplicate detection | 60%+ | Review status/possible-duplicate accuracy |
| False positives | <10% | Manual review of bot labels |
| Stale rate | <5% | Count stale issues / total open |
# Issues triaged this month
gh issue list --search "label:status/triaged created:>=$(date -v-30d +%Y-%m-%d)" --json number | jq '. | length'
# Duplicates detected
gh issue list --label "status/possible-duplicate" --json number | jq '. | length'
# Current stale issues
gh issue list --label "stale" --json number | jq '. | length'Edit workflows/issue-triage.yml:
const config = {
areaLabels: {
'area/frontend': ['react', 'next.js', 'ui', 'component'],
// Add/remove keywords
},
priorityLabels: {
'priority/p0': ['critical', 'urgent', 'production down'],
// Adjust severity keywords
}
};// Current: 30% similarity
if (i > 0 && measure > 0.3) {
// Increase for fewer false positives (e.g., 0.5)
// Decrease to catch more duplicates (e.g., 0.2)
}Edit workflows/project-automation.yml:
days-before-stale: 60 # Days before marking stale
days-before-close: 7 # Days after stale before closingCheck permissions:
permissions:
issues: write
contents: readView workflow runs:
gh run list --workflow=issue-triage.yml
gh run view <run-id> --logCheck trigger conditions:
on:
issues:
types: [opened, edited, reopened]Verify bot has write access:
- Settings β Actions β General β Workflow permissions
- Select "Read and write permissions"
Dependencies missing:
npm install --no-save natural compromiseSimilarity threshold too high/low:
- Adjust
measure > 0.3inissue-triage.yml - Higher = fewer duplicates flagged
- Lower = more false positives
- Review Weekly: Check bot accuracy on recent issues
- Update Keywords: Add new patterns as project evolves
- Monitor False Positives: Adjust thresholds if needed
- Test Changes: Use workflow_dispatch for manual testing
- Document Updates: Note changes in commit messages
- Trust but Verify: Review bot labels before finalizing triage
- Provide Feedback: Comment on bot accuracy in maintainer channel
- Use Templates: Leverage bot-templates for consistency
- Close Decisively: Don't leave issues in limbo
- Update Docs: Keep triage docs current with process changes
Add new keywords:
- Edit
workflows/issue-triage.yml - Add keywords to appropriate label category
- Test on recent issues
- Submit PR with examples
Create new templates:
- Add template to
bot-templates/ - Use
{{PLACEHOLDER}}for dynamic content - Document usage in this README
- Update workflows to use template
Adjust label schema:
- Edit
labels.yml - Push to main (auto-syncs)
- Update documentation
- Announce in team channel
- GitHub Actions Documentation
- Issue Template Syntax
- Label Best Practices
- Gemini CLI Triage System (Inspiration)
- General: Open a discussion
- Bugs: Open an issue
- Triage: See TRIAGE_PROCESS.md
- Quick Help: MAINTAINER_GUIDE.md
Last Updated: 2026-01-18 Maintained By: AINative Studio DevOps Team