astrid-runtime/astrid · error

shuttle archive not found: {}

Error message

shuttle archive not found: {}

What it means

`install_from_shuttle` checks that the given `.shuttle` file exists and is a regular file before doing any work (resolving the home, unpacking, verifying). If the path is missing (or a directory), installation aborts early with this error.

Source

Thrown at crates/astrid-cli/src/commands/distro/shuttle_install.rs:51

/// Install a distro from a `.shuttle` archive.
///
/// Archive verification remains offline and local; package publication is
/// delegated to the authenticated daemon for the explicit target principal.
#[allow(
    clippy::too_many_lines,
    reason = "intentional linear unpack→verify→install→lock pipeline; \
              the security ordering is clearer kept in one place"
)]
pub(crate) async fn install_from_shuttle(
    shuttle_path: &Path,
    opts: &InitOpts,
) -> anyhow::Result<()> {
    let home = AstridHome::resolve()?;
    home.ensure()?;

    if !shuttle_path.is_file() {
        bail!("shuttle archive not found: {}", shuttle_path.display());
    }

    // 1. Unpack to a temporary mirror (no install yet).
    let mirror_tmp = tempfile::tempdir().context("failed to create shuttle mirror dir")?;
    let mirror = mirror_tmp.path();
    shuttle::unpack(shuttle_path, mirror)?;

    // 2. Load manifest / lock / sig from the mirror.
    let manifest_bytes = std::fs::read(mirror.join(shuttle::MANIFEST_NAME))
        .context("shuttle is missing Distro.toml")?;
    let manifest_text =
        std::str::from_utf8(&manifest_bytes).context("Distro.toml is not valid UTF-8")?;
    let manifest = parse_manifest(manifest_text)?;

    let lock_text = std::fs::read_to_string(mirror.join(shuttle::LOCK_NAME))
        .context("shuttle is missing Distro.lock")?;
    let lock: DistroLock =
        toml::from_str(&lock_text).context("failed to parse Distro.lock from shuttle")?;

View on GitHub (pinned to affd8760f4)

Solutions

  1. Check the path with `ls -l <path>`; confirm the `.shuttle` file exists and is a regular file.
  2. Run the pack step first so the capsule is produced, then install from its printed path.
  3. Fix typos or stale variables in the command/script; re-download the capsule if it was never fetched.

Example fix

// before
$ astrid init --shuttle distro/app.shutle   # typo
// after
$ ls distro/*.shuttle && astrid init --shuttle distro/app.shuttle
Defensive patterns

Strategy: validation

Validate before calling

use std::path::Path;
if !shuttle_path.is_file() {
    eprintln!("shuttle archive missing: {}", shuttle_path.display());
    std::process::exit(1);
}

Try / catch

if let Err(e) = install_from_shuttle(&path, &opts) {
    if e.to_string().contains("not found") {
        eprintln!("run the pack step first; path was {}", path.display());
    }
}

Prevention

When it happens

Trigger: Calling `install_from_shuttle` (or the install CLI) with a `shuttle_path` that does not exist, was deleted/moved, is mis-typed, or points at a directory.

Common situations: Typo in the filename; running install before `pack` produced the capsule; shell glob that matched nothing; stale script referencing an old build artifact.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09). Data as JSON: /api/errors/b278e7fd14640700. Report an issue: GitHub.