fix(shared): prefer Windows PowerShell 5.1 over optional pwsh - #6260

Open
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first
Open

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh#6260
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first

Conversation

@RioPlay

@RioPlayRioPlay commented Aug 12, 2026

Copy link
Copy Markdown

Problem

On Windows, shell env probes preferred pwsh first. That skips the PowerShell every Windows install already has (5.1 / powershell.exe) and makes tooling depend on an optional install.

Fix

Try powershell.exe first, then pwsh.exe. Share one candidate list from shared/shell so desktop hydration and terminal fallback follow the same order.

Verification

In-app T3 Terminal on this branch (not the agent outer shell):

  • System.Collections.Hashtable.PSVersion → 5.1.26100.8655
  • (Get-Process -Id $PID).PathC:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

Test plan

  • Focused shared/shell + terminal Manager tests
  • Live in-app Terminal on Windows confirms 5.1 / powershell.exe
  • CI

Model: Grok 4.5 · Harness: Grok Build


Note

Medium Risk
Changes the default Windows shell used for terminals and environment probing, which can affect Windows startup and shell behavior. Fallback to pwsh/cmd remains, so risk is moderate rather than high.

Overview
Prefers built-in Windows PowerShell 5.1 (powershell.exe) over optional PowerShell 7 (pwsh.exe) for Windows shell env probes and terminal startup.

Exports a shared WINDOWS_POWERSHELL_CANDIDATES list from shared/shell and uses it in desktop env hydration. Terminal fallback order now tries the absolute 5.1 path / powershell.exe before pwsh.exe, so Windows installs no longer depend on an optional pwsh install.

Reviewed by Cursor Bugbot for commit 99da444. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prefer Windows PowerShell 5.1 (powershell.exe) over pwsh for shell resolution on Windows

  • Changes the Windows shell candidate order across the server, desktop, mobile, and web apps to try powershell.exe before pwsh.exe, since PowerShell 5.1 is built-in while pwsh is optional.
  • Introduces and exports WINDOWS_POWERSHELL_CANDIDATES from packages/shared/src/shell.ts and uses it in apps/desktop/src/shell/DesktopShellEnvironment.ts to replace local literals.
  • Updates readEnvironmentFromWindowsShell to probe powershell.exe first, falling back to pwsh.exe.
  • Behavioral Change: Windows terminals now default to powershell.exe instead of pwsh.exe; systems where only pwsh is installed will fall back correctly.

Macroscope summarized 99da444.

Windows env probes preferred pwsh first, which skips the host every
Windows install has and makes tooling depend on an optional install.
Try powershell.exe first, then pwsh. Share one candidate list from
shared/shell; desktop hydration and terminal fallback follow it.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d636e14-af89-4cca-a0b5-273dc038fa67

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 12, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes the default Windows shell preference order across multiple apps, affecting which shell is spawned for all Windows users. Runtime behavior changes to shell selection logic warrant human verification, especially from a first-time contributor.

You can customize Macroscope's approvability policy. Learn more.

@CDVolvikCDVolvik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reordering the probe candidates makes sense on its own: powershell.exe is always present, so trying pwsh.exe first costs a failed spawn on every machine without PowerShell 7. But the two editions do not emit the same bytes, and the probe script does not pin an encoding.

captureWindowsEnvironmentCommand just does Write-Output $value, while the Node side reads with { encoding: "utf8" } (shell.ts:386). pwsh defaults [Console]::OutputEncoding to UTF-8, so that pairing works. Windows PowerShell 5.1 defaults it to the console codepage, which on a stock install is OEM 437 or ANSI 1252.

Running the real read path (execFileSync with encoding: "utf8") against the emitted probe script, with PATH set to C:\Users\José\AppData\Roaming\npm:

expected : "C:\Users\José\AppData\Roaming\npm"
UTF-8 console mode : "C:\Users\José\AppData\Roaming\npm" MATCH
stock OEM cp437 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
stock ANSI cp1252 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
explicit UTF-8 : "C:\Users\José\AppData\Roaming\npm" MATCH

Today 5.1 is the fallback, so this only bites when pwsh is missing. After this change it is the first candidate everywhere, so the corrupting path becomes the default for any user whose profile directory or tool paths contain non-ASCII characters. It fails quietly: the markers are ASCII so extraction still succeeds, and you get a PATH with mangled entries rather than an error.

Worth noting this also reaches FNM_DIR and FNM_MULTISHELL_PATH, which go through the same capture.

One line at the top of captureWindowsEnvironmentCommand covers it and makes 5.1-first safe:

"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8",

The same applies to the shared readEnvironmentFromWindowsShell command in packages/shared/src/shell.ts.

Separate concern in the same diff: defaultShellResolver and resolveShellCandidates in apps/server/src/terminal/Manager.ts are not probes, they pick the user's interactive terminal. Moving pwsh.exe below powershell.exe there means someone who installed PowerShell 7 now opens terminals in 5.1. The always-present argument is right for a headless probe and backwards for a shell the user chose to install. Those two orderings probably want to be separate constants rather than one shared list.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@RioPlay@CDVolvik
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh - #6260

