Thanks for considering a contribution. This document covers the
essentials. Project conventions live under
AGENTS.md and the rule files in
.claude/rules/ — start there before making a
non-trivial change.
- By submitting a pull request, you agree to license your
contribution under the project's license, Apache-2.0
(see
LICENSE). - Security-sensitive reports must not go in public issues —
see
SECURITY.mdfor the private reporting flow.
git clone https://github.com/dekobon/git-remote-object-store
cd git-remote-object-store
cargo build --workspace
cargo test --workspaceMSRV is declared in the workspace Cargo.toml (rust-version).
The current floor is Rust 1.94.
The repository ships a Makefile that mirrors CI:
make ci # everything CI runs (fmt, clippy, lints, tests, shellspec)
make check-tools # verify your local toolchain matches what CI expectsFor backend-touching changes, the Docker-backed integration suites exercise real S3 (RustFS) and Azure Blob (Azurite) emulators:
cargo test --features integration-s3 --test s3_store_integration
cargo test --features integration-azure --test azure_store_integrationOptional CLI prerequisites for the spec/ ShellSpec suite:
ShellSpec (the install script lives in
make ci, but you can also install manually).
The canonical reference is AGENTS.md plus the per-topic files in
.claude/rules/:
| Topic | File |
|---|---|
| Rust style | .claude/rules/rust.md |
| Naming | .claude/rules/naming.md |
| Testing | .claude/rules/testing.md |
| Conventional commits | .claude/rules/git-commits.md |
| Tool choice (LSP-first) | .claude/rules/tool-choice.md |
| Bash style | .claude/rules/bash.md |
| Markdown | .claude/rules/markdown.md |
| Helper-binary stdout discipline | .claude/rules/protocol-stdout.md |
| Changelog | .claude/rules/changelog.md |
| Documentation hygiene | .claude/rules/documentation.md |
Highlights:
- Rust style:
cargo fmt, clippy clean with--all-targets --all-features -- -D warnings. Nounsafecode. Avoidunwrap/expect/panic!outside tests. - Commits: Conventional Commits —
<type>(<scope>): <subject>. Validated in CI bycommitsar. - Tests: add a regression test whenever you fix a bug. Assertions
must be specific (not
is_ok()without checking the value). See.claude/rules/testing.mdfor the full discipline including the "no incidental coupling" rule. - Helper-binary stdout is a contract: the
git-remote-*andgit-lfs-*binaries communicate with git over a line-based protocol on stdout. Diagnostic output goes to stderr only — neverprintln!,dbg!, or stray banner text on stdout outside protocol responses. - Docs:
///on public items; the crate warns onmissing_docs.
- Open an issue first for anything beyond a trivial fix. It's cheaper to discuss the design than to review a large PR against the grain of the project.
- Branch from
main. - Commit in small, reviewable steps. Each commit should build and pass tests on its own where practical.
- Run
make cibefore pushing. - Open a pull request against
main. Fill in the PR template. Link the issue withFixes #NNNin the PR body. - Changelog: add an entry to
CHANGELOG.mdunder[Unreleased]for user-visible changes. Refactors, docs-only, and CI-only changes don't need a changelog entry.
Criticism is welcome — point out mistakes, suggest better approaches, cite relevant standards. Be skeptical and concise. Reviews focus on correctness, API shape, and test coverage before style.
Open a GitHub Discussion or a low-priority issue. We'd rather answer a question than review a PR that went the wrong direction.