From 2c3479e5a21c66e436b0b47e610835dbc33b6e42 Mon Sep 17 00:00:00 2001 From: Adam Mansfield Date: Wed, 8 Apr 2026 19:05:19 -0400 Subject: [PATCH] fix(server): prefer pwsh as the default Windows shell - Do not rely on overriding ComSpec to allow user shell selection on Windows because tools require it to be cmd.exe. For example, setting ComSpec as pwsh.exe and launching T3 Code breaks the "Open" Visual Studio Code button as it no longer does anything when clicked. - Prefer pwsh.exe because it matches VS Code's default shell behavior on Windows when pwsh.exe (PowerShell 7) is available. --- apps/server/src/terminal/Layers/Manager.test.ts | 9 +++++++-- apps/server/src/terminal/Layers/Manager.ts | 5 +++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/server/src/terminal/Layers/Manager.test.ts b/apps/server/src/terminal/Layers/Manager.test.ts index 8207861e20..799f003aeb 100644 --- a/apps/server/src/terminal/Layers/Manager.test.ts +++ b/apps/server/src/terminal/Layers/Manager.test.ts @@ -830,12 +830,17 @@ it.layer(NodeServices.layer, { excludeTestServices: true })("TerminalManager", ( assert.equal(snapshot.status, "running"); expect(ptyAdapter.spawnInputs.length).toBeGreaterThanOrEqual(2); - expect(ptyAdapter.spawnInputs[0]?.shell).toBe("/definitely/missing-shell"); + expect(ptyAdapter.spawnInputs[0]?.shell).toBe( + process.platform === "win32" ? "/definitely/missing-shell -l" : "/definitely/missing-shell", + ); if (process.platform === "win32") { expect( ptyAdapter.spawnInputs.some( - (input) => input.shell === "cmd.exe" || input.shell === "powershell.exe", + (input) => + input.shell === "cmd.exe" || + input.shell === "powershell.exe" || + input.shell === "pwsh.exe", ), ).toBe(true); } else { diff --git a/apps/server/src/terminal/Layers/Manager.ts b/apps/server/src/terminal/Layers/Manager.ts index 5dc216e37e..6eb9438fef 100644 --- a/apps/server/src/terminal/Layers/Manager.ts +++ b/apps/server/src/terminal/Layers/Manager.ts @@ -182,7 +182,7 @@ function enqueueProcessEvent( function defaultShellResolver(): string { if (process.platform === "win32") { - return process.env.ComSpec ?? "cmd.exe"; + return "pwsh.exe"; } return process.env.SHELL ?? "bash"; } @@ -234,8 +234,9 @@ function resolveShellCandidates(shellResolver: () => string): ShellCandidate[] { if (process.platform === "win32") { return uniqueShellCandidates([ requested, - shellCandidateFromCommand(process.env.ComSpec ?? null), + shellCandidateFromCommand("pwsh.exe"), shellCandidateFromCommand("powershell.exe"), + shellCandidateFromCommand(process.env.ComSpec ?? null), shellCandidateFromCommand("cmd.exe"), ]); }