Open
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first
Open

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh#6260
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first

Conversation

@RioPlay

@RioPlayRioPlay commented Aug 12, 2026

Copy link
Copy Markdown

Problem

On Windows, shell env probes preferred pwsh first. That skips the PowerShell every Windows install already has (5.1 / powershell.exe) and makes tooling depend on an optional install.

Fix

Try powershell.exe first, then pwsh.exe. Share one candidate list from shared/shell so desktop hydration and terminal fallback follow the same order.

Verification

In-app T3 Terminal on this branch (not the agent outer shell):

  • System.Collections.Hashtable.PSVersion → 5.1.26100.8655
  • (Get-Process -Id $PID).PathC:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

Test plan

  • Focused shared/shell + terminal Manager tests
  • Live in-app Terminal on Windows confirms 5.1 / powershell.exe
  • CI

Model: Grok 4.5 · Harness: Grok Build


Note

Medium Risk
Changes the default Windows shell used for terminals and environment probing, which can affect Windows startup and shell behavior. Fallback to pwsh/cmd remains, so risk is moderate rather than high.

Overview
Prefers built-in Windows PowerShell 5.1 (powershell.exe) over optional PowerShell 7 (pwsh.exe) for Windows shell env probes and terminal startup.

Exports a shared WINDOWS_POWERSHELL_CANDIDATES list from shared/shell and uses it in desktop env hydration. Terminal fallback order now tries the absolute 5.1 path / powershell.exe before pwsh.exe, so Windows installs no longer depend on an optional pwsh install.

Reviewed by Cursor Bugbot for commit 99da444. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prefer Windows PowerShell 5.1 (powershell.exe) over pwsh for shell resolution on Windows

  • Changes the Windows shell candidate order across the server, desktop, mobile, and web apps to try powershell.exe before pwsh.exe, since PowerShell 5.1 is built-in while pwsh is optional.
  • Introduces and exports WINDOWS_POWERSHELL_CANDIDATES from packages/shared/src/shell.ts and uses it in apps/desktop/src/shell/DesktopShellEnvironment.ts to replace local literals.
  • Updates readEnvironmentFromWindowsShell to probe powershell.exe first, falling back to pwsh.exe.
  • Behavioral Change: Windows terminals now default to powershell.exe instead of pwsh.exe; systems where only pwsh is installed will fall back correctly.

Macroscope summarized 99da444.

Windows env probes preferred pwsh first, which skips the host every
Windows install has and makes tooling depend on an optional install.
Try powershell.exe first, then pwsh. Share one candidate list from
shared/shell; desktop hydration and terminal fallback follow it.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d636e14-af89-4cca-a0b5-273dc038fa67

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 12, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes the default Windows shell preference order across multiple apps, affecting which shell is spawned for all Windows users. Runtime behavior changes to shell selection logic warrant human verification, especially from a first-time contributor.

You can customize Macroscope's approvability policy. Learn more.

@CDVolvikCDVolvik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reordering the probe candidates makes sense on its own: powershell.exe is always present, so trying pwsh.exe first costs a failed spawn on every machine without PowerShell 7. But the two editions do not emit the same bytes, and the probe script does not pin an encoding.

captureWindowsEnvironmentCommand just does Write-Output $value, while the Node side reads with { encoding: "utf8" } (shell.ts:386). pwsh defaults [Console]::OutputEncoding to UTF-8, so that pairing works. Windows PowerShell 5.1 defaults it to the console codepage, which on a stock install is OEM 437 or ANSI 1252.

Running the real read path (execFileSync with encoding: "utf8") against the emitted probe script, with PATH set to C:\Users\José\AppData\Roaming\npm:

expected : "C:\Users\José\AppData\Roaming\npm"
UTF-8 console mode : "C:\Users\José\AppData\Roaming\npm" MATCH
stock OEM cp437 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
stock ANSI cp1252 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
explicit UTF-8 : "C:\Users\José\AppData\Roaming\npm" MATCH

Today 5.1 is the fallback, so this only bites when pwsh is missing. After this change it is the first candidate everywhere, so the corrupting path becomes the default for any user whose profile directory or tool paths contain non-ASCII characters. It fails quietly: the markers are ASCII so extraction still succeeds, and you get a PATH with mangled entries rather than an error.

Worth noting this also reaches FNM_DIR and FNM_MULTISHELL_PATH, which go through the same capture.

One line at the top of captureWindowsEnvironmentCommand covers it and makes 5.1-first safe:

"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8",

The same applies to the shared readEnvironmentFromWindowsShell command in packages/shared/src/shell.ts.

Separate concern in the same diff: defaultShellResolver and resolveShellCandidates in apps/server/src/terminal/Manager.ts are not probes, they pick the user's interactive terminal. Moving pwsh.exe below powershell.exe there means someone who installed PowerShell 7 now opens terminals in 5.1. The always-present argument is right for a headless probe and backwards for a shell the user chose to install. Those two orderings probably want to be separate constants rather than one shared list.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@RioPlay@CDVolvik
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh - #6260

Open
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first
Open

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh#6260
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first

Conversation

@RioPlay

@RioPlayRioPlay commented Aug 12, 2026

Copy link
Copy Markdown

Problem

On Windows, shell env probes preferred pwsh first. That skips the PowerShell every Windows install already has (5.1 / powershell.exe) and makes tooling depend on an optional install.

Fix

Try powershell.exe first, then pwsh.exe. Share one candidate list from shared/shell so desktop hydration and terminal fallback follow the same order.

Verification

In-app T3 Terminal on this branch (not the agent outer shell):

  • System.Collections.Hashtable.PSVersion → 5.1.26100.8655
  • (Get-Process -Id $PID).PathC:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

Test plan

  • Focused shared/shell + terminal Manager tests
  • Live in-app Terminal on Windows confirms 5.1 / powershell.exe
  • CI

Model: Grok 4.5 · Harness: Grok Build


Note

Medium Risk
Changes the default Windows shell used for terminals and environment probing, which can affect Windows startup and shell behavior. Fallback to pwsh/cmd remains, so risk is moderate rather than high.

Overview
Prefers built-in Windows PowerShell 5.1 (powershell.exe) over optional PowerShell 7 (pwsh.exe) for Windows shell env probes and terminal startup.

Exports a shared WINDOWS_POWERSHELL_CANDIDATES list from shared/shell and uses it in desktop env hydration. Terminal fallback order now tries the absolute 5.1 path / powershell.exe before pwsh.exe, so Windows installs no longer depend on an optional pwsh install.

Reviewed by Cursor Bugbot for commit 99da444. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prefer Windows PowerShell 5.1 (powershell.exe) over pwsh for shell resolution on Windows

  • Changes the Windows shell candidate order across the server, desktop, mobile, and web apps to try powershell.exe before pwsh.exe, since PowerShell 5.1 is built-in while pwsh is optional.
  • Introduces and exports WINDOWS_POWERSHELL_CANDIDATES from packages/shared/src/shell.ts and uses it in apps/desktop/src/shell/DesktopShellEnvironment.ts to replace local literals.
  • Updates readEnvironmentFromWindowsShell to probe powershell.exe first, falling back to pwsh.exe.
  • Behavioral Change: Windows terminals now default to powershell.exe instead of pwsh.exe; systems where only pwsh is installed will fall back correctly.

Macroscope summarized 99da444.

Windows env probes preferred pwsh first, which skips the host every
Windows install has and makes tooling depend on an optional install.
Try powershell.exe first, then pwsh. Share one candidate list from
shared/shell; desktop hydration and terminal fallback follow it.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d636e14-af89-4cca-a0b5-273dc038fa67

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 12, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes the default Windows shell preference order across multiple apps, affecting which shell is spawned for all Windows users. Runtime behavior changes to shell selection logic warrant human verification, especially from a first-time contributor.

You can customize Macroscope's approvability policy. Learn more.

@CDVolvikCDVolvik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reordering the probe candidates makes sense on its own: powershell.exe is always present, so trying pwsh.exe first costs a failed spawn on every machine without PowerShell 7. But the two editions do not emit the same bytes, and the probe script does not pin an encoding.

captureWindowsEnvironmentCommand just does Write-Output $value, while the Node side reads with { encoding: "utf8" } (shell.ts:386). pwsh defaults [Console]::OutputEncoding to UTF-8, so that pairing works. Windows PowerShell 5.1 defaults it to the console codepage, which on a stock install is OEM 437 or ANSI 1252.

Running the real read path (execFileSync with encoding: "utf8") against the emitted probe script, with PATH set to C:\Users\José\AppData\Roaming\npm:

expected : "C:\Users\José\AppData\Roaming\npm"
UTF-8 console mode : "C:\Users\José\AppData\Roaming\npm" MATCH
stock OEM cp437 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
stock ANSI cp1252 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
explicit UTF-8 : "C:\Users\José\AppData\Roaming\npm" MATCH

Today 5.1 is the fallback, so this only bites when pwsh is missing. After this change it is the first candidate everywhere, so the corrupting path becomes the default for any user whose profile directory or tool paths contain non-ASCII characters. It fails quietly: the markers are ASCII so extraction still succeeds, and you get a PATH with mangled entries rather than an error.

Worth noting this also reaches FNM_DIR and FNM_MULTISHELL_PATH, which go through the same capture.

One line at the top of captureWindowsEnvironmentCommand covers it and makes 5.1-first safe:

"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8",

The same applies to the shared readEnvironmentFromWindowsShell command in packages/shared/src/shell.ts.

Separate concern in the same diff: defaultShellResolver and resolveShellCandidates in apps/server/src/terminal/Manager.ts are not probes, they pick the user's interactive terminal. Moving pwsh.exe below powershell.exe there means someone who installed PowerShell 7 now opens terminals in 5.1. The always-present argument is right for a headless probe and backwards for a shell the user chose to install. Those two orderings probably want to be separate constants rather than one shared list.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@RioPlay@CDVolvik
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh - #6260

Open
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first
Open

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh#6260
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first

Conversation

@RioPlay

@RioPlayRioPlay commented Aug 12, 2026

Copy link
Copy Markdown

Problem

On Windows, shell env probes preferred pwsh first. That skips the PowerShell every Windows install already has (5.1 / powershell.exe) and makes tooling depend on an optional install.

Fix

Try powershell.exe first, then pwsh.exe. Share one candidate list from shared/shell so desktop hydration and terminal fallback follow the same order.

Verification

In-app T3 Terminal on this branch (not the agent outer shell):

  • System.Collections.Hashtable.PSVersion → 5.1.26100.8655
  • (Get-Process -Id $PID).PathC:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

Test plan

  • Focused shared/shell + terminal Manager tests
  • Live in-app Terminal on Windows confirms 5.1 / powershell.exe
  • CI

Model: Grok 4.5 · Harness: Grok Build


Note

Medium Risk
Changes the default Windows shell used for terminals and environment probing, which can affect Windows startup and shell behavior. Fallback to pwsh/cmd remains, so risk is moderate rather than high.

Overview
Prefers built-in Windows PowerShell 5.1 (powershell.exe) over optional PowerShell 7 (pwsh.exe) for Windows shell env probes and terminal startup.

Exports a shared WINDOWS_POWERSHELL_CANDIDATES list from shared/shell and uses it in desktop env hydration. Terminal fallback order now tries the absolute 5.1 path / powershell.exe before pwsh.exe, so Windows installs no longer depend on an optional pwsh install.

Reviewed by Cursor Bugbot for commit 99da444. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prefer Windows PowerShell 5.1 (powershell.exe) over pwsh for shell resolution on Windows

  • Changes the Windows shell candidate order across the server, desktop, mobile, and web apps to try powershell.exe before pwsh.exe, since PowerShell 5.1 is built-in while pwsh is optional.
  • Introduces and exports WINDOWS_POWERSHELL_CANDIDATES from packages/shared/src/shell.ts and uses it in apps/desktop/src/shell/DesktopShellEnvironment.ts to replace local literals.
  • Updates readEnvironmentFromWindowsShell to probe powershell.exe first, falling back to pwsh.exe.
  • Behavioral Change: Windows terminals now default to powershell.exe instead of pwsh.exe; systems where only pwsh is installed will fall back correctly.

Macroscope summarized 99da444.

Windows env probes preferred pwsh first, which skips the host every
Windows install has and makes tooling depend on an optional install.
Try powershell.exe first, then pwsh. Share one candidate list from
shared/shell; desktop hydration and terminal fallback follow it.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d636e14-af89-4cca-a0b5-273dc038fa67

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 12, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes the default Windows shell preference order across multiple apps, affecting which shell is spawned for all Windows users. Runtime behavior changes to shell selection logic warrant human verification, especially from a first-time contributor.

You can customize Macroscope's approvability policy. Learn more.

@CDVolvikCDVolvik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reordering the probe candidates makes sense on its own: powershell.exe is always present, so trying pwsh.exe first costs a failed spawn on every machine without PowerShell 7. But the two editions do not emit the same bytes, and the probe script does not pin an encoding.

captureWindowsEnvironmentCommand just does Write-Output $value, while the Node side reads with { encoding: "utf8" } (shell.ts:386). pwsh defaults [Console]::OutputEncoding to UTF-8, so that pairing works. Windows PowerShell 5.1 defaults it to the console codepage, which on a stock install is OEM 437 or ANSI 1252.

Running the real read path (execFileSync with encoding: "utf8") against the emitted probe script, with PATH set to C:\Users\José\AppData\Roaming\npm:

expected : "C:\Users\José\AppData\Roaming\npm"
UTF-8 console mode : "C:\Users\José\AppData\Roaming\npm" MATCH
stock OEM cp437 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
stock ANSI cp1252 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
explicit UTF-8 : "C:\Users\José\AppData\Roaming\npm" MATCH

Today 5.1 is the fallback, so this only bites when pwsh is missing. After this change it is the first candidate everywhere, so the corrupting path becomes the default for any user whose profile directory or tool paths contain non-ASCII characters. It fails quietly: the markers are ASCII so extraction still succeeds, and you get a PATH with mangled entries rather than an error.

Worth noting this also reaches FNM_DIR and FNM_MULTISHELL_PATH, which go through the same capture.

One line at the top of captureWindowsEnvironmentCommand covers it and makes 5.1-first safe:

"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8",

The same applies to the shared readEnvironmentFromWindowsShell command in packages/shared/src/shell.ts.

Separate concern in the same diff: defaultShellResolver and resolveShellCandidates in apps/server/src/terminal/Manager.ts are not probes, they pick the user's interactive terminal. Moving pwsh.exe below powershell.exe there means someone who installed PowerShell 7 now opens terminals in 5.1. The always-present argument is right for a headless probe and backwards for a shell the user chose to install. Those two orderings probably want to be separate constants rather than one shared list.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@RioPlay@CDVolvik
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh - #6260

Open
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first
Open

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh#6260
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first

Conversation

@RioPlay

@RioPlayRioPlay commented Aug 12, 2026

