Every tool is a module in src/zbtools/ exposing a Typer app, registered in pyproject.toml under [project.scripts] and run as uv run <name>. Defaults for inputs and outputs come from src/zbtools/paths.py; any can be overridden with arguments. The only code that knows about the host OS is host.py (binary locations, install hints, QEMU display and audio backends).
Command
Module
Purpose
extract-game
extract_game.py
disc contents to build/disc/, the Windows 95 build to build/zoombi32/
unpack-isz
unpack_isz.py
list/extract InstallShield 3 archives (hand-written: includes a DCL decompressor no Python library offers)
vm
vm.py
the Windows 98 VM: install, install-game, run, reset, screenshot (the VM)
Every path a tool generates must belong to a paths.CLEAN_CATEGORIES entry (categories may include others by name); add new ones there, and to CLEAN_DEFAULT if cheap to rebuild, and keep the cleaning table (docs/src/reference/cleaning.md) in sync.