aac-cli 0.2.10__tar.gz → 0.2.11__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 (58) hide show
  1. {aac_cli-0.2.10/aac_cli.egg-info → aac_cli-0.2.11}/PKG-INFO +36 -9
  2. {aac_cli-0.2.10 → aac_cli-0.2.11}/README.md +35 -8
  3. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/__init__.py +1 -1
  4. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/admin_key_pem.py +3 -0
  5. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/api_key_rotation_state.py +4 -1
  6. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/cli.py +320 -240
  7. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/config.py +44 -14
  8. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/idp_recovery.py +6 -3
  9. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/registration_state.py +30 -18
  10. aac_cli-0.2.11/aac_cli/safe_output.py +311 -0
  11. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/sso_login.py +363 -58
  12. {aac_cli-0.2.10 → aac_cli-0.2.11/aac_cli.egg-info}/PKG-INFO +36 -9
  13. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli.egg-info/SOURCES.txt +1 -0
  14. {aac_cli-0.2.10 → aac_cli-0.2.11}/pyproject.toml +1 -1
  15. {aac_cli-0.2.10 → aac_cli-0.2.11}/LICENSE +0 -0
  16. {aac_cli-0.2.10 → aac_cli-0.2.11}/MANIFEST.in +0 -0
  17. {aac_cli-0.2.10 → aac_cli-0.2.11}/NOTICE +0 -0
  18. {aac_cli-0.2.10 → aac_cli-0.2.11}/THIRD_PARTY_NOTICES.md +0 -0
  19. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/__main__.py +0 -0
  20. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/__init__.py +0 -0
  21. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/cli.py +0 -0
  22. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/data/action-taken-v1.json +0 -0
  23. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/data/predicates-v1.json +0 -0
  24. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/data/renderer-source.json +0 -0
  25. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/from_sidecar.py +0 -0
  26. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/inputs.py +0 -0
  27. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/model.py +0 -0
  28. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/narrative.py +0 -0
  29. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/provenance.py +0 -0
  30. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/schemas.py +0 -0
  31. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/temporal.py +0 -0
  32. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/theme.py +0 -0
  33. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/timeline_source.py +0 -0
  34. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/_aeg/visualizer.py +0 -0
  35. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/aeg_cli.py +0 -0
  36. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/aeg_list.py +0 -0
  37. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/agent_cli.py +0 -0
  38. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/agent_config.py +0 -0
  39. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/agent_health.py +0 -0
  40. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/agent_layout.py +0 -0
  41. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/agent_record.py +0 -0
  42. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/chain_list.py +0 -0
  43. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/config_render.py +0 -0
  44. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/dev_material.py +0 -0
  45. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/init_cli.py +0 -0
  46. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/interrupts.py +0 -0
  47. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/material_cases.py +0 -0
  48. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/profiles.py +0 -0
  49. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/reference.py +0 -0
  50. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/secure_files.py +0 -0
  51. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/supplied_material.py +0 -0
  52. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli/trace_query.py +0 -0
  53. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli.egg-info/dependency_links.txt +0 -0
  54. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli.egg-info/requires.txt +0 -0
  55. {aac_cli-0.2.10 → aac_cli-0.2.11}/aac_cli.egg-info/top_level.txt +0 -0
  56. {aac_cli-0.2.10 → aac_cli-0.2.11}/launchers/aac +0 -0
  57. {aac_cli-0.2.10 → aac_cli-0.2.11}/launchers/aeg +0 -0
  58. {aac_cli-0.2.10 → aac_cli-0.2.11}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aac-cli
3
- Version: 0.2.10
3
+ Version: 0.2.11
4
4
  Summary: The aac platform CLI — headless operator interface to the AAC control plane (tenant registration, chain audit).
5
5
  Author: Agent Authority Cloud Project
6
6
  License-Expression: Apache-2.0
@@ -46,8 +46,8 @@ The `aac` command is how a tenant's operator does everything that is not
46
46
  done by the sidecar itself: register the tenant, sign in, manage keys,
47
47
  workloads and domains, and prepare a runnable local workload. Everything
48
48
  works from a terminal or a script; there is no web console to click
49
- through. Output is JSON by default, and every command that reports a
50
- result also offers `--output table`.
49
+ through. Output is JSON by default. Commands that support table output offer
50
+ `--output table`; `aac sso describe` returns JSON only.
51
51
 
52
52
  Two kinds of tenant use the same tool:
53
53
 
@@ -857,8 +857,16 @@ aac sso logout --profile stage
857
857
  A developer tenant signs in with `--idp github` or `--idp google`; if you
858
858
  need another sign-in provider, contact support@cascadeauth.com. An
859
859
  enterprise tenant signs in through its Microsoft Entra ID connection, named
