jdx/mise · error

no dotfiles matched target filter: {}

Error message

no dotfiles matched target filter: {}

What it means

Thrown by `mise bootstrap dotfiles status [TARGET]...` when target filters were given, nothing matched, and the config does define at least one dotfile file or edit. It distinguishes 'your filter matched nothing' (hard error) from 'no dotfiles configured' (info message), so a typo in a script cannot silently report an empty, all-good status.

Source

Thrown at src/cli/dotfiles/status.rs:96

                    },
                    req.origin.config.display_user(),
                    state_str,
                ]);
            }
        }

        let all_edits = system::edits::edits_from_config(&config)?;
        let edits = all_edits
            .iter()
            .filter(|req| system::edits::matches_target(req, &self.targets))
            .cloned()
            .collect::<Vec<_>>();
        if files.is_empty()
            && edits.is_empty()
            && !self.targets.is_empty()
            && (!all_files.is_empty() || !all_edits.is_empty())
        {
            eyre::bail!(
                "no dotfiles matched target filter: {}",
                self.targets.join(", ")
            );
        }
        let mut edit_rows: Vec<Vec<String>> = vec![];
        let mut json_edits = vec![];
        for req in &edits {
            let state = match system::edits::check(&config, req) {
                Ok(state) => state,
                Err(err) => FileState::Differs(format!("{err}")),
            };
            let state_str = match &state {
                FileState::Applied => "applied".to_string(),
                FileState::Missing => "missing".to_string(),
                FileState::SourceMissing => "source missing".to_string(),
                FileState::Differs(reason) => format!("differs ({reason})"),
            };
            any_missing |= state != FileState::Applied;

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Run `mise bootstrap dotfiles status` with no filters to list the exact target names, then re-run with the correct one
  2. Check shell quoting: leave `~` and globs unquoted, or pass the literal path exactly as the config declares it
  3. If the entry lives in a project config, run from that directory (or `mise trust` it) so the config is actually loaded
  4. If no dotfiles should be configured, drop the filters — that path prints an info line instead of failing

Example fix

# before
$ mise bootstrap dotfiles status '~/.zshrc'   # quoted ~ never expands
error: no dotfiles matched target filter: ~/.zshrc

# after
$ mise bootstrap dotfiles status ~/.zshrc
Defensive patterns

Strategy: validation

Validate before calling

# Verify a target is configured before filtering
mise bootstrap dotfiles status | grep -qF "$TARGET" || { echo "unknown target: $TARGET" >&2; exit 2; }
mise bootstrap dotfiles status "$TARGET"

Prevention

When it happens

Trigger: Calling `mise bootstrap dotfiles status zshrc` or with a glob filter where both `files` and `edits` are empty after filtering while `all_files`/`all_edits` are non-empty. Happens with typos, wrong shell expansion (quoted `~` or globs that never expand), or a target defined in a config file that is not loaded in this directory.

Common situations: CI scripts that check one dotfile's state by name and the name drifts; running inside a subdirectory where the mise.toml defining the entry is not trusted or loaded; passing `'~/.zshrc'` in single quotes so the shell never expands `~` and the literal string matches nothing.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/7098c8bff25198c6. Report an issue: GitHub.