| 1 | [workspace] |
| 2 | members = [ |
| 3 | "crates/agent", |
| 4 | "crates/app-server", |
| 5 | "crates/build-support", |
| 6 | "crates/cli", |
| 7 | "crates/config", |
| 8 | "crates/core", |
| 9 | "crates/execpolicy", |
| 10 | "crates/hooks", |
| 11 | "crates/lane", |
| 12 | "crates/mcp", |
| 13 | "crates/paths", |
| 14 | "crates/protocol", |
| 15 | "crates/release", |
| 16 | "crates/secrets", |
| 17 | "crates/state", |
| 18 | "crates/telemetry", |
| 19 | "crates/tools", |
| 20 | "crates/tui", |
| 21 | "crates/workflow", |
| 22 | "crates/workflow-js", |
| 23 | ] |
| 24 | default-members = ["crates/cli", "crates/app-server", "crates/tui"] |
| 25 | resolver = "2" |
| 26 | |
| 27 | [workspace.package] |
| 28 | version = "0.9.4" |
| 29 | edition = "2024" |
| 30 | # Rust 1.88 stabilized `let_chains` in `if`/`while` conditions, which the |
| 31 | # codebase relies on extensively. Cargo enforces this so users on older |
| 32 | # toolchains get a clear "package requires rustc 1.88+" error instead of a |
| 33 | # confusing E0658 from rustc. |
| 34 | rust-version = "1.88" |
| 35 | license = "MIT" |
| 36 | repository = "https://github.com/Hmbown/CodeWhale" |
| 37 | |
| 38 | [workspace.dependencies] |
| 39 | anyhow = "1.0.100" |
| 40 | async-trait = "0.1.89" |
| 41 | axum = { version = "0.8.5", features = ["json"] } |
| 42 | chrono = { version = "0.4.43", features = ["serde"] } |
| 43 | clap = { version = "4.5.54", features = ["derive"] } |
| 44 | clap_complete = "4.5" |
| 45 | dirs = "6.0.0" |
| 46 | encoding_rs = "0.8.35" |
| 47 | jsonschema = { version = "0.48", default-features = false } |
| 48 | reqwest = { version = "0.13.1", default-features = false, features = ["json", "rustls-no-provider", "socks"] } |
| 49 | # NOT "parallel": the Workflow VM stays single-threaded and bridges to the |
| 50 | # multi-thread engine over channels (see crates/workflow-js). |
| 51 | rquickjs = { version = "0.12", features = ["futures"] } |
| 52 | rustls = { version = "0.23.36", default-features = false, features = ["ring", "std", "tls12"] } |
| 53 | rusqlite = { version = "0.39.0", features = ["bundled"] } |
| 54 | serde = { version = "1.0.228", features = ["derive"] } |
| 55 | serde_json = "1.0.149" |
| 56 | semver = "1.0.28" |
| 57 | thiserror = "2.0" |
| 58 | tempfile = "3.27" |
| 59 | tokio = { version = "1.50.0", features = ["fs", "io-util", "io-std", "macros", "net", "process", "rt", "rt-multi-thread", "signal", "sync", "time"] } |
| 60 | toml = "1.0.6" |
| 61 | toml_edit = "0.25.12" |
| 62 | sha2 = "0.11" |
| 63 | tower-http = { version = "0.7", features = ["cors"] } |
| 64 | tracing = "0.1" |
| 65 | tracing-appender = "0.2" |
| 66 | tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] } |
| 67 | uuid = { version = "1.11", features = ["v4"] } |
| 68 | mimalloc = { version = "0.1", default-features = false } |
| 69 | |
| 70 | # The everyday `--release` gate (AGENTS.md pre-push build): optimized but |
| 71 | # fast to produce. Shipping artifacts use `--profile dist` below — fat LTO on |
| 72 | # a 680k-line crate belongs in release CI, not in every contributor's loop |
| 73 | # (#5246; community-reported 8–16 minute local release builds, #4991). |
| 74 | # Dev/test carry line tables instead of full debug info. Backtraces still name |
| 75 | # the file and line of every frame — the thing anyone actually reads — but the |
| 76 | # per-variable DWARF that no one inspects without a debugger attached is gone. |
| 77 | # The debug binary was 227 MB and target/debug had grown past 260 GB; those |
| 78 | # links are IO-bound, so the debuginfo is paid on every incremental build. |
| 79 | # Anyone stepping through under lldb can override this locally. |
| 80 | [profile.dev] |
| 81 | debug = "line-tables-only" |
| 82 | |
| 83 | [profile.release] |
| 84 | lto = "thin" |
| 85 | strip = true |
| 86 | codegen-units = 16 |
| 87 | |
| 88 | # Shipping profile: exactly the optimization the released binaries have |
| 89 | # always had. Every workflow that uploads a binary to users builds with |
| 90 | # `--profile dist` and collects from `target/**/dist/`. |
| 91 | # NOTE: no `panic = "abort"` here — the TUI's panic supervision |
| 92 | # (catch_unwind/spawn_supervised) needs unwinding so one panicking tool call |
| 93 | # or task fails gracefully instead of aborting the whole session. |
| 94 | [profile.dist] |
| 95 | inherits = "release" |
| 96 | lto = true |
| 97 | strip = true |
| 98 | codegen-units = 1 |
| 99 | |
| 100 | # Patch unicode-width so that width() uses CJK tables when the cjk feature |
| 101 | # is enabled. Vanilla unicode-width 0.2.2 provides width_cjk() as a separate |
| 102 | # method but the original width() always uses non-CJK tables, so Ratatui |
| 103 | # (which calls width() internally) measures ambiguous-width characters |
| 104 | # (circled digits, enclosed alphanumerics) as 1 column. CJK terminals render |
| 105 | # them as 2 columns, causing cell-offset rendering glitches. (#4479) |
| 106 | [patch.crates-io] |
| 107 | unicode-width = { path = "patches/unicode-width-0.2.2" } |
| 108 |