[workspace] resolver = "3" members = [ "crates/openlogi", "crates/openlogi-core", "crates/openlogi-inject", "crates/openlogi-hidpp", "crates/openlogi-hidpp-derive", "crates/openlogi-hid", "crates/openlogi-camera", "crates/openlogi-permissions", "crates/openlogi-assets", "crates/openlogi-cli", "crates/openlogi-ipc", "crates/openlogi-agent-core", "crates/openlogi-agent", "crates/openlogi-desktop", "crates/openlogi-ui", "crates/openlogi-overlay", "crates/openlogi-hook", "xtask", ] # The CLI used to be the root package, so a bare `cargo build` / `cargo run` # built it alone. Keep that: without this, a virtual workspace defaults to every # member, dragging GPUI's Metal shader toolchain into the simplest build there is. default-members = ["crates/openlogi"] [workspace.package] version = "0.7.4" edition = "2024" # Tracks current stable rather than trailing it. OpenLogi ships as an app — # prebuilt installers, and no crate here has an external reverse dependency — # so a floor below stable buys nobody compatibility and only costs us APIs. # Raise this freely the day a release lands something worth using; the `msrv` # CI matrix keeps the number honest for `cargo install`. rust-version = "1.98" license = "MIT OR Apache-2.0" repository = "https://github.com/AprilNEA/OpenLogi" authors = ["AprilNEA "] description = "Lightweight, local-first alternative to Logitech Options+ for HID++ devices" [workspace.dependencies] hidpp = { package = "openlogi-hidpp", path = "crates/openlogi-hidpp", version = "0.7.4" } async-hid = "0.5.2" # Cross-platform local IPC for the agent <-> GUI tarpc transport: a Unix-domain # socket on Unix, a named pipe on Windows. The `tokio` feature gives the async # Stream/Listener used by serde_transport. interprocess = { version = "2", features = ["tokio"] } # The agent <-> GUI RPC layer itself, over the `interprocess` transport above. # 0.38 is a hard floor: earlier releases hard-depend on opentelemetry 0.30 (not # feature-gated — google/tarpc#564), which drags the vulnerable # opentelemetry_sdk 0.30 into the graph (GHSA-w9wp-h8wv-79jx). tarpc = { version = "0.38", features = ["serde1", "serde-transport", "serde-transport-bincode", "tokio1"] } # Windows FFI for the leaf input/HID paths (WH_MOUSE_LL hook, SendInput action # synthesis, native HID writes). Features are selected per crate. windows-sys = "0.61" tokio = { version = "1", default-features = false, features = ["rt", "macros", "sync", "time"] } futures-lite = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" toml = "0.8" ureq = { version = "3", default-features = false, features = ["rustls", "platform-verifier", "json"] } sha2 = "0.10" atomic-write-file = "0.3.0" backon = { version = "1.6", default-features = false, features = ["std", "std-blocking-sleep"] } clap = { version = "4", features = ["derive", "env"] } anyhow = "1" thiserror = "2" num_enum = "0.7.3" tracing = "0.1" tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "env-filter"] } core-graphics = { version = "0.25", default-features = false, features = ["link"] } core-foundation = { version = "0.10", default-features = false, features = ["link"] } opener = "0.8.5" shellexpand = "3.1.2" evdev = "0.13" # macOS ObjC / C FFI (see platform/CLAUDE.md): objc2 gives leak-proof Retained # bindings, and the framework crates give typed bindings for the C APIs (privacy # permissions included) instead of hand-written `#[link] extern "C"` blocks. # Feature lists are selected per crate — these crates are huge, so every entry is # `default-features = false`. The version stays unified so a resolve can't move # gpui's Cargo.lock pin out from under the GUI. objc2 = "0.6.4" objc2-app-kit = "0.3.2" objc2-foundation = "0.3.2" objc2-core-foundation = { version = "0.3.2", default-features = false } objc2-application-services = { version = "0.3.2", default-features = false } objc2-core-graphics = { version = "0.3.2", default-features = false } objc2-io-kit = { version = "0.3.2", default-features = false } # The block ABI crate objc2's generated bindings use for handler arguments; # same unified-version rationale as the objc2 crates above. block2 = "0.6.2" # gpui / gpui_platform track zed's default branch, matching how gpui-component # declares them (an explicit rev here would fork the git source and conflict). # The exact, compatible zed commit is pinned in Cargo.lock instead — bump it # deliberately with `cargo update`, in lockstep with the gpui-component rev. gpui = { git = "https://github.com/zed-industries/zed" } gpui_platform = { git = "https://github.com/zed-industries/zed", features = ["font-kit", "x11", "wayland"] } gpui-component = { git = "https://github.com/longbridge/gpui-component", rev = "031555662e99a1b5a549990b47f246d475b8288a" } # Pinned to the same rev as gpui-component: this crate embeds the lucide SVGs # that the `IconName` enum is macro-generated from, so the two must agree. gpui-component-assets = { git = "https://github.com/longbridge/gpui-component", rev = "031555662e99a1b5a549990b47f246d475b8288a" } [workspace.lints.rust] # Denied workspace-wide, but `deny` (not `forbid`) so a crate that genuinely # needs FFI can opt in locally with `#[expect(unsafe_code, reason = "…")]`. unsafe_code = "deny" [workspace.lints.clippy] pedantic = { level = "warn", priority = -1 } unwrap_used = "warn" expect_used = "warn" missing_errors_doc = "allow" doc_markdown = "allow" # Machine-checks the suppression policy in .claude/rules/rust.md: every # suppression states a reason, and reaches for `expect` unless it cannot work. # Blind spot worth knowing: `allow_attributes` only sees outer `#[allow]`, so a # module-wide `#![allow(…)]` — the shape that rots worst — still needs review. allow_attributes = "warn" allow_attributes_without_reason = "warn" # Shared lint set, kept in sync with # https://gist.github.com/AprilNEA/cdf81f76840fcb883a32503ee7caa539. # `cast_*` and `ptr_as_ptr` are pedantic members already; they are listed # explicitly so the set stands on its own if the pedantic group ever moves. assertions_on_result_states = "warn" cast_possible_truncation = "warn" cast_possible_wrap = "warn" cast_sign_loss = "warn" error_impl_error = "warn" exit = "warn" or_fun_call = "warn" ptr_as_ptr = "warn" tests_outside_test_module = "warn" undocumented_unsafe_blocks = "warn" [profile.dev] debug = "limited" [profile.dev.package."*"] debug = false [profile.release] lto = "fat" codegen-units = 1 strip = "symbols"