Tahinli/forge
public0 watching
★ 0
| 1 | [workspace] |
| 2 | resolver = "3" |
| 3 | members = [ |
| 4 | "crates/forge-core", |
| 5 | "crates/forge-git", |
| 6 | "crates/forge-ssh", |
| 7 | "crates/forge-web", |
| 8 | "crates/forge-ci", |
| 9 | "crates/forge-runner", |
| 10 | ] |
| 11 | |
| 12 | [workspace.package] |
| 13 | version = "0.1.0" |
| 14 | edition = "2024" |
| 15 | license = "AGPL-3.0-or-later" |
| 16 | |
| 17 | [workspace.dependencies] |
| 18 | tower = { version = "0.5.3", features = ["util"] } |
| 19 | tower-http = { version = "0.7.1", features = ["compression-br", "compression-gzip"] } |
| 20 | gix = { version = "0.89.0", default-features = false, features = ["revision", "blob-diff", "max-performance-safe", "sha1"] } |
| 21 | comrak = "0.56.0" |
| 22 | emojis = "0.9.0" |
| 23 | ammonia = "4.2.3" |
| 24 | syntect = { version = "5.3.0", default-features = false, features = ["default-fancy"] } |
| 25 | hmac = "0.13.0" |
| 26 | sha1 = "0.11.0" |
| 27 | image = { version = "0.25.10", default-features = false, features = ["png", "jpeg", "webp", "gif"] } |
| 28 | # internal crates |
| 29 | forge-core = { path = "crates/forge-core" } |
| 30 | forge-ci = { path = "crates/forge-ci" } |
| 31 | forge-git = { path = "crates/forge-git" } |
| 32 | forge-ssh = { path = "crates/forge-ssh" } |
| 33 | forge-runner = { path = "crates/forge-runner" } |
| 34 | |
| 35 | # async runtime and HTTP plumbing |
| 36 | tokio = { version = "1.53.3", features = ["full"] } |
| 37 | futures-util = "0.3.34" |
| 38 | bytes = "1.12.1" |
| 39 | http = "1.5.0" |
| 40 | http-body-util = "0.1.5" |
| 41 | async-compression = { version = "0.4.50", features = ["tokio", "gzip"] } |
| 42 | tokio-util = "0.7.20" |
| 43 | http-body = "1.1.0" |
| 44 | |
| 45 | # errors, serialization, data |
| 46 | thiserror = "2.0.21" |
| 47 | globset = "0.4.20" |
| 48 | ipnet = "2.12.2" |
| 49 | serde = { version = "1.0.229", features = ["derive"] } |
| 50 | serde_json = "1.0.154" |
| 51 | toml = "1.1.8" |
| 52 | ulid = "3.0.0" |
| 53 | time = { version = "0.3.55", features = ["formatting", "parsing", "macros"] } |
| 54 | unicode-normalization = "0.1.25" |
| 55 | form_urlencoded = "1.2.2" |
| 56 | jiff = { version = "0.2.38", default-features = false, features = ["std", "tzdb-bundle-always"] } |
| 57 | |
| 58 | # crypto |
| 59 | argon2 = "0.6.0" |
| 60 | rand = "0.10.3" |
| 61 | sha2 = "0.11.1" |
| 62 | hex = "0.4.3" |
| 63 | subtle = "2.6.1" |
| 64 | base64 = "0.23.1" |
| 65 | getrandom = "0.4.3" |
| 66 | rpassword = "7.5.4" |
| 67 | chacha20poly1305 = "0.11.0" |
| 68 | |
| 69 | # storage |
| 70 | turso = "0.8.3" |
| 71 | object_store = { version = "0.14.2", default-features = false, features = ["fs"] } |
| 72 | multer = "3.1.0" |
| 73 | |
| 74 | # outgoing mail (forge-web): SMTP over rustls, no native TLS |
| 75 | lettre = { version = "0.11.23", default-features = false, features = ["smtp-transport", "builder", "tokio1-rustls", "ring", "webpki-roots", "pool"] } |
| 76 | |
| 77 | # web framework |
| 78 | topcoat = { version = "0.10.0", default-features = false, features = ["router", "view", "runtime", "cookie", "asset", "serve", "sse", "discover", "multipart"] } |
| 79 | |
| 80 | # ssh server |
| 81 | russh = "0.64.1" |
| 82 | |
| 83 | # observability |
| 84 | tracing = "0.1.44" |
| 85 | tracing-subscriber = "0.3.23" |
| 86 | |
| 87 | # OCI image pulls and layer unpacking (forge-runner) |
| 88 | oci-client = "0.18.0" |
| 89 | tar = "0.4.46" |
| 90 | flate2 = "1.1.10" |
| 91 | zstd = "0.14.2" |
| 92 | |
| 93 | # CLI and test servers (forge-runner) |
| 94 | clap = { version = "4.6.7", features = ["derive"] } |
| 95 | hyper = { version = "1.12.0", features = ["server", "http1"] } |
| 96 | hyper-util = { version = "0.1.21", features = ["tokio"] } |
| 97 | |
| 98 | # sandbox (forge-runner): in-process containers, no systemd, no youki CLI, no C libraries. |
| 99 | # The seccomp profile is built with the pure-Rust seccompiler (json feature resolves syscall names) |
| 100 | # and installed by forge-runner's own executor, so libcontainer's libseccomp feature stays off. |
| 101 | libcontainer = { version = "0.7.0", default-features = false, features = ["v2"] } |
| 102 | seccompiler = { version = "0.5.0", features = ["json"] } |
| 103 | oci-spec = "0.10.0" |
| 104 | nix = { version = "0.31.3", features = ["signal", "process", "mount", "sched", "user", "resource", "fs"] } |
| 105 | |
| 106 | # build and test |
| 107 | grass = "0.13.4" |
| 108 | tempfile = "3.27.0" |
| 109 | reqwest = { version = "0.13.5", default-features = false, features = ["rustls", "form", "stream"] } |
| 110 | scraper = "0.27.0" |
| 111 | similar = "3.2.0" |
| 112 | |
| 113 | # security advisories (forge-core): semver matching and OSV zip dumps |
| 114 | semver = "1.0.28" |
| 115 | zip = { version = "9.0.3", default-features = false, features = ["deflate"] } |
| 116 | |
| 117 | [profile.dev.package.sha2] |
| 118 | # self-update hashes the ~1 GB debug binary at boot; unoptimized sha2 takes ~26 s. |
| 119 | opt-level = 3 |
| 120 | |
| 121 | [profile.release] |
| 122 | lto = true |
| 123 | codegen-units = 1 |
| 124 | |
| 125 | [profile.dist] |
| 126 | inherits = "release" |
| 127 | lto = "thin" |
| 128 | codegen-units = 16 |