Copy link
Copy Markdown

Problem

On Windows, shell env probes preferred pwsh first. That skips the PowerShell every Windows install already has (5.1 / powershell.exe) and makes tooling depend on an optional install.

Fix

Try powershell.exe first, then pwsh.exe. Share one candidate list from shared/shell so desktop hydration and terminal fallback follow the same order.

Verification

In-app T3 Terminal on this branch (not the agent outer shell):

  • System.Collections.Hashtable.PSVersion → 5.1.26100.8655
  • (Get-Process -Id $PID).PathC:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

Test plan

  • Focused shared/shell + terminal Manager tests
  • Live in-app Terminal on Windows confirms 5.1 / powershell.exe
  • CI

Model: Grok 4.5 · Harness: Grok Build


Note

Medium Risk
Changes the default Windows shell used for terminals and environment probing, which can affect Windows startup and shell behavior. Fallback to pwsh/cmd remains, so risk is moderate rather than high.

Overview
Prefers built-in Windows PowerShell 5.1 (powershell.exe) over optional PowerShell 7 (pwsh.exe) for Windows shell env probes and terminal startup.

Exports a shared WINDOWS_POWERSHELL_CANDIDATES list from shared/shell and uses it in desktop env hydration. Terminal fallback order now tries the absolute 5.1 path / powershell.exe before pwsh.exe, so Windows installs no longer depend on an optional pwsh install.

Reviewed by Cursor Bugbot for commit 99da444. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prefer Windows PowerShell 5.1 (powershell.exe) over pwsh for shell resolution on Windows

  • Changes the Windows shell candidate order across the server, desktop, mobile, and web apps to try powershell.exe before pwsh.exe, since PowerShell 5.1 is built-in while pwsh is optional.
  • Introduces and exports WINDOWS_POWERSHELL_CANDIDATES from packages/shared/src/shell.ts and uses it in apps/desktop/src/shell/DesktopShellEnvironment.ts to replace local literals.
  • Updates readEnvironmentFromWindowsShell to probe powershell.exe first, falling back to pwsh.exe.
  • Behavioral Change: Windows terminals now default to powershell.exe instead of pwsh.exe; systems where only pwsh is installed will fall back correctly.

Macroscope summarized 99da444.

Windows env probes preferred pwsh first, which skips the host every
Windows install has and makes tooling depend on an optional install.
Try powershell.exe first, then pwsh. Share one candidate list from
shared/shell; desktop hydration and terminal fallback follow it.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d636e14-af89-4cca-a0b5-273dc038fa67

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 12, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes the default Windows shell preference order across multiple apps, affecting which shell is spawned for all Windows users. Runtime behavior changes to shell selection logic warrant human verification, especially from a first-time contributor.

You can customize Macroscope's approvability policy. Learn more.

@CDVolvikCDVolvik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reordering the probe candidates makes sense on its own: powershell.exe is always present, so trying pwsh.exe first costs a failed spawn on every machine without PowerShell 7. But the two editions do not emit the same bytes, and the probe script does not pin an encoding.

captureWindowsEnvironmentCommand just does Write-Output $value, while the Node side reads with { encoding: "utf8" } (shell.ts:386). pwsh defaults [Console]::OutputEncoding to UTF-8, so that pairing works. Windows PowerShell 5.1 defaults it to the console codepage, which on a stock install is OEM 437 or ANSI 1252.

Running the real read path (execFileSync with encoding: "utf8") against the emitted probe script, with PATH set to C:\Users\José\AppData\Roaming\npm:

expected : "C:\Users\José\AppData\Roaming\npm"
UTF-8 console mode : "C:\Users\José\AppData\Roaming\npm" MATCH
stock OEM cp437 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
stock ANSI cp1252 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
explicit UTF-8 : "C:\Users\José\AppData\Roaming\npm" MATCH

Today 5.1 is the fallback, so this only bites when pwsh is missing. After this change it is the first candidate everywhere, so the corrupting path becomes the default for any user whose profile directory or tool paths contain non-ASCII characters. It fails quietly: the markers are ASCII so extraction still succeeds, and you get a PATH with mangled entries rather than an error.

Worth noting this also reaches FNM_DIR and FNM_MULTISHELL_PATH, which go through the same capture.

One line at the top of captureWindowsEnvironmentCommand covers it and makes 5.1-first safe:

"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8",

The same applies to the shared readEnvironmentFromWindowsShell command in packages/shared/src/shell.ts.

Separate concern in the same diff: defaultShellResolver and resolveShellCandidates in apps/server/src/terminal/Manager.ts are not probes, they pick the user's interactive terminal. Moving pwsh.exe below powershell.exe there means someone who installed PowerShell 7 now opens terminals in 5.1. The always-present argument is right for a headless probe and backwards for a shell the user chose to install. Those two orderings probably want to be separate constants rather than one shared list.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@RioPlay@CDVolvik
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh - #6260

Open
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first
Open

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh#6260
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first

Conversation

@RioPlay

@RioPlayRioPlay commented Aug 12, 2026

Copy link
Copy Markdown

Problem

