5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-19 18:39:30 +08:00

Add issue management automation tools

This commit is contained in:
Lea Anthony 2025-05-14 20:46:51 +10:00
parent 2abd05f783
commit cbbba79340
No known key found for this signature in database
GPG Key ID: 33DAF7BB90A58405
9 changed files with 800 additions and 6 deletions

44
.github/file-labeler.yml vendored Normal file
View File

@ -0,0 +1,44 @@
# File path specific labels
v2-only:
- 'v2/**/*'
v3-alpha:
- 'v3/**/*'
windows:
- '**/*_windows.go'
- 'v2/internal/frontend/desktop/windows/**/*'
macos:
- '**/*_darwin.go'
- 'v2/internal/frontend/desktop/darwin/**/*'
linux:
- '**/*_linux.go'
- 'v2/internal/frontend/desktop/linux/**/*'
cli:
- 'v2/cmd/**/*'
- 'v3/cmd/**/*'
- '**/cli/**/*'
- '**/commands/**/*'
documentation:
- '**/*.md'
- 'docs/**/*'
- 'website/**/*'
- 'mkdocs-website/**/*'
templates:
- '**/templates/**/*'
- '**/template/**/*'
runtime:
- '**/runtime/**/*'
- 'v2/internal/runtime/**/*'
- 'v3/internal/runtime/**/*'
bindings:
- 'v2/internal/binding/**/*'
- 'v3/internal/generator/**/*'

144
.github/issue-labeler.yml vendored Normal file
View File

@ -0,0 +1,144 @@
# Version labels
v2-only:
- '\[v2\]'
- '\(v2\)'
- 'v2:'
- 'version 2'
- 'wails v2'
- 'using v2'
- 'master branch'
v3-alpha:
- '\[v3\]'
- '\(v3\)'
- 'v3:'
- '\[v3-alpha\]'
- '\(v3-alpha\)'
- 'version 3'
- 'wails v3'
- 'using v3'
- 'v3-alpha branch'
# Component labels
webview2:
- 'webview2'
- 'windows'
- 'microsoft edge'
- 'edge browser'
- 'IE'
- 'Explorer'
- 'browser crashes'
macos:
- 'macOS'
- 'mac OS'
- 'OS X'
- 'darwin'
- 'cocoa'
- 'Safari'
- 'Catalyst'
- 'Ventura'
- 'Sonoma'
- 'apple'
linux:
- 'linux'
- 'ubuntu'
- 'debian'
- 'fedora'
- 'gtk'
- 'webkitgtk'
- 'webkit2gtk'
- 'gnome'
- 'x11'
- 'wayland'
cli:
- 'cli'
- 'command line'
- 'wails doctor'
- 'wails init'
- 'wails build'
- 'wails dev'
- 'template'
- 'scaffolding'
# Type labels
bug:
- 'bug'
- 'crash'
- 'broken'
- 'failure'
- 'error'
- 'failed'
- 'panic'
- 'segfault'
- 'issue'
- 'not working'
- 'problem'
enhancement:
- 'feature'
- 'enhancement'
- 'request'
- 'add'
- 'new'
- 'improve'
- 'functionality'
- 'support for'
- 'please add'
- 'would be nice'
documentation:
- 'docs'
- 'documentation'
- 'readme'
- 'example'
- 'tutorial'
- 'guide'
- 'explanation'
- 'clarification'
- 'instructions'
security:
- 'security'
- 'vulnerability'
- 'exploit'
- 'hack'
- 'CVE'
- 'secure'
- 'encryption'
- 'hardening'
performance:
- 'performance'
- 'slow'
- 'speed'
- 'memory leak'
- 'cpu usage'
- 'high memory'
- 'lag'
- 'freeze'
- 'optimization'
# Priority labels
high-priority:
- 'urgent'
- 'critical'
- 'security'
- 'high priority'
- 'important'
- 'production'
- 'blocker'
- 'blocking'
question:
- 'how to'
- 'how do i'
- 'can I'
- 'is it possible'
- 'question'
- 'help me'
- 'need help'
- 'assistance'
- 'confused'

