app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit ffdbb255870ae898d135380ea1cc7327f15113a3
parent ec2ff203594277b698f630bb5ae70e4004086461
Author: triesap <tyson@radroots.org>
Date:   Fri, 31 Jul 2026 19:58:48 +0000

deps: align the prepublication release cohort

- Pin the workspace and toolchain to Rust 1.97.1.
- Align sibling Radroots dependencies to 0.1.0-alpha.
- Add local registry patches for coordinated sibling checkouts.
- Guard dependency and patch cohorts with source tests.

Diffstat:
A.cargo/config.toml | 25+++++++++++++++++++++++++
MAGENTS.md | 3++-
MCONTRIBUTING.md | 10++++++++--
MCargo.lock | 364++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
MCargo.toml | 32++++++++++++++++----------------
Mcrates/desktop/Cargo.toml | 1+
Mcrates/desktop/src/source_guards.rs | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mrust-toolchain.toml | 2+-
8 files changed, 471 insertions(+), 87 deletions(-)

diff --git a/.cargo/config.toml b/.cargo/config.toml @@ -0,0 +1,25 @@ +# Migration-only local development overrides. The SDK retains registry-only +# production manifests; these patches allow a coordinated sibling checkout to +# resolve the canonical pre-publication Radroots cohort. +[patch.crates-io] +radroots_blossom = { path = "../lib/crates/blossom" } +radroots_core = { path = "../lib/crates/core" } +radroots_event_store = { path = "../lib/crates/event_store" } +radroots_event = { path = "../lib/crates/event" } +radroots_event_codec = { path = "../lib/crates/event_codec" } +radroots_geocoder = { path = "../lib/crates/geocoder" } +radroots_identity = { path = "../lib/crates/identity" } +radroots_nostr = { path = "../lib/crates/nostr" } +radroots_nostr_connect = { path = "../lib/crates/nostr_connect" } +radroots_nostr_signer = { path = "../lib/crates/nostr_signer" } +radroots_outbox = { path = "../lib/crates/outbox" } +radroots_protocol = { path = "../lib/crates/protocol" } +radroots_protected_store = { path = "../lib/crates/protected_store" } +radroots_secret_vault = { path = "../lib/crates/secret_vault" } +radroots_signing = { path = "../lib/crates/signing" } +radroots_transport = { path = "../lib/crates/transport" } +radroots_transport_nostr = { path = "../lib/crates/transport_nostr" } +radroots_transport_reticulum = { path = "../lib/crates/transport_reticulum" } +radroots_runtime_paths = { path = "../lib/crates/runtime_paths" } +radroots_sql_core = { path = "../lib/crates/sql_core" } +radroots_trade = { path = "../lib/crates/trade" } diff --git a/AGENTS.md b/AGENTS.md @@ -32,6 +32,7 @@ Before making substantial changes: - Run validation from the repository root. - Prefer the narrowest relevant validation first. - Use documented commands before inventing new ones. +- `.github/**` and capsule-local CI workflows are forbidden; keep validation forge-agnostic, and place any required monorepo orchestration exclusively under the parent monorepo's root `.act/**` authority. - Current canonical commands are: - `cargo metadata --format-version 1 --no-deps` - `cargo check -p radroots_studio_app` @@ -48,7 +49,7 @@ Before making substantial changes: ## 7. Rust engineering rules -- Use Rust `1.92.0`, edition `2024`, and safe Rust only. +- Use Rust `1.97.1`, edition `2024`, and safe Rust only. - Keep state, data flow, and side effects explicit. - Avoid hidden panics in non-test code. - Keep code readable and direct. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md @@ -13,8 +13,8 @@ Keep the filetree small and direct until a larger application boundary is justif Install the pinned Rust toolchain: ```bash -rustup toolchain install 1.97.0 -rustup override set 1.97.0 +rustup toolchain install 1.97.1 +rustup override set 1.97.1 ``` Confirm your environment: @@ -28,6 +28,12 @@ rustc --version Run these commands from the repository root. +Before the initial Radroots crate cohort is published, the checked-in Cargo +configuration resolves the SDK's registry dependencies from sibling `lib` and +`sdk` checkouts. Keep all three repositories adjacent in a coordinated source +checkout. Exact `=0.1.0-alpha` requirements remain enforced; the local patches +change only dependency source selection. + ```bash cargo metadata --format-version 1 --no-deps cargo check -p radroots_studio_app diff --git a/Cargo.lock b/Cargo.lock @@ -557,6 +557,12 @@ dependencies = [ ] [[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] name = "base62" version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1393,6 +1399,12 @@ dependencies = [ ] [[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] name = "crossbeam-channel" version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1442,6 +1454,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] name = "crypto-common" version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1727,6 +1751,23 @@ dependencies = [ ] [[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "ff", + "generic-array", + "group", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] name = "embed-resource" version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1756,6 +1797,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" [[package]] +name = "enum-as-inner" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] name = "enum-iterator" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1949,6 +2002,16 @@ dependencies = [ ] [[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] name = "fiat-crypto" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2307,6 +2370,7 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", ] [[package]] @@ -2781,6 +2845,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12101ecc8225ea6d675bc70263074eab6169079621c2186fe0c66590b2df9681" [[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] name = "h2" version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2905,6 +2980,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] +name = "hickory-proto" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502" +dependencies = [ + "async-trait", + "cfg-if", + "data-encoding", + "enum-as-inner", + "futures-channel", + "futures-io", + "futures-util", + "idna", + "ipnet", + "once_cell", + "rand 0.9.4", + "ring", + "thiserror 2.0.18", + "tinyvec", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hickory-resolver" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a" +dependencies = [ + "cfg-if", + "futures-util", + "hickory-proto", + "ipconfig", + "moka", + "once_cell", + "parking_lot", + "rand 0.9.4", + "resolv-conf", + "smallvec", + "thiserror 2.0.18", + "tokio", + "tracing", +] + +[[package]] name = "hidden-trait" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3347,6 +3468,19 @@ dependencies = [ ] [[package]] +name = "ipconfig" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" +dependencies = [ + "socket2", + "widestring", + "windows-registry 0.6.1", + "windows-result 0.4.1", + "windows-sys 0.61.2", +] + +[[package]] name = "ipnet" version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3444,6 +3578,16 @@ dependencies = [ ] [[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "elliptic-curve", +] + +[[package]] name = "khronos-egl" version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3964,6 +4108,23 @@ dependencies = [ ] [[package]] +name = "moka" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" +dependencies = [ + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] name = "moxcms" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -4479,6 +4640,10 @@ name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +dependencies = [ + "critical-section", + "portable-atomic", +] [[package]] name = "oo7" @@ -4867,6 +5032,12 @@ dependencies = [ ] [[package]] +name = "portable-atomic" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d20d5497ef88037a52ff98267d066e7f11fcc5e99bbfbd58a42336193aacec3" + +[[package]] name = "postage" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -5115,15 +5286,15 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] name = "radroots_authority" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "radroots_event", - "radroots_nostr", + "radroots_identity", ] [[package]] name = "radroots_blossom" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "mediatype", "serde", @@ -5134,22 +5305,22 @@ dependencies = [ [[package]] name = "radroots_core" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "rust_decimal", - "rust_decimal_macros", "serde", ] [[package]] name = "radroots_event" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "hex", "jiff-tzdb", "radroots_blossom", "radroots_core", - "secp256k1", + "radroots_identity", + "radroots_protocol", "serde", "serde_json", "sha2", @@ -5159,23 +5330,28 @@ dependencies = [ [[package]] name = "radroots_event_codec" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ - "nostr", "radroots_blossom", "radroots_core", "radroots_event", + "radroots_identity", + "radroots_protocol", + "secp256k1", "serde", "serde_json", ] [[package]] name = "radroots_event_store" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ + "getrandom 0.2.17", "hex", + "radroots_blossom", "radroots_event", - "radroots_nostr", + "radroots_event_codec", + "radroots_identity", "radroots_transport", "serde", "serde_json", @@ -5186,7 +5362,7 @@ dependencies = [ [[package]] name = "radroots_geocoder" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "futures-executor", "hex", @@ -5197,27 +5373,22 @@ dependencies = [ "sqlx", "tempfile", "thiserror 1.0.69", + "tokio", "url", ] [[package]] name = "radroots_identity" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ - "nostr", - "radroots_protected_store", - "radroots_runtime", - "radroots_runtime_paths", - "radroots_secret_vault", + "k256", "serde", - "serde_json", - "thiserror 1.0.69", - "tracing", + "thiserror 2.0.18", ] [[package]] name = "radroots_log" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "chrono", "serde_json", @@ -5229,13 +5400,13 @@ dependencies = [ [[package]] name = "radroots_nostr" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "nostr", - "nostr-sdk", "radroots_event", "radroots_event_codec", "radroots_identity", + "radroots_signing", "serde", "serde_json", "thiserror 1.0.69", @@ -5243,8 +5414,9 @@ dependencies = [ [[package]] name = "radroots_nostr_accounts" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ + "nostr", "radroots_identity", "radroots_nostr_signer", "radroots_protected_store", @@ -5258,9 +5430,13 @@ dependencies = [ [[package]] name = "radroots_nostr_connect" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "nostr", + "radroots_event", + "radroots_identity", + "radroots_nostr", + "radroots_protocol", "serde", "serde_json", "thiserror 1.0.69", @@ -5269,7 +5445,7 @@ dependencies = [ [[package]] name = "radroots_nostr_signer" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "hex", "nostr", @@ -5287,11 +5463,12 @@ dependencies = [ [[package]] name = "radroots_outbox" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "hex", "radroots_event", "radroots_event_store", + "radroots_protocol", "radroots_transport", "serde", "serde_json", @@ -5302,7 +5479,7 @@ dependencies = [ [[package]] name = "radroots_protected_store" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "chacha20poly1305", "getrandom 0.2.17", @@ -5313,15 +5490,15 @@ dependencies = [ ] [[package]] -name = "radroots_protocol_contract_v1" -version = "1.0.0-alpha.1" +name = "radroots_protocol" +version = "0.1.0-alpha" dependencies = [ "serde", ] [[package]] name = "radroots_runtime" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "anyhow", "chacha20poly1305", @@ -5342,16 +5519,8 @@ dependencies = [ ] [[package]] -name = "radroots_runtime_contract_v1" -version = "0.1.0" -dependencies = [ - "radroots_protocol_contract_v1", - "serde", -] - -[[package]] name = "radroots_runtime_paths" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "serde", "thiserror 1.0.69", @@ -5359,7 +5528,7 @@ dependencies = [ [[package]] name = "radroots_runtime_store" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "radroots_sql_core", "serde", @@ -5369,12 +5538,11 @@ dependencies = [ [[package]] name = "radroots_sdk" -version = "0.1.0" +version = "0.1.0-alpha" dependencies = [ "base64 0.22.1", "hex", "nostr", - "radroots_authority", "radroots_event", "radroots_event_codec", "radroots_event_store", @@ -5385,9 +5553,10 @@ dependencies = [ "radroots_nostr_signer", "radroots_outbox", "radroots_protected_store", - "radroots_runtime_contract_v1", + "radroots_protocol", "radroots_runtime_paths", "radroots_secret_vault", + "radroots_signing", "radroots_trade", "radroots_transport", "radroots_transport_nostr", @@ -5402,11 +5571,20 @@ dependencies = [ [[package]] name = "radroots_secret_vault" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" + +[[package]] +name = "radroots_signing" +version = "0.1.0-alpha" +dependencies = [ + "radroots_event", + "radroots_identity", + "radroots_protocol", +] [[package]] name = "radroots_sql_core" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "chrono", "futures-executor", @@ -5450,6 +5628,7 @@ dependencies = [ "thiserror 2.0.18", "tokio", "tokio-tungstenite", + "toml 0.8.23", "tracing", "tracing-subscriber", "uuid", @@ -5577,36 +5756,37 @@ dependencies = [ [[package]] name = "radroots_trade" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "base64 0.22.1", "hex", - "radroots_authority", "radroots_core", "radroots_event", "radroots_event_codec", - "radroots_event_store", + "radroots_identity", "serde", "serde_json", "sha2", - "sqlx", - "thiserror 1.0.69", ] [[package]] name = "radroots_transport" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ + "radroots_event", + "radroots_identity", + "radroots_protocol", "serde", "sha2", ] [[package]] name = "radroots_transport_nostr" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "futures", "nostr", + "nostr-sdk", "radroots_event", "radroots_event_store", "radroots_nostr", @@ -5621,7 +5801,7 @@ dependencies = [ [[package]] name = "radroots_transport_reticulum" -version = "1.0.0-alpha.1" +version = "0.1.0-alpha" dependencies = [ "radroots_transport", ] @@ -5884,9 +6064,8 @@ checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ "base64 0.22.1", "bytes", - "futures-channel", "futures-core", - "futures-util", + "hickory-resolver", "http", "http-body", "http-body-util", @@ -5895,6 +6074,7 @@ dependencies = [ "hyper-util", "js-sys", "log", + "once_cell", "percent-encoding", "pin-project-lite", "quinn", @@ -5917,6 +6097,12 @@ dependencies = [ ] [[package]] +name = "resolv-conf" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" + +[[package]] name = "resvg" version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -6093,16 +6279,6 @@ dependencies = [ ] [[package]] -name = "rust_decimal_macros" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74a5a6f027e892c7a035c6fddb50435a1fbf5a734ffc0c2a9fed4d0221440519" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] name = "rustc-hash" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -6359,6 +6535,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "subtle", + "zeroize", +] + +[[package]] name = "secp256k1" version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -7192,6 +7381,12 @@ dependencies = [ ] [[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] name = "take-until" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -8424,6 +8619,12 @@ dependencies = [ ] [[package]] +name = "widestring" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" + +[[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -8624,6 +8825,17 @@ dependencies = [ ] [[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + +[[package]] name = "windows-result" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -8642,6 +8854,15 @@ dependencies = [ ] [[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] name = "windows-strings" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -8660,6 +8881,15 @@ dependencies = [ ] [[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/Cargo.toml b/Cargo.toml @@ -17,7 +17,7 @@ resolver = "2" version = "0.1.0" edition = "2024" authors = ["Radroots Authors"] -rust-version = "1.97.0" +rust-version = "1.97.1" license = "GPL-3.0-or-later" repository = "https://github.com/radrootslabs/studio_app" homepage = "https://radroots.org" @@ -32,21 +32,21 @@ gpui-component = "0.5.1" gpui-component-assets = "0.5.1" mf2_i18n = { version = "=0.1.0", git = "https://github.com/triesap/mf2_i18n.git", rev = "e95f0fe090764dc62f5f67f4ff9e207d7e1cd901", default-features = false } nostr = "0.44.2" -radroots_core = { version = "=1.0.0-alpha.1", path = "../lib/crates/core", default-features = false, features = ["std"] } -radroots_authority = { version = "=1.0.0-alpha.1", path = "../lib/crates/authority" } -radroots_event = { version = "=1.0.0-alpha.1", path = "../lib/crates/event", default-features = false, features = ["serde", "std"] } -radroots_event_codec = { version = "=1.0.0-alpha.1", path = "../lib/crates/event_codec", features = ["serde_json"] } -radroots_identity = { version = "=1.0.0-alpha.1", path = "../lib/crates/identity" } -radroots_runtime_store = { version = "=1.0.0-alpha.1", path = "../lib/crates/runtime_store", features = ["native"] } -radroots_nostr = { version = "=1.0.0-alpha.1", path = "../lib/crates/nostr", features = ["client"] } -radroots_nostr_accounts = { version = "=1.0.0-alpha.1", path = "../lib/crates/nostr_accounts" } -radroots_nostr_connect = { version = "=1.0.0-alpha.1", path = "../lib/crates/nostr_connect" } -radroots_protected_store = { version = "=1.0.0-alpha.1", path = "../lib/crates/protected_store" } -radroots_runtime_paths = { version = "=1.0.0-alpha.1", path = "../lib/crates/runtime_paths" } -radroots_secret_vault = { version = "=1.0.0-alpha.1", path = "../lib/crates/secret_vault", default-features = false, features = ["std"] } -radroots_sdk = { path = "../sdk/crates/sdk", features = ["local-runtime"] } -radroots_sql_core = { version = "=1.0.0-alpha.1", path = "../lib/crates/sql_core", features = ["native"] } -radroots_trade = { version = "=1.0.0-alpha.1", path = "../lib/crates/trade", default-features = false, features = ["std", "serde", "serde_json"] } +radroots_core = { version = "=0.1.0-alpha", path = "../lib/crates/core", default-features = false, features = ["std"] } +radroots_authority = { version = "=0.1.0-alpha", path = "../lib/crates/authority" } +radroots_event = { version = "=0.1.0-alpha", path = "../lib/crates/event", default-features = false, features = ["serde", "std"] } +radroots_event_codec = { version = "=0.1.0-alpha", path = "../lib/crates/event_codec", features = ["json"] } +radroots_identity = { version = "=0.1.0-alpha", path = "../lib/crates/identity" } +radroots_runtime_store = { version = "=0.1.0-alpha", path = "../lib/crates/runtime_store", features = ["native"] } +radroots_nostr = { version = "=0.1.0-alpha", path = "../lib/crates/nostr", features = ["client"] } +radroots_nostr_accounts = { version = "=0.1.0-alpha", path = "../lib/crates/nostr_accounts" } +radroots_nostr_connect = { version = "=0.1.0-alpha", path = "../lib/crates/nostr_connect" } +radroots_protected_store = { version = "=0.1.0-alpha", path = "../lib/crates/protected_store" } +radroots_runtime_paths = { version = "=0.1.0-alpha", path = "../lib/crates/runtime_paths" } +radroots_secret_vault = { version = "=0.1.0-alpha", path = "../lib/crates/secret_vault", default-features = false, features = ["std"] } +radroots_sdk = { version = "=0.1.0-alpha", path = "../sdk/crates/sdk", features = ["local-runtime"] } +radroots_sql_core = { version = "=0.1.0-alpha", path = "../lib/crates/sql_core", features = ["native"] } +radroots_trade = { version = "=0.1.0-alpha", path = "../lib/crates/trade", default-features = false, features = ["std", "serde", "serde_json"] } radroots_studio_app_core = { path = "crates/runtime", version = "0.1.0" } radroots_studio_app_i18n = { path = "crates/i18n", version = "0.1.0" } radroots_studio_app_types = { path = "crates/types", version = "0.1.0" } diff --git a/crates/desktop/Cargo.toml b/crates/desktop/Cargo.toml @@ -44,6 +44,7 @@ uuid.workspace = true [dev-dependencies] nostr.workspace = true radroots_studio_app_sqlite = { workspace = true, features = ["test-support"] } +toml.workspace = true tracing-subscriber.workspace = true [lints] diff --git a/crates/desktop/src/source_guards.rs b/crates/desktop/src/source_guards.rs @@ -6,6 +6,48 @@ use std::{ const ALLOWED_MENU_LITERALS: &[&str] = &["cmd-q", "settings window should open"]; +const SIBLING_RADROOTS_DEPENDENCIES: &[&str] = &[ + "radroots_authority", + "radroots_core", + "radroots_event", + "radroots_event_codec", + "radroots_identity", + "radroots_nostr", + "radroots_nostr_accounts", + "radroots_nostr_connect", + "radroots_protected_store", + "radroots_runtime_paths", + "radroots_runtime_store", + "radroots_sdk", + "radroots_secret_vault", + "radroots_sql_core", + "radroots_trade", +]; +const SIBLING_RADROOTS_VERSION_REQUIREMENT: &str = "=0.1.0-alpha"; +const LOCAL_RADROOTS_REGISTRY_PATCHES: &[&str] = &[ + "radroots_blossom", + "radroots_core", + "radroots_event", + "radroots_event_codec", + "radroots_event_store", + "radroots_geocoder", + "radroots_identity", + "radroots_nostr", + "radroots_nostr_connect", + "radroots_nostr_signer", + "radroots_outbox", + "radroots_protected_store", + "radroots_protocol", + "radroots_runtime_paths", + "radroots_secret_vault", + "radroots_signing", + "radroots_sql_core", + "radroots_trade", + "radroots_transport", + "radroots_transport_nostr", + "radroots_transport_reticulum", +]; + const ALLOWED_WINDOW_LITERALS: &[&str] = &[ "", " ", @@ -1372,6 +1414,85 @@ const SDK_BOUNDARY_EXCEPTIONS: &[SdkBoundaryExceptionEntry] = &[ ]; #[test] +fn sibling_radroots_dependencies_use_the_canonical_release_cohort() { + let manifest_source = read_source_path(app_root().join("Cargo.toml").as_path()); + let manifest: toml::Value = + toml::from_str(manifest_source.as_str()).expect("workspace Cargo.toml should parse"); + let dependencies = manifest + .get("workspace") + .and_then(|workspace| workspace.get("dependencies")) + .and_then(toml::Value::as_table) + .expect("workspace.dependencies should be a TOML table"); + + let discovered = dependencies + .iter() + .filter_map(|(name, dependency)| { + dependency + .get("path") + .and_then(toml::Value::as_str) + .is_some_and(|path| path.starts_with("../lib/") || path.starts_with("../sdk/")) + .then_some(name.as_str()) + }) + .collect::<BTreeSet<_>>(); + let expected = SIBLING_RADROOTS_DEPENDENCIES + .iter() + .copied() + .collect::<BTreeSet<_>>(); + + assert_eq!( + discovered, expected, + "every sibling Radroots dependency must be covered by the canonical release cohort guard" + ); + for name in SIBLING_RADROOTS_DEPENDENCIES { + let requirement = dependencies + .get(*name) + .and_then(|dependency| dependency.get("version")) + .and_then(toml::Value::as_str); + assert_eq!( + requirement, + Some(SIBLING_RADROOTS_VERSION_REQUIREMENT), + "{name} must use the canonical exact Radroots release cohort" + ); + } +} + +#[test] +fn local_registry_patches_cover_the_sdk_prepublication_cohort() { + let app_root = app_root(); + let config_source = read_source_path(app_root.join(".cargo/config.toml").as_path()); + let config: toml::Value = + toml::from_str(config_source.as_str()).expect(".cargo/config.toml should parse"); + let patches = config + .get("patch") + .and_then(|patch| patch.get("crates-io")) + .and_then(toml::Value::as_table) + .expect("patch.crates-io should be a TOML table"); + let discovered = patches.keys().map(String::as_str).collect::<BTreeSet<_>>(); + let expected = LOCAL_RADROOTS_REGISTRY_PATCHES + .iter() + .copied() + .collect::<BTreeSet<_>>(); + + assert_eq!( + discovered, expected, + "local registry patches must cover exactly the SDK prepublication cohort" + ); + for name in LOCAL_RADROOTS_REGISTRY_PATCHES { + let path = patches + .get(*name) + .and_then(|patch| patch.get("path")) + .and_then(toml::Value::as_str) + .unwrap_or_else(|| panic!("{name} must define a local patch path")); + let package_manifest = app_root.join(path).join("Cargo.toml"); + assert!( + package_manifest.is_file(), + "{name} patch target must contain Cargo.toml: {}", + package_manifest.display() + ); + } +} + +#[test] fn desktop_menu_source_uses_localized_copy_paths() { assert_eq!( extract_string_literals(include_str!("menus.rs")), diff --git a/rust-toolchain.toml b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "1.97.0" +channel = "1.97.1" targets = [ "aarch64-apple-ios", "aarch64-apple-ios-sim",