This guide reflects the repository's current local tooling and GitHub Actions checks.
By default, use make for routine development. Direct
uv, ruff, pytest, and
prek usage is still fine when you need a targeted
command.
- Python 3.12 or 3.13
uvmakegit
Python 3.14 is currently unsupported because unstructured, which is used by
the document extraction node, currently declares Requires-Python: <3.14.
make dev
# optional for interactive work
source .venv/bin/activatemake dev will:
- run
uv sync - install
prekGit hooks
The repository uses uv for dependency and
virtual environment management. The default development environment includes
ruff, pytest, pytest-xdist, pytest-cov, pytest-mock, and
prek.
make dev installs prek hooks from
prek.toml.
The current hook set includes:
- trailing whitespace and end-of-file cleanup
- BOM cleanup and line ending normalization
- TOML and YAML validation
- shebang executable checks
- local
make tc(which runsformat,lint, andty checkin sequence)
Useful direct commands:
uv run prek install
uv run prek run -a
uv run prek list
uv run prek validate-configUse make by default. For targeted work, direct tool usage is still fine:
uv run ruff check src/graphon/path.py
uv run pytest tests/path/test_file.py -k keyword
uv run prek run -aUse these commands for normal development:
make format: runuv run ruff formatmake lint: runmake format, thenuv run ruff check --fixmake tc: runmake lint, thenuv run ty checkmake check: runuv lock --check && uv run ruff format --check && uv run ruff check && uv run ty checkmake test: runmake tc, thenuv run pytestmake build: build the package distributionsmake clean: remove build artifacts and caches
Notes:
make lintis mutating. It may rewrite files.make tcis the local type-check entrypoint used by Git hooks. It includes formatting and lint fixes first.make testis the progressive local full-chain target. It formats, applies lint fixes, runsty check, and then runs the test suite.make checkaggregates the same non-mutating lockfile, lint, and type-check commands used by CI.pytestis configured with-n autoandtestpaths = ['tests'], so the test suite runs in parallel by default.- If you change dependencies, refresh and commit
uv.lockbefore opening a pull request.
For most changes, a good local sequence is:
make test
make checkmake test applies local fixes, runs ty check, and then runs the test suite.
make check then confirms the non-mutating CI check job will pass.
Pull requests targeting main currently run three kinds of checks:
- PR title validation with
amannn/action-semantic-pull-request make checkincludinguv.lockfreshness validationuv run pyteston Python 3.12 and 3.13
Keep local workflow aligned with those checks. A green local make test plus
make check is useful, but it is not a complete substitute for the exact CI
flow because CI also validates PR titles and a Python version matrix.
This repository enforces Conventional Commits for commit messages. The same format is required for pull request titles.
The PR title validator currently accepts these types:
featfixdocsstylerefactorperftestbuildcichorerevert
Rules:
- use an optional scope when it improves clarity
- mark breaking changes with
! - remember that the pull request title becomes the squash merge commit message
Examples:
feat: add graph snapshot export
fix(runtime): avoid duplicate node completion events
docs(contributing): clarify CI workflow
refactor(api)!: remove deprecated runtime entrypoint
Before you start implementation or open a new issue, search the existing open and closed issues and pull requests to confirm the work is not already tracked or in progress.
Rules:
- do not open duplicate issues or parallel pull requests for the same change
- if related work already exists, continue that discussion instead of starting a new thread
- if no issue exists for the change, create one before opening a pull request
- if GitHub presents an issue template or issue form, fill out every required field and keep the provided structure intact
Every pull request must be linked to an issue. Use a closing or reference
keyword such as Closes #123, Fixes #123, or Refs #123 in the pull request
body.
Before you open a pull request:
- search existing pull requests again to confirm there is no duplicate review in progress
- make sure the change stays focused and reviewable
- run
make testbefore pushing and keepmake checkgreen locally when possible
When you open a pull request:
- use a Conventional Commits title, and mark breaking changes with
!, because the pull request title becomes the squash merge commit message - link the related issue in the pull request body
- follow
.github/pull_request_template.mdexactly - do not delete required headings or checklist items from the template; if a section is not applicable, say so explicitly
- if CLA Assistant prompts you, sign CLA.md in the pull request conversation before merge
- add or update tests for behavior changes unless the change genuinely does not require them
- update contributor-facing or user-facing documentation when needed
If CLA Assistant asks you to sign the repository CLA, read CLA.md and post this exact comment once in the pull request conversation:
I have read the CLA Document and I hereby sign the CLA
The CLA workflow is separate from the normal PR checks.
Version updates are managed manually with uv
version:
uv version --no-sync --bump patch
uv version --no-sync --bump minor
uv version --no-sync --bump majorThose commands update the package version in pyproject.toml. If the lock file
also needs to reflect the new root package version, refresh and commit
uv.lock as part of the version bump change. The version update step does not
create tags, releases, or changelog entries.
Release tags use the v prefix and are intended to be created from main
after the version bump pull request has been merged. The pushed tag must match
[project].version in pyproject.toml.
Pushing vX.Y.Z triggers the release workflow. It:
- verifies the tag matches
pyproject.tomland points to a commit reachable frommain - runs tests before building release distributions
- creates or updates a GitHub draft release and publishes the same build artifacts to TestPyPI
- waits for approval on the
pypienvironment - publishes the same build artifacts to PyPI and publishes the GitHub draft release
CLA signatures are stored on the dedicated cla-signatures branch. Maintainers
must keep that branch available and writable to GitHub Actions.