860
- by the connection's exact URL with `--idp-url`; when several connections
861
- are registered, the error message lists the exact commands to choose one.
860
+ by the connection's exact URL with `--idp-url`. With neither flag, the
861
+ tenant's own connections take precedence over the shared developer sign-ins;
862
+ when several remain, a terminal shows a numbered list to choose from and then
863
+ prints the flag that skips the prompt next time, while a script (no terminal)
864
+ gets exit 3 and one copy-ready command per connection. The list marks which
865
+ connection the cached session was last obtained through; it never shows
866
+ which connections have members. A developer tenant admits only the provider
867
+ and account it was registered with: when the AAC STS does not accept a shared
868
+ sign-in, the CLI reminds you of that rule and lists any other shared sign-ins. GitHub connections accept the device flow
869
+ only: `--flow pkce` with a GitHub connection stops locally with exit 3.
862
870
 
863
871
  Sessions last **4 hours by default**. Your administrator may configure a
864
872
  different lifetime for the deployment or connection. You can run
@@ -868,12 +876,20 @@ with the four-hour default, signing in at 09:00 gives an expiry of 13:00;
868
876
  signing in successfully again at 12:00 gives the new session an expiry of 16:00.
869
877
  Use `aac sso whoami --profile NAME --output table` to check the current
870
878
  expiration. If the session expires, sign in again; no refresh token is issued.
879
+ A command that needs a session stops locally with exit 3 when none is cached,
880
+ before anything is sent, and prints the `aac sso login` command for the same
881
+ profile and endpoints; commands that also accept a bootstrap token name that
882
+ alternative.
871
883
 
872
884
  Sign-in uses the device flow by default, so the browser can be on another
873
- machine and headless hosts work. Google connections use a loopback flow
874
- instead, because Google's device flow is scope-restricted; `--flow`
875
- overrides the choice. `whoami` and `logout` work offline and never contact
876
- AAC.
885
+ machine and headless hosts work. On a terminal with a browser at hand
886
+ (macOS, a desktop session, or `BROWSER` set), the device flow also offers to
887
+ open the sign-in page for you: press Enter to open it in your browser, or copy
888
+ the printed link and code into a browser yourself; `--no-browser` turns the
889
+ offer off, and a script (no terminal) or a headless host never sees it. Google
890
+ connections use a loopback flow instead, because Google's device flow is
891
+ scope-restricted; `--flow` overrides the choice. `whoami` and `logout` work
892
+ offline and never contact AAC.
877
893
 
878
894
  ## Output and exit codes
879
895
 
@@ -921,6 +937,17 @@ a callback gives up after 300 seconds with exit `3`. HTTP timeouts remain exit
921
937
  If AAC asks you to slow down, the command shows the interval to wait. The
922
938
  CLI never replays a change on its own; wait and rerun deliberately.
923
939
 
940
+ The commands that can present a ceremony token (`aac tenant register`,
941
+ `reissue-api-key`, `assign-hosted-domain`, `reactivate-hosted-domain`,
942
+ `bind-trust-domain`, `list-trust-domains`, `revoke-trust-domain`,
943
+ `rotate-admin-key`, `aac sso register-idp`, `enroll-idp-recovery-key` and
944
+ `approve-idp-repair`) and `aac sso login` report a failure by HTTP status and
945
+ AAC error code only, never the server's message or response body, because
946
+ either can echo the credential the request carried; their transport failures
947
+ show the error class and the operating system's reason, not the library's
948
+ text. Other commands still print the server's message with the status and
949
+ code.
950
+
924
951
  ## Enterprise tenants
925
952
 
926
953
  Enterprise tenants are registered through an onboarding ceremony: AAC
@@ -19,8 +19,8 @@ The `aac` command is how a tenant's operator does everything that is not
19
19
  done by the sidecar itself: register the tenant, sign in, manage keys,
20
20
  workloads and domains, and prepare a runnable local workload. Everything
21
21
  works from a terminal or a script; there is no web console to click
22
- through. Output is JSON by default, and every command that reports a
23
- result also offers `--output table`.
22
+ through. Output is JSON by default. Commands that support table output offer
23
+ `--output table`; `aac sso describe` returns JSON only.
24
24
 
25
25
  Two kinds of tenant use the same tool:
26
26
 
@@ -830,8 +830,16 @@ aac sso logout --profile stage
830
830
  A developer tenant signs in with `--idp github` or `--idp google`; if you
831
831
  need another sign-in provider, contact support@cascadeauth.com. An
832
832
  enterprise tenant signs in through its Microsoft Entra ID connection, named
833
- by the connection's exact URL with `--idp-url`; when several connections
834
- are registered, the error message lists the exact commands to choose one.
833
+ by the connection's exact URL with `--idp-url`. With neither flag, the
834
+ tenant's own connections take precedence over the shared developer sign-ins;
835
+ when several remain, a terminal shows a numbered list to choose from and then
836
+ prints the flag that skips the prompt next time, while a script (no terminal)
837
+ gets exit 3 and one copy-ready command per connection. The list marks which
838
+ connection the cached session was last obtained through; it never shows
839
+ which connections have members. A developer tenant admits only the provider
840
+ and account it was registered with: when the AAC STS does not accept a shared
841
+ sign-in, the CLI reminds you of that rule and lists any other shared sign-ins. GitHub connections accept the device flow
842
+ only: `--flow pkce` with a GitHub connection stops locally with exit 3.
835
843
 
