| 1 | [workspace] | |
| 2 | resolver = "2" | |
| 3 | # Crates are added here as they land, so `cargo test` at the workspace root is | |
| 4 | # green at every commit rather than only at the end. | |
| 5 | members = [ | |
| 6 | "crates/df-index", | |
| 7 | "crates/df-db", | |
| 8 | "crates/df-auth", | |
| 9 | "crates/df-store", | |
| 10 | "crates/df-render", | |
| 11 | "crates/df-worker", | |
| 12 | "crates/df-admin", | |
| 13 | "crates/df-hook", | |
| 14 | "crates/df-ssh", | |
| 15 | "crates/df-web", | |
| 16 | ] | |
| 17 | ||
| 18 | [workspace.package] | |
| 19 | version = "0.1.0" | |
| 20 | edition = "2021" | |
| 21 | rust-version = "1.85" | |
| 22 | license = "Apache-2.0" | |
| 23 | ||
| 24 | [workspace.dependencies] | |
| 25 | # ─── async runtime ─────────────────────────────────────────────────────────── | |
| 26 | tokio = { version = "1", features = ["rt-multi-thread", "macros", "net", "io-util", "signal", "process", "time", "fs", "sync"] } | |
| 27 | async-trait = "0.1" | |
| 28 | futures = "0.3" | |
| 29 | ||
| 30 | # ─── errors, logging ───────────────────────────────────────────────────────── | |
| 31 | anyhow = "1" | |
| 32 | thiserror = "2" | |
| 33 | tracing = "0.1" | |
| 34 | tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] } | |
| 35 | ||
| 36 | # ─── database ──────────────────────────────────────────────────────────────── | |
| 37 | # `postgres` + rustls: the provided instance requires sslmode=require. | |
| 38 | sqlx = { version = "0.8", default-features = false, features = [ | |
| 39 | "runtime-tokio", "tls-rustls-aws-lc-rs", "postgres", "uuid", "chrono", | |
| 40 | "json", "macros", "migrate", "ipnetwork", | |
| 41 | ] } | |
| 42 | uuid = { version = "1", features = ["v7", "serde"] } | |
| 43 | chrono = { version = "0.4", default-features = false, features = ["std", "serde", "clock"] } | |
| 44 | ||
| 45 | # ─── git plumbing ──────────────────────────────────────────────────────────── | |
| 46 | # CONSTRAINT (spec §3 rule 1): `gix` may appear ONLY in df-store's dependency | |
| 47 | # list. This is enforced by `scripts/check-store-boundary.sh` in CI. | |
| 48 | gix = { version = "0.68", default-features = false, features = [ | |
| 49 | "max-performance-safe", "blob-diff", "revision", "attributes", | |
| 50 | # Landing a change server-side (decided §13.2: fast-forward + merge commit). | |
| 51 | # `merge` brings the three-way tree merge; `tree-editor` writes its result. | |
| 52 | "merge", "tree-editor", | |
| 53 | ] } | |
| 54 | ||
| 55 | # ─── web ───────────────────────────────────────────────────────────────────── | |
| 56 | axum = { version = "0.8", features = ["macros", "http2"] } | |
| 57 | axum-extra = { version = "0.10", features = ["cookie", "typed-header"] } | |
| 58 | tower = { version = "0.5", features = ["util", "timeout", "limit"] } | |
| 59 | tower-http = { version = "0.6", features = ["trace", "compression-gzip", "set-header", "catch-panic", "limit"] } | |
| 60 | maud = { version = "0.27", features = ["axum"] } | |
| 61 | http = "1" | |
| 62 | hyper = "1" | |
| 63 | mime_guess = "2" | |
| 64 | ||
| 65 | # ─── auth ──────────────────────────────────────────────────────────────────── | |
| 66 | openidconnect = "4" | |
| 67 | argon2 = "0.5" | |
| 68 | rand = "0.8" | |
| 69 | base64 = "0.22" | |
| 70 | hmac = "0.12" | |
| 71 | sha2 = "0.10" | |
| 72 | subtle = "2" | |
| 73 | ||
| 74 | # ─── ssh ───────────────────────────────────────────────────────────────────── | |
| 75 | russh = "0.51" | |
| 76 | russh-keys = "0.49" | |
| 77 | # Parsing user-pasted public keys in df-auth. Upstream `ssh-key` rather than | |
| 78 | # russh's vendored fork: the SHA256 fingerprint format is standardised, so both | |
| 79 | # sides agree, and df-auth does not need to pull in an SSH server. | |
| 80 | ssh-key = { version = "0.6", features = ["ed25519", "ecdsa", "rsa"] } | |
| 81 | ||
| 82 | # ─── rendering ─────────────────────────────────────────────────────────────── | |
| 83 | comrak = "0.39" | |
| 84 | ammonia = "4" | |
| 85 | tree-sitter = "0.25" | |
| 86 | tree-sitter-highlight = "0.25" | |
| 87 | similar = { version = "2", features = ["text", "inline"] } | |
| 88 | ||
| 89 | # ─── misc ──────────────────────────────────────────────────────────────────── | |
| 90 | serde = { version = "1", features = ["derive"] } | |
| 91 | serde_json = "1" | |
| 92 | reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } | |
| 93 | lru = "0.12" | |
| 94 | url = "2" | |
| 95 | percent-encoding = "2" | |
| 96 | clap = { version = "4", features = ["derive", "env"] } | |
| 97 | dotenvy = "0.15" | |
| 98 | hex = "0.4" | |
| 99 | ||
| 100 | [profile.release] | |
| 101 | # The indexer walks large object graphs; LTO and a single codegen unit are worth | |
| 102 | # the build time. `panic = "abort"` is deliberately NOT set — df-web catches | |
| 103 | # panics per-request via tower-http's CatchPanic so one bad diff cannot take the | |
| 104 | # process down (spec §8). | |
| 105 | lto = "thin" | |
| 106 | codegen-units = 1 | |
| 107 | strip = "debuginfo" |
107 lines · TOML