The aac platform CLI — headless operator interface to the AAC control plane (tenant registration, chain audit).
Project description
aac-cli — the aac platform CLI
The headless operator interface to the AAC control plane (Eng Spec §XII; Equifax/KPI-6 requirement: every operational task doable without a web console).
Install
pip install aac-cli
Careful with the name:
pip install aacinstalls an UNRELATED project (an MBSE modeling tool that happens to share the acronym). The AAC platform CLI's PyPI distribution isaac-cli; the command it installs isaac— the awscli precedent (dist name ≠ command name).
Two personas, two invocation styles:
- Installed operators (
pip install aac-cli) run the bare command:aac tenant register ... - Repo developers run it through the workspace without installing:
uv run aac ...
The examples below use the bare form; prefix uv run if you're in the
repo.
Week 13 ships the Python argparse SUBSET of §XII's full command surface — the production Go CLI is V5+ scope:
aac configure # interactive; aws-configure semantics
aac configure --profile staging # create/update the [staging] profile
aac configure list # effective settings + source of each
aac tenant register --tenant-id acme.com --display-name "ACME Corporation" \
--workload-spiffe-id spiffe://acme.com/treasury-agent/v1 \
--tenant-admin-pubkey-file ./tenant-admin.public.pem
aac chain show --token-id <64-hex token or chain root> --tenant-id acme.com
aac chain show --token-id <id> --output table
aac chain show --token-id <id> --render --render-out ./aeg.html # headless
aac chain show --token-id <id> --render --open # + browser
Naming: console script = aac (the §XVI-reserved name); import
package = aac_cli (the SDK owns the aac import package);
distribution = aac-cli (decided at first release, B119: bare aac
on PyPI belongs to an unrelated active project and is not claimable).
Configuration
aac configure writes ~/.aac/config (INI, profile-sectioned —
AWS-CLI idiom; override the directory with AAC_CLI_HOME). Prompts
show [current-or-default]; Enter keeps the bracket value:
$ aac configure
admin_url [http://127.0.0.1:8000]:
data_plane_url [http://127.0.0.1:9000]:
tenant_id [None]: acme.com
[default]
admin_url = http://127.0.0.1:8000
data_plane_url = http://127.0.0.1:9000
tenant_id = acme.com
Supplying all three flags (--admin-url / --data-plane-url /
--tenant-id) skips every prompt — scriptable. --profile staging
creates/updates [staging], leaving other sections intact. The file
stays hand-editable INI, but note a rewrite does not preserve
comments (aws-cli behaves the same). aac configure never prompts
for credentials — api_keys are minted at aac tenant register
(deliberate deviation from aws configure).
Precedence: flag > env (AAC_ADMIN_URL / AAC_DATA_PLANE_URL /
AAC_TENANT_ID) > profile > localhost defaults. --profile selects a
section. aac configure list prints each effective setting with its
source (flag / env:AAC_* / profile:<name> / default / unset).
AAC_CLI_HOME — isolated homes
AAC_CLI_HOME relocates the whole ~/.aac tree (config +
credentials). Two everyday uses:
# 1. Throwaway smoke/test home — nothing touches your real config:
AAC_CLI_HOME=/tmp/aac-smoke aac tenant register --tenant-id smoke.example ...
# 2. Multi-account operators — hard-wall separation beyond profiles
# (separate credential files, not just separate config sections):
alias aac-prod='AAC_CLI_HOME=$HOME/.aac-prod aac'
alias aac-staging='AAC_CLI_HOME=$HOME/.aac-staging aac'
Profiles share one credentials directory; AAC_CLI_HOME gives each
context its own.
Credentials: ~/.aac/credentials/{tenant_id}, the bare aac_ak_...
string at mode 0600, written by aac tenant register (the key is
printed EXACTLY ONCE — only its peppered hash exists server-side) and
presented as Authorization: Bearer by aac chain show. Same bare-
string format the joined compose smoke writes into sidecar key dirs.
Choosing a tenant_id
tenant_id is your org's FEDERATION IDENTIFIER — the stable handle
every other tenant verifies your signatures under: it appears in
X-AAC-Originator-Tenant-Id headers, /.well-known/aac-root-keys/ {tenant_id} paths, SIEM stream directories, and supplier whitelists.
Grammar: 1-64 characters of [a-z0-9._-], starting and ending
alphanumeric; an org domain like acme.com is the convention. Pick
it like an AWS account ID: it identifies you to the federation and
cannot be renamed later. --parent-tenant-id takes the parent org's
tenant_id (same grammar) — the server resolves handles to internal
row ids; no database identifier ever crosses the API (B118 D3/D4).
Domain ownership verification (DNS TXT) is a separate, additive
control tracked in the tenant_domains table — the challenge flow
ships in a follow-up increment.
Semantics worth knowing
aac chain showaccepts ANY hop's token id or the chain root id (--root-token-idis an accepted alias); visibility is participant-tenant over the symmetric composite closure (Week 12) — non-participants get the same 404 as unknown tokens.- Timelines are §V.2.1 METADATA-TIER: predicates and business narratives stay in your tenant SIEM stream; the table output's footer says so (§6.1 federated join is the full-fidelity story).
- Exit codes (originator-cli convention): 0 success / 1 server rejected / 2 unreachable / 3 CLI-input error.
Tests
uv run pytest cli/aac/tests/ — pytest-httpx mocks; no control plane
needed. Against a live stack: bring up the joined topology
(./bin/run-wedge-a-control-plane-compose.sh --keep-up) and point the
flags at localhost.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aac_cli-0.1.0.tar.gz.
File metadata
- Download URL: aac_cli-0.1.0.tar.gz
- Upload date:
- Size: 26.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cf5bf32238f77e16b77d5c2057a135a4702c9f84e0b67687635a1244ee6cbd2
|
|
| MD5 |
bc915aa4761dade30fe405cadd6ce446
|
|
| BLAKE2b-256 |
3146948f96e4b579b51a086db6097be4e9e3f7f026d43fb2e67f96ebd40c8a04
|
Provenance
The following attestation bundles were made for aac_cli-0.1.0.tar.gz:
Publisher:
release-cli.yml on CascadeAuth/aac-prototype
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aac_cli-0.1.0.tar.gz -
Subject digest:
4cf5bf32238f77e16b77d5c2057a135a4702c9f84e0b67687635a1244ee6cbd2 - Sigstore transparency entry: 2203413554
- Sigstore integration time:
-
Permalink:
CascadeAuth/aac-prototype@1ab9b9f328107bc07820af24e793e985524c969c -
Branch / Tag:
refs/tags/aac-cli-v0.1.0 - Owner: https://github.com/CascadeAuth
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-cli.yml@1ab9b9f328107bc07820af24e793e985524c969c -
Trigger Event:
push
-
Statement type:
File details
Details for the file aac_cli-0.1.0-py3-none-any.whl.
File metadata
- Download URL: aac_cli-0.1.0-py3-none-any.whl
- Upload date:
- Size: 20.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1cf8e2208ee59fdda2ddab8a4164f36d3be0d875b1dc10f3259ecf7c9f0f5104
|
|
| MD5 |
4a8bd5c8b8dbddc6fda416bbfc557764
|
|
| BLAKE2b-256 |
f1a25fdb431ceaefc66dc4a0c9c6477e8bd44a67755fb7a9725f3b74a75a1297
|
Provenance
The following attestation bundles were made for aac_cli-0.1.0-py3-none-any.whl:
Publisher:
release-cli.yml on CascadeAuth/aac-prototype
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aac_cli-0.1.0-py3-none-any.whl -
Subject digest:
1cf8e2208ee59fdda2ddab8a4164f36d3be0d875b1dc10f3259ecf7c9f0f5104 - Sigstore transparency entry: 2203413577
- Sigstore integration time:
-
Permalink:
CascadeAuth/aac-prototype@1ab9b9f328107bc07820af24e793e985524c969c -
Branch / Tag:
refs/tags/aac-cli-v0.1.0 - Owner: https://github.com/CascadeAuth
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-cli.yml@1ab9b9f328107bc07820af24e793e985524c969c -
Trigger Event:
push
-
Statement type: