jira-cli-toolkit 2.5.1rc1__tar.gz → 2.5.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.gitignore +1 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/PKG-INFO +25 -18
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/README.md +24 -17
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/releases/2.5.md +5 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/usage.md +1 -1
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/pyproject.toml +1 -1
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/__init__.py +1 -1
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/update.py +11 -2
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_update.py +23 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/uv.lock +1 -1
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/package.json +1 -1
- jira_cli_toolkit-2.5.2/web/public/llms.txt +48 -0
- jira_cli_toolkit-2.5.2/web/public/robots.txt +4 -0
- jira_cli_toolkit-2.5.2/web/public/sitemap.xml +4 -0
- jira_cli_toolkit-2.5.2/web/scripts/prerender.mjs +11 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/App.css +5 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/App.tsx +16 -10
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ThemeToggle.tsx +5 -2
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/data/commands.json +1 -1
- jira_cli_toolkit-2.5.2/web/src/entry-server.tsx +8 -0
- jira_cli_toolkit-2.5.2/web/src/main.tsx +14 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/tests/landing.spec.ts +16 -3
- jira_cli_toolkit-2.5.2/web/vite.config.ts +32 -0
- jira_cli_toolkit-2.5.1rc1/web/src/main.tsx +0 -10
- jira_cli_toolkit-2.5.1rc1/web/vite.config.ts +0 -10
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.env.example +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.github/workflows/ci.yml +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.github/workflows/pages.yml +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.github/workflows/release.yml +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/CHANGELOG.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/LICENSE +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/NOTICE +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/assets/cli-toolkit-cover-illustrated.png +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/assets/cli-toolkit-cover-illustrated.prompt.txt +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/assets/cli-toolkit-cover.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/branding.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/install.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/migration/legacy-commands.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/migration/upgrade-to-v2.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2-upgrade/acceptance.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2-upgrade/interface-contract.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2-upgrade/migration.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2-upgrade/roadmap.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2.5-api/roadmap.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/requirements-ci.lock +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/command_tree.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/entrypoint.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/install.ps1 +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/install.sh +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/binary.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/installer_smoke.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/manifest.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/publish.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/windows_smoke.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/smoke.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/api.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/api_spec.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/application.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/auth.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/cli.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/client.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/commands.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/completion.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/config.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/credentials.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/data/callback.json +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/fields.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/maintenance.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/templates.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/ui.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_api.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_api_spec.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_auth.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_cli.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_client.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_commands.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_fields.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_installers.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_maintenance.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_release.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_reliability.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_templates.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_website_commands.py +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/BRAND_REVIEW.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/DESIGN.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/README.md +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/components.json +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/index.html +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/package-lock.json +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/playwright.config.ts +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/claudecode.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/cline.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/commandcode.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/cursor.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/githubcopilot.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/googlegemini.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/opencode.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/pi.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/qwen.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/warp.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/windsurf.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/zedindustries.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/apple-touch-icon.png +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/favicon.svg +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/third-party-notices.txt +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/AsciiField.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/Terminal.css +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/Terminal.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/accordion.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/badge.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/button.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/card.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/input.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/kbd.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/separator.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/table.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/tabs.tsx +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/index.css +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/lib/utils.ts +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/complete.ts +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/help.ts +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/parse.ts +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/sample.ts +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/scenarios.ts +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/session.ts +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/tree.ts +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/shadcn.css +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/tsconfig.app.json +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/tsconfig.json +0 -0
- {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/tsconfig.node.json +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: jira-cli-toolkit
|
|
3
|
-
Version: 2.5.
|
|
3
|
+
Version: 2.5.2
|
|
4
4
|
Summary: General-purpose Jira Cloud CLI with a friendly terminal UI
|
|
5
5
|
Project-URL: Repository, https://github.com/User17745/jira-cli-toolkit
|
|
6
6
|
Project-URL: Issues, https://github.com/User17745/jira-cli-toolkit/issues
|
|
@@ -15,10 +15,10 @@ Requires-Dist: requests>=2.31
|
|
|
15
15
|
Requires-Dist: rich>=13
|
|
16
16
|
Description-Content-Type: text/markdown
|
|
17
17
|
|
|
18
|
-
<a href="https://user17745.github.io/jira-cli-toolkit/"><img src="docs/assets/cli-toolkit-cover-illustrated.png" alt="CLI Toolkit for Jira — independent terminal tools for Jira Cloud, with current issue, project and sprint command examples" width="100%" /></a>
|
|
18
|
+
<a href="https://user17745.github.io/jira-cli-toolkit/"><img src="https://raw.githubusercontent.com/User17745/jira-cli-toolkit/main/docs/assets/cli-toolkit-cover-illustrated.png" alt="CLI Toolkit for Jira — independent terminal tools for Jira Cloud, with current issue, project and sprint command examples" width="100%" /></a>
|
|
19
19
|
|
|
20
20
|
<p align="center">
|
|
21
|
-
<a href="LICENSE"><img alt="License: AGPL v3 only" src="https://img.shields.io/badge/license-AGPL%20v3%20only-087f75?style=flat-square" /></a>
|
|
21
|
+
<a href="https://github.com/User17745/jira-cli-toolkit/blob/main/LICENSE"><img alt="License: AGPL v3 only" src="https://img.shields.io/badge/license-AGPL%20v3%20only-087f75?style=flat-square" /></a>
|
|
22
22
|
<a href="https://github.com/User17745/jira-cli-toolkit/releases/latest"><img alt="Latest release" src="https://img.shields.io/github/v/release/User17745/jira-cli-toolkit?style=flat-square&color=087f75" /></a>
|
|
23
23
|
<a href="https://github.com/User17745/jira-cli-toolkit/actions/workflows/ci.yml"><img alt="CLI tests" src="https://img.shields.io/github/actions/workflow/status/User17745/jira-cli-toolkit/ci.yml?branch=main&style=flat-square&label=tests" /></a>
|
|
24
24
|
<a href="https://github.com/User17745/jira-cli-toolkit/actions/workflows/release.yml"><img alt="Native builds" src="https://img.shields.io/github/actions/workflow/status/User17745/jira-cli-toolkit/release.yml?branch=main&style=flat-square&label=native%20builds" /></a>
|
|
@@ -33,7 +33,7 @@ Description-Content-Type: text/markdown
|
|
|
33
33
|
|
|
34
34
|
Independent project. Not affiliated with, endorsed by, or sponsored by Atlassian. Jira is a trademark of Atlassian.
|
|
35
35
|
|
|
36
|
-
[Website](https://user17745.github.io/jira-cli-toolkit/) · [Command reference](docs/usage.md) · [Latest release](https://github.com/User17745/jira-cli-toolkit/releases/latest) · [Migration guides](docs/migration/upgrade-to-v2.md)
|
|
36
|
+
[Website](https://user17745.github.io/jira-cli-toolkit/) · [Command reference](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md) · [Latest release](https://github.com/User17745/jira-cli-toolkit/releases/latest) · [Migration guides](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md)
|
|
37
37
|
|
|
38
38
|
## Get started
|
|
39
39
|
|
|
@@ -48,6 +48,13 @@ export PATH="$HOME/.local/bin:$PATH"
|
|
|
48
48
|
|
|
49
49
|
macOS **15+**, Apple Silicon or Intel. Installs to `~/.local/bin/jira`.
|
|
50
50
|
|
|
51
|
+
Or with [Homebrew](https://brew.sh), which also handles upgrades:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
brew install user17745/tap/jira-cli-toolkit
|
|
55
|
+
brew upgrade jira-cli-toolkit
|
|
56
|
+
```
|
|
57
|
+
|
|
51
58
|
### Linux
|
|
52
59
|
|
|
53
60
|
```bash
|
|
@@ -55,7 +62,7 @@ curl -fsSL https://raw.githubusercontent.com/User17745/jira-cli-toolkit/main/scr
|
|
|
55
62
|
export PATH="$HOME/.local/bin:$PATH"
|
|
56
63
|
```
|
|
57
64
|
|
|
58
|
-
Linux **x86_64, glibc 2.39+** (for example Ubuntu 24.04+). Installs to `~/.local/bin/jira`. `curl` and `sha256sum` or `shasum` are required. On older systems, musl or unsupported native architectures, use the
|
|
65
|
+
Linux **x86_64, glibc 2.39+** (for example Ubuntu 24.04+). Installs to `~/.local/bin/jira`. `curl` and `sha256sum` or `shasum` are required. Homebrew on Linux x86_64 works too (`brew install user17745/tap/jira-cli-toolkit`). On older systems, musl or unsupported native architectures, use the Python package instead: `pipx install jira-cli-toolkit`.
|
|
59
66
|
|
|
60
67
|
### Windows
|
|
61
68
|
|
|
@@ -67,9 +74,9 @@ irm https://raw.githubusercontent.com/User17745/jira-cli-toolkit/main/scripts/in
|
|
|
67
74
|
|
|
68
75
|
Windows **10+ x86_64**, PowerShell **5.1+**. Installs to `%LOCALAPPDATA%\JiraCLI\bin\jira.exe` and adds that directory to your user PATH. Open a new terminal if needed.
|
|
69
76
|
|
|
70
|
-
**Prefer manual installation?** [Open the latest release](https://github.com/User17745/jira-cli-toolkit/releases/latest) and choose a matching binary or Python wheel. The [installation guide](docs/migration/upgrade-to-v2.md) explains verification and pipx/uv/Python installation. From 2.5.1 the Python package is also on PyPI as `jira-cli-toolkit`: `pipx install jira-cli-toolkit`, then `pipx upgrade jira-cli-toolkit`. Installations made before 2.5.1 are tracked as `jsup`; switch once with `pipx uninstall jsup` and `pipx install jira-cli-toolkit` (configuration and saved credentials are kept).
|
|
77
|
+
**Prefer manual installation?** [Open the latest release](https://github.com/User17745/jira-cli-toolkit/releases/latest) and choose a matching binary or Python wheel. The [installation guide](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md) explains verification and pipx/uv/Python installation. From 2.5.1 the Python package is also on PyPI as `jira-cli-toolkit`: `pipx install jira-cli-toolkit`, then `pipx upgrade jira-cli-toolkit`. Installations made before 2.5.1 are tracked as `jsup`; switch once with `pipx uninstall jsup` and `pipx install jira-cli-toolkit` (configuration and saved credentials are kept).
|
|
71
78
|
|
|
72
|
-
**Already installed?** Use [the migration guide](docs/migration/upgrade-to-v2.md). Installers refuse to replace existing CLI commands or managed shims. Custom paths and pinned versions are documented in [installer options](docs/install.md).
|
|
79
|
+
**Already installed?** Use [the migration guide](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md). Installers refuse to replace existing CLI commands or managed shims. Custom paths and pinned versions are documented in [installer options](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/install.md).
|
|
73
80
|
|
|
74
81
|
### Connect your account
|
|
75
82
|
|
|
@@ -97,7 +104,7 @@ Replace `ENG` with your project key. Guided login explains how to [create an Atl
|
|
|
97
104
|
| List boards and sprints | `jira board list -p ENG` · `jira sprint list --board 123` |
|
|
98
105
|
| Inspect project fields | `jira project fields -p ENG --type Bug` |
|
|
99
106
|
|
|
100
|
-
Issue types, fields, transitions and board operations follow your project’s metadata and permissions. The CLI also supports assignment, relationships, attachments, comment maintenance, components, templates, CSV and shell completion. [Explore the full reference](docs/usage.md).
|
|
107
|
+
Issue types, fields, transitions and board operations follow your project’s metadata and permissions. The CLI also supports assignment, relationships, attachments, comment maintenance, components, templates, CSV and shell completion. [Explore the full reference](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md).
|
|
101
108
|
|
|
102
109
|
Help works without credentials or a network connection:
|
|
103
110
|
|
|
@@ -115,7 +122,7 @@ jira issue comment --help
|
|
|
115
122
|
- **Explicit alternatives:** scripts can supply a complete environment identity. POSIX `--storage file` is a separate mode-0600 plaintext opt-in, never an automatic fallback.
|
|
116
123
|
- **Recovery:** API tokens cannot refresh automatically. Replace an invalid/revoked/expired token with `auth login`; the CLI never replays a write automatically after recovery.
|
|
117
124
|
|
|
118
|
-
Native stores can require interactive approval. Linux wallets are interactive-only; scripted macOS access suppresses approval dialogs and fails with recovery instructions if approval is needed. [Read the authentication details](docs/usage.md#guided-authentication-and-profiles).
|
|
125
|
+
Native stores can require interactive approval. Linux wallets are interactive-only; scripted macOS access suppresses approval dialogs and fails with recovery instructions if approval is needed. [Read the authentication details](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md#guided-authentication-and-profiles).
|
|
119
126
|
|
|
120
127
|
## Automation and agents
|
|
121
128
|
|
|
@@ -128,7 +135,7 @@ jira completion zsh
|
|
|
128
135
|
|
|
129
136
|
JSON preserves API field structures, CSV supports selected columns, and `--no-input` makes missing input explicit. Destructive commands still need `--yes` in scripts. Runtime errors are structured on stdout for grouped commands; diagnostics and usage errors use stderr. Exit codes: **0** success/help, **1** API/network failure, **2** input/config/file errors, **130** interruption.
|
|
130
137
|
|
|
131
|
-
Templates are declarative JSON with declared variables, not executable hooks. The example callback template has explicit defaults that must fit your project; ordinary creation adds no support-specific fields. [Read scripting and template details](docs/usage.md).
|
|
138
|
+
Templates are declarative JSON with declared variables, not executable hooks. The example callback template has explicit defaults that must fit your project; ordinary creation adds no support-specific fields. [Read scripting and template details](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md).
|
|
132
139
|
|
|
133
140
|
### Any REST endpoint, without a token in the command
|
|
134
141
|
|
|
@@ -141,7 +148,7 @@ jira api /rest/api/3/project/search --query maxResults=20
|
|
|
141
148
|
jira api /rest/agile/1.0/board/12/sprint --profile work | jq '.values[].name'
|
|
142
149
|
```
|
|
143
150
|
|
|
144
|
-
Response bodies go to stdout exactly as Jira returns them; failures are a JSON object on stderr. Requests stay on your site: no absolute URLs, no redirects, and auth headers can't be overridden. Writes are never retried. For unattended agents, approve keychain access once and give the agent a least-privilege account. [Read the API, discovery and agent setup guide](docs/usage.md#calling-any-rest-endpoint).
|
|
151
|
+
Response bodies go to stdout exactly as Jira returns them; failures are a JSON object on stderr. Requests stay on your site: no absolute URLs, no redirects, and auth headers can't be overridden. Writes are never retried. For unattended agents, approve keychain access once and give the agent a least-privilege account. [Read the API, discovery and agent setup guide](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md#calling-any-rest-endpoint).
|
|
145
152
|
|
|
146
153
|
## Explicit updates and releases
|
|
147
154
|
|
|
@@ -153,9 +160,9 @@ jira update --yes
|
|
|
153
160
|
|
|
154
161
|
Standalone updates select a compatible GitHub Release binary, verify its manifest/hash/size, validate version/help, and retain a `.previous` backup. Windows completes replacement through a separate helper. Config and credentials stay untouched; ordinary commands never auto-update.
|
|
155
162
|
|
|
156
|
-
For pipx/uv/Python installations, `update` gives instructions for the owning manager. Public downloads need no Jira token; an optional GitHub token can increase API rate limits. [Update, verification and rollback details](docs/migration/upgrade-to-v2.md).
|
|
163
|
+
For pipx/uv/Python installations, `update` gives instructions for the owning manager. Public downloads need no Jira token; an optional GitHub token can increase API rate limits. [Update, verification and rollback details](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md).
|
|
157
164
|
|
|
158
|
-
Releases contain wheel/sdist, macOS arm64/x86_64, Linux x86_64 and Windows x86_64 binaries, manifest and checksums. Current native OS requirements are listed above and in the manifest. Independent attestation verification, signing and notarization remain [release-hardening work](docs/sprints/v2-upgrade/roadmap.md#remaining-work-after-v21).
|
|
165
|
+
Releases contain wheel/sdist, macOS arm64/x86_64, Linux x86_64 and Windows x86_64 binaries, manifest and checksums. Current native OS requirements are listed above and in the manifest. Independent attestation verification, signing and notarization remain [release-hardening work](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/sprints/v2-upgrade/roadmap.md#remaining-work-after-v21).
|
|
159
166
|
|
|
160
167
|
## Migrating from old commands
|
|
161
168
|
|
|
@@ -167,7 +174,7 @@ Releases contain wheel/sdist, macOS arm64/x86_64, Linux x86_64 and Windows x86_6
|
|
|
167
174
|
| `jsup issue-show ENG-42` | `jira issue view ENG-42` |
|
|
168
175
|
| `jsup issue-move ENG-42 --to Done` | `jira issue transition ENG-42 --to Done` |
|
|
169
176
|
|
|
170
|
-
Read the [installation/credential migration guide](docs/migration/upgrade-to-v2.md) and the [complete developer command migration](docs/migration/legacy-commands.md). Existing migrated profiles need no second credential migration when updating from v2.0.
|
|
177
|
+
Read the [installation/credential migration guide](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md) and the [complete developer command migration](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/legacy-commands.md). Existing migrated profiles need no second credential migration when updating from v2.0.
|
|
171
178
|
|
|
172
179
|
## Development
|
|
173
180
|
|
|
@@ -189,13 +196,13 @@ npm run build
|
|
|
189
196
|
npm test
|
|
190
197
|
```
|
|
191
198
|
|
|
192
|
-
[Website development and browser checks](web/README.md) · [Installer development](docs/install.md) · [Release acceptance](docs/sprints/v2-upgrade/acceptance.md)
|
|
199
|
+
[Website development and browser checks](https://github.com/User17745/jira-cli-toolkit/blob/main/web/README.md) · [Installer development](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/install.md) · [Release acceptance](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/sprints/v2-upgrade/acceptance.md)
|
|
193
200
|
|
|
194
201
|
## Scope and next steps
|
|
195
202
|
|
|
196
203
|
The current release supports standard **Jira Cloud** issues and applicable Software boards/sprints, and any Jira Cloud REST endpoint through `jira api`, including Service Management. Service Management convenience commands and Data Center remain future work. Required-field discovery cannot describe every app-specific workflow validator; Jira remains authoritative.
|
|
197
204
|
|
|
198
|
-
Original project code is licensed under **AGPL-3.0-only**. [See completed milestones and remaining work](docs/sprints/v2-upgrade/roadmap.md).
|
|
205
|
+
Original project code is licensed under **AGPL-3.0-only**. [See completed milestones and remaining work](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/sprints/v2-upgrade/roadmap.md).
|
|
199
206
|
|
|
200
207
|
## Independent project and intellectual property notice
|
|
201
208
|
|
|
@@ -207,6 +214,6 @@ No infringement of third-party trademarks, copyrights, patents, or other intelle
|
|
|
207
214
|
|
|
208
215
|
## License
|
|
209
216
|
|
|
210
|
-
Copyright © 2026 Abhishek Aggarwal. Original project code is licensed under the **GNU Affero General Public License, version 3 only (AGPL-3.0-only)**. You may redistribute and modify it under that license. It is provided **without warranty**, including any implied warranty of merchantability or fitness for a particular purpose. See [LICENSE](LICENSE) for the complete terms and [NOTICE](NOTICE) for the project notice.
|
|
217
|
+
Copyright © 2026 Abhishek Aggarwal. Original project code is licensed under the **GNU Affero General Public License, version 3 only (AGPL-3.0-only)**. You may redistribute and modify it under that license. It is provided **without warranty**, including any implied warranty of merchantability or fitness for a particular purpose. See [LICENSE](https://github.com/User17745/jira-cli-toolkit/blob/main/LICENSE) for the complete terms and [NOTICE](https://github.com/User17745/jira-cli-toolkit/blob/main/NOTICE) for the project notice.
|
|
211
218
|
|
|
212
|
-
Third-party components and assets retain their own copyright notices and applicable license terms; preserve those notices when redistributing them. This does not remove applicable AGPL obligations for covered combined works. The project license does not grant rights to third-party trademarks. [Website third-party notices](web/public/third-party-notices.txt) are included separately.
|
|
219
|
+
Third-party components and assets retain their own copyright notices and applicable license terms; preserve those notices when redistributing them. This does not remove applicable AGPL obligations for covered combined works. The project license does not grant rights to third-party trademarks. [Website third-party notices](https://github.com/User17745/jira-cli-toolkit/blob/main/web/public/third-party-notices.txt) are included separately.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
<a href="https://user17745.github.io/jira-cli-toolkit/"><img src="docs/assets/cli-toolkit-cover-illustrated.png" alt="CLI Toolkit for Jira — independent terminal tools for Jira Cloud, with current issue, project and sprint command examples" width="100%" /></a>
|
|
1
|
+
<a href="https://user17745.github.io/jira-cli-toolkit/"><img src="https://raw.githubusercontent.com/User17745/jira-cli-toolkit/main/docs/assets/cli-toolkit-cover-illustrated.png" alt="CLI Toolkit for Jira — independent terminal tools for Jira Cloud, with current issue, project and sprint command examples" width="100%" /></a>
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
|
-
<a href="LICENSE"><img alt="License: AGPL v3 only" src="https://img.shields.io/badge/license-AGPL%20v3%20only-087f75?style=flat-square" /></a>
|
|
4
|
+
<a href="https://github.com/User17745/jira-cli-toolkit/blob/main/LICENSE"><img alt="License: AGPL v3 only" src="https://img.shields.io/badge/license-AGPL%20v3%20only-087f75?style=flat-square" /></a>
|
|
5
5
|
<a href="https://github.com/User17745/jira-cli-toolkit/releases/latest"><img alt="Latest release" src="https://img.shields.io/github/v/release/User17745/jira-cli-toolkit?style=flat-square&color=087f75" /></a>
|
|
6
6
|
<a href="https://github.com/User17745/jira-cli-toolkit/actions/workflows/ci.yml"><img alt="CLI tests" src="https://img.shields.io/github/actions/workflow/status/User17745/jira-cli-toolkit/ci.yml?branch=main&style=flat-square&label=tests" /></a>
|
|
7
7
|
<a href="https://github.com/User17745/jira-cli-toolkit/actions/workflows/release.yml"><img alt="Native builds" src="https://img.shields.io/github/actions/workflow/status/User17745/jira-cli-toolkit/release.yml?branch=main&style=flat-square&label=native%20builds" /></a>
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
Independent project. Not affiliated with, endorsed by, or sponsored by Atlassian. Jira is a trademark of Atlassian.
|
|
18
18
|
|
|
19
|
-
[Website](https://user17745.github.io/jira-cli-toolkit/) · [Command reference](docs/usage.md) · [Latest release](https://github.com/User17745/jira-cli-toolkit/releases/latest) · [Migration guides](docs/migration/upgrade-to-v2.md)
|
|
19
|
+
[Website](https://user17745.github.io/jira-cli-toolkit/) · [Command reference](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md) · [Latest release](https://github.com/User17745/jira-cli-toolkit/releases/latest) · [Migration guides](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md)
|
|
20
20
|
|
|
21
21
|
## Get started
|
|
22
22
|
|
|
@@ -31,6 +31,13 @@ export PATH="$HOME/.local/bin:$PATH"
|
|
|
31
31
|
|
|
32
32
|
macOS **15+**, Apple Silicon or Intel. Installs to `~/.local/bin/jira`.
|
|
33
33
|
|
|
34
|
+
Or with [Homebrew](https://brew.sh), which also handles upgrades:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
brew install user17745/tap/jira-cli-toolkit
|
|
38
|
+
brew upgrade jira-cli-toolkit
|
|
39
|
+
```
|
|
40
|
+
|
|
34
41
|
### Linux
|
|
35
42
|
|
|
36
43
|
```bash
|
|
@@ -38,7 +45,7 @@ curl -fsSL https://raw.githubusercontent.com/User17745/jira-cli-toolkit/main/scr
|
|
|
38
45
|
export PATH="$HOME/.local/bin:$PATH"
|
|
39
46
|
```
|
|
40
47
|
|
|
41
|
-
Linux **x86_64, glibc 2.39+** (for example Ubuntu 24.04+). Installs to `~/.local/bin/jira`. `curl` and `sha256sum` or `shasum` are required. On older systems, musl or unsupported native architectures, use the
|
|
48
|
+
Linux **x86_64, glibc 2.39+** (for example Ubuntu 24.04+). Installs to `~/.local/bin/jira`. `curl` and `sha256sum` or `shasum` are required. Homebrew on Linux x86_64 works too (`brew install user17745/tap/jira-cli-toolkit`). On older systems, musl or unsupported native architectures, use the Python package instead: `pipx install jira-cli-toolkit`.
|
|
42
49
|
|
|
43
50
|
### Windows
|
|
44
51
|
|
|
@@ -50,9 +57,9 @@ irm https://raw.githubusercontent.com/User17745/jira-cli-toolkit/main/scripts/in
|
|
|
50
57
|
|
|
51
58
|
Windows **10+ x86_64**, PowerShell **5.1+**. Installs to `%LOCALAPPDATA%\JiraCLI\bin\jira.exe` and adds that directory to your user PATH. Open a new terminal if needed.
|
|
52
59
|
|
|
53
|
-
**Prefer manual installation?** [Open the latest release](https://github.com/User17745/jira-cli-toolkit/releases/latest) and choose a matching binary or Python wheel. The [installation guide](docs/migration/upgrade-to-v2.md) explains verification and pipx/uv/Python installation. From 2.5.1 the Python package is also on PyPI as `jira-cli-toolkit`: `pipx install jira-cli-toolkit`, then `pipx upgrade jira-cli-toolkit`. Installations made before 2.5.1 are tracked as `jsup`; switch once with `pipx uninstall jsup` and `pipx install jira-cli-toolkit` (configuration and saved credentials are kept).
|
|
60
|
+
**Prefer manual installation?** [Open the latest release](https://github.com/User17745/jira-cli-toolkit/releases/latest) and choose a matching binary or Python wheel. The [installation guide](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md) explains verification and pipx/uv/Python installation. From 2.5.1 the Python package is also on PyPI as `jira-cli-toolkit`: `pipx install jira-cli-toolkit`, then `pipx upgrade jira-cli-toolkit`. Installations made before 2.5.1 are tracked as `jsup`; switch once with `pipx uninstall jsup` and `pipx install jira-cli-toolkit` (configuration and saved credentials are kept).
|
|
54
61
|
|
|
55
|
-
**Already installed?** Use [the migration guide](docs/migration/upgrade-to-v2.md). Installers refuse to replace existing CLI commands or managed shims. Custom paths and pinned versions are documented in [installer options](docs/install.md).
|
|
62
|
+
**Already installed?** Use [the migration guide](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md). Installers refuse to replace existing CLI commands or managed shims. Custom paths and pinned versions are documented in [installer options](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/install.md).
|
|
56
63
|
|
|
57
64
|
### Connect your account
|
|
58
65
|
|
|
@@ -80,7 +87,7 @@ Replace `ENG` with your project key. Guided login explains how to [create an Atl
|
|
|
80
87
|
| List boards and sprints | `jira board list -p ENG` · `jira sprint list --board 123` |
|
|
81
88
|
| Inspect project fields | `jira project fields -p ENG --type Bug` |
|
|
82
89
|
|
|
83
|
-
Issue types, fields, transitions and board operations follow your project’s metadata and permissions. The CLI also supports assignment, relationships, attachments, comment maintenance, components, templates, CSV and shell completion. [Explore the full reference](docs/usage.md).
|
|
90
|
+
Issue types, fields, transitions and board operations follow your project’s metadata and permissions. The CLI also supports assignment, relationships, attachments, comment maintenance, components, templates, CSV and shell completion. [Explore the full reference](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md).
|
|
84
91
|
|
|
85
92
|
Help works without credentials or a network connection:
|
|
86
93
|
|
|
@@ -98,7 +105,7 @@ jira issue comment --help
|
|
|
98
105
|
- **Explicit alternatives:** scripts can supply a complete environment identity. POSIX `--storage file` is a separate mode-0600 plaintext opt-in, never an automatic fallback.
|
|
99
106
|
- **Recovery:** API tokens cannot refresh automatically. Replace an invalid/revoked/expired token with `auth login`; the CLI never replays a write automatically after recovery.
|
|
100
107
|
|
|
101
|
-
Native stores can require interactive approval. Linux wallets are interactive-only; scripted macOS access suppresses approval dialogs and fails with recovery instructions if approval is needed. [Read the authentication details](docs/usage.md#guided-authentication-and-profiles).
|
|
108
|
+
Native stores can require interactive approval. Linux wallets are interactive-only; scripted macOS access suppresses approval dialogs and fails with recovery instructions if approval is needed. [Read the authentication details](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md#guided-authentication-and-profiles).
|
|
102
109
|
|
|
103
110
|
## Automation and agents
|
|
104
111
|
|
|
@@ -111,7 +118,7 @@ jira completion zsh
|
|
|
111
118
|
|
|
112
119
|
JSON preserves API field structures, CSV supports selected columns, and `--no-input` makes missing input explicit. Destructive commands still need `--yes` in scripts. Runtime errors are structured on stdout for grouped commands; diagnostics and usage errors use stderr. Exit codes: **0** success/help, **1** API/network failure, **2** input/config/file errors, **130** interruption.
|
|
113
120
|
|
|
114
|
-
Templates are declarative JSON with declared variables, not executable hooks. The example callback template has explicit defaults that must fit your project; ordinary creation adds no support-specific fields. [Read scripting and template details](docs/usage.md).
|
|
121
|
+
Templates are declarative JSON with declared variables, not executable hooks. The example callback template has explicit defaults that must fit your project; ordinary creation adds no support-specific fields. [Read scripting and template details](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md).
|
|
115
122
|
|
|
116
123
|
### Any REST endpoint, without a token in the command
|
|
117
124
|
|
|
@@ -124,7 +131,7 @@ jira api /rest/api/3/project/search --query maxResults=20
|
|
|
124
131
|
jira api /rest/agile/1.0/board/12/sprint --profile work | jq '.values[].name'
|
|
125
132
|
```
|
|
126
133
|
|
|
127
|
-
Response bodies go to stdout exactly as Jira returns them; failures are a JSON object on stderr. Requests stay on your site: no absolute URLs, no redirects, and auth headers can't be overridden. Writes are never retried. For unattended agents, approve keychain access once and give the agent a least-privilege account. [Read the API, discovery and agent setup guide](docs/usage.md#calling-any-rest-endpoint).
|
|
134
|
+
Response bodies go to stdout exactly as Jira returns them; failures are a JSON object on stderr. Requests stay on your site: no absolute URLs, no redirects, and auth headers can't be overridden. Writes are never retried. For unattended agents, approve keychain access once and give the agent a least-privilege account. [Read the API, discovery and agent setup guide](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md#calling-any-rest-endpoint).
|
|
128
135
|
|
|
129
136
|
## Explicit updates and releases
|
|
130
137
|
|
|
@@ -136,9 +143,9 @@ jira update --yes
|
|
|
136
143
|
|
|
137
144
|
Standalone updates select a compatible GitHub Release binary, verify its manifest/hash/size, validate version/help, and retain a `.previous` backup. Windows completes replacement through a separate helper. Config and credentials stay untouched; ordinary commands never auto-update.
|
|
138
145
|
|
|
139
|
-
For pipx/uv/Python installations, `update` gives instructions for the owning manager. Public downloads need no Jira token; an optional GitHub token can increase API rate limits. [Update, verification and rollback details](docs/migration/upgrade-to-v2.md).
|
|
146
|
+
For pipx/uv/Python installations, `update` gives instructions for the owning manager. Public downloads need no Jira token; an optional GitHub token can increase API rate limits. [Update, verification and rollback details](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md).
|
|
140
147
|
|
|
141
|
-
Releases contain wheel/sdist, macOS arm64/x86_64, Linux x86_64 and Windows x86_64 binaries, manifest and checksums. Current native OS requirements are listed above and in the manifest. Independent attestation verification, signing and notarization remain [release-hardening work](docs/sprints/v2-upgrade/roadmap.md#remaining-work-after-v21).
|
|
148
|
+
Releases contain wheel/sdist, macOS arm64/x86_64, Linux x86_64 and Windows x86_64 binaries, manifest and checksums. Current native OS requirements are listed above and in the manifest. Independent attestation verification, signing and notarization remain [release-hardening work](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/sprints/v2-upgrade/roadmap.md#remaining-work-after-v21).
|
|
142
149
|
|
|
143
150
|
## Migrating from old commands
|
|
144
151
|
|
|
@@ -150,7 +157,7 @@ Releases contain wheel/sdist, macOS arm64/x86_64, Linux x86_64 and Windows x86_6
|
|
|
150
157
|
| `jsup issue-show ENG-42` | `jira issue view ENG-42` |
|
|
151
158
|
| `jsup issue-move ENG-42 --to Done` | `jira issue transition ENG-42 --to Done` |
|
|
152
159
|
|
|
153
|
-
Read the [installation/credential migration guide](docs/migration/upgrade-to-v2.md) and the [complete developer command migration](docs/migration/legacy-commands.md). Existing migrated profiles need no second credential migration when updating from v2.0.
|
|
160
|
+
Read the [installation/credential migration guide](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md) and the [complete developer command migration](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/legacy-commands.md). Existing migrated profiles need no second credential migration when updating from v2.0.
|
|
154
161
|
|
|
155
162
|
## Development
|
|
156
163
|
|
|
@@ -172,13 +179,13 @@ npm run build
|
|
|
172
179
|
npm test
|
|
173
180
|
```
|
|
174
181
|
|
|
175
|
-
[Website development and browser checks](web/README.md) · [Installer development](docs/install.md) · [Release acceptance](docs/sprints/v2-upgrade/acceptance.md)
|
|
182
|
+
[Website development and browser checks](https://github.com/User17745/jira-cli-toolkit/blob/main/web/README.md) · [Installer development](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/install.md) · [Release acceptance](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/sprints/v2-upgrade/acceptance.md)
|
|
176
183
|
|
|
177
184
|
## Scope and next steps
|
|
178
185
|
|
|
179
186
|
The current release supports standard **Jira Cloud** issues and applicable Software boards/sprints, and any Jira Cloud REST endpoint through `jira api`, including Service Management. Service Management convenience commands and Data Center remain future work. Required-field discovery cannot describe every app-specific workflow validator; Jira remains authoritative.
|
|
180
187
|
|
|
181
|
-
Original project code is licensed under **AGPL-3.0-only**. [See completed milestones and remaining work](docs/sprints/v2-upgrade/roadmap.md).
|
|
188
|
+
Original project code is licensed under **AGPL-3.0-only**. [See completed milestones and remaining work](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/sprints/v2-upgrade/roadmap.md).
|
|
182
189
|
|
|
183
190
|
## Independent project and intellectual property notice
|
|
184
191
|
|
|
@@ -190,6 +197,6 @@ No infringement of third-party trademarks, copyrights, patents, or other intelle
|
|
|
190
197
|
|
|
191
198
|
## License
|
|
192
199
|
|
|
193
|
-
Copyright © 2026 Abhishek Aggarwal. Original project code is licensed under the **GNU Affero General Public License, version 3 only (AGPL-3.0-only)**. You may redistribute and modify it under that license. It is provided **without warranty**, including any implied warranty of merchantability or fitness for a particular purpose. See [LICENSE](LICENSE) for the complete terms and [NOTICE](NOTICE) for the project notice.
|
|
200
|
+
Copyright © 2026 Abhishek Aggarwal. Original project code is licensed under the **GNU Affero General Public License, version 3 only (AGPL-3.0-only)**. You may redistribute and modify it under that license. It is provided **without warranty**, including any implied warranty of merchantability or fitness for a particular purpose. See [LICENSE](https://github.com/User17745/jira-cli-toolkit/blob/main/LICENSE) for the complete terms and [NOTICE](https://github.com/User17745/jira-cli-toolkit/blob/main/NOTICE) for the project notice.
|
|
194
201
|
|
|
195
|
-
Third-party components and assets retain their own copyright notices and applicable license terms; preserve those notices when redistributing them. This does not remove applicable AGPL obligations for covered combined works. The project license does not grant rights to third-party trademarks. [Website third-party notices](web/public/third-party-notices.txt) are included separately.
|
|
202
|
+
Third-party components and assets retain their own copyright notices and applicable license terms; preserve those notices when redistributing them. This does not remove applicable AGPL obligations for covered combined works. The project license does not grant rights to third-party trademarks. [Website third-party notices](https://github.com/User17745/jira-cli-toolkit/blob/main/web/public/third-party-notices.txt) are included separately.
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
## What's new in 2.5.2
|
|
2
|
+
|
|
3
|
+
- **Homebrew:** `brew install user17745/tap/jira-cli-toolkit` on macOS (Apple Silicon and Intel) and Linux x86_64, upgraded with `brew upgrade jira-cli-toolkit`. `jira update` recognizes a Homebrew installation and points to `brew upgrade` instead of replacing its files.
|
|
4
|
+
- **PyPI page:** the README's images and links now work on PyPI.
|
|
5
|
+
|
|
1
6
|
## What's new in 2.5.1
|
|
2
7
|
|
|
3
8
|
- **On PyPI:** `pipx install jira-cli-toolkit`, then `pipx upgrade jira-cli-toolkit`. The package was previously named `jsup`; a pipx or uv installation made before 2.5.1 switches once with `pipx uninstall jsup` and `pipx install jira-cli-toolkit` (configuration and saved credentials are kept). `jira update` gives package-manager users the exact command.
|
|
@@ -215,7 +215,7 @@ A selected `--profile` owns its full site/account identity. Complete identity fl
|
|
|
215
215
|
|
|
216
216
|
**Updating a 2.1.0 standalone binary:** run `jira update --yes --json`. Without `--json`, 2.1.0 replaces itself successfully but then crashes while printing the result (`zlib.error … incorrect header check`); the update has still completed, and `jira --version` shows the new version. From 2.5, the updater loads everything it needs before replacing the executable.
|
|
217
217
|
|
|
218
|
-
The repository and release downloads are public. The updater works without GitHub login; an optional `GH_TOKEN` or authenticated `gh` account can raise API rate limits. Jira tokens are never used for GitHub. Package installations receive an exact-version command for their owning pipx, uv or Python environment, such as `pipx install --force 'jira-cli-toolkit==2.5.1'`; the updater does not overwrite manager shims. From 2.5.1 the package is on PyPI as `jira-cli-toolkit`, so `pipx upgrade jira-cli-toolkit` also works. Installations made before 2.5.1 use the package's old name, `jsup`; the updater says so and gives the one-time switch for pipx, uv or pip (uninstall `jsup`, then install `jira-cli-toolkit`), which keeps configuration and saved credentials. Don't install both side by side: they ship the same module. To install offline, download the release wheel, verify its manifest checksum, and pass its path to the same command. Version 0.2.0 needs this one-time bootstrap before it gains an update command.
|
|
218
|
+
The repository and release downloads are public. The updater works without GitHub login; an optional `GH_TOKEN` or authenticated `gh` account can raise API rate limits. Jira tokens are never used for GitHub. Homebrew installations (`brew install user17745/tap/jira-cli-toolkit`) are upgraded with `brew upgrade jira-cli-toolkit`; `jira update` says so instead of replacing files Homebrew owns. The tap checks for new GitHub releases daily. Package installations receive an exact-version command for their owning pipx, uv or Python environment, such as `pipx install --force 'jira-cli-toolkit==2.5.1'`; the updater does not overwrite manager shims. From 2.5.1 the package is on PyPI as `jira-cli-toolkit`, so `pipx upgrade jira-cli-toolkit` also works. Installations made before 2.5.1 use the package's old name, `jsup`; the updater says so and gives the one-time switch for pipx, uv or pip (uninstall `jsup`, then install `jira-cli-toolkit`), which keeps configuration and saved credentials. Don't install both side by side: they ship the same module. To install offline, download the release wheel, verify its manifest checksum, and pass its path to the same command. Version 0.2.0 needs this one-time bootstrap before it gains an update command.
|
|
219
219
|
|
|
220
220
|
If pipx’s uv backend refuses force installation because the venv exists, adding `--backend pip` does not switch that existing environment in pipx 1.14.0. Download and verify the wheel, run `pipx uninstall jsup`, then `pipx install --backend pip /path/to/jsup.whl`. The [migration guide](sprints/v2-upgrade/migration.md) explains this recovery and preservation of saved credentials. Manager detection uses installation receipts, including custom pipx/uv directories.
|
|
221
221
|
|
|
@@ -44,7 +44,8 @@ def _distribution():
|
|
|
44
44
|
|
|
45
45
|
def installation():
|
|
46
46
|
if getattr(sys,'frozen',False):
|
|
47
|
-
|
|
47
|
+
# Homebrew owns files under its Cellar; replacing them would break `brew upgrade`.
|
|
48
|
+
method='homebrew' if '/Cellar/' in str(Path(sys.executable).resolve()).replace('\\','/') else 'standalone'
|
|
48
49
|
else:
|
|
49
50
|
prefix=Path(sys.prefix)
|
|
50
51
|
executable=str(Path(sys.executable).absolute()).replace('\\','/')
|
|
@@ -55,7 +56,7 @@ def installation():
|
|
|
55
56
|
else:
|
|
56
57
|
method='python'
|
|
57
58
|
arch={'amd64':'x86_64','x86_64':'x86_64','aarch64':'arm64','arm64':'arm64'}.get(platform.machine().lower(),platform.machine().lower())
|
|
58
|
-
return dict(version=__version__,method=method,distribution=None if method
|
|
59
|
+
return dict(version=__version__,method=method,distribution=None if method in ('standalone','homebrew') else _distribution(),os={'Darwin':'macos','Linux':'linux','Windows':'windows'}.get(platform.system(),'unsupported'),
|
|
59
60
|
arch=arch,executable=str(Path(sys.executable).resolve()),python=sys.version.split()[0])
|
|
60
61
|
|
|
61
62
|
|
|
@@ -261,6 +262,10 @@ def apply_windows_update(values):
|
|
|
261
262
|
def handle(args):
|
|
262
263
|
installed=installation()
|
|
263
264
|
if args.info: return installed
|
|
265
|
+
if args.version and installed['method']=='homebrew':
|
|
266
|
+
# The tap only offers its latest stable release; brew can't install another one.
|
|
267
|
+
raise UpdateError(f'Homebrew installs follow the tap\'s latest stable release; run brew upgrade {DISTRIBUTION}. '
|
|
268
|
+
f'For a specific version, use that release\'s binary or pipx install \'{DISTRIBUTION}==VERSION\'.')
|
|
264
269
|
try: requested=Version(args.version.removeprefix('v')) if args.version else None
|
|
265
270
|
except InvalidVersion: raise UpdateError('Use a valid release version.') from None
|
|
266
271
|
if requested and requested.is_prerelease and not args.prerelease:
|
|
@@ -285,6 +290,10 @@ def handle(args):
|
|
|
285
290
|
available=version!=Version(__version__)
|
|
286
291
|
result={**installed,'available_version':str(version),'update_available':available,'release_url':release.get('html_url'),'updated':False}
|
|
287
292
|
if args.check or not available: return result
|
|
293
|
+
if installed['method']=='homebrew':
|
|
294
|
+
result.update(instructions=f'brew upgrade {DISTRIBUTION}',
|
|
295
|
+
note='Homebrew manages this installation; the tap picks up new releases within a day.')
|
|
296
|
+
return result
|
|
288
297
|
if installed['method']!='standalone':
|
|
289
298
|
wheel=next((a for a in manifest['artifacts'] if a.get('kind')=='wheel'),None)
|
|
290
299
|
if not wheel: raise UpdateError('Release has no Python wheel for this installation.')
|
|
@@ -89,6 +89,29 @@ class UpdateTests(unittest.TestCase):
|
|
|
89
89
|
self.assertNotIn('migration',result)
|
|
90
90
|
self.assertEqual(self.api.download.call_count,3)
|
|
91
91
|
|
|
92
|
+
def test_homebrew_installs_are_upgraded_by_brew_not_replaced(self):
|
|
93
|
+
self.installed.update(method='homebrew',distribution=None)
|
|
94
|
+
with patch.object(update,'replace_binary') as replace:
|
|
95
|
+
result=update.handle(args(check=False))
|
|
96
|
+
replace.assert_not_called()
|
|
97
|
+
self.assertEqual(result['instructions'],'brew upgrade jira-cli-toolkit')
|
|
98
|
+
self.assertFalse(result['updated'])
|
|
99
|
+
|
|
100
|
+
def test_homebrew_installs_reject_explicit_versions(self):
|
|
101
|
+
self.installed.update(method='homebrew',distribution=None)
|
|
102
|
+
with self.assertRaisesRegex(update.UpdateError,'latest stable release'):
|
|
103
|
+
update.handle(args(check=False,version='2.0.0'))
|
|
104
|
+
self.api.release.assert_not_called()
|
|
105
|
+
|
|
106
|
+
def test_frozen_binaries_in_a_homebrew_cellar_are_detected(self):
|
|
107
|
+
patch.stopall() # setUp stubs installation(); this test needs the real one
|
|
108
|
+
with patch.object(update.sys,'frozen',True,create=True), \
|
|
109
|
+
patch.object(update.sys,'executable','/opt/homebrew/Cellar/jira-cli-toolkit/2.5.2/bin/jira'):
|
|
110
|
+
self.assertEqual(update.installation()['method'],'homebrew')
|
|
111
|
+
with patch.object(update.sys,'frozen',True,create=True), \
|
|
112
|
+
patch.object(update.sys,'executable','/Users/me/.local/bin/jira'):
|
|
113
|
+
self.assertEqual(update.installation()['method'],'standalone')
|
|
114
|
+
|
|
92
115
|
def test_installs_tracked_as_jsup_get_a_one_time_switch(self):
|
|
93
116
|
self.installed.update(method='pipx',distribution='jsup')
|
|
94
117
|
result=update.handle(args(check=False))
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"dev": "vite",
|
|
8
|
-
"build": "tsc -b && vite build",
|
|
8
|
+
"build": "tsc -b && vite build && vite build --ssr src/entry-server.tsx --outDir dist-ssr && node scripts/prerender.mjs",
|
|
9
9
|
"lint": "oxlint",
|
|
10
10
|
"preview": "vite preview",
|
|
11
11
|
"test": "playwright test"
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# CLI Toolkit for Jira
|
|
2
|
+
|
|
3
|
+
> An independent command-line tool for Jira Cloud, built so AI agents can drive Jira: plan roadmaps into sprints, write standup digests, and update issues as code merges. The command is `jira`. It runs with the user's own Jira permissions and API token, on macOS, Linux and Windows. Not affiliated with Atlassian. Open source under AGPL-3.0-only.
|
|
4
|
+
|
|
5
|
+
Key facts for agents:
|
|
6
|
+
|
|
7
|
+
- Install once per machine, then sign in from a human-run terminal: `jira auth login --profile work`. Tokens go to the OS credential store. Never ask the user for their API token.
|
|
8
|
+
- Each profile is one Jira account. Add more with another `--profile NAME`, switch with `jira profile use NAME`, or pass `--profile NAME` to a single command.
|
|
9
|
+
- Before the first Jira task, check access with `jira auth status --json --no-input`.
|
|
10
|
+
- Add `--json --no-input` to every command and read results from stdout. Errors are JSON too.
|
|
11
|
+
- Exit codes: 0 success, 1 Jira or network error, 2 invalid input or configuration, 130 interrupted.
|
|
12
|
+
- Look before writing: `jira project fields KEY --type TYPE` lists required fields, and `jira issue transitions ISSUE` lists valid moves.
|
|
13
|
+
- `jira help <command>` prints the real help for any command, offline and without credentials.
|
|
14
|
+
- For anything without a dedicated command, `jira api <path> --spec` shows an endpoint's permissions, scopes and body schema; then `jira api <path>` calls it with the saved profile.
|
|
15
|
+
- Destructive commands need `--yes` in scripts. Writes are never retried automatically.
|
|
16
|
+
|
|
17
|
+
Install:
|
|
18
|
+
|
|
19
|
+
- macOS and Linux: `curl -fsSL https://raw.githubusercontent.com/User17745/jira-cli-toolkit/main/scripts/install.sh | bash`, then `export PATH="$HOME/.local/bin:$PATH"`
|
|
20
|
+
- Windows (PowerShell): `irm https://raw.githubusercontent.com/User17745/jira-cli-toolkit/main/scripts/install.ps1 | iex`
|
|
21
|
+
|
|
22
|
+
Everyday commands:
|
|
23
|
+
|
|
24
|
+
- `jira context use --project ENG` sets the default project
|
|
25
|
+
- `jira issue list --open` lists open issues; add `--jql '...'` for your own query, `--csv --columns key,summary,status` for CSV
|
|
26
|
+
- `jira issue view ENG-42` shows one issue
|
|
27
|
+
- `jira issue create -p ENG --type Bug --summary "Fix login"` creates an issue
|
|
28
|
+
- `jira issue edit ENG-42 --summary "..."` edits one
|
|
29
|
+
- `jira issue transition ENG-42 --to "In Progress"` moves it through its workflow
|
|
30
|
+
- `jira issue assign ENG-42 --user me` assigns it
|
|
31
|
+
- `jira issue comment add ENG-42 -m "Review started"` comments
|
|
32
|
+
- `jira board list -p ENG` and `jira sprint list --board 123` list boards and sprints
|
|
33
|
+
|
|
34
|
+
## Docs
|
|
35
|
+
|
|
36
|
+
- [README](https://github.com/User17745/jira-cli-toolkit/blob/main/README.md): overview, installation, everyday workflows, authentication and automation
|
|
37
|
+
- [Command reference and usage guide](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md): every command, profiles, scripting, templates and output formats
|
|
38
|
+
- [Setting up an agent or script](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md#setting-up-an-agent-or-script-once): one-time sign-in, keychain approval and headless options
|
|
39
|
+
- [Calling any REST endpoint](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/usage.md#calling-any-rest-endpoint): `jira api`, `--spec` lookups and safety limits
|
|
40
|
+
- [Installer options](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/install.md): custom paths and pinned versions
|
|
41
|
+
- [Upgrading and migration](https://github.com/User17745/jira-cli-toolkit/blob/main/docs/migration/upgrade-to-v2.md): manual installs, verification, and moving from `jsup`
|
|
42
|
+
|
|
43
|
+
## Optional
|
|
44
|
+
|
|
45
|
+
- [Latest release](https://github.com/User17745/jira-cli-toolkit/releases/latest): native binaries and the Python wheel
|
|
46
|
+
- [Source code](https://github.com/User17745/jira-cli-toolkit)
|
|
47
|
+
- [License (AGPL-3.0-only)](https://github.com/User17745/jira-cli-toolkit/blob/main/LICENSE)
|
|
48
|
+
- [Report an issue](https://github.com/User17745/jira-cli-toolkit/issues)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Renders the page into dist/index.html after `vite build --ssr`, then removes the server bundle.
|
|
2
|
+
import { readFile, rm, writeFile } from 'node:fs/promises'
|
|
3
|
+
|
|
4
|
+
const server = new URL('../dist-ssr/', import.meta.url)
|
|
5
|
+
const page = new URL('../dist/index.html', import.meta.url)
|
|
6
|
+
const { render } = await import(new URL('entry-server.js', server).href)
|
|
7
|
+
const html = await readFile(page, 'utf8')
|
|
8
|
+
const empty = '<div id="root"></div>'
|
|
9
|
+
if (!html.includes(empty)) throw new Error('dist/index.html has no empty #root to prerender into')
|
|
10
|
+
await writeFile(page, html.replace(empty, `<div id="root">${render()}</div>`))
|
|
11
|
+
await rm(server, { recursive: true, force: true })
|
|
@@ -109,3 +109,8 @@ body { -webkit-font-smoothing: antialiased; }
|
|
|
109
109
|
/* The logo's green; dark text keeps it readable in both themes. */
|
|
110
110
|
.brand-button { background: #4ade80; color: #0a0a0a; }
|
|
111
111
|
.brand-button:hover { background: #22c55e; }
|
|
112
|
+
|
|
113
|
+
/* Install panels stack in one cell; hidden ones keep their space but can't be seen, focused or read. */
|
|
114
|
+
.install-panels { display: grid; grid-template-columns: minmax(0, 1fr); }
|
|
115
|
+
.install-panels > * { grid-area: 1 / 1; }
|
|
116
|
+
.install-panels > [hidden] { display: block; visibility: hidden; }
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Fragment, useMemo, useRef, useState } from 'react'
|
|
1
|
+
import { Fragment, useEffect, useMemo, useRef, useState } from 'react'
|
|
2
2
|
import { ArrowRight, Check, ChevronRight, Copy, CornerDownLeft, Play, Search } from 'lucide-react'
|
|
3
3
|
import { buttonVariants } from '@/components/ui/button'
|
|
4
4
|
import { Input } from '@/components/ui/input'
|
|
@@ -120,7 +120,9 @@ function CopyButton({ text, label, done = 'Command copied to clipboard.' }: { te
|
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
function Install() {
|
|
123
|
-
|
|
123
|
+
// The page is prerendered for macOS, then switches to the visitor's system once it hydrates.
|
|
124
|
+
const [os, setOS] = useState<OS>('macos')
|
|
125
|
+
useEffect(() => setOS(/Win/i.test(navigator.userAgent) ? 'windows' : /Linux/i.test(navigator.userAgent) ? 'linux' : 'macos'), [])
|
|
124
126
|
return <section id="get-started" aria-labelledby="install-title" className="rounded-xl border bg-card p-4 shadow-xs sm:p-5">
|
|
125
127
|
<Tabs value={os} onValueChange={value => setOS(value as OS)} className="gap-3">
|
|
126
128
|
<div className="flex flex-wrap items-center justify-between gap-3">
|
|
@@ -129,7 +131,9 @@ function Install() {
|
|
|
129
131
|
{(Object.keys(platforms) as OS[]).map(key => <TabsTrigger key={key} value={key} className="px-3">{platforms[key].name}</TabsTrigger>)}
|
|
130
132
|
</TabsList>
|
|
131
133
|
</div>
|
|
132
|
-
{
|
|
134
|
+
{/* All panels share one grid cell, so the card keeps its height whichever system is chosen. */}
|
|
135
|
+
<div className="install-panels">
|
|
136
|
+
{(Object.keys(platforms) as OS[]).map(key => <TabsContent value={key} key={key} keepMounted>
|
|
133
137
|
{/* Each line gets a prompt drawn by CSS, so the copied and displayed text stay identical. */}
|
|
134
138
|
<div className="install-code relative rounded-lg border border-[#262626] bg-[#0a0a0a] text-[#ededed]">
|
|
135
139
|
<pre tabIndex={0} data-prompt={platforms[key].shell === 'PowerShell' ? 'PS>' : '$'} aria-label={`${platforms[key].shell} command`}
|
|
@@ -138,6 +142,7 @@ function Install() {
|
|
|
138
142
|
</div>
|
|
139
143
|
<p className="mt-2.5 text-[13px] text-muted-foreground">{platforms[key].note} The installer verifies release checksums first.</p>
|
|
140
144
|
</TabsContent>)}
|
|
145
|
+
</div>
|
|
141
146
|
</Tabs>
|
|
142
147
|
<p className="mt-3 flex flex-wrap gap-x-5 gap-y-1 text-sm">
|
|
143
148
|
<a {...external} className="link" href={latest}>Prefer a manual install?</a>
|
|
@@ -229,8 +234,9 @@ function UseCases({ onPlay, playing }: { onPlay: (id: ScenarioId) => void; playi
|
|
|
229
234
|
<ul className="flex flex-wrap gap-1.5">{u.commands.map(c => <li key={c} className="max-w-full"><code className="inline-code">{c}</code></li>)}</ul>
|
|
230
235
|
</div>
|
|
231
236
|
</div>
|
|
232
|
-
<button type="button" className={cn(buttonVariants(), 'mt-6 gap-2')} onClick={() => onPlay(u.id)} data-active={playing === u.id}
|
|
233
|
-
|
|
237
|
+
<button type="button" className={cn(buttonVariants(), 'mt-6 gap-2')} onClick={() => onPlay(u.id)} data-active={playing === u.id}>
|
|
238
|
+
{/* Accessible names start with the visible text, so voice control can target what people see. */}
|
|
239
|
+
<Play className="size-4" aria-hidden="true" />{playing === u.id ? 'Replaying…' : 'Play again in the sandbox'}<span className="sr-only">: {u.persona.toLowerCase()}</span>
|
|
234
240
|
</button>
|
|
235
241
|
{u.id === 'merge' && <div className="mt-8">
|
|
236
242
|
<p className="mb-3 text-sm text-muted-foreground">No agent in the loop? The same two commands run from CI after every merge.</p>
|
|
@@ -335,10 +341,10 @@ function App() {
|
|
|
335
341
|
<AsciiField />
|
|
336
342
|
<header className="sticky top-0 z-30 border-b bg-background/80 backdrop-blur-md">
|
|
337
343
|
<div className="mx-auto flex h-14 max-w-[1440px] items-center gap-3 px-3 sm:gap-6 sm:px-6">
|
|
338
|
-
<a className="flex items-center gap-2 whitespace-nowrap" href="#"
|
|
344
|
+
<a className="flex items-center gap-2 whitespace-nowrap" href="#">
|
|
339
345
|
<BrandMark />
|
|
340
|
-
<span className="font-semibold tracking-tight">CLI Toolkit</span>
|
|
341
|
-
<span className="text-sm text-muted-foreground">for Jira</span>
|
|
346
|
+
<span className="font-semibold tracking-tight">CLI Toolkit</span>{' '}
|
|
347
|
+
<span className="text-sm text-muted-foreground">for Jira</span><span className="sr-only"> home</span>
|
|
342
348
|
</a>
|
|
343
349
|
<nav aria-label="Main navigation" className="hidden items-center gap-5 text-sm text-muted-foreground md:flex">
|
|
344
350
|
<a className="hover:text-foreground" href="#use-cases">Use cases</a>
|
|
@@ -391,10 +397,10 @@ function App() {
|
|
|
391
397
|
<span className="example-label">The sandbox terminal runs on sample data from an example site. Nothing reaches Jira.</span> Pick a command, or type your own.
|
|
392
398
|
</SectionHead>
|
|
393
399
|
<ul className="divide-y overflow-hidden rounded-xl border">{examples.map(e => <li key={e.command}>
|
|
394
|
-
<button type="button" onClick={() => run(e.command)} data-active={active === e.command}
|
|
400
|
+
<button type="button" onClick={() => run(e.command)} data-active={active === e.command}
|
|
395
401
|
className="group flex w-full items-center gap-4 px-4 py-3 text-left transition-colors hover:bg-muted/60 focus-visible:bg-muted/60 focus-visible:outline-none data-[active=true]:bg-muted">
|
|
396
402
|
<span className="min-w-0 flex-1">
|
|
397
|
-
<code className="block font-mono text-[13px] font-medium break-words">{e.command}</code>
|
|
403
|
+
<span className="sr-only">Run </span><code className="block font-mono text-[13px] font-medium break-words">{e.command}</code>{' '}
|
|
398
404
|
<span className="block text-sm text-muted-foreground">{e.does}</span>
|
|
399
405
|
</span>
|
|
400
406
|
<Kbd className="opacity-60 group-hover:opacity-100 group-data-[active=true]:opacity-100"><CornerDownLeft aria-hidden="true" /></Kbd>
|