Skip to main content

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 uv and Typer-based CLI ergonomics

[!NOTE] saddler is 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 saddler is 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|rm
  • saddler runtime create|start|stop|ls|inspect|harnesses|rm
  • saddler storage create|ls|inspect|rm
  • saddler hitch config|up|stop|down|ps

Common aliases:

  • saddler agent can also be called from top-level high-frequency commands
  • saddler runtime has alias saddler rt
  • saddler storage has alias saddler 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)"' >> ~/.zshrc
    • source ~/.zshrc
  • bash:
    • echo 'eval "$(_SADDLER_COMPLETE=bash_source saddler)"' >> ~/.bashrc
    • source ~/.bashrc
  • fish:
    • echo '_SADDLER_COMPLETE=fish_source saddler | source' >> ~/.config/fish/config.fish
    • source ~/.config/fish/config.fish

Troubleshooting

  • runtime harnesses shows not installed
    • Install required harness dependencies in the runtime, then rerun runtime harnesses
  • Docker runtime cannot start
    • Confirm Docker daemon is running and your user can run docker
  • 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)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

saddler-0.1.2.tar.gz (301.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

saddler-0.1.2-py3-none-any.whl (103.2 kB view details)

Uploaded Python 3

File details

Details for the file saddler-0.1.2.tar.gz.

File metadata

  • Download URL: saddler-0.1.2.tar.gz
  • Upload date:
  • Size: 301.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.13

File hashes

Hashes for saddler-0.1.2.tar.gz
Algorithm Hash digest
SHA256 9499e13853415b5b2fb6595107f44f6b9c2f0bdab4c95f8cd5ff3c5f5734065a
MD5 d05734f8f7643484e4a9171240febe2e
BLAKE2b-256 0580a6676a575d4befdc37fcde30ad45f62b959cdccb1b5d53f27c747abf6cb7

See more details on using hashes here.

File details

Details for the file saddler-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: saddler-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 103.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.8.13

File hashes

Hashes for saddler-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 3b83a67f586c8ae355ee579bd8a2e27854a0099c6d76ffaa87a138b9295789f0
MD5 104b92a8e8c6063bba1b09de0c8da579
BLAKE2b-256 851c57f79b1ec9f5b1929a271691425424d5d34e12806611b5ba5e7e687db6cd

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page