Thank you for contributing. Agents should read AGENTS.md first.
# Install Rust tools (fmt, clippy, nextest, llvm-cov)
./scripts/install_deps.sh
# Install pre-commit hooks (runs fmt, clippy, nextest on every commit)
./scripts/setup_git_hooks.sh# Unit + integration tests
cargo nextest run --workspace --all-features
# Coverage (must stay >= 75% line coverage)
cargo llvm-cov --workspace --all-features --nextest --fail-under-lines 75
# Lint
cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
# Frontend
cd frontend && npm test -- --run && npm run lintRun these checks locally — CI will enforce them. Do not push or merge a red build.
-
cargo fmt --all -- --checkpasses -
cargo clippy --all-targets --all-features -- -D warningspasses -
cargo nextest run --workspace --all-featurespasses -
cargo llvm-cov --workspace --all-features --nextest --fail-under-lines 75passes - Frontend (if changed):
cd frontend && npm test -- --run && npm run lint && npm run buildpasses - New public APIs have at least one test
- After push, wait for GitHub Actions on the PR. Fix red checks on the same branch before merge.
- Fork the repository and create a feature branch.
- Run the full test suite locally before pushing. Do not push known CI failures.
- Keep changes focused; add tests for new behavior.
- Open a PR against
main. Merge only when every required check is green.
Releases are driven by annotated git tags. Pushing a tag matching v* triggers the full release pipeline (.github/workflows/release.yml):
- Builds cross-platform binaries (macOS x64/arm64, Linux amd64/arm64).
- Creates a GitHub Release with tarballs and SHA-256 checksums.
- Publishes the crate to crates.io.
- Builds and pushes the Docker image to
ghcr.io.
git tag -a v0.3.0 -m "Release v0.3.0"
git push origin v0.3.0The crates.io publish step requires a token stored as a GitHub Actions secret:
- Log in at https://crates.io/me and create a new API token with the publish-new and publish-update scopes.
- In the GitHub repository, go to Settings → Secrets and variables → Actions.
- Add a secret named
CARGO_REGISTRY_TOKENwith the token value.
The first publish must be done manually (cargo publish) if the crate name
copypaste has not yet been reserved on crates.io.