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.
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/PKG-INFO +38 -8
- cloudsmith_cli-1.27.0/cloudsmith_cli.egg-info/PKG-INFO → cloudsmith_cli-1.29.0/README.md +29 -54
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/check.py +1 -3
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/__init__.py +6 -4
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/docker.py +8 -1
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/terraform.py +4 -2
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/domains.py +1 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/entitlements.py +9 -8
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/list_.py +26 -2
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/main.py +11 -1
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/mcp.py +7 -5
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metadata.py +10 -3
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/push.py +7 -4
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/registry.py +2 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/repos.py +5 -7
- cloudsmith_cli-1.29.0/cloudsmith_cli/cli/commands/update.py +170 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/config.py +13 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/utils.py +8 -3
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/validators.py +2 -2
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/webserver.py +12 -7
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/metadata.py +37 -93
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/packages.py +2 -0
- cloudsmith_cli-1.29.0/cloudsmith_cli/core/api/v2.py +96 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/__init__.py +4 -0
- cloudsmith_cli-1.29.0/cloudsmith_cli/core/credentials/oidc/detectors/buildkite.py +54 -0
- cloudsmith_cli-1.29.0/cloudsmith_cli/core/credentials/oidc/detectors/gcp.py +193 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/download.py +2 -1
- cloudsmith_cli-1.29.0/cloudsmith_cli/core/installation.py +156 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/keyring.py +49 -12
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/mcp/server.py +108 -15
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/ratelimits.py +1 -1
- cloudsmith_cli-1.29.0/cloudsmith_cli/core/self_update.py +429 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/session.py +10 -1
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/sso.py +3 -3
- cloudsmith_cli-1.29.0/cloudsmith_cli/core/update_check.py +474 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/utils.py +15 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/pnpm/rc.py +1 -2
- cloudsmith_cli-1.29.0/cloudsmith_cli/data/VERSION +1 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/data/config.ini +3 -0
- cloudsmith_cli-1.27.0/README.md → cloudsmith_cli-1.29.0/cloudsmith_cli.egg-info/PKG-INFO +84 -2
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/SOURCES.txt +7 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/requires.txt +8 -3
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/pyproject.toml +20 -16
- cloudsmith_cli-1.27.0/cloudsmith_cli/data/VERSION +0 -1
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/LICENSE +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/MANIFEST.in +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/__main__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/command.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/auth.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/copy.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/cargo.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/generic.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/manage.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/credential_helper/pnpm.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/delete.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/dependencies.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/docs.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/download.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/help_.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/login.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/logout.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metrics/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metrics/command.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metrics/entitlements.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/metrics/packages.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/move.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/command.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/deny.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/license.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/policy/vulnerability.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quarantine.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quota/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quota/command.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quota/history.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/quota/quota.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/resync.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/status.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/tags.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/tokens.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/upstream.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/vulnerabilities.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/commands/whoami.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/decorators.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/dsc_parser.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/exceptions.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/metadata_common.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/saml.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/table.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/cli/types.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/conftest.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/distros.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/entitlements.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/exceptions.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/files.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/init.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/metrics.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/orgs.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/quota.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/rates.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/repos.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/status.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/upstreams.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/user.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/version.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/api/vulnerabilities.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/cache_utils.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/config.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/chain.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/models.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/cache.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/aws.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/azure_devops.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/base.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/bitbucket_pipelines.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/circleci.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/generic.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/github_actions.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/detectors/gitlab_ci.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/oidc/exchange.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/provider.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/cli_flag.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/credentials_file.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/env_var.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/keyring_provider.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/credentials/providers/oidc_provider.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/macos_keychain.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/mcp/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/mcp/data.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/pagination.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/rest.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/core/version.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/backends.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/cargo/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/cargo/installer.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/cargo/runtime.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/common.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/custom_domains.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/default_domains.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/docker/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/docker/installer.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/docker/runtime.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/generic.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/launchers.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/pnpm/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/pnpm/installer.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/pnpm/runtime.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/terraform/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/terraform/installer.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/terraform/runtime.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/credential_helpers/terraform/terraformrc.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/data/credentials.ini +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/templates/__init__.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/templates/auth_error.html +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/templates/auth_success.html +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/templates/auth_two_factor.html +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli/wrapper.py +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/dependency_links.txt +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/entry_points.txt +0 -0
- {cloudsmith_cli-1.27.0 → cloudsmith_cli-1.29.0}/cloudsmith_cli.egg-info/top_level.txt +0 -0
- {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.
|
|
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.
|
|
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
|
+
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==
|
|
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.
|
|
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
|
|
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
|
[](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
|
|
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
|
-
|
|
779
|
-
|
|
780
|
-
--limit-bandwidth
|
|
781
|
-
--limit-
|
|
782
|
-
--limit-num-
|
|
783
|
-
--limit-
|
|
784
|
-
--limit-
|
|
785
|
-
--limit-
|
|
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(
|
|
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
|
|
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
|
-
|
|
215
|
-
|
|
216
|
-
cloudsmith mcp configure --client claude
|
|
217
|
-
cloudsmith mcp configure --client
|
|
218
|
-
cloudsmith mcp configure --client
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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=
|
|
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=
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
]
|