dh-cli 0.8.4__tar.gz → 0.8.6__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.
- {dh_cli-0.8.4 → dh_cli-0.8.6}/PKG-INFO +1 -1
- {dh_cli-0.8.4 → dh_cli-0.8.6}/pyproject.toml +1 -1
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/bedrock/commands.py +5 -1
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/github_commands.py +7 -5
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_image_override.py +1 -2
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_submit_image_validation.py +2 -6
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_key_command.py +15 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/.gitignore +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/LICENSE +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/README.md +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/__init__.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/_identity.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/__init__.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/aws_batch.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/__init__.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/boltz.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/cancel.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/clean.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/embed_t5.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/finalize.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/list_jobs.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/local.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/logs.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/orca.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/protmpnn.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/protmpnn_to_boltz.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/retry.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/status.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/submit.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/train.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/wait_for.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/fasta_utils.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/h5_utils.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/job_id.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/manifest.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/s3_transport.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/bedrock/__init__.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/bedrock/cost_report.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/bedrock/pricing.yaml +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/cloud_commands.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/codeartifact.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/__init__.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/api_client.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/auth.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/engine_commands.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/progress.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/ssh_config.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/studio_commands.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/__init__.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/deploy.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/local.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/test.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/tf.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/users.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/main.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/utility_commands.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/warehouse.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/__init__.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_aws_batch_resources.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_submit_cpu_only.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_submit_merge.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/conftest.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/A_cache_write.json +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/B_cache_read.json +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/C_plain.json +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/D_cursor_user.json +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/E_service_role.json +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/F_legacy_shared.json +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/G_unknown_model.json +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_build_report.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_classify_arn.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_cli_exit_codes.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_cost_calc.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_cost_command.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_cur_reconciliation.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_render_formats.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_resolve_base_model.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_s3_walker.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/__init__.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/conftest.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_engine_role_cannot_read_github_pat.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_identity.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_login.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_login_error_paths.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_login_security.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_logout.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_rotate.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_status.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/hz/test_init.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/hz/test_suites.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/hz/test_users.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/test_cloud_gcp.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/test_finalize_boltz_tar.py +0 -0
- {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/test_finalize_protmpnn.py +0 -0
|
@@ -80,7 +80,11 @@ def _resolve_handle_from_sts() -> str:
|
|
|
80
80
|
)
|
|
81
81
|
|
|
82
82
|
principal = cr.classify_arn(arn)
|
|
83
|
-
|
|
83
|
+
# Accept any AWSReservedSSO_* session: DeveloperAccess,
|
|
84
|
+
# DevAdminAccess, SecurityAdministrator, etc. all carry the
|
|
85
|
+
# IdC username as the role-session-name, which is what we want
|
|
86
|
+
# as the developer handle.
|
|
87
|
+
if principal.principal_type in ("claude-code", "claude-code-other", "cursor"):
|
|
84
88
|
return principal.principal_name
|
|
85
89
|
raise click.ClickException(
|
|
86
90
|
f"Couldn't infer a developer handle from your identity ({arn}). Pass --handle explicitly."
|
|
@@ -169,8 +169,9 @@ def _access_denied_diagnosis(session, requested_handle: str) -> None:
|
|
|
169
169
|
typer.echo(
|
|
170
170
|
RED
|
|
171
171
|
+ "Access denied reading the GitHub PAT secret. "
|
|
172
|
-
+ "
|
|
173
|
-
+ "
|
|
172
|
+
+ "Check that you're on the dev-devaccess profile with "
|
|
173
|
+
+ "a live SSO session: `dh aws status`. If the session "
|
|
174
|
+
+ "is expired, run `awslogin dev-devaccess` and retry."
|
|
174
175
|
+ NC,
|
|
175
176
|
err=True,
|
|
176
177
|
)
|
|
@@ -690,9 +691,10 @@ def gh_rotate(
|
|
|
690
691
|
if code == "AccessDeniedException":
|
|
691
692
|
typer.echo(
|
|
692
693
|
RED
|
|
693
|
-
+ f"Access denied writing `{secret_id}`.
|
|
694
|
-
+ "
|
|
695
|
-
+ "
|
|
694
|
+
+ f"Access denied writing `{secret_id}`. Check that "
|
|
695
|
+
+ "you're on the dev-devaccess profile with a live "
|
|
696
|
+
+ "SSO session: `dh aws status`. If the session is "
|
|
697
|
+
+ "expired, run `awslogin dev-devaccess` and retry."
|
|
696
698
|
+ NC,
|
|
697
699
|
err=True,
|
|
698
700
|
)
|
|
@@ -57,8 +57,7 @@ class TestImageValidation:
|
|
|
57
57
|
[
|
|
58
58
|
"123456789012.dkr.ecr.us-east-1.amazonaws.com/dayhoff-generic:abc123",
|
|
59
59
|
"123456789012.dkr.ecr.us-west-2.amazonaws.com/foo/bar:latest",
|
|
60
|
-
"123456789012.dkr.ecr.us-east-1.amazonaws.com/x@sha256:"
|
|
61
|
-
+ "a" * 64,
|
|
60
|
+
"123456789012.dkr.ecr.us-east-1.amazonaws.com/x@sha256:" + "a" * 64,
|
|
62
61
|
],
|
|
63
62
|
)
|
|
64
63
|
def test_accepts_ecr_url(self, good_image):
|
|
@@ -63,9 +63,7 @@ class TestCliImageValidation:
|
|
|
63
63
|
}
|
|
64
64
|
)
|
|
65
65
|
)
|
|
66
|
-
result, _, mock_batch_cls = _invoke(
|
|
67
|
-
cli_runner, ["-f", str(config_path)], tmp_path
|
|
68
|
-
)
|
|
66
|
+
result, _, mock_batch_cls = _invoke(cli_runner, ["-f", str(config_path)], tmp_path)
|
|
69
67
|
assert result.exit_code != 0
|
|
70
68
|
assert "fully-qualified ECR URL" in result.output
|
|
71
69
|
mock_batch_cls.assert_not_called()
|
|
@@ -82,9 +80,7 @@ class TestCliImageValidation:
|
|
|
82
80
|
assert call_kwargs["image_override"] == good
|
|
83
81
|
|
|
84
82
|
def test_no_image_skips_validation(self, cli_runner, tmp_path):
|
|
85
|
-
result, mock_client, _ = _invoke(
|
|
86
|
-
cli_runner, ["--command", "echo hi"], tmp_path
|
|
87
|
-
)
|
|
83
|
+
result, mock_client, _ = _invoke(cli_runner, ["--command", "echo hi"], tmp_path)
|
|
88
84
|
assert result.exit_code == 0, result.output
|
|
89
85
|
call_kwargs = mock_client.submit_job.call_args[1]
|
|
90
86
|
assert call_kwargs.get("image_override") is None
|
|
@@ -110,3 +110,18 @@ def test_key_unrecognised_caller_arn_exits_with_hint():
|
|
|
110
110
|
result = _invoke([])
|
|
111
111
|
assert result.exit_code != 0
|
|
112
112
|
assert "--handle" in result.output
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_key_resolves_handle_from_dev_admin_access_session():
|
|
116
|
+
"""DevAdminAccess (and any other AWSReservedSSO_* role) must resolve
|
|
117
|
+
to the session-name as the developer handle. Regression: earlier the
|
|
118
|
+
gate only accepted DeveloperAccess sessions, which broke `dh bedrock
|
|
119
|
+
key` for anyone running under an admin profile."""
|
|
120
|
+
sts = _build_sts_stub(
|
|
121
|
+
"arn:aws:sts::074735440724:assumed-role/AWSReservedSSO_DevAdminAccess_2506d659c73583cc/dma"
|
|
122
|
+
)
|
|
123
|
+
sm = _build_sm_stub()
|
|
124
|
+
with _patch_boto3(sts=sts, sm=sm):
|
|
125
|
+
result = _invoke([])
|
|
126
|
+
assert result.exit_code == 0, result.output
|
|
127
|
+
sm.get_secret_value.assert_called_once_with(SecretId="cursor-bedrock/dma")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|