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

Offen
#4,549 2 Kommentare 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

triage
Vorherrschende Sprache
Shell
Sterne
11.2k
Forks
1.9k
Ø Merge
14 Std. 16 Min.
Gemergte PRs (30 T.)
6

Beschreibung

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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Verfolge den allgemeinen Ausführungspfad von Shell-Befehlen des Agents und untersuche, wie er Befehle über node-pty/ConPTY startet. Vergleiche seine Prozessoptionen mit den Änderungen zur Unterdrückung von Fenstern aus den PRs #10235 und #11037 und reproduziere das Problem unter Windows; erledigt ist die Aufgabe, wenn wiederholte Shell-Befehle kein PowerShell- oder conhost-Fenster mehr kurz anzeigen oder den Fokus übernehmen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
node.js, powershell
Bereich
cli, operating-systems
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Aktiv
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
55/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.