zeroclaw-labs/zeroclaw · error

Bridge app not found at {}. Run from zeroclaw repo root.

Error message

Bridge app not found at {}. Run from zeroclaw repo root.

What it means

setup_uno_q_bridge with Some(host) deploys over ssh/scp from the bridge app directory at <CARGO_MANIFEST_DIR>/firmware/uno-q-bridge — a path baked in at compile time. This bail fires when that directory is absent on the machine running the command. As with the Nucleo firmware error, 'Run from zeroclaw repo root' is about having the repo content; the current working directory is irrelevant.

Source

Thrown at crates/zeroclaw-hardware/src/peripherals/uno_q_setup.rs:19

//! Deploy ZeroClaw Bridge app to Arduino Uno Q.

use anyhow::{Context, Result};
use std::process::Command;

const BRIDGE_APP_NAME: &str = "uno-q-bridge";

/// Deploy the Bridge app. If host is Some, scp from repo and ssh to start.
/// If host is None, assume we're ON the Uno Q — use embedded files and start.
pub fn setup_uno_q_bridge(host: Option<&str>) -> Result<()> {
    let bridge_dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
        .join("firmware")
        .join("uno-q-bridge");

    if let Some(h) = host {
        if bridge_dir.exists() {
            deploy_remote(h, &bridge_dir)?;
        } else {
            anyhow::bail!(
                "Bridge app not found at {}. Run from zeroclaw repo root.",
                bridge_dir.display()
            );
        }
    } else {
        deploy_local(if bridge_dir.exists() {
            Some(&bridge_dir)
        } else {
            None
        })?;
    }
    Ok(())
}

fn deploy_remote(host: &str, bridge_dir: &std::path::Path) -> Result<()> {
    let ssh_target = validated_ssh_target(host)?;

    println!("Copying Bridge app to {}...", host);

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Run from a full zeroclaw git clone containing firmware/uno-q-bridge next to crates/zeroclaw-hardware
  2. Verify the path printed in the error exists and contains app.yaml; if not, restore the directory
  3. If executing on the Uno Q itself, call setup with host = None — that path writes embedded files and needs no repo directory
Defensive patterns

Strategy: validation

Validate before calling

let bridge = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
    .join("firmware").join("uno-q-bridge");
if host.is_some() && !bridge.exists() {
    anyhow::bail!("full repo required at {} for remote deploy", bridge.display());
}
setup_uno_q_bridge(host)?;

Prevention

When it happens

Trigger: Running remote deployment from a prebuilt binary or a checkout without firmware/uno-q-bridge; the repo being moved or deleted after zeroclaw was built.

Common situations: Users installing a released binary and then trying the remote bridge setup; sparse or partial clones; running setup on a machine that has only the runtime, not the source tree.

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/8e2b77c96cf2f4c4. Report an issue: GitHub.