From github-issue-tracker
Track edge cases, TODOs, and deferred work as GitHub issues using the gh CLI. Use this skill proactively whenever a development task surfaces an edge case, a bug to fix later, a refactor opportunity, or any work that should be handled in a separate session. Also use when the user asks to create issues from a TODO file (TODO.md, TODO.txt, TODO) found in the repository. Triggers include: discovering unexpected behavior during implementation, noting 'we should also handle X', finding tech debt, or when the user says 'create an issue', 'track this', 'log this for later', 'this needs its own PR', or similar phrases. Even if the user doesn't explicitly ask, suggest creating an issue when you notice work that clearly belongs in a separate session.
How this skill is triggered — by the user, by Claude, or both
Slash command
/github-issue-tracker:github-issue-trackerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Track deferred work, edge cases, and TODOs as GitHub issues directly from Claude Code
Track deferred work, edge cases, and TODOs as GitHub issues directly from Claude Code
using the gh CLI — keeping the current session focused while ensuring nothing slips
through the cracks.
The gh CLI must be installed and authenticated. Verify before any issue creation:
gh auth status
If not authenticated, ask the user to run gh auth login and stop.
Detect the repo automatically from the working directory:
gh repo view --json nameWithOwner -q .nameWithOwner
If this fails (no git repo, no remote), ask the user for owner/repo.
Default to English for issue titles, bodies, and comments — GitHub issues are a shared artifact and English keeps them accessible to any contributor. If the user explicitly asks for another language, or the repository's existing issues are consistently in a different language, follow that convention instead.
Check if the repo has issue templates:
ls .github/ISSUE_TEMPLATE/ 2>/dev/null
Templates can be Markdown files (bug_report.md, feature_request.md) or YAML
form definitions (bug_report.yml). If templates exist, read them and use the one
that best fits the issue type. For YAML form templates, extract the field structure
and fill in the relevant sections. Fall back to the default structure below when no
template matches.
During development, suggest creating an issue when you notice:
Frame it naturally:
"I noticed [X] — this seems like it deserves its own issue so we don't lose track of it. Want me to create one?"
The goal is traceability: every piece of deferred work gets a GitHub issue so it can be prioritized, assigned, and tracked — rather than forgotten in a chat log.
Being proactive is valuable, but being noisy is not. Hold back when:
If the user says "no" or "not now" to a suggestion, respect it for the rest of the session. Don't bring up the same topic again unless the user explicitly revisits it.
These rules apply to every issue, whether from an edge case or a TODO file.
Concise, imperative, with a conventional prefix when the type is clear:
| Prefix | When |
|---|---|
fix: | Bug or broken behavior |
feat: | New functionality |
chore: | Cleanup, refactor, tech debt |
test: | Missing or broken tests |
docs: | Documentation gaps |
perf: | Performance improvement |
security: | Security concern |
Use this structure, dropping sections that don't apply:
## Context
Discovered while working on branch `<branch>` (PR #<number> if exists).
## Problem
<what the edge case / bug / improvement is — be specific>
## Suggested approach
<files, functions, or steps when known — omit if unclear>
The branch/PR reference gives bidirectional traceability — whoever picks up the issue can see where and why it was discovered.
Code snippets — when the issue involves specific code, include a short snippet (5-10 lines max) with file path and line numbers:
## Problem
The rate limiter assumes `tenant_id` is always present:
```typescript
// src/middleware/rate-limit.ts:45-49
const key = `rate:${req.tenant_id}`; // null for unauthenticated requests
const count = await redis.incr(key);
```
Unauthenticated requests share a single `rate:null` key, bypassing per-tenant limits.
Infer from content:
| Content signals | Label |
|---|---|
| Bug, broken behavior, inconsistency | bug |
| New feature, new endpoint, new field | enhancement |
| Auth, tokens, rate limiting | security |
| Infra, Docker, CI, backups | ops |
| Tests, coverage, assertions | testing |
| Docs, runbooks | documentation |
| Cleanup, refactor, tech debt | chore |
Apply multiple labels when appropriate. Stick to this list unless the user asks for others.
Before creating any issue, search for similar ones. Extract 2-3 keywords from the drafted title and search:
gh issue list --search "keyword1 keyword2" --state all --limit 5 \
--json number,title,state,url
Then follow one of these paths:
| What you find | Action |
|---|---|
| Open issue that matches | Show it to the user. If confirmed as the same problem, add a comment to the existing issue with the new context instead of creating a duplicate. |
| Closed issue that matches | The problem resurfaced. Create a new issue and reference the closed one: Previously tracked in #X (closed). |
| Related but distinct open issues | Create the new issue and add Related to #X, #Y at the bottom of the body. |
| Nothing found | Continue normally. |
gh issue comment <number> --body "$(cat <<'EOF'
## Additional context
Discovered again while working on branch `<branch>` (PR #<number> if exists).
**Location:** `src/middleware/rate-limit.ts:47`
**Details:**
<edge case description, new information, etc.>
EOF
)"
After commenting, report it:
Added context to existing #38: fix: rate limiter bypass for unauthenticated requests
→ https://github.com/owner/repo/issues/38
Then offer the TODO(#issue) code comment (see "Link back to code" below).
After creating an issue or commenting on one, offer to add a TODO comment at
the exact location in the code where the edge case was found:
Want me to add a TODO comment linking to this issue?
→ src/middleware/rate-limit.ts:47
If the user accepts, insert a comment in the appropriate language syntax:
// TODO(#53): handle null tenant_id — bypasses rate limiting
# TODO(#53): handle null tenant_id — bypasses rate limiting
This creates a two-way link: the issue references the code, the code references the issue.
This is the main use case: you're working on a task and something comes up that should be handled separately.
You already have the context from the session — use it:
Also capture the current branch and any open PR:
git branch --show-current
gh pr view --json number,url -q '"PR #\(.number) → \(.url)"' 2>/dev/null
Compose title, body, and labels following the rules in "Issue anatomy" above.
Follow the "Duplicate and related issue search" section. If the result is commenting on an existing issue, skip to step 6.
Show what will be created and wait for explicit confirmation:
I'll create this issue in owner/repo:
Title: fix: handle null tenant_id in rate limiter
Labels: bug, security
## Context
Discovered while implementing the multi-tenant throttle (#42).
## Problem
The rate limiter assumes tenant_id is always present, but
unauthenticated requests have tenant_id=null, bypassing limits.
## Suggested approach
Add a fallback key (IP-based) in src/middleware/rate-limit.ts:47
when tenant_id is null.
Create this issue?
gh issue create \
--title "fix: handle null tenant_id in rate limiter" \
--body "$(cat <<'EOF'
...
EOF
)" \
--label "bug" --label "security"
If a label doesn't exist in the repo, gh will error. Retry without that label
and tell the user which one was skipped.
After creation, offer optional metadata if the repo uses them:
gh issue edit <number> --add-assignee @me)gh api repos/{owner}/{repo}/milestones), offer to attach onegh issue edit <number> --add-project "Project Name"These are opt-in — don't add them silently, and don't ask about all three every time. Offer only when contextually relevant (e.g., suggest assignee for the user's own TODOs, suggest milestone if the user mentioned a release target).
Report the result, then offer the code link (see "Link back to code").
Created #53: fix: handle null tenant_id in rate limiter
→ https://github.com/owner/repo/issues/53
When the user asks to process a TODO file, or you detect one during exploration.
Look in the repo root for common names: TODO.md, TODO.txt, TODO.
If not found and the user asked for it, ask where their TODO file is.
Support common formats:
- [ ] task (ignore checked - [x])- task or * task1. taskFor each item, compose title, body, and labels following "Issue anatomy".
Grouping: if multiple items clearly belong to the same atomic change (same file, same feature, would ship in one PR), group them into a single issue with GitHub task lists in the body:
## Tasks
- [ ] Validate email format on registration endpoint
- [ ] Add email format validation to profile update endpoint
- [ ] Add shared email validator utility
This lets the assignee track progress per sub-item, and GitHub shows a progress bar on the issue card. Tell the user about any grouping before proceeding.
For each item, run the duplicate search (see "Duplicate and related issue search"). Then show a single combined preview with the results:
I'll process 4 items from TODO.md in owner/repo:
# Title Labels Action
─ ──────────────────────────────────────────── ───────────── ──────────────
1 fix: validate email format on signup bug create
2 feat: add CSV export to reports enhancement create
3 chore: remove deprecated v1 endpoints chore → comment #28
4 test: add integration tests for payment flow testing create (rel #31)
→ 3 new issues will be created
→ 1 comment will be added to #28
Proceed?
Wait for confirmation.
Create issues and add comments one at a time to avoid rate limits:
gh issue create --title "..." --body "..." --label "..."
gh issue comment 28 --body "..."
Processed 4 items from TODO.md:
#12 fix: validate email format on signup → .../issues/12 (created)
#13 feat: add CSV export to reports → .../issues/13 (created)
#28 chore: remove deprecated v1 endpoints → .../issues/28 (commented)
#14 test: add integration tests for payment flow → .../issues/14 (created, rel #31)
| Error | Action |
|---|---|
gh not installed | Tell the user to install it |
| Not authenticated | Ask user to run gh auth login |
| Repo not found / no remote | Confirm owner/repo with the user |
| Label doesn't exist | Retry without it, tell the user |
| Network failure | Report and stop |
When creating multiple issues, if one fails, report which succeeded and which failed before stopping.
This skill creates issues and adds comments — nothing else. It does not:
npx claudepluginhub maescalantehe/agent-skills --plugin github-issue-trackerCreates well-structured GitHub issues using gh CLI with templates for bugs, features, tasks including titles, descriptions, acceptance criteria, and labels. Use for filing bugs or feature requests.
Manages full GitHub issue lifecycle: create with conventional commit titles, sub-issues, cross-repo links, edit/view/list, dump trees to markdown/YAML, push from files, comment/label/close.
Analyzes codebase impact for a given request and creates structured GitHub issues with AI-verified and human-judgment-needed sections.