22
.github/stale.yml vendored
View File

@ -1,7 +1,7 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 30
daysUntilStale: 45
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
daysUntilClose: 10
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
@ -9,14 +9,24 @@ exemptLabels:
- onhold
- inprogress
- "Selected For Development"
- bug
- enhancement
- v3-alpha
- high-priority
# Label to use when marking an issue as stale
staleLabel: "Wont Fix"
staleLabel: "stale"
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
recent activity. It will be closed if no further activity occurs within the next 10 days.
If this issue is still relevant, please add a comment to keep it open.
Thank you for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
closeComment: >
This issue has been automatically closed due to lack of activity.
Please feel free to reopen it if it's still relevant.
exemptMilestones: true
exemptAssignees: true
# Only mark issues (not PRs)
only: issues

33
.github/workflows/auto-label-issues.yml vendored Normal file
View File

@ -0,0 +1,33 @@
name: Auto Label Issues
on:
issues:
types: [opened, edited, reopened]
pull_request:
types: [opened, edited, reopened, synchronize]
jobs:
auto-label:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Label issues and PRs by content
uses: github/issue-labeler@v3
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
configuration-path: .github/issue-labeler.yml
enable-versioned-regex: 0
include-title: 1
- name: Label issues and PRs by file paths
uses: actions/labeler@v4
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
configuration-path: .github/file-labeler.yml
sync-labels: true

View File

@ -0,0 +1,77 @@
name: Issue Triage Automation
on:
issues:
types: [opened, reopened, labeled, unlabeled]
jobs:
triage:
runs-on: ubuntu-latest
permissions:
issues: write
contents: read
steps:
# Request more info for unclear bug reports
- name: Request more info
uses: actions/github-script@v6
if: |
contains(github.event.issue.labels.*.name, 'bug') &&
!contains(github.event.issue.body, 'wails doctor') &&
!contains(github.event.issue.body, 'reproduction')
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: `👋 Thanks for reporting this issue! To help us investigate, could you please:
1. Add the output of \`wails doctor\` if not already included
2. Provide clear steps to reproduce the issue
3. If possible, create a minimal reproduction of the issue
This will help us resolve your issue much faster. Thank you!`
});
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['awaiting feedback']
});
# Prioritize security issues
- name: Prioritize security issues
uses: actions/github-script@v6
if: contains(github.event.issue.labels.*.name, 'security')
with:
script: |
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['high-priority']
});
# Tag version-specific issues for project boards
- name: Add to v2 project
uses: actions/github-script@v6
if: |
contains(github.event.issue.labels.*.name, 'v2-only') &&
!contains(github.event.issue.labels.*.name, 'v3-alpha')
with:
script: |
// Replace PROJECT_ID with your actual GitHub project ID
// This is a placeholder as the actual implementation would require
// GraphQL API calls to add to a project board
console.log('Would add to v2 project board');
# Tag version-specific issues for project boards
- name: Add to v3 project
uses: actions/github-script@v6
if: contains(github.event.issue.labels.*.name, 'v3-alpha')
with:
script: |
// Replace PROJECT_ID with your actual GitHub project ID
// This is a placeholder as the actual implementation would require
// GraphQL API calls to add to a project board
console.log('Would add to v3 project board');

View File

