A git-native issue tracker. Issues are stored as Markdown files with YAML frontmatter inside your repository under .issues/, version-controlled alongside your code.
No database. No server. No accounts. Just files and git.
# With Go (recommended)
go install github.com/steviee/git-issues@latest
# From source
git clone git@github.com:steviee/git-issues.git
cd git-issues
make install # builds and copies to /usr/local/bin/issuesRequires Go 1.22+. The go install command places the binary in $GOPATH/bin (or $HOME/go/bin). Make sure this directory is in your $PATH.
# 1. Install
go install github.com/steviee/git-issues@latest
# 2. Initialize in your project
cd /path/to/your/project
issues init
# 3. Read the agent context
cat .issues/.agent.md
# 4. Start working
issues next # find next actionable issue
issues claim <id> # mark as in-progress
# ... do the work ...
issues done <id> # close when finishedThe .issues/.agent.md file contains the full schema, all commands, and the recommended workflow.
# Initialize in any git repo
issues init
# Create issues
issues new --title "Fix login bug" --priority high --label bug
issues new --title "Add dark mode" --label feature
# List open issues
issues list
# Work on the next actionable issue
issues next
issues claim 1
# ... do the work ...
issues done 1All changes are auto-staged for your next git commit.
Each issue is a Markdown file in .issues/:
---
id: 1
title: "Fix login bug"
status: open
priority: high
labels: [bug, auth]
relations:
blocks: [3]
created: 2026-03-04
updated: 2026-03-04
---
Description and notes go here as free-form Markdown.
Filename format: 0001-fix-login-bug.md (zero-padded ID + slug, never changes).
| Command | Description |
|---|---|
issues init |
Initialize .issues/ in current directory |
issues new --title "..." [--priority P] [--label L] [--body "..."] |
Create a new issue |
issues list [--status S] [--priority P] [--label L] [--format F] |
List issues (formats: table, json, ids) |
issues show <id> [--format F] |
Show issue details (formats: text, json) |
issues edit <id> |
Edit issue in $EDITOR |
issues close <id> [--wontfix] [--reason "..."] |
Close an issue |
issues reopen <id> |
Reopen a closed issue |
issues set <id> <field> <value> |
Set priority, status, title, or label |
| Command | Description |
|---|---|
issues relate <id> <relation> <target-id> |
Add relation (blocks, depends-on, related-to, duplicates) |
issues unrelate <id> <relation> <target-id> |
Remove relation |
issues graph [--open-only] [--root <id>] |
Show dependency graph |
Relations are always bidirectional: issues relate 1 blocks 2 also writes depends-on: [1] to issue #2.
Designed for AI agent workflows with machine-readable output:
| Command | Description |
|---|---|
issues next [--format json] |
Next unblocked, highest-priority issue |
issues claim <id> |
Set status to in-progress |
issues done <id> |
Close the issue |
issues blocked [id] |
List blocked issues or show blockers for one issue |
issues check [--fix] |
Verify database consistency, optionally auto-fix |
| Command | Description |
|---|---|
issues batch close [--label L] [--status S] |
Close all matching issues |
issues batch set <field> <value> [--label L] [--status S] |
Set field on all matching issues |
| Command | Description |
|---|---|
issues labels [--sort count|alpha] |
List all labels with frequency |
# Filter by status (default: open)
issues list --status all
issues list --status closed
# Filter by priority
issues list --priority critical
# Filter by label (OR logic)
issues list --label bug --label auth
# Sort (default: priority desc, then ID asc)
issues list --sort updated
issues list --sort created
# Output formats
issues list --format table # human-readable (default)
issues list --format json # machine-readable
issues list --format ids # space-separated IDs for scripting# Issue 1 blocks issue 2
issues relate 1 blocks 2
# Show dependency graph
issues graph --open-only
# Output:
# #1 Fix auth [open, critical]
# └── blocks:
# #2 Login bug [open, high]Relation types: blocks, depends-on, related-to, duplicates.
issues close warns if an issue has open blockers.
git-issues is designed to work as the task management layer for AI coding agents. The .issues/.agent.md file (generated by issues init) provides agents with the schema and recommended workflow.
Recommended agent workflow:
issues next # find next actionable issue
issues claim <id> # mark as in-progress
# ... agent does the work ...
issues done <id> # close when finishedAll commands support --format json for machine-readable output.
Migrate existing GitHub issues using the gh CLI:
issues init
gh issue list --state open --json number,title,body,labels --limit 500 | \
jq -c '.[]' | while read -r issue; do
title=$(echo "$issue" | jq -r '.title')
body=$(echo "$issue" | jq -r '.body // ""')
labels=$(echo "$issue" | jq -r '[.labels[].name] | join(",")')
if [ -n "$labels" ]; then
issues new --title "$title" --body "$body" --label "$labels"
else
issues new --title "$title" --body "$body"
fi
donegit-issues works in multi-worktree setups. One rule to remember:
New issues: only on
main. Updating existing issues (claim, done, set): any branch.
This prevents ID collisions from parallel issues new. Additional tips:
- Claim before working —
issues claim <id>prevents two worktrees from modifying the same issue - Only modify your claimed issue from a feature branch
- Run
issues check --fixafter merging — repairs any broken relations
.issues/.config.yml:
default_priority: medium
auto_stage: true
labels:
- bug
- feature
- auth
- security
- docsdefault_priority: Used when creating issues without--priorityauto_stage: Automaticallygit addissue files on every changelabels: Predefined label list (informational, not enforced)
git-issues ships with a Claude Code skill that teaches the agent to use git-issues as its sole task management system — replacing Claude's built-in TaskCreate/TaskUpdate tools entirely.
- Makes
/git-issuesavailable as a slash command in Claude Code - Auto-activates when Claude detects task-management context (planning, creating tasks, tracking progress)
- Enforces the Iron Workflow: pick → claim → branch → implement → done → merge
- Requires comprehensive issue bodies with context, success criteria, and implementation details
- Maps every
TaskCreate/TaskUpdateinstinct to the equivalentgit-issuescommand
# Option 1: Plugin (recommended — auto-updates)
/plugin marketplace add steviee/git-issues
/plugin install git-issues
# Option 2: Install script (manual)
./claude-skill/install.sh
# Option 3: Manual copy
mkdir -p ~/.claude/skills/git-issues
cp skills/git-issues/SKILL.md ~/.claude/skills/git-issues/SKILL.mdThe plugin method is recommended because it pulls updates automatically when the skill is improved.
The skill is complementary to the .agent.md file generated by git-issues init:
| File | Purpose |
|---|---|
.issues/.agent.md |
Command reference — schema, commands, basic workflow (auto-generated, project-local) |
Skill (/git-issues) |
Behavioral rules — quality standards, creation protocol, recovery patterns (installed via plugin or ~/.claude/skills/) |
.agent.md tells the agent what commands exist. The skill tells the agent how to use them well.
make build # build binary
make test # run tests
make lint # run go vet
make install # install to /usr/local/binMIT