Metadata-Version: 2.4
Name: bmk
Version: 3.9.1
Summary: Build, test and release runner for Python projects: keep the Makefile, drop the shell. Cross-OS, uv-based, one self-updating Makefile.
Project-URL: Homepage, https://github.com/bitranox/bmk
Project-URL: Repository, https://github.com/bitranox/bmk.git
Project-URL: Issues, https://github.com/bitranox/bmk/issues
Author-email: bitranox <bitranox@gmail.com>
License: MIT
License-File: LICENSE
Keywords: automation,build,ci,cli,coverage,custom-commands,devops,make,makefile,pyproject,pytest,python,release,stagerunner,task-runner,test,uv
Classifier: Environment :: Console
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Typing :: Typed
Requires-Python: >=3.10
Requires-Dist: bandit>=1.9.4
Requires-Dist: bashate>=2.1.1
Requires-Dist: btx-lib-mail>=1.3.2
Requires-Dist: build>=1.5.0
Requires-Dist: click>=8.4.2
Requires-Dist: hatchling>=1.31.0
Requires-Dist: httpx2>=2.7.0
Requires-Dist: hypothesis>=6.156.6
Requires-Dist: import-linter>=2.13
Requires-Dist: lib-cli-exit-tools>=2.3.2
Requires-Dist: lib-layered-config>=5.6.0
Requires-Dist: lib-log-rich>=6.3.5
Requires-Dist: orjson>=3.11.9
Requires-Dist: pip-audit>=2.10.1
Requires-Dist: pydantic>=2.13.4
Requires-Dist: pyright[nodejs]>=1.1.411
Requires-Dist: pytest-cov>=7.1.0
Requires-Dist: pytest>=9.1.1
Requires-Dist: python-dotenv>=1.2.2
Requires-Dist: rich-click>=1.9.8
Requires-Dist: rtoml>=0.13.0
Requires-Dist: ruff>=0.15.21
Requires-Dist: shellcheck-py>=0.11.0.1
Requires-Dist: shfmt-py>=4.0.0
Requires-Dist: tomlkit>=0.15.0
Requires-Dist: urllib3>=2.7.0
Description-Content-Type: text/markdown

# bmk

<!-- Badges -->
[![CI](https://github.com/bitranox/bmk/actions/workflows/default_cicd_public.yml/badge.svg)](https://github.com/bitranox/bmk/actions/workflows/default_cicd_public.yml)
[![CodeQL](https://github.com/bitranox/bmk/actions/workflows/codeql.yml/badge.svg)](https://github.com/bitranox/bmk/actions/workflows/codeql.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Open in Codespaces](https://img.shields.io/badge/Codespaces-Open-blue?logo=github&logoColor=white&style=flat-square)](https://codespaces.new/bitranox/bmk?quickstart=1)
[![PyPI](https://img.shields.io/pypi/v/bmk.svg)](https://pypi.org/project/bmk/)
[![PyPI - Downloads](https://img.shields.io/pypi/dm/bmk.svg)](https://pypi.org/project/bmk/)
[![Code Style: Ruff](https://img.shields.io/badge/Code%20Style-Ruff-46A3FF?logo=ruff&labelColor=000)](https://docs.astral.sh/ruff/)
[![codecov](https://codecov.io/gh/bitranox/bmk/graph/badge.svg?token=UFBaUDIgRk)](https://codecov.io/gh/bitranox/bmk)
[![Maintainability](https://qlty.sh/badges/041ba2c1-37d6-40bb-85a0-ec5a8a0aca0c/maintainability.svg)](https://qlty.sh/gh/bitranox/projects/bmk)
[![security: bandit](https://img.shields.io/badge/security-bandit-yellow.svg)](https://github.com/PyCQA/bandit)

Makefiles are great, and every tool that set out to replace them started by asking you to
stop using one. That is the tell. make is fifty years old, sits on every machine, and hands
a stranger exactly one thing to type. Whatever is wrong here, it is not make.

It is the shell inside it. A recipe is a string handed to bash, so your build logic is
stringly-typed and OS-specific, and your prose gets parsed as code. Ours once took a commit
message reading `fix(cli): tidy up`, handed it to bash, and bash did what bash does with a
parenthesis. It committed half the sentence and pushed it.

**bmk is a build, test and release runner for Python projects.** It keeps the Makefile and
throws out the bash. You still type `make test`; bmk reads your `pyproject.toml`, provisions
your venv with uv, and runs the gates. Every command is cross-OS Python with no shell
anywhere, so the same `make test` runs on Linux, macOS and Windows. We deleted all 78 of our
own `.sh` and `.ps1` files rather than keep two of everything.

```bash
uvx bmk install    # drops the Makefile in; installs nothing permanent
make test          # from here on, just make
```

Requires [uv](https://docs.astral.sh/uv/) (there is no pip fallback) and Python 3.10+.

## Key features

- **One Makefile, versioned, that updates itself.** Every project gets the same template,
  and it regenerates when bmk updates, so your repos cannot drift apart.
- **No shell, anywhere.** Every command is cross-OS Python, and every stage is an argv list
  rather than a shell string. Nothing gets handed to bash to re-parse, including your own
  stages and your commit messages.
- **Your dependencies and bmk's never mix.** bmk installs once per machine and holds its own
  toolchain and nothing of yours. Your packages live in the project's `.venv`, and that is
  the environment your tests, type-checker and audit all run against - the same one, so they
  cannot disagree.
- **Staged pipelines, parallel where it is safe.** Stages run in order; stages sharing an
  order run together. Extend any pipeline from your `pyproject.toml`: add, remove or replace
  stages in TOML.
- **Quiet until it matters.** JSON by default: tool output is captured and shown only when a
  stage fails, otherwise you get one summary line. Pass `--human` when you want the noise.
- **Batteries included.** Formatting and linting, type-checking, security and vulnerability
  audits, import-contract checks, tests with coverage, shell and PowerShell linting, version
  bumping, tagging, PyPI release, and Codecov upload.

## Documentation

| Page                                               | What is in it                                               |
|----------------------------------------------------|-------------------------------------------------------------|
| [Install](INSTALL.md)                              | uv, pipx, pip, Poetry/PDM, from git or from build artifacts |
| [make targets](docs/make-targets.md)               | every target and its aliases                                |
| [CLI reference](docs/cli-reference.md)             | every command, option and exit code                         |
| [pyproject reference](docs/pyproject-reference.md) | every `pyproject.toml` section bmk reads, with defaults     |
| [Pipelines and stages](docs/pipelines.md)          | what runs when, and how to change it                        |
| [Email](docs/email.md)                             | `send-email` and `send-notification`                        |
| [Concept](docs/concept.md)                         | the design                                                  |
| [ADRs](docs/adr/)                                  | the decisions, and why                                      |
| [Changelog](CHANGELOG.md)                          | what changed                                                |
| [Contributing](CONTRIBUTING.md)                    | how to work on bmk                                          |

## License

MIT - see [LICENSE](LICENSE).
