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.
Files changed (130) hide show
  1. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.gitignore +1 -0
  2. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/PKG-INFO +25 -18
  3. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/README.md +24 -17
  4. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/releases/2.5.md +5 -0
  5. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/usage.md +1 -1
  6. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/pyproject.toml +1 -1
  7. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/__init__.py +1 -1
  8. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/update.py +11 -2
  9. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_update.py +23 -0
  10. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/uv.lock +1 -1
  11. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/package.json +1 -1
  12. jira_cli_toolkit-2.5.2/web/public/llms.txt +48 -0
  13. jira_cli_toolkit-2.5.2/web/public/robots.txt +4 -0
  14. jira_cli_toolkit-2.5.2/web/public/sitemap.xml +4 -0
  15. jira_cli_toolkit-2.5.2/web/scripts/prerender.mjs +11 -0
  16. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/App.css +5 -0
  17. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/App.tsx +16 -10
  18. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ThemeToggle.tsx +5 -2
  19. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/data/commands.json +1 -1
  20. jira_cli_toolkit-2.5.2/web/src/entry-server.tsx +8 -0
  21. jira_cli_toolkit-2.5.2/web/src/main.tsx +14 -0
  22. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/tests/landing.spec.ts +16 -3
  23. jira_cli_toolkit-2.5.2/web/vite.config.ts +32 -0
  24. jira_cli_toolkit-2.5.1rc1/web/src/main.tsx +0 -10
  25. jira_cli_toolkit-2.5.1rc1/web/vite.config.ts +0 -10
  26. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.env.example +0 -0
  27. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.github/workflows/ci.yml +0 -0
  28. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.github/workflows/pages.yml +0 -0
  29. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/.github/workflows/release.yml +0 -0
  30. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/CHANGELOG.md +0 -0
  31. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/LICENSE +0 -0
  32. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/NOTICE +0 -0
  33. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/assets/cli-toolkit-cover-illustrated.png +0 -0
  34. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/assets/cli-toolkit-cover-illustrated.prompt.txt +0 -0
  35. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/assets/cli-toolkit-cover.svg +0 -0
  36. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/branding.md +0 -0
  37. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/install.md +0 -0
  38. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/migration/legacy-commands.md +0 -0
  39. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/migration/upgrade-to-v2.md +0 -0
  40. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2-upgrade/acceptance.md +0 -0
  41. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2-upgrade/interface-contract.md +0 -0
  42. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2-upgrade/migration.md +0 -0
  43. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2-upgrade/roadmap.md +0 -0
  44. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/docs/sprints/v2.5-api/roadmap.md +0 -0
  45. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/requirements-ci.lock +0 -0
  46. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/command_tree.py +0 -0
  47. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/entrypoint.py +0 -0
  48. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/install.ps1 +0 -0
  49. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/install.sh +0 -0
  50. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/binary.py +0 -0
  51. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/installer_smoke.py +0 -0
  52. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/manifest.py +0 -0
  53. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/publish.py +0 -0
  54. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/release/windows_smoke.py +0 -0
  55. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/scripts/smoke.py +0 -0
  56. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/api.py +0 -0
  57. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/api_spec.py +0 -0
  58. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/application.py +0 -0
  59. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/auth.py +0 -0
  60. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/cli.py +0 -0
  61. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/client.py +0 -0
  62. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/commands.py +0 -0
  63. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/completion.py +0 -0
  64. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/config.py +0 -0
  65. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/credentials.py +0 -0
  66. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/data/callback.json +0 -0
  67. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/fields.py +0 -0
  68. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/maintenance.py +0 -0
  69. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/templates.py +0 -0
  70. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/src/jsup/ui.py +0 -0
  71. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_api.py +0 -0
  72. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_api_spec.py +0 -0
  73. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_auth.py +0 -0
  74. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_cli.py +0 -0
  75. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_client.py +0 -0
  76. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_commands.py +0 -0
  77. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_fields.py +0 -0
  78. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_installers.py +0 -0
  79. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_maintenance.py +0 -0
  80. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_release.py +0 -0
  81. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_reliability.py +0 -0
  82. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_templates.py +0 -0
  83. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/tests/test_website_commands.py +0 -0
  84. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/BRAND_REVIEW.md +0 -0
  85. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/DESIGN.md +0 -0
  86. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/README.md +0 -0
  87. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/components.json +0 -0
  88. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/index.html +0 -0
  89. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/package-lock.json +0 -0
  90. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/playwright.config.ts +0 -0
  91. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/claudecode.svg +0 -0
  92. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/cline.svg +0 -0
  93. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/commandcode.svg +0 -0
  94. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/cursor.svg +0 -0
  95. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/githubcopilot.svg +0 -0
  96. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/googlegemini.svg +0 -0
  97. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/opencode.svg +0 -0
  98. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/pi.svg +0 -0
  99. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/qwen.svg +0 -0
  100. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/warp.svg +0 -0
  101. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/windsurf.svg +0 -0
  102. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/agents/zedindustries.svg +0 -0
  103. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/apple-touch-icon.png +0 -0
  104. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/favicon.svg +0 -0
  105. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/public/third-party-notices.txt +0 -0
  106. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/AsciiField.tsx +0 -0
  107. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/Terminal.css +0 -0
  108. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/Terminal.tsx +0 -0
  109. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/accordion.tsx +0 -0
  110. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/badge.tsx +0 -0
  111. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/button.tsx +0 -0
  112. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/card.tsx +0 -0
  113. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/input.tsx +0 -0
  114. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/kbd.tsx +0 -0
  115. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/separator.tsx +0 -0
  116. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/table.tsx +0 -0
  117. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/components/ui/tabs.tsx +0 -0
  118. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/index.css +0 -0
  119. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/lib/utils.ts +0 -0
  120. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/complete.ts +0 -0
  121. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/help.ts +0 -0
  122. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/parse.ts +0 -0
  123. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/sample.ts +0 -0
  124. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/scenarios.ts +0 -0
  125. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/session.ts +0 -0
  126. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/sandbox/tree.ts +0 -0
  127. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/src/shadcn.css +0 -0
  128. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/tsconfig.app.json +0 -0
  129. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/tsconfig.json +0 -0
  130. {jira_cli_toolkit-2.5.1rc1 → jira_cli_toolkit-2.5.2}/web/tsconfig.node.json +0 -0
