jira-cli
Read and write Jira Cloud issues from the command line, without opening a browser tab.
What it's for
jira reads and writes issues in Jira Cloud from a terminal. It exists for the moments when
you already know what you want to record and opening a browser, waiting for a board to load
and clicking through a form is the slowest part of the job — jira issue list to see what is
assigned to you, jira issue create -p ABC -s "Fix the thing" to file something before you
lose the thought, jira issue transition ABC-123 "In Progress" to move it along without a
page reload.
Filters for project, label, assignee and raw JQL all AND together, and jira issue tree draws
the same query as a parent/epic hierarchy instead of a flat list — handy for seeing how a pile
of tickets ladders up to the epic they belong to. Anything run often can be saved by name:
jira query add mine -q "..." turns a JQL string into jira issue list --query mine, and
jira template add bug-report -p ABC -t Bug ... turns a pile of issue create flags into
jira issue create -s "..." --template bug-report. Reassigning (jira issue assign ABC-123)
and opening an issue in the browser (jira issue open ABC-123) round out the write side.
Commands follow a noun verb shape (jira issue list, jira issue create, jira query add),
so the tool is explorable with jira --help rather than memorized.
Use cases
What jira actually gets reached for changes with the shape of the day — heads-down delivery
reaches for different commands than coordinating across several teams. Here's what that looks
like at each level.
Inside the team
Engineer — heads-down delivery: pick up work, keep status honest, ship
| Want to… | Run |
|---|---|
| Check what's mine, across every project | jira issue list --assigned |
| Read full context before starting | jira issue show ABC-123 |
| Move it and leave a trail | jira issue transition ABC-123 "In Review" -c "PR #42" |
| Flag a blocker without changing status | jira issue comment ABC-123 "Blocked on staging deploy" |
| File a bug found mid-task, without losing flow | jira issue create -p ABC -s "…" -t Bug --parent ABC-100 |
| Drop into the browser only to attach a screenshot | jira issue open ABC-123 |
Product Owner — keep the backlog true, the sprint scoped, stakeholders informed
| Want to… | Run |
|---|---|
| See what's actually in the current sprint | jira sprint show ABC |
| See a feature's whole shape before grooming | jira issue tree --parent EPIC-1 |
| Spin up consistently-shaped stories | jira issue create --template story -s "…" |
| Reprioritize on the spot | jira issue update ABC-123 --priority High |
| Check what's blocking, before promising a date | jira issue show ABC-123 |
| Cut scope on the spot | jira issue transition ABC-140 "Won't Do" -c "Superseded" |
Team Leader — keep the team unblocked and the process honest
| Want to… | Run |
|---|---|
| Check one teammate's board by hand | jira issue list --jql "assignee='mara@co.com'" |
| See who's actually carrying what | jira issue stats --project ABC |
| Work out how long a ticket has really been stuck | jira issue history ABC-9 |
| Move a whole batch after standup | jira issue transition ABC-1,ABC-2,ABC-3 "In Progress" |
| Standardize how the team files tickets | jira template add bug -t Bug -l needs-triage |
| Pull retro input: what actually shipped this week | jira issue list --jql "status=Done AND resolved>=-7d" |
Around the teams
Product Manager — own the roadmap across every team that touches it
| Want to… | Run |
|---|---|
| Track a theme across teams, no single project holds it | jira issue list --label roadmap-q3 |
| See a cross-team initiative's shape | jira issue tree --parent EPIC-9 |
| Get real numbers for a status update, not a paragraph | jira issue stats --label roadmap-q3 --json |
| Confirm a dependency before a stakeholder update | jira issue show ABC-77 |
| Kick off a cross-team feature, same shape every time | jira issue create --template kickoff -p ABC -s "…" |
| Save a standing check-in, once per initiative | jira query add initiative-x --query "labels=init-x" |
Technology Manager — delivery health and technical risk, across every team
| Want to… | Run |
|---|---|
| Spot-check any team's project instantly | jira issue list --project TEAMX |
| Find what's fallen through the cracks, org-wide | jira issue list --jql "assignee is EMPTY" |
| Pull estimation off the actual field, not a guess | jira issue show ABC-123 --field "Story Points" |
| Enforce one ticket shape across every team | jira template add incident -t Bug -l sev2 |
| Cover for a short-staffed team | jira issue assign ABC-31 covering.eng |
| Check a vendor's Jira without switching machines | JIRA_PROFILE=vendor jira issue list --project X |
Principal Engineer — technical coherence across teams: debt, architecture, standards
| Want to… | Run |
|---|---|
| Track tech debt as one cross-team backlog | jira query add debt --query "labels=tech-debt" |
| Review an architecture epic before a design review | jira issue tree --parent EPIC-ARCH |
| Formalize a real dependency, not just a comment | jira issue link ABC-1 blocks ABC-2 |
| Leave a technical ruling directly on the ticket | jira issue transition ABC-5 "Needs Rework" -c "See ADR-14" |
| Seed every team with the same spike template | jira template add spike -t Spike |
| Pull up a ticket's related work mid-discussion | jira issue show ABC-5 |
query and template are the two nouns every one of these reaches for sooner or later —
turning a JQL string or an issue create preset into a name is what makes the rest of the
table repeatable instead of retyped.
Install
dotnet tool install --global grdev.jira-cli
Published on NuGet as grdev.jira-cli.
Setup
Jira connections live in named profiles, not one flat config. jira profile add work --host https://your-site.atlassian.net --email you@example.com creates the first one — it becomes
active automatically — then jira config edit opens config.json to fill in its ApiToken,
generated from
Atlassian account security.
jira config path prints where the file lives. Add another profile for a second Jira site and
switch with jira profile use <name>, or set JIRA_PROFILE=<name> to target one for a single
command without changing what's active. Each profile keeps its own saved queries and
templates.
Source
github.com/greek-developer/jira-cli — currently a private repository.