On Windows, shell env probes preferred pwsh first. That skips the PowerShell every Windows install already has (5.1 / powershell.exe) and makes tooling depend on an optional install.

Fix

Try powershell.exe first, then pwsh.exe. Share one candidate list from shared/shell so desktop hydration and terminal fallback follow the same order.

Verification

In-app T3 Terminal on this branch (not the agent outer shell):

  • System.Collections.Hashtable.PSVersion → 5.1.26100.8655
  • (Get-Process -Id $PID).PathC:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

Test plan

  • Focused shared/shell + terminal Manager tests
  • Live in-app Terminal on Windows confirms 5.1 / powershell.exe
  • CI

Model: Grok 4.5 · Harness: Grok Build


Note

Medium Risk
Changes the default Windows shell used for terminals and environment probing, which can affect Windows startup and shell behavior. Fallback to pwsh/cmd remains, so risk is moderate rather than high.

Overview
Prefers built-in Windows PowerShell 5.1 (powershell.exe) over optional PowerShell 7 (pwsh.exe) for Windows shell env probes and terminal startup.

Exports a shared WINDOWS_POWERSHELL_CANDIDATES list from shared/shell and uses it in desktop env hydration. Terminal fallback order now tries the absolute 5.1 path / powershell.exe before pwsh.exe, so Windows installs no longer depend on an optional pwsh install.

Reviewed by Cursor Bugbot for commit 99da444. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prefer Windows PowerShell 5.1 (powershell.exe) over pwsh for shell resolution on Windows

  • Changes the Windows shell candidate order across the server, desktop, mobile, and web apps to try powershell.exe before pwsh.exe, since PowerShell 5.1 is built-in while pwsh is optional.
  • Introduces and exports WINDOWS_POWERSHELL_CANDIDATES from packages/shared/src/shell.ts and uses it in apps/desktop/src/shell/DesktopShellEnvironment.ts to replace local literals.
  • Updates readEnvironmentFromWindowsShell to probe powershell.exe first, falling back to pwsh.exe.
  • Behavioral Change: Windows terminals now default to powershell.exe instead of pwsh.exe; systems where only pwsh is installed will fall back correctly.

Macroscope summarized 99da444.

Windows env probes preferred pwsh first, which skips the host every
Windows install has and makes tooling depend on an optional install.
Try powershell.exe first, then pwsh. Share one candidate list from
shared/shell; desktop hydration and terminal fallback follow it.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d636e14-af89-4cca-a0b5-273dc038fa67

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 12, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes the default Windows shell preference order across multiple apps, affecting which shell is spawned for all Windows users. Runtime behavior changes to shell selection logic warrant human verification, especially from a first-time contributor.

You can customize Macroscope's approvability policy. Learn more.

@CDVolvikCDVolvik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reordering the probe candidates makes sense on its own: powershell.exe is always present, so trying pwsh.exe first costs a failed spawn on every machine without PowerShell 7. But the two editions do not emit the same bytes, and the probe script does not pin an encoding.

captureWindowsEnvironmentCommand just does Write-Output $value, while the Node side reads with { encoding: "utf8" } (shell.ts:386). pwsh defaults [Console]::OutputEncoding to UTF-8, so that pairing works. Windows PowerShell 5.1 defaults it to the console codepage, which on a stock install is OEM 437 or ANSI 1252.

Running the real read path (execFileSync with encoding: "utf8") against the emitted probe script, with PATH set to C:\Users\José\AppData\Roaming\npm:

expected : "C:\Users\José\AppData\Roaming\npm"
UTF-8 console mode : "C:\Users\José\AppData\Roaming\npm" MATCH
stock OEM cp437 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
stock ANSI cp1252 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
explicit UTF-8 : "C:\Users\José\AppData\Roaming\npm" MATCH

Today 5.1 is the fallback, so this only bites when pwsh is missing. After this change it is the first candidate everywhere, so the corrupting path becomes the default for any user whose profile directory or tool paths contain non-ASCII characters. It fails quietly: the markers are ASCII so extraction still succeeds, and you get a PATH with mangled entries rather than an error.

Worth noting this also reaches FNM_DIR and FNM_MULTISHELL_PATH, which go through the same capture.

One line at the top of captureWindowsEnvironmentCommand covers it and makes 5.1-first safe:

"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8",

The same applies to the shared readEnvironmentFromWindowsShell command in packages/shared/src/shell.ts.

Separate concern in the same diff: defaultShellResolver and resolveShellCandidates in apps/server/src/terminal/Manager.ts are not probes, they pick the user's interactive terminal. Moving pwsh.exe below powershell.exe there means someone who installed PowerShell 7 now opens terminals in 5.1. The always-present argument is right for a headless probe and backwards for a shell the user chose to install. Those two orderings probably want to be separate constants rather than one shared list.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@RioPlay@CDVolvik
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh - #6260

Open
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first
Open

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh#6260
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first

Conversation

@RioPlay

@RioPlayRioPlay commented Aug 12, 2026

Copy link
Copy Markdown

Problem

On Windows, shell env probes preferred pwsh first. That skips the PowerShell every Windows install already has (5.1 / powershell.exe) and makes tooling depend on an optional install.

