fix(opencode): robust Windows CLI discovery and launch across surfaces

Launching: the VS Code extension spawned .cmd shims with shell:true,
which builds an unquoted command line — a path like
"C:\Program Files\nodejs\opencode.cmd" broke with "'C:\Program' is not
recognized". It now spawns cmd.exe directly with the shim path as its
own argv element (the web server's existing cmd-wrapper pattern), and the
web server's final launch-spec fallback routes raw .cmd/.bat through the
same wrapper instead of handing them to spawn.

Configured paths: wrapping quote pairs (Windows "Copy as path" pastes)
are now stripped everywhere a binary path enters — the VS Code setting
and shared settings.json, env vars on both surfaces, the server's
directory-path normalization, and the desktop settings input.

Discovery: added the system-wide npm prefix (Program Files\nodejs) and
scoop's .exe shim to the Windows candidates, Linuxbrew on Linux, and the
where-probe now runs with windowsHide. The macOS desktop-app exclusion
also covers the OpenCode Dev/Beta app bundles.
This commit is contained in:
Bohdan Triapitsyn
2026-07-05 10:39:09 +03:00
parent 7ec45785d9
commit 997116c736
4 changed files with 93 additions and 17 deletions
@@ -17,7 +17,15 @@ export const createSettingsNormalizationRuntime = (dependencies) => {
return value;
}
const trimmed = value.trim();
let trimmed = value.trim();
// Paths pasted from Windows "Copy as path" (or quoted shell snippets)
// arrive wrapped in quotes — a literal quote character can never be part
// of a real path, and it breaks every fs.stat/executable check.
if (trimmed.length >= 2
&& ((trimmed.startsWith('"') && trimmed.endsWith('"'))
|| (trimmed.startsWith("'") && trimmed.endsWith("'")))) {
trimmed = trimmed.slice(1, -1).trim();
}
if (!trimmed) {
return trimmed;
}