Skip to content

Features

Pyfaro wraps uv, Ruff, ty and pytest behind one command. Every command below is implemented in 0.5.0-beta.1 or on main.

Project lifecycle

Command What it does Delegates to
create Create a packaged library (lib), command-line app (cli) or FastAPI app (fastapi) nothing, templates only
init Preview or apply Pyfaro initialization of a new or existing project uv
sync Create or update uv.lock and the project environment uv
add and remove Edit dependencies and the lock file uv
run Run a command, or a named task from [tool.pyfaro.tasks], in the project environment uv
dev Run the development server (the fastapi preset runs Uvicorn with reload) or process, supervised uv, Uvicorn
python List, install or pin Python versions uv
build Build a source distribution and a wheel with the project's own build backend uv

Code quality

Command What it does Delegates to
lint Lint with Ruff Ruff
fmt Format with Ruff, or check formatting Ruff
type Type-check ty
check Format check, lint and type check in one gate, with optional --fix Ruff, ty
test Run the tests pytest

Diagnostics

Command What it does
tools Show where uv, Ruff, ty and pytest are found, and their versions
doctor Read-only report on configuration, environment and tools

Design principles

  • No second resolver. Pyfaro never resolves, installs or locks packages; uv does. See How it works.
  • Your configuration stays yours. Ruff, ty and pytest read their own settings. Pyfaro only adds an optional [tool.pyfaro] table.
  • Nothing happens behind your back. check writes nothing without --fix, add does not install, and Python is downloaded only by an explicit python install.
  • Honest exit codes. Delegated commands return the tool's own code. See Exit codes.

Planned, not available

Workspaces are on the roadmap but are not implemented. They do not appear in pyfaro --help.

Next steps