cli

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

commit a43f499a5be5655176377b9cc174a83bc9b076fd
parent 6343ebe1310bde309a5bfe63ff86f104dd0545d1
Author: triesap <tyson@radroots.org>
Date:   Thu,  9 Jul 2026 18:10:46 +0000

mesh: align CLI status fields

- expose mesh status with transport, configured, and implementation fields
- update mesh scope and policy views to avoid retired status names
- extend CLI source-boundary coverage for mesh status DTOs
- verify CLI formatting, check, transport tests, and sync tests

Diffstat:
Msrc/out/terminal/renderers/runtime.rs | 18++++--------------
Msrc/runtime/mesh.rs | 10+++++-----
Msrc/view/runtime.rs | 10+++++-----
Mtests/target_cli.rs | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
4 files changed, 74 insertions(+), 26 deletions(-)

diff --git a/src/out/terminal/renderers/runtime.rs b/src/out/terminal/renderers/runtime.rs @@ -264,12 +264,7 @@ fn mesh_scope_document(envelope: &OutputEnvelope, result: &Value) -> TerminalDoc let mut document = common::document_with_title(envelope, title); common::push_path_field(&mut document, "State", result, &["state"]); common::push_path_field(&mut document, "Scope", result, &["scope"]); - common::push_path_field( - &mut document, - "Implementation", - result, - &["implementation_state"], - ); + common::push_path_field(&mut document, "Implementation", result, &["implementation"]); common::push_path_field(&mut document, "Message", result, &["message"]); document } @@ -279,14 +274,9 @@ fn mesh_status_document(envelope: &OutputEnvelope, result: &Value) -> TerminalDo let mut document = common::document_with_title(envelope, title); common::push_path_field(&mut document, "State", result, &["state"]); common::push_path_field(&mut document, "Scope", result, &["scope"]); - common::push_path_field(&mut document, "Kind", result, &["transport_kind"]); - common::push_path_field(&mut document, "Configured", result, &["configured_state"]); - common::push_path_field( - &mut document, - "Implementation", - result, - &["implementation_state"], - ); + common::push_path_field(&mut document, "Transport", result, &["transport"]); + common::push_bool_field(&mut document, "Configured", result, &["configured"]); + common::push_path_field(&mut document, "Implementation", result, &["implementation"]); common::push_bool_field(&mut document, "Usable", result, &["usable_for_delivery"]); common::push_path_field(&mut document, "Decision", result, &["decision"]); common::push_path_field(&mut document, "Message", result, &["message"]); diff --git a/src/runtime/mesh.rs b/src/runtime/mesh.rs @@ -41,9 +41,9 @@ pub fn status(config: &RuntimeConfig) -> MeshStatusView { state: "ready".to_owned(), source: MESH_SOURCE.to_owned(), scope: scope.to_owned(), - transport_kind: "reticulum".to_owned(), - configured_state: scope.to_owned(), - implementation_state: "preview_unavailable".to_owned(), + transport: "reticulum".to_owned(), + configured: scope != "disabled", + implementation: "preview_unavailable".to_owned(), usable_for_delivery: false, message: "Reticulum mesh preview is explicit and unavailable for real delivery".to_owned(), } @@ -55,7 +55,7 @@ pub fn policy_check(config: &RuntimeConfig) -> MeshPolicyCheckView { source: MESH_SOURCE.to_owned(), scope: config.mesh.scope.as_str().to_owned(), policy: "reticulum_preview_delivery".to_owned(), - transport_kind: "reticulum".to_owned(), + transport: "reticulum".to_owned(), usable_for_delivery: false, decision: "reject_delivery_attempt".to_owned(), message: "Reticulum preview never falls back to Nostr and cannot deliver real events" @@ -68,7 +68,7 @@ fn scope_view(scope: &str, state: &str) -> MeshScopeView { state: state.to_owned(), source: MESH_SOURCE.to_owned(), scope: scope.to_owned(), - implementation_state: "preview_unavailable".to_owned(), + implementation: "preview_unavailable".to_owned(), message: "Mesh delivery is disabled unless a preview scope is explicitly configured" .to_owned(), actions: vec!["radroots mesh policy check".to_owned()], diff --git a/src/view/runtime.rs b/src/view/runtime.rs @@ -3368,7 +3368,7 @@ pub struct MeshScopeView { pub state: String, pub source: String, pub scope: String, - pub implementation_state: String, + pub implementation: String, pub message: String, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub actions: Vec<String>, @@ -3379,9 +3379,9 @@ pub struct MeshStatusView { pub state: String, pub source: String, pub scope: String, - pub transport_kind: String, - pub configured_state: String, - pub implementation_state: String, + pub transport: String, + pub configured: bool, + pub implementation: String, pub usable_for_delivery: bool, pub message: String, } @@ -3392,7 +3392,7 @@ pub struct MeshPolicyCheckView { pub source: String, pub scope: String, pub policy: String, - pub transport_kind: String, + pub transport: String, pub usable_for_delivery: bool, pub decision: String, pub message: String, diff --git a/tests/target_cli.rs b/tests/target_cli.rs @@ -1812,9 +1812,11 @@ fn mesh_status_reports_reticulum_preview_unusable_state_without_fallback() { let result = &value["result"]; assert_eq!(value["operation_id"], "mesh.status"); - assert_eq!(result["transport_kind"], "reticulum"); - assert_eq!(result["implementation_state"], "preview_unavailable"); + assert_eq!(result["transport"], "reticulum"); + assert_eq!(result["configured"], false); + assert_eq!(result["implementation"], "preview_unavailable"); assert_eq!(result["usable_for_delivery"], false); + assert_no_removed_transport_status_fields(result); assert_contains(&result["message"], "Reticulum mesh preview is explicit"); assert!( !result["message"] @@ -1916,6 +1918,62 @@ fn transport_source_boundary_rejects_removed_relay_and_publish_proxy_surfaces() ); } + let mesh_scope_view_source = source_window( + view_source.as_str(), + "pub struct MeshScopeView", + "pub struct MeshStatusView", + ); + assert!( + mesh_scope_view_source.contains("pub implementation: String,"), + "mesh scope view must retain canonical implementation field" + ); + assert!( + !mesh_scope_view_source.contains("pub implementation_state:"), + "mesh scope view must not expose removed implementation_state field" + ); + + let mesh_status_view_source = source_window( + view_source.as_str(), + "pub struct MeshStatusView", + "pub struct MeshPolicyCheckView", + ); + for required in [ + "pub transport: String,", + "pub configured: bool,", + "pub implementation: String,", + "pub usable_for_delivery: bool,", + "pub message: String,", + ] { + assert!( + mesh_status_view_source.contains(required), + "mesh status view must retain canonical field `{required}`" + ); + } + for forbidden in [ + "pub transport_kind:", + "pub configured_state:", + "pub implementation_state:", + ] { + assert!( + !mesh_status_view_source.contains(forbidden), + "mesh status view must not expose removed field `{forbidden}`" + ); + } + + let mesh_policy_view_source = source_window( + view_source.as_str(), + "pub struct MeshPolicyCheckView", + "pub struct RpcStatusView", + ); + assert!( + mesh_policy_view_source.contains("pub transport: String,"), + "mesh policy view must retain canonical transport field" + ); + assert!( + !mesh_policy_view_source.contains("pub transport_kind:"), + "mesh policy view must not expose removed transport_kind field" + ); + let sdk_source = fs::read_to_string(manifest_dir.join("src/runtime/sdk.rs")).expect("read sdk"); for required in [ "pub(crate) fn validate_proxy_bearer_token",