Autonomous CLI supervisor for staged AI workflows
Project description
cybervisor
cybervisor is an autonomous CLI supervisor for development runs. It executes a customizable multi-stage pipeline with Gemini CLI, Claude Code, or Codex, installs runtime hooks for non-interactive execution, and enforces structured stage-result contracts.
What it does
- Runs a customizable multi-stage pipeline defined in
cybervisor.yaml - Enforces structured stage-result contracts with artifact-driven routing
- Installs runtime hooks for fully non-interactive agent execution
- Streams live agent output and persists per-stage logs
- Cleans up agent-spawned processes after each stage and on pipeline exit
- Snapshots and restores agent settings automatically
- Enforces single-instance execution with a daemon-aware lock
- Daemon mode: Long-running WebSocket server for headless execution
- Daemon client commands:
status,submit,attach,cancel,logs,end
Requirements
- Python 3.11+
uv- One of:
geminionPATHclaudeonPATHcodexonPATH
~/.cybervisor/config.yamlwith verifier settings
Installation
Install the CLI onto your PATH:
uv tool install cybervisor
After installation, verify:
cybervisor --version
To update an existing installation later:
uv tool upgrade cybervisor
cybervisor --version
For the full update guide, run:
cybervisor docs updating
Quick Start
Initialize the cybervisor scaffold in your project:
cybervisor init
Set your global default agent:
cybervisor use claude
Configure your verifier settings in ~/.cybervisor/config.yaml (created with 0o600 permissions):
agent_tool: claude
llm:
api_key: your-api-key
# Optional overrides
# base_url: https://api.openai.com/v1
# model: gpt-4o
# Per-stage agent tool model overrides (top-level, not under llm)
# stage_models:
# Spec: claude-sonnet-4-6
# "Review Code": claude-opus-4-6
Verify everything is ready:
cybervisor doctor
Run the supervisor:
cybervisor "Create a 360 feedback system"
printf "Create a 360 feedback system" | cybervisor run
Usage
# Run with a prompt
cybervisor "Your task description"
cybervisor run "Your task description"
printf "Your task description" | cybervisor run
# Specify a custom config
cybervisor run "Your task" --config custom.yaml
# Control execution flow
cybervisor run "Your task" --start-stage "Implement"
cybervisor run "Your task" --end-after "Review Code" # Run up to and including this stage, then stop
cybervisor run "Your task" --end-before "Verify" # Stop before executing this stage
# Set default agent
cybervisor use gemini
# Restore skills left behind after a crash
cybervisor restore-skills
# Validate your configuration
cybervisor validate
cybervisor validate --show-guidance
Treat cybervisor validate as the local readiness gate before merge or execution. A passing result means the config is not only parseable, but also satisfies the stricter contract-authoring checks for route safety, complete routed examples, and authored prompt/guidance synchronization.
For advanced stage configuration including cleanup paths, max iterations, per-stage model overrides, per-stage write protection (read_only_paths), and contract authoring, see the Pipeline Authoring Guide and Configuration Reference.
Global Flags
| Flag | Description |
|---|---|
--quiet |
Suppress non-error stderr output for all commands |
--help |
Show help message and exit |
Prompt Resolution
When running cybervisor run or cybervisor submit, the task prompt is resolved with the following priority:
- Positional argument —
cybervisor run "Your task description" - stdin —
printf "Your task" \| cybervisor run - Error — If neither is provided, the command exits with an error
If a positional prompt argument is present, stdin is ignored even when piped.
Workspace-Local Config Override
A .cybervisor/config.yaml file in the current working directory takes precedence over ~/.cybervisor/config.yaml for global verifier settings (llm.api_key, llm.base_url, llm.model, agent_tool, stage_models). Pipeline configuration (cybervisor.yaml) has no CWD override — it is always resolved from the project root.
Daemon Mode
cybervisor serve starts a long-running WebSocket daemon. Once running, use the client subcommands to submit tasks, monitor progress, and manage the pipeline remotely.
# Start the daemon server (WebSocket on ws://127.0.0.1:8765)
cybervisor serve
cybervisor serve --host 0.0.0.0 --port 9000
cybervisor serve --background # Run in background via double-fork
# Check daemon connectivity and active tasks (exits 0 when reachable, 1 when not)
cybervisor status
cybervisor status --host 127.0.0.1 --port 8765
# Example output when a task is running:
# Running task: abc123def456 (stage: Spec, cwd: /workspace/project, bounds: end_stage=Verify)
# Daemon reachable at ws://127.0.0.1:8765
# Example output when no task is running:
# No active tasks.
# Daemon reachable at ws://127.0.0.1:8765
# Example output when daemon is down:
# Daemon not reachable at ws://127.0.0.1:8765
# Check status of a specific task by ID (matches across all directories)
cybervisor status abc123def456
# Submit a task and stream events until completion
cybervisor submit "Your task description" --config cybervisor.yaml --start-stage Implement
cybervisor submit "Your task" --end-after "Review Code"
cybervisor submit "Your task" --end-before Verify
printf "Your task description" | cybervisor submit # read prompt from stdin
cat task_prompt.txt | cybervisor submit # multi-line prompts preserved
cybervisor submit "Your task" --task-id my-task-123 # explicit task ID
# On submit, the task ID is printed to stderr (e.g. "Task created: abc123def456")
# Use this ID with attach, cancel, logs, or end
# Reconnect to a running or completed task (auto-detects task in current directory)
cybervisor attach
# Reconnect to a specific task by ID to replay buffered events
cybervisor attach my-task-123
# Cancel an active task (auto-detects task in current directory; errors if zero tasks)
cybervisor cancel
# Cancel a specific task by ID (works from any directory)
cybervisor cancel my-task-123
# Dump all buffered events (non-blocking)
cybervisor logs my-task-123
# Update the end stage of a running task
cybervisor end --after Verify # auto-detect task in current directory; stop after Verify executes
cybervisor end --before Verify # auto-detect task in current directory; stop before Verify starts
cybervisor end abc123 --before Verify # specify task ID explicitly (works from any directory)
# Override daemon address for any client command
cybervisor submit "task" --host 0.0.0.0 --port 9000
Exit codes for client commands:
0— success1— failure (daemon unreachable, task not found, invalid state, etc.)2— configuration validation error130— interrupted (SIGINT/SIGTERM received)
Shell Completions
cybervisor supports two completion modes:
Eval-based (requires argcomplete)
uv tool install 'cybervisor[completions]'
eval "$(register-python-argcomplete cybervisor)"
If cybervisor is already installed without the extra, reinstall with uv tool install 'cybervisor[completions]'. Add the eval line to ~/.bashrc for persistence. This mode provides dynamic completions for stage names, agent tools, and document IDs.
Static file (no dependencies)
source <(cybervisor completion bash)
Add to ~/.bashrc for persistence. This mode covers all subcommands, flags, and static choices (e.g., --template simple|speckit, completion bash) without runtime dependencies.
For full details, see Shell Completions.
Documentation
- Getting Started — Step-by-step tutorial from install to first pipeline run
- Configuration Reference —
cybervisor.yaml,~/.cybervisor/config.yaml, stage fields, CLI commands - Pipeline Authoring Guide — Designing stages, contracts, routing, and agent prompts
- Runtime and Daemon — User Guide — Daemon mode, skill disable/restore, signals
- Runtime and Daemon — Developer Reference — Hook lifecycle, adapter internals, logs
- WebSocket Protocol — Daemon message schema, connection lifecycle, chunking
- Testing and Sandbox — Smoke tests, mock adapter, Docker, sandbox
- Updating — Install, upgrade, and migration workflows
- Troubleshooting — Common issues and resolutions
For development and contributing documentation, see docs/development.md.
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 cybervisor-0.18.1.tar.gz.
File metadata
- Download URL: cybervisor-0.18.1.tar.gz
- Upload date:
- Size: 163.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
a8b3b1a110be18894d6342e23569292cd42def434baad0f07f7106f737b5527d
|
|
| MD5 |
5234b28937a37c1b49958fa40a85838d
|
|
| BLAKE2b-256 |
27397ccb9d570c2cb3cc23b11ed53847a841f92279d8a7064ff891e6304bc5a8
|
File details
Details for the file cybervisor-0.18.1-py3-none-any.whl.
File metadata
- Download URL: cybervisor-0.18.1-py3-none-any.whl
- Upload date:
- Size: 208.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","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 |
f68defde7493dfc1b3dd7ef4e8b01278cc89dc0432de3ae7a07315999e81f3e0
|
|
| MD5 |
2a81e1653f5c8f55c69aa0b141908a21
|
|
| BLAKE2b-256 |
97f16fef3ddcd148133d30c8d30d2ae322f1980e9a9ba3c3ceb94561c4731338
|