- ADR: ADR 0090
- Title: Single
lv3CLI that routes deploy, lint, validate, status, vm, secret, and fixture commands to the right execution target - Status: merged
- Branch:
codex/adr-0090-platform-cli - Worktree:
../proxmox-host_server-platform-cli - Owner: codex
- Depends On:
adr-0075-service-capability-catalog,adr-0082-remote-build-gateway - Conflicts With: none
- Shared Surfaces:
scripts/,Makefile,pyproject.toml,config/
- write
scripts/lv3_cli.py— Python CLI with all 14 command groups documented in the ADR - write
pyproject.toml(or update if it exists) with[project.scripts] lv3 = "scripts.lv3_cli:main"entry point - add
make install-clitarget (pipx editable install) - add
make update-clitarget (re-installs after changes) - implement
lv3 statusreadingconfig/service-capability-catalog.jsonand probing health endpoints concurrently - implement
lv3 deploy <service>routing tomake remote-execwith the correct playbook and tags - implement
lv3 lint,lv3 validaterouting tomake remote-lint,make remote-validate - implement
lv3 vm <create|destroy|resize|list>routing tomake remote-tofu-apply/plan - implement
lv3 fixture <up|down>routing tomake fixture-up/down - implement
lv3 open <service>opening the service URL in the default browser - implement
lv3 ssh <vm-name>resolving VM Tailscale IP from inventory and callingssh ops@<ip> - implement
lv3 logs <service>calling Loki API with the service label filter - implement
lv3 scaffold <name>wrappingmake scaffold-service NAME=<name> - implement shell completion for bash and zsh
- write
docs/runbooks/platform-cli.mdwith install guide and command reference
- a TUI (terminal UI) — plain CLI only for now
- API server mode for the CLI
- Windows support
scripts/lv3_cli.py- updated
pyproject.toml - updated
Makefile(install-cli,update-cli) docs/runbooks/platform-cli.mddocs/adr/0090-unified-platform-cli.mddocs/workstreams/adr-0090-platform-cli.mdworkstreams.yaml
lv3 --versionprints0.1.0(CLI version tracks separately from repo version)lv3 statusshows a health table with all services from the service cataloglv3 lintroutes tomake remote-lintand streams output correctlylv3 --install-completion bashadds completion to~/.bashrc
make install-cliinstallslv3inPATH;lv3 --helpshows all command groupslv3 statusreturns within 5 s with concurrent health probes for all live serviceslv3 deploy grafana --dry-runprints the routedmake remote-execcommand without executing itlv3 open grafanaresolves the catalog URL in the default browser- shell completion tested:
lv3 dep<TAB>completes tolv3 deploy - targeted regression coverage:
uv run --with pytest pytest -q tests/test_lv3_cli.py
- all 14 command groups implemented and pass smoke tests
lv3 statusoutput format matches the layout documented in the ADRdocs/runbooks/platform-cli.mdcomplete with installation, usage examples, and troubleshooting- commands whose dependent ADR surfaces are still absent fail explicitly with actionable errors instead of inventing ad hoc behavior
- The shipped CLI is stdlib-only rather than
click-based so it remains directly runnable aspython3 scripts/lv3_cli.py ...without extra dependency bootstrapping. - VM lifecycle, fixtures, and scaffolding now have CLI routes, but the underlying ADR 0085 / 0088 / 0078 repo surfaces are still separate dependencies; keep that explicit if extending those commands.