zenve-cli
Autonomous agent runtime for a GitHub repo. No daemon, no server, no database — state lives in .zenve/ inside the repo.
See ARCHITECTURE.md for the full design.
Install
uv tool install zenve-cli # recommended
pipx install zenve-cli # alternative
Upgrade:
uv tool upgrade zenve-cli
From source (for development)
The CLI is a uv workspace member. From server/:
uv sync --package zenve-cli
Environment
Required:
| Var | Purpose |
|---|---|
ZENVE_GH_TOKEN |
GitHub PAT with repo + issues scope (falls back to gh auth token) |
Per-agent (optional):
| Var | Purpose |
|---|---|
ZENVE_GH_{SLUG} |
Agent-specific GitHub token (e.g. ZENVE_GH_CODE_REVIEW for slug code-review) |
Optional:
| Var | Purpose |
|---|---|
ZENVE_WEBHOOK_URL |
POST structured events here |
ZENVE_WEBHOOK_SECRET |
HMAC-SHA256 secret for X-Zenve-Signature |
Note: Run ID is generated automatically. No
ANTHROPIC_API_KEYneeded at the CLI level — agent adapters pick up their own credentials.
Commands
zenve run Run all enabled agents
zenve run --agent dev Run only one agent
zenve run --dry-run Show plan, no writes
zenve snapshot Fetch GitHub state → .zenve/snapshot.json
zenve pipeline Display + validate the pipeline
zenve status Last run per agent
zenve init Scaffold .zenve/ interactively
zenve doctor Check repo setup
zenve agent ls List agents and enabled/disabled status
zenve agent logs <name> Run history for an agent
zenve agent enable <name> Enable an agent
zenve agent disable <name> Disable an agent
zenve skills list List available skills
All commands accept --repo PATH (default .).
Repo layout expected
The CLI does not scaffold .zenve/ by hand — use zenve init instead. Expected layout:
.zenve/
settings.json project config + pipeline map
agents/
{name}/
settings.json label, adapter, model, picks_up, mode
runs/ run result files (committed)
.zenve/snapshot.json is ephemeral and never committed.
Local dev loop
cd my-project
export ZENVE_GH_TOKEN=ghp_... # or: gh auth login
uv run --package zenve-cli zenve doctor
uv run --package zenve-cli zenve run --dry-run
uv run --package zenve-cli zenve run
Or via the justfile at server/:
just cli run --dry-run
Execution model
- Resolve GitHub token (
ZENVE_GH_TOKENorgh auth token). - Load
.zenve/settings.jsonand scan.zenve/agents/*(skipenabled: false). - Fetch a fresh GitHub snapshot →
.zenve/snapshot.json. asyncio.gatherover all enabled agents:- Filter snapshot by
github_label+picks_up. - Claim the oldest unclaimed item (
zenve:claimedlabel via GitHub API). - If
modeisartifact_prorcode_pr: create a git worktree on a new branch. - Invoke the adapter (
claude_code/open_code) against the agent dir. - On success: commit + push changes, open a PR (and auto-merge if
artifact_pr). - Post-exit label transition using the pipeline map.
- Write
.zenve/agents/{name}/runs/{run_id}.json.
- Filter snapshot by
git add .zenve/agents; commit with[zenve]prefix; push.
--dry-run skips claim, adapter execution, label writes, and commit.
Events
Every stage emits a structured event to .zenve/events.log (one JSON per line) and, if ZENVE_WEBHOOK_URL is set, POSTs the same JSON signed with X-Zenve-Signature: sha256=<hmac>.
See ARCHITECTURE.md for the event-type list.
Release workflow
When tagging a new release:
# Generate/update CHANGELOG.md
git-cliff --output CHANGELOG.md
# Commit the changelog
git add CHANGELOG.md
git commit -m "chore: update changelog for v1.0.0"
# Tag and push
git tag v1.0.0
git push && git push --tags
To preview only the next release (unreleased commits):
git-cliff --unreleased
To create a GitHub release with the changelog body:
git-cliff --unreleased --strip header | gh release create v1.0.0 --notes-file -
Metadata
Release files for zenve-cli 0.1.5
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 | Actions |
|---|---|---|---|---|
| zenve_cli-0.1.5.tar.gz | 39.6 kB | Without provenance | Details for zenve_cli-0.1.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| zenve_cli-0.1.5-py3-none-any.whl | Python 3 | none | any | Details for zenve_cli-0.1.5-py3-none-any.whl |
Total release size: 84.2 kB
Release files / zenve_cli-0.1.5.tar.gz
| Download URL | zenve_cli-0.1.5.tar.gz |
|---|---|
| Size | 39.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
43995f6902c58ad79f4343e1f84e2acf09724e1c30767d0d04f017c5a8fc750c
|
|
BLAKE2b-256 checksum How to use checksums |
23426e0d68a5435157c4e655a47eacab385b826e262ac88a89542b8cce4b268a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / zenve_cli-0.1.5-py3-none-any.whl
| Download URL | zenve_cli-0.1.5-py3-none-any.whl |
|---|---|
| Size | 44.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
20124dac3992f75e0b01c0f95f57d34da29f3e8786f797d31df00eb5d402a626
|
|
BLAKE2b-256 checksum How to use checksums |
8c200590ec78bf58ee30eb97f3233384376fbec1858c3bbd3a8d56a522e2676f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for zenve-cli 0.1.5
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.