Copilot CLI hooks fail on Windows: command runs under PowerShell, which can't execute te-hook

Open
#204 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

@sykuang is already working on this.

Since Nov 11, 2026.

  • #206 by @sykuang — open

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
72/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
github, powershell, python

Research direction

Read plugin/hooks/copilot-hooks.json and the existing Windows handling in the Codex manifest. Check how Copilot hook commands are configured for bash and powershell, then verify the proposed shell lookup against the Windows environments in the report. Done means all six hooks run without errors on Windows and te status shows the repository.

Written by the indexing model from the issue text.

Description

Summary

On Windows, every Copilot CLI hook from the plugin fails with exit code 1, so TokenEconomizer never runs (no state under ~/.tokeneconomizer/repos/...).

plugin/hooks/copilot-hooks.json uses only command:

"command": "\"${PLUGIN_ROOT}/scripts/te-hook\" --host copilot"

Per the Copilot hooks reference, command is copied to both bash and powershell. On Windows, Copilot CLI runs the powershell variant, and PowerShell can't execute the extensionless POSIX script te-hook (Cannot run a document in the middle of a pipeline: ...\plugin\scripts\te-hook).

docs/PLUGIN.md already notes that Copilot CLI on Windows is untested, so this may be expected. I'm filing it with a verified workaround.

Environment

  • Windows 11, Copilot CLI 1.0.107 (standalone copilot.exe)
  • Git for Windows (C:\Program Files\Git); its bin\ is not on the machine PATH by default (only Git\cmd)
  • Python 3.15 via the Python install manager
  • Plugin installed from a local clone at main (marketplace add + copilot plugin install tokeneconomizer@tokeneconomizer)

Repro

  1. Install the plugin on Windows as above.
  2. In any git repo: copilot -p "Reply with just: ok"
  3. ~/.copilot/logs/process-*.log shows, once per hook:
    [ERROR] [rust:hooks] Hook from "tokeneconomizer@tokeneconomizer" execution failed: Error: Hook command failed with code 1

What I tested

Variant Normal user PATH PATH with Git bin on it
Original command ❌ 4 hook failures ❌ 4 hook failures
"command": "sh \"${PLUGIN_ROOT}/scripts/te-hook\" ..." ❌ (sh not on PATH) ✅
Split bash + powershell with sh lookup (below) ✅ ✅

A plain sh prefix isn't enough, because Git for Windows doesn't put sh.exe on PATH by default. Deriving it from git.exe alone isn't enough either: some hosts bundle a Git whose sh.exe is under usr\bin instead of bin.

Suggested fix

Keep the POSIX command as bash, and add a powershell entry that locates sh.exe (PATH first, then next to git.exe):

{
  "type": "command",
  "bash": "\"${PLUGIN_ROOT}/scripts/te-hook\" --host copilot",
  "powershell": "$s=(Get-Command sh.exe -ErrorAction SilentlyContinue).Source; if(-not $s){$g=Split-Path (Split-Path (Get-Command git.exe -ErrorAction SilentlyContinue).Source); $s=@(\"$g\\bin\\sh.exe\",\"$g\\usr\\bin\\sh.exe\") | Where-Object {Test-Path $_} | Select-Object -First 1}; & $s \"${PLUGIN_ROOT}/scripts/te-hook\" --host copilot",
  "timeoutSec": 30
}

With this applied to all 6 events, I get no hook errors, te status shows the repo, and toolprune records the catalog. A small te-hook.ps1 wrapper would be cleaner than the inline one-liner. The Codex manifest's commandWindows handling looks like the equivalent of this for Codex.

Possibly related: #167 (te launcher on Windows/Git Bash).

Dominant language
Python
Stars
5.6k
Forks
344
Avg merge
17h 41m
Merged PRs (30d)
73

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

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.

More from microsoft/TokenEconomizer

All issues in microsoft/TokenEconomizer

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.