openshell-0.0.21-1.20260406205235926512.midstream.73.g8592ab0

List of Findings

Error: CLIPPY_WARNING: [#def1]
crates/openshell-bootstrap/src/container_runtime.rs:6:5: warning: item in documentation is missing backticks
#    |
#  6 | //! OpenShell supports both Docker and Podman as container runtimes. This module
#    |     ^^^^^^^^^
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#    = note: `-W clippy::doc-markdown` implied by `-W clippy::pedantic`
#    = help: to override `-W clippy::pedantic` add `#[allow(clippy::doc_markdown)]`
#  help: try
#    |
#  6 - //! OpenShell supports both Docker and Podman as container runtimes. This module
#  6 + //! `OpenShell` supports both Docker and Podman as container runtimes. This module
#    |

Error: CLIPPY_WARNING: [#def2]
crates/openshell-bootstrap/src/container_runtime.rs:85:1: warning: this `impl` can be derived
#     |
#  85 | / impl Default for ContainerRuntime {
#  86 | |     fn default() -> Self {
#  87 | |         Self::Docker
#  88 | |     }
#  89 | | }
#     | |_^
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#derivable_impls
#     = note: `-W clippy::derivable-impls` implied by `-W clippy::all`
#     = help: to override `-W clippy::all` add `#[allow(clippy::derivable_impls)]`
#  help: replace the manual implementation with a derive attribute and mark the default variant
#     |
#  34 + #[derive(Default)]
#  35 | pub enum ContainerRuntime {
#  36 ~     #[default]
#  37 ~     Docker,
#     |

Error: CLIPPY_WARNING: [#def3]
crates/openshell-bootstrap/src/container_runtime.rs:185:5: warning: this `if` statement can be collapsed
#      |
#  185 | /     if let Ok(docker_host) = std::env::var("DOCKER_HOST") {
#  186 | |         if docker_host.starts_with("tcp://") || docker_host.starts_with("ssh://") {
#  187 | |             return true;
#  188 | |         }
#  189 | |     }
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#      = note: `-W clippy::collapsible-if` implied by `-W clippy::all`
#      = help: to override `-W clippy::all` add `#[allow(clippy::collapsible_if)]`
#  help: collapse nested if block
#      |
#  185 ~     if let Ok(docker_host) = std::env::var("DOCKER_HOST")
#  186 ~         && (docker_host.starts_with("tcp://") || docker_host.starts_with("ssh://")) {
#  187 |             return true;
#  188 ~         }
#      |

Error: CLIPPY_WARNING: [#def4]
crates/openshell-bootstrap/src/container_runtime.rs:265:5: warning: this `if` statement can be collapsed
#      |
#  265 | /     if let Ok(docker_host) = std::env::var("DOCKER_HOST") {
#  266 | |         if let Some(path) = docker_host.strip_prefix("unix://") {
#  267 | |             push_if_socket_exists(&mut found, path);
#  268 | |         }
#  269 | |     }
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  265 ~     if let Ok(docker_host) = std::env::var("DOCKER_HOST")
#  266 ~         && let Some(path) = docker_host.strip_prefix("unix://") {
#  267 |             push_if_socket_exists(&mut found, path);
#  268 ~         }
#      |

Error: CLIPPY_WARNING: [#def5]
crates/openshell-bootstrap/src/docker.rs:51:1: warning: pub(crate) function inside private module
#     |
#  51 | pub(crate) fn resolve_gpu_device_ids(
#     | ----------^^^^^^^^^^^^^^^^^^^^^^^^^^
#     | |
#     | help: consider using: `pub`
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate
#     = note: `-W clippy::redundant-pub-crate` implied by `-W clippy::nursery`
#     = help: to override `-W clippy::nursery` add `#[allow(clippy::redundant_pub_crate)]`

Error: CLIPPY_WARNING: [#def6]
crates/openshell-bootstrap/src/docker.rs:198:1: warning: pub(crate) function inside private module
#      |
#  198 | pub(crate) fn connect_local(runtime: ContainerRuntime) -> Result<Docker> {
#      | ----------^^^^^^^^^^^^^^^^^
#      | |
#      | help: consider using: `pub`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def7]
crates/openshell-bootstrap/src/docker.rs:211:13: warning: this `if` statement can be collapsed
#      |
#  211 | /             if let Ok(host) = std::env::var("CONTAINER_HOST") {
#  212 | |                 if let Some(path) = host.strip_prefix("unix://") {
#  213 | |                     return Docker::connect_with_socket(path, 120, API_DEFAULT_VERSION).map_err(
#  214 | |                         |err| {
#  ...   |
#  223 | |             }
#      | |_____________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  211 ~             if let Ok(host) = std::env::var("CONTAINER_HOST")
#  212 ~                 && let Some(path) = host.strip_prefix("unix://") {
#  213 |                     return Docker::connect_with_socket(path, 120, API_DEFAULT_VERSION).map_err(
#  ...
#  221 |                     );
#  222 ~                 }
#      |

Error: CLIPPY_WARNING: [#def8]
crates/openshell-bootstrap/src/docker.rs:226:13: warning: this `if` statement can be collapsed
#      |
#  226 | /             if let Ok(host) = std::env::var("DOCKER_HOST") {
#  227 | |                 if let Some(path) = host.strip_prefix("unix://") {
#  228 | |                     return Docker::connect_with_socket(path, 120, API_DEFAULT_VERSION).map_err(
#  229 | |                         |err| {
#  ...   |
#  238 | |             }
#      | |_____________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  226 ~             if let Ok(host) = std::env::var("DOCKER_HOST")
#  227 ~                 && let Some(path) = host.strip_prefix("unix://") {
#  228 |                     return Docker::connect_with_socket(path, 120, API_DEFAULT_VERSION).map_err(
#  ...
#  236 |                     );
#  237 ~                 }
#      |

Error: CLIPPY_WARNING: [#def9]
crates/openshell-bootstrap/src/docker.rs:287:24: warning: variables can be used directly in the `format!` string
#      |
#  287 |               hints.push(format!(
#      |  ________________________^
#  288 | |                 "No container runtime socket found and {} is not set.",
#  289 | |                 host_env
#  290 | |             ));
#      | |_____________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#uninlined_format_args
#      = note: `-W clippy::uninlined-format-args` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::uninlined_format_args)]`

Error: CLIPPY_WARNING: [#def10]
crates/openshell-bootstrap/src/docker.rs:313:19: warning: called `unwrap` on `env_val` after checking its variant with `is_none`
#      |
#  283 |     if env_val.is_none() {
#      |     -------------------- help: try: `if let Some(<item>) = env_val`
#  ...
#  313 |         let val = env_val.unwrap();
#      |                   ^^^^^^^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#unnecessary_unwrap
#      = note: `-W clippy::unnecessary-unwrap` implied by `-W clippy::all`
#      = help: to override `-W clippy::all` add `#[allow(clippy::unnecessary_unwrap)]`

Error: CLIPPY_WARNING: [#def11]
crates/openshell-bootstrap/src/docker.rs:403:44: warning: this `map_or` can be simplified
#      |
#  403 |         .filter(|c| is_gateway_image(c) && port.map_or(true, |p| has_port(c, p)))
#      |                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#unnecessary_map_or
#      = note: `-W clippy::unnecessary-map-or` implied by `-W clippy::all`
#      = help: to override `-W clippy::all` add `#[allow(clippy::unnecessary_map_or)]`
#  help: use is_none_or instead
#      |
#  403 -         .filter(|c| is_gateway_image(c) && port.map_or(true, |p| has_port(c, p)))
#  403 +         .filter(|c| is_gateway_image(c) && port.is_none_or(|p| has_port(c, p)))
#      |

Error: CLIPPY_WARNING: [#def12]
crates/openshell-bootstrap/src/docker.rs:409:24: warning: use Option::map_or_else instead of an if let/else
#      |
#  409 |               let hint = if let Some(p) = port {
#      |  ________________________^
#  410 | |                 format!(
#  411 | |                     "No openshell gateway container found listening on port {p}.\n\
#  412 | |                      Is the gateway running? Check with: docker ps (or podman ps)"
#  ...   |
#  417 | |                     .to_string()
#  418 | |             };
#      | |_____________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else
#      = note: `-W clippy::option-if-let-else` implied by `-W clippy::nursery`
#      = help: to override `-W clippy::nursery` add `#[allow(clippy::option_if_let_else)]`
#  help: try
#      |
#  409 ~             let hint = port.map_or_else(|| "No openshell gateway container found.\n\
#  410 +                  Is the gateway running? Check with: docker ps (or podman ps)"
#  411 +                     .to_string(), |p| format!(
#  412 +                     "No openshell gateway container found listening on port {p}.\n\
#  413 +                      Is the gateway running? Check with: docker ps (or podman ps)"
#  414 ~                 ));
#      |

Error: CLIPPY_WARNING: [#def13]
crates/openshell-bootstrap/src/docker.rs:545:1: warning: this function has too many arguments (12/7)
#      |
#  545 | / pub async fn ensure_container(
#  546 | |     docker: &Docker,
#  547 | |     name: &str,
#  548 | |     image_ref: &str,
#  ...   |
#  557 | |     runtime: ContainerRuntime,
#  558 | | ) -> Result<u16> {
#      | |________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#too_many_arguments
#      = note: `-W clippy::too-many-arguments` implied by `-W clippy::all`
#      = help: to override `-W clippy::all` add `#[allow(clippy::too_many_arguments)]`

Error: CLIPPY_WARNING: [#def14]
crates/openshell-bootstrap/src/docker.rs:925:13: warning: this `if` statement can be collapsed
#      |
#  925 | /             if let Some(public) = port.public_port {
#  926 | |                 if needed_ports.contains(&public) {
#  927 | |                     let cname = names
#  928 | |                         .first()
#  ...   |
#  941 | |             }
#      | |_____________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  925 ~             if let Some(public) = port.public_port
#  926 ~                 && needed_ports.contains(&public) {
#  927 |                     let cname = names
#  ...
#  939 |                     });
#  940 ~                 }
#      |

Error: CLIPPY_WARNING: [#def15]
crates/openshell-bootstrap/src/docker.rs:927:33: warning: called `map(<f>).unwrap_or_else(<g>)` on an `Option` value
#      |
#  927 |                       let cname = names
#      |  _________________________________^
#  928 | |                         .first()
#  929 | |                         .map(|n| n.trim_start_matches('/').to_string())
#  930 | |                         .unwrap_or_else(|| {
#  ...   |
#  934 | |                                 .unwrap_or_else(|| "<unknown>".to_string())
#  935 | |                         });
#      | |__________________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#map_unwrap_or
#      = note: `-W clippy::map-unwrap-or` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::map_unwrap_or)]`
#  help: try
#      |
#  927 ~                     let cname = names
#  928 +                         .first().map_or_else(|| {
#  929 +                             container
#  930 +                                 .id
#  931 +                                 .clone()
#  932 +                                 .unwrap_or_else(|| "<unknown>".to_string())
#  933 ~                         }, |n| n.trim_start_matches('/').to_string());
#      |

Error: CLIPPY_WARNING: [#def16]
crates/openshell-bootstrap/src/lib.rs:123:31: warning: item in documentation is missing backticks
#      |
#  123 |     /// - `[cdi-ids…]`  — CDI DeviceRequest with the given device IDs
#      |                               ^^^^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#      |
#  123 -     /// - `[cdi-ids…]`  — CDI DeviceRequest with the given device IDs
#  123 +     /// - `[cdi-ids…]`  — CDI `DeviceRequest` with the given device IDs
#      |

Error: CLIPPY_WARNING: [#def17]
crates/openshell-bootstrap/src/lib.rs:353:5: warning: all if blocks contain the same code at the start
#      |
#  353 | /     if remote_opts.is_some() {
#  354 | |         log("[status] Downloading gateway".to_string());
#      | |________________________________________________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#branches_sharing_code
#      = note: `-W clippy::branches-sharing-code` implied by `-W clippy::nursery`
#      = help: to override `-W clippy::nursery` add `#[allow(clippy::branches_sharing_code)]`
#  help: consider moving these statements before the if
#      |
#  353 ~     log("[status] Downloading gateway".to_string());
#  354 +     if remote_opts.is_some() {
#      |

Error: CLIPPY_WARNING: [#def18]
crates/openshell-bootstrap/src/lib.rs:747:1: warning: first doc comment paragraph is too long
#      |
#  747 | / /// Fetch the last `n` lines of container logs for a local gateway as a
#  748 | | /// `String`.  This is a convenience wrapper for diagnostic call sites (e.g.
#  749 | | /// failure diagnosis in the CLI) that do not hold a Docker client handle.
#  750 | | ///
#  751 | | /// Returns an empty string on any Docker/connection error so callers don't
#      | |_^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#too_long_first_doc_paragraph
#      = note: `-W clippy::too-long-first-doc-paragraph` implied by `-W clippy::nursery`
#      = help: to override `-W clippy::nursery` add `#[allow(clippy::too_long_first_doc_paragraph)]`

Error: CLIPPY_WARNING: [#def19]
crates/openshell-bootstrap/src/lib.rs:754:5: warning: this could be rewritten as `let...else`
#      |
#  754 | /     let docker = match Docker::connect_with_local_defaults() {
#  755 | |         Ok(d) => d,
#  756 | |         Err(_) => return String::new(),
#  757 | |     };
#      | |______^ help: consider writing: `let Ok(docker) = Docker::connect_with_local_defaults() else { return String::new() };`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#manual_let_else
#      = note: `-W clippy::manual-let-else` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::manual_let_else)]`

Error: CLIPPY_WARNING: [#def20]
crates/openshell-bootstrap/src/metadata.rs:320:5: warning: this `if` statement can be collapsed
#      |
#  320 | /     if let Some(current) = load_last_sandbox(gateway) {
#  321 | |         if current == sandbox {
#  322 | |             if let Ok(path) = last_sandbox_path(gateway) {
#  323 | |                 let _ = std::fs::remove_file(path);
#  ...   |
#  326 | |     }
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  320 ~     if let Some(current) = load_last_sandbox(gateway)
#  321 ~         && current == sandbox {
#  322 |             if let Ok(path) = last_sandbox_path(gateway) {
#  323 |                 let _ = std::fs::remove_file(path);
#  324 |             }
#  325 ~         }
#      |

Error: CLIPPY_WARNING: [#def21]
crates/openshell-bootstrap/src/metadata.rs:321:9: warning: this `if` statement can be collapsed
#      |
#  321 | /         if current == sandbox {
#  322 | |             if let Ok(path) = last_sandbox_path(gateway) {
#  323 | |                 let _ = std::fs::remove_file(path);
#  324 | |             }
#  325 | |         }
#      | |_________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  321 ~         if current == sandbox
#  322 ~             && let Ok(path) = last_sandbox_path(gateway) {
#  323 |                 let _ = std::fs::remove_file(path);
#  324 ~             }
#      |

Error: CLIPPY_WARNING: [#def22]
crates/openshell-cli/src/auth.rs:75:19: warning: casting `u64` to `usize` may truncate the value on targets with 32-bit wide pointers
#     |
#  75 |         let idx = (hash_b as usize) % charset.len();
#     |                   ^^^^^^^^^^^^^^^^^
#     |
#     = help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_possible_truncation
#     = note: `-W clippy::cast-possible-truncation` implied by `-W clippy::pedantic`
#     = help: to override `-W clippy::pedantic` add `#[allow(clippy::cast_possible_truncation)]`
#  help: ... or use `try_from` and handle the error accordingly
#     |
#  75 -         let idx = (hash_b as usize) % charset.len();
#  75 +         let idx = usize::try_from(hash_b) % charset.len();
#     |

Error: CLIPPY_WARNING: [#def23]
crates/openshell-cli/src/auth.rs:131:41: warning: used underscore-prefixed binding
#      |
#  131 |         std::io::stdin().read_line(&mut _input).ok();
#      |                                         ^^^^^^
#      |
#  note: binding is defined here
#     --> crates/openshell-cli/src/auth.rs:130:13
#      |
#  130 |         let mut _input = String::new();
#      |             ^^^^^^^^^^
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#used_underscore_binding
#      = note: `-W clippy::used-underscore-binding` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::used_underscore_binding)]`

Error: CLIPPY_WARNING: [#def24]
crates/openshell-cli/src/bootstrap.rs:104:8: warning: this pattern matching can be expressed using equality
#      |
#  104 |     if let Some(false) = override_value {
#      |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `override_value == Some(false)`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#equatable_if_let
#      = note: `-W clippy::equatable-if-let` implied by `-W clippy::nursery`
#      = help: to override `-W clippy::nursery` add `#[allow(clippy::equatable_if_let)]`

Error: CLIPPY_WARNING: [#def25]
crates/openshell-cli/src/main.rs:823:27: warning: item in documentation is missing backticks
#      |
#  823 |         /// When enabled, OpenShell auto-selects CDI when the Docker daemon has
#      |                           ^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#      = note: `-W clippy::doc-markdown` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::doc_markdown)]`
#  help: try
#      |
#  823 -         /// When enabled, OpenShell auto-selects CDI when the Docker daemon has
#  823 +         /// When enabled, `OpenShell` auto-selects CDI when the Docker daemon has
#      |

Error: CLIPPY_WARNING: [#def26]
crates/openshell-cli/src/main.rs:1158:22: warning: item in documentation is missing backticks
#       |
#  1158 |         /// Accepts [bind_address:]port (e.g. 8080, 0.0.0.0:8080). Keeps the sandbox alive.
#       |                      ^^^^^^^^^^^^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#       |
#  1158 -         /// Accepts [bind_address:]port (e.g. 8080, 0.0.0.0:8080). Keeps the sandbox alive.
#  1158 +         /// Accepts [`bind_address`:]port (e.g. 8080, 0.0.0.0:8080). Keeps the sandbox alive.
#       |

Error: CLIPPY_WARNING: [#def27]
crates/openshell-cli/src/main.rs:1515:31: warning: item in documentation is missing backticks
#       |
#  1515 |         /// Port to forward: [bind_address:]port (e.g. 8080, 0.0.0.0:8080).
#       |                               ^^^^^^^^^^^^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#       |
#  1515 -         /// Port to forward: [bind_address:]port (e.g. 8080, 0.0.0.0:8080).
#  1515 +         /// Port to forward: [`bind_address`:]port (e.g. 8080, 0.0.0.0:8080).
#       |

Error: CLIPPY_WARNING: [#def28]
crates/openshell-cli/src/main.rs:1543:1: warning: async block generated by this macro may allocate a lot of stack space
#       |
#  1543 | #[tokio::main]
#       | ^^^^^^^^^^^^^^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#large_stack_frames
#       = note: `-W clippy::large-stack-frames` implied by `-W clippy::nursery`
#       = help: to override `-W clippy::nursery` add `#[allow(clippy::large_stack_frames)]`

Error: CLIPPY_WARNING: [#def29]
crates/openshell-cli/src/main.rs:1596:17: warning: large future with a size of 16776 bytes
#       |
#  1596 | /                 run::gateway_admin_deploy(
#  1597 | |                     &name,
#  1598 | |                     remote.as_deref(),
#  1599 | |                     ssh_key.as_deref(),
#  ...    |
#  1608 | |                     cli.container_runtime.as_deref(),
#  1609 | |                 )
#       | |_________________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#large_futures
#       = note: `-W clippy::large-futures` implied by `-W clippy::pedantic`
#       = help: to override `-W clippy::pedantic` add `#[allow(clippy::large_futures)]`
#  help: consider `Box::pin` on it
#       |
#  1596 ~                 Box::pin(run::gateway_admin_deploy(
#  1597 +                     &name,
#  1598 +                     remote.as_deref(),
#  1599 +                     ssh_key.as_deref(),
#  1600 +                     port,
#  1601 +                     gateway_host.as_deref(),
#  1602 +                     recreate,
#  1603 +                     plaintext,
#  1604 +                     disable_gateway_auth,
#  1605 +                     registry_username.as_deref(),
#  1606 +                     registry_token.as_deref(),
#  1607 +                     gpu,
#  1608 +                     cli.container_runtime.as_deref(),
#  1609 +                 ))
#       |

Error: CLIPPY_WARNING: [#def30]
crates/openshell-cli/src/main.rs:1750:29: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#       |
#  1750 |                       None => match run::find_forward_by_port(port)? {
#       |  _____________________________^
#  1751 | |                         Some(n) => {
#  1752 | |                             eprintln!("→ Found forward on sandbox '{n}'");
#  1753 | |                             n
#  ...    |
#  1759 | |                     },
#       | |_____________________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#       = note: `-W clippy::single-match-else` implied by `-W clippy::pedantic`
#       = help: to override `-W clippy::pedantic` add `#[allow(clippy::single_match_else)]`
#  help: try
#       |
#  1750 ~                     None => if let Some(n) = run::find_forward_by_port(port)? {
#  1751 ~                         eprintln!("→ Found forward on sandbox '{n}'");
#  1752 +                         n
#  1753 +                     } else {
#  1754 +                         eprintln!("{} No active forward found for port {port}", "!".yellow(),);
#  1755 +                         return Ok(());
#  1756 ~                     },
#       |

Error: CLIPPY_WARNING: [#def31]
crates/openshell-cli/src/run.rs:345:14: warning: this parameter is a mutable reference but is not used mutably
#      |
#  345 |     fn clear(&mut self) {
#      |              ^----^^^^
#      |               |
#      |               help: consider removing this `mut`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#needless_pass_by_ref_mut
#      = note: `-W clippy::needless-pass-by-ref-mut` implied by `-W clippy::nursery`
#      = help: to override `-W clippy::nursery` add `#[allow(clippy::needless_pass_by_ref_mut)]`

Error: CLIPPY_WARNING: [#def32]
crates/openshell-cli/src/run.rs:389:29: warning: casting `u64` to `f64` may cause a loss of precision (`u64` is 64 bits wide, but `f64`'s mantissa is only 52 bits wide)
#      |
#  389 |         format!("{:.1} GB", bytes as f64 / GB as f64)
#      |                             ^^^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_precision_loss
#      = note: `-W clippy::cast-precision-loss` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::cast_precision_loss)]`

Error: CLIPPY_WARNING: [#def33]
crates/openshell-cli/src/run.rs:389:44: warning: casting `u64` to `f64` may cause a loss of precision (`u64` is 64 bits wide, but `f64`'s mantissa is only 52 bits wide)
#      |
#  389 |         format!("{:.1} GB", bytes as f64 / GB as f64)
#      |                                            ^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_precision_loss

Error: CLIPPY_WARNING: [#def34]
crates/openshell-cli/src/run.rs:395:9: warning: variables can be used directly in the `format!` string
#      |
#  395 |         format!("{} B", bytes)
#      |         ^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#uninlined_format_args
#      = note: `-W clippy::uninlined-format-args` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::uninlined_format_args)]`
#  help: change this to
#      |
#  395 -         format!("{} B", bytes)
#  395 +         format!("{bytes} B")
#      |

Error: CLIPPY_WARNING: [#def35]
crates/openshell-cli/src/run.rs:624:19: warning: use Option::map_or_else instead of an if let/else
#      |
#  624 |           let msg = if let Some(detail) = &self.progress {
#      |  ___________________^
#  625 | |             format!("{} ({})", self.status, detail.dimmed())
#  626 | |         } else {
#  627 | |             self.status.clone()
#  628 | |         };
#      | |_________^ help: try: `self.progress.as_ref().map_or_else(|| self.status.clone(), |detail| format!("{} ({})", self.status, detail.dimmed()))`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else
#      = note: `-W clippy::option-if-let-else` implied by `-W clippy::nursery`
#      = help: to override `-W clippy::nursery` add `#[allow(clippy::option_if_let_else)]`

Error: CLIPPY_WARNING: [#def36]
crates/openshell-cli/src/run.rs:991:28: warning: use Option::map_or_else instead of an if let/else
#      |
#  991 |       let detected_runtime = match openshell_bootstrap::detect_runtime(None) {
#      |  ____________________________^
#  992 | |         Ok(rt) => rt,
#  993 | |         Err(_) => {
#  994 | |             tracing::warn!(
#  ...   |
#  999 | |     };
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else
#  help: try
#      |
#  991 ~     let detected_runtime = openshell_bootstrap::detect_runtime(None).map_or_else(|_| {
#  992 +             tracing::warn!(
#  993 +                 "no container runtime detected, defaulting to Docker for gateway metadata"
#  994 +             );
#  995 +             openshell_bootstrap::ContainerRuntime::default()
#  996 ~         }, |rt| rt);
#      |

Error: CLIPPY_WARNING: [#def37]
crates/openshell-cli/src/run.rs:991:28: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#      |
#  991 |       let detected_runtime = match openshell_bootstrap::detect_runtime(None) {
#      |  ____________________________^
#  992 | |         Ok(rt) => rt,
#  993 | |         Err(_) => {
#  994 | |             tracing::warn!(
#  ...   |
#  999 | |     };
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#      = note: `-W clippy::single-match-else` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::single_match_else)]`
#  help: try
#      |
#  991 ~     let detected_runtime = if let Ok(rt) = openshell_bootstrap::detect_runtime(None) { rt } else {
#  992 +         tracing::warn!(
#  993 +             "no container runtime detected, defaulting to Docker for gateway metadata"
#  994 +         );
#  995 +         openshell_bootstrap::ContainerRuntime::default()
#  996 ~     };
#      |

Error: CLIPPY_WARNING: [#def38]
crates/openshell-cli/src/run.rs:1020:44: warning: use Option::map_or instead of an if let/else
#       |
#  1020 |           let (remote_host, resolved_host) = if let Some(dest) = remote {
#       |  ____________________________________________^
#  1021 | |             let ssh_host = extract_host_from_ssh_destination(dest);
#  1022 | |             let resolved = resolve_ssh_hostname(&ssh_host);
#  1023 | |             (Some(dest.to_string()), Some(resolved))
#  1024 | |         } else {
#  1025 | |             (None, None)
#  1026 | |         };
#       | |_________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else
#  help: try
#       |
#  1020 ~         let (remote_host, resolved_host) = remote.map_or((None, None), |dest| {
#  1021 +             let ssh_host = extract_host_from_ssh_destination(dest);
#  1022 +             let resolved = resolve_ssh_hostname(&ssh_host);
#  1023 +             (Some(dest.to_string()), Some(resolved))
#  1024 ~         });
#       |

Error: CLIPPY_WARNING: [#def39]
crates/openshell-cli/src/run.rs:1362:1: warning: this function has too many arguments (12/7)
#       |
#  1362 | / pub async fn gateway_admin_deploy(
#  1363 | |     name: &str,
#  1364 | |     remote: Option<&str>,
#  1365 | |     ssh_key: Option<&str>,
#  ...    |
#  1374 | |     container_runtime: Option<&str>,
#  1375 | | ) -> Result<()> {
#       | |_______________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#too_many_arguments
#       = note: `-W clippy::too-many-arguments` implied by `-W clippy::all`
#       = help: to override `-W clippy::all` add `#[allow(clippy::too_many_arguments)]`

Error: CLIPPY_WARNING: [#def40]
crates/openshell-cli/src/run.rs:1389:5: warning: this `if` statement can be collapsed
#       |
#  1389 | /     if !recreate {
#  1390 | |         if let Some(existing) =
#  1391 | |             openshell_bootstrap::check_existing_deployment(name, remote_opts.as_ref()).await?
#  ...    |
#  1401 | |     }
#       | |_____^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#       = note: `-W clippy::collapsible-if` implied by `-W clippy::all`
#       = help: to override `-W clippy::all` add `#[allow(clippy::collapsible_if)]`
#  help: collapse nested if block
#       |
#  1389 ~     if !recreate
#  1390 ~         && let Some(existing) =
#  1391 |             openshell_bootstrap::check_existing_deployment(name, remote_opts.as_ref()).await?
#   ...
#  1399 |             }
#  1400 ~         }
#       |

Error: CLIPPY_WARNING: [#def41]
crates/openshell-cli/src/run.rs:1390:9: warning: this `if` statement can be collapsed
#       |
#  1390 | /         if let Some(existing) =
#  1391 | |             openshell_bootstrap::check_existing_deployment(name, remote_opts.as_ref()).await?
#  1392 | |         {
#  1393 | |             if existing.container_running {
#  ...    |
#  1400 | |         }
#       | |_________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#       |
#  1391 ~             openshell_bootstrap::check_existing_deployment(name, remote_opts.as_ref()).await?
#  1392 ~             && existing.container_running {
#  1393 |                 eprintln!(
#   ...
#  1397 |                 return Ok(());
#  1398 ~             }
#       |

Error: CLIPPY_WARNING: [#def42]
crates/openshell-cli/src/run.rs:1408:27: warning: unnecessary boolean `not` operation
#       |
#  1408 |       let stored_metadata = if !recreate {
#       |  ___________________________^
#  1409 | |         openshell_bootstrap::load_gateway_metadata(name).ok()
#  1410 | |     } else {
#  1411 | |         None
#  1412 | |     };
#       | |_____^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#if_not_else
#       = note: `-W clippy::if-not-else` implied by `-W clippy::pedantic`
#       = help: to override `-W clippy::pedantic` add `#[allow(clippy::if_not_else)]`
#  help: try
#       |
#  1408 ~     let stored_metadata = if recreate {
#  1409 +         None
#  1410 +     } else {
#  1411 +         openshell_bootstrap::load_gateway_metadata(name).ok()
#  1412 ~     };
#       |

Error: CLIPPY_WARNING: [#def43]
crates/openshell-cli/src/run.rs:1637:6: warning: future cannot be sent between threads safely
#       |
#  1637 | ) -> Result<()> {
#       |      ^^^^^^^^^^
#       |
#       = note: `std::sync::ReentrantLockGuard<'_, std::cell::RefCell<std::io::LineWriter<std::io::stdio::StdoutRaw>>>` doesn't implement `std::marker::Send`
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#future_not_send
#       = note: `-W clippy::future-not-send` implied by `-W clippy::nursery`
#       = help: to override `-W clippy::nursery` add `#[allow(clippy::future_not_send)]`

Error: CLIPPY_WARNING: [#def44]
crates/openshell-cli/src/run.rs:1639:23: warning: use Option::map_or_else instead of an if let/else
#       |
#  1639 |       let remote_opts = if let Some(dest) = remote {
#       |  _______________________^
#  1640 | |         let mut opts = RemoteOptions::new(dest);
#  1641 | |         if let Some(key) = ssh_key {
#  1642 | |             opts = opts.with_ssh_key(key);
#  ...    |
#  1655 | |         None
#  1656 | |     };
#       | |_____^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else
#  help: try
#       |
#  1639 ~     let remote_opts = remote.map_or_else(|| if let Some(metadata) = get_gateway_metadata(name)
#  1640 +         && metadata.is_remote
#  1641 +         && let Some(ref host) = metadata.remote_host
#  1642 +     {
#  1643 +         let mut opts = RemoteOptions::new(host.clone());
#  1644 +         if let Some(key) = ssh_key {
#  1645 +             opts = opts.with_ssh_key(key);
#  1646 +         }
#  1647 +         Some(opts)
#  1648 +     } else {
#  1649 +         None
#  1650 +     }, |dest| {
#  1651 +         let mut opts = RemoteOptions::new(dest);
#  1652 +         if let Some(key) = ssh_key {
#  1653 +             opts = opts.with_ssh_key(key);
#  1654 +         }
#  1655 +         Some(opts)
#  1656 ~     });
#       |

Error: CLIPPY_WARNING: [#def45]
crates/openshell-cli/src/run.rs:1690:23: warning: use Option::map_or_else instead of an if let/else
#       |
#  1690 |       let remote_host = if let Some(dest) = remote {
#       |  _______________________^
#  1691 | |         Some(dest.to_string())
#  1692 | |     } else if let Some(metadata) = get_gateway_metadata(name)
#  1693 | |         && metadata.is_remote
#  ...    |
#  1697 | |         None
#  1698 | |     };
#       | |_____^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else
#  help: try
#       |
#  1690 ~     let remote_host = remote.map_or_else(|| if let Some(metadata) = get_gateway_metadata(name)
#  1691 +         && metadata.is_remote
#  1692 +     {
#  1693 +         metadata.remote_host.clone()
#  1694 +     } else {
#  1695 +         None
#  1696 ~     }, |dest| Some(dest.to_string()));
#       |

Error: CLIPPY_WARNING: [#def46]
crates/openshell-cli/src/run.rs:1695:29: warning: redundant clone
#       |
#  1695 |         metadata.remote_host.clone()
#       |                             ^^^^^^^^ help: remove this
#       |
#  note: this value is dropped without further use
#      --> crates/openshell-cli/src/run.rs:1695:9
#       |
#  1695 |         metadata.remote_host.clone()
#       |         ^^^^^^^^^^^^^^^^^^^^
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_clone
#       = note: `-W clippy::redundant-clone` implied by `-W clippy::nursery`
#       = help: to override `-W clippy::nursery` add `#[allow(clippy::redundant_clone)]`

Error: CLIPPY_WARNING: [#def47]
crates/openshell-cli/src/run.rs:1774:63: warning: future cannot be sent between threads safely
#       |
#  1774 | pub async fn doctor_check(container_runtime: Option<&str>) -> Result<()> {
#       |                                                               ^^^^^^^^^^ future returned by `doctor_check` is not `Send`
#       |
#  note: future is not `Send` as this value is used across an await
#      --> crates/openshell-cli/src/run.rs:1790:65
#       |
#  1776 |     let mut stdout = std::io::stdout().lock();
#       |         ---------- has type `std::io::StdoutLock<'_>` which is not `Send`
#  ...
#  1790 |     match openshell_bootstrap::check_runtime_available(runtime).await {
#       |                                                                 ^^^^^ await occurs here, with `mut stdout` maybe used later
#       = note: `std::sync::ReentrantLockGuard<'_, std::cell::RefCell<std::io::LineWriter<std::io::stdio::StdoutRaw>>>` doesn't implement `std::marker::Send`
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#future_not_send

Error: CLIPPY_WARNING: [#def48]
crates/openshell-cli/src/run.rs:1802:14: warning: unnecessary semicolon
#       |
#  1802 |             };
#       |              ^ help: remove
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#unnecessary_semicolon
#       = note: `-W clippy::unnecessary-semicolon` implied by `-W clippy::pedantic`
#       = help: to override `-W clippy::pedantic` add `#[allow(clippy::unnecessary_semicolon)]`

Error: CLIPPY_WARNING: [#def49]
crates/openshell-cli/src/run.rs:1897:9: warning: large future with a size of 16992 bytes
#       |
#  1897 |         crate::bootstrap::run_bootstrap(remote, ssh_key, requested_gpu).await?;
#       |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider `Box::pin` on it: `Box::pin(crate::bootstrap::run_bootstrap(remote, ssh_key, requested_gpu))`
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#large_futures
#       = note: `-W clippy::large-futures` implied by `-W clippy::pedantic`
#       = help: to override `-W clippy::pedantic` add `#[allow(clippy::large_futures)]`

Error: CLIPPY_WARNING: [#def50]
crates/openshell-cli/src/run.rs:1900:5: warning: large future with a size of 19616 bytes
#       |
#  1900 | /     sandbox_create(
#  1901 | |         &server,
#  1902 | |         name,
#  1903 | |         from,
#  ...    |
#  1918 | |         &tls,
#  1919 | |     )
#       | |_____^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#large_futures
#  help: consider `Box::pin` on it
#       |
#  1900 ~     Box::pin(sandbox_create(
#  1901 +         &server,
#  1902 +         name,
#  1903 +         from,
#  1904 +         &gateway_name,
#  1905 +         upload,
#  1906 +         keep,
#  1907 +         gpu,
#  1908 +         editor,
#  1909 +         remote,
#  1910 +         ssh_key,
#  1911 +         providers,
#  1912 +         policy,
#  1913 +         forward,
#  1914 +         command,
#  1915 +         tty_override,
#  1916 +         Some(false),
#  1917 +         auto_providers_override,
#  1918 +         &tls,
#  1919 +     ))
#       |

Error: CLIPPY_WARNING: [#def51]
crates/openshell-cli/src/run.rs:2022:17: warning: large future with a size of 16992 bytes
#       |
#  2022 |                 crate::bootstrap::run_bootstrap(remote, ssh_key, requested_gpu).await?;
#       |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider `Box::pin` on it: `Box::pin(crate::bootstrap::run_bootstrap(remote, ssh_key, requested_gpu))`
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#large_futures

Error: CLIPPY_WARNING: [#def52]
crates/openshell-cli/src/run.rs:2269:33: warning: variables can be used directly in the `format!` string
#       |
#  2269 | ...                   format!("Image pulled ({})", size_label)
#       |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#uninlined_format_args
#  help: change this to
#       |
#  2269 -                                 format!("Image pulled ({})", size_label)
#  2269 +                                 format!("Image pulled ({size_label})")
#       |

Error: CLIPPY_WARNING: [#def53]
crates/openshell-cli/src/run.rs:2308:13: warning: these match arms have identical bodies
#       |
#  2308 | /             Some(openshell_core::proto::sandbox_stream_event::Payload::DraftPolicyUpdate(_)) => {
#  2309 | |                 // Draft policy updates are handled in the draft panel, not during provisioning.
#  2310 | |             }
#       | |_____________^
#  2311 |               None => {}
#       |               ^^^^^^^^^^
#       |
#       = help: if this is unintentional make the arms return different values
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#match_same_arms
#       = note: `-W clippy::match-same-arms` implied by `-W clippy::pedantic`
#       = help: to override `-W clippy::pedantic` add `#[allow(clippy::match_same_arms)]`
#  help: otherwise merge the patterns into a single arm
#       |
#  2308 ~             Some(openshell_core::proto::sandbox_stream_event::Payload::DraftPolicyUpdate(_)) | None => {
#  2309 |                 // Draft policy updates are handled in the draft panel, not during provisioning.
#  2310 |             }
#  2311 ~             }
#       |

Error: CLIPPY_WARNING: [#def54]
crates/openshell-cli/src/run.rs:2569:5: warning: use Option::map_or instead of an if let/else
#       |
#  2569 | /     if let Ok(resolved) = resolve_from(source) {
#  2570 | |         match resolved {
#  2571 | |             ResolvedSource::Image(image) => image_requests_gpu(&image),
#  2572 | |             ResolvedSource::Dockerfile { .. } => false,
#  ...    |
#  2575 | |         false
#  2576 | |     }
#       | |_____^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else
#  help: try
#       |
#  2569 ~     resolve_from(source).map_or(false, |resolved| match resolved {
#  2570 +             ResolvedSource::Image(image) => image_requests_gpu(&image),
#  2571 +             ResolvedSource::Dockerfile { .. } => false,
#  2572 +         })
#       |

Error: CLIPPY_WARNING: [#def55]
crates/openshell-cli/src/run.rs:4081:5: warning: variables can be used directly in the `format!` string
#       |
#  4081 |     println!("Sandbox:       {}", name);
#       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#uninlined_format_args
#  help: change this to
#       |
#  4081 -     println!("Sandbox:       {}", name);
#  4081 +     println!("Sandbox:       {name}");
#       |

Error: CLIPPY_WARNING: [#def56]
crates/openshell-cli/src/run.rs:4083:5: warning: variables can be used directly in the `format!` string
#       |
#  4083 |     println!("Policy Source: {}", policy_source);
#       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#uninlined_format_args
#  help: change this to
#       |
#  4083 -     println!("Policy Source: {}", policy_source);
#  4083 +     println!("Policy Source: {policy_source}");
#       |

Error: CLIPPY_WARNING: [#def57]
crates/openshell-cli/src/run.rs:4650:1: warning: this function has too many arguments (8/7)
#       |
#  4650 | / pub async fn sandbox_logs(
#  4651 | |     server: &str,
#  4652 | |     name: &str,
#  4653 | |     lines: u32,
#  ...    |
#  4658 | |     tls: &TlsOptions,
#  4659 | | ) -> Result<()> {
#       | |_______________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#too_many_arguments

Error: CLIPPY_WARNING: [#def58]
crates/openshell-cli/src/ssh.rs:45:22: warning: unused `self` argument
#     |
#  45 |     fn remote_target(self, host_alias: &str) -> String {
#     |                      ^^^^
#     |
#     = help: consider refactoring to an associated function
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#unused_self
#     = note: `-W clippy::unused-self` implied by `-W clippy::pedantic`
#     = help: to override `-W clippy::pedantic` add `#[allow(clippy::unused_self)]`

Error: CLIPPY_WARNING: [#def59]
crates/openshell-cli/src/ssh.rs:343:9: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#      |
#  343 | /         match tokio::time::timeout(FOREGROUND_FORWARD_STARTUP_GRACE_PERIOD, child.wait()).await {
#  344 | |             Ok(status) => status.into_diagnostic()?,
#  345 | |             Err(_) => {
#  346 | |                 eprintln!("{}", foreground_forward_started_message(name, spec));
#  ...   |
#  349 | |         }
#      | |_________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#  help: try
#      |
#  343 ~         if let Ok(status) = tokio::time::timeout(FOREGROUND_FORWARD_STARTUP_GRACE_PERIOD, child.wait()).await { status.into_diagnostic()? } else {
#  344 +             eprintln!("{}", foreground_forward_started_message(name, spec));
#  345 +             child.wait().await.into_diagnostic()?
#  346 +         }
#      |

Error: CLIPPY_WARNING: [#def60]
crates/openshell-cli/src/ssh.rs:483:24: warning: use Option::map_or_else instead of an if let/else
#      |
#  483 |       let escaped_dest = match dest_dir {
#      |  ________________________^
#  484 | |         Some(d) => shell_escape(d),
#  485 | |         None => "$HOME".to_string(),
#  486 | |     };
#      | |_____^ help: try: `dest_dir.map_or_else(|| "$HOME".to_string(), |d| shell_escape(d))`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else

Error: CLIPPY_WARNING: [#def61]
crates/openshell-cli/src/ssh.rs:566:32: warning: item in documentation is missing backticks
#      |
#  566 | /// Split a sandbox path into (parent_directory, basename).
#      |                                ^^^^^^^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#      = note: `-W clippy::doc-markdown` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::doc_markdown)]`
#  help: try
#      |
#  566 - /// Split a sandbox path into (parent_directory, basename).
#  566 + /// Split a sandbox path into (`parent_directory`, basename).
#      |

Error: CLIPPY_WARNING: [#def62]
crates/openshell-cli/src/ssh.rs:632:5: warning: this `if` statement can be collapsed
#      |
#  632 | /     if let Some(path) = sandbox_path {
#  633 | |         if local_path.is_file() && !path.ends_with('/') {
#  634 | |             let (parent, target_name) = split_sandbox_path(path);
#  635 | |             if parent != "/" {
#  ...   |
#  649 | |     }
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  632 ~     if let Some(path) = sandbox_path
#  633 ~         && local_path.is_file() && !path.ends_with('/') {
#  634 |             let (parent, target_name) = split_sandbox_path(path);
#  ...
#  647 |             }
#  648 ~         }
#      |

Error: CLIPPY_WARNING: [#def63]
crates/openshell-cli/src/ssh.rs:783:5: warning: adding items after statements is confusing, since items exist from the start of the scope
#      |
#  783 |     const MAX_CONNECT_WAIT: Duration = Duration::from_secs(60);
#      |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#items_after_statements
#      = note: `-W clippy::items-after-statements` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::items_after_statements)]`

Error: CLIPPY_WARNING: [#def64]
crates/openshell-cli/src/ssh.rs:784:5: warning: adding items after statements is confusing, since items exist from the start of the scope
#      |
#  784 |     const INITIAL_BACKOFF: Duration = Duration::from_secs(1);
#      |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#items_after_statements

Error: CLIPPY_WARNING: [#def65]
crates/openshell-cli/src/ssh.rs:966:19: warning: called `map(<f>).unwrap_or(<a>)` on an `Option` value
#      |
#  966 |           let end = lines
#      |  ___________________^
#  967 | |             .iter()
#  968 | |             .enumerate()
#  969 | |             .skip(start + 1)
#  970 | |             .find(|(_, line)| line.trim_start().starts_with("Host "))
#  971 | |             .map(|(idx, _)| idx)
#  972 | |             .unwrap_or(lines.len());
#      | |___________________________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#map_unwrap_or
#      = note: `-W clippy::map-unwrap-or` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::map_unwrap_or)]`
#  help: use `map_or(<a>, <f>)` instead
#      |
#  971 -             .map(|(idx, _)| idx)
#  972 -             .unwrap_or(lines.len());
#  971 +             .map_or(lines.len(), |(idx, _)| idx);
#      |

Error: CLIPPY_WARNING: [#def66]
crates/openshell-core/src/config.rs:4:34: warning: item in documentation is missing backticks
#    |
#  4 | //! Configuration management for OpenShell components.
#    |                                  ^^^^^^^^^
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#    |
#  4 - //! Configuration management for OpenShell components.
#  4 + //! Configuration management for `OpenShell` components.
#    |

Error: CLIPPY_WARNING: [#def67]
crates/openshell-core/src/config.rs:42:56: warning: item in documentation is missing backticks
#     |
#  42 |     /// gRPC endpoint for sandboxes to connect back to OpenShell.
#     |                                                        ^^^^^^^^^
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#     |
#  42 -     /// gRPC endpoint for sandboxes to connect back to OpenShell.
#  42 +     /// gRPC endpoint for sandboxes to connect back to `OpenShell`.
#     |

Error: CLIPPY_WARNING: [#def68]
crates/openshell-core/src/error.rs:4:28: warning: item in documentation is missing backticks
#    |
#  4 | //! Common error types for OpenShell.
#    |                            ^^^^^^^^^
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#    |
#  4 - //! Common error types for OpenShell.
#  4 + //! Common error types for `OpenShell`.
#    |

Error: CLIPPY_WARNING: [#def69]
crates/openshell-core/src/error.rs:9:29: warning: item in documentation is missing backticks
#    |
#  9 | /// Result type alias using OpenShell's error type.
#    |                             ^^^^^^^^^
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#    |
#  9 - /// Result type alias using OpenShell's error type.
#  9 + /// Result type alias using `OpenShell`'s error type.
#    |

Error: CLIPPY_WARNING: [#def70]
crates/openshell-core/src/error.rs:12:5: warning: item in documentation is missing backticks
#     |
#  12 | /// OpenShell error type.
#     |     ^^^^^^^^^
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#     |
#  12 - /// OpenShell error type.
#  12 + /// `OpenShell` error type.
#     |

Error: CLIPPY_WARNING: [#def71]
crates/openshell-core/src/forward.rs:138:5: warning: this could be rewritten as `let...else`
#      |
#  138 | /     let entries = match std::fs::read_dir(&dir) {
#  139 | |         Ok(e) => e,
#  140 | |         Err(_) => return Ok(None),
#  141 | |     };
#      | |______^ help: consider writing: `let Ok(entries) = std::fs::read_dir(&dir) else { return Ok(None) };`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#manual_let_else
#      = note: `-W clippy::manual-let-else` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::manual_let_else)]`

Error: CLIPPY_WARNING: [#def72]
crates/openshell-core/src/forward.rs:146:9: warning: this `if` statement can be collapsed
#      |
#  146 | /         if let Some(name) = file_name.strip_suffix(&suffix) {
#  147 | |             if !name.is_empty() {
#  148 | |                 return Ok(Some(name.to_string()));
#  149 | |             }
#  150 | |         }
#      | |_________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#      = note: `-W clippy::collapsible-if` implied by `-W clippy::all`
#      = help: to override `-W clippy::all` add `#[allow(clippy::collapsible_if)]`
#  help: collapse nested if block
#      |
#  146 ~         if let Some(name) = file_name.strip_suffix(&suffix)
#  147 ~             && !name.is_empty() {
#  148 |                 return Ok(Some(name.to_string()));
#  149 ~             }
#      |

Error: CLIPPY_WARNING: [#def73]
crates/openshell-core/src/inference.rs:108:5: warning: use Option::map_or_else instead of an if let/else
#      |
#  108 | /     match profile_for(provider_type) {
#  109 | |         Some(profile) => {
#  110 | |             let headers = profile
#  111 | |                 .default_headers
#  ...   |
#  117 | |         None => (AuthHeader::Bearer, Vec::new()),
#  118 | |     }
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else
#      = note: `-W clippy::option-if-let-else` implied by `-W clippy::nursery`
#      = help: to override `-W clippy::nursery` add `#[allow(clippy::option_if_let_else)]`
#  help: try
#      |
#  108 ~     profile_for(provider_type).map_or_else(|| (AuthHeader::Bearer, Vec::new()), |profile| {
#  109 +             let headers = profile
#  110 +                 .default_headers
#  111 +                 .iter()
#  112 +                 .map(|(k, v)| ((*k).to_string(), (*v).to_string()))
#  113 +                 .collect();
#  114 +             (profile.auth.clone(), headers)
#  115 +         })
#      |

Error: CLIPPY_WARNING: [#def74]
crates/openshell-core/src/lib.rs:4:5: warning: item in documentation is missing backticks
#    |
#  4 | //! OpenShell Core - shared library for OpenShell components.
#    |     ^^^^^^^^^
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#    = note: `-W clippy::doc-markdown` implied by `-W clippy::pedantic`
#    = help: to override `-W clippy::pedantic` add `#[allow(clippy::doc_markdown)]`
#  help: try
#    |
#  4 - //! OpenShell Core - shared library for OpenShell components.
#  4 + //! `OpenShell` Core - shared library for OpenShell components.
#    |

Error: CLIPPY_WARNING: [#def75]
crates/openshell-core/src/lib.rs:4:41: warning: item in documentation is missing backticks
#    |
#  4 | //! OpenShell Core - shared library for OpenShell components.
#    |                                         ^^^^^^^^^
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#    |
#  4 - //! OpenShell Core - shared library for OpenShell components.
#  4 + //! OpenShell Core - shared library for `OpenShell` components.
#    |

Error: CLIPPY_WARNING: [#def76]
crates/openshell-policy/src/lib.rs:4:52: warning: item in documentation is missing backticks
#    |
#  4 | //! Shared sandbox policy parsing and defaults for OpenShell.
#    |                                                    ^^^^^^^^^
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#    = note: `-W clippy::doc-markdown` implied by `-W clippy::pedantic`
#    = help: to override `-W clippy::pedantic` add `#[allow(clippy::doc_markdown)]`
#  help: try
#    |
#  4 - //! Shared sandbox policy parsing and defaults for OpenShell.
#  4 + //! Shared sandbox policy parsing and defaults for `OpenShell`.
#    |

Error: CLIPPY_WARNING: [#def77]
crates/openshell-policy/src/lib.rs:104:15: warning: this argument (4 byte) is passed by reference, but would be more efficient if passed by value (limit: 8 byte)
#      |
#  104 | fn is_zero(v: &u32) -> bool {
#      |               ^^^^ help: consider passing by value instead: `u32`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#trivially_copy_pass_by_ref
#      = note: `-W clippy::trivially-copy-pass-by-ref` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::trivially_copy_pass_by_ref)]`

Error: CLIPPY_WARNING: [#def78]
crates/openshell-policy/src/lib.rs:315:72: warning: unnecessary boolean `not` operation
#      |
#  315 |   ...                   let yaml_matcher = if !matcher.any.is_empty() {
#      |  __________________________________________^
#  316 | | ...                       QueryMatcherDef::Any(QueryAnyDef {
#  317 | | ...                           any: matcher.any,
#  318 | | ...                       })
#  319 | | ...                   } else {
#  320 | | ...                       QueryMatcherDef::Glob(matcher.glob)
#  321 | | ...                   };
#      | |_______________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#if_not_else
#      = note: `-W clippy::if-not-else` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::if_not_else)]`
#  help: try
#      |
#  315 ~                                                     let yaml_matcher = if matcher.any.is_empty() {
#  316 +                                                         QueryMatcherDef::Glob(matcher.glob)
#  317 +                                                     } else {
#  318 +                                                         QueryMatcherDef::Any(QueryAnyDef {
#  319 +                                                             any: matcher.any,
#  320 +                                                         })
#  321 ~                                                     };
#      |

Error: CLIPPY_WARNING: [#def79]
crates/openshell-policy/src/lib.rs:459:29: warning: redundant closure
#      |
#  459 |         .get_or_insert_with(|| ProcessPolicy::default());
#      |                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the associated function itself: `ProcessPolicy::default`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_closure
#      = note: `-W clippy::redundant-closure` implied by `-W clippy::all`
#      = help: to override `-W clippy::all` add `#[allow(clippy::redundant_closure)]`

Error: CLIPPY_WARNING: [#def80]
crates/openshell-tui/src/app.rs:362:33: warning: item in documentation is missing backticks
#      |
#  362 |     /// Warning shown at top of EnterKey modal (e.g. autodetect failure).
#      |                                 ^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#      = note: `-W clippy::doc-markdown` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::doc_markdown)]`
#  help: try
#      |
#  362 -     /// Warning shown at top of EnterKey modal (e.g. autodetect failure).
#  362 +     /// Warning shown at top of `EnterKey` modal (e.g. autodetect failure).
#      |

Error: CLIPPY_WARNING: [#def81]
crates/openshell-tui/src/app.rs:552:16: warning: this argument (272 byte) is passed by value, but might be more efficient if passed by reference (limit: 256 byte)
#      |
#  552 |         theme: crate::theme::Theme,
#      |                ^^^^^^^^^^^^^^^^^^^ help: consider passing by reference instead: `&crate::theme::Theme`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#large_types_passed_by_value
#      = note: `-W clippy::large-types-passed-by-value` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::large_types_passed_by_value)]`

Error: CLIPPY_WARNING: [#def82]
crates/openshell-tui/src/app.rs:688:38: warning: called `map(<f>).unwrap_or(<a>)` on an `Option` value
#      |
#  688 |                   let (value, scope) = settings
#      |  ______________________________________^
#  689 | |                     .get(reg.key)
#  690 | |                     .map(|es| {
#  691 | |                         let v = es.value.as_ref().and_then(|sv| sv.value.clone());
#  ...   |
#  698 | |                     })
#  699 | |                     .unwrap_or((None, SettingScope::Unset));
#      | |___________________________________________________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#map_unwrap_or
#      = note: `-W clippy::map-unwrap-or` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::map_unwrap_or)]`
#  help: use `map_or(<a>, <f>)` instead
#      |
#  690 ~                     .map_or((None, SettingScope::Unset), |es| {
#  691 |                         let v = es.value.as_ref().and_then(|sv| sv.value.clone());
#  ...
#  697 |                         (v, s)
#  698 ~                     });
#      |

Error: CLIPPY_WARNING: [#def83]
crates/openshell-tui/src/app.rs:1624:66: warning: casting `isize` to `usize` may lose the sign of the value
#       |
#  1624 |             self.sandbox_log_scroll = (self.sandbox_log_scroll + delta as usize).min(max_scroll);
#       |                                                                  ^^^^^^^^^^^^^^ help: if this is intentional, use `cast_unsigned()` instead: `delta.cast_unsigned()`
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_sign_loss
#       = note: `-W clippy::cast-sign-loss` implied by `-W clippy::pedantic`
#       = help: to override `-W clippy::pedantic` add `#[allow(clippy::cast_sign_loss)]`

Error: CLIPPY_WARNING: [#def84]
crates/openshell-tui/src/app.rs:1839:17: warning: unnested or-patterns
#       |
#  1839 |                 KeyCode::Char('j') | KeyCode::Down | KeyCode::Char('k') | KeyCode::Up => {
#       |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#unnested_or_patterns
#       = note: `-W clippy::unnested-or-patterns` implied by `-W clippy::pedantic`
#       = help: to override `-W clippy::pedantic` add `#[allow(clippy::unnested_or_patterns)]`
#  help: nest the patterns
#       |
#  1839 -                 KeyCode::Char('j') | KeyCode::Down | KeyCode::Char('k') | KeyCode::Up => {
#  1839 +                 KeyCode::Char('j' | 'k') | KeyCode::Down | KeyCode::Up => {
#       |

Error: CLIPPY_WARNING: [#def85]
crates/openshell-tui/src/app.rs:2045:40: warning: redundant closure
#       |
#  2045 |                 .map_or(String::new(), |s| s.to_string())
#       |                                        ^^^^^^^^^^^^^^^^^ help: replace the closure with the method itself: `std::string::ToString::to_string`
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_closure_for_method_calls
#       = note: `-W clippy::redundant-closure-for-method-calls` implied by `-W clippy::pedantic`
#       = help: to override `-W clippy::pedantic` add `#[allow(clippy::redundant_closure_for_method_calls)]`

Error: CLIPPY_WARNING: [#def86]
crates/openshell-tui/src/event.rs:127:9: warning: used underscore-prefixed binding
#      |
#  127 |         self._keepalive.clone()
#      |         ^^^^^^^^^^^^^^^
#      |
#  note: binding is defined here
#     --> crates/openshell-tui/src/event.rs:59:5
#      |
#   59 |     _keepalive: mpsc::UnboundedSender<Event>,
#      |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#used_underscore_binding
#      = note: `-W clippy::used-underscore-binding` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::used_underscore_binding)]`

Error: CLIPPY_WARNING: [#def87]
crates/openshell-tui/src/lib.rs:35:16: warning: item in documentation is missing backticks
#     |
#  35 | /// Launch the OpenShell TUI.
#     |                ^^^^^^^^^
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#     |
#  35 - /// Launch the OpenShell TUI.
#  35 + /// Launch the `OpenShell` TUI.
#     |

Error: CLIPPY_WARNING: [#def88]
crates/openshell-tui/src/lib.rs:37:55: warning: item in documentation is missing backticks
#     |
#  37 | /// `channel` must be a connected gRPC channel to the OpenShell gateway.
#     |                                                       ^^^^^^^^^
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#     |
#  37 - /// `channel` must be a connected gRPC channel to the OpenShell gateway.
#  37 + /// `channel` must be a connected gRPC channel to the `OpenShell` gateway.
#     |

Error: CLIPPY_WARNING: [#def89]
crates/openshell-tui/src/lib.rs:190:34: warning: use Option::map_or_else instead of an if let/else
#      |
#  190 |                       let masked = if let Some(val) = provider.credentials.values().next() {
#      |  __________________________________^
#  191 | |                         mask_secret(val)
#  192 | |                     } else {
#  193 | |                         "-".to_string()
#  194 | |                     };
#      | |_____________________^ help: try: `provider.credentials.values().next().map_or_else(|| "-".to_string(), |val| mask_secret(val))`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else

Error: CLIPPY_WARNING: [#def90]
crates/openshell-tui/src/lib.rs:315:17: warning: this `if` statement can be collapsed
#      |
#  315 | /                 if app.screen == Screen::Splash {
#  316 | |                     if let Some(start) = app.splash_start {
#  317 | |                         if start.elapsed() >= SPLASH_DURATION {
#  318 | |                             app.dismiss_splash();
#  ...   |
#  321 | |                 }
#      | |_________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  315 ~                 if app.screen == Screen::Splash
#  316 ~                     && let Some(start) = app.splash_start {
#  317 |                         if start.elapsed() >= SPLASH_DURATION {
#  318 |                             app.dismiss_splash();
#  319 |                         }
#  320 ~                     }
#      |

Error: CLIPPY_WARNING: [#def91]
crates/openshell-tui/src/lib.rs:316:21: warning: this `if` statement can be collapsed
#      |
#  316 | /                     if let Some(start) = app.splash_start {
#  317 | |                         if start.elapsed() >= SPLASH_DURATION {
#  318 | |                             app.dismiss_splash();
#  319 | |                         }
#  320 | |                     }
#      | |_____________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  316 ~                     if let Some(start) = app.splash_start
#  317 ~                         && start.elapsed() >= SPLASH_DURATION {
#  318 |                             app.dismiss_splash();
#  319 ~                         }
#      |

Error: CLIPPY_WARNING: [#def92]
crates/openshell-tui/src/lib.rs:340:17: warning: this `if` statement can be collapsed
#      |
#  340 | /                 if let Some(form) = app.create_form.as_ref() {
#  341 | |                     if form.create_result.is_some() {
#  342 | |                         let elapsed = form
#  343 | |                             .anim_start
#  ...   |
#  394 | |                 }
#      | |_________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  340 ~                 if let Some(form) = app.create_form.as_ref()
#  341 ~                     && form.create_result.is_some() {
#  342 |                         let elapsed = form
#  ...
#  392 |                         }
#  393 ~                     }
#      |

Error: CLIPPY_WARNING: [#def93]
crates/openshell-tui/src/lib.rs:363:50: warning: redundant closure
#      |
#  363 | ...                   .map(|p| p.to_string())
#      |                            ^^^^^^^^^^^^^^^^^ help: replace the closure with the method itself: `std::string::ToString::to_string`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_closure_for_method_calls

Error: CLIPPY_WARNING: [#def94]
crates/openshell-tui/src/lib.rs:396:17: warning: this `if` statement can be collapsed
#      |
#  396 | /                 if let Some(form) = app.create_provider_form.as_ref() {
#  397 | |                     if form.create_result.is_some() {
#  398 | |                         let elapsed = form
#  399 | |                             .anim_start
#  ...   |
#  426 | |                 }
#      | |_________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#  help: collapse nested if block
#      |
#  396 ~                 if let Some(form) = app.create_provider_form.as_ref()
#  397 ~                     && form.create_result.is_some() {
#  398 |                         let elapsed = form
#  ...
#  424 |                         }
#  425 ~                     }
#      |

Error: CLIPPY_WARNING: [#def95]
crates/openshell-tui/src/lib.rs:596:29: warning: calling `HashMap::default()` is more clear than this expression
#      |
#  596 |                     fields: Default::default(),
#      |                             ^^^^^^^^^^^^^^^^^^ help: try: `HashMap::default()`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#default_trait_access
#      = note: `-W clippy::default-trait-access` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::default_trait_access)]`

Error: CLIPPY_WARNING: [#def96]
crates/openshell-tui/src/lib.rs:607:29: warning: calling `HashMap::default()` is more clear than this expression
#      |
#  607 |                     fields: Default::default(),
#      |                             ^^^^^^^^^^^^^^^^^^ help: try: `HashMap::default()`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#default_trait_access

Error: CLIPPY_WARNING: [#def97]
crates/openshell-tui/src/lib.rs:623:9: warning: this could be rewritten as `let...else`
#      |
#  623 | /         let resp =
#  624 | |             match tokio::time::timeout(Duration::from_secs(5), client.watch_sandbox(req)).await {
#  625 | |                 Ok(Ok(r)) => r,
#  626 | |                 Ok(Err(_)) | Err(_) => return, // Silently stop — user can re-enter logs.
#  627 | |             };
#      | |______________^ help: consider writing: `let Ok(Ok(resp)) = tokio::time::timeout(Duration::from_secs(5), client.watch_sandbox(req)).await else { return };`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#manual_let_else
#      = note: `-W clippy::manual-let-else` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::manual_let_else)]`

Error: CLIPPY_WARNING: [#def98]
crates/openshell-tui/src/lib.rs:630:9: warning: this loop could be written as a `while let` loop
#      |
#  630 | /         loop {
#  631 | |             match stream.message().await {
#  632 | |                 Ok(Some(event)) => {
#  633 | |                     if let Some(openshell_core::proto::sandbox_stream_event::Payload::Log(log)) =
#  ...   |
#  642 | |         }
#      | |_________^ help: try: `while let Ok(Some(event)) = stream.message().await { .. }`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#while_let_loop
#      = note: `-W clippy::while-let-loop` implied by `-W clippy::all`
#      = help: to override `-W clippy::all` add `#[allow(clippy::while_let_loop)]`

Error: CLIPPY_WARNING: [#def99]
crates/openshell-tui/src/lib.rs:719:25: warning: assigning the result of `Clone::clone()` may be inefficient
#      |
#  719 |                         app.sandbox_providers_list = spec.providers.clone();
#      |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `clone_from()`: `app.sandbox_providers_list.clone_from(&spec.providers)`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#assigning_clones
#      = note: `-W clippy::assigning-clones` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::assigning_clones)]`

Error: CLIPPY_WARNING: [#def100]
crates/openshell-tui/src/lib.rs:801:29: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#      |
#  801 |               Ok(Ok(resp)) => match resp.into_inner().sandbox {
#      |  _____________________________^
#  802 | |                 Some(s) => s.id,
#  803 | |                 None => {
#  804 | |                     app.status_text = "sandbox not found".to_string();
#  ...   |
#  807 | |             },
#      | |_____________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#  help: try
#      |
#  801 ~             Ok(Ok(resp)) => if let Some(s) = resp.into_inner().sandbox { s.id } else {
#  802 +                 app.status_text = "sandbox not found".to_string();
#  803 +                 return;
#  804 ~             },
#      |

Error: CLIPPY_WARNING: [#def101]
crates/openshell-tui/src/lib.rs:945:29: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#      |
#  945 |               Ok(Ok(resp)) => match resp.into_inner().sandbox {
#      |  _____________________________^
#  946 | |                 Some(s) => s.id,
#  947 | |                 None => {
#  948 | |                     app.status_text = format!("exec: sandbox {sandbox_name} not found");
#  ...   |
#  951 | |             },
#      | |_____________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#  help: try
#      |
#  945 ~             Ok(Ok(resp)) => if let Some(s) = resp.into_inner().sandbox { s.id } else {
#  946 +                 app.status_text = format!("exec: sandbox {sandbox_name} not found");
#  947 +                 return;
#  948 ~             },
#      |

Error: CLIPPY_WARNING: [#def102]
crates/openshell-tui/src/lib.rs:1010:14: warning: redundant closure
#       |
#  1010 |         .map(|word| shell_escape(word))
#       |              ^^^^^^^^^^^^^^^^^^^^^^^^^ help: replace the closure with the function itself: `shell_escape`
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_closure
#       = note: `-W clippy::redundant-closure` implied by `-W clippy::all`
#       = help: to override `-W clippy::all` add `#[allow(clippy::redundant_closure)]`

Error: CLIPPY_WARNING: [#def103]
crates/openshell-tui/src/lib.rs:1200:42: warning: variables can be used directly in the `format!` string
#       |
#  1200 | ...                   Span::styled(format!("{:<6} {}", method, target), t.text),
#       |                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#uninlined_format_args
#  help: change this to
#       |
#  1200 -                             Span::styled(format!("{:<6} {}", method, target), t.text),
#  1200 +                             Span::styled(format!("{method:<6} {target}"), t.text),
#       |

Error: CLIPPY_WARNING: [#def104]
crates/openshell-tui/src/lib.rs:1268:5: warning: assigning the result of `Clone::clone()` may be inefficient
#       |
#  1268 |     app.pending_forward_ports = ports.clone();
#       |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `clone_from()`: `app.pending_forward_ports.clone_from(&ports)`
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#assigning_clones

Error: CLIPPY_WARNING: [#def105]
crates/openshell-tui/src/lib.rs:1337:17: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#       |
#  1337 | /                 match client.get_sandbox(req).await {
#  1338 | |                     Ok(resp) => {
#  1339 | |                         if let Some(sandbox) = resp.into_inner().sandbox {
#  1340 | |                             if sandbox.phase == 2 {
#  ...    |
#  1351 | |                     Err(_) => {} // Retry on transient errors.
#  1352 | |                 }
#       | |_________________^
#       |
#       = note: you might want to preserve the comments from inside the `match`
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match
#       = note: `-W clippy::single-match` implied by `-W clippy::all`
#       = help: to override `-W clippy::all` add `#[allow(clippy::single_match)]`
#  help: try
#       |
#  1337 ~                 if let Ok(resp) = client.get_sandbox(req).await {
#  1338 +                     if let Some(sandbox) = resp.into_inner().sandbox {
#  1339 +                         if sandbox.phase == 2 {
#  1340 +                             break sandbox.id;
#  1341 +                         }
#  1342 +                         if sandbox.phase == 3 {
#  1343 +                             let _ = tx.send(Event::CreateResult(Err(
#  1344 +                                 "sandbox entered error state".to_string(),
#  1345 +                             )));
#  1346 +                             return;
#  1347 +                         }
#  1348 +                     }
#  1349 +                 }
#       |

Error: CLIPPY_WARNING: [#def106]
crates/openshell-tui/src/lib.rs:1547:29: warning: calling `HashMap::default()` is more clear than this expression
#       |
#  1547 |                     config: Default::default(),
#       |                             ^^^^^^^^^^^^^^^^^^ help: try: `HashMap::default()`
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#default_trait_access

Error: CLIPPY_WARNING: [#def107]
crates/openshell-tui/src/lib.rs:1626:25: warning: calling `HashMap::default()` is more clear than this expression
#       |
#  1626 |                 config: Default::default(),
#       |                         ^^^^^^^^^^^^^^^^^^ help: try: `HashMap::default()`
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#default_trait_access

Error: CLIPPY_WARNING: [#def108]
crates/openshell-tui/src/lib.rs:1930:17: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#       |
#  1930 | /                 match openshell_core::settings::parse_bool_like(&raw) {
#  1931 | |                     Some(v) => setting_value::Value::BoolValue(v),
#  1932 | |                     None => {
#  1933 | |                         let _ = tx.send(Event::GlobalSettingSetResult(Err(format!(
#  ...    |
#  1938 | |                 }
#       | |_________________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#  help: try
#       |
#  1930 ~                 if let Some(v) = openshell_core::settings::parse_bool_like(&raw) { setting_value::Value::BoolValue(v) } else {
#  1931 +                     let _ = tx.send(Event::GlobalSettingSetResult(Err(format!(
#  1932 +                         "invalid bool value: {raw}"
#  1933 +                     ))));
#  1934 +                     return;
#  1935 +                 }
#       |

Error: CLIPPY_WARNING: [#def109]
crates/openshell-tui/src/lib.rs:1940:64: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#       |
#  1940 |               openshell_core::settings::SettingValueKind::Int => match raw.parse::<i64>() {
#       |  ________________________________________________________________^
#  1941 | |                 Ok(v) => setting_value::Value::IntValue(v),
#  1942 | |                 Err(_) => {
#  1943 | |                     let _ = tx.send(Event::GlobalSettingSetResult(Err(format!(
#  ...    |
#  1948 | |             },
#       | |_____________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#  help: try
#       |
#  1940 ~             openshell_core::settings::SettingValueKind::Int => if let Ok(v) = raw.parse::<i64>() { setting_value::Value::IntValue(v) } else {
#  1941 +                 let _ = tx.send(Event::GlobalSettingSetResult(Err(format!(
#  1942 +                     "invalid int value: {raw}"
#  1943 +                 ))));
#  1944 +                 return;
#  1945 ~             },
#       |

Error: CLIPPY_WARNING: [#def110]
crates/openshell-tui/src/lib.rs:2032:17: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#       |
#  2032 | /                 match openshell_core::settings::parse_bool_like(&raw) {
#  2033 | |                     Some(v) => setting_value::Value::BoolValue(v),
#  2034 | |                     None => {
#  2035 | |                         let _ = tx.send(Event::SandboxSettingSetResult(Err(format!(
#  ...    |
#  2040 | |                 }
#       | |_________________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#  help: try
#       |
#  2032 ~                 if let Some(v) = openshell_core::settings::parse_bool_like(&raw) { setting_value::Value::BoolValue(v) } else {
#  2033 +                     let _ = tx.send(Event::SandboxSettingSetResult(Err(format!(
#  2034 +                         "invalid bool value: {raw}"
#  2035 +                     ))));
#  2036 +                     return;
#  2037 +                 }
#       |

Error: CLIPPY_WARNING: [#def111]
crates/openshell-tui/src/lib.rs:2042:64: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#       |
#  2042 |               openshell_core::settings::SettingValueKind::Int => match raw.parse::<i64>() {
#       |  ________________________________________________________________^
#  2043 | |                 Ok(v) => setting_value::Value::IntValue(v),
#  2044 | |                 Err(_) => {
#  2045 | |                     let _ = tx.send(Event::SandboxSettingSetResult(Err(format!(
#  ...    |
#  2050 | |             },
#       | |_____________^
#       |
#       = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#  help: try
#       |
#  2042 ~             openshell_core::settings::SettingValueKind::Int => if let Ok(v) = raw.parse::<i64>() { setting_value::Value::IntValue(v) } else {
#  2043 +                 let _ = tx.send(Event::SandboxSettingSetResult(Err(format!(
#  2044 +                     "invalid int value: {raw}"
#  2045 +                 ))));
#  2046 +                 return;
#  2047 ~             },
#       |

Error: CLIPPY_WARNING: [#def112]
crates/openshell-tui/src/theme.rs:216:27: warning: item in documentation is missing backticks
#      |
#  216 | /// iTerm2, Terminal.app, WezTerm, Alacritty, and most modern terminals.
#      |                           ^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#      |
#  216 - /// iTerm2, Terminal.app, WezTerm, Alacritty, and most modern terminals.
#  216 + /// iTerm2, Terminal.app, `WezTerm`, Alacritty, and most modern terminals.
#      |

Error: CLIPPY_WARNING: [#def113]
crates/openshell-tui/src/ui/create_provider.rs:333:30: warning: variables can be used directly in the `format!` string
#      |
#  333 |                 let padded = format!("{:width$}", env_name, width = max_name_len);
#      |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#uninlined_format_args
#      = note: `-W clippy::uninlined-format-args` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::uninlined_format_args)]`
#  help: change this to
#      |
#  333 -                 let padded = format!("{:width$}", env_name, width = max_name_len);
#  333 +                 let padded = format!("{env_name:max_name_len$}");
#      |

Error: CLIPPY_WARNING: [#def114]
crates/openshell-tui/src/ui/create_provider.rs:356:5: warning: all if blocks contain the same code at the end
#      |
#  356 | /         idx += 1;
#  357 | |     }
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#branches_sharing_code
#      = note: `-W clippy::branches-sharing-code` implied by `-W clippy::nursery`
#      = help: to override `-W clippy::nursery` add `#[allow(clippy::branches_sharing_code)]`
#  help: consider moving these statements after the if
#      |
#  356 ~     }
#  357 +     idx += 1;
#      |

Error: CLIPPY_WARNING: [#def115]
crates/openshell-tui/src/ui/create_sandbox.rs:307:22: warning: manual implementation of `.is_multiple_of()`
#      |
#  307 |     let mouth_open = frame % 2 == 0;
#      |                      ^^^^^^^^^^^^^^ help: replace with: `frame.is_multiple_of(2)`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#manual_is_multiple_of
#      = note: `-W clippy::manual-is-multiple-of` implied by `-W clippy::all`
#      = help: to override `-W clippy::all` add `#[allow(clippy::manual_is_multiple_of)]`

Error: CLIPPY_WARNING: [#def116]
crates/openshell-tui/src/ui/create_sandbox.rs:371:9: warning: all if blocks contain the same code at the end
#      |
#  371 | /             current_str.push(ch);
#  372 | |         }
#      | |_________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#branches_sharing_code
#  help: consider moving these statements after the if
#      |
#  371 ~         }
#  372 +         current_str.push(ch);
#      |

Error: CLIPPY_WARNING: [#def117]
crates/openshell-tui/src/ui/global_settings.rs:158:24: warning: casting `usize` to `u16` may truncate the value
#      |
#  158 |     let popup_height = (lines.len() + 2) as u16;
#      |                        ^^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_possible_truncation
#      = note: `-W clippy::cast-possible-truncation` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::cast_possible_truncation)]`
#  help: ... or use `try_from` and handle the error accordingly
#      |
#  158 -     let popup_height = (lines.len() + 2) as u16;
#  158 +     let popup_height = u16::try_from(lines.len() + 2);
#      |

Error: CLIPPY_WARNING: [#def118]
crates/openshell-tui/src/ui/global_settings.rs:242:24: warning: casting `usize` to `u16` may truncate the value
#      |
#  242 |     let popup_height = (lines.len() + 2) as u16;
#      |                        ^^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_possible_truncation
#  help: ... or use `try_from` and handle the error accordingly
#      |
#  242 -     let popup_height = (lines.len() + 2) as u16;
#  242 +     let popup_height = u16::try_from(lines.len() + 2);
#      |

Error: CLIPPY_WARNING: [#def119]
crates/openshell-tui/src/ui/mod.rs:4:1: warning: pub(crate) module inside private module
#    |
#  4 | pub(crate) mod create_provider;
#    | ----------^^^^^^^^^^^^^^^^^^^^
#    | |
#    | help: consider using: `pub`
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate
#    = note: `-W clippy::redundant-pub-crate` implied by `-W clippy::nursery`
#    = help: to override `-W clippy::nursery` add `#[allow(clippy::redundant_pub_crate)]`

Error: CLIPPY_WARNING: [#def120]
crates/openshell-tui/src/ui/mod.rs:5:1: warning: pub(crate) module inside private module
#    |
#  5 | pub(crate) mod create_sandbox;
#    | ----------^^^^^^^^^^^^^^^^^^^
#    | |
#    | help: consider using: `pub`
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def121]
crates/openshell-tui/src/ui/mod.rs:7:1: warning: pub(crate) module inside private module
#    |
#  7 | pub(crate) mod global_settings;
#    | ----------^^^^^^^^^^^^^^^^^^^^
#    | |
#    | help: consider using: `pub`
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def122]
crates/openshell-tui/src/ui/mod.rs:8:1: warning: pub(crate) module inside private module
#    |
#  8 | pub(crate) mod providers;
#    | ----------^^^^^^^^^^^^^^
#    | |
#    | help: consider using: `pub`
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def123]
crates/openshell-tui/src/ui/mod.rs:9:1: warning: pub(crate) module inside private module
#    |
#  9 | pub(crate) mod sandbox_detail;
#    | ----------^^^^^^^^^^^^^^^^^^^
#    | |
#    | help: consider using: `pub`
#    |
#    = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def124]
crates/openshell-tui/src/ui/mod.rs:11:1: warning: pub(crate) module inside private module
#     |
#  11 | pub(crate) mod sandbox_logs;
#     | ----------^^^^^^^^^^^^^^^^^
#     | |
#     | help: consider using: `pub`
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def125]
crates/openshell-tui/src/ui/mod.rs:13:1: warning: pub(crate) module inside private module
#     |
#  13 | pub(crate) mod sandbox_settings;
#     | ----------^^^^^^^^^^^^^^^^^^^^^
#     | |
#     | help: consider using: `pub`
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def126]
crates/openshell-tui/src/ui/mod.rs:14:1: warning: pub(crate) module inside private module
#     |
#  14 | pub(crate) mod sandboxes;
#     | ----------^^^^^^^^^^^^^^
#     | |
#     | help: consider using: `pub`
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def127]
crates/openshell-tui/src/ui/mod.rs:92:5: warning: this `if` statement can be collapsed
#     |
#  92 | /     if app.focus == Focus::SandboxLogs {
#  93 | |         if let Some(detail_idx) = app.log_detail_index {
#  94 | |             let filtered: Vec<&app::LogLine> = app.filtered_log_lines();
#  95 | |             if let Some(log) = filtered.get(detail_idx) {
#  ...  |
#  99 | |     }
#     | |_____^
#     |
#     = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#collapsible_if
#     = note: `-W clippy::collapsible-if` implied by `-W clippy::all`
#     = help: to override `-W clippy::all` add `#[allow(clippy::collapsible_if)]`
#  help: collapse nested if block
#     |
#  92 ~     if app.focus == Focus::SandboxLogs
#  93 ~         && let Some(detail_idx) = app.log_detail_index {
#  94 |             let filtered: Vec<&app::LogLine> = app.filtered_log_lines();
#  ...
#  97 |             }
#  98 ~         }
#     |

Error: CLIPPY_WARNING: [#def128]
crates/openshell-tui/src/ui/mod.rs:328:39: warning: called `map(<f>).unwrap_or(<a>)` on an `Option` value
#      |
#  328 |                   let selected_status = app
#      |  _______________________________________^
#  329 | |                     .draft_chunks
#  330 | |                     .get(app.draft_scroll + app.draft_selected)
#  331 | |                     .map(|c| c.status.as_str())
#  332 | |                     .unwrap_or("");
#      | |__________________________________^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#map_unwrap_or
#  help: use `map_or(<a>, <f>)` instead
#      |
#  331 -                     .map(|c| c.status.as_str())
#  332 -                     .unwrap_or("");
#  331 +                     .map_or("", |c| c.status.as_str());
#      |

Error: CLIPPY_WARNING: [#def129]
crates/openshell-tui/src/ui/mod.rs:459:1: warning: pub(crate) function inside private module
#      |
#  459 | pub(crate) fn centered_popup(percent_x: u16, height: u16, area: Rect) -> Rect {
#      | ----------^^^^^^^^^^^^^^^^^^
#      | |
#      | help: consider using: `pub`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def130]
crates/openshell-tui/src/ui/sandbox_draft.rs:327:24: warning: casting `usize` to `u16` may truncate the value
#      |
#  327 |     let popup_height = (7 + list_lines) as u16;
#      |                        ^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_possible_truncation
#  help: ... or use `try_from` and handle the error accordingly
#      |
#  327 -     let popup_height = (7 + list_lines) as u16;
#  327 +     let popup_height = u16::try_from(7 + list_lines);
#      |

Error: CLIPPY_WARNING: [#def131]
crates/openshell-tui/src/ui/sandbox_logs.rs:338:30: warning: item in documentation is missing backticks
#      |
#  338 | /// Priority field order for L7_REQUEST log lines.
#      |                              ^^^^^^^^^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#doc_markdown
#  help: try
#      |
#  338 - /// Priority field order for L7_REQUEST log lines.
#  338 + /// Priority field order for `L7_REQUEST` log lines.
#      |

Error: CLIPPY_WARNING: [#def132]
crates/openshell-tui/src/ui/sandbox_logs.rs:351:1: warning: pub(crate) function inside private module
#      |
#  351 | pub(crate) fn ordered_fields<'a>(log: &'a LogLine) -> Vec<(&'a str, &'a str)> {
#      | ----------^^^^^^^^^^^^^^^^^^
#      | |
#      | help: consider using: `pub`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def133]
crates/openshell-tui/src/ui/sandbox_logs.rs:351:30: warning: the following explicit lifetimes could be elided: 'a
#      |
#  351 | pub(crate) fn ordered_fields<'a>(log: &'a LogLine) -> Vec<(&'a str, &'a str)> {
#      |                              ^^        ^^                   ^^       ^^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#needless_lifetimes
#      = note: `-W clippy::needless-lifetimes` implied by `-W clippy::all`
#      = help: to override `-W clippy::all` add `#[allow(clippy::needless_lifetimes)]`
#  help: elide the lifetimes
#      |
#  351 - pub(crate) fn ordered_fields<'a>(log: &'a LogLine) -> Vec<(&'a str, &'a str)> {
#  351 + pub(crate) fn ordered_fields(log: &LogLine) -> Vec<(&str, &str)> {
#      |

Error: CLIPPY_WARNING: [#def134]
crates/openshell-tui/src/ui/sandbox_logs.rs:361:5: warning: use Option::map_or_else instead of an if let/else
#      |
#  361 | /     match order {
#  362 | |         Some(priority) => {
#  363 | |             let mut result: Vec<(&str, &str)> = Vec::with_capacity(log.fields.len());
#  ...   |
#  391 | |     }
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#option_if_let_else
#      = note: `-W clippy::option-if-let-else` implied by `-W clippy::nursery`
#      = help: to override `-W clippy::nursery` add `#[allow(clippy::option_if_let_else)]`
#  help: try
#      |
#  361 ~     order.map_or_else(|| {
#  362 +             // Default: alphabetical.
#  363 +             let mut pairs: Vec<(&str, &str)> = log
#  364 +                 .fields
#  365 +                 .iter()
#  366 +                 .map(|(k, v)| (k.as_str(), v.as_str()))
#  367 +                 .collect();
#  368 +             pairs.sort_by_key(|(k, _)| *k);
#  369 +             pairs
#  370 +         }, |priority| {
#  371 +             let mut result: Vec<(&str, &str)> = Vec::with_capacity(log.fields.len());
#  372 +             // Add priority fields first (in order).
#  373 +             for &key in priority {
#  374 +                 if let Some(val) = log.fields.get(key) {
#  375 +                     result.push((key, val.as_str()));
#  376 +                 }
#  377 +             }
#  378 +             // Add remaining fields alphabetically.
#  379 +             let mut remaining: Vec<(&str, &str)> = log
#  380 +                 .fields
#  381 +                 .iter()
#  382 +                 .filter(|(k, _)| !priority.contains(&k.as_str()))
#  383 +                 .map(|(k, v)| (k.as_str(), v.as_str()))
#  384 +                 .collect();
#  385 +             remaining.sort_by_key(|(k, _)| *k);
#  386 +             result.extend(remaining);
#  387 +             result
#  388 +         })
#      |

Error: CLIPPY_WARNING: [#def135]
crates/openshell-tui/src/ui/sandbox_logs.rs:361:5: warning: you seem to be trying to use `match` for destructuring a single pattern. Consider using `if let`
#      |
#  361 | /     match order {
#  362 | |         Some(priority) => {
#  363 | |             let mut result: Vec<(&str, &str)> = Vec::with_capacity(log.fields.len());
#  ...   |
#  391 | |     }
#      | |_____^
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#single_match_else
#      = note: `-W clippy::single-match-else` implied by `-W clippy::pedantic`
#      = help: to override `-W clippy::pedantic` add `#[allow(clippy::single_match_else)]`
#  help: try
#      |
#  361 ~     if let Some(priority) = order {
#  362 +         let mut result: Vec<(&str, &str)> = Vec::with_capacity(log.fields.len());
#  363 +         // Add priority fields first (in order).
#  364 +         for &key in priority {
#  365 +             if let Some(val) = log.fields.get(key) {
#  366 +                 result.push((key, val.as_str()));
#  367 +             }
#  368 +         }
#  369 +         // Add remaining fields alphabetically.
#  370 +         let mut remaining: Vec<(&str, &str)> = log
#  371 +             .fields
#  372 +             .iter()
#  373 +             .filter(|(k, _)| !priority.contains(&k.as_str()))
#  374 +             .map(|(k, v)| (k.as_str(), v.as_str()))
#  375 +             .collect();
#  376 +         remaining.sort_by_key(|(k, _)| *k);
#  377 +         result.extend(remaining);
#  378 +         result
#  379 +     } else {
#  380 +         // Default: alphabetical.
#  381 +         let mut pairs: Vec<(&str, &str)> = log
#  382 +             .fields
#  383 +             .iter()
#  384 +             .map(|(k, v)| (k.as_str(), v.as_str()))
#  385 +             .collect();
#  386 +         pairs.sort_by_key(|(k, _)| *k);
#  387 +         pairs
#  388 +     }
#      |

Error: CLIPPY_WARNING: [#def136]
crates/openshell-tui/src/ui/sandbox_logs.rs:407:1: warning: pub(crate) function inside private module
#      |
#  407 | pub(crate) fn format_short_time(epoch_ms: i64) -> String {
#      | ----------^^^^^^^^^^^^^^^^^^^^^
#      | |
#      | help: consider using: `pub`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def137]
crates/openshell-tui/src/ui/sandbox_logs.rs:423:1: warning: pub(crate) function inside private module
#      |
#  423 | pub(crate) fn format_log_line_plain(log: &LogLine) -> String {
#      | ----------^^^^^^^^^^^^^^^^^^^^^^^^^
#      | |
#      | help: consider using: `pub`
#      |
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#redundant_pub_crate

Error: CLIPPY_WARNING: [#def138]
crates/openshell-tui/src/ui/sandbox_settings.rs:166:24: warning: casting `usize` to `u16` may truncate the value
#      |
#  166 |     let popup_height = (lines.len() + 2) as u16;
#      |                        ^^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_possible_truncation
#  help: ... or use `try_from` and handle the error accordingly
#      |
#  166 -     let popup_height = (lines.len() + 2) as u16;
#  166 +     let popup_height = u16::try_from(lines.len() + 2);
#      |

Error: CLIPPY_WARNING: [#def139]
crates/openshell-tui/src/ui/sandbox_settings.rs:210:24: warning: casting `usize` to `u16` may truncate the value
#      |
#  210 |     let popup_height = (lines.len() + 2) as u16;
#      |                        ^^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_possible_truncation
#  help: ... or use `try_from` and handle the error accordingly
#      |
#  210 -     let popup_height = (lines.len() + 2) as u16;
#  210 +     let popup_height = u16::try_from(lines.len() + 2);
#      |

Error: CLIPPY_WARNING: [#def140]
crates/openshell-tui/src/ui/sandbox_settings.rs:248:24: warning: casting `usize` to `u16` may truncate the value
#      |
#  248 |     let popup_height = (lines.len() + 2) as u16;
#      |                        ^^^^^^^^^^^^^^^^^^^^^^^^
#      |
#      = help: if this is intentional allow the lint with `#[allow(clippy::cast_possible_truncation)]` ...
#      = help: for further information visit https://rust-lang.github.io/rust-clippy/rust-1.94.0/index.html#cast_possible_truncation
#  help: ... or use `try_from` and handle the error accordingly
#      |
#  248 -     let popup_height = (lines.len() + 2) as u16;
#  248 +     let popup_height = u16::try_from(lines.len() + 2);
#      |

Error: CPPCHECK_WARNING (CWE-562): [#def141]
openshell-0.0.21/vendor/protobuf-src/protobuf/src/google/protobuf/compiler/python/pyi_generator.cc:602: error[danglingLifetime]: Non-local variable 'printer_' will use pointer to local variable 'printer'.
#  600|     GOOGLE_CHECK(output.get());
#  601|     io::Printer printer(output.get(), '$');
#  602|->   printer_ = &printer;
#  603|   
#  604|     // item map will store "DESCRIPTOR", top level extensions, top level enum

Error: CPPCHECK_WARNING (CWE-562): [#def142]
openshell-0.0.21/vendor/protobuf-src/protobuf/src/google/protobuf/map.h:718: error[returnTempReference]: Reference to temporary returned.
#  716|       template <typename K>
#  717|       value_type& operator[](K&& k) {
#  718|->       return *try_emplace(std::forward<K>(k)).first;
#  719|       }
#  720|   

Error: CPPCHECK_WARNING (CWE-562): [#def143]
openshell-0.0.21/vendor/protobuf-src/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.cc:530: error[invalidLifetime]: Using pointer to local variable 'node' that is out of scope.
#  528|     }
#  529|   
#  530|->   child->set_is_placeholder(false);
#  531|     if (child->kind() == OBJECT && child->number_of_children() == 0) {
#  532|       child->PopulateChildren(typeinfo_);

Error: CPPCHECK_WARNING (CWE-562): [#def144]
openshell-0.0.21/vendor/protobuf-src/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.cc:531: error[invalidLifetime]: Using pointer to local variable 'node' that is out of scope.
#  529|   
#  530|     child->set_is_placeholder(false);
#  531|->   if (child->kind() == OBJECT && child->number_of_children() == 0) {
#  532|       child->PopulateChildren(typeinfo_);
#  533|     }

Error: CPPCHECK_WARNING (CWE-562): [#def145]
openshell-0.0.21/vendor/protobuf-src/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.cc:532: error[invalidLifetime]: Using pointer to local variable 'node' that is out of scope.
#  530|     child->set_is_placeholder(false);
#  531|     if (child->kind() == OBJECT && child->number_of_children() == 0) {
#  532|->     child->PopulateChildren(typeinfo_);
#  533|     }
#  534|   

Error: CPPCHECK_WARNING (CWE-562): [#def146]
openshell-0.0.21/vendor/protobuf-src/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.cc:536: error[invalidLifetime]: Using pointer to local variable 'node' that is out of scope.
#  534|   
#  535|     stack_.push(current_);
#  536|->   current_ = child;
#  537|     return this;
#  538|   }

Error: CPPCHECK_WARNING (CWE-562): [#def147]
openshell-0.0.21/vendor/protobuf-src/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.cc:573: error[invalidLifetime]: Using pointer to local variable 'node' that is out of scope.
#  571|       current_->AddChild(node.release());
#  572|     }
#  573|->   child->set_is_placeholder(false);
#  574|   
#  575|     stack_.push(current_);

Error: CPPCHECK_WARNING (CWE-562): [#def148]
openshell-0.0.21/vendor/protobuf-src/protobuf/src/google/protobuf/util/internal/default_value_objectwriter.cc:576: error[invalidLifetime]: Using pointer to local variable 'node' that is out of scope.
#  574|   
#  575|     stack_.push(current_);
#  576|->   current_ = child;
#  577|     return this;
#  578|   }

Error: CPPCHECK_WARNING (CWE-562): [#def149]
openshell-0.0.21/vendor/protobuf-src/protobuf/src/google/protobuf/util/internal/proto_writer.h:129: error[returnTempReference]: Reference to temporary returned.
#  127|     // Returns the location tracker to use for tracking locations for errors.
#  128|     const LocationTrackerInterface& location() {
#  129|->     return element_ != nullptr ? *element_ : *tracker_;
#  130|     }
#  131|   

Scan Properties

analyzer-version-clippy1.94.1
analyzer-version-cppcheck2.20.0
analyzer-version-gcc16.0.1
analyzer-version-gcc-analyzer16.0.1
analyzer-version-shellcheck0.11.0
analyzer-version-unicontrol0.0.2
enabled-pluginsclippy, cppcheck, gcc, shellcheck, unicontrol
exit-code0
hostip-172-16-1-224.us-west-2.compute.internal
known-false-positives/usr/share/csmock/known-false-positives.js
known-false-positives-rpmknown-false-positives-0.0.0.20260320.200800.gd35503f.main-1.el9.noarch
mock-configfedora-rawhide-x86_64
project-nameopenshell-0.0.21-1.20260406205235926512.midstream.73.g8592ab0
store-results-to/tmp/tmpdd72nfyx/openshell-0.0.21-1.20260406205235926512.midstream.73.g8592ab0.tar.xz
time-created2026-04-07 00:46:21
time-finished2026-04-07 01:02:41
toolcsmock
tool-args'/usr/bin/csmock' '-r' 'fedora-rawhide-x86_64' '-t' 'cppcheck,gcc,shellcheck,clippy,unicontrol' '-o' '/tmp/tmpdd72nfyx/openshell-0.0.21-1.20260406205235926512.midstream.73.g8592ab0.tar.xz' '--gcc-analyze' '--unicontrol-notests' '--unicontrol-bidi-only' '--install' 'pam' '/tmp/tmpdd72nfyx/openshell-0.0.21-1.20260406205235926512.midstream.73.g8592ab0.src.rpm'
tool-versioncsmock-3.8.4.20260302.153719.g8203630-1.el9