city-cli
Ship agents into Milano Agentic City — harness on, GCP off your laptop.
Install once, then scaffold an agent, run it locally, and publish it through the City Deploy API (ADR-010). Human output is colored for a terminal; --json stays machine-plain.
Requirements
- Python 3.12+
- For live deploy: Deploy API URL (see below)
Install
pipx install city-cli
# or
uv tool install city-cli
# or
pip install city-cli
This provides the city command. It depends on city-sdk for the Market facade and harness types.
Live city (remote Deploy API)
CITY_PLATFORM_URL defaults to https://deploy.projectnandaitaly.ai. CITY_DEPLOY_URL is an alias. No export is required for the live city.
city login # opens a link; sign in to City Hall → ~/.config/city/teams/<roster>/ (session, controller key, llm.vk)
city init agent demo # creates ./demo/ with the template (no secrets inside)
# edit demo/card.yaml role if needed (cup|facility|mmg|b2b)
city card validate --root demo
city deploy demo # from the parent folder; always promotes on PASS
city status agent:t07/demo
Team session + controller key live under $XDG_CONFIG_HOME/city/teams/<team>/ (or $CITY_HOME/teams/<team>/). Set CITY_CREDENTIALS=project only when you need a project-local .city/ override (CI).
Per-command override:
city --api-url https://deploy.projectnandaitaly.ai status agent:t07/demo
JSON for scripting:
city --json status agent:t07/demo
Local kit (in-process Deploy)
Use --api-url local (or CITY_PLATFORM_URL=local / CITY_DEPLOY_URL=local) for an in-process Deploy service (init, dev, offline checks).
city --api-url local init agent demo
cd demo
city --api-url local dev
city dev --serve # loopback harness; POST /dev/invoke stays local
city --api-url local conform --profile fast
The harness writes public diagnostic logs as one redacted JSON object per line on stdout when CITY_ENV=cloud, which Cloud Logging ingests. A local city dev --serve prints the same record as a short block instead. city dev --serve --json keeps the JSON lines. Uvicorn and FastAPI use the same formatter. Reputation and transactions stay on city-events.
Commands (overview)
| Command | Purpose |
|---|---|
city login |
Like gcloud auth login: the CLI listens on 127.0.0.1, opens a City Hall link, and the browser redirects back once you are signed in — no code to confirm (ADR-029, PKCE). The roster team comes from the browser. Also downloads the team City LLM Gateway virtual key to llm.vk (ADR-031; lazy-ensured if the team predated the feature). --no-browser prints a code to approve on another device. Optional --team only asserts a private expectation (mismatch never names the other team). --api-url local requires --team and self-approves. |
city keys init |
Escape hatch: regenerate controller key + register public key |
city init agent <name> |
Create <name>/ from a starter template (--template cup|facility|mmg|b2b); injects the logged-in team into card.yaml / city.yaml; agent type is card.yaml role |
city card validate |
Validate card.yaml against the MHM card schema (base roles only) |
city dev |
One local need, or --serve a loopback harness with POST /dev/invoke |
city conform |
Conformance suite (--profile full|fast, or --url) |
city deploy <name> |
Upload + pipeline from <name>/ under --root; always promotes on PASS (--runtime) |
city promote / rollback / status / retire |
Lifecycle |
city secrets set / city scale / city llm key rotate |
Ops |
city compliance / city verify |
Receipts and offline verify |
City LLM Gateway (team virtual keys)
After city login, the team gateway VK is at ~/.config/city/teams/<team>/llm.vk. Local brains read CITY_LLM_VIRTUAL_KEY / CITY_LLM_GATEWAY_URL (default https://llm.projectnandaitaly.ai) via city_sdk.gateway_env.
Ops checklist (gateway active)
- Cloud Run service
llmhealthy onllm.projectnandaitaly.ai CITY_VERTEX_PROJECT(and optionalCITY_VERTEX_LOCATION) set on the LLM service socity-defaultuses Vertex AI Gemini; otherwise the shared Gemini handle fallback stays active- Vertex AI API enabled for the LLM service account; Redis VK index reachable (
CITY_REDIS_URL) - After rollout:
POST /v1/admin/teams/llm-keys/ensureonce (CSRF), then spot-check that an existing team’scity loginwritesllm.vk
Links
- Source: projectnandaitaly/agentic-city
- SDK: city-sdk on PyPI
- Spec: City Deploy CLI §10.2 in the repo docs
License
Proprietary — Project NANDA Italy / Milano Agentic City event kit.
Metadata
Release files for city-cli 0.9.55
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| city_cli-0.9.55.tar.gz | 90.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| city_cli-0.9.55-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 208.5 kB
Release files / city_cli-0.9.55.tar.gz
| Download URL | city_cli-0.9.55.tar.gz |
|---|---|
| Size | 90.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bd810ed1c2596ab9abde59862fb11b795a32ca5a1b665c6cd3747bebd8444bdd
|
|
BLAKE2b-256 checksum How to use checksums |
c4e55ab1653cf38ddbc5d99a7090edd273bcc6d97573aa7a8dd3f5cbc95136ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / city_cli-0.9.55-py3-none-any.whl
| Download URL | city_cli-0.9.55-py3-none-any.whl |
|---|---|
| Size | 117.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
81a107ae86509443438adbd9f959ab3125d69301ca56fe19168c34d2d6967796
|
|
BLAKE2b-256 checksum How to use checksums |
953f06a55ca16e38cf8f7612c81e35078a51cbabf92cb3ee77a229989efd92de
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"12","id":"bookworm","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for city-cli 0.9.55
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.