Skip to content

Fix Windows PATH hydration and repair#1729

Merged
juliusmarminge merged 9 commits intopingdotgg:mainfrom
Badbird5907:fix/windows-path-support-pr
Apr 17, 2026
Merged

Fix Windows PATH hydration and repair#1729
juliusmarminge merged 9 commits intopingdotgg:mainfrom
Badbird5907:fix/windows-path-support-pr

Conversation

@Badbird5907
Copy link
Copy Markdown
Contributor

@Badbird5907 Badbird5907 commented Apr 4, 2026

  • hydrate desktop and server PATH handling for Windows CLI tools
  • probe shells without profiles first, then fall back to profile-loaded env when node is missing
  • share command availability and PATH repair utilities across desktop and server

What Changed

  • Added a Windows startup fallback that loads the user’s PowerShell profile only when the initial no-profile environment still cannot find node
  • Made Windows environment repair update the full set of relevant environment variables, not just PATH
  • This only affects the packaged Windows .exe startup path and does not affect running the CLI from an existing shell, such as npx t3

Why

This adds support for windows setups using environment managers like fnm that initialize node through the user's powershell profile instead of PATH.
I was also able to confirm this still works on systems with a stock node setup.

Before:
image

After:
image

UI Changes

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Changes Windows environment hydration and terminal shell selection, which can affect process spawning and tool discovery at runtime (especially in packaged apps). Risk is moderate due to cross-platform branching and reliance on PowerShell probing, but changes are well-covered by new tests.

Overview
Improves Windows startup environment repair by adding shared utilities in @t3tools/shared/shell to probe PowerShell for env vars, merge/dedupe PATH (including known CLI install dirs), and only load the user profile when node still isn’t resolvable (also capturing FNM_* vars).

Wires the Windows repair path into app entrypoints: apps/desktop syncShellEnvironment and apps/server fixPath now apply the full env patch on win32 and return early; unsupported platforms remain no-ops.

Adjusts Windows terminal spawning behavior: terminal manager now prefers pwsh.exe (with -NoLogo) and falls back through absolute Windows PowerShell and cmd.exe, with tests updated/added; PTY adapter now wraps spawn failures as structured PtySpawnError.

Centralizes command availability + build tweaks: isCommandAvailable is moved to shared shell utils and re-exported from server/open, and the desktop artifact build on Windows disables npmRebuild, disables signing/editing when unsigned, and uses bun install --omit optional plus a fallback-installed electron-builder invocation.

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

Note

Fix Windows PATH hydration and shell environment repair for desktop and server

Macroscope summarized 0bafdb6.

- hydrate desktop and server PATH handling for Windows CLI tools
- probe shells without profiles first, then fall back to profile-loaded env when node is missing
- share command availability and PATH repair utilities across desktop and server
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 4, 2026

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

Run ID: e332b4c3-d8f7-4ca5-a485-df3617a1073b

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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 and usage tips.

@github-actions github-actions bot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Apr 4, 2026
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 32efe2a5dd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/shared/src/shell.ts
Comment thread packages/shared/src/shell.ts
Comment thread packages/shared/src/shell.ts Outdated
- Normalize captured shell output by trimming `\r\n` around extracted values
- Add coverage for Windows PowerShell env parsing
@github-actions github-actions bot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Apr 4, 2026
- Remove redundant node availability probe
- Return the profiled patch directly when present
@github-actions github-actions bot added size:L 100-499 changed lines (additions + deletions). and removed size:XL 500-999 changed lines (additions + deletions). labels Apr 4, 2026
@macroscopeapp
Copy link
Copy Markdown
Contributor

macroscopeapp bot commented Apr 4, 2026

Approvability

Verdict: Needs human review

This PR introduces new Windows platform functionality including PATH hydration from PowerShell, shell preference changes (pwsh.exe over cmd.exe), and profile loading for fnm support. These are significant runtime behavior changes on Windows that warrant human review despite comprehensive test coverage.

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

Copy link
Copy Markdown
Member

@juliusmarminge juliusmarminge left a comment

Choose a reason for hiding this comment

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

Thank you! Will test on my windows laptop in a bit 👀

Comment thread packages/shared/src/shell.ts Outdated
Comment thread packages/shared/src/shell.ts
@Badbird5907
Copy link
Copy Markdown
Contributor Author

Thank you! Will test on my windows laptop in a bit 👀

Thanks! I forgot to mention that this issue only happens in the .exe distribution, npx t3 isn't affected as it inherits the PATH from the existing shell

@github-actions github-actions bot added size:XL 500-999 changed lines (additions + deletions). and removed size:L 100-499 changed lines (additions + deletions). labels Apr 16, 2026
Badbird5907 and others added 2 commits April 16, 2026 16:59
…ndows-path-support-pr

# Conflicts:
#	apps/desktop/src/syncShellEnvironment.ts
#	packages/shared/src/shell.test.ts
Copy link
Copy Markdown
Contributor

@cursor cursor bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 42c7cd5. Configure here.

}

return merged.length > 0 ? merged.join(delimiter) : undefined;
}
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.

New mergePathValues nearly duplicates existing mergePathEntries

Low Severity

The new mergePathValues function has nearly identical structure to the existing mergePathEntries — both split by a platform delimiter, deduplicate, and rejoin. The only meaningful difference is the comparison strategy: mergePathEntries compares trimmed entries directly, while mergePathValues normalizes via normalizePathEntryForComparison (case-insensitive on win32, quote-stripping). These could be consolidated into a single function parameterized by comparison strategy, reducing duplication and the risk of inconsistent future fixes.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 42c7cd5. Configure here.

- Prefer PowerShell on Windows and add fallbacks for pwsh, PowerShell, and cmd
- Thread platform/env through terminal manager for deterministic tests
- Wrap node-pty spawn failures in PtySpawnError
- Disable Windows npm rebuild and executable editing during packaging
- Install production deps without optional packages
- Invoke electron-builder through `bun x --install=fallback`
@juliusmarminge juliusmarminge enabled auto-merge (squash) April 17, 2026 06:09
znoraka pushed a commit to znoraka/t3code that referenced this pull request Apr 17, 2026
Co-authored-by: Julius Marminge <julius0216@outlook.com>
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Apr 18, 2026
Integrates upstream/main (9df3c64) on top of fork's main (9602c18).

Upstream features adopted:
- Claude Opus 4.5 and 4.7 built-in models (pingdotgg#2072, pingdotgg#2143)
- Node-native TypeScript migration across desktop/server (pingdotgg#2098)
- Configurable project grouping with client-settings overrides (pingdotgg#2055, pingdotgg#2099)
- Thread status in command palette (pingdotgg#2107)
- Responsive composer / plan sidebar on narrow windows (pingdotgg#1198)
- Capture-phase CTRL+J keydown for Windows terminal toggle (pingdotgg#2113/pingdotgg#2142)
- Bypass xterm for global terminal shortcuts (pingdotgg#1580)
- Windows ARM build target (pingdotgg#2080)
- Windows PATH hydration + repair (pingdotgg#1729)
- Gitignore-aware workspace search (pingdotgg#2078)
- Claude process leak fix + stale session monitoring (pingdotgg#2042)
- Preserve provider bindings when stopping sessions (pingdotgg#2084)
- Clean up invalid pending-approval projections (pingdotgg#2106) — new migration
- Extract backend startup readiness coordination
- Drop stale text-gen options on reset (pingdotgg#2076)
- Extend negative repository identity cache TTL (pingdotgg#2083)
- Allow deleting non-empty projects from warning toast (pingdotgg#1264)
- Restore defaults only on General settings (pingdotgg#1710)
- Release workflow modernization (blacksmith runners, GitHub App token guards, v0.0.20 version bump)

Fork features preserved:
- All 8 providers (codex, claudeAgent, copilot, cursor, opencode,
  geminiCli, amp, kilo) with their adapters, services, and tests
- Fork's custom OpenCode protocol impl in apps/server/src/opencode/ (kept
  over upstream's @opencode-ai/sdk-based provider added in pingdotgg#1758 — fork's
  version is tested and integrated; upstream's parallel files deleted)
- Fork's direct-CLI Cursor adapter (kept over upstream's new ACP-based
  CursorProvider added in pingdotgg#1355 — upstream's parallel files deleted)
- Fork's ProviderRegistry aggregates only codex + claudeAgent snapshots;
  the other 6 providers register via ProviderAdapterRegistry
- PROVIDER_CACHE_IDS stays at [codex, claudeAgent] matching what the
  registry actually caches
- Migration IDs preserved (fork 23/24/25/26; upstream's new 025 lands at
  ID 27 to avoid re-applying on deployed fork DBs)
- Fork's generic per-provider settings (enabled/binaryPath/configDir/
  customModels) kept over upstream's opencode-specific serverUrl/password
- Log directory IPC channels, updateInstallInFlight tracking, icon
  composer pipeline all preserved
- Fork's simplified release.yml (no npm CLI publish, no nightly infra)
- composerDraftStore normalizeProviderKind widened to accept all 8 kinds
- Dark mode --background set to #0f0f0f

Test status:
- All 9 package typechecks pass
- Lint clean (0 errors)
- Tests: 1877 passed, 15 skipped (incl. 4 historically-flaky GitManager
  cross-repo PR selector tests newly gated with TODO for Node-native-TS
  follow-up)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants