Agent harness assembler and lifecycle manager
Project description
saddler
English | 简体中文
saddler is a declarative CLI for building and operating agent environments.
It manages storage, runtime, and agent lifecycles in one place, and provides hitch for compose-style multi-agent orchestration.
Why saddler
- Unified lifecycle management for storages, runtimes, and agents
- Pluggable harnesses (for example
codex,cursor,gemini,openclaw,opencode,claude_code) - Declarative resource assembly from local paths or remote sources
- Repeatable environment setup with
hitch(up,down,ps,config) - Python-first workflow with
uvand Typer-based CLI ergonomics
[!NOTE]
saddleris under active iteration. Backward compatibility between early versions is not guaranteed.
Requirements
- Python
3.11+ uv(recommended package manager)- Optional: Docker (for docker runtime backend)
Installation
Install from PyPI:
pip install saddler
or with uv:
uv tool install saddler
or run directly with uvx:
uvx saddler --help
Install from source (for contributors):
git clone https://github.com/hopeful0/saddler.git
cd saddler
uv sync
Validate installation:
uv run saddler --help
Using saddler with uvx
For ad-hoc usage without global installation:
uvx saddler --help
For local source-tree testing:
uvx --from . saddler --help
For daily usage after installation:
saddler --help
[!TIP]
uvx saddler ...is ideal for quick runs.uv tool install saddleris better for day-to-day usage.
Quick Start
1) Create and start a runtime
saddler runtime create local --name dev-local
saddler runtime start dev-local
2) Create an agent on that runtime
saddler agent create \
--runtime dev-local \
--harness codex \
--workdir /workspace \
--name my-agent
3) Launch the harness session
saddler agent tui my-agent
4) Inspect current resources
saddler runtime ls
saddler agent ls
saddler storage ls
Core Commands
saddler agent create|ls|inspect|tui|acp|rmsaddler runtime create|start|stop|ls|inspect|harnesses|rmsaddler storage create|ls|inspect|rmsaddler hitch config|up|stop|down|ps
Common aliases:
saddler agentcan also be called from top-level high-frequency commandssaddler runtimehas aliassaddler rtsaddler storagehas aliassaddler st
Runtime Creation Patterns
Create local runtime:
saddler runtime create local --name local-dev
Create docker runtime:
saddler runtime create docker \
--name docker-dev \
--image saddler-runtime:all \
--user 1000:1000 \
--mount .:/workspace
Create with dynamic backend type:
saddler runtime create --type <backend> --opt key=value
[!TIP] Use
saddler runtime harnesses <runtime-ref>to verify which harness dependencies are already installed in that runtime.
Hitch: Compose-style Orchestration
hitch treats agent stacks like a compose project and helps you bring everything up/down reproducibly.
Minimal example:
name: demo
version: 1
runtimes:
rt:
backend: docker
backend_spec:
image: saddler-runtime:all
user: 1000:1000
mounts:
- .:/workspace
agents:
main:
harness: opencode
workdir: /workspace
runtime: rt
Typical workflow:
saddler hitch config -f hitch.local.yml
saddler hitch up -f hitch.local.yml
saddler hitch ps -f hitch.local.yml
saddler hitch down -f hitch.local.yml
Shell Completion
saddler supports native Typer completion for zsh, bash, and fish.
- zsh:
echo 'eval "$(_SADDLER_COMPLETE=zsh_source saddler)"' >> ~/.zshrcsource ~/.zshrc
- bash:
echo 'eval "$(_SADDLER_COMPLETE=bash_source saddler)"' >> ~/.bashrcsource ~/.bashrc
- fish:
echo '_SADDLER_COMPLETE=fish_source saddler | source' >> ~/.config/fish/config.fishsource ~/.config/fish/config.fish
Troubleshooting
runtime harnessesshowsnot installed- Install required harness dependencies in the runtime, then rerun
runtime harnesses
- Install required harness dependencies in the runtime, then rerun
- Docker runtime cannot start
- Confirm Docker daemon is running and your user can run
docker
- Confirm Docker daemon is running and your user can run
- Bind mount errors
- Ensure destination is absolute and host source path exists
- Completion not effective
- Reload shell config (
source ~/.zshrc,source ~/.bashrc, or fish config)
- Reload shell config (
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 saddler-0.1.1.tar.gz.
File metadata
- Download URL: saddler-0.1.1.tar.gz
- Upload date:
- Size: 184.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3237fca46f4b211f8873053dff08dbcd64f9adb0962f25904005a626973c2447
|
|
| MD5 |
c6485a6a602fe8b5f3ae46db36432441
|
|
| BLAKE2b-256 |
7f0a1663cfbeb3b9ce89b4fad18edf3de719bf795bbc9c277e2844c9ec30da13
|
File details
Details for the file saddler-0.1.1-py3-none-any.whl.
File metadata
- Download URL: saddler-0.1.1-py3-none-any.whl
- Upload date:
- Size: 61.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4aebb5b91e7f910bfef7d787af534ea8702caaa41117d3cd30eefd6db1665d74
|
|
| MD5 |
8e82c51d7ccd1ec512f9d8446822ad3e
|
|
| BLAKE2b-256 |
c846092221d69ce8a8b7a74167f4f1e82928be28540ab56c4888f16b71623c84
|