[package] name = "claw-store" version = "0.3.0" edition = "2021" [lib] name = "claw_store" path = "src/lib.rs" [[bin]] name = "claw-store" path = "src/main.rs" # Phase 5b: fingerprint-keyed cargo build cache CLI. Wraps `cargo build` # with a peer-cache lookup: hit → download+restore, miss → build+capture+upload. # Uses the same identity/config surface as claw-store daemon. [[bin]] name = "claw-cargo" path = "src/claw_cargo.rs" # Phase 6 (2026-07-14): read-only FUSE mount that exposes the blob # store as a filesystem. Gated behind the `fuse` cargo feature + # Linux-only in dep resolution so my macOS dev box doesn't need # macFUSE headers installed to build the other bins. # # Build with: cargo build --features fuse --bin claw-fuse [[bin]] name = "claw-fuse" path = "src/claw_fuse.rs" required-features = ["fuse"] [features] default = [] # Phase 6: enables the claw-fuse binary + pulls in the fuser dep. fuse = ["dep:fuser"] [target.'cfg(any(target_os = "linux", target_os = "macos"))'.dependencies] # v0.15 — Rust FUSE bindings. Pulled on Linux + macOS when the # `fuse` feature is on. macOS additionally requires macFUSE # (https://osxfuse.github.io) — install via `brew install --cask # macfuse` before building with --features fuse. fuser = { version = "0.15", optional = true } [dependencies] clap = { version = "4", features = ["derive", "env"] } serde = { version = "1", features = ["derive"] } toml = "0.8" tokio = { version = "1", features = ["full"] } sysinfo = "0.30" anyhow = "1" tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } chrono = { version = "0.4", features = ["serde"] } axum = { version = "0.7", features = ["macros"] } tower-http = { version = "0.5", features = ["cors", "fs"] } tokio-stream = "0.1" serde_json = "1" # v1 — session IDs (Phase 9 S1). v4 random hex; no persistence # concerns beyond "opaque URL-safe id". uuid = { version = "1", features = ["v4"] } # v0.2.0 — flock(2) wrapper for atomic+locked manifest writes # (manifest.rs). Already a transitive dep; declaring it directly # makes the call site obvious. libc = "0.2" # v0.2.0 — sibling-tempfile + rename for atomic manifest persistence. # Was previously dev-dep only; promoted to main. tempfile = "3" # v0.11.1 — cluster membership via scuttlebutt gossip + phi-accrual failure # detection. Wraps in cluster/gossip.rs. UDP transport, keyed KV state per # node, seed_nodes bootstrap from [[cluster.peers]] config. chitchat = "0.11" # v0.11 — QUIC transport for peer RPC (Phase 1c). UDP-based; runs on a # separate port from chitchat gossip. TLS 1.3 by default; we wire mTLS # against a fleet root CA in cluster/transport.rs. quinn = { version = "0.11", default-features = false, features = ["runtime-tokio", "rustls-ring"] } # v0.23 — TLS 1.3 provider driving quinn's crypto. Pinned to the ring # provider so a single CryptoProvider is installed process-wide. rustls = { version = "0.23", default-features = false, features = ["ring"] } # v0.13 — X.509 cert generation for the fleet CA + per-node leaf certs. # Used both by production bootstrap (writes PEM to /etc/claw-store/tls/) # and by tests (in-memory ephemeral CA). rcgen = { version = "0.13", features = ["pem", "x509-parser"] } # v2 — parse PEM files into DER for rustls consumption. Used in # NodeIdentity::from_pem_files (Phase 1d) so persistent identity round-trips # through the file system on daemon restart. rustls-pemfile = "2" # v1 — content-addressed hashing for the Phase 2 blob store. BLAKE3 is # used both for whole-blob addressing (BlobId) and for per-chunk # addressing (dedup). Fast enough that a full-blob rehash on read # verification stays cheap. blake3 = "1" # v0.4 — tar archive writer/reader for the Phase 5 build-artifact # capture flow (cargo target/deps → tar → BlobPutStream). Preserves # file metadata (mtimes, perms) which cargo relies on for its own # incremental-rebuild fingerprint checks. tar = "0.4" # v0.13 — zstd wrapping around the tar stream. Level 3 is the default; # gets 5-10× compression on cargo .rlib without noticeable CPU cost. zstd = "0.13" # v0.12 — HTTP client for the Phase 7f Gitea live-refs adapter. # `rustls-tls` reuses the same rustls stack already pulled in by # quinn — no additional TLS impls in the binary. `json` unlocks # serde parsing of the /branches + /tags responses without a # hand-rolled decoder. `default-features=false` drops native-tls # and the openssl dep chain we don't need. reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json"] } [dev-dependencies] tempfile = "3" tower = { version = "0.5", features = ["util"] } http-body-util = "0.1"