Skip to content

[.NET] CreateProcess fails when Copilot CLI is installed via npm (copilot.cmd) #866

@itayfisz

Description

@itayfisz

Problem

On Windows, when the Copilot CLI is installed via npm, the only executables on PATH are copilot (extensionless) and copilot.cmd. There is no copilot.exe.

The .NET SDK's StartCliServerAsync uses ProcessStartInfo with UseShellExecute = false, which calls CreateProcess under the hood. CreateProcess cannot resolve .cmd/.bat files — it only finds native executables (.exe, .com). This results in:

System.ComponentModel.Win32Exception (2): An error occurred trying to start process 'copilot'
with working directory '...'. The system cannot find the file specified.
   at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
   at GitHub.Copilot.SDK.CopilotClient.StartCliServerAsync(...)

Running copilot in a terminal works fine because PowerShell/cmd.exe use PATHEXT to resolve .cmd wrappers. But the SDK's CreateProcess does not.

Output of where.exe copilot on affected machines:

C:\ProgramData\global-npm\copilot
C:\ProgramData\global-npm\copilot.cmd

This was already fixed in the Python SDK

PR #338 fixed the same issue for the Python SDK by using shutil.which() to resolve the full CLI path before spawning the subprocess.

Suggested fix for .NET

The SDK already has ResolveCliCommand which handles .js files by prepending node:

private static (string FileName, IEnumerable<string> Args) ResolveCliCommand(string cliPath, IEnumerable<string> args)
{
    if (cliPath.EndsWith(".js", StringComparison.OrdinalIgnoreCase))
    {
        return ("node", new[] { cliPath }.Concat(args));
    }
    return (cliPath, args);
}

A similar approach for .cmd files (prepending cmd.exe /c) would work. Alternatively, resolve the PATH using PATHEXT-aware logic before passing to ProcessStartInfo.

Environment

  • SDK: GitHub.Copilot.SDK 0.1.32 (NuGet)
  • OS: Windows 11
  • CLI install method: npm (global)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions