{"record":{"id":"161c07e37e0485bf","repo":"Hmbown/CodeWhale","slug":"local-install-path-must-not-be-empty","errorCode":null,"errorMessage":"local install path must not be empty","messagePattern":"local install path must not be empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/plugins/install/mod.rs","lineNumber":129,"sourceCode":"            || trimmed.starts_with(\"http://\")\n        {\n            let source = InstallSource::parse(trimmed)?;\n            return match source {\n                InstallSource::GitHubRepo(_) | InstallSource::DirectUrl(_) => {\n                    Ok(Self::Remote(source))\n                }\n                InstallSource::Registry(_) => {\n                    unreachable!(\"prefixed specs never parse as a registry name\")\n                }\n            };\n        }\n        Self::local(trimmed)\n    }\n\n    fn local(spec: &str) -> Result<Self> {\n        let trimmed = spec.trim();\n        if trimmed.is_empty() {\n            bail!(\"local install path must not be empty\");\n        }\n        Ok(Self::LocalPath(PathBuf::from(trimmed)))\n    }\n}\n\n/// Serialize a source for the `.installed-from` marker. Must round-trip\n/// through [`PluginInstallSource::parse`].\nfn plugin_spec_string(source: &PluginInstallSource, canonical_source: Option<&Path>) -> String {\n    match source {\n        PluginInstallSource::LocalPath(_) => {\n            let path = canonical_source.expect(\"local installs record the canonical source\");\n            format!(\"path:{}\", path.display())\n        }\n        PluginInstallSource::Remote(remote) => source_spec_string(remote),\n    }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/plugins/install/mod.rs#L111-L147","documentation":"PluginInstallSource::local (the fallback arm of parse for non-remote specs) rejected a local path that is empty after trimming. Note plain whitespace is treated as absent input, matching the top-level empty-spec guard.","triggerScenarios":"Thrown at crates/tui/src/plugins/install/mod.rs:129 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Supply the actual bundle directory path","Retry /plugin install"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}