{"record":{"id":"ce56e4402c4fa0a4","repo":"jdx/mise","slug":"no-configured-repo-matched-path-filter","errorCode":null,"errorMessage":"no configured repo matched path: {filter}","messagePattern":"no configured repo matched path: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cli/bootstrap.rs","lineNumber":3484,"sourceCode":"        let repos = filter_repos(system::repos_from_config(&config), &self.paths)?;\n        system::repos::exec(&repos, &self.command, self.dry_run, self.continue_on_error)\n    }\n}\n\nfn filter_repos(\n    repos: Vec<system::repos::RepoRequest>,\n    filters: &[String],\n) -> Result<Vec<system::repos::RepoRequest>> {\n    if filters.is_empty() {\n        return Ok(repos);\n    }\n    for filter in filters {\n        let expanded = crate::file::replace_path(filter);\n        if !repos\n            .iter()\n            .any(|repo| repo.path_raw == *filter || repo.path == expanded)\n        {\n            eyre::bail!(\"no configured repo matched path: {filter}\");\n        }\n    }\n    Ok(repos\n        .into_iter()\n        .filter(|repo| {\n            filters.iter().any(|filter| {\n                repo.path_raw == *filter || repo.path == crate::file::replace_path(filter)\n            })\n        })\n        .collect())\n}\n\nimpl BootstrapReposStatus {\n    async fn run(self) -> Result<()> {\n        let config = Config::get().await?;\n        let repos = system::repos_from_config(&config);\n        let mut any_missing = false;\n        let mut rows: Vec<Vec<String>> = vec![];","sourceCodeStart":3466,"sourceCodeEnd":3502,"githubUrl":"https://github.com/jdx/mise/blob/9dcfcaa0dc8747a2577d3270b69bb9d8313b2807/src/cli/bootstrap.rs#L3466-L3502","documentation":"filter_repos (src/cli/bootstrap.rs:3484) validates every repo/path filter against the configured RepoRequests: a filter must equal either repo.path_raw (the literal configured string) or repo.path (its replace_path/tilde-expanded form), otherwise mise bails instead of silently operating on zero repos.","triggerScenarios":"'mise bootstrap <part> --repo /wrong/path'; a filter differing from the configured path by a trailing slash, symlink resolution, ~ vs $HOME expansion, or case; a path that exists locally but is not among the configured repos.","commonSituations":"Scripts hardcoding absolute paths while config uses '~/src/app'; moving the project; paths copy-pasted from shell completion that normalize differently.","solutions":["Use the exact path string from the config (raw or expanded) as the filter","Match the config's convention: if config says ~/src/app, pass --repo '~/src/app' (quoted so the shell does not expand it differently)","Print the configured repos (e.g. via the plan output) and copy the path verbatim","Drop the filter entirely to operate on all configured repos"],"exampleFix":"# before: config has '~/src/app'\nmise bootstrap dev --repo /home/me/src/app/\n# Error: no configured repo matched path: /home/me/src/app/\n\n# after\nmise bootstrap dev --repo '~/src/app'","handlingStrategy":"validation","validationCode":"# bash: ensure the filter matches a configured repo path before running\ngrep -F \"$FILTER\" mise.toml >/dev/null 2>&1 || { echo \"no configured repo matches: $FILTER\" >&2; exit 1; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Quote filters so ~ stays literal when the config uses ~","Copy repo paths verbatim from the config or plan output","Avoid trailing slashes and symlinked spellings in filters"],"tags":["mise","bootstrap","repos","path-filter","exact-match"],"backgroundTag":"filter-matches-nothing","analyzedSha":"9dcfcaa0dc8747a2577d3270b69bb9d8313b2807","analyzedAt":"2026-08-17T14:28:50.624Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}