github / github/copilot-cli

[Windows] Every shell command spawns a visible PowerShell console window (new console, not hidden) that stays open for the command's lifetime

Open
#4,549 2 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

triage
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
    (registry ProductName cosmetically reads "Windows 10 Enterprise" on this build)
  • Shell: PowerShell (default on Windows)
  • Terminal: Windows Terminal
Steps to reproduce
  1. Launch copilot in Windows Terminal on Windows 11.
  2. Ask the agent to run essentially any shell command (e.g. a simple
    Get-ChildItem, or any node -e "..." invocation).
  3. 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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.