Fix

Try powershell.exe first, then pwsh.exe. Share one candidate list from shared/shell so desktop hydration and terminal fallback follow the same order.

Verification

In-app T3 Terminal on this branch (not the agent outer shell):

  • System.Collections.Hashtable.PSVersion → 5.1.26100.8655
  • (Get-Process -Id $PID).PathC:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

Test plan

  • Focused shared/shell + terminal Manager tests
  • Live in-app Terminal on Windows confirms 5.1 / powershell.exe
  • CI

Model: Grok 4.5 · Harness: Grok Build


Note

Medium Risk
Changes the default Windows shell used for terminals and environment probing, which can affect Windows startup and shell behavior. Fallback to pwsh/cmd remains, so risk is moderate rather than high.

Overview
Prefers built-in Windows PowerShell 5.1 (powershell.exe) over optional PowerShell 7 (pwsh.exe) for Windows shell env probes and terminal startup.

Exports a shared WINDOWS_POWERSHELL_CANDIDATES list from shared/shell and uses it in desktop env hydration. Terminal fallback order now tries the absolute 5.1 path / powershell.exe before pwsh.exe, so Windows installs no longer depend on an optional pwsh install.

Reviewed by Cursor Bugbot for commit 99da444. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prefer Windows PowerShell 5.1 (powershell.exe) over pwsh for shell resolution on Windows

  • Changes the Windows shell candidate order across the server, desktop, mobile, and web apps to try powershell.exe before pwsh.exe, since PowerShell 5.1 is built-in while pwsh is optional.
  • Introduces and exports WINDOWS_POWERSHELL_CANDIDATES from packages/shared/src/shell.ts and uses it in apps/desktop/src/shell/DesktopShellEnvironment.ts to replace local literals.
  • Updates readEnvironmentFromWindowsShell to probe powershell.exe first, falling back to pwsh.exe.
  • Behavioral Change: Windows terminals now default to powershell.exe instead of pwsh.exe; systems where only pwsh is installed will fall back correctly.

Macroscope summarized 99da444.

Windows env probes preferred pwsh first, which skips the host every
Windows install has and makes tooling depend on an optional install.
Try powershell.exe first, then pwsh. Share one candidate list from
shared/shell; desktop hydration and terminal fallback follow it.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d636e14-af89-4cca-a0b5-273dc038fa67

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 12, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes the default Windows shell preference order across multiple apps, affecting which shell is spawned for all Windows users. Runtime behavior changes to shell selection logic warrant human verification, especially from a first-time contributor.

You can customize Macroscope's approvability policy. Learn more.

@CDVolvikCDVolvik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reordering the probe candidates makes sense on its own: powershell.exe is always present, so trying pwsh.exe first costs a failed spawn on every machine without PowerShell 7. But the two editions do not emit the same bytes, and the probe script does not pin an encoding.

captureWindowsEnvironmentCommand just does Write-Output $value, while the Node side reads with { encoding: "utf8" } (shell.ts:386). pwsh defaults [Console]::OutputEncoding to UTF-8, so that pairing works. Windows PowerShell 5.1 defaults it to the console codepage, which on a stock install is OEM 437 or ANSI 1252.

Running the real read path (execFileSync with encoding: "utf8") against the emitted probe script, with PATH set to C:\Users\José\AppData\Roaming\npm:

expected : "C:\Users\José\AppData\Roaming\npm"
UTF-8 console mode : "C:\Users\José\AppData\Roaming\npm" MATCH
stock OEM cp437 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
stock ANSI cp1252 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
explicit UTF-8 : "C:\Users\José\AppData\Roaming\npm" MATCH

Today 5.1 is the fallback, so this only bites when pwsh is missing. After this change it is the first candidate everywhere, so the corrupting path becomes the default for any user whose profile directory or tool paths contain non-ASCII characters. It fails quietly: the markers are ASCII so extraction still succeeds, and you get a PATH with mangled entries rather than an error.

Worth noting this also reaches FNM_DIR and FNM_MULTISHELL_PATH, which go through the same capture.

One line at the top of captureWindowsEnvironmentCommand covers it and makes 5.1-first safe:

"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8",

The same applies to the shared readEnvironmentFromWindowsShell command in packages/shared/src/shell.ts.

Separate concern in the same diff: defaultShellResolver and resolveShellCandidates in apps/server/src/terminal/Manager.ts are not probes, they pick the user's interactive terminal. Moving pwsh.exe below powershell.exe there means someone who installed PowerShell 7 now opens terminals in 5.1. The always-present argument is right for a headless probe and backwards for a shell the user chose to install. Those two orderings probably want to be separate constants rather than one shared list.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@RioPlay@CDVolvik
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh - #6260

Open
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first
Open

fix(shared): prefer Windows PowerShell 5.1 over optional pwsh#6260
RioPlay wants to merge 1 commit into
pingdotgg:mainfrom
RioPlay:fix/windows-powershell-51-first

Conversation

@RioPlay

@RioPlayRioPlay commented Aug 12, 2026

Copy link
Copy Markdown

Problem

On Windows, shell env probes preferred pwsh first. That skips the PowerShell every Windows install already has (5.1 / powershell.exe) and makes tooling depend on an optional install.

Fix

Try powershell.exe first, then pwsh.exe. Share one candidate list from shared/shell so desktop hydration and terminal fallback follow the same order.

Verification

In-app T3 Terminal on this branch (not the agent outer shell):

  • System.Collections.Hashtable.PSVersion → 5.1.26100.8655
  • (Get-Process -Id $PID).PathC:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe

Test plan

  • Focused shared/shell + terminal Manager tests
  • Live in-app Terminal on Windows confirms 5.1 / powershell.exe
  • CI

Model: Grok 4.5 · Harness: Grok Build


Note

Medium Risk
Changes the default Windows shell used for terminals and environment probing, which can affect Windows startup and shell behavior. Fallback to pwsh/cmd remains, so risk is moderate rather than high.

Overview
Prefers built-in Windows PowerShell 5.1 (powershell.exe) over optional PowerShell 7 (pwsh.exe) for Windows shell env probes and terminal startup.

Exports a shared WINDOWS_POWERSHELL_CANDIDATES list from shared/shell and uses it in desktop env hydration. Terminal fallback order now tries the absolute 5.1 path / powershell.exe before pwsh.exe, so Windows installs no longer depend on an optional pwsh install.

Reviewed by Cursor Bugbot for commit 99da444. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Prefer Windows PowerShell 5.1 (powershell.exe) over pwsh for shell resolution on Windows

  • Changes the Windows shell candidate order across the server, desktop, mobile, and web apps to try powershell.exe before pwsh.exe, since PowerShell 5.1 is built-in while pwsh is optional.
  • Introduces and exports WINDOWS_POWERSHELL_CANDIDATES from packages/shared/src/shell.ts and uses it in apps/desktop/src/shell/DesktopShellEnvironment.ts to replace local literals.
  • Updates readEnvironmentFromWindowsShell to probe powershell.exe first, falling back to pwsh.exe.
  • Behavioral Change: Windows terminals now default to powershell.exe instead of pwsh.exe; systems where only pwsh is installed will fall back correctly.

Macroscope summarized 99da444.

Windows env probes preferred pwsh first, which skips the host every
Windows install has and makes tooling depend on an optional install.
Try powershell.exe first, then pwsh. Share one candidate list from
shared/shell; desktop hydration and terminal fallback follow it.
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d636e14-af89-4cca-a0b5-273dc038fa67

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Aug 12, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Needs human review

This PR changes the default Windows shell preference order across multiple apps, affecting which shell is spawned for all Windows users. Runtime behavior changes to shell selection logic warrant human verification, especially from a first-time contributor.

You can customize Macroscope's approvability policy. Learn more.

@CDVolvikCDVolvik left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reordering the probe candidates makes sense on its own: powershell.exe is always present, so trying pwsh.exe first costs a failed spawn on every machine without PowerShell 7. But the two editions do not emit the same bytes, and the probe script does not pin an encoding.

captureWindowsEnvironmentCommand just does Write-Output $value, while the Node side reads with { encoding: "utf8" } (shell.ts:386). pwsh defaults [Console]::OutputEncoding to UTF-8, so that pairing works. Windows PowerShell 5.1 defaults it to the console codepage, which on a stock install is OEM 437 or ANSI 1252.

Running the real read path (execFileSync with encoding: "utf8") against the emitted probe script, with PATH set to C:\Users\José\AppData\Roaming\npm:

expected : "C:\Users\José\AppData\Roaming\npm"
UTF-8 console mode : "C:\Users\José\AppData\Roaming\npm" MATCH
stock OEM cp437 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
stock ANSI cp1252 : "C:\Users\Jos?\AppData\Roaming\npm" CORRUPTED
explicit UTF-8 : "C:\Users\José\AppData\Roaming\npm" MATCH

Today 5.1 is the fallback, so this only bites when pwsh is missing. After this change it is the first candidate everywhere, so the corrupting path becomes the default for any user whose profile directory or tool paths contain non-ASCII characters. It fails quietly: the markers are ASCII so extraction still succeeds, and you get a PATH with mangled entries rather than an error.

Worth noting this also reaches FNM_DIR and FNM_MULTISHELL_PATH, which go through the same capture.

One line at the top of captureWindowsEnvironmentCommand covers it and makes 5.1-first safe:

"[Console]::OutputEncoding = [System.Text.Encoding]::UTF8",

The same applies to the shared readEnvironmentFromWindowsShell command in packages/shared/src/shell.ts.

Separate concern in the same diff: defaultShellResolver and resolveShellCandidates in apps/server/src/terminal/Manager.ts are not probes, they pick the user's interactive terminal. Moving pwsh.exe below powershell.exe there means someone who installed PowerShell 7 now opens terminals in 5.1. The always-present argument is right for a headless probe and backwards for a shell the user chose to install. Those two orderings probably want to be separate constants rather than one shared list.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S10-29 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@RioPlay@CDVolvik