mycli 2.24.3__tar.gz → 2.24.5__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 (200) hide show
  1. {mycli-2.24.3 → mycli-2.24.5}/.github/dependabot.yml +2 -0
  2. {mycli-2.24.3 → mycli-2.24.5}/.github/workflows/ci.yml +24 -5
  3. {mycli-2.24.3 → mycli-2.24.5}/.github/workflows/publish.yml +10 -15
  4. {mycli-2.24.3 → mycli-2.24.5}/.github/workflows/typecheck.yml +1 -1
  5. {mycli-2.24.3 → mycli-2.24.5}/AGENTS.md +2 -0
  6. {mycli-2.24.3/mycli.egg-info → mycli-2.24.5}/PKG-INFO +18 -12
  7. {mycli-2.24.3 → mycli-2.24.5}/README.md +17 -11
  8. {mycli-2.24.3 → mycli-2.24.5}/changelog.md +33 -1
  9. {mycli-2.24.3 → mycli-2.24.5}/docker/resources/test_db-1.0.7.tar.gz +1 -1
  10. {mycli-2.24.3 → mycli-2.24.5}/mycli/client_connection.py +2 -1
  11. mycli-2.24.5/mycli/keyring_utils.py +34 -0
  12. mycli-2.24.5/mycli/macos_keychain.py +80 -0
  13. {mycli-2.24.3 → mycli-2.24.5/mycli.egg-info}/PKG-INFO +18 -12
  14. {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/SOURCES.txt +4 -0
  15. {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/scm_file_list.json +4 -0
  16. mycli-2.24.5/mycli.egg-info/scm_version.json +8 -0
  17. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_client_connection.py +50 -7
  18. mycli-2.24.5/test/pytests/test_keyring_utils.py +105 -0
  19. mycli-2.24.5/test/pytests/test_macos_keychain.py +160 -0
  20. mycli-2.24.3/mycli.egg-info/scm_version.json +0 -8
  21. {mycli-2.24.3 → mycli-2.24.5}/.git-blame-ignore-revs +0 -0
  22. {mycli-2.24.3 → mycli-2.24.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  23. {mycli-2.24.3 → mycli-2.24.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  24. {mycli-2.24.3 → mycli-2.24.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  25. {mycli-2.24.3 → mycli-2.24.5}/.github/workflows/lint.yml +0 -0
  26. {mycli-2.24.3 → mycli-2.24.5}/.gitignore +0 -0
  27. {mycli-2.24.3 → mycli-2.24.5}/AUTHORS.rst +0 -0
  28. {mycli-2.24.3 → mycli-2.24.5}/CONTRIBUTING.md +0 -0
  29. {mycli-2.24.3 → mycli-2.24.5}/LICENSE.txt +0 -0
  30. {mycli-2.24.3 → mycli-2.24.5}/MANIFEST.in +0 -0
  31. {mycli-2.24.3 → mycli-2.24.5}/SPONSORS.rst +0 -0
  32. {mycli-2.24.3 → mycli-2.24.5}/doc/key_bindings.rst +0 -0
  33. {mycli-2.24.3 → mycli-2.24.5}/doc/llm.md +0 -0
  34. {mycli-2.24.3 → mycli-2.24.5}/doc/screenshots/main.gif +0 -0
  35. {mycli-2.24.3 → mycli-2.24.5}/doc/screenshots/tables.png +0 -0
  36. {mycli-2.24.3 → mycli-2.24.5}/doc/screenshots/total_histogram.png +0 -0
  37. {mycli-2.24.3 → mycli-2.24.5}/doc/transforms.md +0 -0
  38. {mycli-2.24.3 → mycli-2.24.5}/docker/Dockerfile +0 -0
  39. {mycli-2.24.3 → mycli-2.24.5}/mycli/AUTHORS +0 -0
  40. {mycli-2.24.3 → mycli-2.24.5}/mycli/SPONSORS +0 -0
  41. {mycli-2.24.3 → mycli-2.24.5}/mycli/TIPS +0 -0
  42. {mycli-2.24.3 → mycli-2.24.5}/mycli/__init__.py +0 -0
  43. {mycli-2.24.3 → mycli-2.24.5}/mycli/app_state.py +0 -0
  44. {mycli-2.24.3 → mycli-2.24.5}/mycli/boundary_tunnel.py +0 -0
  45. {mycli-2.24.3 → mycli-2.24.5}/mycli/cli_runner.py +0 -0
  46. {mycli-2.24.3 → mycli-2.24.5}/mycli/clibuffer.py +0 -0
  47. {mycli-2.24.3 → mycli-2.24.5}/mycli/client.py +0 -0
  48. {mycli-2.24.3 → mycli-2.24.5}/mycli/client_commands.py +0 -0
  49. {mycli-2.24.3 → mycli-2.24.5}/mycli/client_query.py +0 -0
  50. {mycli-2.24.3 → mycli-2.24.5}/mycli/clistyle.py +0 -0
  51. {mycli-2.24.3 → mycli-2.24.5}/mycli/clitoolbar.py +0 -0
  52. {mycli-2.24.3 → mycli-2.24.5}/mycli/compat.py +0 -0
  53. {mycli-2.24.3 → mycli-2.24.5}/mycli/completion_refresher.py +0 -0
  54. {mycli-2.24.3 → mycli-2.24.5}/mycli/config.py +0 -0
  55. {mycli-2.24.3 → mycli-2.24.5}/mycli/constants.py +0 -0
  56. {mycli-2.24.3 → mycli-2.24.5}/mycli/key_bindings.py +0 -0
  57. {mycli-2.24.3 → mycli-2.24.5}/mycli/kubectl_tunnel.py +0 -0
  58. {mycli-2.24.3 → mycli-2.24.5}/mycli/lexer.py +0 -0
  59. {mycli-2.24.3 → mycli-2.24.5}/mycli/main.py +0 -0
  60. {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/batch.py +0 -0
  61. {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/checkup.py +0 -0
  62. {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/completions.py +0 -0
  63. {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/execute.py +0 -0
  64. {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/list_dsn.py +0 -0
  65. {mycli-2.24.3 → mycli-2.24.5}/mycli/main_modes/repl.py +0 -0
  66. {mycli-2.24.3 → mycli-2.24.5}/mycli/myclirc +0 -0
  67. {mycli-2.24.3 → mycli-2.24.5}/mycli/output.py +0 -0
  68. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/__init__.py +0 -0
  69. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/batch_utils.py +0 -0
  70. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/cli_utils.py +0 -0
  71. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/completion_engine.py +0 -0
  72. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/filepaths.py +0 -0
  73. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/hybrid_redirection.py +0 -0
  74. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/interactive_utils.py +0 -0
  75. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/key_binding_utils.py +0 -0
  76. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/polars_completion.py +0 -0
  77. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/polars_transform.py +0 -0
  78. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/ptoolkit/__init__.py +0 -0
  79. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/ptoolkit/fzf.py +0 -0
  80. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/ptoolkit/history.py +0 -0
  81. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/ptoolkit/utils.py +0 -0
  82. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/__init__.py +0 -0
  83. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/dbcommands.py +0 -0
  84. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/delimitercommand.py +0 -0
  85. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/dsn_aliases.py +0 -0
  86. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/favoritequeries.py +0 -0
  87. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/iocommands.py +0 -0
  88. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/llm.py +0 -0
  89. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/main.py +0 -0
  90. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/source.py +0 -0
  91. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/special/utils.py +0 -0
  92. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/sql_utils.py +0 -0
  93. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/sqlresult.py +0 -0
  94. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/string_utils.py +0 -0
  95. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/tabular_output/__init__.py +0 -0
  96. {mycli-2.24.3 → mycli-2.24.5}/mycli/packages/tabular_output/sql_format.py +0 -0
  97. {mycli-2.24.3 → mycli-2.24.5}/mycli/password_sources.py +0 -0
  98. {mycli-2.24.3 → mycli-2.24.5}/mycli/resources/completions/bash/mycli +0 -0
  99. {mycli-2.24.3 → mycli-2.24.5}/mycli/resources/completions/fish/mycli.fish +0 -0
  100. {mycli-2.24.3 → mycli-2.24.5}/mycli/resources/completions/zsh/_mycli +0 -0
  101. {mycli-2.24.3 → mycli-2.24.5}/mycli/schema_prefetcher.py +0 -0
  102. {mycli-2.24.3 → mycli-2.24.5}/mycli/sqlcompleter.py +0 -0
  103. {mycli-2.24.3 → mycli-2.24.5}/mycli/sqlexecute.py +0 -0
  104. {mycli-2.24.3 → mycli-2.24.5}/mycli/ssh_tunnel.py +0 -0
  105. {mycli-2.24.3 → mycli-2.24.5}/mycli/types.py +0 -0
  106. {mycli-2.24.3 → mycli-2.24.5}/mycli/vault.py +0 -0
  107. {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/dependency_links.txt +0 -0
  108. {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/entry_points.txt +0 -0
  109. {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/requires.txt +0 -0
  110. {mycli-2.24.3 → mycli-2.24.5}/mycli.egg-info/top_level.txt +0 -0
  111. {mycli-2.24.3 → mycli-2.24.5}/pyproject.toml +0 -0
  112. {mycli-2.24.3 → mycli-2.24.5}/setup.cfg +0 -0
  113. {mycli-2.24.3 → mycli-2.24.5}/test/__init__.py +0 -0
  114. {mycli-2.24.3 → mycli-2.24.5}/test/features/__init__.py +0 -0
  115. {mycli-2.24.3 → mycli-2.24.5}/test/features/auto_vertical.feature +0 -0
  116. {mycli-2.24.3 → mycli-2.24.5}/test/features/basic_commands.feature +0 -0
  117. {mycli-2.24.3 → mycli-2.24.5}/test/features/connection.feature +0 -0
  118. {mycli-2.24.3 → mycli-2.24.5}/test/features/crud_database.feature +0 -0
  119. {mycli-2.24.3 → mycli-2.24.5}/test/features/crud_table.feature +0 -0
  120. {mycli-2.24.3 → mycli-2.24.5}/test/features/db_utils.py +0 -0
  121. {mycli-2.24.3 → mycli-2.24.5}/test/features/environment.py +0 -0
  122. {mycli-2.24.3 → mycli-2.24.5}/test/features/fixture_data/help_commands.txt +0 -0
  123. {mycli-2.24.3 → mycli-2.24.5}/test/features/fixture_utils.py +0 -0
  124. {mycli-2.24.3 → mycli-2.24.5}/test/features/iocommands.feature +0 -0
  125. {mycli-2.24.3 → mycli-2.24.5}/test/features/named_queries.feature +0 -0
  126. {mycli-2.24.3 → mycli-2.24.5}/test/features/specials.feature +0 -0
  127. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/__init__.py +0 -0
  128. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/auto_vertical.py +0 -0
  129. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/basic_commands.py +0 -0
  130. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/connection.py +0 -0
  131. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/crud_database.py +0 -0
  132. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/crud_table.py +0 -0
  133. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/iocommands.py +0 -0
  134. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/named_queries.py +0 -0
  135. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/specials.py +0 -0
  136. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/utils.py +0 -0
  137. {mycli-2.24.3 → mycli-2.24.5}/test/features/steps/wrappers.py +0 -0
  138. {mycli-2.24.3 → mycli-2.24.5}/test/features/wrappager.py +0 -0
  139. {mycli-2.24.3 → mycli-2.24.5}/test/myclirc +0 -0
  140. {mycli-2.24.3 → mycli-2.24.5}/test/mylogin.cnf +0 -0
  141. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/conftest.py +0 -0
  142. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_app_state.py +0 -0
  143. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_bash_completion.py +0 -0
  144. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_batch_utils.py +0 -0
  145. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_boundary_tunnel.py +0 -0
  146. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_checkup.py +0 -0
  147. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_cli_runner.py +0 -0
  148. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_cli_utils.py +0 -0
  149. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_clibuffer.py +0 -0
  150. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_client.py +0 -0
  151. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_client_commands.py +0 -0
  152. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_client_query.py +0 -0
  153. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_clistyle.py +0 -0
  154. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_clitoolbar.py +0 -0
  155. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_completer_use_switch.py +0 -0
  156. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_completion_engine.py +0 -0
  157. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_completion_refresher.py +0 -0
  158. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_config.py +0 -0
  159. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_delimitercommand.py +0 -0
  160. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_dsn_aliases.py +0 -0
  161. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_favoritequeries.py +0 -0
  162. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_filepaths.py +0 -0
  163. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_fish_completion.py +0 -0
  164. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_hybrid_redirection.py +0 -0
  165. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_interactive_utils.py +0 -0
  166. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_key_binding_utils.py +0 -0
  167. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_key_bindings.py +0 -0
  168. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_kubectl_tunnel.py +0 -0
  169. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main.py +0 -0
  170. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main_modes_batch.py +0 -0
  171. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main_modes_execute.py +0 -0
  172. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main_modes_list_dsn.py +0 -0
  173. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_main_modes_repl.py +0 -0
  174. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_naive_completion.py +0 -0
  175. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_output.py +0 -0
  176. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_password_sources.py +0 -0
  177. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_polars_completion.py +0 -0
  178. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_polars_transform.py +0 -0
  179. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_ptoolkit_fzf.py +0 -0
  180. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_ptoolkit_history.py +0 -0
  181. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_ptoolkit_utils.py +0 -0
  182. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_schema_prefetcher.py +0 -0
  183. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_smart_completion_public_schema_only.py +0 -0
  184. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_dbcommands.py +0 -0
  185. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_init.py +0 -0
  186. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_iocommands.py +0 -0
  187. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_llm.py +0 -0
  188. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_main.py +0 -0
  189. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_source.py +0 -0
  190. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_special_utils.py +0 -0
  191. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_sql_utils.py +0 -0
  192. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_sqlcompleter.py +0 -0
  193. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_sqlexecute.py +0 -0
  194. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_sqlresult.py +0 -0
  195. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_ssh_tunnel.py +0 -0
  196. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_string_utils.py +0 -0
  197. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_tabular_output.py +0 -0
  198. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_vault.py +0 -0
  199. {mycli-2.24.3 → mycli-2.24.5}/test/pytests/test_zsh_completion.py +0 -0
  200. {mycli-2.24.3 → mycli-2.24.5}/test/utils.py +0 -0
@@ -1,6 +1,8 @@
1
1
  version: 2
2
2
  updates:
3
3
  - package-ecosystem: "github-actions"
4
+ cooldown:
5
+ default-days: 7
4
6
  directory: "/"
5
7
  schedule:
6
8
  interval: "daily"
@@ -24,7 +24,7 @@ jobs:
24
24
  steps:
25
25
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
26
26
 
27
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
27
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
28
28
  with:
29
29
  version: "latest"
30
30
 
@@ -66,7 +66,7 @@ jobs:
66
66
  steps:
67
67
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
68
68
 
69
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
69
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
70
70
  with:
71
71
  version: "latest"
72
72
 
@@ -116,7 +116,7 @@ jobs:
116
116
  steps:
117
117
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
118
118
 
119
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
119
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
120
120
  with:
121
121
  version: 'latest'
122
122
 
@@ -130,7 +130,7 @@ jobs:
130
130
  run: uv sync --all-extras -p ${{ matrix.python-version }}
131
131
 
132
132
  - name: Set up MySQL
133
- uses: shogo82148/actions-setup-mysql@62da9377d83991fce27b6ed2a397d3306121e41d # v1.53.1
133
+ uses: shogo82148/actions-setup-mysql@083ec148d28e62f2b24b8f4541693dfe1d50488d # v1.54.0
134
134
  with:
135
135
  mysql-version: '9.7'
136
136
  root-password: root
@@ -220,7 +220,7 @@ jobs:
220
220
  steps:
221
221
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
222
222
 
223
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
223
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
224
224
  with:
225
225
  version: "latest"
226
226
 
@@ -249,3 +249,22 @@ jobs:
249
249
  TERM: xterm
250
250
  run: |
251
251
  uv run tox -e py3.14
252
+
253
+ docker-build:
254
+ name: Build Docker Image
255
+ runs-on: ubuntu-latest
256
+
257
+ permissions:
258
+ contents: read
259
+
260
+ steps:
261
+ - name: Checkout repository
262
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
263
+
264
+ - name: Build Docker image
265
+ id: build
266
+ uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
267
+ with:
268
+ context: .
269
+ file: docker/Dockerfile
270
+ push: false
@@ -1,4 +1,4 @@
1
- name: Publish Python Package
1
+ name: Publish Packages
2
2
 
3
3
  on:
4
4
  release:
@@ -25,7 +25,6 @@ jobs:
25
25
  tests:
26
26
  runs-on: ubuntu-latest
27
27
  needs: [docs]
28
- continue-on-error: true
29
28
 
30
29
  strategy:
31
30
  matrix:
@@ -33,7 +32,7 @@ jobs:
33
32
 
34
33
  steps:
35
34
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
36
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
35
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
37
36
  with:
38
37
  version: "latest"
39
38
 
@@ -78,7 +77,7 @@ jobs:
78
77
  steps:
79
78
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
80
79
 
81
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
80
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
82
81
  with:
83
82
  version: "latest"
84
83
 
@@ -128,7 +127,7 @@ jobs:
128
127
  steps:
129
128
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
130
129
 
131
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
130
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
132
131
  with:
133
132
  version: 'latest'
134
133
 
@@ -142,7 +141,7 @@ jobs:
142
141
  run: uv sync --all-extras -p ${{ matrix.python-version }}
143
142
 
144
143
  - name: Set up MySQL
145
- uses: shogo82148/actions-setup-mysql@62da9377d83991fce27b6ed2a397d3306121e41d # v1.53.1
144
+ uses: shogo82148/actions-setup-mysql@083ec148d28e62f2b24b8f4541693dfe1d50488d # v1.54.0
146
145
  with:
147
146
  mysql-version: '9.7'
148
147
  root-password: root
@@ -231,7 +230,7 @@ jobs:
231
230
 
232
231
  steps:
233
232
  - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
234
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
233
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
235
234
  with:
236
235
  version: "latest"
237
236
 
@@ -253,7 +252,7 @@ jobs:
253
252
  path: dist/
254
253
 
255
254
  publish-pypi:
256
- name: Publish to PyPI
255
+ name: Publish Wheel to PyPI
257
256
  runs-on: ubuntu-latest
258
257
  if: startsWith(github.ref, 'refs/tags/')
259
258
  needs: [build]
@@ -270,9 +269,11 @@ jobs:
270
269
  uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
271
270
 
272
271
  publish-image:
273
- name: Publish to ghcr.io
272
+ name: Publish Image to ghcr.io
274
273
  runs-on: ubuntu-latest
275
274
  if: startsWith(github.ref, 'refs/tags/')
275
+ # doesn't actually need the results of build, but it makes sense to run this
276
+ # concurrently with publish-pypi
276
277
  needs: [build]
277
278
  environment: release
278
279
 
@@ -309,9 +310,3 @@ jobs:
309
310
  push: true
310
311
  tags: ${{ steps.meta.outputs.tags }}
311
312
  labels: ${{ steps.meta.outputs.labels }}
312
-
313
- - name: Generate artifact attestation
314
- uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4.2.2
315
- with:
316
- subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
317
- push-to-registry: true
@@ -25,7 +25,7 @@ jobs:
25
25
  with:
26
26
  python-version: '3.14'
27
27
 
28
- - uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
28
+ - uses: astral-sh/setup-uv@bec219d24cd3e171d82865faccec33120bb574f4 # v10.1.0
29
29
  with:
30
30
  version: 'latest'
31
31
 
@@ -25,8 +25,10 @@ A command line client for MySQL with auto-completion and syntax highlighting.
25
25
  ├── mycli/config.py # configuration file readers and utilities
26
26
  ├── mycli/constants.py # shared constants
27
27
  ├── mycli/key_bindings.py # prompt_toolkit key binding utilities
28
+ ├── mycli/keyring_utils.py # saved credential utilities
28
29
  ├── mycli/kubectl_tunnel.py # connection over kubectl tunnel
29
30
  ├── mycli/lexer.py # extends `MySqlLexer` from Pygments
31
+ ├── mycli/macos_keychain.py # macOS Keychain credentials preserving access controls
30
32
  ├── mycli/main.py # processes CLI arguments
31
33
  ├── mycli/main_modes/ # main execution paths
32
34
  ├── mycli/main_modes/batch.py # `--batch` mode
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mycli
3
- Version: 2.24.3
3
+ Version: 2.24.5
4
4
  Summary: Rich MySQL terminal client with autocompletion, syntax highlighting, and dataframes
5
5
  Author: Mycli Core Team
6
6
  License-Expression: BSD-3-Clause
@@ -143,20 +143,26 @@ mycli --help
143
143
  * Fuzzy history search using [fzf](https://github.com/junegunn/fzf).
144
144
  * Output explorer using [fzf](https://github.com/junegunn/fzf) or other tools.
145
145
  * Syntax highlighting using [Pygments](https://pygments.org/).
146
- * Smart-completion (enabled by default) will suggest context-sensitive completion.
147
- - `SELECT * FROM <tab>` will only show table names.
148
- - `SELECT * FROM users WHERE <tab>` will only show column names.
149
- * Support for multiline queries.
146
+ * Smart-completion suggests context-sensitive completion:
147
+ - `SELECT * FROM `<kbd>tab</kbd> will only show table names.
148
+ - `SELECT * FROM users WHERE `<kbd>tab</kbd> will only show column names.
149
+ * Multiline queries.
150
150
  * Favorite queries with positional or named parameters using [Jinja](https://jinja.palletsprojects.com/en/stable/). Save a query using
151
- `/fs <alias> <query>` and execute it with `/f <alias>` or `/f <alias> --key=value`.
152
- * Timing of sql statements and table rendering.
153
- * Log every query and its results to a file (disabled by default).
154
- * Pretty print tabular data with colors.
155
- * Support for SSL connections.
151
+ ```
152
+ /fs alias <query>
153
+ ```
154
+ and execute it with
155
+ ```
156
+ /f alias --key=value
157
+ ```
158
+ * Timing of SQL statements and table rendering.
159
+ * Logging of every query and its results to a file (off by default).
160
+ * Pretty printing of tabular data.
156
161
  * Shell-style trailing redirects with `$>`, `$>>` and `$|` operators.
157
162
  * [Polars](https://pola.rs) dataframe [transforms and plots](https://github.com/dbcli/mycli/blob/main/doc/transforms.md) with `.|`, and Parquet saves with `.>`.
158
- * Support for [querying LLMs](https://www.mycli.net/llm) with context derived from your schema using `/llm`.
159
- * Support for storing passwords in the system keyring.
163
+ * [Querying LLMs](https://www.mycli.net/llm) with context derived from your schema using `/llm`.
164
+ * Storing passwords in the system keyring.
165
+ * Modern defaults such as UTF-8 connection type and SSL.
160
166
  * Integrations with: [SSH](https://www.openssh.org/), [Kubernetes](https://kubernetes.io/), [Vault](https://github.com/hashicorp/vault), and [Boundary](https://github.com/hashicorp/boundary).
161
167
 
162
168
  Mycli creates a config file `~/.myclirc` on the first run; you can use the
@@ -71,20 +71,26 @@ mycli --help
71
71
  * Fuzzy history search using [fzf](https://github.com/junegunn/fzf).
72
72
  * Output explorer using [fzf](https://github.com/junegunn/fzf) or other tools.
73
73
  * Syntax highlighting using [Pygments](https://pygments.org/).
74
- * Smart-completion (enabled by default) will suggest context-sensitive completion.
75
- - `SELECT * FROM <tab>` will only show table names.
76
- - `SELECT * FROM users WHERE <tab>` will only show column names.
77
- * Support for multiline queries.
74
+ * Smart-completion suggests context-sensitive completion:
75
+ - `SELECT * FROM `<kbd>tab</kbd> will only show table names.
76
+ - `SELECT * FROM users WHERE `<kbd>tab</kbd> will only show column names.
77
+ * Multiline queries.
78
78
  * Favorite queries with positional or named parameters using [Jinja](https://jinja.palletsprojects.com/en/stable/). Save a query using
79
- `/fs <alias> <query>` and execute it with `/f <alias>` or `/f <alias> --key=value`.
80
- * Timing of sql statements and table rendering.
81
- * Log every query and its results to a file (disabled by default).
82
- * Pretty print tabular data with colors.
83
- * Support for SSL connections.
79
+ ```
80
+ /fs alias <query>
81
+ ```
82
+ and execute it with
83
+ ```
84
+ /f alias --key=value
85
+ ```
86
+ * Timing of SQL statements and table rendering.
87
+ * Logging of every query and its results to a file (off by default).
88
+ * Pretty printing of tabular data.
84
89
  * Shell-style trailing redirects with `$>`, `$>>` and `$|` operators.
85
90
  * [Polars](https://pola.rs) dataframe [transforms and plots](https://github.com/dbcli/mycli/blob/main/doc/transforms.md) with `.|`, and Parquet saves with `.>`.
86
- * Support for [querying LLMs](https://www.mycli.net/llm) with context derived from your schema using `/llm`.
87
- * Support for storing passwords in the system keyring.
91
+ * [Querying LLMs](https://www.mycli.net/llm) with context derived from your schema using `/llm`.
92
+ * Storing passwords in the system keyring.
93
+ * Modern defaults such as UTF-8 connection type and SSL.
88
94
  * Integrations with: [SSH](https://www.openssh.org/), [Kubernetes](https://kubernetes.io/), [Vault](https://github.com/hashicorp/vault), and [Boundary](https://github.com/hashicorp/boundary).
89
95
 
90
96
  Mycli creates a config file `~/.myclirc` on the first run; you can use the
@@ -1,3 +1,36 @@
1
+ 2.24.5 (2026/09/16)
2
+ ==============
3
+
4
+ Bug Fixes
5
+ --------
6
+ * New macOS keyring entries no longer automatically trust Python.
7
+
8
+
9
+ Documentation
10
+ --------
11
+ * Update features bullets in `README.md`.
12
+
13
+
14
+ Internal
15
+ --------
16
+ * Naming and commentary in `publish.yml` workflow.
17
+ * Build Docker image as part of regular CI tests.
18
+ * One week cooldown for dependabot.
19
+
20
+
21
+ 2.24.4 (2026/09/12)
22
+ ==============
23
+
24
+ Bug Fixes
25
+ --------
26
+ * Remove artifact attestations from ghcr.io images, fixing package examples.
27
+
28
+
29
+ Internal
30
+ --------
31
+ * Remove `continue-on-error` from release tests.
32
+
33
+
1
34
  2.24.3 (2026/09/12)
2
35
  ==============
3
36
 
@@ -15,7 +48,6 @@ Bug Fixes
15
48
  * Set `artifact-metadata: write` in `publish.yml`.
16
49
 
17
50
 
18
-
19
51
  2.24.1 (2026/09/12)
20
52
  ==============
21
53
 
@@ -1,4 +1,4 @@
1
1
  [diffend] Oversized file quarantined before diffing.
2
- name: mycli-2.24.3/docker/resources/test_db-1.0.7.tar.gz
2
+ name: mycli-2.24.5/docker/resources/test_db-1.0.7.tar.gz
3
3
  size: 35607473 bytes
4
4
  sha256: c44c140f352f35d47fdb65df60f52b779ef552822fad6c4efcfa7b134c3faf84
@@ -22,6 +22,7 @@ from mycli.constants import (
22
22
  EMPTY_PASSWORD_FLAG_SENTINEL,
23
23
  ER_MUST_CHANGE_PASSWORD_LOGIN,
24
24
  )
25
+ from mycli.keyring_utils import set_keyring_password
25
26
  from mycli.kubectl_tunnel import KubectlTunnel, KubectlTunnelError
26
27
  from mycli.packages.filepaths import guess_socket_location
27
28
  from mycli.packages.special.utils import format_connection_dsn
@@ -381,7 +382,7 @@ class ClientConnectionMixin:
381
382
  try:
382
383
  saved_pw = keyring.get_password(keyring_domain, keyring_identifier)
383
384
  if password != saved_pw or reset_keyring:
384
- keyring.set_password(keyring_domain, keyring_identifier, password)
385
+ set_keyring_password(keyring_domain, keyring_identifier, password)
385
386
  click.secho(
386
387
  f'Password from source: "{password_source}" '
387
388
  f'saved to the system keyring at {keyring_domain}/{keyring_identifier}',
@@ -0,0 +1,34 @@
1
+ import sys
2
+
3
+ import keyring
4
+ from keyring.backend import KeyringBackend
5
+
6
+
7
+ def _set_password_with_backend(backend: KeyringBackend, service: str, account: str, password: str) -> None:
8
+ from keyring.backends.macOS import Keyring
9
+
10
+ if type(backend) is Keyring:
11
+ from mycli import macos_keychain
12
+
13
+ macos_keychain.set_password(service, account, password)
14
+ else:
15
+ backend.set_password(service, account, password)
16
+
17
+
18
+ def set_keyring_password(service: str, account: str, password: str) -> None:
19
+ if sys.platform != 'darwin':
20
+ keyring.set_password(service, account, password)
21
+ return
22
+
23
+ from keyring.backends.chainer import ChainerBackend # type: ignore[unreachable]
24
+
25
+ backend = keyring.get_keyring()
26
+ if type(backend) is ChainerBackend:
27
+ for candidate in backend.backends:
28
+ try:
29
+ _set_password_with_backend(candidate, service, account, password)
30
+ return
31
+ except NotImplementedError:
32
+ continue
33
+ else:
34
+ _set_password_with_backend(backend, service, account, password)
@@ -0,0 +1,80 @@
1
+ import ctypes
2
+ from typing import Any
3
+
4
+ from keyring.errors import KeyringLocked, PasswordSetError
5
+
6
+
7
+ def _get_api() -> Any:
8
+ from keyring.backends.macOS import api
9
+
10
+ return api
11
+
12
+
13
+ def set_password(service: str, account: str, password: str) -> None:
14
+ """Preserve existing ACLs and create credentials without trusting Python."""
15
+ api = _get_api()
16
+ cf_array_create = api._found.CFArrayCreate
17
+ cf_array_create.restype = ctypes.c_void_p
18
+ cf_array_create.argtypes = (ctypes.c_void_p, ctypes.c_void_p, ctypes.c_long, ctypes.c_void_p)
19
+ cf_data_create = api._found.CFDataCreate
20
+ cf_data_create.restype = ctypes.c_void_p
21
+ cf_data_create.argtypes = (ctypes.c_void_p, ctypes.c_void_p, ctypes.c_long)
22
+ cf_release = api._found.CFRelease
23
+ cf_release.restype = None
24
+ cf_release.argtypes = (ctypes.c_void_p,)
25
+ sec_access_create = api._sec.SecAccessCreate
26
+ sec_access_create.restype = api.OS_status
27
+ sec_access_create.argtypes = (ctypes.c_void_p, ctypes.c_void_p, ctypes.POINTER(ctypes.c_void_p))
28
+ sec_item_update = api._sec.SecItemUpdate
29
+ sec_item_update.restype = api.OS_status
30
+ sec_item_update.argtypes = (ctypes.c_void_p, ctypes.c_void_p)
31
+
32
+ retained: list[ctypes.c_void_p] = []
33
+
34
+ def retain(value: int | ctypes.c_void_p | None, name: str) -> ctypes.c_void_p:
35
+ if not value:
36
+ raise RuntimeError(f'Unable to allocate Keychain {name}')
37
+ pointer = value if isinstance(value, ctypes.c_void_p) else ctypes.c_void_p(value)
38
+ retained.append(pointer)
39
+ return pointer
40
+
41
+ try:
42
+ service_value = retain(api.create_cf(service), 'service')
43
+ account_value = retain(api.create_cf(account), 'account')
44
+ encoded = password.encode('utf-8')
45
+ password_value = retain(cf_data_create(None, ctypes.create_string_buffer(encoded), len(encoded)), 'password')
46
+ search = retain(
47
+ api.create_query(
48
+ kSecClass=api.k_('kSecClassGenericPassword'),
49
+ kSecAttrService=service_value,
50
+ kSecAttrAccount=account_value,
51
+ ),
52
+ 'search',
53
+ )
54
+ attributes = retain(api.create_query(kSecValueData=password_value), 'attributes')
55
+ status = sec_item_update(search, attributes)
56
+ if status == api.error.item_not_found:
57
+ # An empty array trusts nobody; NULL would trust the calling executable.
58
+ trusted_apps = retain(cf_array_create(None, None, 0, None), 'access controls')
59
+ access = ctypes.c_void_p()
60
+ api.Error.raise_for_status(sec_access_create(service_value, trusted_apps, ctypes.byref(access)))
61
+ retain(access, 'access')
62
+ item = retain(
63
+ api.create_query(
64
+ kSecClass=api.k_('kSecClassGenericPassword'),
65
+ kSecAttrService=service_value,
66
+ kSecAttrAccount=account_value,
67
+ kSecValueData=password_value,
68
+ kSecAttrAccess=access,
69
+ ),
70
+ 'item',
71
+ )
72
+ status = api.SecItemAdd(item, None)
73
+ api.Error.raise_for_status(status)
74
+ except api.KeychainDenied as e:
75
+ raise KeyringLocked(f"Can't store password on keychain: {e}") from e
76
+ except api.Error as e:
77
+ raise PasswordSetError(f"Can't store password on keychain: {e}") from e
78
+ finally:
79
+ for value in reversed(retained):
80
+ cf_release(value)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mycli
3
- Version: 2.24.3
3
+ Version: 2.24.5
4
4
  Summary: Rich MySQL terminal client with autocompletion, syntax highlighting, and dataframes
5
5
  Author: Mycli Core Team
6
6
  License-Expression: BSD-3-Clause
@@ -143,20 +143,26 @@ mycli --help
143
143
  * Fuzzy history search using [fzf](https://github.com/junegunn/fzf).
144
144
  * Output explorer using [fzf](https://github.com/junegunn/fzf) or other tools.
145
145
  * Syntax highlighting using [Pygments](https://pygments.org/).
146
- * Smart-completion (enabled by default) will suggest context-sensitive completion.
147
- - `SELECT * FROM <tab>` will only show table names.
148
- - `SELECT * FROM users WHERE <tab>` will only show column names.
149
- * Support for multiline queries.
146
+ * Smart-completion suggests context-sensitive completion:
147
+ - `SELECT * FROM `<kbd>tab</kbd> will only show table names.
148
+ - `SELECT * FROM users WHERE `<kbd>tab</kbd> will only show column names.
149
+ * Multiline queries.
150
150
  * Favorite queries with positional or named parameters using [Jinja](https://jinja.palletsprojects.com/en/stable/). Save a query using
151
- `/fs <alias> <query>` and execute it with `/f <alias>` or `/f <alias> --key=value`.
152
- * Timing of sql statements and table rendering.
153
- * Log every query and its results to a file (disabled by default).
154
- * Pretty print tabular data with colors.
155
- * Support for SSL connections.
151
+ ```
152
+ /fs alias <query>
153
+ ```
154
+ and execute it with
155
+ ```
156
+ /f alias --key=value
157
+ ```
158
+ * Timing of SQL statements and table rendering.
159
+ * Logging of every query and its results to a file (off by default).
160
+ * Pretty printing of tabular data.
156
161
  * Shell-style trailing redirects with `$>`, `$>>` and `$|` operators.
157
162
  * [Polars](https://pola.rs) dataframe [transforms and plots](https://github.com/dbcli/mycli/blob/main/doc/transforms.md) with `.|`, and Parquet saves with `.>`.
158
- * Support for [querying LLMs](https://www.mycli.net/llm) with context derived from your schema using `/llm`.
159
- * Support for storing passwords in the system keyring.
163
+ * [Querying LLMs](https://www.mycli.net/llm) with context derived from your schema using `/llm`.
164
+ * Storing passwords in the system keyring.
165
+ * Modern defaults such as UTF-8 connection type and SSL.
160
166
  * Integrations with: [SSH](https://www.openssh.org/), [Kubernetes](https://kubernetes.io/), [Vault](https://github.com/hashicorp/vault), and [Boundary](https://github.com/hashicorp/boundary).
161
167
 
162
168
  Mycli creates a config file `~/.myclirc` on the first run; you can use the
@@ -44,8 +44,10 @@ mycli/completion_refresher.py
44
44
  mycli/config.py
45
45
  mycli/constants.py
46
46
  mycli/key_bindings.py
47
+ mycli/keyring_utils.py
47
48
  mycli/kubectl_tunnel.py
48
49
  mycli/lexer.py
50
+ mycli/macos_keychain.py
49
51
  mycli/main.py
50
52
  mycli/myclirc
51
53
  mycli/output.py
@@ -159,7 +161,9 @@ test/pytests/test_hybrid_redirection.py
159
161
  test/pytests/test_interactive_utils.py
160
162
  test/pytests/test_key_binding_utils.py
161
163
  test/pytests/test_key_bindings.py
164
+ test/pytests/test_keyring_utils.py
162
165
  test/pytests/test_kubectl_tunnel.py
166
+ test/pytests/test_macos_keychain.py
163
167
  test/pytests/test_main.py
164
168
  test/pytests/test_main_modes_batch.py
165
169
  test/pytests/test_main_modes_execute.py
@@ -45,8 +45,10 @@
45
45
  "mycli/config.py",
46
46
  "mycli/constants.py",
47
47
  "mycli/key_bindings.py",
48
+ "mycli/keyring_utils.py",
48
49
  "mycli/kubectl_tunnel.py",
49
50
  "mycli/lexer.py",
51
+ "mycli/macos_keychain.py",
50
52
  "mycli/main.py",
51
53
  "mycli/main_modes/batch.py",
52
54
  "mycli/main_modes/checkup.py",
@@ -152,7 +154,9 @@
152
154
  "test/pytests/test_interactive_utils.py",
153
155
  "test/pytests/test_key_binding_utils.py",
154
156
  "test/pytests/test_key_bindings.py",
157
+ "test/pytests/test_keyring_utils.py",
155
158
  "test/pytests/test_kubectl_tunnel.py",
159
+ "test/pytests/test_macos_keychain.py",
156
160
  "test/pytests/test_main.py",
157
161
  "test/pytests/test_main_modes_batch.py",
158
162
  "test/pytests/test_main_modes_execute.py",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "2.24.5",
3
+ "distance": 0,
4
+ "node": "g132d3c11b0c5d54691292acbbb2485c2e4705b16",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-09-16"
8
+ }