@ -0,0 +1,123 @@
# Wails Issue Management Automation
This directory contains automation workflows and scripts to help manage the Wails project with minimal time investment.
## GitHub Workflow Files
### 1. Auto-Label Issues (`auto-label-issues.yml`)
- Automatically labels issues and PRs based on their content and modified files
- Labels are defined in `issue-labeler.yml` and `file-labeler.yml`
- Activates when issues are opened, edited, or reopened
### 2. Issue Triage Automation (`issue-triage-automation.yml`)
- Performs automated actions for issue triage
- Requests more info for incomplete bug reports
- Prioritizes security issues
- Adds issues to appropriate project boards
## Configuration Files
### 1. Issue Content Labeler (`issue-labeler.yml`)
- Defines patterns to match in issue title/body
- Categorizes by version (v2/v3), component, type, and priority
- Customize patterns as needed for your project
### 2. File Path Labeler (`file-labeler.yml`)
- Labels PRs based on which files they modify
- Helps identify which areas of the codebase are affected
- Customize file patterns as needed
### 3. Stale Issues Config (`stale.yml`)
- Marks issues as stale after 45 days of inactivity
- Closes stale issues after an additional 10 days
- Exempts issues with important labels
## Helper Scripts
### 1. Issue Triage Script (`scripts/issue-triage.ps1`)
- PowerShell script to quickly triage issues
- Lists recent issues needing attention
- Provides easy keyboard shortcuts for common actions
- Run during your dedicated issue triage time
### 2. PR Review Helper (`scripts/pr-review-helper.ps1`)
- PowerShell script to efficiently review PRs
- Generates review checklists
- Provides easy shortcuts for common review actions
- Run during your dedicated PR review time
## How to Use This System
### Daily Workflow (2 hours max)
**Monday (120 min):**
1. Run `scripts/issue-triage.ps1` (30 min)
2. Run `scripts/pr-review-helper.ps1` (30 min)
3. Check Discord for critical discussions (30 min)
4. Plan your week (30 min)
**Tuesday-Wednesday (120 min/day):**
1. Quick check for urgent issues (10 min)
2. v3 development (110 min)
**Thursday (120 min):**
1. v2 maintenance (90 min)
2. Documentation updates (30 min)
**Friday (120 min):**
1. Run `scripts/pr-review-helper.ps1` (60 min)
2. Discord updates/newsletter (30 min)
3. Weekly reflection (30 min)
## Installation
1. The GitHub workflow files should be placed in `.github/workflows/`
2. Configuration files should be placed in `.github/`
3. Helper scripts should be placed in `scripts/`
4. Make sure you have GitHub CLI (`gh`) installed and authenticated
## Customization
Feel free to modify the configuration files and scripts to better suit your project's needs:
1. **Adding New Label Categories**:
- Add new patterns to `issue-labeler.yml` for additional components or types
- Update `file-labeler.yml` if you add new directories or file types
2. **Adjusting Automation Thresholds**:
- Modify `stale.yml` to change how long issues remain active
- Update `issue-triage-automation.yml` to change conditions for automated actions
3. **Customizing Scripts**:
- Update the scripts with your specific GitHub username
- Add additional actions based on your workflow preferences
- Adjust time allocations based on which tasks need more attention
## Benefits
This automated issue management system will:
1. **Save Time**: Reduce manual triage of most common issues
2. **Improve Consistency**: Apply the same categorization rules every time
3. **Increase Visibility**: Clear categorization helps community members find issues
4. **Focus Development**: Clearer separation of v2 and v3 work
5. **Reduce Backlog**: Better management of stale issues
6. **Streamline Reviews**: Faster PR processing with guided workflows
## Requirements
- GitHub CLI (`gh`) installed and authenticated
- PowerShell 5.1+ for Windows scripts
- GitHub Actions enabled on your repository
- Appropriate permissions to modify workflows
## Maintenance
This system requires minimal maintenance:
- Periodically review and update label patterns as your project evolves
- Adjust time allocations based on where you need to focus
- Update scripts if GitHub CLI commands change
- Customize the workflow as you find pain points in your process
Remember that the goal is to maximize your limited time (2 hours per day) by automating repetitive tasks and streamlining essential ones.

108
scripts/issue-triage.ps1 Normal file
View File

