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 stripsDYLD_*from subprocesses, so cairo only resolves in-process),zensicalandcoverage(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:
basedpyrightships 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 |