Release Notes¶
0.12.0 — 2026-07-13¶
Added¶
- Create issues (n), edit labels (l), and pause auto-refresh (R) from the TUI dashboard — create opens a two-field overlay (summary plus Markdown description), labels edit the full comma-separated list in place
- Ask before discarding edited TUI modal input: esc on a non-empty overlay now prompts discard input? (y)es (n)o
- TUI epics tab: cycle open epics in a strip and triage the active epic's children with the full verb set
- TUI board tab: the profile's default_board becomes its own tab once the boards cache is warm
- Hot-apply theme changes in the TUI: editing theme.name re-skins every view without a restart
- Choose the TUI glyph set with tui.icons: Nerd Font issue-type, priority, and pause icons, or the portable Unicode set (auto opts into Nerd Fonts only via the NERD_FONT convention)
- Interactive TUI Settings tab: pick themes with a live preview as you browse, change icons, preview dock, tabs (with name autocompletion) and more — every change validates, saves atomically, and applies without a restart; press e to edit the raw config.toml with the same validation
Changed¶
- TUI issue list renders status as the same reverse-video pills as the detail header and the CLI's plain list
- Render TUI key hints with inline mnemonics — the binding letter is highlighted inside its verb, footer and detail view alike
- Open TUI comments in the in-app overlay first; with an external editor configured, ctrl+e continues the draft there instead of the editor opening unasked
- Style backtick code spans in TUI summary cells and detail headings with the markdown code accent
Fixed¶
- TUI status pills use the same category-keyed fixed colors as the CLI's plain issue list, instead of theme colors keyed by guessing English status names
- Clamp TUI chrome rows (tabs, detail pills, hint lines) on narrow terminals instead of wrapping and breaking the layout
0.11.2 — 2026-07-13¶
Fixed¶
- Report a misspelled subcommand as an unknown command with suggestions, instead of exiting silently with usage or blaming a trailing flag
- Style every flag mentioned in an error hint consistently — all flags now render as code spans
0.11.1 — 2026-07-12¶
Fixed¶
- Apply the resolved --color mode and the standard human-output formatting (omit-empty fields, smart quotes, grouped numbers) to failure-diagnostics summaries, the warning mirror, and per-command list renderers, which previously auto-detected color and skipped those conventions
- Honor NO_COLOR on manually styled output — entity colors, status pills, hyperlinks, themed markdown — and resolve the auto theme from stdout's own state in split-stream invocations; --color=always still overrides both
0.11.0 — 2026-07-12¶
Added¶
- Built-in --jq filter runs a jq expression over the JSON output in-process (gojq, gh CLI style): strings print raw, other results print as JSON per line, --output=json is implied, and failure envelopes are filtered with the exit code preserved
- New issue rank command reorders backlog issues headlessly: place keys before or after an anchor issue in LexoRank order, with ranges chunked transparently at the API's 50-issue limit and order preserved end-to-end
Changed¶
- The foreign-flag hint no longer competes with its own suggestion: it says to use this CLI's equivalent, and the suggestion names it
0.10.15 — 2026-07-12¶
Added¶
- Tab completion for issue KEY arguments offers recently used keys, recorded per profile as a side effect of list, view, search, and mutations; inspect with jira cache issuekeys, reset with jira cache clear issuekeys
0.10.14 — 2026-07-12¶
Added¶
- Spinners and the multi-key progress footer show a live countdown of the remaining --timeout budget while a request is in flight
- Completion lines that carry summary fields (lists, mutations, multi-key batches) show the blocking round-trip time as a trailing elapsed field when it reaches one second; fast calls stay clean
- Successful Jira mutations complete with a distinct SCS success line, separating writes that landed from informational reads; dry-run previews and partial failures stay informational
- release-notes pages a full history taller than the screen on interactive terminals, like git log — built-in pager by default, JIRA_PAGER/PAGER honored, --no-pager to print directly; piped, machine-mode, and agent output always streams
Changed¶
- Human output picks quote delimiters adaptively (values containing quotes render without backslash escaping) and groups digits in large numbers
- config get and config profile human output renders as syntax-highlighted TOML matching the config file's own shape
- Batch summary lines render succeeded as a gradient-colored fraction (succeeded=12/13) and show failed only when something failed
Fixed¶
- Help text wraps at a readable measure (100 columns) on very wide terminals instead of running the full width; narrow terminals are unchanged
- Issue list completion line no longer prints detail=false noise; the detail field appears only when detail mode is on
- Status pills color by category consistently across issue list --detail and multi-key issue view, instead of drifting to arbitrary hues
0.10.13 — 2026-07-11¶
Fixed¶
- Stop the auth login verification spinner from corrupting --debug output; verification narrates bare under debug like every other lifecycle
- Color assignee and other entity names with fixed mid-tone hues readable on both light and dark terminals, instead of the theme's background-specific palette
0.10.12 — 2026-07-11¶
Fixed¶
- Apply --color=always/never to all human output on stdout (tables, pills, links, human-mode JSON, ADF views, mirrored warnings) — always styles piped output, never suppresses color and hyperlinks even on a terminal; mode values are accepted case-insensitively
Dependencies¶
- Upgrade gechr libraries: clog v0.13.1, clib v0.6.6, x v0.2.18, primer v0.1.2
0.10.11 — 2026-07-11¶
Fixed¶
- Narrate dry-run fan-outs as previews in --debug lifecycles and progress labels ("previewing issue edit") instead of claiming the mutation ran
0.10.10 — 2026-07-11¶
Fixed¶
- Align TUI relative ages with the CLI compact format: sub-minute and future-skewed updates show "now", and 30-34 day ages show "4w"
0.10.9 — 2026-07-11¶
Fixed¶
- Phrase dry-run previews in the conditional mood ("Would transition issue") instead of past-tense completion
0.10.8 — 2026-07-11¶
Fixed¶
- Drop the redundant 'attachment download: validation:' prefix from the download overwrite refusal; it keeps its validation classification (exit 3) like the other --force gates
- Report the attachment download path-escape refusal as flag_value_invalid naming --to, instead of a generic validation failure
- Render status pills with fixed truecolor fills and luma-based text so contrast survives terminals that remap the 16-color ANSI palette
0.10.7 — 2026-07-11¶
Added¶
- Add an env secret backend: jira auth login --backend env reads the profile's JIRA_TOKEN_
variable at run time and stores nothing — for WSL, headless Linux, containers, and op run-style secret injectors
Fixed¶
- Offer only usable secret backends in interactive auth login — the keyring is dropped when no Secret Service answers (WSL, headless Linux) and 1Password in no-CGO builds — and fail headless logins early with actionable errors
- Honor the secret backend selected in the interactive auth login form instead of silently keeping the profile's stored backend
- Classify OS keyring failures as a typed keyring_unavailable error that points at the env backend, instead of surfacing raw Secret Service D-Bus text as a generic validation failure
- Report a nonexistent Atlassian site as jira_site_not_found with the offending host named, instead of relaying Atlassian's misleading 'Site temporarily unavailable' 404 — auth login verification and auth status probes now point at the base_url site name
- Shorten the post-login warning about an old credential that could not be revoked to the typed message instead of the full error chain
- Strip ANSI escapes and control bytes from Jira-sourced text in comment list previews, mirrored ADF warning lines, and debug failure reasons
Dependencies¶
- Upgrade clive to v0.4.2, dropping go-selfupdate and its deprecated x/crypto/openpgp dependency (GO-2026-5932); the govulncheck advisory allowlist is retired now that no accepted advisories remain
0.10.6 — 2026-07-08¶
Added¶
- Show a description and worked examples in --help for each top-level command group (issue, config, cache, auth, and the rest).
Changed¶
- Require --force to delete an alias in headless, agent, or --no-input mode, matching cache clear; interactive terminals are unaffected.
0.10.5 — 2026-07-08¶
Added¶
- Add --dry-run to the local-state mutations that lacked it: alias set/delete/import, config init, config theme, and cache refresh now preview the change and write nothing under --dry-run, reporting data.dry_run true. cache refresh --dry-run reports which resources are stale without contacting Jira.
Security¶
- Build with Go 1.26.5 to pick up its crypto/tls security fixes.
0.10.4 — 2026-07-08¶
Fixed¶
- Sharpen error guidance: the generic Jira 404 hint no longer assumes the identifier is an issue key (it also covers boards, attachments, users, comments, and links); a --type value with no match on a project's create screen now exits 3 (validation) with the valid issue types offered as suggestions instead of a misleading not-found; and an unknown search saved name points to the queries directory rather than --help.
0.10.3 — 2026-07-08¶
Fixed¶
- Surface write failures (broken pipe, disk quota) on paginated list and search envelopes instead of silently swallowing them.
0.10.2 — 2026-07-08¶
Added¶
- Extend shell tab-completion: the issue transition status argument (--transition) now completes status names, and search saved completes saved-query names.
0.10.1 — 2026-07-08¶
Fixed¶
- Locally-detected command errors now carry typed classifications instead of being guessed from their message text, which fixes five wrong exit codes.
auth loginwith a--backendthat differs from the profile's stored backend, andissue edit --assignee meon a profile with no saved account id, now exit 3 (validation,flag_value_invalid) instead of 1 (auth).auth whoamiagainst a profile that has no base URL now exits 2 (profile_incomplete) instead of 1 (auth).jira agent guidewith an unknown section andjira search savedwith an unknown query name now exit 3 (validation,arg_value_invalid) instead of 2 (not found) — the lookups are local, not Jira resources. Every--forcegate keeps itsvalidation_failed/exit 3 contract, and a genuinely absent Jira user on watcher commands keepsnot_found/exit 2. - The command error classifier no longer guesses an error's category from its message text — a fragile heuristic that misrouted some validation errors to the wrong exit code. A bad
auth_type(rejected on config load or viaconfig set) andauth loginwith the conflicting--secret-stdinand--credential-envflags now exit 3 (validation) instead of 1 (auth), where before the word "auth" or the flag name "credential-env" pushed them onto the authentication path. Multi-key batch commands that partially fail now carry the exit code of their worst failure directly instead of re-deriving it from the summary line, so mixed-failure batches classify correctly. Any error the CLI does not explicitly classify now defaults to validation (exit 3) rather than being sorted by keyword.
0.10.0 — 2026-07-07¶
Added¶
issue viewnow surfaces the discovery data Jira already returns on the read instead of discarding it:data.issue.transitions[]lists the workflow moves valid from the current status, anddata.issue.editmeta.fieldslists the editable fields with their required flag, accepted operations, and allowed values — so an agent or script can plan an edit or transition from a single read. The human view gains a one-line transitions summary.- The agent contract is now versioned:
jira agent schemareports the revision atdata.schema_versionand the fulljira agent guideoutput stamps the same value, so an agent can detect a breaking change instead of discovering it mid-workflow. The scheme (what a major, minor, or patch bump means for the contract) is documented in the guide's core_contract section. - Two discovery gaps are closed. A new
jira cache resolutionscommand lists the tenant's resolution names (they vary per instance), so a resolve transition that requires aresolutionfield can be planned instead of guessed. Cached statuses now carrystatus_category(new,indeterminate, ordone) alongsideidandname, and the guide documents that status ids repeat across workflows — map a name to its category from the cache, and resolve the id per issue via the transition list. - The
--dry-run/--forcesafety rails now cover local state mutations, not just Jira writes.cache clear --dry-runreports what a live clear would remove without touching any file,config set --dry-runruns the full key and value validation and reports the current and new value without writing config,auth switch --dry-runresolves the target profile without changing the default, andauth logout --dry-runnames the credential a live logout would revoke without opening the secret backend. The destructive pair —cache clearandauth logout— now requires--forcein agent, non-TTY, or--no-inputcontext, matching the gate on destructive Jira mutations; headless scripts that clear caches or log out must add the flag. Interactive terminals proceed without prompts.
Changed¶
jira updateno longer asks for a yes/no confirmation in an interactive terminal — running the command is the consent, and the self-replace is already checksum-verified and rollback-safe.--dry-runstill previews without changing anything, and headless, agent, and--no-inputruns still require--force.
0.9.2 — 2026-07-07¶
Added¶
- The JSON envelope now carries Jira's own trace id: the
Atl-Traceid/X-ARequestIdresponse header is captured asmeta.upstream_request_idand on each error entry, so a Jira-side failure can be quoted directly to Atlassian support. The existingmeta.request_idis generated locally and has no server-side meaning.
Fixed¶
- Human output now strips ANSI escape and control bytes from Jira-controlled text (summaries, descriptions, error messages), so a crafted issue or error can no longer inject color codes or corrupt your terminal.
jira agent schemanow binds the comment input schema to thecomment add/comment editleaves (they previously reported no input schema) and publishes output schemas for the read/list commands — comment, attachment, link, worklog, transition, boards, and cache — so agents can discover response shapes without trial calls.issue attachment download --tois now confined to the working directory: a..traversal or an absolute path outside it is rejected before any HTTP call, so an agent (or a crafted instruction) can no longer write downloads outside the tree it was launched in. A newsecurity_posturesection injira agent guidedocuments the threat model.
0.9.1 — 2026-07-07¶
Added¶
- Running a command with --debug now prints the error's classification on the error line — its stable code and type, plus a retryable marker when the error is retryable — the same fields an agent reads from the JSON envelope.
- Rate-limited commands now say how long to wait: when Jira sends a Retry-After, human output adds a 'retry in Ns' line under the rate-limit hint.
0.9.0 — 2026-07-06¶
Added¶
- Errors are now easier to act on: human output prints the next-step hint (and a did-you-mean suggestion for unknown flags or commands), the JSON envelope carries those in a new
suggestionsfield, and hints across the CLI were rewritten in plain language.
Fixed¶
- error envelopes now carry a complete, guarded taxonomy: read-only refusals emit code read_only, dry-run transport guards dry_run_blocked, wrong-shape ADF payloads adf_invalid (the raw json unmarshal text no longer leaks), issue-key expansion limits, ambiguous users and ambiguous boards their own codes, invalid --output values route through flag_value_invalid, every code ships a non-empty hint, a permanently deleted resource (HTTP 410) now exits 2 (not found) instead of 3, and exits 6 (canceled) / 7 (timeout) plus all emitted error fields are documented in the agent contract
- Several credential and 1Password error hints now point at the correct fix — including a 1Password failure on a build without 1Password support, and a login that can't reach Jira to verify, which previously suggested remediation that did not apply.
0.8.4 — 2026-07-06¶
Fixed¶
- issue create/edit gain --verify: after a successful live write the issue is re-fetched and every requested field is diffed against what the server actually applied, so silently dropped labels, parents, assignees, priorities, versions, components, and custom fields surface as field_not_applied warnings with a data.verification block instead of a clean success
0.8.3 — 2026-07-06¶
Fixed¶
- alias list human output now renders one name → expansion line per alias (natural-ordered) instead of the collapsed value={...} placeholder; the generic plain fallback also renders any string-keyed map per key, closing the class
- auth login no longer wipes existing profiles when configuring a new one without --config: the fresh-config probe now stats the resolved default path instead of the raw (empty) flag value, so adding a second profile preserves the first
0.8.2 — 2026-07-06¶
Fixed¶
- auth login credential-rejection and cloudId discovery errors now name the HTTP status text (e.g. 401 Unauthorized) instead of the bare status code
- key- and name-like candidate lists now sort naturally (PROJ-2 before PROJ-10) — failed-key summaries in the TUI, board project keys, alias names, and JQL completion candidates
0.8.1 — 2026-07-06¶
Fixed¶
- search jql/saved --fields now narrows the flat per-issue summary projection instead of silently switching the issues array to Jira's raw wire shape; --full remains the raw-record mode
- worklog add --started now accepts ISO-8601 and relative times (yesterday, 2h ago), normalizes them to the exact timestamp format Jira requires, and rejects unparseable values at --dry-run instead of on submit
- auth logout can now purge a credential whose profile was deleted from config: pass --base-url with the profile's old site and the orphaned keychain token is removed instead of failing with profile not found
- issue attachment download/delete now validate their issue-key argument (a traversal path or malformed key fails fast with exit 3), and negative --timeout, --max-retry-wait, and --limit values are rejected instead of silently falling back; 0 remains the documented default/disabled sentinel
- issue create/edit --json-input now accept flat-string values for object-valued system fields (project, issuetype, parent, priority, assignee, reporter, components, fixVersions, versions), lifting them to the wire shape Jira requires instead of passing --dry-run and failing on submit; explicit wire objects are untouched
0.8.0 — 2026-07-05¶
Added¶
- Publish curated release notes on the docs site, assembled per release from change fragments.
- Read jira-cli's own changelog from the CLI with
jira release-notes(aliasrn): the notes are embedded in the binary and rendered as Markdown — the full history by default, or a single release with a version argument or--latest.
Fixed¶
- Honor a named theme set in config (e.g.
dracula,nord) in plain command output — tables and therelease-notesview — instead of falling back to the dark palette; previously only the opt-inautotheme (orJIRA_THEME) styled non-TUI output.
0.7.7 — 2026-07-05¶
Changed¶
- Detect grapheme-clustering terminals through emulator markers (Ghostty, WezTerm, foot, Contour, Windows Terminal); kitty now measures width by wcwidth, correcting its column drift.
Fixed¶
- Keep issue-table columns aligned when a summary contains an inline-code span.
Dependencies¶
- Update gechr/clib to v0.5.9
- Update gechr/clive to v0.2.6
- Update gechr/clog to v0.11.15
- Update gechr/x to v0.2.8
0.7.6 — 2026-07-04¶
Added¶
- Author Jira checklists from Markdown task lists (
- [ ]/- [x]); the ADF support matrix now covers every node and mark of the pinned Atlassian schema. - Teach a foreign flag carried over from another Jira CLI, pointing at this CLI's equivalent instead of rejecting it bare.
Fixed¶
- Align issue tables on grapheme-clustering terminals (Ghostty, WezTerm, foot) when a summary contains emoji.
- Pad status pills to a uniform width down the column.
- Show an unassigned issue as
unassignedrather than a rawmap[].
Dependencies¶
- Update gechr/primer to v0.1.1
- Update gechr/x to v0.2.4
- Update bubbletea to v2.0.8
- Update lipgloss to v2.0.5
- Update google/uuid to v1.6.0
0.7.5 — 2026-07-03¶
Added¶
- Accept native Jira REST payloads on
create,edit,transition, andlinkvia--json-input. - Render bulk operations as a live per-key block.
Changed¶
- Validate
--dry-runagainst the server and report only the checks it actually ran. - Emit pagination as a single canonical block with resumable cursors.
Fixed¶
- Resolve numeric transition targets against the live transition list under
--dry-run.
0.7.4 — 2026-07-03¶
Added¶
- Carry a comment and field edits atomically with a transition's status change.
- Resolve names and emails to Jira account identities with
user search.
0.7.3 — 2026-07-03¶
Added¶
- Read Markdown bodies from a file or stdin via
--markdown-file, unified under a single--markdownflag. - Accept both
--json-inputpayload shapes oncreateandedit.
Changed¶
- Normalize pasted Jira wiki markup before Markdown conversion.
- Abort strict ADF mode on content loss only, not on decoration or placement.
- Treat the wire and alias spellings of the project field as one.
0.7.2 — 2026-07-03¶
Added¶
- Author ADF ahead of submission with standalone
adf convertandadf rendercommands. - Return native ADF bodies from
comment listfor lossless reuse. - Convert GFM tables, blockquotes, and images (as alt-text links) during Markdown conversion, with source-mapped diagnostics.
0.7.1 — 2026-07-03¶
Fixed¶
- Fail closed on an unknown or incomplete
--profile.
0.7.0 — 2026-07-03¶
Added¶
- Update the CLI in place with channel-aware self-update.
- Print a bare version for humans, with a
--detailedbuild block.
Dependencies¶
- Update gechr/clib to v0.5.8
- Update gechr/clive to v0.2.4
- Update gechr/clog to v0.11.12
- Update gechr/primer to v0.0.16
- Update gechr/x to v0.1.14
0.6.4 — 2026-06-30¶
Added¶
- Edit an issue description with
--description-markdown. - Install on Windows via a published Scoop manifest.
0.6.2 — 2026-06-18¶
Added¶
- Auto-detect and support scoped (granular) API tokens.
Changed¶
- Resolve config, cache, and query directories OS-natively.
Fixed¶
- Handle ADF that Jira rejects with
INVALID_INPUT.
Dependencies¶
- Update gechr/clib to v0.5.4
- Update gechr/clog to v0.11.2
- Update gechr/x to v0.1.4
- Update glamour to v2.0.1
- Update koanf to v2.3.5
- Update lipgloss to v2.0.4
- Update golang.org/x/sync to v0.21.0
0.6.0 — 2026-06-10¶
Changed¶
- Rebuild the TUI as a section-based dashboard, with context-aware JQL autocomplete drawn from the instance's own metadata.
Dependencies¶
- Update bubbletea to v2.0.7
- Update glamour to v2.0.0
0.5.1 — 2026-06-09¶
Added¶
- Warn on a successful response that is near the rate limit.
0.5.0 — 2026-06-08¶
Added¶
- Retry 429/503 responses within a bounded budget, honoring
Retry-After, opt-in via--max-retry-waitand explained under--debug.
0.4.1 — 2026-06-08¶
Added¶
- Warm every cached resource in one pass with
cache refresh, backed by a per-resource TTL ladder and versioned entries that self-invalidate on a shape change.
0.4.0 — 2026-06-08¶
Added¶
- Adapt output to the terminal background with an opt-in
autotheme, honored across output and the dashboard. - Show progress feedback for blocking and fan-out operations.
- Accept
-oas shorthand for--output.
Changed¶
- Colour issue-list status pills and the priority column.
Fixed¶
- Write machine-mode error envelopes to stdout with a clean message.
Dependencies¶
- Update gechr/clib to v0.5.2
- Update gechr/clog to v0.10.2
- Update gechr/x to v0.0.10
0.3.3 — 2026-06-03¶
Added¶
- Complete
--status,--priority,--assignee, and--columnsfrom cached metadata in the shell. - Validate JQL against Jira's parser (
jql validate), list instance JQL metadata (jql reference), count approximate matches (--count), and pagesearch jqlwith--all/--limit/--unbounded.
Security¶
- Rebuild with Go 1.26.4 to clear two standard-library advisories on the HTTPS path to Jira: GO-2026-5039 (
net/textproto) and GO-2026-5037 (crypto/x509).
0.3.2 — 2026-06-01¶
Added¶
- Filter
issue minewith the full list surface, plus--updated/--created/--resolveddate filters.
0.3.1 — 2026-06-01¶
Fixed¶
- Route config and credential writes through a symlink-aware atomic writer.
0.3.0 — 2026-05-31¶
Added¶
- Open issues and queries in the browser.
- Transition by status name or positional target.
- Filter status with JQL comparators and negation; select and order columns with
--columnsand--tsv; create issues with convenience flags.
Changed¶
- Colour issue statuses by workflow category.
- Require a 1Password vault and item on the headless login path, and validate the profile name at login.
Fixed¶
- Apply
--order-byto a custom--jqlquery. - Write config through a symlinked file instead of clobbering it.
Dependencies¶
- Update gechr/clib to v0.4.15
- Update gechr/clog to v0.9.8
- Update gechr/x to v0.0.8
0.2.0 — 2026-05-29¶
Added¶
- Fan out multi-key operations with bounded parallelism.
Dependencies¶
- Update golang.org/x/sync to v0.20.0
0.1.2 — 2026-05-28¶
Added¶
- Accept issue-key ranges (
PROJ-1..PROJ-5).
0.1.1 — 2026-05-27¶
Fixed¶
- Render agent human output as styled JSON.
0.1.0 — 2026-05-27¶
Initial release — a Jira Cloud CLI built for developer and agent workflows.
Added¶
- Log in to Jira Cloud with an API token, credentials keyed per site.
- Read, create, edit, and mutate issues, with an honest
--dry-run. - Emit machine output modes with agent detection, typed command-line parse failures, and an actionable hint on every Jira failure.
- Validate and preserve submitted ADF, and validate custom fields against the Jira screen schema.
- Page and query with truthful JQL, backed by a site-isolated metadata cache.