Use jirac as the Jira execution surface. The CLI is a single Rust binary that supports Jira Cloud and Jira Data Center, multi-profile auth, runtime custom-field discovery, attachment upload, sprint lifecycle, and an interactive TUI with full mouse support.
Requirements
- Require the
jiracbinary from the officialjira-commandsrelease source. - Require Jira authentication to be configured before use, typically via
jirac auth loginin the target environment. - Treat Jira credentials, local config (
~/.config/jira/config.toml), and attachment file paths as sensitive. - For MCP-based agent setups, additionally require the
jirac-mcpbinary (separate package).
Pre-flight
- Run
jirac --versionto confirm the binary is installed. - Run
jirac auth statusto confirm credentials are configured and reachable. If not, prompt the user to runjirac auth login(orjirac auth login --profile NAMEfor separate accounts). - For multi-profile setups, run
jirac auth profilesandjirac auth use <name>to switch the active profile before issuing operations.
Workflow
- Prefer direct
jiraccommands over raw Jira REST API (jirac api) calls when the CLI already supports the action. - Use
jirac issue fields -p PROJ --issue-type Typewhen required fields, allowed values, or custom fields are unclear. - Use
jirac issue transition <KEY>without a transition argument to get an interactive picker when the target status is unknown. - Use
jirac issue standupfor a concise personal update from assigned work, andjirac issue sprint-summary -p PROJfor a project sprint rollup. - Use
jirac issue sprints -p PROJto see sprint lifecycle states before creating, starting, completing, updating, or deleting a sprint. - Use
jirac issue notificationsto scan Jira @mentions from issue descriptions and comments. - Use
jirac issue render --input file.mdto preview how Markdown will convert to Jira ADF before sending it as description or comment. - Use
jirac tui -p PROJfor any interactive bulk browse / triage / quick-edit workflow — supports mouse (click rows, tabs, picker options; scroll wheel; drag splitter; click[?]/[🔔]). - Confirm intent before destructive or high-impact operations:
delete,archive,bulk-update,bulk-transition,bulk-comment,bulk-create,change-type,move,sprint-delete, and attachment uploads. - Keep Jira project keys, issue keys, status names, and transition names exact. Use quotes for any name with spaces.
Common commands
# Auth and profiles
jirac auth login # interactive, current shell profile
jirac auth login --profile work-cloud # named profile
jirac auth status
jirac auth profiles
jirac auth use work-cloud
# List, search, summaries
jirac issue list # your assigned issues
jirac issue list -p PROJ
jirac issue list --jql 'project = PROJ AND status = "In Progress"'
jirac issue standup # daily standup rollup
jirac issue sprint-summary -p PROJ # current sprint
jirac issue sprint-summary -p PROJ --sprint 'Sprint 24'
jirac issue notifications # @mentions scan
jirac issue view PROJ-123
jirac issue view PROJ-123 --versions # include fix-version block
jirac issue fields -p PROJ --issue-type Bug
jirac issue jql --run # interactive JQL builder
# Sprint lifecycle
jirac issue sprints -p PROJ
jirac issue sprint-create -p PROJ --name 'Sprint 25' --goal 'Ship auth v2'
jirac issue sprint-start <SPRINT_ID>
jirac issue sprint-complete <SPRINT_ID>
jirac issue sprint-update <SPRINT_ID> --name 'Sprint 25 (extended)' --goal 'New goal'
jirac issue sprint-delete <SPRINT_ID> --force # destructive
# Versions
jirac issue versions -p PROJ # browse + backlog preview
jirac issue versions -p PROJ --version 'v1.2.0'
# Create
jirac issue create -p PROJ # interactive
jirac issue create -p PROJ -t Bug -s 'login crash' --assignee me
jirac issue create -p PROJ -t Story -s 'auth flow' --sprint 'Sprint 24' --field story_points=5
jirac issue create -p PROJ -t Sub-task -s 'sub-task' --parent PROJ-100
# Update
jirac issue update PROJ-123 --summary 'New title'
jirac issue update PROJ-123 --priority High --assignee me
jirac issue update PROJ-123 --labels backend,api --fix-versions v2.0
jirac issue update PROJ-123 --field story_points=8
# Transition (positional, not --to)
jirac issue transition PROJ-123 # interactive picker
jirac issue transition PROJ-123 'Done'
jirac issue transition PROJ-123 'In Progress'
# Comment / bulk-comment
jirac issue comment list PROJ-123
jirac issue comment add PROJ-123 --body 'QA verified in staging'
jirac issue bulk-comment --jql 'project = PROJ AND sprint = openSprints()' --body 'Standup reminder'
jirac issue bulk-comment --keys PROJ-1,PROJ-2,PROJ-3 --body 'Please update'
# Worklog
jirac issue worklog list PROJ-123
jirac issue worklog add PROJ-123 --time '2h' --comment 'Implementation work'
jirac issue worklog delete PROJ-123 <WORKLOG_ID>
# Attach
jirac issue attach PROJ-123 ./screenshot.png
# Links between issues
jirac issue link list-types
jirac issue link add --link-type Blocks PROJ-123 PROJ-456 # PROJ-123 blocks PROJ-456
jirac issue link add --link-type Relates PROJ-123 PROJ-456
jirac issue link delete <LINK_ID>
# Clone, change-type, move, delete, archive
jirac issue clone PROJ-123 # same project
jirac issue clone PROJ-123 --project NEWPROJ --summary 'Copy: original'
jirac issue change-type PROJ-123 Bug # native Jira move semantics
jirac issue move PROJ-123 NEWPROJ # cross-project, native (not clone+delete)
jirac issue delete PROJ-123 # prompts confirmation
jirac issue delete PROJ-123 --force
jirac issue archive --jql 'project = PROJ AND resolution = Done AND updated < -180d'
# Bulk operations
jirac issue bulk-transition --jql 'project = PROJ AND status = "To Do"' --to 'In Progress'
jirac issue bulk-update --jql 'project = PROJ AND assignee = EMPTY' --assignee me
jirac issue bulk-update --jql 'project = PROJ AND priority = Low' --priority High --force
jirac issue bulk-create --manifest issues.json
# Batch (mixed ops from manifest)
jirac issue batch --manifest ops.json
# Render markdown → Jira ADF preview
jirac issue render --input description.md
# Raw REST passthrough (last resort)
jirac api GET /rest/api/3/myself
jirac api POST /rest/api/3/issue --body '{"fields":{...}}'
# TUI
jirac tui # uses default project or assigned issues
jirac tui -p PROJ
# MCP server registration (optional)
jirac mcp doctor # check prereqs
jirac mcp install # interactive client picker
jirac mcp install --client claude-code
jirac mcp install --client cursor
Bulk-create manifest format
[
{
"project": "PROJ",
"summary": "Issue title",
"type": "Task",
"assignee": "user@org.com",
"priority": "High",
"labels": ["backend"],
"parent": "PROJ-100",
"description": "Markdown description",
"fields": { "customfield_10016": 5 }
}
]
Batch manifest format
[
{ "op": "create", "project": "PROJ", "summary": "New task", "type": "Task" },
{ "op": "update", "key": "PROJ-10", "priority": "High", "assignee": "me" },
{ "op": "transition", "key": "PROJ-11", "to": "Done" },
{ "op": "archive", "key": "PROJ-12" }
]
JQL quoting
JQL strings often contain spaces, parentheses, and quotes — wrap the entire --jql value in single quotes in bash, then use double quotes inside:
jirac issue list --jql 'project = PROJ AND status = "In Progress" AND assignee = currentUser()'
For Windows PowerShell, the inverse — wrap in double quotes outside, escape inner d