Skip to content

Contributing

Working on the code

uv sync
make clean   # format + lint + typecheck (ruff, mypy)
make test    # pytest; the gate tests run real git worktrees, allow a few minutes
make docs    # generate the reference pages and build this site into site/
make docs-serve

Commit messages carry the Linear id: [KFF-123] Imperative summary. Everything under docs/reference/ is generated by scripts/gen_docs_reference.py from the code (click groups, pydantic models, the MCP server's tool list, the threat catalogue) and is not committed.

Releasing

The version is the git tag; pyproject.toml carries a 0.0.0 placeholder that the release workflow replaces before building. Write the version's section in CHANGELOG.md first, then:

git tag v1.2.3 && git push origin v1.2.3        # a release
git tag v1.2.3rc1 && git push origin v1.2.3rc1  # a release candidate

release.yml builds the wheel, smoke-tests model-wtf --version from it, publishes to PyPI through trusted publishing (the PyPI project trusts this repository's release.yml in the pypi environment; no token is stored), creates the GitHub release from the matching changelog section, and moves the v1 branch and tag so uses: ModelW/wtf@v1 follows the latest 1.x.

A candidate (rc, a, b) is published on PyPI and as a GitHub pre-release under the final version's changelog section, but does not move v1: try it with uses: ModelW/wtf@v1.2.3rc1 or pip install model-wtf==1.2.3rc1.