@ -0,0 +1,108 @@
# issue-triage.ps1 - Script to help with quick issue triage
# Run this at the start of your GitHub time to quickly process issues
# Set your GitHub username
$GITHUB_USERNAME = "your-username"
# Get the latest 10 open issues that aren't assigned and aren't labeled as "awaiting feedback"
Write-Host "Fetching recent unprocessed issues..."
gh issue list --repo wailsapp/wails --limit 10 --json number,title,labels,assignees | Out-File -Encoding utf8 -FilePath "issues_temp.json"
$issues = Get-Content -Raw -Path "issues_temp.json" | ConvertFrom-Json
$newIssues = $issues | Where-Object {
$_.assignees.Count -eq 0 -and
($_.labels.Count -eq 0 -or -not ($_.labels | Where-Object { $_.name -eq "awaiting feedback" }))
}
# Process each issue
Write-Host "`n===== Issues Needing Triage =====`n"
foreach ($issue in $newIssues) {
$number = $issue.number
$title = $issue.title
$labelNames = $issue.labels | ForEach-Object { $_.name }
$labelsStr = if ($labelNames) { $labelNames -join ", " } else { "none" }
Write-Host "Issue #$number`: $title"
Write-Host "Labels: $labelsStr`n"
$continue = $true
while ($continue) {
Write-Host "Options:"
Write-Host " [v] View issue in browser"
Write-Host " [2] Add v2-only label"
Write-Host " [3] Add v3-alpha label"
Write-Host " [b] Add bug label"
Write-Host " [e] Add enhancement label"
Write-Host " [d] Add documentation label"
Write-Host " [w] Add webview2 label"
Write-Host " [f] Request more info (awaiting feedback)"
Write-Host " [c] Close issue (duplicate/invalid)"
Write-Host " [a] Assign to yourself"
Write-Host " [s] Skip to next issue"
Write-Host " [q] Quit script"
$action = Read-Host "Enter action"
switch ($action) {
"v" {
gh issue view $number --repo wailsapp/wails --web
}
"2" {
Write-Host "Adding v2-only label..."
gh issue edit $number --repo wailsapp/wails --add-label "v2-only"
}
"3" {
Write-Host "Adding v3-alpha label..."
gh issue edit $number --repo wailsapp/wails --add-label "v3-alpha"
}
"b" {
Write-Host "Adding bug label..."
gh issue edit $number --repo wailsapp/wails --add-label "Bug"
}
"e" {
Write-Host "Adding enhancement label..."
gh issue edit $number --repo wailsapp/wails --add-label "Enhancement"
}
"d" {
Write-Host "Adding documentation label..."
gh issue edit $number --repo wailsapp/wails --add-label "Documentation"
}
"w" {
Write-Host "Adding webview2 label..."
gh issue edit $number --repo wailsapp/wails --add-label "webview2"
}
"f" {
Write-Host "Requesting more info..."
gh issue comment $number --repo wailsapp/wails --body "Thank you for reporting this issue. Could you please provide additional information to help us investigate?`n`n- [Specific details needed]`n`nThis will help us address your issue more effectively."
gh issue edit $number --repo wailsapp/wails --add-label "awaiting feedback"
}
"c" {
$reason = Read-Host "Reason for closing (duplicate/invalid/etc)"
gh issue comment $number --repo wailsapp/wails --body "Closing this issue: $reason"
gh issue close $number --repo wailsapp/wails
}
"a" {
Write-Host "Assigning to yourself..."
gh issue edit $number --repo wailsapp/wails --add-assignee "$GITHUB_USERNAME"
}
"s" {
Write-Host "Skipping to next issue..."
$continue = $false
}
"q" {
Write-Host "Exiting script."
exit
}
default {
Write-Host "Invalid option. Please try again."
}
}
Write-Host ""
}
Write-Host "--------------------------------`n"
}
Write-Host "No more issues to triage!"
# Clean up temp file
Remove-Item -Path "issues_temp.json"

103
scripts/issue-triage.sh Normal file
View File

