UV ?= uv SRC_DIR := $(CURDIR)/src ENTRYPOINT := src/flow/__main__.py DIST_DIR := dist BUILD_DIR := build SPEC_FILE := flow.spec BINARY := $(DIST_DIR)/flow INSTALL_DIR ?= $(HOME)/.local/bin .PHONY: help deps test test-e2e check package build binary install install-local check-binary clean distclean help: @printf "Targets:\n" @printf " make deps Sync locked dev/build dependencies into .venv\n" @printf " make test Run unit tests\n" @printf " make test-e2e Run Docker/Podman e2e tests (FLOW_RUN_E2E=1)\n" @printf " make check Run unit tests and CLI smoke check\n" @printf " make package Build wheel and sdist into dist/\n" @printf " make build Build standalone binary at dist/flow\n" @printf " make install Build and install binary to ~/.local/bin/flow\n" @printf " make check-binary Run dist/flow --help\n" @printf " make clean Remove generated build/test artifacts\n" @printf " make distclean Also remove local virtualenvs\n" deps: $(UV) sync --locked --extra build --extra dev test: $(UV) run pytest tests/ -q --ignore=tests/e2e test-e2e: FLOW_RUN_E2E=1 $(UV) run pytest tests/e2e/ -v check: test $(UV) run python -m flow --help >/dev/null $(UV) run python -m flow --version >/dev/null package: deps $(UV) build build binary: deps $(UV) run pyinstaller --noconfirm --clean --onefile --name flow --paths "$(SRC_DIR)" "$(ENTRYPOINT)" install-local install: build mkdir -p "$(INSTALL_DIR)" install -m 755 "$(BINARY)" "$(INSTALL_DIR)/flow" @printf "Installed flow to $(INSTALL_DIR)/flow\n" check-binary: "$(BINARY)" --help clean: rm -rf "$(BUILD_DIR)" "$(DIST_DIR)" "$(SPEC_FILE)" .coverage coverage.xml htmlcov .pytest_cache .ruff_cache .mypy_cache distclean: clean rm -rf .venv venv