Zenve CLI — autonomous agent runtime for GitHub repos
Project description
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 -
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 zenve_cli-0.1.5.tar.gz.
File metadata
- Download URL: zenve_cli-0.1.5.tar.gz
- Upload date:
- Size: 39.6 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43995f6902c58ad79f4343e1f84e2acf09724e1c30767d0d04f017c5a8fc750c
|
|
| MD5 |
9a236b2e80c5272383278ccb5fb74907
|
|
| BLAKE2b-256 |
23426e0d68a5435157c4e655a47eacab385b826e262ac88a89542b8cce4b268a
|
File details
Details for the file zenve_cli-0.1.5-py3-none-any.whl.
File metadata
- Download URL: zenve_cli-0.1.5-py3-none-any.whl
- Upload date:
- Size: 44.5 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20124dac3992f75e0b01c0f95f57d34da29f3e8786f797d31df00eb5d402a626
|
|
| MD5 |
6874e2efc19a83ef5a4d26c8024eb00c
|
|
| BLAKE2b-256 |
8c200590ec78bf58ee30eb97f3233384376fbec1858c3bbd3a8d56a522e2676f
|