@ -0,0 +1,103 @@
#!/bin/bash
# issue-triage.sh - Script to help with quick issue triage
# Run this at the start of your GitHub time to quickly process issues
# Set your GitHub username
GITHUB_USERNAME="your-username"
# Get the latest 10 open issues that aren't assigned and aren't labeled as "awaiting feedback"
echo "Fetching recent unprocessed issues..."
gh issue list --repo wailsapp/wails --limit 10 --json number,title,labels,assignees --jq '.[] | select(.assignees | length == 0) | select(any(.labels[]; .name != "awaiting feedback"))' > new_issues.json
# Process each issue
echo -e "\n===== Issues Needing Triage =====\n"
cat new_issues.json | jq -c '.[]' | while read -r issue; do
number=$(echo $issue | jq -r '.number')
title=$(echo $issue | jq -r '.title')
labels=$(echo $issue | jq -r '.labels[] | .name' 2>/dev/null | tr '\n' ', ' | sed 's/,$//')
if [ -z "$labels" ]; then
labels="none"
fi
echo -e "Issue #$number: $title"
echo -e "Labels: $labels\n"
while true; do
echo "Options:"
echo " [v] View issue in browser"
echo " [2] Add v2-only label"
echo " [3] Add v3-alpha label"
echo " [b] Add bug label"
echo " [e] Add enhancement label"
echo " [d] Add documentation label"
echo " [w] Add webview2 label"
echo " [f] Request more info (awaiting feedback)"
echo " [c] Close issue (duplicate/invalid)"
echo " [a] Assign to yourself"
echo " [s] Skip to next issue"
echo " [q] Quit script"
read -p "Enter action: " action
case $action in
v)
gh issue view $number --repo wailsapp/wails --web
;;
2)
echo "Adding v2-only label..."
gh issue edit $number --repo wailsapp/wails --add-label "v2-only"
;;
3)
echo "Adding v3-alpha label..."
gh issue edit $number --repo wailsapp/wails --add-label "v3-alpha"
;;
b)
echo "Adding bug label..."
gh issue edit $number --repo wailsapp/wails --add-label "Bug"
;;
e)
echo "Adding enhancement label..."
gh issue edit $number --repo wailsapp/wails --add-label "Enhancement"
;;
d)
echo "Adding documentation label..."
gh issue edit $number --repo wailsapp/wails --add-label "Documentation"
;;
w)
echo "Adding webview2 label..."
gh issue edit $number --repo wailsapp/wails --add-label "webview2"
;;
f)
echo "Requesting more info..."
gh issue comment $number --repo wailsapp/wails --body "Thank you for reporting this issue. Could you please provide additional information to help us investigate?\n\n- [Specific details needed]\n\nThis will help us address your issue more effectively."
gh issue edit $number --repo wailsapp/wails --add-label "awaiting feedback"
;;
c)
read -p "Reason for closing (duplicate/invalid/etc): " reason
gh issue comment $number --repo wailsapp/wails --body "Closing this issue: $reason"
gh issue close $number --repo wailsapp/wails
;;
a)
echo "Assigning to yourself..."
gh issue edit $number --repo wailsapp/wails --add-assignee "$GITHUB_USERNAME"
;;
s)
echo "Skipping to next issue..."
break
;;
q)
echo "Exiting script."
exit 0
;;
*)
echo "Invalid option. Please try again."
;;
esac
echo ""
done
echo -e "--------------------------------\n"
done
echo "No more issues to triage!"

View File

