Ferir
Ferir runs coding agents on real codebases: clone any git repository (public or private), execute Pi headless in Docker, and return a unified diff - so you can review, apply, or open a PR from automated tasks.
Prerequisites
- Python 3.11+.
- Docker.
- Git.
- LLM Provider.
Install
uv add ferir
Usage
import ferir
result = ferir.run(
ferir.RunRequest(
work_dir="/tmp/basement",
id="550e8400-e29b-41d4-a716-446655440000",
repo_url="https://github.com/Clivern/Diffsay.git",
prompt="Add Gemfile.lock to LOW_PRIORITY_FILES",
pi_model="openrouter/anthropic/claude-sonnet-4.5",
proxy_url="http://host.docker.internal:8080/api",
docker_image="clivern/ferir:v0.2.0",
container=ferir.Container(
memory="2g",
cpus="1",
init_script=".ferir/init.sh",
init_bash="apt-get update && apt-get install -y jq",
),
cleanup=True,
),
timeout=90 * 60,
)
# result.patch, result.summary, result.total_tokens, result.changed_files, result.repo_dir, result.out_dir
Private repositories
HTTPS:
git_clone_auth=ferir.GitCloneAuth(token=os.environ["GITHUB_TOKEN"]),
repo_url="https://github.com/org/private.git",
SSH:
git_clone_auth=ferir.GitCloneAuth(
ssh_private_key_path=os.path.expanduser("~/.ssh/id_ed25519"),
),
repo_url="git@github.com:org/private.git",
Examples
uv run python examples/example1.py
| Example | What it shows |
|---|---|
examples/example1.py |
Five concurrent runs against one repository |
examples/example2.py |
Read-only codebase question |
examples/example3.py |
Init installs Python, then Pi edits and runs tests |
examples/example4.py |
The timeout kills a long init script |
Develop
uv sync
uv run ruff check .
uv run pytest -m "not network"
Metadata
Release files for ferir 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ferir-0.2.0.tar.gz | 22.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ferir-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 38.4 kB
Release files / ferir-0.2.0.tar.gz
| Download URL | ferir-0.2.0.tar.gz |
|---|---|
| Size | 22.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ae912b3c82ecf7a7a1d9a27f0e225273c095ea6bd67f5834f073664e85235b23
|
|
BLAKE2b-256 checksum How to use checksums |
8fd274727d68ee8941c884cc011280e61b6fb951051cfbf0db7a8b505996fa12
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","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}
|
Release files / ferir-0.2.0-py3-none-any.whl
| Download URL | ferir-0.2.0-py3-none-any.whl |
|---|---|
| Size | 15.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6a08d1b16d3943302a750cd88d7b5187a4e0125e6069e138d93e2c73402f05e0
|
|
BLAKE2b-256 checksum How to use checksums |
af3f250242735140d2983319be161a1cebea2db563f18cf9c56c10b23f6e4820
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","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}
|