Issue Report
Investigate a bug, confirm it hasn't been reported, optionally verify in source code, and file a structured issue — all in one workflow.
Arguments
/gh-issue-report— interactive: asks for repo and bug description/gh-issue-report <owner/repo> <description>— uses arguments directly
Phase 1: Intake
Resolve target repo:
- If argument includes
owner/repo, use it. - If the current directory is a git repo, offer it as default.
- Otherwise, ask.
- If argument includes
Bug description: If provided as argument, use it. Otherwise ask:
What bug are you seeing? Include steps to reproduce if you have them.
Determine repo locality:
- Check if the repo is cloned locally (look for matching remote in
git remote -vor check common paths). - Local: use file system tools (Read, Grep, Glob) for code investigation.
- Remote-only: use
gh apito fetch repo contents for code investigation.
- Check if the repo is cloned locally (look for matching remote in
Phase 2: Search Existing Issues
Search for duplicates using multiple query strategies in parallel:
gh issue list -R <repo> --state all --search "<keywords from description>" --limit 20Run 2-3 searches with different keyword combinations extracted from the bug description (e.g., key nouns, component names, error messages). Cast a wide net.
Evaluate matches:
- If a clear duplicate exists: show it to the user and ask whether to proceed or comment on the existing issue.
- If partial matches exist: show them and note the differences.
- If no matches: continue.
Phase 3: Check Repo Conventions
Fetch contributing guide and issue templates in parallel:
# Contributing guide gh api 'repos/<repo>/contents/CONTRIBUTING.md' --jq '.content' | base64 -d # Issue templates gh api 'repos/<repo>/contents/.github/ISSUE_TEMPLATE' --jq '.[].name'If issue templates exist, fetch the relevant one (usually
bug_report.mdorbug_report.yml):gh api 'repos/<repo>/contents/.github/ISSUE_TEMPLATE/<template>' --jq '.content' | base64 -dExtract conventions: note title prefix (e.g.,
[bug]), required labels, required sections, and any special instructions from the contributing guide.
Phase 4: Code Investigation
Adapt investigation depth based on what's achievable. Start lightweight; go deeper only when the lightweight pass yields promising leads.
Lightweight pass — identify relevant files:
For local repos:
Use Grep/Glob to find files matching component names, error messages, or keywords from the bug description.For remote repos:
gh api 'repos/<repo>/git/trees/main?recursive=1' --jq '.tree[].path' | grep -iE '<keywords>'If this yields no useful results (no matching files, or too many to be actionable), skip to Phase 5 and draft the issue without code-level root cause. Note in the issue body that root cause was not confirmed in code.
Deep investigation — if the lightweight pass found relevant files (< 10 candidates), read them to understand the bug:
For local repos: use Read tool directly.
For remote repos:
gh api 'repos/<repo>/contents/<path>' --jq '.content' | base64 -dUse subagents for parallel investigation when reading multiple files. Focus on:
- Where the relevant state is stored (React state, store, DB, etc.)
- What triggers the bug (lifecycle, navigation, race condition, etc.)
- Why the current implementation fails
Assess findings:
- Root cause confirmed: include it in the issue with file paths and line references.
- Suspected but unconfirmed: include as hypothesis, clearly labeled.
- Nothing actionable found: omit code analysis from the issue, describe only the observed behavior.
Phase 5: Draft Issue
Compose the issue following the repo's template and conventions:
Always include:
- Title: follow repo convention (e.g.,
[bug] ...), keep under 80 chars - Description: clear, concise explanation of the bug
- Steps to reproduce: numbered list
- Expected vs actual behaviour
Include when available:
- Root cause: with file paths and line references from Phase 4
- Suggested fix: if root cause is clear enough to propose a direction
- Environment: platform, version, relevant config
- Title: follow repo convention (e.g.,
Infer labels: fetch repo labels and match against the issue content:
gh label list -R <repo> --json name,description --jq '.[] | "\(.name)\t\(.description)"'Only use labels that exist on the repo. If the template specifies a label (e.g.,
bug), use it.Present draft to user:
Here's the issue I'll file. Want me to adjust anything?
Show the full title, labels, and body. Wait for approval.
Phase 6: File Issue
Create the issue:
gh issue create -R <repo> \ --title "<title>" \ --label "<labels>" \ --body "$(cat <<'EOF' <body> EOF )"Report result:
Filed: <issue-url>