{"record":{"id":"80cac6a5ed65cfdd","repo":"Hmbown/CodeWhale","slug":"plugin-name-was-installed-from-a-local-path","errorCode":null,"errorMessage":"plugin '{name}' was installed from a local path ({}) and cannot be updated from the network; reinstall it with /plugin install <path>","messagePattern":"plugin '(.+?)' was installed from a local path \\((.+?)\\) and cannot be updated from the network; reinstall it with /plugin install <path>","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/plugins/install/mod.rs","lineNumber":406,"sourceCode":"    user_plugins_dir: &Path,\n    max_size: u64,\n    network: &NetworkPolicy,\n) -> Result<PluginUpdateResult> {\n    let target = plugin_target_path(name, user_plugins_dir)?;\n    if target.exists() {\n        ensure_target_within_plugins_dir(&target, user_plugins_dir)?;\n    }\n    let marker_path = target.join(INSTALLED_FROM_MARKER);\n    if !marker_path.exists() {\n        return Err(PluginInstallError::NotInstalledHere(name.to_string()).into());\n    }\n    let marker_body = fs::read_to_string(&marker_path)\n        .with_context(|| format!(\"failed to read {}\", marker_path.display()))?;\n    let marker: InstalledFromMarker = serde_json::from_str(&marker_body)\n        .with_context(|| format!(\"malformed {INSTALLED_FROM_MARKER} for {name}\"))?;\n    let source = PluginInstallSource::parse(&marker.spec)?;\n    let PluginInstallSource::Remote(remote) = source else {\n        bail!(\n            \"plugin '{name}' was installed from a local path ({}) and cannot be updated from the network; \\\n             reinstall it with /plugin install <path>\",\n            marker.spec\n        );\n    };\n\n    let (bytes, url) = match fetch_tarball(&remote, network, max_size).await? {\n        FetchOutcome::Bytes { bytes, url } => (bytes, url),\n        FetchOutcome::NeedsApproval(host) => {\n            return Ok(PluginUpdateResult::NeedsApproval(host));\n        }\n        FetchOutcome::Denied(host) => return Ok(PluginUpdateResult::NetworkDenied(host)),\n    };\n    if sha256_hex(&bytes) == marker.source_checksum() {\n        return Ok(PluginUpdateResult::NoChange);\n    }\n\n    let outcome = install_remote_bytes(","sourceCodeStart":388,"sourceCodeEnd":424,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/plugins/install/mod.rs#L388-L424","documentation":"Plugin update found the .installed-from marker recording a LocalPath install. Local bundles have no upstream to pull from, so network update is refused by design; the marker round-trip means the only path to new content is reinstalling from the (updated) local path.","triggerScenarios":"Thrown at crates/tui/src/plugins/install/mod.rs:406 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Reinstall from the updated local path: /plugin install <path>","Network update is not available for local installs"],"exampleFix":null,"handlingStrategy":"type-guard","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"}