Zero-dependency CLI for Jira Cloud REST API
Project description
_ _ _
| | __ _ ____ _ _ (_)(_) _ __ __ _
| | / _` ||_ /| | | || || || '__|/ _` |
| || (_| | / / | |_| || || || | | (_| |
|_| \__,_|/___| \__, ||_||_||_| \__,_|
|___/
Like lazygit, but for Jira. Zero-dependency CLI that makes Jira bearable.
Installation · Quick Start · Commands · Configuration · Contributing
Why lazyjira?
Jira's web UI is slow. Existing CLIs are either abandoned, heavy, or missing features you need.
| lazyjira | jira-cli | go-jira | |
|---|---|---|---|
| Language | Python | Go | Go |
| Dependencies | 0 (pure stdlib) | Multiple | Multiple |
| Install | pip install lazyjira |
brew / go install |
go install |
| Status | 🟢 Active | 🟢 Active | 🔴 Abandoned |
| Jira Cloud | ✅ | ✅ | ✅ |
| JPD Support | ✅ | ❌ | ❌ |
| Markdown → ADF | ✅ Built-in | ❌ | ❌ |
| Config | env / TOML / token file | YAML | YAML |
Zero dependencies means no requests, no click, no rich — just Python's standard library. Install it anywhere Python runs. No compiling, no cgo, no nonsense.
Installation
# PyPI (recommended)
pip install lazyjira
# pipx (isolated install)
pipx install lazyjira
# One-liner
curl -fsSL https://raw.githubusercontent.com/gotexis/lazyjira/main/install.sh | bash
# From source
git clone https://github.com/gotexis/lazyjira.git
cd lazyjira
pip install .
Quick Start
1. Configure your credentials:
export JIRA_URL="https://your-instance.atlassian.net"
export JIRA_EMAIL="you@example.com"
export JIRA_API_TOKEN="your-api-token"
Or use a config file (see Configuration).
2. List your projects:
lazyjira projects
3. Start working:
# Search issues
lazyjira issues list -p MYPROJ
# Create an issue
lazyjira issues create "Fix login timeout" -p MYPROJ -d "Users report 30s delays"
# Move to In Progress
lazyjira move MYPROJ-42 "In Progress"
# Add a comment
lazyjira comments create MYPROJ-42 --body "Root cause found: connection pool exhaustion"
Commands
Issues
lazyjira issues list -p PROJECT # List issues (table format)
lazyjira issues list -p PROJECT --plain # List issues (JSON)
lazyjira issues search "login bug" -p P # Full-text search
lazyjira issues read PROJ-123 # Read full issue details
lazyjira issues create TITLE -p PROJECT # Create issue
lazyjira issues update KEY --summary X # Update fields
lazyjira issues status KEY "Done" # Transition status
lazyjira issues comment KEY --body "..." # Quick comment
Filtering:
lazyjira issues list -p PROJ --status "In Progress"
lazyjira issues list -p PROJ --status-in "To Do,In Progress"
lazyjira issues list -p PROJ --status-ne "Done"
lazyjira issues list -p PROJ --label bug --assignee me
lazyjira issues list -p PROJ --priority 1 # Highest only
lazyjira issues list -p PROJ --order "created DESC"
lazyjira issues list -p PROJ --limit 10
Comments
lazyjira comments create KEY --body "text" # Add comment
lazyjira comments list KEY # List comments
Transitions
lazyjira move KEY "In Progress" # Transition issue
lazyjira move KEY "Done" # Close issue
Other
lazyjira projects # List all projects
lazyjira labels -p PROJECT # List labels in project
lazyjira link PROJ-1 PROJ-2 # Link two issues
lazyjira link PROJ-1 PROJ-2 -t "is blocked by"
lazyjira open PROJ-123 # Open in browser
lazyjira query "project=X AND status='To Do' ORDER BY priority" # Raw JQL
Issue Creation — Full Options
lazyjira issues create "Title" \
-p PROJECT \
-d "Description in **markdown** — auto-converted to ADF" \
--type Story \
--priority 2 \
--labels bug urgent \
--parent PROJ-100 \
--status "In Progress" \
--duedate 2025-12-31
Configuration
lazyjira resolves configuration in this order:
1. Environment Variables (highest priority)
export JIRA_URL="https://your-instance.atlassian.net"
export JIRA_EMAIL="you@example.com"
export JIRA_API_TOKEN="your-api-token"
export JIRA_PROJECT="MYPROJ" # optional default project
2. Config File
mkdir -p ~/.config/lazyjira
cat > ~/.config/lazyjira/config.toml << 'EOF'
[jira]
url = "https://your-instance.atlassian.net"
email = "you@example.com"
[defaults]
project = "MYPROJ"
EOF
3. Token File
echo "your-api-token" > ~/.config/lazyjira/token
chmod 600 ~/.config/lazyjira/token
💡 Tip: Generate your API token at id.atlassian.com/manage-profile/security/api-tokens
Markdown → ADF
lazyjira automatically converts Markdown to Atlassian Document Format when creating or updating descriptions and comments.
Write this:
lazyjira issues create "Fix bug" -p PROJ -d "## Steps\n1. Open the app\n2. Click **login**\n3. See error"
Jira sees properly formatted headings, lists, and bold text — not raw markdown.
JPD Support
lazyjira auto-detects Jira Product Discovery projects and handles their unique issue types and workflows. No extra configuration needed.
Shell Completion
# Bash
eval "$(register-python-argcomplete lazyjira 2>/dev/null)" || true
# Or add to ~/.bashrc for persistence
Contributing
See CONTRIBUTING.md for development setup, code style, and PR guidelines.
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lazyjira-0.1.1.tar.gz.
File metadata
- Download URL: lazyjira-0.1.1.tar.gz
- Upload date:
- Size: 28.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8afb81a280368591178ce5982e466e7d8e31b92399ed9152251c344c6c90b29e
|
|
| MD5 |
32daefd4986ee8c6a4b40d990c2968fe
|
|
| BLAKE2b-256 |
327bf09c62220d76fa3469275a222008d4834895fce1547e23dfbe618ab5aae9
|
Provenance
The following attestation bundles were made for lazyjira-0.1.1.tar.gz:
Publisher:
workflow.yml on exisz/lazyjira
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lazyjira-0.1.1.tar.gz -
Subject digest:
8afb81a280368591178ce5982e466e7d8e31b92399ed9152251c344c6c90b29e - Sigstore transparency entry: 1340025082
- Sigstore integration time:
-
Permalink:
exisz/lazyjira@330de94396823ff77d4d3f23a3286a7f1f0360c2 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/exisz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@330de94396823ff77d4d3f23a3286a7f1f0360c2 -
Trigger Event:
push
-
Statement type:
File details
Details for the file lazyjira-0.1.1-py3-none-any.whl.
File metadata
- Download URL: lazyjira-0.1.1-py3-none-any.whl
- Upload date:
- Size: 19.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a03c6783e8910011ec8be7f8d8d638359b45cc698769828bd51fbe85ff19ac19
|
|
| MD5 |
ea91dd46f3744b032aa6d0de46294f09
|
|
| BLAKE2b-256 |
1e7df7de1c4cabadf37d590b4377098b4bc218075db195e300520f3e3177441d
|
Provenance
The following attestation bundles were made for lazyjira-0.1.1-py3-none-any.whl:
Publisher:
workflow.yml on exisz/lazyjira
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
lazyjira-0.1.1-py3-none-any.whl -
Subject digest:
a03c6783e8910011ec8be7f8d8d638359b45cc698769828bd51fbe85ff19ac19 - Sigstore transparency entry: 1340025091
- Sigstore integration time:
-
Permalink:
exisz/lazyjira@330de94396823ff77d4d3f23a3286a7f1f0360c2 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/exisz
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@330de94396823ff77d4d3f23a3286a7f1f0360c2 -
Trigger Event:
push
-
Statement type: