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.
Files changed (94) hide show
  1. {dh_cli-0.8.4 → dh_cli-0.8.6}/PKG-INFO +1 -1
  2. {dh_cli-0.8.4 → dh_cli-0.8.6}/pyproject.toml +1 -1
  3. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/bedrock/commands.py +5 -1
  4. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/github_commands.py +7 -5
  5. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_image_override.py +1 -2
  6. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_submit_image_validation.py +2 -6
  7. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_key_command.py +15 -0
  8. {dh_cli-0.8.4 → dh_cli-0.8.6}/.gitignore +0 -0
  9. {dh_cli-0.8.4 → dh_cli-0.8.6}/LICENSE +0 -0
  10. {dh_cli-0.8.4 → dh_cli-0.8.6}/README.md +0 -0
  11. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/__init__.py +0 -0
  12. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/_identity.py +0 -0
  13. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/__init__.py +0 -0
  14. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/aws_batch.py +0 -0
  15. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/__init__.py +0 -0
  16. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/boltz.py +0 -0
  17. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/cancel.py +0 -0
  18. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/clean.py +0 -0
  19. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/embed_t5.py +0 -0
  20. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/finalize.py +0 -0
  21. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/list_jobs.py +0 -0
  22. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/local.py +0 -0
  23. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/logs.py +0 -0
  24. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/orca.py +0 -0
  25. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/protmpnn.py +0 -0
  26. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/protmpnn_to_boltz.py +0 -0
  27. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/retry.py +0 -0
  28. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/status.py +0 -0
  29. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/submit.py +0 -0
  30. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/train.py +0 -0
  31. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/commands/wait_for.py +0 -0
  32. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/fasta_utils.py +0 -0
  33. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/h5_utils.py +0 -0
  34. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/job_id.py +0 -0
  35. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/manifest.py +0 -0
  36. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/batch/s3_transport.py +0 -0
  37. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/bedrock/__init__.py +0 -0
  38. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/bedrock/cost_report.py +0 -0
  39. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/bedrock/pricing.yaml +0 -0
  40. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/cloud_commands.py +0 -0
  41. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/codeartifact.py +0 -0
  42. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/__init__.py +0 -0
  43. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/api_client.py +0 -0
  44. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/auth.py +0 -0
  45. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/engine_commands.py +0 -0
  46. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/progress.py +0 -0
  47. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/ssh_config.py +0 -0
  48. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/engines_studios/studio_commands.py +0 -0
  49. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/__init__.py +0 -0
  50. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/deploy.py +0 -0
  51. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/local.py +0 -0
  52. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/test.py +0 -0
  53. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/tf.py +0 -0
  54. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/hz/users.py +0 -0
  55. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/main.py +0 -0
  56. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/utility_commands.py +0 -0
  57. {dh_cli-0.8.4 → dh_cli-0.8.6}/src/dh_cli/warehouse.py +0 -0
  58. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/__init__.py +0 -0
  59. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_aws_batch_resources.py +0 -0
  60. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_submit_cpu_only.py +0 -0
  61. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/batch/test_submit_merge.py +0 -0
  62. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/conftest.py +0 -0
  63. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/A_cache_write.json +0 -0
  64. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/B_cache_read.json +0 -0
  65. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/C_plain.json +0 -0
  66. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/D_cursor_user.json +0 -0
  67. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/E_service_role.json +0 -0
  68. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/F_legacy_shared.json +0 -0
  69. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/fixtures/G_unknown_model.json +0 -0
  70. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_build_report.py +0 -0
  71. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_classify_arn.py +0 -0
  72. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_cli_exit_codes.py +0 -0
  73. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_cost_calc.py +0 -0
  74. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_cost_command.py +0 -0
  75. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_cur_reconciliation.py +0 -0
  76. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_render_formats.py +0 -0
  77. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_resolve_base_model.py +0 -0
  78. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/bedrock/test_s3_walker.py +0 -0
  79. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/__init__.py +0 -0
  80. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/conftest.py +0 -0
  81. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_engine_role_cannot_read_github_pat.py +0 -0
  82. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_identity.py +0 -0
  83. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_login.py +0 -0
  84. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_login_error_paths.py +0 -0
  85. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_login_security.py +0 -0
  86. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_logout.py +0 -0
  87. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_rotate.py +0 -0
  88. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/github/test_status.py +0 -0
  89. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/hz/test_init.py +0 -0
  90. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/hz/test_suites.py +0 -0
  91. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/hz/test_users.py +0 -0
  92. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/test_cloud_gcp.py +0 -0
  93. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/test_finalize_boltz_tar.py +0 -0
  94. {dh_cli-0.8.4 → dh_cli-0.8.6}/tests/test_finalize_protmpnn.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dh-cli
3
- Version: 0.8.4
3
+ Version: 0.8.6
4
4
  Summary: Dayhoff Labs developer CLI
5
5
  Author-email: Dayhoff Labs <dev@dayhofflabs.com>
6
6
  License: # PolyForm Noncommercial License 1.0.0
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dh-cli"
7
- version = "0.8.4"
7
+ version = "0.8.6"
8
8
  description = "Dayhoff Labs developer CLI"
9
9
  requires-python = ">=3.11"
10
10
  readme = "README.md"
@@ -80,7 +80,11 @@ def _resolve_handle_from_sts() -> str:
80
80
  )
81
81
 
82
82
  principal = cr.classify_arn(arn)
83
- if principal.principal_type in ("claude-code", "cursor"):
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
- + "Most likely your SSO MFA is >1h old. "
173
- + "Run `awslogin dev-devaccess` and retry."
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}`. Most likely "
694
- + "your SSO MFA is >1h old. Run `awslogin "
695
- + "dev-devaccess` and retry."
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