zeroclaw-labs/zeroclaw · error · anyhow::Error

plugin archive manifest name '{}' does not match registry na

Error message

plugin archive manifest name '{}' does not match registry name '{}'

What it means

After extraction, verify_manifest_matches_registry compares the plugin's manifest.toml name against the name in the registry index entry; a mismatch bails. This prevents an archive from being installed under a different identity than the one the user requested (a supply-chain guard).

Source

Thrown at src/plugin_registry.rs:295

        }
        writer.write_all(&buffer[..read])?;
        *extracted_bytes += read as u64;
    }
}

fn load_plugin_manifest(plugin_dir: &Path) -> Result<PluginManifest> {
    let manifest_path = plugin_dir.join("manifest.toml");
    let manifest_toml = std::fs::read_to_string(&manifest_path)
        .with_context(|| format!("reading {}", manifest_path.display()))?;
    toml::from_str(&manifest_toml).with_context(|| format!("parsing {}", manifest_path.display()))
}

fn verify_manifest_matches_registry(
    entry: &PluginRegistryEntry,
    manifest: &PluginManifest,
) -> Result<()> {
    if manifest.name != entry.name {
        bail!(
            "plugin archive manifest name '{}' does not match registry name '{}'",
            manifest.name,
            entry.name
        );
    }
    if manifest.version != entry.version {
        bail!(
            "plugin archive manifest version '{}' does not match registry version '{}'",
            manifest.version,
            entry.version
        );
    }
    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. If you publish the plugin, make manifest.toml `name` identical to the registry entry's `name` field and republish both together
  2. If installing, report the mismatch to the registry maintainer — the entry and artifact disagree
  3. Re-check the registry index for an entry whose name matches the artifact you actually want, and install that one
  4. After fixing, refresh the index so the corrected entry is fetched

Example fix

# before
# registry entry: { "name": "webhooks", ... } ; manifest.toml: name = "http-hooks"
# after (manifest)
name = "webhooks"
version = "0.3.0"
# republish archive + update entry url/sha256
Defensive patterns

Strategy: retry

Validate before calling

// If you orchestrate installs, compare names before invoking the tool:
let manifest_name = toml::from_str::<PluginManifest>(&manifest_src)?.name;
if manifest_name != registry_entry.name {
    anyhow::bail!("entry/artifact name mismatch: skip install");
}

Try / catch

// On the name-mismatch bail: refresh the registry index and retry once (stale
// entry). A repeat mismatch is a publisher bug — report instead of installing.

Prevention

When it happens

Trigger: Installing plugin `zeroclaw plugin install foo` where the registry entry is named "foo" but the archive's manifest.toml declares name = "bar". Reached at the end of download_registry_plugin, before the plugin is installed.

Common situations: Forked/renamed plugin republished under a new registry name without updating the manifest; copy-pasted registry JSON entries pointing at another plugin's artifact; publisher renamed the crate but shipped the old archive URL.

Related errors


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