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
- Check the path with `ls -l <path>`; confirm the `.shuttle` file exists and is a regular file.
- Run the pack step first so the capsule is produced, then install from its printed path.
- 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
- Run pack before install and use the path it prints
- Glob-check the capsule exists (`ls distro/*.shuttle`) in scripts
- Quote paths and check spelling; avoid stale hardcoded paths
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
- Source path does not exist: {source}
- Failed to auto-build capsule from Cargo project.
- --var names no [env] field in {capsule_id}: {key}
- --var names no [env] field in {capsule_id}: {key}
- {} contains no Distro.toml
AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09).
Data as JSON: /api/errors/b278e7fd14640700.
Report an issue: GitHub.