836
844
  Sessions last **4 hours by default**. Your administrator may configure a
837
845
  different lifetime for the deployment or connection. You can run
@@ -841,12 +849,20 @@ with the four-hour default, signing in at 09:00 gives an expiry of 13:00;
841
849
  signing in successfully again at 12:00 gives the new session an expiry of 16:00.
842
850
  Use `aac sso whoami --profile NAME --output table` to check the current
843
851
  expiration. If the session expires, sign in again; no refresh token is issued.
852
+ A command that needs a session stops locally with exit 3 when none is cached,
853
+ before anything is sent, and prints the `aac sso login` command for the same
854
+ profile and endpoints; commands that also accept a bootstrap token name that
855
+ alternative.
844
856
 
845
857
  Sign-in uses the device flow by default, so the browser can be on another
846
- machine and headless hosts work. Google connections use a loopback flow
847
- instead, because Google's device flow is scope-restricted; `--flow`
848
- overrides the choice. `whoami` and `logout` work offline and never contact
849
- AAC.
858
+ machine and headless hosts work. On a terminal with a browser at hand
859
+ (macOS, a desktop session, or `BROWSER` set), the device flow also offers to
860
+ open the sign-in page for you: press Enter to open it in your browser, or copy
861
+ the printed link and code into a browser yourself; `--no-browser` turns the
862
+ offer off, and a script (no terminal) or a headless host never sees it. Google
863
+ connections use a loopback flow instead, because Google's device flow is
864
+ scope-restricted; `--flow` overrides the choice. `whoami` and `logout` work
865
+ offline and never contact AAC.
850
866
 
851
867
  ## Output and exit codes
852
868
 
@@ -894,6 +910,17 @@ a callback gives up after 300 seconds with exit `3`. HTTP timeouts remain exit
894
910
  If AAC asks you to slow down, the command shows the interval to wait. The
895
911
  CLI never replays a change on its own; wait and rerun deliberately.
896
912
 
913
+ The commands that can present a ceremony token (`aac tenant register`,
914
+ `reissue-api-key`, `assign-hosted-domain`, `reactivate-hosted-domain`,
915
+ `bind-trust-domain`, `list-trust-domains`, `revoke-trust-domain`,
916
+ `rotate-admin-key`, `aac sso register-idp`, `enroll-idp-recovery-key` and
917
+ `approve-idp-repair`) and `aac sso login` report a failure by HTTP status and
918
+ AAC error code only, never the server's message or response body, because
919
+ either can echo the credential the request carried; their transport failures
920
+ show the error class and the operating system's reason, not the library's
921
+ text. Other commands still print the server's message with the status and
922
+ code.
923
+
897
924
  ## Enterprise tenants
898
925
 
899
926
  Enterprise tenants are registered through an onboarding ceremony: AAC
@@ -10,4 +10,4 @@ entrypoint (`aac_cli.cli:entrypoint`).
10
10
  # test in bin/tests/test_cli_version_parity.py. A literal keeps the
11
11
  # shipped code free of import-time metadata lookups (and their
12
12
  # not-installed failure mode).
13
- __version__ = "0.2.10"
13
+ __version__ = "0.2.11"
@@ -223,6 +223,9 @@ def require_ed25519_public_key_pem(text: str) -> str:
223
223
  try:
224
224
  der = base64.b64decode(encoded, validate=True)
225
225
  except (binascii.Error, ValueError) as exc:
226
+ # The decoder's text names the fault ("Incorrect padding", a bad
227
+ # character's position) and never quotes the data, which is what keeps
228
+ # AdminKeyPemError on the CLI-composed list of the diagnostic contract.
226
229
  raise AdminKeyPemError(f"PEM body is not valid base64: {exc}") from exc
227
230
 
228
231
  if len(der) != _ED25519_SPKI_LENGTH or not der.startswith(_ED25519_SPKI_PREFIX):
@@ -16,6 +16,7 @@ from aac_cli.config import (
16
16
  cli_home,
17
17
  credentials_path,
18
18
  )
19
+ from aac_cli.safe_output import failure_class
19
20
 
20
21
  __all__ = [
21
22
  "ROTATION_STATE_WARNING",
@@ -97,7 +98,9 @@ def read_rotation_state(profile: str) -> RotationIssueState | None:
97
98
  except FileNotFoundError:
98
99
  return None
99
100
  except OSError as exc:
100
- raise CliConfigError(f"cannot read API-key rotation state {path}: {exc}") from exc
101
+ raise CliConfigError(
102
+ f"cannot read API-key rotation state {path}: {failure_class(exc)}"
103
+ ) from exc
101
104
  if len(raw) > _MAX_STATE_BYTES:
102
105
  raise CliConfigError(f"API-key rotation state {path} exceeds {_MAX_STATE_BYTES} bytes")
103
106
  try: