cloudsmith-cli 1.27.0__tar.gz → 1.29.0__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 (170) hide show
  1. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/PKG-INFO +38 -8
  2. cloudsmith_cli-1.27.0/cloudsmith_cli.egg-info/PKG-INFO → cloudsmith_cli-1.29.0/README.md +29 -54
  3. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/check.py +1 -3
  4. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/__init__.py +6 -4
  5. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/docker.py +8 -1
  6. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/terraform.py +4 -2
  7. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/domains.py +1 -0
  8. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/entitlements.py +9 -8
  9. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/list_.py +26 -2
  10. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/main.py +11 -1
  11. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/mcp.py +7 -5
  12. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metadata.py +10 -3
  13. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/push.py +7 -4
  14. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/registry.py +2 -0
  15. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/repos.py +5 -7
  16. cloudsmith_cli-1.29.0/cloudsmith_cli/cli/commands/update.py +170 -0
  17. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/config.py +13 -0
  18. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/utils.py +8 -3
  19. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/validators.py +2 -2
  20. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/webserver.py +12 -7
  21. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/metadata.py +37 -93
  22. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/packages.py +2 -0
  23. cloudsmith_cli-1.29.0/cloudsmith_cli/core/api/v2.py +96 -0
  24. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/__init__.py +4 -0
  25. cloudsmith_cli-1.29.0/cloudsmith_cli/core/credentials/oidc/detectors/buildkite.py +54 -0
  26. cloudsmith_cli-1.29.0/cloudsmith_cli/core/credentials/oidc/detectors/gcp.py +193 -0
  27. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/download.py +2 -1
  28. cloudsmith_cli-1.29.0/cloudsmith_cli/core/installation.py +156 -0
  29. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/keyring.py +49 -12
  30. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/mcp/server.py +108 -15
  31. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/ratelimits.py +1 -1
  32. cloudsmith_cli-1.29.0/cloudsmith_cli/core/self_update.py +429 -0
  33. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/session.py +10 -1
  34. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/sso.py +3 -3
  35. cloudsmith_cli-1.29.0/cloudsmith_cli/core/update_check.py +474 -0
  36. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/utils.py +15 -0
  37. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/pnpm/rc.py +1 -2
  38. cloudsmith_cli-1.29.0/cloudsmith_cli/data/VERSION +1 -0
  39. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/data/config.ini +3 -0
  40. cloudsmith_cli-1.27.0/README.md → cloudsmith_cli-1.29.0/cloudsmith_cli.egg-info/PKG-INFO +84 -2
  41. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/SOURCES.txt +7 -0
  42. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/requires.txt +8 -3
  43. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/pyproject.toml +20 -16
  44. cloudsmith_cli-1.27.0/cloudsmith_cli/data/VERSION +0 -1
  45. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/LICENSE +0 -0
  46. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/MANIFEST.in +0 -0
  47. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/__init__.py +0 -0
  48. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/__main__.py +0 -0
  49. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/__init__.py +0 -0
  50. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/command.py +0 -0
  51. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/__init__.py +0 -0
  52. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/auth.py +0 -0
  53. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/copy.py +0 -0
  54. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/cargo.py +0 -0
  55. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/generic.py +0 -0
  56. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/manage.py +0 -0
  57. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/pnpm.py +0 -0
  58. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/delete.py +0 -0
  59. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/dependencies.py +0 -0
  60. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/docs.py +0 -0
  61. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/download.py +0 -0
  62. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/help_.py +0 -0
  63. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/login.py +0 -0
  64. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/logout.py +0 -0
  65. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metrics/__init__.py +0 -0
  66. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metrics/command.py +0 -0
  67. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metrics/entitlements.py +0 -0
  68. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metrics/packages.py +0 -0
  69. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/move.py +0 -0
  70. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/__init__.py +0 -0
  71. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/command.py +0 -0
  72. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/deny.py +0 -0
  73. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/license.py +0 -0
  74. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/vulnerability.py +0 -0
  75. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quarantine.py +0 -0
  76. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quota/__init__.py +0 -0
  77. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quota/command.py +0 -0
  78. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quota/history.py +0 -0
  79. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quota/quota.py +0 -0
  80. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/resync.py +0 -0
  81. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/status.py +0 -0
  82. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/tags.py +0 -0
  83. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/tokens.py +0 -0
  84. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/upstream.py +0 -0
  85. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/vulnerabilities.py +0 -0
  86. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/whoami.py +0 -0
  87. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/decorators.py +0 -0
  88. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/dsc_parser.py +0 -0
  89. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/exceptions.py +0 -0
  90. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/metadata_common.py +0 -0
  91. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/saml.py +0 -0
  92. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/table.py +0 -0
  93. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/types.py +0 -0
  94. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/conftest.py +0 -0
  95. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/__init__.py +0 -0
  96. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/__init__.py +0 -0
  97. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/distros.py +0 -0
  98. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/entitlements.py +0 -0
  99. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/exceptions.py +0 -0
  100. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/files.py +0 -0
  101. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/init.py +0 -0
  102. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/metrics.py +0 -0
  103. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/orgs.py +0 -0
  104. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/quota.py +0 -0
  105. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/rates.py +0 -0
  106. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/repos.py +0 -0
  107. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/status.py +0 -0
  108. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/upstreams.py +0 -0
  109. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/user.py +0 -0
  110. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/version.py +0 -0
  111. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/vulnerabilities.py +0 -0
  112. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/cache_utils.py +0 -0
  113. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/config.py +0 -0
  114. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/__init__.py +0 -0
  115. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/chain.py +0 -0
  116. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/models.py +0 -0
  117. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/__init__.py +0 -0
  118. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/cache.py +0 -0
  119. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/aws.py +0 -0
  120. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/azure_devops.py +0 -0
  121. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/base.py +0 -0
  122. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/bitbucket_pipelines.py +0 -0
  123. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/circleci.py +0 -0
  124. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/generic.py +0 -0
  125. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/github_actions.py +0 -0
  126. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/gitlab_ci.py +0 -0
  127. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/exchange.py +0 -0
  128. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/provider.py +0 -0
  129. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/__init__.py +0 -0
  130. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/cli_flag.py +0 -0
  131. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/credentials_file.py +0 -0
  132. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/env_var.py +0 -0
  133. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/keyring_provider.py +0 -0
  134. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/oidc_provider.py +0 -0
  135. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/macos_keychain.py +0 -0
  136. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/mcp/__init__.py +0 -0
  137. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/mcp/data.py +0 -0
  138. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/pagination.py +0 -0
  139. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/rest.py +0 -0
  140. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/version.py +0 -0
  141. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/__init__.py +0 -0
  142. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/backends.py +0 -0
  143. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/cargo/__init__.py +0 -0
  144. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/cargo/installer.py +0 -0
  145. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/cargo/runtime.py +0 -0
  146. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/common.py +0 -0
  147. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/custom_domains.py +0 -0
  148. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/default_domains.py +0 -0
  149. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/docker/__init__.py +0 -0
  150. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/docker/installer.py +0 -0
  151. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/docker/runtime.py +0 -0
  152. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/generic.py +0 -0
  153. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/launchers.py +0 -0
  154. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/pnpm/__init__.py +0 -0
  155. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/pnpm/installer.py +0 -0
  156. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/pnpm/runtime.py +0 -0
  157. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/terraform/__init__.py +0 -0
  158. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/terraform/installer.py +0 -0
  159. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/terraform/runtime.py +0 -0
  160. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/terraform/terraformrc.py +0 -0
  161. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/data/credentials.ini +0 -0
  162. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/templates/__init__.py +0 -0
  163. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/templates/auth_error.html +0 -0
  164. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/templates/auth_success.html +0 -0
  165. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/templates/auth_two_factor.html +0 -0
  166. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/wrapper.py +0 -0
  167. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/dependency_links.txt +0 -0
  168. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/entry_points.txt +0 -0
  169. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/top_level.txt +0 -0
  170. {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudsmith-cli
3
- Version: 1.27.0
3
+ Version: 1.29.0
4
4
  Summary: Cloudsmith Command-Line Interface (CLI)
5
5
  Author-email: Cloudsmith Ltd <support@cloudsmith.io>
6
6
  License-Expression: Apache-2.0
@@ -12,7 +12,6 @@ Classifier: Intended Audience :: Developers
12
12
  Classifier: Intended Audience :: System Administrators
13
13
  Classifier: Operating System :: POSIX :: Linux
14
14
  Classifier: Programming Language :: Python
15
- Classifier: Programming Language :: Python :: 3.10
16
15
  Classifier: Programming Language :: Python :: 3.11
17
16
  Classifier: Programming Language :: Python :: 3.12
18
17
  Classifier: Programming Language :: Python :: 3.13
@@ -20,23 +19,24 @@ Classifier: Programming Language :: Python :: 3.14
20
19
  Classifier: Topic :: Internet
21
20
  Classifier: Topic :: System :: Systems Administration
22
21
  Classifier: Topic :: Utilities
23
- Requires-Python: >=3.10.0
22
+ Requires-Python: >=3.11.0
24
23
  Description-Content-Type: text/markdown
25
24
  License-File: LICENSE
25
+ Requires-Dist: certifi>=2024.7.4
26
26
  Requires-Dist: click!=8.3.0,>=8.2
27
27
  Requires-Dist: click-configfile>=0.2.3
28
28
  Requires-Dist: click-didyoumean>=0.0.3
29
29
  Requires-Dist: click-spinner>=0.1.7
30
30
  Requires-Dist: json5>=0.9.0
31
- Requires-Dist: cloudsmith-api<3.0,>=2.0.31
31
+ Requires-Dist: cloudsmith-api<3.0,>=2.0.38
32
32
  Requires-Dist: keyring>=25.4.1
33
33
  Requires-Dist: keyrings-alt>=5.0.2
34
34
  Requires-Dist: keyrings-cryptfile>=1.3.9
35
35
  Requires-Dist: cryptography>=50.0.0
36
- Requires-Dist: mcp==1.28.1
36
+ Requires-Dist: mcp==2.3.0
37
37
  Requires-Dist: pydantic-settings>=2.14.2
38
38
  Requires-Dist: PyJWT[crypto]>=2.13.0
39
- Requires-Dist: python-toon==0.1.2
39
+ Requires-Dist: python-toon==0.2.0
40
40
  Requires-Dist: requests>=2.18.4
41
41
  Requires-Dist: requests_toolbelt>=1.0.0
42
42
  Requires-Dist: rich>=13.0.0
@@ -46,8 +46,11 @@ Requires-Dist: urllib3>=2.5
46
46
  Requires-Dist: tomlkit>=0.15.0
47
47
  Provides-Extra: aws
48
48
  Requires-Dist: boto3[crt]>=1.26.0; extra == "aws"
49
+ Provides-Extra: gcp
50
+ Requires-Dist: google-auth>=2.40.0; extra == "gcp"
49
51
  Provides-Extra: all
50
52
  Requires-Dist: boto3[crt]>=1.26.0; extra == "all"
53
+ Requires-Dist: google-auth>=2.40.0; extra == "all"
51
54
  Dynamic: license-file
52
55
 
53
56
  # Cloudsmith Command Line Interface (CLI)
@@ -231,6 +234,29 @@ pip install cloudsmith-cli[aws]
231
234
 
232
235
  This installs `boto3[crt]` for AWS credential chain support, STS token generation, and AWS SSO compatibility.
233
236
 
237
+ #### GCP OIDC Support
238
+
239
+ For Google Cloud environments (GCE, Cloud Run, GKE, Cloud Functions, App Engine, Cloud Build), install with the `gcp` extra to enable automatic credential discovery:
240
+
241
+ ```
242
+ pip install cloudsmith-cli[gcp]
243
+ ```
244
+
245
+ This installs `google-auth` for Application Default Credentials (ADC) resolution and OIDC ID token generation. It works with an attached Google Cloud service account, a service-account key supplied through `GOOGLE_APPLICATION_CREDENTIALS`, or service-account impersonation configured locally:
246
+
247
+ ```sh
248
+ gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL
249
+ cloudsmith whoami --workspace=YOUR_WORKSPACE --oidc-service-slug=YOUR_SERVICE --oidc-detector-order=gcp
250
+ ```
251
+
252
+ Configure a Cloudsmith OIDC provider to trust `https://accounts.google.com`, the service account's numeric unique ID as the subject, and audience `cloudsmith` (override with `--oidc-audience` or `CLOUDSMITH_OIDC_AUDIENCE`). Local impersonation requires the Service Account Token Creator role on the target service account and the IAM Service Account Credentials API enabled.
253
+
254
+ On workloads with a metadata identity endpoint, the CLI requests an ID token directly. If that endpoint returns HTTP 404 (as on some Cloud Build environments), it uses IAM `generateIdToken` for the same attached service account. This fallback requires the IAM Service Account Credentials API and `iam.serviceAccounts.getOpenIdToken` on that account; the Service Account OpenID Connect Identity Token Creator role grants this permission. Permission and transport failures are reported, not treated as a missing endpoint.
255
+
256
+ A plain `gcloud auth application-default login` user session cannot mint an ID token for an arbitrary audience. To use it, set `--oidc-audience` to the session's OAuth client ID and configure Cloudsmith to trust that audience and user subject; otherwise use service-account impersonation. `gcloud auth login` alone does not configure ADC. Other ADC types, including direct external-account federation, are skipped rather than incorrectly treated as ID-token-capable credentials.
257
+
258
+ See Google's [Authenticate with auth libraries](https://docs.cloud.google.com/iam/docs/authenticate-with-auth-libraries#authenticate-standard) guide for credential discovery.
259
+
234
260
  #### All Optional Features
235
261
 
236
262
  To install all optional dependencies:
@@ -239,7 +265,7 @@ To install all optional dependencies:
239
265
  pip install cloudsmith-cli[all]
240
266
  ```
241
267
 
242
- **Note:** If you don't install the AWS extra, the AWS OIDC detector will gracefully skip itself with no errors.
268
+ **Note:** If you don't install the AWS or GCP extra, the corresponding OIDC detector will gracefully skip itself with no errors.
243
269
 
244
270
  #### Bitbucket Pipelines OIDC Support
245
271
 
@@ -260,6 +286,10 @@ See the [Bitbucket Pipelines OIDC documentation](https://support.atlassian.com/b
260
286
 
261
287
  In CircleCI, OIDC credential discovery works out of the box with no extra dependencies — the CLI reads the token from the `CIRCLE_OIDC_TOKEN_V2` (preferred) or `CIRCLE_OIDC_TOKEN` environment variable that CircleCI injects into every job. The Cloudsmith OIDC provider must expect the audience CircleCI mints, which is your CircleCI organization UUID. See the [Cloudsmith CircleCI integration guide](https://docs.cloudsmith.com/integrations/integrating-with-circleci).
262
288
 
289
+ #### Buildkite OIDC Support
290
+
291
+ In Buildkite, OIDC credential discovery works out of the box with no extra dependencies — the CLI requests a token for the current job through `buildkite-agent oidc request-token`. By default it requests the `cloudsmith` audience; use `--oidc-audience` or `CLOUDSMITH_OIDC_AUDIENCE` if your Cloudsmith OIDC provider expects a different audience. See the [Buildkite OIDC documentation](https://buildkite.com/docs/pipelines/security/oidc).
292
+
263
293
  #### Azure DevOps OIDC Support
264
294
 
265
295
  In Azure DevOps Pipelines, OIDC credential discovery works out of the box with no extra dependencies — the CLI fetches an OIDC token from the `SYSTEM_OIDCREQUESTURI` endpoint using the pipeline's `SYSTEM_ACCESSTOKEN`. Make sure `SYSTEM_ACCESSTOKEN` is mapped into the step's environment. The Cloudsmith OIDC provider must expect the audience `api://AzureADTokenExchange`, which Azure DevOps always mints (any requested audience is ignored). See the [Cloudsmith Azure DevOps integration guide](https://docs.cloudsmith.com/integrations/integrating-with-azure-devops).
@@ -294,7 +324,7 @@ By default the CLI tries each detector in a fixed priority order and uses the fi
294
324
  - **Disable a detector** — set `CLOUDSMITH_OIDC_<DETECTOR>_DISABLED=true` to skip it entirely. Only the literal value `true` (case-insensitive) disables; anything else leaves the detector enabled. For example, `CLOUDSMITH_OIDC_AWS_DISABLED=true` skips the AWS detector so an explicitly-set `CLOUDSMITH_OIDC_TOKEN` is picked up by the generic detector instead.
295
325
  - **Reorder evaluation** — use `--oidc-detector-order` (or the `CLOUDSMITH_OIDC_DETECTOR_ORDER` environment variable) with a comma-separated list of detector ids to control both which detectors are considered and the order they are tried in (first match wins). Ids not listed are skipped; unrecognised ids are ignored with a warning. For example, `--oidc-detector-order=generic,aws` tries the generic detector first and considers only those two.
296
326
 
297
- When both are set, the order list defines the candidate set and sequence, then the `*_DISABLED` flags are applied on top — so a disabled detector is always skipped even if it appears in the order list. Detector ids are: `aws`, `azure_devops`, `bitbucket`, `circleci`, `generic`, `github`, `gitlab`.
327
+ When both are set, the order list defines the candidate set and sequence, then the `*_DISABLED` flags are applied on top — so a disabled detector is always skipped even if it appears in the order list. Detector ids are: `aws`, `azure_devops`, `bitbucket`, `buildkite`, `circleci`, `gcp`, `generic`, `github`, `gitlab`.
298
328
 
299
329
  Both controls can also be set in `config.ini`, under `[default]` or a profile section:
300
330
 
@@ -1,55 +1,3 @@
1
- Metadata-Version: 2.4
2
- Name: cloudsmith-cli
3
- Version: 1.27.0
4
- Summary: Cloudsmith Command-Line Interface (CLI)
5
- Author-email: Cloudsmith Ltd <support@cloudsmith.io>
6
- License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://github.com/cloudsmith-io/cloudsmith-cli
8
- Keywords: cloudsmith,cli,devops
9
- Classifier: Development Status :: 5 - Production/Stable
10
- Classifier: Environment :: Console
11
- Classifier: Intended Audience :: Developers
12
- Classifier: Intended Audience :: System Administrators
13
- Classifier: Operating System :: POSIX :: Linux
14
- Classifier: Programming Language :: Python
15
- Classifier: Programming Language :: Python :: 3.10
16
- Classifier: Programming Language :: Python :: 3.11
17
- Classifier: Programming Language :: Python :: 3.12
18
- Classifier: Programming Language :: Python :: 3.13
19
- Classifier: Programming Language :: Python :: 3.14
20
- Classifier: Topic :: Internet
21
- Classifier: Topic :: System :: Systems Administration
22
- Classifier: Topic :: Utilities
23
- Requires-Python: >=3.10.0
24
- Description-Content-Type: text/markdown
25
- License-File: LICENSE
26
- Requires-Dist: click!=8.3.0,>=8.2
27
- Requires-Dist: click-configfile>=0.2.3
28
- Requires-Dist: click-didyoumean>=0.0.3
29
- Requires-Dist: click-spinner>=0.1.7
30
- Requires-Dist: json5>=0.9.0
31
- Requires-Dist: cloudsmith-api<3.0,>=2.0.31
32
- Requires-Dist: keyring>=25.4.1
33
- Requires-Dist: keyrings-alt>=5.0.2
34
- Requires-Dist: keyrings-cryptfile>=1.3.9
35
- Requires-Dist: cryptography>=50.0.0
36
- Requires-Dist: mcp==1.28.1
37
- Requires-Dist: pydantic-settings>=2.14.2
38
- Requires-Dist: PyJWT[crypto]>=2.13.0
39
- Requires-Dist: python-toon==0.1.2
40
- Requires-Dist: requests>=2.18.4
41
- Requires-Dist: requests_toolbelt>=1.0.0
42
- Requires-Dist: rich>=13.0.0
43
- Requires-Dist: semver>=2.7.9
44
- Requires-Dist: starlette>=1.3.1
45
- Requires-Dist: urllib3>=2.5
46
- Requires-Dist: tomlkit>=0.15.0
47
- Provides-Extra: aws
48
- Requires-Dist: boto3[crt]>=1.26.0; extra == "aws"
49
- Provides-Extra: all
50
- Requires-Dist: boto3[crt]>=1.26.0; extra == "all"
51
- Dynamic: license-file
52
-
53
1
  # Cloudsmith Command Line Interface (CLI)
54
2
 
55
3
  [![Latest Version @ Cloudsmith](https://api-prd.cloudsmith.io/badges/version/cloudsmith/cli/python/cloudsmith-cli/latest/xf=bdist_wheel;xn=cloudsmith-cli;xv=py2.py3/?render=true)](https://cloudsmith.io/~cloudsmith/repos/cli/packages/detail/python/cloudsmith-cli/latest/xf=bdist_wheel;xn=cloudsmith-cli;xv=py2.py3/)
@@ -231,6 +179,29 @@ pip install cloudsmith-cli[aws]
231
179
 
232
180
  This installs `boto3[crt]` for AWS credential chain support, STS token generation, and AWS SSO compatibility.
233
181
 
182
+ #### GCP OIDC Support
183
+
184
+ For Google Cloud environments (GCE, Cloud Run, GKE, Cloud Functions, App Engine, Cloud Build), install with the `gcp` extra to enable automatic credential discovery:
185
+
186
+ ```
187
+ pip install cloudsmith-cli[gcp]
188
+ ```
189
+
190
+ This installs `google-auth` for Application Default Credentials (ADC) resolution and OIDC ID token generation. It works with an attached Google Cloud service account, a service-account key supplied through `GOOGLE_APPLICATION_CREDENTIALS`, or service-account impersonation configured locally:
191
+
192
+ ```sh
193
+ gcloud auth application-default login --impersonate-service-account=SERVICE_ACCOUNT_EMAIL
194
+ cloudsmith whoami --workspace=YOUR_WORKSPACE --oidc-service-slug=YOUR_SERVICE --oidc-detector-order=gcp
195
+ ```
196
+
197
+ Configure a Cloudsmith OIDC provider to trust `https://accounts.google.com`, the service account's numeric unique ID as the subject, and audience `cloudsmith` (override with `--oidc-audience` or `CLOUDSMITH_OIDC_AUDIENCE`). Local impersonation requires the Service Account Token Creator role on the target service account and the IAM Service Account Credentials API enabled.
198
+
199
+ On workloads with a metadata identity endpoint, the CLI requests an ID token directly. If that endpoint returns HTTP 404 (as on some Cloud Build environments), it uses IAM `generateIdToken` for the same attached service account. This fallback requires the IAM Service Account Credentials API and `iam.serviceAccounts.getOpenIdToken` on that account; the Service Account OpenID Connect Identity Token Creator role grants this permission. Permission and transport failures are reported, not treated as a missing endpoint.
200
+
201
+ A plain `gcloud auth application-default login` user session cannot mint an ID token for an arbitrary audience. To use it, set `--oidc-audience` to the session's OAuth client ID and configure Cloudsmith to trust that audience and user subject; otherwise use service-account impersonation. `gcloud auth login` alone does not configure ADC. Other ADC types, including direct external-account federation, are skipped rather than incorrectly treated as ID-token-capable credentials.
202
+
203
+ See Google's [Authenticate with auth libraries](https://docs.cloud.google.com/iam/docs/authenticate-with-auth-libraries#authenticate-standard) guide for credential discovery.
204
+
234
205
  #### All Optional Features
235
206
 
236
207
  To install all optional dependencies:
@@ -239,7 +210,7 @@ To install all optional dependencies:
239
210
  pip install cloudsmith-cli[all]
240
211
  ```
241
212
 
242
- **Note:** If you don't install the AWS extra, the AWS OIDC detector will gracefully skip itself with no errors.
213
+ **Note:** If you don't install the AWS or GCP extra, the corresponding OIDC detector will gracefully skip itself with no errors.
243
214
 
244
215
  #### Bitbucket Pipelines OIDC Support
245
216
 
@@ -260,6 +231,10 @@ See the [Bitbucket Pipelines OIDC documentation](https://support.atlassian.com/b
260
231
 
261
232
  In CircleCI, OIDC credential discovery works out of the box with no extra dependencies — the CLI reads the token from the `CIRCLE_OIDC_TOKEN_V2` (preferred) or `CIRCLE_OIDC_TOKEN` environment variable that CircleCI injects into every job. The Cloudsmith OIDC provider must expect the audience CircleCI mints, which is your CircleCI organization UUID. See the [Cloudsmith CircleCI integration guide](https://docs.cloudsmith.com/integrations/integrating-with-circleci).
262
233
 
234
+ #### Buildkite OIDC Support
235
+
236
+ In Buildkite, OIDC credential discovery works out of the box with no extra dependencies — the CLI requests a token for the current job through `buildkite-agent oidc request-token`. By default it requests the `cloudsmith` audience; use `--oidc-audience` or `CLOUDSMITH_OIDC_AUDIENCE` if your Cloudsmith OIDC provider expects a different audience. See the [Buildkite OIDC documentation](https://buildkite.com/docs/pipelines/security/oidc).
237
+
263
238
  #### Azure DevOps OIDC Support
264
239
 
265
240
  In Azure DevOps Pipelines, OIDC credential discovery works out of the box with no extra dependencies — the CLI fetches an OIDC token from the `SYSTEM_OIDCREQUESTURI` endpoint using the pipeline's `SYSTEM_ACCESSTOKEN`. Make sure `SYSTEM_ACCESSTOKEN` is mapped into the step's environment. The Cloudsmith OIDC provider must expect the audience `api://AzureADTokenExchange`, which Azure DevOps always mints (any requested audience is ignored). See the [Cloudsmith Azure DevOps integration guide](https://docs.cloudsmith.com/integrations/integrating-with-azure-devops).
@@ -294,7 +269,7 @@ By default the CLI tries each detector in a fixed priority order and uses the fi
294
269
  - **Disable a detector** — set `CLOUDSMITH_OIDC_<DETECTOR>_DISABLED=true` to skip it entirely. Only the literal value `true` (case-insensitive) disables; anything else leaves the detector enabled. For example, `CLOUDSMITH_OIDC_AWS_DISABLED=true` skips the AWS detector so an explicitly-set `CLOUDSMITH_OIDC_TOKEN` is picked up by the generic detector instead.
295
270
  - **Reorder evaluation** — use `--oidc-detector-order` (or the `CLOUDSMITH_OIDC_DETECTOR_ORDER` environment variable) with a comma-separated list of detector ids to control both which detectors are considered and the order they are tried in (first match wins). Ids not listed are skipped; unrecognised ids are ignored with a warning. For example, `--oidc-detector-order=generic,aws` tries the generic detector first and considers only those two.
296
271
 
297
- When both are set, the order list defines the candidate set and sequence, then the `*_DISABLED` flags are applied on top — so a disabled detector is always skipped even if it appears in the order list. Detector ids are: `aws`, `azure_devops`, `bitbucket`, `circleci`, `generic`, `github`, `gitlab`.
272
+ When both are set, the order list defines the candidate set and sequence, then the `*_DISABLED` flags are applied on top — so a disabled detector is always skipped even if it appears in the order list. Detector ids are: `aws`, `azure_devops`, `bitbucket`, `buildkite`, `circleci`, `gcp`, `generic`, `github`, `gitlab`.
298
273
 
299
274
  Both controls can also be set in `config.ini`, under `[default]` or a profile section:
300
275
 
@@ -127,6 +127,4 @@ def service(ctx, opts):
127
127
  click.secho("(up-to-date)", fg="green")
128
128
 
129
129
  click.echo()
130
- click.secho(
131
- "The API library used by this CLI tool seems to be up-to-date.", fg="green"
132
- )
130
+ click.secho("The API library used by this CLI tool is up-to-date.", fg="green")
@@ -27,18 +27,20 @@ def credential_helper():
27
27
  manager automatically, or run the runtime command directly for debugging.
28
28
 
29
29
  Examples:
30
+
31
+ \b
30
32
  # Install Docker credential helper
31
33
  $ cloudsmith credential-helper install docker
32
-
34
+ \b
33
35
  # Install pnpm credential helper
34
36
  $ cloudsmith credential-helper install pnpm
35
-
37
+ \b
36
38
  # Install cargo credential helper
37
39
  $ cloudsmith credential-helper install cargo
38
-
40
+ \b
39
41
  # Test Docker credential helper directly
40
42
  $ echo "docker.cloudsmith.io" | cloudsmith credential-helper docker
41
-
43
+ \b
42
44
  # Test pnpm credential helper directly
43
45
  $ cloudsmith credential-helper pnpm npm.cloudsmith.io
44
46
  """
@@ -33,23 +33,30 @@ def docker(opts, operation):
33
33
  ``workspace`` in ``config.ini``; legacy aliases are also accepted - and a
34
34
  valid API key/token).
35
35
 
36
+ \b
36
37
  Input (stdin):
37
38
  Server URL as plain text (e.g. "docker.cloudsmith.io")
38
39
 
40
+ \b
39
41
  Output (stdout):
40
42
  JSON: {"Username": "token", "Secret": "<cloudsmith-token>"}
41
43
 
44
+ \b
42
45
  Exit codes:
43
46
  0: Success
44
47
  1: Error (no credentials available, not a Cloudsmith registry, etc.)
45
48
 
49
+ \b
46
50
  Examples:
51
+
52
+ \b
47
53
  # Manual testing
48
54
  $ echo "docker.cloudsmith.io" | cloudsmith credential-helper docker
49
-
55
+ \b
50
56
  # Called by Docker via launcher
51
57
  $ echo "docker.cloudsmith.io" | docker-credential-cloudsmith get
52
58
 
59
+ \b
53
60
  Environment variables:
54
61
  CLOUDSMITH_API_KEY: API key for authentication (optional)
55
62
  CLOUDSMITH_WORKSPACE: Workspace slug (CLOUDSMITH_ORG is also accepted)
@@ -92,13 +92,15 @@ def terraform(opts, repo, params):
92
92
 
93
93
  \b
94
94
  Examples:
95
+
96
+ \b
95
97
  # Direct usage
96
98
  $ cloudsmith credential-helper terraform --repo my-repo terraform.cloudsmith.io
97
99
  {"token": "..."}
98
-
100
+ \b
99
101
  # Terraform's calling convention (verb + hostname)
100
102
  $ cloudsmith credential-helper terraform --repo my-repo get terraform.cloudsmith.io
101
-
103
+ \b
102
104
  # Select an org and profile explicitly (no env vars needed)
103
105
  $ cloudsmith credential-helper terraform --org=acme -P ci get terraform.cloudsmith.io
104
106
 
@@ -162,6 +162,7 @@ def list_domains( # pylint: disable=too-many-arguments
162
162
  paginated endpoint, so there is no benefit to hiding entries by default.
163
163
  Passing --page or --page-size switches to paged output.
164
164
 
165
+ \b
165
166
  Output (stdout):
166
167
  JSON: {"version": 1, "domains": [{"host": ..., "format": ...,
167
168
  "type": ..., "domain_type": ..., "workspace": ..., "repository": ...,
@@ -775,14 +775,15 @@ def restrict(
775
775
 
776
776
  Full CLI example:
777
777
 
778
- $ cloudsmith entitlements restrict cloudsmith/testing-private/9xGSdAxlIqIV \
779
- --limit-bandwidth=1 \
780
- --limit-bandwidth-unit=gigabyte \
781
- --limit-num-clients=10 \
782
- --limit-num-downloads=1000 \
783
- --limit-package-query="package-darwin-amd64 OR package-windows-amd64 OR package-linux-amd64" \
784
- --limit-path-query=tag:latest \
785
- --limit-date-range-from=2020-01-01T00:00:00Z \
778
+ \b
779
+ $ cloudsmith entitlements restrict cloudsmith/testing-private/9xGSdAxlIqIV \\
780
+ --limit-bandwidth=1 \\
781
+ --limit-bandwidth-unit=gigabyte \\
782
+ --limit-num-clients=10 \\
783
+ --limit-num-downloads=1000 \\
784
+ --limit-package-query="package-darwin-amd64 OR package-windows-amd64 OR package-linux-amd64" \\
785
+ --limit-path-query=tag:latest \\
786
+ --limit-date-range-from=2020-01-01T00:00:00Z \\
786
787
  --limit-date-range-to=2077-01-01T00:00:00Z
787
788
  """
788
789
  owner, repo, identifier = owner_repo_identifier
@@ -157,8 +157,20 @@ def entitlements_(*args, **kwargs): # pylint: disable=missing-docstring
157
157
  ),
158
158
  help=("Sort packages by field. Prefix with '-' for descending order."),
159
159
  )
160
+ @click.option(
161
+ "--include-connected",
162
+ is_flag=True,
163
+ default=False,
164
+ help=(
165
+ "Include packages from active connected repositories and show the "
166
+ "origin repository of each package. Download URLs (e.g. cdn_url, "
167
+ "signature_url) point at the requesting repository, not the origin."
168
+ ),
169
+ )
160
170
  @click.pass_context
161
- def packages(ctx, opts, owner_repo, page, page_size, query, sort, page_all):
171
+ def packages(
172
+ ctx, opts, owner_repo, page, page_size, query, sort, include_connected, page_all
173
+ ):
162
174
  """
163
175
  List packages for a repository.
164
176
 
@@ -195,6 +207,7 @@ def packages(ctx, opts, owner_repo, page, page_size, query, sort, page_all):
195
207
 
196
208
  --query 'name:^foo$ filename:.zip$ architecture:~x86'
197
209
 
210
+ \b
198
211
  You can sort the results using --sort with these fields:
199
212
  - date/-date: Sort by creation date
200
213
  - downloads/-downloads: Sort by download count
@@ -230,6 +243,7 @@ def packages(ctx, opts, owner_repo, page, page_size, query, sort, page_all):
230
243
  repo=repo,
231
244
  query=query,
232
245
  sort=sort,
246
+ include_connected=include_connected,
233
247
  )
234
248
 
235
249
  if not use_stderr:
@@ -239,6 +253,7 @@ def packages(ctx, opts, owner_repo, page, page_size, query, sort, page_all):
239
253
  return
240
254
 
241
255
  headers = ["Name", "Version", "Status", "Owner / Repository (Identifier)"]
256
+ sorted_packages = sorted(packages_, key=itemgetter("namespace", "slug"))
242
257
  rows = [
243
258
  [
244
259
  click.style(_get_package_name(package), fg="cyan"),
@@ -250,8 +265,12 @@ def packages(ctx, opts, owner_repo, page, page_size, query, sort, page_all):
250
265
  slug=click.style(package["slug"], fg="green"),
251
266
  ),
252
267
  ]
253
- for package in sorted(packages_, key=itemgetter("namespace", "slug"))
268
+ for package in sorted_packages
254
269
  ]
270
+ if include_connected:
271
+ headers.append("Origin Repository")
272
+ for row, package in zip(rows, sorted_packages):
273
+ row.append(click.style(_get_origin_repository(package), fg="magenta"))
255
274
 
256
275
  if packages_:
257
276
  click.echo()
@@ -316,3 +335,8 @@ def _get_package_status(package):
316
335
  def _get_package_version(package):
317
336
  """Get the version for a package (if any)."""
318
337
  return package["version"] or "None"
338
+
339
+
340
+ def _get_origin_repository(package):
341
+ """Get the repository that a package physically lives in."""
342
+ return package["origin_repository"] or package["repository"]
@@ -2,6 +2,7 @@
2
2
 
3
3
  import click
4
4
 
5
+ from ...core import update_check
5
6
  from ...core.api.version import get_version as get_api_version
6
7
  from ...core.utils import get_github_website, get_help_website
7
8
  from ...core.version import get_version as get_cli_version
@@ -56,13 +57,22 @@ For issues/contributing: {get_github_website()}
56
57
  is_flag=True,
57
58
  is_eager=True,
58
59
  )
60
+ @click.option(
61
+ "--no-check-update",
62
+ is_flag=True,
63
+ default=False,
64
+ envvar="CLOUDSMITH_NO_UPDATE_CHECK",
65
+ help="Disable the once-a-day check for a newer version of the CLI.",
66
+ )
59
67
  @decorators.common_cli_config_options
60
68
  @decorators.common_cli_output_options
61
69
  @click.pass_context
62
- def main(ctx, opts, version):
70
+ def main(ctx, opts, version, no_check_update):
63
71
  """Handle entrypoint to CLI."""
64
72
  # pylint: disable=unused-argument
65
73
 
74
+ update_check.arm(ctx, opts, no_check_update)
75
+
66
76
  if version:
67
77
  print_version(opts)
68
78
  elif ctx.invoked_subcommand is None:
@@ -200,6 +200,7 @@ def configure(ctx, opts, client, is_global): # pylint: disable=unused-argument
200
200
  """
201
201
  Configure the Cloudsmith MCP server for supported clients.
202
202
 
203
+ \b
203
204
  This command automatically adds the Cloudsmith MCP server configuration
204
205
  to the specified client's configuration file. Supported clients are:
205
206
  - Claude Desktop
@@ -211,11 +212,12 @@ def configure(ctx, opts, client, is_global): # pylint: disable=unused-argument
211
212
  For Claude Code, --global edits ~/.claude.json (user scope) and
212
213
  --local writes ./.mcp.json (project scope, intended to be committed).
213
214
 
214
- Examples:\n
215
- cloudsmith mcp configure --client claude\n
216
- cloudsmith mcp configure --client claude-code\n
217
- cloudsmith mcp configure --client cursor --local\n
218
- cloudsmith mcp configure --client gemini-cli\n
215
+ \b
216
+ Examples:
217
+ cloudsmith mcp configure --client claude
218
+ cloudsmith mcp configure --client claude-code
219
+ cloudsmith mcp configure --client cursor --local
220
+ cloudsmith mcp configure --client gemini-cli
219
221
  cloudsmith mcp configure # Auto-detect and configure all
220
222
  """
221
223
 
@@ -183,7 +183,9 @@ def list_metadata(
183
183
  slug_perm = api_get_package_slug_perm(
184
184
  owner=owner, repo=repo, identifier=package
185
185
  )
186
- entry = api_get_metadata(slug_perm, metadata_slug_perm)
186
+ entry = api_get_metadata(
187
+ slug_perm, metadata_slug_perm, credential=opts.credential
188
+ )
187
189
 
188
190
  click.secho("OK", fg="green", err=use_stderr)
189
191
  _print_metadata_entry(opts, entry)
@@ -208,6 +210,7 @@ def list_metadata(
208
210
  page=page,
209
211
  page_size=page_size,
210
212
  package_slug_perm=slug_perm,
213
+ credential=opts.credential,
211
214
  source_kind=source_kind,
212
215
  classification=classification,
213
216
  )
@@ -328,6 +331,7 @@ def add_metadata(
328
331
  )
329
332
  entry = api_create_metadata(
330
333
  slug_perm,
334
+ credential=opts.credential,
331
335
  content=metadata.content,
332
336
  content_type=metadata.content_type,
333
337
  source_identity=metadata.source_identity,
@@ -434,7 +438,9 @@ def update_metadata(
434
438
  slug_perm = api_get_package_slug_perm(
435
439
  owner=owner, repo=repo, identifier=package
436
440
  )
437
- entry = api_update_metadata(slug_perm, metadata_slug_perm, **patch_kwargs)
441
+ entry = api_update_metadata(
442
+ slug_perm, metadata_slug_perm, credential=opts.credential, **patch_kwargs
443
+ )
438
444
 
439
445
  click.secho("OK", fg="green", err=use_stderr)
440
446
  _print_metadata_entry(opts, entry)
@@ -463,6 +469,7 @@ def remove_metadata(ctx, opts, owner_repo_package, metadata_slug_perm, yes):
463
469
  """
464
470
  Remove package metadata.
465
471
 
472
+ \b
466
473
  OWNER/REPO/PACKAGE: target package.
467
474
  METADATA_SLUG_PERM: permanent slug for the metadata entry.
468
475
 
@@ -495,7 +502,7 @@ def remove_metadata(ctx, opts, owner_repo_package, metadata_slug_perm, yes):
495
502
  slug_perm = api_get_package_slug_perm(
496
503
  owner=owner, repo=repo, identifier=package
497
504
  )
498
- api_delete_metadata(slug_perm, metadata_slug_perm)
505
+ api_delete_metadata(slug_perm, metadata_slug_perm, credential=opts.credential)
499
506
 
500
507
  click.secho("OK", fg="green", err=use_stderr)
501
508
 
@@ -7,7 +7,7 @@ import math
7
7
  import os
8
8
  import shlex
9
9
  import time
10
- from datetime import datetime, timezone
10
+ from datetime import UTC, datetime
11
11
 
12
12
  import click
13
13
 
@@ -300,7 +300,9 @@ def validate_metadata_payload(
300
300
 
301
301
  try:
302
302
  with maybe_spinner(opts):
303
- api_validate_metadata(content=content, content_type=content_type)
303
+ api_validate_metadata(
304
+ credential=opts.credential, content=content, content_type=content_type
305
+ )
304
306
  except ApiException as exc:
305
307
  http_status = getattr(exc, "status", None)
306
308
  detail = (
@@ -385,6 +387,7 @@ def attach_metadata_to_package(
385
387
  with maybe_spinner(opts):
386
388
  entry = api_create_metadata(
387
389
  slug_perm,
390
+ credential=opts.credential,
388
391
  content=content,
389
392
  content_type=content_type,
390
393
  source_identity=source_identity,
@@ -681,7 +684,7 @@ def wait_for_package_sync(
681
684
  fg="cyan",
682
685
  )
683
686
 
684
- start = datetime.now(tz=timezone.utc)
687
+ start = datetime.now(tz=UTC)
685
688
  context_msg = "Failed to synchronise file!"
686
689
  with handle_api_exceptions(
687
690
  ctx, opts=opts, context_msg=context_msg, reraise_on_error=skip_errors
@@ -738,7 +741,7 @@ def wait_for_package_sync(
738
741
  if left > 0:
739
742
  pb.update(left)
740
743
 
741
- end = datetime.now(tz=timezone.utc)
744
+ end = datetime.now(tz=UTC)
742
745
  seconds = (end - start).total_seconds()
743
746
 
744
747
  click.echo(err=use_stderr)
@@ -37,6 +37,7 @@ LAZY_COMMANDS = {
37
37
  "status": f"{_PACKAGE}.status",
38
38
  "tags": f"{_PACKAGE}.tags",
39
39
  "tokens": f"{_PACKAGE}.tokens",
40
+ "update": f"{_PACKAGE}.update",
40
41
  "upstream": f"{_PACKAGE}.upstream",
41
42
  "vulnerabilities": f"{_PACKAGE}.vulnerabilities",
42
43
  "whoami": f"{_PACKAGE}.whoami",
@@ -56,4 +57,5 @@ LAZY_ALIASES = {
56
57
  "quarantine": ["block"],
57
58
  "repositories": ["repos"],
58
59
  "tags": ["tag"],
60
+ "update": ["upgrade"],
59
61
  }
@@ -16,27 +16,25 @@ from .main import main
16
16
  def print_repositories(opts, data, page_info=None, show_list_info=True, page_all=False):
17
17
  """Print repositories as a table or output in another format."""
18
18
  headers = [
19
- "Name",
19
+ "Owner / Repository (Identifier)",
20
20
  "Type",
21
21
  "Packages",
22
22
  "Groups",
23
23
  "Downloads",
24
24
  "Size",
25
- "Owner / Repository (Identifier)",
26
25
  ]
27
26
 
28
27
  rows = [
29
28
  [
30
- click.style(repo["name"], fg="cyan"),
29
+ "{owner_slug}/{slug}".format(
30
+ owner_slug=click.style(repo["namespace"], fg="magenta"),
31
+ slug=click.style(repo["slug"], fg="green"),
32
+ ),
31
33
  click.style(repo["repository_type_str"], fg="yellow"),
32
34
  click.style(str(repo["package_count"]), fg="blue"),
33
35
  click.style(str(repo["package_group_count"]), fg="blue"),
34
36
  click.style(str(repo["num_downloads"]), fg="blue"),
35
37
  click.style(str(repo["size_str"]), fg="blue"),
36
- "{owner_slug}/{slug}".format(
37
- owner_slug=click.style(repo["namespace"], fg="magenta"),
38
- slug=click.style(repo["slug"], fg="green"),
39
- ),
40
38
  ]
41
39
  for repo in sorted(data, key=itemgetter("namespace", "slug"))
42
40
  ]