Unified CLI tools for Atlassian Cloud products.
> Consolidation note: This repo is the home for both jtk (Jira CLI) and cfl (Confluence CLI), previously maintained as separate repos (jira-ticket-cli and confluence-cli). Those repos are now archived. All development happens here.
Table of Contents
| Tool | Description | Full Documentation |
|---|
jtk | Jira Cloud CLI for issues, sprints, boards, dashboards, and automation | jtk README |
cfl | Confluence Cloud CLI for markdown-first page management | cfl README |
Installation
macOS
Homebrew (recommended)
# Install jtk (Jira CLI)
brew install open-cli-collective/tap/jira-ticket-cli
# Install cfl (Confluence CLI)
brew install open-cli-collective/tap/cfl
# Upgrade to latest
brew upgrade jira-ticket-cli cfl
> Note: If brew upgrade doesn't pick up a new version, your local tap may be stale. Run git -C $(brew --repository open-cli-collective/tap) pull to refresh it, then retry the upgrade.
Binary download
Download from the Releases page for your architecture (Intel or Apple Silicon).
Windows
Chocolatey
# Install jtk
choco install jira-ticket-cli
# Install cfl
choco install confluence-cli
Winget
# Install jtk
winget install OpenCLICollective.jira-ticket-cli
# Install cfl
winget install OpenCLICollective.cfl
Binary download
Download from the Releases page for your architecture.
Linux
Debian/Ubuntu (APT)
# Download the .deb package from Releases
sudo dpkg -i jtk_*.deb
sudo dpkg -i cfl_*.deb
RPM-based (Fedora, RHEL, etc.)
# Download the .rpm package from Releases
sudo rpm -i jtk-*.rpm
sudo rpm -i cfl-*.rpm
Binary download
Download from the Releases page for your architecture (amd64 or arm64).
Build from Source
Requires Go 1.24 or later.
git clone https://github.com/open-cli-collective/atlassian-cli.git
cd atlassian-cli
make build
# Binaries are in bin/
Migrating from the Old Repos
If you previously installed from jira-ticket-cli or confluence-cli:
Homebrew users:
# If you installed via the 'jtk' cask (legacy)
brew uninstall jtk
brew install open-cli-collective/tap/jira-ticket-cli
# If you installed via 'jira-ticket-cli', you're already set — just upgrade
brew upgrade jira-ticket-cli
# If brew upgrade says "already installed" but you're on an old version,
# refresh your local tap first:
git -C $(brew --repository open-cli-collective/tap) pull
brew upgrade jira-ticket-cli
GitHub release users:
All future releases are published here. Update your bookmarks/scripts to download from:
https://github.com/open-cli-collective/atlassian-cli/releases
Your existing configuration (~/.config/jtk/ and ~/.config/cfl/) is unchanged — no reconfiguration needed.
Getting Started
Configuration
Both tools support interactive setup:
# Configure Jira credentials
jtk init
# Configure Confluence credentials
cfl init
The init wizards will prompt for:
- Atlassian URL (e.g.,
https://mycompany.atlassian.net)
- Email address
- API token
Configuration is stored under the shared atlassian-cli config dir (a
single credential scope used by both binaries) at the OS-native location:
- macOS:
~/Library/Application Support/atlassian-cli/config.yml
- Linux:
~/.config/atlassian-cli/config.yml (or under $XDG_CONFIG_HOME if set)
- Windows:
%APPDATA%\atlassian-cli\config.yml
config.yml carries only non-secret fields (URL, email, defaults); the
API token lives in the OS keyring (see "Shared credential store" below).
Authentication
Both tools support two authentication methods:
Classic API Tokens (Basic Auth) — default
For personal Atlassian accounts:
- Go to Atlassian Account Settings
- Click "Create API token"
- Give it a descriptive label (e.g., "CLI Tools")
- Copy the token and use it during
init or set it as an environment variable
Service Account Scoped Tokens (Bearer Auth)
For Atlassian service accounts with scoped API tokens:
# Interactive bearer auth setup
jtk init --auth-method bearer
cfl init --auth-method bearer
# Non-interactive bearer auth setup
jtk init --auth-method bearer --url https://mycompany.atlassian.net \
--token YOUR_SCOPED_TOKEN --cloud-id YOUR_CLOUD_ID --no-verify
Bearer auth uses the api.atlassian.com gateway instead of your instance URL directly. You'll need your Cloud ID, which you can find at https://your-site.atlassian.net/_edge/tenant_info.
> Note: Scoped tokens don't have scopes for Agile (boards/sprints), Automation, or Dashboards. These commands are unavailable with bearer auth — this is an Atlassian platform limitation.
Shared Credentials
Use ATLASSIAN_* environment variables for shared authentication across both tools:
| Variable | Description |
|---|
ATLASSIAN_URL | Base URL (e.g., https://mycompany.atlassian.net) |
ATLASSIAN_EMAIL | Your Atlassian account email |
ATLASSIAN_API_TOKEN | Your API token |
ATLASSIAN_AUTH_METHOD | basic (default) or bearer |
ATLASSIAN_CLOUD_ID | Cloud ID for bearer auth (gateway URL) |
Tool-specific variables take precedence:
- jtk:
JIRA_URL, JIRA_EMAIL, JIRA_API_TOKEN, JIRA_AUTH_METHOD, JIRA_CLOUD_ID
- cfl:
CFL_URL, CFL_EMAIL, CFL_API_TOKEN, CFL_AUTH_METHOD, CFL_CLOUD_ID
Example:
# Set shared credentials (used by both tools)
export ATLASSIAN_URL="https://mycompany.atlassian.net"
export ATLASSIAN_EMAIL="you@example.com"
export ATLASSIAN_API_TOKEN="your-api-token"
# Now both tools work without additional configuration
jtk issues list --project PROJ
cfl page list --space DEV
Headless and Keyring-Free Environments
The API token lives in the OS keyring (macOS Keychain, Windows Credential
Manager, Linux Secret Service). On a headless host, in CI, or under an
automation agent there may be no keyring — or one that is locked and
cannot be unlocked interactively (the unlock prompt never reaches you).
Both tools support keyring-free operation without putting the token in a
plaintext config file:
-
Supply the token via an environment variable. ATLASSIAN_API_TOKEN
(or the tool-specific JIRA_API_TOKEN / CFL_API_TOKEN) is resolved
before the keyring is ever opened, so the keyring is never touched. This
is the canonical answer for op run-style setups and agent automation.
export ATLASSIAN_API_TOKEN="your-api-token"
jtk issues list --project PROJ # never touches the OS keyring
-
Use the encrypted-file backend. --backend file (or
ATLASSIAN_CLI_KEYRING_BACKEND=file, or keyring.backend: file in the
config file) stores the token in an encrypted file instead of the OS
keyring. Supply its passphrase non-interactively with
ATLASSIAN_CLI_KEYRING_PASSPHRASE for unattended runs.
-
Use the pass backend. --backend pass (or
ATLASSIAN_CLI_KEYRING_BACKEND=pass) integrates with an existing
pass password-store — the canonical
headless-Linux option when you already run one.
If a command fails because the keyring is unavailable or locked, the error
names these same options. Run jtk config show / cfl config show to see
which backend is active on the current machine.
Output Representations
Both tools support two output artifact modes:
| Flag | Representation | Description |
|---|
| (default) | agent | Action-oriented output with essential fields. Optimized for LLM/agent consumption. |
--full | full | Inspection-oriented output with additional fields (dates, authors, versions). |
Examples:
# Default agent output (curated, action-ready)
jtk issues get PROJ-123
cfl page view 123456
# Full output for debugging
jtk issues get PROJ-123 --full
cfl page view 123456 --full
# Exact Confluence body representation
cfl page view 123456 --body-format xhtml
See docs/ARTIFACT_CONTRACT.md for the full output contract specification.
jtk - Jira CLI
Manage Jira issues, sprints, and boards from the command line.
# Issues
jtk issues list --project PROJ
jtk issues get PROJ-123
jtk issues create --project PROJ --type Task --summary "Fix bug"
jtk issues update PROJ-123 --field priority=High
jtk issues search "project = PROJ AND status = 'In Progress'"
jtk issues assign PROJ-123
jtk issues move PROJ-123 --to-project OTHERPROJ
# Projects
jtk projects list
jtk projects get PROJ
jtk projects create --key PROJ --name "My Project" --lead
jtk projects update PROJ --name "New Name"
jtk projects delete PROJ
# Workflow status (typical)
jtk issues update PROJ-123 --status "Done"
# Transitions API (advanced: pick a specific transition by ID, set
# fields-on-transition, or disambiguate when multiple transitions land on
# the same target status)
jtk transitions list PROJ-123
jtk transitions do PROJ-123 51
# Comments
jtk comments list PROJ-123
jtk comments add PROJ-123 --body "This is fixed"
# Sprints
jtk sprints list --board 123
jtk sprints current --board 123
jtk sprints issues 456
jtk sprints add 456 PROJ-123
# Boards
jtk boards list
jtk boards get 123
# Attachments
jtk attachments list PROJ-123
jtk attachments add PROJ-123 --file screenshot.png
jtk attachments get 12345 --output ./downloads/
# Issue links
jtk links list PROJ-123
jtk links create PROJ-123 PROJ-456 --type Blocks
jtk links types
# Remote (web) links — external URLs in the issue sidebar.
# Verbs are add/delete: remote links are attached to an issue, but deleting
# one destroys the remote-link record rather than merely detaching it.
jtk remotelinks list PROJ-123
jtk remotelinks add PROJ-123 --url "https://github.com/owner/repo/issues/456" --title "GitHub #456"
jtk remotelinks delete PROJ-123 12345
# Development panel pull requests
jtk development get PROJ-123
jtk development get PROJ-123 --id
# Dashboards
jtk dashboards list
jtk dashboards create --name "Sprint Board"
jtk dashboards gadgets list 10001
# Users
jtk users search "john"
jtk me
# Fields
jtk fields list
jtk issues field-options priority
# Automation rules
jtk automation list
jtk automation get 123
jtk automation export 123 > rule-backup.json
jtk automation create --file rule.json
jtk automation enable 123
Full documentation: tools/jtk/README.md
cfl - Confluence CLI
Manage Confluence pages with a markdown-first workflow.
# List pages in a space
cfl page list --space DEV
# View page in markdown
cfl page view 123456
# Create page from markdown
cfl page create --space DEV --title "New Page" --file content.md
# Edit page in your editor
cfl page edit 123456
# Search content
cfl search "my search query" # Global search
cfl search "my search query" --space DEV # Explicit space scope
cfl search --cql "space = DEV AND type = page"
# Copy a page
cfl page copy 123456 --title "Copy of Page"
# Export a page to PDF
cfl page export 123456 -O handoff.pdf
# Spaces
cfl space list
cfl space view DEV
cfl space create --key PROJ --name "Project Space"
# Config
cfl config show
cfl config test
# Manage attachments
cfl attachment list --page 123456
cfl attachment upload --page 123456 --file diagram.png
cfl attachment download att789 -O ./diagram.png
Full documentation: tools/cfl/README.md
Shell Completion
Both tools support shell completion for bash, zsh, and fish.
Bash:
# jtk
jtk completion bash > /etc/bash_completion.d/jtk
# cfl
cfl completion bash > /etc/bash_completion.d/cfl
Zsh:
# jtk
jtk completion zsh > "${fpath[1]}/_jtk"
# cfl
cfl completion zsh > "${fpath[1]}/_cfl"
Fish:
# jtk
jtk completion fish > ~/.config/fish/completions/jtk.fish
# cfl
cfl completion fish > ~/.config/fish/completions/cfl.fish
Development
This is a Go workspace monorepo. Both tools can be built and tested together.
# Build both tools
make build
# Run all tests
make test
# Run linter
make lint
# Build, test, and lint
make all
# Build individual tools
make build-jtk
make build-cfl
# Run tests for a specific tool
go test ./tools/jtk/...
go test ./tools/cfl/...
Project Structure
atlassian-cli/
├── go.work # Go workspace file
├── Makefile # Build automation
├── shared/ # Shared packages
│ ├── adf/ # Atlassian Document Format helpers
│ ├── auth/ # Authentication (API token, env vars)
│ ├── client/ # HTTP client with retry and error handling
│ ├── config/ # Configuration loading
│ ├── errors/ # Unified error parsing (Jira, Confluence, Automation)
│ ├── exitcode/ # Exit code constants
│ ├── prompt/ # Interactive prompts
│ ├── url/ # URL utilities
│ ├── version/ # Build-time version info
│ └── view/ # Output formatting (table, JSON, plain)
└── tools/
├── cfl/ # Confluence CLI
│ ├── api/ # API client
│ ├── cmd/cfl/ # Entry point
│ └── internal/ # Commands and config
└── jtk/ # Jira CLI
├── api/ # API client
├── cmd/jtk/ # Entry point
└── internal/ # Commands and config
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feat/my-feature)
- Make your changes with tests
- Run
make all to verify
- Commit with conventional commit messages (
feat:, fix:, etc.)
- Push and create a pull request
See the individual tool CLAUDE.md files for detailed development guidance:
License
MIT License. See LICENSE for details.