{"record":{"id":"52542301a3fcb9cd","repo":"jdx/mise","slug":"pitchfork-lacks-external-configuration-support-upgrade-to","errorCode":null,"errorMessage":"pitchfork lacks external configuration support; upgrade to pitchfork 2.25.0 or later","messagePattern":"pitchfork lacks external configuration support; upgrade to pitchfork 2\\.25\\.0 or later","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/daemons/runtime.rs","lineNumber":139,"sourceCode":"        let output = tokio::time::timeout(Duration::from_secs(15), command.output()).await??;\n        if !output.status.success() {\n            bail!(\n                \"pitchfork {}: {}\",\n                args.join(\" \"),\n                String::from_utf8_lossy(&output.stderr)\n            );\n        }\n        Ok(String::from_utf8(output.stdout)?)\n    }\n\n    pub(crate) async fn supports_external_config(&self, root: &Path) -> Result<()> {\n        // Probe read-only usage metadata, never an unknown command (pitchfork's fallback starts daemons).\n        let usage = self.output(root, &[\"usage\".into()]).await?;\n        if !usage.lines().any(|line| {\n            line.trim_start().starts_with(\"cmd config \")\n                || line.trim_start().starts_with(\"cmd \\\"config\\\" \")\n        }) {\n            bail!(\n                \"pitchfork lacks external configuration support; upgrade to pitchfork 2.25.0 or later\"\n            );\n        }\n        Ok(())\n    }\n\n    pub(crate) async fn status(&self, root: &Path, id: &str) -> Result<serde_json::Value> {\n        let out = self\n            .output(root, &[\"status\".into(), id.into(), \"--json\".into()])\n            .await?;\n        Ok(serde_json::from_str(&out)?)\n    }\n\n    pub(crate) async fn supervisor_up(&self, root: &Path) -> Result<bool> {\n        let out = self\n            .output(\n                root,\n                &[\"supervisor\".into(), \"status\".into(), \"--json\".into()],","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/daemons/runtime.rs#L121-L157","documentation":"mise's daemon integration requires pitchfork's external `config` command support (pitchfork 2.25.0+) so mise can hand pitchfork a generated config. Before invoking it, mise probes `pitchfork usage` output and, if no `cmd config ` entry is listed, bails with this message instead of risking unknown-command fallback behavior. It means the installed pitchfork is too old for mise's daemon presets.","triggerScenarios":"Calling supports_external_config during daemon prepare when `pitchfork usage` output contains no line starting with `cmd config ` or `cmd \"config\" ` — i.e. pitchfork < 2.25.0 is installed (or a fork/build without external config support).","commonSituations":"A pitchfork version installed via an old package manager, Homebrew, or cargo before 2.25.0 is on PATH while using `mise daemons` / daemon presets.","solutions":["Upgrade pitchfork to 2.25.0 or later (e.g. `mise use pitchfork@latest` or `cargo install pitchfork`).","Check the active version with `pitchfork --version` / `mise which pitchfork`; ensure no older binary shadows it on PATH.","If upgrading is impossible, stop using mise daemon presets and manage daemons directly with pitchfork."],"exampleFix":"// before\n[tools]\npitchfork = \"2.20.0\"\n\n// after\n[tools]\npitchfork = \"2.25.0\"","handlingStrategy":"validation","validationCode":"# Ensure pitchfork supports external config before enabling daemon presets\nv=$(pitchfork --version); required=2.25.0\n[ \"$(printf '%s\\n' \"$required\" \"$v\" | sort -V | head -1)\" = \"$required\" ] || echo \"upgrade pitchfork\"","typeGuard":null,"tryCatchPattern":"try {\n  await mise.daemons.start();\n} catch (e) {\n  if (String(e).includes(\"lacks external configuration support\")) {\n    console.error(\"Upgrade pitchfork to >= 2.25.0.\");\n  }\n}","preventionTips":["Pin pitchfork = \">=2.25.0\" in [tools] alongside daemon presets","Run `pitchfork usage | grep 'cmd config'` to verify support","Avoid shadowing mise-installed pitchfork with older binaries on PATH"],"tags":["pitchfork","version","compatibility"],"backgroundTag":"deprecated-api-usage","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"}