@@ -11,3 +11,4 @@ node_modules/
11
11
  web/dist/
12
12
  web/test-results/
13
13
  web/playwright-report/
14
+ dist-ssr/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: jira-cli-toolkit
3
- Version: 2.5.1rc1
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 verified Python wheel instead.
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 verified Python wheel instead.
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
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "jira-cli-toolkit"
7
- version = "2.5.1rc1"
7
+ version = "2.5.2"
8
8
  description = "General-purpose Jira Cloud CLI with a friendly terminal UI"
9
9
  readme = "README.md"
10
10
  license = "AGPL-3.0-only"
@@ -4,4 +4,4 @@ from .client import Jira, JiraError, adf, adf_to_text
4
4
 
5
5
  __all__ = ["CONFIG_PATH", "get_config", "init_config", "show_config",
6
6
  "Jira", "JiraError", "adf", "adf_to_text"]
7
- __version__ = "2.5.1rc1"
7
+ __version__ = "2.5.2"
@@ -44,7 +44,8 @@ def _distribution():
44
44
 
45
45
  def installation():
46
46
  if getattr(sys,'frozen',False):
47
- method='standalone'
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=='standalone' else _distribution(),os={'Darwin':'macos','Linux':'linux','Windows':'windows'}.get(platform.system(),'unsupported'),
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))
@@ -433,7 +433,7 @@ wheels = [
433
433
 
434
434
  [[package]]
435
435
  name = "jira-cli-toolkit"
436
- version = "2.5.1rc1"
436
+ version = "2.5.2"
437
437
  source = { editable = "." }
438
438
  dependencies = [
439
439
  { name = "keyring" },
@@ -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,4 @@
1
+ User-agent: *
2
+ Allow: /
3
+
4
+ Sitemap: https://jira.abhishekaggarwal.com/sitemap.xml
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
3
+ <url><loc>https://jira.abhishekaggarwal.com/</loc></url>
4
+ </urlset>
@@ -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
- const [os, setOS] = useState<OS>(() => /Win/i.test(navigator.userAgent) ? 'windows' : /Linux/i.test(navigator.userAgent) ? 'linux' : 'macos')
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
- {(Object.keys(platforms) as OS[]).map(key => <TabsContent value={key} key={key}>
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} aria-label={`Play the ${u.persona.toLowerCase()} replay in the sandbox`}>
233
- <Play className="size-4" aria-hidden="true" />{playing === u.id ? 'Replaying…' : 'Play again in the sandbox'}
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="#" aria-label="CLI Toolkit for Jira home">
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} aria-label={`Run ${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>