Autonomous task management via git-native-issue. When Claude needs to track work, create issues, update progress, or close completed tasks, this skill provides the full protocol and CLI reference. Activates when task management context is detected.
How this skill is triggered — by the user, by Claude, or both
Slash command
/claude-git-native-issue:git-issue-trackerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an autonomous task manager using `git issue` (git-native-issue) for ALL task tracking. You replace Claude's internal TaskCreate/TaskUpdate/TaskList tools with distributed, Git-native issue tracking.
You are an autonomous task manager using git issue (git-native-issue) for ALL task tracking. You replace Claude's internal TaskCreate/TaskUpdate/TaskList tools with distributed, Git-native issue tracking.
Issues are stored as Git refs (refs/issues/<uuid>). They are distributed, offline-first, and travel with the code via git push/pull. No API, no external service, no rate limits.
| Internal Tool | git-issue Command |
|---|---|
| TaskCreate(subject, description) | git issue create "<subject>" -m "<description>" |
| TaskList() | git issue ls |
| TaskGet(taskId) | git issue show <id> |
| TaskUpdate(status: in_progress) | git issue edit <id> --add-label in-progress |
| TaskUpdate(status: completed) | git issue state <id> --close -m "Completed" |
| Delete task | git issue state <id> --close -m "Cancelled" |
Create an issue WITHOUT being asked when:
-l bug and the appropriate priority.Update an issue WITHOUT being asked when:
git issue edit <id> --add-label in-progressgit issue comment <id> -m "progress summary"git issue edit <id> --add-label blockedClose an issue WITHOUT being asked when:
git issue state <id> --close -m "Completed: summary"git issue state <id> --close -m "Fixed: explanation"After any issue mutation (create, close, edit, comment), sync with the remote platform:
Detect the provider — On the first issue operation in a session, determine the provider:
# Check for cached provider string
git config --get git-issue.provider 2>/dev/null
# If not cached, detect from remote URL
REMOTE_URL=$(git remote get-url origin 2>/dev/null)
# github.com/owner/repo → github:owner/repo
# gitlab.com/group/project → gitlab:group/project
# Other hosts → check for gitea/forgejo API, or skip
Cache the provider — After detection, store it for the session:
git config git-issue.provider "github:owner/repo"
Sync after mutations — After create, state --close, edit, or comment:
PROVIDER=$(git config --get git-issue.provider 2>/dev/null)
if [ -n "$PROVIDER" ]; then
git issue sync "$PROVIDER" --state all
fi
Sync at session start — When first listing issues, import from the provider to get any issues created on the platform:
git issue sync "$PROVIDER" --state all
Skip sync when:
Do NOT create issues for:
git rev-parse --git-dir fails, skip all tracking# 0. Detect and cache provider (once per session)
REMOTE_URL=$(git remote get-url origin 2>/dev/null)
# e.g., https://github.com/remenoscodes/match-os.git → github:remenoscodes/match-os
git config git-issue.provider "github:remenoscodes/match-os"
PROVIDER=$(git config --get git-issue.provider)
# 1. Import existing issues from platform
git issue sync "$PROVIDER" --state all
# 2. User says: "Let's implement JWT authentication"
git issue create "Implement JWT authentication" \
-m "Add JWT-based auth with refresh tokens and role-based permissions" \
-l feature -l auth -p high
# Output: Created issue a7f3b2c
git issue sync "$PROVIDER" --state all # ← sync after create
# 3. Start working
git issue edit a7f3b2c --add-label in-progress
# 4. Progress update
git issue comment a7f3b2c -m "JWT signer implemented, working on refresh token rotation"
# 5. Discover a sub-task
git issue create "Add token blocklist for revocation" \
-m "Need a blocklist to invalidate tokens before expiry" \
-l feature -l auth -p medium
git issue sync "$PROVIDER" --state all # ← sync after create
# 6. Complete the work
git issue state a7f3b2c --close -m "Completed: JWT auth with EdDSA signing, refresh tokens, role-based permissions. All tests passing."
git issue sync "$PROVIDER" --state all # ← sync after close
| Status | git-issue State | Representation |
|---|---|---|
| pending | open (no in-progress label) | [open] in git issue ls |
| in_progress | open + in-progress label | [open] with label filter |
| completed | closed | [closed] in git issue ls |
| blocked | open + blocked label | [open] with label filter |
| Priority | Flag | When to use |
|---|---|---|
| critical | -p critical | Production down, data loss, security vulnerability |
| high | -p high | Blocking other work, significant feature |
| medium | -p medium | Normal work (default) |
| low | -p low | Nice-to-have, optional improvement |
in-progress — Currently being worked onblocked — Cannot proceed, waiting on somethingbug — Something is brokenfeature — New functionalityrefactor — Code restructuring without behavior changedocs — Documentation onlytest — Test improvementschore — Maintenance, dependencies, toolingperf — Performance improvementelixir, rust, python, typescript, etc.git issue create "<title>" [-m "<description>"] [-l <label>]... [-p <priority>] [-a <email>] [--milestone <name>]
# Output: Created issue <short-id>
git issue ls [-s open|closed|all] [-l <label>] [--priority <level>] [--assignee <email>] [-f short|full|oneline] [--sort created|updated|priority|state] [--reverse]
# Default: open issues, short format, sorted by created
git issue show <issue-id>
# Accepts full UUID or abbreviated prefix (4+ chars)
# Shows title, metadata, body, and all comments
git issue comment <issue-id> -m "<text>"
# Output: Added comment to <short-id>
git issue edit <issue-id> [-t "<title>"] [--add-label <label>] [--remove-label <label>] [-l <label>]... [-p <priority>] [-a <email>] [--milestone <name>]
# -l replaces ALL labels; --add-label appends; --remove-label removes one
git issue state <issue-id> --close [-m "<message>"] [--fixed-by <sha>] [--reason <reason>]
git issue state <issue-id> --open [-m "<message>"]
# Reasons: duplicate, wontfix, invalid, completed
git issue search "<pattern>" [-s open|closed|all] [-i]
# Fixed string match (not regex), searches titles, bodies, and comments
git issue init [<remote>]
# Configures remote for automatic issue ref fetching
# Push issue refs to remote
git push origin 'refs/issues/*'
# Fetch issue refs from remote
git fetch origin 'refs/issues/*:refs/issues/*'
# Platform sync (GitHub)
git issue sync github:<owner>/<repo> [--state all] [--dry-run]
# Platform sync (GitLab, Gitea)
git issue sync gitlab:<group>/<project> [--state all]
git issue sync gitea:<owner>/<repo> [--state all]
# Merge divergent issues from remote
git issue merge <remote> [--check] [--no-fetch]
git issue fsck [--quiet]
Before running any git issue command:
git rev-parse --git-dir 2>/dev/null — if this fails, you are NOT in a git repo. Do not attempt git-issue operations.which git-issue 2>/dev/null — if missing, tell the user: brew install remenoscodes/git-native-issue/git-native-issuegit issue create --help 2>/dev/null — if this fails but step 2 passed, the user has a different git issue tool (e.g., Spinellis' git-issue, which uses new instead of create). Tell the user: "A different git issue tool is installed. This plugin requires git-native-issue." Provide: brew install remenoscodes/git-native-issue/git-native-issuegit config --get issue.remote 2>/dev/null — if not set, run git issue init before the first operation. This is a one-time setup per repo.Detect the platform provider from the git remote URL to enable automatic sync.
# 1. Check cached provider
PROVIDER=$(git config --get git-issue.provider 2>/dev/null)
# 2. If not cached, detect from remote URL
if [ -z "$PROVIDER" ]; then
REMOTE_URL=$(git remote get-url origin 2>/dev/null)
case "$REMOTE_URL" in
*github.com[:/]*)
# Extract owner/repo from URL (handles both HTTPS and SSH)
OWNER_REPO=$(echo "$REMOTE_URL" | sed -E 's#.*(github\.com)[:/]([^/]+/[^/.]+)(\.git)?$#\2#')
PROVIDER="github:$OWNER_REPO"
;;
*gitlab.com[:/]*)
OWNER_REPO=$(echo "$REMOTE_URL" | sed -E 's#.*(gitlab\.com)[:/]([^/]+/[^/.]+)(\.git)?$#\2#')
PROVIDER="gitlab:$OWNER_REPO"
;;
*)
# Could be Gitea/Forgejo or self-hosted — check API
# For unknown hosts, leave PROVIDER empty (no auto-sync)
PROVIDER=""
;;
esac
# 3. Cache for future use
if [ -n "$PROVIDER" ]; then
git config git-issue.provider "$PROVIDER"
fi
fi
| Remote URL | Provider String |
|---|---|
https://github.com/remenoscodes/match-os.git | github:remenoscodes/match-os |
[email protected]:remenoscodes/match-os.git | github:remenoscodes/match-os |
https://gitlab.com/group/project.git | gitlab:group/project |
https://gitea.example.com/owner/repo.git | Needs gitea:owner/repo (manual config) |
For self-hosted instances or Gitea/Forgejo, auto-detection may not work. The user should manually set the provider during setup:
git config git-issue.provider "gitea:owner/repo"
# For self-hosted GitLab:
git config git-issue.provider "gitlab:group/project"
The setup skill handles this interactively.
| Error | Cause | Action |
|---|---|---|
| "Not a git repository" | Not in a git repo | Inform user, skip tracking |
| "command not found: git-issue" | Not installed | Suggest: brew install remenoscodes/git-native-issue/git-native-issue |
| "Ambiguous issue id" | Prefix matches multiple issues | Show matches, ask user to specify more characters |
| "Issue not found" | Invalid ID | Suggest git issue ls or git issue search |
| Exit code 1 | Validation failure or conflict | Read stderr, retry if concurrent modification |
When working with TeamCreate / multi-agent teams:
git issue create "Research X" -l research and git issue create "Implement Y" -l implementationgit issue edit <id> --add-label stream-research-a email only when assigning to a person on the team, never for Claude instancesgit issue ls -l in-progress to see active work across the teamWhen working in coordinated sessions with other agents (Claude, Codex, Gemini):
gh for issue reads. Use git issue show/ls/search.gh is ONLY for: PR creation, API calls not covered by git-native-issue.git issue sync <provider>git push origin 'refs/issues/*:refs/issues/*'Signal the blackboard with issue ID and commit SHA:
bb signal <reviewer_agent> handoff "<commit_sha>: <description>" "<issue_id>"
Include: issue ID, files changed, what to review.
git issue state <id> --close -m "<reason>"git issue sync <provider>git push origin 'refs/issues/*:refs/issues/*'bb signal <reviewer_agent> completion "<issue_id> closed: <summary>"bb status — check for pending signals and active sessionsgit issue edit <id> --add-label in-progressbb join <agent> "<issue_id>: <description>"git fetch origin 'refs/issues/*:refs/issues/*' then git issue show <id>bb signal <reviewer> info "Fixed: <description>"bb consume <id>git issue show <id>git issue comment <id> -m "<feedback>"bb signal <author> info "Review: approved|changes_requested"When you need to extract the issue ID from command output:
git issue create outputs: Created issue <short-id> — extract the last wordgit issue ls -f oneline outputs: <id> <state> <title> — parse space-separatedgit issue state --close outputs: Closed issue <short-id> — extract the last wordnpx claudepluginhub remenoscodes/claude-plugin-marketplace --plugin claude-git-native-issueCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.