zed-industries/zed · error

Invalid extension.toml for extension {extension_name}: {err}

Error message

Invalid extension.toml for extension {extension_name}:
{err}

What it means

ExtensionManifest::load failed to deserialize the extension's extension.toml: the TOML parsed but did not match the manifest schema (wrong field types, unknown required fields, invalid values). The error appends the serde/TOML error detail ({err}) and names the offending extension directory.

Source

Thrown at crates/extension/src/extension_manifest.rs:402

    /// Path to an SVG icon file relative to the extension root (e.g., "icons/provider.svg").
    #[serde(default)]
    pub icon: Option<String>,
}

impl ExtensionManifest {
    pub async fn load(fs: Arc<dyn Fs>, extension_dir: &Path) -> Result<Self> {
        let extension_name = extension_dir
            .file_name()
            .and_then(OsStr::to_str)
            .context("invalid extension name")?;

        let extension_manifest_path = extension_dir.join("extension.toml");
        if fs.is_file(&extension_manifest_path).await {
            let manifest_content = fs.load(&extension_manifest_path).await.with_context(|| {
                format!("loading {extension_name} extension.toml, {extension_manifest_path:?}")
            })?;
            toml::from_str(&manifest_content).map_err(|err| {
                anyhow!("Invalid extension.toml for extension {extension_name}:\n{err}")
            })
        } else if let extension_manifest_path = extension_manifest_path.with_extension("json")
            && fs.is_file(&extension_manifest_path).await
        {
            let manifest_content = fs.load(&extension_manifest_path).await.with_context(|| {
                format!("loading {extension_name} extension.json, {extension_manifest_path:?}")
            })?;

            serde_json::from_str::<OldExtensionManifest>(&manifest_content)
                .with_context(|| format!("invalid extension.json for extension {extension_name}"))
                .map(|manifest_json| manifest_from_old_manifest(manifest_json, extension_name))
        } else {
            anyhow::bail!("No extension manifest found for extension {extension_name}")
        }
    }
}

fn manifest_from_old_manifest(

View on GitHub (pinned to f4178619ac)

Solutions

  1. Fix the highlighted field in extension.toml per the error detail — commonly a wrong type or deprecated key
  2. Validate against the current manifest schema/docs for the extension API version being targeted
  3. Run the extension validator (extension_cli) locally to catch schema errors before publishing
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at crates/extension/src/extension_manifest.rs:402 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of zed-industries/zed@f4178619ac (2026-08-20). Data as JSON: /api/errors/6fa72d5f2cbc11b4. Report an issue: GitHub.