- Install/update dev env:
make(runsuv sync --all-groupsand installs pre-commit hooks). - Lint + typecheck:
make lint(runsruff checkthenpyrefly check). - Tests:
make test(equivalent touv run pytest -xsvl tests). - Docs build:
make docs(Sphinx HTML intodocs/_build).
- Match CI locally:
uv run ruff check->uv run pyrefly check->uv run pytest tests. - CI uses Python
3.10-3.14(.github/workflows/tests.yml).
- Core package is
muffin/(single-package repo, not a monorepo). - Public API exports come from
muffin/__init__.py. - Main framework class is
muffin/app.py(Application). - CLI entrypoint is the
muffinscript ->muffin.manage:cli(pyproject.toml). - Pytest plugin is built-in via entry point
muffin.pytest. example/is a git submodule (.gitmodules), not core framework code.
- Pytest default app is configured as
muffin_app = "tests:app"inpyproject.toml; tests rely ontests/__init__.pyapp fixture. - Project-level
tests/conftest.pyparametrizesaiolibacrossasyncio,asyncio+uvloop,trio,curio, so async tests can run multiple times per backend. - For focused runs, use node selection directly,
e.g.
uv run pytest tests/test_application.py::test_app_config.
- App config env var is
MUFFIN_CONFIG(muffin/constants.py), used by both app init and CLI--config. - Async backend can be forced with
MUFFIN_AIOLIB(muffin/utils.py).
- Pre-commit enforces Conventional Commits using
.git-commits.yaml(allowed types includefeat,fix,refactor,test, etc.). uv.lockconsistency is enforced by pre-commit (uv-lock --check); update lockfile when dependency groups change.- Pre-push hook runs
poetry run pytest testsfrom.pre-commit-config.yaml(note: repo otherwise usesuv).
make releaseis branch-opinionated and mutates git state: checks out/pullsmainanddevelop, bumps version, tags, merges both ways, and pushes.- Do not run release targets for normal feature work.