{"record":{"id":"b357a81916617694","repo":"jdx/mise","slug":"must-set-url","errorCode":null,"errorMessage":"must set `url`","messagePattern":"must set `url`","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/repos.rs","lineNumber":124,"sourceCode":"                .any(|component| matches!(component, Component::Normal(_)))\n            {\n                bail!(\n                    \"relative repo path `{path_raw}` must name a directory inside the project root\"\n                );\n            }\n            // Join only the Normal segments so `./foobar` resolves to\n            // `<root>/foobar` rather than `<root>/./foobar` — a `.` component\n            // survives `Path::join` and leaks into every displayed path.\n            let mut resolved = root.to_path_buf();\n            for component in path.components() {\n                if let Component::Normal(segment) = component {\n                    resolved.push(segment);\n                }\n            }\n            resolved\n        };\n        let Some(url) = config.url.map(|s| s.trim().to_string()) else {\n            bail!(\"must set `url`\");\n        };\n        if url.is_empty() {\n            bail!(\"must set a non-empty `url`\");\n        }\n        if url.starts_with('-') {\n            bail!(\"`url` must not start with `-`\");\n        }\n        let git_ref = config.git_ref.map(|s| s.trim().to_string());\n        let git_ref = match git_ref {\n            Some(git_ref) if git_ref.is_empty() => bail!(\"`ref` must not be empty\"),\n            Some(git_ref) if git_ref.starts_with('-') => bail!(\"`ref` must not start with `-`\"),\n            other => other,\n        };\n        Ok(Self {\n            path_raw,\n            path,\n            url,\n            git_ref,","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/system/repos.rs#L106-L142","documentation":"Each `[bootstrap.repos]` entry must set a `url` key; from_toml unwraps config.url after trimming and bails when it is absent (None). The URL is the git remote used to clone/update the repo, so it is mandatory. The error message intentionally references the TOML key `url`.","triggerScenarios":"Writing `{ ref = \"main\" }` or an empty table `{}` as the repo value in `[bootstrap.repos]`, omitting `url = \"...\"`.","commonSituations":"Hand-editing mise.toml and forgetting the url key; a typo like `uri =` or `repo =` instead of `url`; generating config programmatically and skipping the field.","solutions":["Add `url = \"<git-remote>\"` to the repo entry","Check the key spelling is exactly `url` (not `uri`, `repo`, or `source`)","Remove the entry if the repo is no longer needed"],"exampleFix":"// before\n[bootstrap.repos]\n\"~/src/dotfiles\" = { ref = \"main\" }\n// after\n[bootstrap.repos]\n\"~/src/dotfiles\" = { url = \"https://github.com/jdx/dotfiles.git\", ref = \"main\" }","handlingStrategy":"validation","validationCode":"function validateRepoEntry(key, entry) {\n  if (!entry || typeof entry.url !== 'string') {\n    throw new Error(`[bootstrap.repos] \"${key}\" must set url`);\n  }\n}","typeGuard":null,"tryCatchPattern":"match result {\n    Err(e) if e.to_string().contains(\"must set `url`\") => eprintln!(\"add url = ... to the repo entry: {e}\"),\n    Err(e) => return Err(e),\n    Ok(v) => v,\n}","preventionTips":["Include `url` in every `[bootstrap.repos]` entry template","Use the mise.toml JSON schema editor support to catch missing keys before runtime","Spell the key exactly `url`, not `uri` or `repo`"],"tags":["config","missing-field","git","bootstrap"],"backgroundTag":"missing-required-config-field","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}