fix: harden windows cli launch

This commit is contained in:
Peter Steinberger
2026-01-19 01:11:39 +00:00
parent 83511c0c09
commit 6a4b5fa4b5
2 changed files with 37 additions and 1 deletions

View File

@@ -1,5 +1,22 @@
import fs from "node:fs";
import path from "node:path";
import { spawn } from "node:child_process";
function resolvePowerShellPath(): string {
const systemRoot = process.env.SystemRoot || process.env.WINDIR;
if (systemRoot) {
const candidate = path.join(
systemRoot,
"System32",
"WindowsPowerShell",
"v1.0",
"powershell.exe",
);
if (fs.existsSync(candidate)) return candidate;
}
return "powershell.exe";
}
export function getShellConfig(): { shell: string; args: string[] } {
if (process.platform === "win32") {
// Use PowerShell instead of cmd.exe on Windows.
@@ -8,7 +25,7 @@ export function getShellConfig(): { shell: string; args: string[] } {
// When Node.js spawns cmd.exe with piped stdio, these utilities produce no output.
// PowerShell properly captures and redirects their output to stdout.
return {
shell: "powershell.exe",
shell: resolvePowerShellPath(),
args: ["-NoProfile", "-NonInteractive", "-Command"],
};
}

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env node
import { spawn } from "node:child_process";
import path from "node:path";
import process from "node:process";
import { applyCliProfileEnv, parseCliProfileArgs } from "./cli/profile.js";
@@ -56,6 +57,24 @@ function ensureExperimentalWarningSuppressed(): boolean {
return true;
}
function normalizeWindowsArgv(argv: string[]): string[] {
if (process.platform !== "win32") return argv;
if (argv.length < 3) return argv;
const execBase = path.basename(process.execPath).toLowerCase();
const arg1 = path.basename(argv[1] ?? "").toLowerCase();
const arg2 = path.basename(argv[2] ?? "").toLowerCase();
const looksLikeEntry = arg1 === "entry.ts" || arg1 === "entry.js";
if (arg1 === execBase) {
return [argv[0], ...argv.slice(2)];
}
if (looksLikeEntry && arg2 === execBase) {
return [argv[0], argv[1], ...argv.slice(3)];
}
return argv;
}
process.argv = normalizeWindowsArgv(process.argv);
if (!ensureExperimentalWarningSuppressed()) {
const parsed = parseCliProfileArgs(process.argv);
if (!parsed.ok) {