Pure JSON stdout. Structured errors on stderr. Semantic exit codes. 600+ auto-generated commands from the Jira OpenAPI spec. Zero prompts, zero interactivity — just pipe and parse.
🔍 Features · 📦 Install · 🚀 Quick Start · ⚡ Key Commands · 🤖 Agent Integration · 🔒 Security · 🛠 Development · 📄 License
brew install sofq/tap/jr # macOS / Linux
npm install -g jira-jr # Node
pip install jira-jr # Python
scoop bucket add sofq https://github.com/sofq/scoop-bucket && scoop install jr # Windows
go install github.com/sofq/jira-cli@latest # Go# Configure credentials
jr configure --base-url https://yourorg.atlassian.net --token YOUR_API_TOKEN --username your@email.com
# Verify the connection
jr configure --test
# Fetch an issue with agent-optimized output
jr issue get --issueIdOrKey PROJ-123 --preset agentTip
Use jr schema to discover all available commands, and jr schema issue get to see the full flag reference for any operation.
jr workflow move --issue PROJ-123 --to "In Progress" --assign me
jr workflow comment --issue PROJ-123 --text "Fixed in latest deploy"
jr workflow create --project PROJ --type Bug --summary "Login broken" --priority High
jr workflow link --from PROJ-1 --to PROJ-2 --type blocks
jr workflow log-work --issue PROJ-123 --time "2h 30m"
jr workflow sprint --issue PROJ-123 --to "Sprint 5"jr search search-and-reconsile-issues-using-jql \
--jql "project = PROJ AND status = 'In Progress'" \
--fields "key,summary,status" \
--jq '[.issues[] | {key, summary: .fields.summary}]'echo '[
{"command":"issue get","args":{"issueIdOrKey":"PROJ-1"},"jq":".key"},
{"command":"issue get","args":{"issueIdOrKey":"PROJ-2"},"jq":".key"}
]' | jr batchjr watch --jql "project = PROJ" --interval 30s --max-events 10jr template apply bug-report --project PROJ --var summary="Login broken" --var severity=High
jr template create my-template --from PROJ-123Built-in templates: bug-report, story, task, epic, subtask, spike.
jr diff --issue PROJ-123 --since 2h --field statusjr raw GET /rest/api/3/myself
jr raw POST /rest/api/3/search/jql --body '{"jql":"project=PROJ"}'Error contract
{"error_type":"rate_limited","status":429,"retry_after":30}| Exit | Meaning | Agent action |
|---|---|---|
| 0 | OK | Parse stdout |
| 1 | General error | Check error message |
| 2 | Auth failed | Re-authenticate |
| 3 | Not found | Check issue key |
| 4 | Validation | Fix request fields |
| 5 | Rate limited | Wait retry_after |
| 6 | Conflict | Resolve and retry |
| 7 | Server error | Retry with backoff |
cp -r skill/jira-cli ~/.claude/skills/ # global installAdd to your agent's system instructions:
Use `jr` for all Jira operations. Output is always JSON.
Use `jr schema` to discover commands. Use --jq to reduce tokens.
Note
See skill/jira-cli/SKILL.md for the full agent integration guide with patterns, error handling, and token optimization strategies.
Operation policies — restrict per profile with glob patterns:
{
"allowed_operations": ["issue get", "search *", "workflow *"]
}Audit logging — JSONL to ~/.config/jr/audit.log via --audit flag or per-profile config.
Batch limits — default 50, override with --max-batch N.
make generate # regenerate commands from OpenAPI spec
make build # compile binary
make test # run tests with coverage
make lint # run golangci-lintNote
Commands in cmd/generated/ are auto-generated from spec/jira-v3.json. Run make generate after spec updates.
Apache 2.0 © 2026 sofq