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 -
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 | |
|---|---|---|---|
| zenve_cli-0.1.5.tar.gz | 39.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zenve_cli-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
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}
|