jdx/mise · error

unsupported dotfile repository format

Error message

unsupported dotfile repository format {}

What it means

The dotfile manifest schema only supports repository `format` 1. `validate` rejects any manifest written with a different (usually newer) format version so the tool never misinterprets unknown fields or semantics.

Solutions

  1. Upgrade the tool to a version that supports the manifest's format value
  2. Set the manifest's `format` back to 1 if it was changed by mistake and the content is format-1 compatible
  3. Regenerate the manifest from a known-good backup or via the tool's own export/init path

Example fix

// before
format = 2
// after
format = 1
Defensive patterns

Strategy: validation

Validate before calling

fn assert_supported_format(manifest: &Manifest) -> Result<(), String> {
  if manifest.format != 1 { Err(format!("format {} unsupported", manifest.format)) } else { Ok(()) }
}

Try / catch

match manifest.validate() {
  Err(e) if e.to_string().starts_with("unsupported dotfile repository format") => {
    // upgrade tool or rewrite manifest with format = 1
  }
  other => other,
}

Prevention

When it happens

Trigger: Calling `validate` (directly or via `tracking`/`write`/permission capture) on a manifest whose `format` field is not 1 — e.g. a manifest produced by a newer tool version or hand-edited to another number.

Common situations: Opening a manifest created by a newer release with an older binary; manually bumping `format` expecting migration; a corrupted manifest where the format field got mangled.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/4cb964b715cae788. Report an issue: GitHub.

Appendix: source

Thrown at src/system/history/manifest.rs:358

                    variant != selected.as_deref()
                        && variant.is_some_and(|name| {
                            entry.variants.iter().any(|variant| variant.name() == name)
                        })
                }
            };
            if carry {
                overlays.push(Overlay {
                    path: file.path,
                    object: Some((file.mode, file.oid)),
                });
            }
        }
        repo.compose(tree, &overlays)
    }

    pub(crate) fn validate(&self) -> Result<()> {
        if self.format != 1 {
            bail!("unsupported dotfile repository format {}", self.format);
        }
        let mut paths = std::collections::BTreeSet::new();
        for entry in &self.enrollment {
            if !super::sync::layout::is_safe_branch_path(&entry.path)
                || !(entry.path.starts_with("home/")
                    || entry.path == "config"
                    || entry.path.starts_with("config/"))
                || !paths.insert(&entry.path)
            {
                bail!("invalid or repeated enrollment path {}", entry.path);
            }
            let mut variants = std::collections::BTreeSet::new();
            super::select::validate(&entry.variants)?;
            for variant in &entry.variants {
                let name = variant.name();
                if name.contains('@')
                    || !super::sync::layout::is_safe_branch_path(&name)
                    || !variants.insert(name)

View on GitHub (pinned to 533346cc37)