Skip to main content

Python bindings for the toolr framework (import as `toolr`)

Project description

ToolR - AI Generated Logo

In-project CLI tooling, with a Rust front-end.

Pronounced /ˈtuːlər/ (tool-er)

ToolR is a Python task runner that boots in milliseconds because the front-end is a Rust binary. Python only runs when you invoke a command, inside a per-repo uv-managed venv.

Tool runner -h steady-state First run Second run
toolr 10.4 ms 277.0 ms 21.8 ms
doit 83.4 ms 143.0 ms 88.9 ms
invoke 84.6 ms 101.7 ms 77.4 ms
nox 91.8 ms 395.9 ms 115.3 ms
duty 166.4 ms 188.5 ms 252.4 ms
python-tools-scripts 252.2 ms 340.3 ms 189.0 ms

<tool> -h, 20 runs, steady-state = mean of last 18. Measured on Apple M3 Pro / macOS 26.5 / arm64. Reproduce locally with python3 scripts/bench.py (stdlib-only; emits the table above to stdout).

Why ToolR

  • Sub-millisecond discovery. The CLI is a Rust binary. --help and Tab completion read a cached static manifest; Python never boots for non-execute paths.
  • No system-Python dependency. Toolr resolves a per-repo Python venv via uv on first invocation. The host OS doesn't need Python at all to install toolr — it's a single static binary.
  • Write Python, not framework boilerplate. Drop a tools/*.py file with a command_group and a @command decorator. Type hints become CLI arguments; Google-style docstrings become --help text.
  • First-class third-party command packages. Plugins ship a static toolr-manifest.json inside the wheel. Discovery is a glob + JSON parse; no Python import to find them.
  • Signed releases. Every release archive ships with a SLSA build-provenance attestation. The install scripts verify it by default (requires the gh CLI); pass --verify-attestation=skip to bypass, accepting the supply-chain risk.

Two wheels, two roles

Package What it is Where it lives
toolr The Rust CLI binary you run from the shell. On $PATH, installed once.
toolr-py The Python runtime your tools/*.py import. In your tools/pyproject.toml.

Most projects want both: the CLI installed globally, toolr-py declared in the per-repo tools/pyproject.toml so from toolr import Context, command_group works when your commands run.

Install

Five first-class install paths.

mise

mise use aqua:s0undt3ch/ToolR@latest

Pulls toolr from the aqua registry via mise's built-in aqua backend — no plugin to register. For projects that already pin tool versions via .mise.toml, toolr's version becomes part of your project's reproducible tool set. See docs/installation/mise/.

pip

pip install toolr   # Rust CLI binary

This installs the toolr binary into whatever venv pip is pointing at. Do not pip install toolr-py into that same venv — toolr-py is the Python runtime your tools/*.py files import, and it belongs in the per-repo tools venv that toolr project init scaffolds for you (where it's declared in tools/pyproject.toml and materialised via uv sync). See "Two wheels, two roles" above for the split.

curl | sh (Linux + macOS)

curl -fsSL https://raw.githubusercontent.com/s0undt3ch/ToolR/main/installation/install.sh | sh

Verifies the SLSA attestation by default (requires the gh CLI; pass --verify-attestation=skip to bypass). Pin a version with sh -s -- --version X.Y.Z. Custom prefix: sh -s -- --prefix /opt/toolr/bin.

PowerShell (Windows)

irm https://raw.githubusercontent.com/s0undt3ch/ToolR/main/installation/install.ps1 | iex

GitHub release archives

Download toolr-<version>-<target-triple>.tar.gz (or .zip for Windows) from https://github.com/s0undt3ch/ToolR/releases, verify the .sha256 sibling and the SLSA attestation, drop the binary on $PATH. Useful in locked-down environments that audit binaries before allowing them on a machine.

Scaffold your repo

After the binary is on $PATH:

toolr project init                  # writes tools/{pyproject.toml,.gitignore,example.py}
toolr example hello                 # run the generated example
toolr self completion install bash  # or zsh / fish

The full install matrix (per-OS notes, attestation flags, prefix overrides) lives in docs/installation/.

What you write

# tools/example.py
"""Example commands."""
from toolr import Context, command_group

example = command_group("example", title="Example", description=__doc__)


@example.command
def hello(ctx: Context, name: str = "world") -> None:
    """Say hello to <name>.

    Args:
        name: who to greet.
    """
    ctx.print(f"Hello, {name}!")
$ toolr example hello --name Pedro
Hello, Pedro!

toolr project init writes a richer four-command starter than this two-liner — open it and edit, or delete it and start from scratch.

Where to go next

Project status

ToolR is pre-1.0. The on-disk manifest is versioned (schema_version in tools/.toolr-manifest.json); the binary refuses to load a higher version than it understands. The public Python surface is toolr.__all__; anything not listed there is implementation detail. Backwards-incompatible changes will be explicit in the changelog (generated by git-cliff on release).

Contributing

See CONTRIBUTING.md.

License

Apache-2.0.

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

toolr_py-0.25.1.tar.gz (228.5 kB view details)

Uploaded Source

Built Distributions

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

toolr_py-0.25.1-cp311-abi3-win_amd64.whl (978.4 kB view details)

Uploaded CPython 3.11+Windows x86-64

toolr_py-0.25.1-cp311-abi3-musllinux_1_2_x86_64.whl (473.8 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ x86-64

toolr_py-0.25.1-cp311-abi3-musllinux_1_2_aarch64.whl (445.8 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ ARM64

toolr_py-0.25.1-cp311-abi3-manylinux_2_28_x86_64.whl (534.2 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ x86-64

toolr_py-0.25.1-cp311-abi3-manylinux_2_28_aarch64.whl (380.8 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ ARM64

toolr_py-0.25.1-cp311-abi3-macosx_11_0_x86_64.whl (786.8 kB view details)

Uploaded CPython 3.11+macOS 11.0+ x86-64

toolr_py-0.25.1-cp311-abi3-macosx_11_0_arm64.whl (666.8 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

File details

Details for the file toolr_py-0.25.1.tar.gz.

File metadata

  • Download URL: toolr_py-0.25.1.tar.gz
  • Upload date:
  • Size: 228.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for toolr_py-0.25.1.tar.gz
Algorithm Hash digest
SHA256 723d80fcafc40e26f7effadf5d16b9d3e837f54e5d8d7abc92899f6038cfb399
MD5 dbeea07bca2b8bc96402835589b148e0
BLAKE2b-256 938bdbabdef1213b5efd9e38a9aeb939de63d16ea8953ca6ca42957a906c262b

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.1.tar.gz:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr_py-0.25.1-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: toolr_py-0.25.1-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 978.4 kB
  • Tags: CPython 3.11+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for toolr_py-0.25.1-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 f0b37888dc3a09a20de87ac3eb6e64be1931e2d9457a7152db1d0938f7985c2e
MD5 ee7e33d07fe6a86c4ae1e87124a0a96c
BLAKE2b-256 766c582a321029f7f1a01d62fd477b8cf28c3dfbe5810848cf8fcc3bb6d555e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.1-cp311-abi3-win_amd64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr_py-0.25.1-cp311-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.1-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2fdf802859f1379e1e9aac7a862dbbe621ea16b8f221a546316d0e9c890192e5
MD5 0abd887c5f8377705f4a4def5b077314
BLAKE2b-256 e9cc8c8519fcd224ff294e8bdc97754c993232b2eb65a738261410a26875da98

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.1-cp311-abi3-musllinux_1_2_x86_64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr_py-0.25.1-cp311-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.1-cp311-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0c039e034f823967c3543ee0ec00fa1a72366b1ac7e31915f9e7824339c50c88
MD5 6e7d25a62e6f1c3bd19631708be9b3de
BLAKE2b-256 df4a4679fe3a3f7e4ac3a3bb3ed33b14f78d21e61555f40741a29ed630969fef

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.1-cp311-abi3-musllinux_1_2_aarch64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr_py-0.25.1-cp311-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.1-cp311-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 718ff299e3962a53606d738fa1f4984701ab2c33637fea2f508fb14c579252b1
MD5 4ae674451a05a45ce6dbc21fc9c0b5cf
BLAKE2b-256 86076c7eaf25f5b07941c60fb3b5e8eaabd7147b65ac6fac33ac3378cc22ae36

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.1-cp311-abi3-manylinux_2_28_x86_64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr_py-0.25.1-cp311-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.1-cp311-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5dde40ef12253ab977825acec4de24d52540577ef2242d6fb712e9d9ac1d287b
MD5 bc95f3936c4ff5ea89917abe2e832ef4
BLAKE2b-256 c6d754d2a29f11c97268e3b4cdac387cc5f63f89ebe7ab82526d6a14451b90bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.1-cp311-abi3-manylinux_2_28_aarch64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr_py-0.25.1-cp311-abi3-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.1-cp311-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 f59b4b9fab0e9fa877fe5fce7134dd21a9b3f06e1d5c8c83cbd580cf7f414d70
MD5 397241cf448c428b27d6d20969fea2bf
BLAKE2b-256 9b783a253dcd2e5ccbc441a852c68b3a4ad57746753fdea9de33d997a325a4d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.1-cp311-abi3-macosx_11_0_x86_64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file toolr_py-0.25.1-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.1-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6d32b85f8a65bf6778162ce9280ef08f766705abfff7096892180b8cbe58ab67
MD5 a33e9ea327ffdc438a2c11d720167473
BLAKE2b-256 64c6c93e758349a9f6aa877dab4515b22ed710d4f78213d971edd6681901f824

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.1-cp311-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on s0undt3ch/ToolR

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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