Skip to content

Tools

Import a tool by name — from footman.tools import git — and call it, git.commit(…). No declaration needed: the bridge translates keyword arguments into flags mechanically, and every tool on your PATH already works. These pages document the stubs: what each curated tool accepted at the version footman last read it from, with that tool's own help text per flag.

Nothing here is a wrapper. The stubs are generated by fm footman tools sync, which asks the installed binaries what they take, and fm footman tools audit fails when a stub and its tool disagree. A flag missing from a stub still runs — every verb ends in **flags: Any, so a stub can suggest but never forbid.

Where a flag defaults on, its documentation names the spelling that turns it off, because that is the one thing the bridge cannot infer: clean=off emits mkdocs build --dirty, not --no-clean.

The In-process column is a deliberate choice, not a capability dump. Tasks run concurrently as threads, and a tool call is normally a subprocess — isolated, trivially parallel. A Python tool with a [console_scripts] entry point can run in footman's own process instead, skipping the spawn:

  • default — footman prefers in-process. mkdocs (macOS strips DYLD_* from subprocesses, so cairo only resolves in-process), zensical and coverage (pure Python) qualify, and their entry points accept an argument list, so they stay parallel.
  • available — an entry point exists but running it in-process buys nothing: basedpyright ships a Python launcher that just spawns node, so footman subprocesses it anyway.
  • no — a Rust/Go/Node binary with no Python entry point; always a subprocess.

See the tools bridge for how in-process tools stay parallel (and the one case that can't).

Tool Read from In-process Verbs
basedpyright (docs) 1.39.9 (macOS) available the tool itself
bash (docs) hand-written unknown the tool itself
build (docs) 1.5.0 (macOS) no the tool itself
bun (docs) 1.3.14 (macOS) no add, build, flags, install, remove, … (8 in all)
cmake (docs) 4.4.0 (macOS) no the tool itself
cmd (docs) hand-written unknown the tool itself
coverage (docs) 7.15.2 (macOS) default annotate, combine, erase, flags, html, … (9 in all)
cspell (docs) 10.0.1 (macOS) no check, flags, lint, suggest, trace
djlint (docs) 1.42.2 (macOS) no the tool itself
docker (docs) 29.6.2 (macOS) no build, down, exec, flags, images, … (11 in all)
eclint (docs) 0.6.0-wk.5 (macOS) no the tool itself
fish (docs) hand-written unknown the tool itself
gh (docs) 2.96.0 (macOS) no api, checkout, clone, create, flags, … (13 in all)
git (docs) 2.55.0 (macOS) no add, branch, checkout, clone, commit, … (20 in all)
git_changelog (docs) 2.9.4 (macOS) no the tool itself
git_cliff (docs) 2.13.1 (macOS) no the tool itself
markdownlint (docs) 0.23.1 (macOS) no the tool itself
mkdocs (docs) 1.6.1 (macOS) default build, flags, gh_deploy, new, serve
mypy (docs) 2.3.0 (macOS) no the tool itself
ninja (docs) 1.13.0.git.kitware.jobserver-pipe-1 (macOS) no the tool itself
nu (docs) hand-written unknown the tool itself
prek (docs) 0.4.10 (macOS) no autoupdate, clean, flags, install, run, … (6 in all)
pwsh (docs) hand-written unknown the tool itself
pytest (docs) 9.1.1 (macOS) available the tool itself
python (docs) 3.13.1 (macOS) no the tool itself
ruff (docs) 0.16.0 (macOS) no check, clean, flags, format
ruff_format (docs) 0.16.0 (macOS) no the tool itself
twine (docs) 6.2.0 (macOS) no check, flags, upload
ty (docs) 0.0.63 (macOS) no check, flags
uv (docs) 0.11.31 (macOS) no add, build, compile, export, flags, … (16 in all)
zensical (docs) 0.0.51 (macOS) default build, flags, new, serve
zsh (docs) hand-written unknown the tool itself