astrid-runtime/astrid · error

Capsule ' ' has no meta.json - cannot determine original…

Error message

Capsule '{name}' has no meta.json - cannot determine original source. Re-install it manually.

What it means

update_capsule refuses to update an installed capsule whose package directory has no meta.json. The meta.json records the capsule's original source, which is required to re-fetch and rebuild it. Without it the updater cannot proceed and asks the user to reinstall manually.

Solutions

  1. Re-install the capsule manually to regenerate meta.json with source tracking, then re-run the update
  2. Check the capsule target directory for a meta.json file and restore it from a backup if available
  3. Delete the capsule directory entirely and reinstall from the canonical source

Example fix

// before
astrid capsule update my-capsule   # fails: no meta.json
// after
astrid capsule uninstall my-capsule
astrid capsule install <original-source>
astrid capsule update my-capsule
Defensive patterns

Strategy: validation

Validate before calling

let meta_path = target_dir.join("meta.json");
if !meta_path.exists() {
    eprintln!("Capsule '{}' has no meta.json; reinstall it first.", name);
    return Ok(());
}

Try / catch

match update_capsule(name).await {
    Err(e) if e.to_string().contains("no meta.json") => reinstall_manually(name)?,
    other => other?,
}

Prevention

When it happens

Trigger: Running a capsule update (directly or via update_daemon_capsules) for a capsule installed by an older version of astrid-cli that did not write meta.json, or after the meta.json file was manually deleted/corrupted inside the capsule's target directory.

Common situations: Upgrading astrid-cli from a pre-source-tracking version and then updating old capsules; restoring capsule directories from backups that omitted meta.json; cleaning scripts that remove 'extra' files from package dirs.

Related errors


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

Appendix: source

Thrown at crates/astrid-cli/src/commands/capsule/install_update.rs:141

    if !workspace {
        return update_daemon_capsules(target, &principal, approve_untrusted).await;
    }

    if let Some(name) = target {
        let target_dir = astrid_capsule_install::resolve_target_dir_for_with_layout(
            &home,
            &principal,
            name,
            workspace,
            crate::workspace_layout::current(),
        )?;
        if !target_dir.exists() {
            bail!("Capsule '{name}' is not installed.");
        }

        let meta = read_meta(&target_dir).ok_or_else(|| {
            anyhow::anyhow!(
                "Capsule '{name}' has no meta.json - cannot determine original source. \
                 Re-install it manually."
            )
        })?;

        let source = meta.source.ok_or_else(|| {
            anyhow::anyhow!(
                "Capsule '{name}' was installed before source tracking was added. \
                 Re-install it manually to record the source."
            )
        })?;

        eprintln!("Updating {name} from {source}...");
        // Re-install exactly the capsule being updated. When `source` is a
        // monorepo release that ships several `.capsule` assets, pass `name`
        // as the selector so update refreshes only that one — not every
        // capsule the release contains.
        install_capsule_with_options(

View on GitHub (pinned to affd8760f4)