@ -0,0 +1,152 @@
# pr-review-helper.ps1 - Script to help with efficient PR reviews
# Run this during your PR review time
# Set your GitHub username
$GITHUB_USERNAME = "your-username"
# Get open PRs that are ready for review
Write-Host "Fetching PRs ready for review..."
gh pr list --repo wailsapp/wails --json number,title,author,labels,reviewDecision,additions,deletions,baseRefName,headRefName --limit 10 | Out-File -Encoding utf8 -FilePath "prs_temp.json"
$prs = Get-Content -Raw -Path "prs_temp.json" | ConvertFrom-Json
# Process each PR
Write-Host "`n===== PRs Needing Review =====`n"
foreach ($pr in $prs) {
$number = $pr.number
$title = $pr.title
$author = $pr.author.login
$labels = if ($pr.labels) { $pr.labels | ForEach-Object { $_.name } | Join-String -Separator ", " } else { "none" }
$reviewState = if ($pr.reviewDecision) { $pr.reviewDecision } else { "PENDING" }
$baseRef = $pr.baseRefName
$headRef = $pr.headRefName
$changes = $pr.additions + $pr.deletions
Write-Host "PR #$number`: $title"
Write-Host "Author: $author"
Write-Host "Labels: $labels"
Write-Host "Branch: $headRef -> $baseRef"
Write-Host "Changes: +$($pr.additions)/-$($pr.deletions) lines"
Write-Host "Review state: $reviewState`n"
# Determine complexity based on size
$complexity = if ($changes -lt 50) {
"Quick review"
} elseif ($changes -lt 300) {
"Moderate review"
} else {
"Extensive review"
}
Write-Host "Complexity: $complexity"
$continue = $true
while ($continue) {
Write-Host "`nOptions:"
Write-Host " [v] View PR in browser"
Write-Host " [d] View diff in browser"
Write-Host " [c] Generate review checklist"
Write-Host " [a] Approve PR"
Write-Host " [r] Request changes"
Write-Host " [m] Add comment"
Write-Host " [l] Add labels"
Write-Host " [s] Skip to next PR"
Write-Host " [q] Quit script"
$action = Read-Host "Enter action"
switch ($action) {
"v" {
gh pr view $number --repo wailsapp/wails --web
}
"d" {
gh pr diff $number --repo wailsapp/wails --web
}
"c" {
# Generate review checklist
$checklist = @"
## PR Review: $title
### Basic Checks:
- [ ] PR title is descriptive
- [ ] PR description explains the changes
- [ ] Related issues are linked
### Technical Checks:
- [ ] Code follows project style
- [ ] No unnecessary commented code
- [ ] Error handling is appropriate
- [ ] Documentation updated (if needed)
- [ ] Tests included (if needed)
### Impact Assessment:
- [ ] Changes are backward compatible (if applicable)
- [ ] No breaking changes to public APIs
- [ ] Performance impact considered
### Version Specific:
"@
if ($baseRef -eq "master") {
$checklist += @"
- [ ] Appropriate for v2 maintenance
- [ ] No features that should be v3-only
"@
} elseif ($baseRef -eq "v3-alpha") {
$checklist += @"
- [ ] Appropriate for v3 development
- [ ] Aligns with v3 roadmap
"@
}
# Write to clipboard
$checklist | Set-Clipboard
Write-Host "`nReview checklist copied to clipboard!`n"
}
"a" {
$comment = Read-Host "Approval comment (blank for none)"
if ($comment) {
gh pr review $number --repo wailsapp/wails --approve --body $comment
} else {
gh pr review $number --repo wailsapp/wails --approve
}
}
"r" {
$comment = Read-Host "Feedback for changes requested"
gh pr review $number --repo wailsapp/wails --request-changes --body $comment
}
"m" {
$comment = Read-Host "Comment text"
gh pr comment $number --repo wailsapp/wails --body $comment
}
"l" {
$labels = Read-Host "Labels to add (comma-separated)"
$labelArray = $labels -split ","
foreach ($label in $labelArray) {
$labelTrimmed = $label.Trim()
if ($labelTrimmed) {
gh pr edit $number --repo wailsapp/wails --add-label $labelTrimmed
}
}
}
"s" {
Write-Host "Skipping to next PR..."
$continue = $false
}
"q" {
Write-Host "Exiting script."
exit
}
default {
Write-Host "Invalid option. Please try again."
}
}
}
Write-Host "--------------------------------`n"
}
Write-Host "No more PRs to review!"
# Clean up temp file
Remove-Item -Path "prs_temp.json"