Contributing to tylertoo¶
Contributors agree to follow the Code of Conduct. Report security issues privately through SECURITY.md.
For bugs and feature requests, use the issue templates.
Issue priorities¶
Every open issue carries a priority label, P0 (most urgent) to P3, and
a kind label: bug, optimization, or enhancement.
AGENTS.md
defines the scale. When you report a bug, fill in the template's Impact
and Workaround fields, and a maintainer assigns the labels.
Development setup¶
git clone https://github.com/geoparquet-io/tylertoo.git
cd tylertoo
git config core.hooksPath .githooks
cargo build
DEVELOPMENT.md covers setup, daily development, and local CI checks.
Commit convention¶
Commit messages follow Conventional Commits:
| Type | Use for |
|---|---|
feat |
A new feature (bumps minor) |
fix |
A bug fix (bumps patch) |
docs |
Documentation only |
perf |
A performance improvement |
refactor |
A code change that is neither a feature nor a fix |
test |
Tests only |
chore |
Maintenance |
Pull request process¶
- Branch from
main. Branch protection rejects direct pushes. - Run CI checks locally. At minimum, run
cargo fmt --all --check,cargo clippy,cargo shear, and targeted tests, plus theuv runsuite for Python changes. CI requires these checks to pass. DEVELOPMENT.md → CI gates lists every gate with its command. - Open the PR with the
PR template.
Never bypass the pre-commit hook with
--no-verify.
The diff-scoped mutation check is advisory. Its job summary and sticky PR
comment list mutants in your change that tests missed. Use these to find
test gaps. Run scripts/mutants-diff.sh to reproduce the check locally.
Docstrings and help text¶
For public docstrings, CLI help, and /// docs:
- Open with a one-line summary that ends with a period.
- Describe what each parameter does for the user in at most two sentences.
- Leave out issue numbers, references to sweeps or decision files, restated defaults, internal crate names, memory formulas, and tuning history.
- Give a performance-only knob one sentence and a link to the scaling guide. Put tippecanoe comparisons in the tippecanoe guide.
- Keep one short runnable example per function. Move removed material
users still need to
docs/OVERVIEW_TUNING.md, a guide, orCHANGELOG.md.
Releasing (maintainers)¶
Prerequisites¶
- Install Commitizen:
uv tool install commitizen. - Set the GitHub secret
CARGO_REGISTRY_TOKENfrom crates.io/settings/tokens. - Configure PyPI trusted publishing.
Release workflow¶
- Branch from an up-to-date
main:
git checkout main
git pull
git checkout -b release/vX.Y.Z
- Bump the version from the repo root, never from
crates/python. ChooseMINOR,PATCH, orMAJOR. Delete Commitizen's local tag so the workflow can tag the merged commit:
uv run cz bump --increment MINOR --changelog
git tag -d vX.Y.Z
- Check the build:
cargo check
- Curate
CHANGELOG.md(see below) and commit it. - Push the branch and open the PR:
git push -u origin release/vX.Y.Z
gh pr create --title "Release vX.Y.Z" \
--body "Release vX.Y.Z"
- After the merge, start the release from
main:
gh workflow run release.yml --ref main
release.yml reads the version from Cargo.toml on main, tags that
commit vX.Y.Z, publishes to crates.io and PyPI, and creates a GitHub
release with prebuilt CLI binaries.
A manual run tags the latest commit on main. If other PRs merged after
the release PR, tag the release PR's merge commit directly.
Pushing the tag starts the same workflow:
git fetch origin
git tag vX.Y.Z <merge-commit>
git push origin vX.Y.Z
Before building, the workflow stops the release if:
- the commit is not on
main - a pushed tag does not match the
Cargo.tomlversion - the run started on any ref other than
mainor thevX.Y.Ztag - the
vX.Y.Ztag already exists on a different commit
Curating the changelog¶
cz bump --changelog generates entries from commits. Before releasing,
edit the new section of CHANGELOG.md for users:
- Group the entries under Added, Changed, Fixed, and Performance.
- Give each user-visible change one line with its PR reference.
- Combine clippy, fmt, CI, dependency bumps, and other maintenance into one "Internal" line.
- Leave older sections alone.
docs/changelog.md links to CHANGELOG.md; the docs site uses the same file.
What Commitizen updates¶
The root .cz.toml defines Commitizen's config and version_files.
A bump updates:
| File | Pattern |
|---|---|
Cargo.toml |
version = "X.Y.Z" (workspace) |
Cargo.toml |
tylertoo-core = { ..., version = "X.Y.Z" } in [workspace.dependencies] |
crates/python/pyproject.toml |
version = "X.Y.Z" |
.cz.toml |
its own version field |
Commitizen leaves crates/python/uv.lock unchanged. The pre-commit hook
runs uv lock and stages the updated project version. Keep the hook
enabled when committing the bump. If the hook has not run, use
cd crates/python && uv lock. The hook and the version
check in the CI Lint job fail if the versions disagree.
Recovery¶
If the workflow fails after pushing the tag, fix the cause and rerun it on that tag. It detects the tag without a release, skips completed steps, and publishes the rest:
gh workflow run release.yml --ref vX.Y.Z
If the tag points at the wrong commit, delete it before you rerun:
git push origin :refs/tags/vX.Y.Z
Common issues¶
| Problem | Cause | Fix |
|---|---|---|
failed to select version for tylertoo-core |
The workspace dependency version did not move | Check that the [workspace.dependencies] entry in Cargo.toml moved with the bump |
cz: command not found |
Commitizen is not installed | uv tool install commitizen |
| Version consistency check fails | Someone edited one version file by hand | Rerun uv run cz bump from the repo root |
uv.lock needs to be updated, but --locked was provided |
The bump did not refresh the lock file | cd crates/python && uv lock, then commit uv.lock |
No pyproject.toml found from uv lock |
uv lock ran from the repo root |
Run it in crates/python |