[Windows] Every shell command spawns a visible PowerShell console window (new console, not hidden) that stays open for the command's lifetime
Nobody has claimed this yet.
- Dominant language
- Shell
- Stars
- 11.2k
- Forks
- 1.9k
- Avg merge
- 14h 16m
- Merged PRs (30d)
- 6
Description
Summary
On Windows, Copilot CLI briefly flashes an empty PowerShell / conhost console
window every time the agent executes a shell command. During normal agent
activity (many commands per task) this produces near-constant window flashing
that momentarily steals focus and is very distracting.
This appears to be the same class of bug as the already-fixed git / hook /
path-resolution flashes (PRs #10235 and #11037) and the open MCP-startup flash
(#3171), but on the general agent shell-command execution path, which is
still affected.
Environment
- Copilot CLI: 1.0.80 (latest at time of report)
- OS: Windows 11 24H2, build 26100.9106
(registryProductNamecosmetically reads "Windows 10 Enterprise" on this build) - Shell: PowerShell (default on Windows)
- Terminal: Windows Terminal
Steps to reproduce
- Launch
copilotin Windows Terminal on Windows 11. - Ask the agent to run essentially any shell command (e.g. a simple
Get-ChildItem, or anynode -e "..."invocation). - Watch the screen while the command executes.
Expected
Shell commands run without any visible console window appearing — as already
happens for git commands and for hook / path-resolution after #10235 / #11037.
Actual
A blank PowerShell / conhost window flashes on screen for each spawned
command, briefly stealing focus.
Real-world example that triggers it
This is an actual command a session spawned (a mermaid-diagram validation step).
Every command shaped like this flashes a window:
$node = "C:\ProgramData\global-npm\node_modules\node\bin\node.exe"
$script = @'
const fs = require("fs");
const files = process.argv.slice(2);
let idx = 0;
for (const f of files) {
const txt = fs.readFileSync(f, "utf8").split(/\r?\n/);
let inBlock = false, buf = [], start = 0;
for (let i = 0; i < txt.length; i++) {
const line = txt[i];
if (!inBlock && /^\s*```mermaid\s*$/.test(line)) { inBlock = true; buf = []; start = i + 1; continue; }
if (inBlock && /^\s*```\s*$/.test(line)) {
inBlock = false; idx++;
const base = f.replace(/^.*[\\/]/, "");
const out = `${process.env.TEMP}\\mmvalidate\\block_${idx}_${base}_L${start+1}.mmd`;
fs.writeFileSync(out, buf.join("\n"));
continue;
}
if (inBlock) buf.push(line);
}
}
'@
Set-Content -Path "$env:TEMP\mmvalidate\extract.js" -Value $script -Encoding utf8
& $node "$env:TEMP\mmvalidate\extract.js" "$env:TEMP\brga.md" "$env:TEMP\rad.md" "$env:TEMP\rrd.md"
Note: the window that flashes is the outer powershell.exe host the CLI
spawns to run the command — not node.exe. node is a console app and
inherits the parent console, so it does not create a window on its own. The
content of the command is irrelevant; any shell command triggers the flash.
Likely root cause
The CLI runs shell commands on Windows via node-pty / ConPTY (conpty.node).
The pseudo-console host (conhost.exe) for the spawned command is not being
suppressed on this path, so its window briefly appears. The earlier fixes added
window suppression (windowsHide / CREATE_NO_WINDOW) only to specific paths:
- #10235 — "Git commands no longer flash a console window on Windows"
- #11037 — "Prevent brief console windows from flashing on Windows when the
agent runs hook commands or resolves command paths"
The main agent command-execution path appears not to have the equivalent
suppression.
Related
- #3171 — [Windows] CMD windows flash on screen when MCP servers start
(same class of bug, different trigger)
Suggested fix
Apply the same window-suppression used in #10235 / #11037 to the agent's
shell-command execution path — i.e. ensure the ConPTY / child-process spawn
passes windowsHide: true (or creates the console host without a visible
window / uses a headless OpenConsole host consistently) for every command the
agent runs, not just git, hooks, and path resolution.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Trace the agent's general shell-command execution path and inspect how it spawns commands through node-pty/ConPTY. Compare its process options with the window-suppression changes from PRs #10235 and #11037, then reproduce on Windows; done means repeated shell commands no longer flash a PowerShell or conhost window or steal focus.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- node.js, powershell
- Domain
- cli, operating-systems
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 55/100