alkgit 0.1.0

Git smart protocol for the alk family: pkt-line substrates, protocol V2 serving (upload-pack/receive-pack), producer/consumer halves on alkcall channels, and the backend seam traits — the shipped alkstore+alkblobs composition is the alkgit-substrate crate (ADR-010/025)
Documentation
# Two-member workspace (ADR-025): this root package is the protocol-core
# `alkgit` crate; the shipped composition lives in `substrate/`
# (`alkgit-substrate`). The root package is implicitly a workspace member.
[workspace]
members = ["substrate"]
exclude = ["fuzz"]
resolver = "2"

[package]
name = "alkgit"
version = "0.1.0"
edition = "2021"
rust-version = "1.88"
license = "MIT OR Apache-2.0"
repository = "https://git.alk.dev/alkdev/alkgit"
description = "Git smart protocol for the alk family: pkt-line substrates, protocol V2 serving (upload-pack/receive-pack), producer/consumer halves on alkcall channels, and the backend seam traits — the shipped alkstore+alkblobs composition is the alkgit-substrate crate (ADR-010/025)"
keywords = ["git", "protocol", "alkcall", "vcs", "network"]
categories = ["network-programming", "asynchronous"]
# The package policy (the sibling crates' convention): the published
# crate ships the architecture docs (the authoritative contract) but
# not the process surface — reviews, research, plans, task files, the
# working agents' config, the fuzz sidecar, AGENTS.md.
exclude = [".opencode/", "AGENTS.md", "docs/reviews/", "docs/research/", "docs/plans/", "docs/sdd_process.md", "tasks/", "fuzz/"]

[lib]
name = "alkgit"
path = "src/lib.rs"

[features]
default = []
# sha256 passthrough (off by default; sha1 is the pinned default — OQ-05).
# gix-hash stays always-on with sha1: the wire layer needs it, and gix-hash
# fails to compile with neither hash feature selected (compile-time-rejected
# invariant, see docs/research/gitoxide.md).
sha256 = ["gix-hash/sha256"]

[dependencies]
alkcall = "0.10"
# Trait-family dyn-compatibility: all backend traits are #[async_trait]
# (ADR-012 §1, review 001 A-2 — bare `async fn` in a trait is not
# dyn-compatible).
async-trait = "0.1"
gix-hash = { version = "0.28", features = ["sha1"] }
# The async codec (futures-io based, bridged to tokio streams via
# tokio-util compat) — the substrate layer's framing engine (ADR-005).
gix-packetline = { version = "0.24", features = ["async-io"] }
# Consumer half (ADR-017 §2 as amended by ADR-023 §2): gix-protocol with
# its async client (handshake + ls-refs + fetch machinery) driven over
# gix-transport's git-daemon client `Connection` — a construction, not a
# new Transport impl: `GitSession` wraps it built on the alkcall
# BiStream compat halves (the ADR-016 §2/§4 preamble modes map onto
# ConnectMode::Daemon/Process); the push client is hand-rolled to
# ADR-013's shapes (gitoxide has no send-pack client). Pins confirmed
# against docs/research/gitoxide.md (the 0.89 family, async-client on
# both) at core/w4-session-construction — review 004 R-1's disposition.
gix-protocol = { version = "0.67", features = ["async-client"] }
gix-transport = { version = "0.61", features = ["async-client"] }
# Ref-name validation (ADR-013 §9) — `reference::name` is the transport-side
# check; the deny-list and the pinned reason live next to it in `refname`.
gix-validate = "0.13"
bstr = "1"
# The `git/repo/*` op-record schemas (ADR-012 §3).
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tokio = { version = "1", default-features = false, features = ["rt", "sync", "io-util", "macros", "time"] }
tokio-util = { version = "0.7", features = ["compat"] }
futures = "0.3"
bytes = "1"
thiserror = "2"
parking_lot = "0.12"

[dev-dependencies]
serde_json = "1"
tokio = { version = "1", features = ["full", "test-util", "macros"] }
# The pack-generation pipeline's gix components (ADR-004's composition over
# the test doubles — the wave-2 task's test-side-only pin; the crate's regular
# dependencies stay unchanged, the real impl is `alkgit-substrate`'s). Version-
# pinned and lean per gitoxide.md's pinning rules, `sha1` throughout.
gix-object = { version = "0.66", features = ["sha1"] }
gix-actor = "0.44"
gix-traverse = { version = "0.63", features = ["sha1"] }
gix-pack = { version = "0.76", default-features = false, features = ["generate", "parallel", "sha1", "streaming-input"] }
gix-error = "0.5"
gix-parallel = { version = "0.50", default-features = false, features = ["parallel"] }
gix-utils = { version = "0.5", features = ["progress"] }
gix-zlib = { version = "0.3" }

[profile.release]
lto = "thin"