A monorepo of independent custom tools. Each tool lives in its own top-level
folder as a self-contained uv package with its own dependencies, lockfile,
and virtual environment — changing one tool never affects another.
scripts/new-tool.sh <tool-name>
This scaffolds <tool-name>/ with a pyproject.toml, src/<tool_name>/,
and a tests/ dir (pytest pre-installed as a dev dependency). The tool is
pinned to one minor Python version behind the newest release uv tracks
(e.g. if 3.15 is newest, the tool pins to 3.14), and its .venv is created
with uv venv --seed. The generated README.md records the exact version
and how to move to a newer minor later.
scripts/build.sh # build only tools that changed
scripts/build.sh <tool> [tool2] # build specific tool(s)
scripts/build.sh --all # build every tool
"Changed" means: files changed in the working tree (staged or unstaged,
including untracked), falling back to files changed in the last commit if
the working tree is clean. Building a tool runs uv sync, its test suite
(if present), then uv build to produce a wheel/sdist in that tool's own
dist/.
cd <tool-name>
uv add <dependency> # scoped to this tool only
uv run pytest
uv run <entry-point>