cloudsmith-cli 1.20.2__tar.gz → 1.21.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 (139) hide show
  1. {cloudsmith_cli-1.20.2/cloudsmith_cli.egg-info → cloudsmith_cli-1.21.0}/PKG-INFO +1 -1
  2. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/credential_helper/__init__.py +2 -0
  3. cloudsmith_cli-1.21.0/cloudsmith_cli/cli/commands/credential_helper/generic.py +62 -0
  4. cloudsmith_cli-1.21.0/cloudsmith_cli/credential_helpers/generic.py +63 -0
  5. cloudsmith_cli-1.21.0/cloudsmith_cli/data/VERSION +1 -0
  6. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0/cloudsmith_cli.egg-info}/PKG-INFO +1 -1
  7. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli.egg-info/SOURCES.txt +2 -0
  8. cloudsmith_cli-1.20.2/cloudsmith_cli/data/VERSION +0 -1
  9. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/LICENSE +0 -0
  10. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/MANIFEST.in +0 -0
  11. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/README.md +0 -0
  12. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/__init__.py +0 -0
  13. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/__main__.py +0 -0
  14. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/__init__.py +0 -0
  15. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/command.py +0 -0
  16. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/__init__.py +0 -0
  17. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/auth.py +0 -0
  18. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/check.py +0 -0
  19. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/copy.py +0 -0
  20. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/credential_helper/docker.py +0 -0
  21. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/credential_helper/manage.py +0 -0
  22. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/delete.py +0 -0
  23. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/dependencies.py +0 -0
  24. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/docs.py +0 -0
  25. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/download.py +0 -0
  26. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/entitlements.py +0 -0
  27. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/help_.py +0 -0
  28. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/list_.py +0 -0
  29. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/login.py +0 -0
  30. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/logout.py +0 -0
  31. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/main.py +0 -0
  32. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/mcp.py +0 -0
  33. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/metadata.py +0 -0
  34. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/metrics/__init__.py +0 -0
  35. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/metrics/command.py +0 -0
  36. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/metrics/entitlements.py +0 -0
  37. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/metrics/packages.py +0 -0
  38. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/move.py +0 -0
  39. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/policy/__init__.py +0 -0
  40. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/policy/command.py +0 -0
  41. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/policy/deny.py +0 -0
  42. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/policy/license.py +0 -0
  43. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/policy/vulnerability.py +0 -0
  44. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/push.py +0 -0
  45. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/quarantine.py +0 -0
  46. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/quota/__init__.py +0 -0
  47. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/quota/command.py +0 -0
  48. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/quota/history.py +0 -0
  49. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/quota/quota.py +0 -0
  50. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/repos.py +0 -0
  51. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/resync.py +0 -0
  52. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/status.py +0 -0
  53. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/tags.py +0 -0
  54. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/tokens.py +0 -0
  55. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/upstream.py +0 -0
  56. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/vulnerabilities.py +0 -0
  57. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/commands/whoami.py +0 -0
  58. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/config.py +0 -0
  59. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/decorators.py +0 -0
  60. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/exceptions.py +0 -0
  61. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/metadata_common.py +0 -0
  62. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/saml.py +0 -0
  63. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/table.py +0 -0
  64. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/types.py +0 -0
  65. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/utils.py +0 -0
  66. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/validators.py +0 -0
  67. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/cli/webserver.py +0 -0
  68. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/__init__.py +0 -0
  69. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/__init__.py +0 -0
  70. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/distros.py +0 -0
  71. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/entitlements.py +0 -0
  72. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/exceptions.py +0 -0
  73. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/files.py +0 -0
  74. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/init.py +0 -0
  75. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/metadata.py +0 -0
  76. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/metrics.py +0 -0
  77. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/orgs.py +0 -0
  78. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/packages.py +0 -0
  79. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/quota.py +0 -0
  80. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/rates.py +0 -0
  81. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/repos.py +0 -0
  82. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/status.py +0 -0
  83. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/upstreams.py +0 -0
  84. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/user.py +0 -0
  85. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/version.py +0 -0
  86. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/api/vulnerabilities.py +0 -0
  87. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/cache_utils.py +0 -0
  88. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/config.py +0 -0
  89. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/__init__.py +0 -0
  90. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/chain.py +0 -0
  91. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/models.py +0 -0
  92. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/__init__.py +0 -0
  93. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/cache.py +0 -0
  94. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/detectors/__init__.py +0 -0
  95. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/detectors/aws.py +0 -0
  96. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/detectors/azure_devops.py +0 -0
  97. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/detectors/base.py +0 -0
  98. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/detectors/bitbucket_pipelines.py +0 -0
  99. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/detectors/circleci.py +0 -0
  100. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/detectors/generic.py +0 -0
  101. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/detectors/github_actions.py +0 -0
  102. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/detectors/gitlab_ci.py +0 -0
  103. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/oidc/exchange.py +0 -0
  104. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/provider.py +0 -0
  105. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/providers/__init__.py +0 -0
  106. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/providers/cli_flag.py +0 -0
  107. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/providers/credentials_file.py +0 -0
  108. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/providers/env_var.py +0 -0
  109. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/providers/keyring_provider.py +0 -0
  110. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/credentials/providers/oidc_provider.py +0 -0
  111. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/download.py +0 -0
  112. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/keyring.py +0 -0
  113. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/mcp/__init__.py +0 -0
  114. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/mcp/data.py +0 -0
  115. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/mcp/server.py +0 -0
  116. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/pagination.py +0 -0
  117. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/ratelimits.py +0 -0
  118. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/rest.py +0 -0
  119. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/utils.py +0 -0
  120. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/core/version.py +0 -0
  121. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/credential_helpers/__init__.py +0 -0
  122. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/credential_helpers/backends.py +0 -0
  123. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/credential_helpers/common.py +0 -0
  124. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/credential_helpers/custom_domains.py +0 -0
  125. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/credential_helpers/docker/__init__.py +0 -0
  126. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/credential_helpers/docker/installer.py +0 -0
  127. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/credential_helpers/docker/runtime.py +0 -0
  128. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/credential_helpers/launchers.py +0 -0
  129. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/data/config.ini +0 -0
  130. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/data/credentials.ini +0 -0
  131. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/templates/__init__.py +0 -0
  132. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/templates/auth_error.html +0 -0
  133. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli/templates/auth_success.html +0 -0
  134. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli.egg-info/dependency_links.txt +0 -0
  135. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli.egg-info/entry_points.txt +0 -0
  136. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli.egg-info/requires.txt +0 -0
  137. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/cloudsmith_cli.egg-info/top_level.txt +0 -0
  138. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/pyproject.toml +0 -0
  139. {cloudsmith_cli-1.20.2 → cloudsmith_cli-1.21.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudsmith-cli
3
- Version: 1.20.2
3
+ Version: 1.21.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
@@ -10,6 +10,7 @@ import click
10
10
 
11
11
  from ..main import main
12
12
  from .docker import docker as docker_cmd
13
+ from .generic import generic as generic_cmd
13
14
  from .manage import install_cmd, list_cmd, uninstall_cmd
14
15
 
15
16
 
@@ -32,6 +33,7 @@ def credential_helper():
32
33
 
33
34
 
34
35
  credential_helper.add_command(docker_cmd, name="docker")
36
+ credential_helper.add_command(generic_cmd, name="generic")
35
37
  credential_helper.add_command(install_cmd, name="install")
36
38
  credential_helper.add_command(uninstall_cmd, name="uninstall")
37
39
  credential_helper.add_command(list_cmd, name="list")
@@ -0,0 +1,62 @@
1
+ # Copyright 2026 Cloudsmith Ltd
2
+ """
3
+ Generic credential helper command.
4
+
5
+ Emits a versioned JSON credential document.
6
+ """
7
+
8
+ import sys
9
+
10
+ import click
11
+
12
+ from ....credential_helpers.generic import execute
13
+ from ...decorators import (
14
+ common_api_auth_options,
15
+ common_cli_config_options,
16
+ resolve_credentials,
17
+ )
18
+
19
+
20
+ @click.command()
21
+ @common_cli_config_options
22
+ @common_api_auth_options
23
+ @resolve_credentials
24
+ def generic(opts):
25
+ """
26
+ Emit a Cloudsmith credential as JSON.
27
+
28
+ Resolves a credential through the full provider chain and writes a
29
+ versioned JSON document to stdout. Takes no arguments: a Cloudsmith token
30
+ is organisation-wide, so the host it will be used against does not change
31
+ which credential resolves.
32
+
33
+ \b
34
+ Output (stdout):
35
+ JSON: {"version": 1, "username": "token", "password": "<token>"}
36
+
37
+ \b
38
+ Exit codes:
39
+ 0: Success
40
+ 1: No credential could be resolved
41
+
42
+ Examples:
43
+
44
+ \b
45
+ # Resolve a credential
46
+ $ cloudsmith credential-helper generic
47
+
48
+ \b
49
+ # Extract just the token
50
+ $ cloudsmith credential-helper generic | jq -r .password
51
+
52
+ \b
53
+ Environment variables:
54
+ CLOUDSMITH_API_KEY: API key for authentication (optional)
55
+ """
56
+ exit_code, stdout, stderr = execute(credential=opts.credential)
57
+
58
+ if stdout is not None:
59
+ click.echo(stdout)
60
+ if stderr is not None:
61
+ click.echo(stderr, err=True)
62
+ sys.exit(exit_code)
@@ -0,0 +1,63 @@
1
+ # Copyright 2026 Cloudsmith Ltd
2
+ """
3
+ Generic credential helper runtime.
4
+
5
+ Emits a versioned JSON credential document.
6
+ """
7
+
8
+ import json
9
+ import logging
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+ PROTOCOL_VERSION = 1
14
+
15
+ _REFUSAL_MESSAGE = (
16
+ "Error: Unable to retrieve credentials. "
17
+ "Provide credentials via the CLOUDSMITH_API_KEY environment variable, "
18
+ "credentials.ini, the system keyring, or an OIDC service. "
19
+ "Verify current authentication with `cloudsmith whoami --verbose`."
20
+ )
21
+
22
+
23
+ def build_response(credential):
24
+ """
25
+ Build the versioned credential document.
26
+
27
+ Args:
28
+ credential: Pre-resolved CredentialResult from the provider chain
29
+
30
+ Returns:
31
+ dict: The credential document, or None when no credential is available
32
+ """
33
+ if not credential or not credential.api_key:
34
+ return None
35
+
36
+ return {
37
+ "version": PROTOCOL_VERSION,
38
+ "username": "token",
39
+ "password": credential.api_key,
40
+ }
41
+
42
+
43
+ def execute(credential=None) -> tuple[int, str | None, str | None]:
44
+ """
45
+ Resolve a credential into a versioned JSON document.
46
+
47
+ Args:
48
+ credential: Pre-resolved CredentialResult from the provider chain
49
+
50
+ Returns:
51
+ A (exit_code, stdout_text, stderr_text) tuple. Either text value may
52
+ be None if there is nothing to write to that stream. The document is
53
+ serialised in one step, so a partial document can never be emitted.
54
+ """
55
+ try:
56
+ response = build_response(credential)
57
+ if response is None:
58
+ return (1, None, _REFUSAL_MESSAGE)
59
+
60
+ return (0, json.dumps(response), None)
61
+ except Exception as exc: # pylint: disable=broad-except
62
+ logger.debug("generic credential-helper failed: %s", exc, exc_info=True)
63
+ return (1, None, _REFUSAL_MESSAGE)
@@ -0,0 +1 @@
1
+ 1.21.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudsmith-cli
3
- Version: 1.20.2
3
+ Version: 1.21.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
@@ -51,6 +51,7 @@ cloudsmith_cli/cli/commands/vulnerabilities.py
51
51
  cloudsmith_cli/cli/commands/whoami.py
52
52
  cloudsmith_cli/cli/commands/credential_helper/__init__.py
53
53
  cloudsmith_cli/cli/commands/credential_helper/docker.py
54
+ cloudsmith_cli/cli/commands/credential_helper/generic.py
54
55
  cloudsmith_cli/cli/commands/credential_helper/manage.py
55
56
  cloudsmith_cli/cli/commands/metrics/__init__.py
56
57
  cloudsmith_cli/cli/commands/metrics/command.py
@@ -122,6 +123,7 @@ cloudsmith_cli/credential_helpers/__init__.py
122
123
  cloudsmith_cli/credential_helpers/backends.py
123
124
  cloudsmith_cli/credential_helpers/common.py
124
125
  cloudsmith_cli/credential_helpers/custom_domains.py
126
+ cloudsmith_cli/credential_helpers/generic.py
125
127
  cloudsmith_cli/credential_helpers/launchers.py
126
128
  cloudsmith_cli/credential_helpers/docker/__init__.py
127
129
  cloudsmith_cli/credential_helpers/docker/installer.py
@@ -1 +0,0 @@
1
- 1.20.2
File without changes