[BUG] Code tab terminal integration fails on Windows (MSIX install)
Summary
In the Claude desktop app (Code tab), the PowerShell terminal integration does not load,
because its files are written into the MSIX-virtualized AppData folder, while the terminal
shell runs outside the package and looks for them in the real %APPDATA%. As a result, the app
never detects a ready prompt in Terminal panel tabs: Claude's run_in_terminal tool always
fails with "had not reached a prompt after 60 s" and closes the tab.
Environment
- OS: Windows 11 Home 10.0.26200
- Claude desktop app: MSIX package
Claude_pzs8sxrjxfjjc, version 2.19675.0.0
(problem also present in 2.16120.0.0 before the auto-update)
- Shell: Windows PowerShell 5.1, no PowerShell profile files present
- Date observed: 2026-10-03
Steps to reproduce
- Install the Claude desktop app from the MSIX package on Windows 11.
- Open the Code tab, open a new tab in the Terminal panel.
- Alternatively, let Claude run a command via
run_in_terminal.
Actual result
Every new terminal tab prints:
WARNUNG: Claude terminal integration did not load: Ausnahme beim Aufrufen von "ReadAllText"
mit 1 Argument(en): "Ein Teil des Pfades
"C:\Users\<user>\AppData\Roaming\Claude\terminal-shell-integration\pwsh\claude-desktop.ps1"
konnte nicht gefunden werden."
(English: "Could not find a part of the path ...claude-desktop.ps1")
The prompt then appears normally and manual typing works, but run_in_terminal fails:
"the shell in new terminal tab had not reached a prompt after 60 s ... The tab was closed".
Expected result
The integration script loads, the app detects the prompt, run_in_terminal works.
Analysis
- The app writes
terminal-shell-integration\(pwsh, bash, zsh, fish, spawn) only to the
virtualized location
%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\terminal-shell-integration\
(files regenerated on every app start).
- The terminal shell runs outside the MSIX container and looks for
%APPDATA%\Claude\terminal-shell-integration\pwsh\claude-desktop.ps1, which does not exist.
Checked from a Terminal panel tab: the real path returns False, the virtualized path True.
- The per-tab nonce file (env
CLAUDE_DESKTOP_TERMINAL_NONCE_FILE, inspawn\) has the same
problem: it is written to the virtualized folder and was left unread
(e.g. spawn\959c2beede22cce1, 50 bytes).
Workarounds tried
- Copying the folder to the real %APPDATA%\Claude\: the warning disappeared, but the prompt was
still not detected (nonce file still not reachable).
- Directory junction from
%APPDATA%\Claude\terminal-shell-integrationto the virtualized folder:
the warning disappeared and the nonce file was now read and deleted by the shell (no new
leftover files in spawn\). The app still did not detect the prompt; run_in_terminal still
timed out after 60 s. Cause of this remaining part unknown.
- Junction removed again afterwards.
Not affected
Claude Code CLI (native install, 2.1.288) works normally in the terminal.
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Same issue here — additional diagnostics, incl. why the junction workaround fails.
Environment: Windows 11 Home 10.0.26300, Claude desktop MSIX
Claude_2.19675.0.0_x64__pzs8sxrjxfjjc, Windows PowerShell 5.1, Claude Code 2.1.286 (Code tab).1. Without any workaround —
run_in_terminaltabs print:The file only exists in
%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\terminal-shell-integration\. A process started outside the container (viaWin32_Process.Create) confirms the real%APPDATA%\Claudedoesn't exist at all.2. With a junction real
%APPDATA%\Claude\terminal-shell-integration→LocalCachecopy (answering "cause of this remaining part unknown" above): the warning disappears, but the app itself can no longer write into that folder — every spawn logs a spuriousEEXISTon the exclusive.tmpcreate (%LOCALAPPDATA%\Claude\Logs\main.log):shellIntegrationForSpawnthen returnsundefined, so the shell is started as a barepowershell.exe(no-NoProfile -NoExit -Command …), no OSC 133 marks are emitted, andrun_in_terminalstill times out after 60 s. This is the MSIX write-virtualization reparse-point limitation described in #83584, so the junction is not a viable workaround (removed).Likely fix: the one-line manifest change proposed in #83584 (
<desktop6:ExcludedDirectory Name="$(KnownFolder:RoamingAppData)\Claude"/>), or writingterminal-shell-integration+ the nonce file to a non-virtualized location (e.g.%TEMP%).Thanks @QuintusPL, that matches what I see here. My own
%LOCALAPPDATA%\Claude\Logs\main.logconfirms both points:``
`[warn] [ShellPtyManager] shell integration nonce unavailable EEXIST: file already exists, open 'C:\Users\<user>\AppData\Roaming\Claude\terminal-shell-integration\spawn\b06874d71254765e.tmp'
shellIntegrationForSpawn(stack goes through
→startShellPty`)``
``[warn] [ShellPtyManager] OSC 133 marks no longer trusted on ...::c5 (nonce leaked or never collected)
Correction to my original report: I wrote that with the junction "the nonce file was now read and deleted by the shell". That was wrong. The nonce file was never created because of the
EEXISTerror, which is why no leftover file appeared inspawn\. So neither the copy nor the junction is a working workaround. The junction has been removed.Related: #83584
Title: Windows (MSIX) — Terminal panel can't load shell integration; run_in_terminal never types commands
Claude desktop 2.19675.0.0 (MSIX package Claude_pzs8sxrjxfjjc), Windows 11 Home 10.0.26200, PowerShell.
Every new Terminal panel tab prints:
"Claude terminal integration did not load: ... Could not find a part of the path
'C:\Users\<user>\AppData\Roaming\Claude\terminal-shell-integration\pwsh\claude-desktop.ps1'"
and run_in_terminal fails with "shell had not reached a prompt after 60 s". Restarting the app doesn't help.
Cause (verified): the app writes the integration scripts through MSIX AppData virtualization, so they land in
C:\Users\<user>\AppData\Local\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\terminal-shell-integration\
but the Terminal panel shell runs outside the package and reads the real %APPDATA% path, where the file doesn't exist.
Processes inside the package (the agent's Bash/PowerShell tools) do see the file.