{"record":{"id":"6ccd40667d6ad35a","repo":"jdx/mise","slug":"git-remote-helpers-are-not-supported-for-remote-on","errorCode":null,"errorMessage":"Git remote helpers are not supported for remote onboarding","messagePattern":"Git remote helpers are not supported for remote onboarding","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/remote_repository.rs","lineNumber":57,"sourceCode":"    Ok(String::from_utf8(output.stdout)?\n        .trim_end_matches('\\n')\n        .to_string())\n}\n\npub(crate) fn validate_origin(origin: &str) -> Result<()> {\n    if origin.starts_with('-') || origin.chars().any(char::is_control) {\n        bail!(\"invalid repository origin\");\n    }\n    // Explicit local paths may contain colons; otherwise :: selects a Git helper.\n    let explicit_local = std::path::Path::new(origin).is_absolute()\n        || origin.starts_with(\"./\")\n        || origin.starts_with(\"../\");\n    if !explicit_local\n        && origin.split_once(\"::\").is_some_and(|(prefix, _)| {\n            !prefix.is_empty() && !prefix.contains(['/', '\\\\', '[', ']', '@', ':'])\n        })\n    {\n        bail!(\"Git remote helpers are not supported for remote onboarding\");\n    }\n    if !explicit_local && origin.contains(\"://\") {\n        let url = url::Url::parse(origin).wrap_err(\"invalid repository URL\")?;\n        if !matches!(url.scheme(), \"https\" | \"ssh\" | \"file\") {\n            bail!(\"remote bootstrap requires HTTPS, SSH, or a local path\");\n        }\n    }\n    if let Ok(url) = url::Url::parse(origin)\n        && (url.password().is_some()\n            || (url.scheme() != \"ssh\" && !url.username().is_empty())\n            || url.query().is_some()\n            || url.fragment().is_some())\n    {\n        bail!(\"repository origin must not contain credentials, query parameters, or fragments\");\n    }\n    Ok(())\n}\n","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/system/remote_repository.rs#L39-L75","documentation":"mise's remote onboarding (Source::fetch / install_at) refuses origins that look like Git remote-helper URLs (e.g. `helper::args`). During validate_origin, if the origin contains a `::` separator whose prefix is non-empty and looks like a helper name (no `/`, `\\`, `[`, `]`, `@`, or `:`), onboarding is rejected because only plain HTTPS/SSH/file transports are supported.","triggerScenarios":"Calling Source::fetch or install_at with an origin like `git-remote-ext::...`, `ext::ssh ...`, or any `<helper>::<args>` string, when the origin is not an explicitly local path.","commonSituations":"Developers copying an exotic git URL (e.g. from a proxy or tunnel config) into mise.toml's source setting or the CLI flag; CI environments that rewrite remotes to helper-style URLs.","solutions":["Use a plain HTTPS or SSH URL for the origin (e.g. https://github.com/org/repo.git or git@github.com:org/repo.git).","If the repo is local, pass an explicit local path (starting with ./, ../, or an absolute path) so explicit_local short-circuits the check.","Set up your transport (proxy, tunnel) at the SSH/HTTP level instead of via a git remote helper."],"exampleFix":"// before\nlet origin = \"ext::ssh -i key user@host/repo\";\nSource::fetch(origin).await?;\n// after\nlet origin = \"git@github.com:org/repo.git\"; // or https://...\nSource::fetch(origin).await?;","handlingStrategy":"validation","validationCode":"function is_remote_helper(origin: string): boolean {\n  const i = origin.indexOf(\"::\");\n  if (i <= 0) return false;\n  const prefix = origin.slice(0, i);\n  return !/[\\/\\\\\\[\\]@:]/.test(prefix);\n}\n// call Source::fetch only when !is_remote_helper(origin)","typeGuard":"const isPlainUrl = (s: string): s is string => /^(https|ssh|file):\\/\\//.test(s) && !s.includes(\"::\");","tryCatchPattern":null,"preventionTips":["Restrict source origins to https:// or ssh:// URLs.","Never paste remote-helper style URLs from tunneling tools into mise config."],"tags":["git","validation","remote","unsupported-transport"],"backgroundTag":"unsupported-operation","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"}