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.0.tar.gz (228.1 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.0-cp311-abi3-win_amd64.whl (978.2 kB view details)

Uploaded CPython 3.11+Windows x86-64

toolr_py-0.25.0-cp311-abi3-musllinux_1_2_x86_64.whl (473.5 kB view details)

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

toolr_py-0.25.0-cp311-abi3-musllinux_1_2_aarch64.whl (445.5 kB view details)

Uploaded CPython 3.11+musllinux: musl 1.2+ ARM64

toolr_py-0.25.0-cp311-abi3-manylinux_2_28_x86_64.whl (534.0 kB view details)

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

toolr_py-0.25.0-cp311-abi3-manylinux_2_28_aarch64.whl (380.6 kB view details)

Uploaded CPython 3.11+manylinux: glibc 2.28+ ARM64

toolr_py-0.25.0-cp311-abi3-macosx_11_0_x86_64.whl (786.6 kB view details)

Uploaded CPython 3.11+macOS 11.0+ x86-64

toolr_py-0.25.0-cp311-abi3-macosx_11_0_arm64.whl (666.6 kB view details)

Uploaded CPython 3.11+macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: toolr_py-0.25.0.tar.gz
  • Upload date:
  • Size: 228.1 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.0.tar.gz
Algorithm Hash digest
SHA256 bf75b9fbfdff81aa041646a7c3bc186152471eea47b6a4d00af80fac9e1cb891
MD5 d01e3afabe1cbd8bf55ac3a84ff88609
BLAKE2b-256 1eac54053cd6472432f12b301a74e20eed8e341b535f49d9a4dbbb8716859012

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.0.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.0-cp311-abi3-win_amd64.whl.

File metadata

  • Download URL: toolr_py-0.25.0-cp311-abi3-win_amd64.whl
  • Upload date:
  • Size: 978.2 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.0-cp311-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 af7bc9f8bc68fbb51997a15a92c768e6ac9c7273666dee1c6755e20bb43202a8
MD5 bacd9ab30abbf216e452c9bdd213b7ef
BLAKE2b-256 2b2d842d5fb2bd0b221b9c58f09a0bee4babac80ffe7fb9d080b3d539d8f3b96

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.0-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.0-cp311-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.0-cp311-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d80347ea0cecd6576f3a72e1db38d9c40799c51ea363339558d2808ef1660ed9
MD5 c5e6f6ea21267873d77bcf635f0cc309
BLAKE2b-256 65a09487fa02f77a75bccfd953cc586617a28530c64c7877211b1704e93e150f

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.0-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.0-cp311-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.0-cp311-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e8975446a5dbc0a0a0f01307fc0488d84f696b8ce1b89f73de6c65be33965283
MD5 70d2e1c8c84dbd7460ba41f80fe65c98
BLAKE2b-256 d97b8301edab361f6a3505b439357e340d9d8ebf7ec27299d375f3aca230741b

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.0-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.0-cp311-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.0-cp311-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b33cabdd86c13acb10c23913b48db806bca61c857a719c4f736f2499af313dad
MD5 cf0e7c4933c04db453a2f90594532682
BLAKE2b-256 883b51299a9fe2efaac32f41f56fbd691ca8c80a5d9f0c4f4394e0105493b3a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.0-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.0-cp311-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.0-cp311-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b3cd2d9b3d4eb4f8c105be5668d2601842dc0ba42149a0cd5ba969dc580ee7cf
MD5 9b3e5de70ff6c9ef69e40fb53a4864d1
BLAKE2b-256 64aaa0755886aac06f163c4bfec79d4931381353a28cb2d3c2a03ec62f957078

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.0-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.0-cp311-abi3-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.0-cp311-abi3-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 297083612f4deab63fbf563a0d1942cea6687209c2c96f2b014e4c8c69f143ee
MD5 0b30e5b09252b11b53a6dab864ea01ad
BLAKE2b-256 f8366d1751cd650f53bcbca8f60e7e0cb632cecc440aca1423aea495d3c26db5

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.0-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.0-cp311-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for toolr_py-0.25.0-cp311-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3069e7ad5093088380caa381f4626fce0c27ee30a80585a745326caa623f0df4
MD5 d361250f145d7ddefb133318da48bf8b
BLAKE2b-256 1d5ee2cf5a90f473536de3e1f74ec88ba4392d8e03513695c52a1372c7976009

See more details on using hashes here.

Provenance

The following attestation bundles were made for toolr_py-0.25.0-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