中文 · English
agent-runner
A restart-on-exit supervisor for autonomous coding CLIs. Ships presets for Claude Code, aider, gemini, codewhale, kimi and pi; any prompt-arg CLI via custom config. Spawn the agent round-after-round under defenses that prevent the failure modes that bite in production: stuck rounds, orphan commits, OAuth burn loops, full disks, runaway memory.
┌──────────────────────────────────────────┐
│ Layer 3: The Witness (monitor) │ 11 detectors + auto-stop
├──────────────────────────────────────────┤
│ Layer 2: The Loop (serve, ~120 LOC) │ signal-trapping restart loop
├──────────────────────────────────────────┤
│ Layer 1: The Round (round) │ one agent invocation
└──────────────────────────────────────────┘
Install
pip install cli-agent-runner
The installed CLI command is agent-runner (the PyPI distribution name is
prefixed for namespace disambiguation; the import name and command are not).
Quick start
cd your-project
agent-runner init # scaffold agent-runner.toml + prompts/main.md
$EDITOR agent-runner.toml # point agent.command at your CLI
agent-runner install --monitor # systemd user units for serve + monitor
agent-runner status # confirm running
agent-runner peek # snapshot of project state
agent-runner monitor # live anomaly detection
Full walkthrough: docs/quickstart.md.
15 verbs
| Lifecycle | Observation |
|---|---|
init / install / uninstall |
peek — state snapshot |
start / stop / kill |
watch — peek in a refresh loop |
restart / status |
monitor — 11 detectors, alerts, auto-stop |
round / serve / upgrade |
events — query / stream events.jsonl |
Verb reference: docs/commands.md.
Defenses (built in)
12 named defenses, structured as data — see agent-runner peek --select defenses.
Each carries the historical incident it codifies and the invariant test that
guards it. Highlights:
- round_timeout_s — hard wall, never the agent's word on when to stop
- process_group_isolation — kill the round, not just the parent
- orphan_stash_idempotency_s — no 3-stashes-per-second pile-ups
- sha_locked_stash —
stash@{N}indices drift; SHAs don't - set_diff_classification — line-set comparison, not unified-diff +/- scan
- startup_smoke_check — refuse to run with a clearly-truncated prompt
Full list and rationale: docs/architecture.md.
Monitor: 11 detectors
Notify only: timeout_rate, hung, orphan_chain, disk_warning,
mem_pressure, network_fail, rate_limit_active,
anomaly_repetitive_active, supervisor_stale.
Auto-stop the service (continuing is harmful):
oauth_fail— burning API quota on auth-rejected roundsdisk_critical— writing to a near-full disk risks corruption
Runs against the supervised project's local logs:
agent-runner monitor # 30s poll
agent-runner monitor --json | jq -c # pipe to downstream consumers
Watch a remote host's event stream from your laptop — one command instead of a
hand-rolled ssh … ; sleep loop:
agent-runner monitor --host pi --mode events # managed ssh relay, JSONL stdout
The relay reconnects with --since <last ts> so a dropped link replays its gap,
gives up (exit 1) once the outage passes remote_failure_tolerance_s, and kills
the ssh process group on exit so no orphan tree is left behind.
Detection stays on the host.
--hostwith--mode anomaly | narrate | httpexits with an error: the detectors read the supervised host's logs and auto-stop its service, which must keep working with your laptop closed. Run the monitor there (ssh <alias>, thenagent-runner monitor) and relay its events here. Seedocs/runbook.md§ "Remote event relay & SSH trust" — the SSH trust boundary applies to any agent-runner command you drive over ssh.
Documentation
docs/quickstart.md— 5-step install + first rounddocs/commands.md— verb referencedocs/configuration.md—agent-runner.tomlschemadocs/runbook.md— operator troubleshooting (OAuth, disk, orphan)docs/architecture.md— 3-layer model, defenses-as-data
Development
git clone https://github.com/wan9yu/cli-agent-runner.git
cd cli-agent-runner
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
./build.sh check # full local-CI sweep
./build.sh test # unit + integration only
AGENT_RUNNER_E2E_PI=1 ./build.sh e2e # opt-in pi e2e (needs ssh alias `pi`)
Some docs/*.md blocks are generated from code — ./build.sh docs rewrites
the <!-- gen:* --> regions, and ./build.sh check verifies they are fresh.
POSIX-only (Linux, macOS). Tested under Python 3.11+ on x86_64 and aarch64.
License
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 cli_agent_runner-0.2.5.tar.gz.
File metadata
- Download URL: cli_agent_runner-0.2.5.tar.gz
- Upload date:
- Size: 395.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80b315cf47163a1c3bc7795c0714bf942a11f59b6a0c073f3ff0948b488ee26d
|
|
| MD5 |
c10048ffc4d1f5c1ec44a1ad3e5472d4
|
|
| BLAKE2b-256 |
cf03b5db17ef767c46e4f767a00e71acf4239463f931e6341e644846370783c7
|
Provenance
The following attestation bundles were made for cli_agent_runner-0.2.5.tar.gz:
Publisher:
release.yml on wan9yu/cli-agent-runner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cli_agent_runner-0.2.5.tar.gz -
Subject digest:
80b315cf47163a1c3bc7795c0714bf942a11f59b6a0c073f3ff0948b488ee26d - Sigstore transparency entry: 2257162341
- Sigstore integration time:
-
Permalink:
wan9yu/cli-agent-runner@12da82c8df9b8992f9e59c502c26d4ed0744c41d -
Branch / Tag:
refs/tags/v0.2.5 - Owner: https://github.com/wan9yu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@12da82c8df9b8992f9e59c502c26d4ed0744c41d -
Trigger Event:
push
-
Statement type:
File details
Details for the file cli_agent_runner-0.2.5-py3-none-any.whl.
File metadata
- Download URL: cli_agent_runner-0.2.5-py3-none-any.whl
- Upload date:
- Size: 142.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7356519d91e3415536bec7f5c4893518f61a49505bc03a010f3d4277eba5c283
|
|
| MD5 |
7035005a59cc55b494b1778d343f136c
|
|
| BLAKE2b-256 |
151534307c1ec9a59ac828b038257ff85aeeda319afd0242c94e3be939d44651
|
Provenance
The following attestation bundles were made for cli_agent_runner-0.2.5-py3-none-any.whl:
Publisher:
release.yml on wan9yu/cli-agent-runner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cli_agent_runner-0.2.5-py3-none-any.whl -
Subject digest:
7356519d91e3415536bec7f5c4893518f61a49505bc03a010f3d4277eba5c283 - Sigstore transparency entry: 2257162352
- Sigstore integration time:
-
Permalink:
wan9yu/cli-agent-runner@12da82c8df9b8992f9e59c502c26d4ed0744c41d -
Branch / Tag:
refs/tags/v0.2.5 - Owner: https://github.com/wan9yu
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@12da82c8df9b8992f9e59c502c26d4ed0744c41d -
Trigger Event:
push
-
Statement type: