Windows: Codex launches tools with \\?\ namespace cwd, breaking pnpm/Node tooling
Summary
On Windows, Codex desktop is sometimes launching shells/tools with the workspace cwd set to the raw namespace path form \\?\C:\... instead of a normal DOS path like C:\....
That breaks Node ecosystem tools. In my case it caused pnpm to fail immediately with:
ERROR EISDIR: illegal operation on a directory, lstat 'C:'
This appears to be a Codex cwd normalization bug, not a repo-specific problem.
Environment
- OS: Windows
- Shell: PowerShell
- Workspace path:
C:\Users\brade\OneDrive\Desktop\vibecodr - Codex desktop app
Repro
- Open a workspace in Codex desktop such that the terminal/process cwd becomes
\\?\C:\Users\brade\OneDrive\Desktop\vibecodr - In the terminal, run:
Get-Locationnode -e "console.log(process.cwd())"pnpm -v
- Observe that PowerShell and Node report the cwd as the raw
\\?\C:\...path. - Observe that
pnpmfails withEISDIR: illegal operation on a directory, lstat 'C:'.
Verified Comparison
Using the same repo on the same machine:
- With cwd =
\\?\C:\Users\brade\OneDrive\Desktop\vibecodr node -e "console.log(process.cwd())"prints\\?\C:\Users\brade\OneDrive\Desktop\vibecodrpnpm -vfails withEISDIR: illegal operation on a directory, lstat 'C:'
- With cwd =
C:\Users\brade\OneDrive\Desktop\vibecodr node -e "console.log(process.cwd())"printsC:\Users\brade\OneDrive\Desktop\vibecodrpnpm -vworks normally
Expected Behavior
Codex should normalize Windows workspace cwd values before passing them to spawned shells/tools/processes.
Tools should receive a normal DOS path such as:
C:\Users\brade\OneDrive\Desktop\vibecodr
not the raw namespace-prefixed form:
\\?\C:\Users\brade\OneDrive\Desktop\vibecodr
Actual Behavior
Codex sometimes launches the terminal/processes with the raw \\?\ namespace path as cwd, which breaks pnpm and likely other Node tooling.
Impact
This breaks a lot of Codex desktop workflows on Windows because many app features eventually shell out to Node-based tools.
Likely Root Cause
Codex is probably preserving a Windows namespace path from internal file APIs and passing it through unchanged as the cwd for child processes.
Workaround
Manually cd to the normal path:
Set-Location -LiteralPath 'C:\Users\brade\OneDrive\Desktop\vibecodr'
or reopen the workspace from the normal path instead of the \\?\... path.
5 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
Follow-up with a proven local workaround.
I was able to fix this locally by adding a PowerShell startup shim that detects a
\\?\filesystem cwd and immediately normalizes it back to a standard DOS path before running Node-based tools.Example:
After doing that, a fresh PowerShell session launched from the bad cwd:
\\?\C:\Users\brade\OneDrive\Desktop\vibecodrimmediately normalized to:
C:\Users\brade\OneDrive\Desktop\vibecodrand then:
node -e "console.log(process.cwd())"reported the normal pathpnpm -vworked normallySo the global fix seems to be: normalize Windows namespace paths before passing the workspace cwd to spawned shells/tools/processes. In other words, if Codex is holding
\\?\C:\...internally for file APIs, it should strip that prefix (and convert\\?\UNC\server\shareto\\server\share) at the child-process launch boundary.That should avoid requiring any shell-specific workaround and fix the entire class of Node/pnpm failures on Windows.
Additional scope: the local PowerShell workaround fixes terminal-launched tools, but it does not fix creating a new worktree inside the Codex app.
That strongly suggests there are at least two affected boundaries:
The shell workaround only helps with (1) because it runs inside PowerShell after the app has already started the shell. Worktree creation appears to bypass that entirely and still uses the raw
\\?\...path internally.One more signal: my local
C:\Users\brade\.codex\config.tomlcurrently contains both of these project keys:C:\Users\brade\OneDrive\Desktop\vibecodr\\?\C:\Users\brade\OneDrive\Desktop\vibecodrThat looks like path normalization is leaking into project identity as well, not just child-process cwd.
Also, the public repo already has a Windows helper for this exact class of issue:
codex-rs/core/src/path_utils.rsdefinesnormalize_for_native_workdir(...)dunce::simplified(...)to collapse verbatim paths like\\?\D:\...back toD:\...codex-rs/core/src/config/mod.rsalready uses that helper when resolvingcwdSo the likely global fix is broader than shell launch alone:
If maintainers prefer, the shell/tool failure and the in-app worktree creation failure could be tracked separately, but they look like the same root normalization bug surfacing in two different codepaths.
I made a tracking issue for the root cause of these classes of bugs https://github.com/openai/codex/issues/10347
I think this may have been fixed by https://github.com/openai/codex/pull/19606.