cli

Command-line interface for Radroots
git clone https://radroots.dev/git/cli.git
Log | Files | Refs | README | LICENSE

commit 9046b9bac6fd1129c6fdd8a5ee835d7851744415
parent e0797c775856e9e58630feb811360c20c18fcebd
Author: triesap <tyson@radroots.org>
Date:   Tue,  7 Jul 2026 06:27:19 +0000

transport: harden CLI transport guards

- add a transport source-boundary test for removed relay and publish proxy surfaces
- keep Reticulum preview profile and mesh output free of Nostr fallback guidance
- construct the Nostr provider test with an explicit Nostr transport profile
- validate with fmt, cli check, and the transport-filtered CLI test lane

Diffstat:
Msrc/runtime/provider.rs | 13++++++++-----
Mtests/target_cli.rs | 32++++++++++++++++++++++++++++++++
2 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/src/runtime/provider.rs b/src/runtime/provider.rs @@ -389,22 +389,25 @@ mod tests { #[test] fn write_plane_provider_tracks_nostr_transport_publish() { - let config = sample_config(Vec::new(), false); + let mut config = sample_config(Vec::new(), false); + config.transport = crate::runtime::config::TransportConfig::from_nostr_relay_urls(vec![ + "wss://relay.example.com".to_owned(), + ]); let publish = publish_view( &config, - "unconfigured", - Some("Nostr transport profile requires a configured Nostr relay"), + "ready", + Some("Nostr relay transport is configured for delivery"), ); let view = resolve_write_plane_provider(&config, &publish); assert_eq!(view.provider_runtime_id, "nostr"); assert_eq!(view.binding_model, "nostr_transport"); - assert_eq!(view.state, "unconfigured"); + assert_eq!(view.state, "ready"); assert_eq!( view.provenance, ProviderProvenance::TransportProfile.as_str() ); assert!(view.target.is_none()); - assert!(view.detail.contains("configured Nostr relay")); + assert!(view.detail.contains("configured for delivery")); } #[test] diff --git a/tests/target_cli.rs b/tests/target_cli.rs @@ -1376,6 +1376,38 @@ fn mesh_status_reports_reticulum_preview_unusable_state_without_fallback() { ); } +#[test] +fn transport_source_boundary_rejects_removed_relay_and_publish_proxy_surfaces() { + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); + + assert!( + !manifest_dir.join("src/cli/relay.rs").exists(), + "removed relay command module must not be reintroduced" + ); + + for relative_path in [ + "src/runtime/transport.rs", + "src/runtime/sdk.rs", + "src/runtime/sync.rs", + "src/cli/transport.rs", + ] { + let source = fs::read_to_string(manifest_dir.join(relative_path)).expect("read source"); + for forbidden in [ + "radrootsd.publish_proxy.v1", + "publish.relays.resolve", + "\"publish.event\"", + "transport_kinds", + "allowed_relay_policy", + "relay_policy", + ] { + assert!( + !source.contains(forbidden), + "{relative_path} must not contain removed transport surface `{forbidden}`" + ); + } + } +} + fn help_lists(stdout: &str, command: &str) -> bool { stdout.lines().any(|line| { let line = line.trim_start();