GitHub Issues
Full issue lifecycle management using the gh CLI. Every command has a curl fallback for machines without gh.
Prerequisites
- GitHub CLI:
gh auth login(or setGH_TOKENenv var) - curl fallback: set
GITHUB_TOKENand know yourOWNER/REPO
bashexport OWNER=myorg export REPO=myrepo export GITHUB_TOKEN=ghp_...
List Issues
bash# Open issues gh issue list # Filter by label, assignee, state gh issue list --state open --label bug --assignee @me # All states gh issue list --state all --limit 50 # curl fallback curl -H "Authorization: token $GITHUB_TOKEN" \ "https://api.github.com/repos/$OWNER/$REPO/issues?state=open&per_page=20"
View an Issue
bashgh issue view 123 # Open in browser gh issue view 123 --web # curl fallback curl -H "Authorization: token $GITHUB_TOKEN" \ "https://api.github.com/repos/$OWNER/$REPO/issues/123"
Create an Issue
bashgh issue create \ --title "Fix null pointer in auth module" \ --body "Steps to reproduce:\n1. ...\n2. ..." \ --label "bug,priority:high" \ --assignee @me # Interactive gh issue create # curl fallback curl -X POST \ -H "Authorization: token $GITHUB_TOKEN" \ -H "Content-Type: application/json" \ "https://api.github.com/repos/$OWNER/$REPO/issues" \ -d '{"title":"Fix null pointer","body":"...","labels":["bug"]}'
Edit an Issue
bash# Add label gh issue edit 123 --add-label "priority:high" # Remove label gh issue edit 123 --remove-label "needs-triage" # Change assignee gh issue edit 123 --add-assignee username # Set milestone gh issue edit 123 --milestone "v2.0" # Change title gh issue edit 123 --title "New title"
Comment on an Issue
bashgh issue comment 123 --body "Looking into this now." # curl fallback curl -X POST \ -H "Authorization: token $GITHUB_TOKEN" \ -H "Content-Type: application/json" \ "https://api.github.com/repos/$OWNER/$REPO/issues/123/comments" \ -d '{"body":"Looking into this now."}'
Close / Reopen an Issue
bashgh issue close 123 gh issue close 123 --reason "completed" gh issue close 123 --comment "Fixed in #456" gh issue reopen 123
Search Issues
bashgh issue list --search "error in production" gh issue list --search "label:bug created:>2024-01-01" # GitHub search syntax gh issue list --search "is:open is:issue assignee:@me"
Link Issues to PRs
Reference issues in PR body or commits:
Fixes #123 Closes #456 Resolves #789
GitHub auto-closes linked issues when PR merges.
Bulk Operations
bash# Close all issues with a label gh issue list --label "wontfix" --json number --jq '.[].number' | \ xargs -I{} gh issue close {} --reason "not planned" # List issues as JSON gh issue list --json number,title,labels,assignees --limit 100
Milestones
bash# List milestones gh api repos/$OWNER/$REPO/milestones # Create milestone gh api repos/$OWNER/$REPO/milestones \ --method POST \ -f title="v2.0" \ -f due_on="2024-06-01T00:00:00Z"
Labels
bash# List labels gh label list # Create label gh label create "priority:high" --color FF0000 --description "Urgent" # Clone labels from another repo gh label clone owner/source-repo
Issue Templates
Create .github/ISSUE_TEMPLATE/bug_report.md:
markdown--- name: Bug Report about: Report a bug labels: bug --- ## Description ## Steps to Reproduce ## Expected vs Actual ## Environment


