github / github/copilot-cli

Cross-tool  .claude/settings.local.json  hooks with shell operators ( || ,  && ) break on Windows PowerShell

Open
#4,399 0 comments 0 reactions 0 assignees View on GitHub
area:configuration area:platform-windows
Dominant language
Shell
Stars
11.2k
Forks
1.9k
Avg merge
14h 16m
Merged PRs (30d)
6

Description

### Describe the bug

When a repository contains a Claude Code hook config ( .claude/settings.local.json  or  .claude/settings.json ) with a  PreToolUse  hook defined via a single cross-platform  command  string containing POSIX shell operators (e.g.  ... || echo {} ), Copilot CLI fails to execute that hook correctly on Windows, which can block all subsequent tool calls gated by that hook.

**Root cause hypothesis:**
Claude Code executes these same hook commands via git-bash on Windows, so  || / &&  work there. Copilot CLI's cross-tool compatibility layer, per the hooks reference, reads  .claude/settings*.json  files but runs the single  command  string as the native Windows  powershell  fallback rather than replicating Claude Code's git-bash execution context. This makes any Claude hook authored with POSIX-only shell syntax silently non-functional (and blocking) on Windows.

### Affected version

_No response_

### Steps to reproduce the behavior

1. On Windows, in a repo, create  .claude/settings.local.json  with:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "\"C:\\path\\to\\tool.exe\" some-check || echo {}" }
]
}
]
}
}
2. Launch  copilot  in a native Windows PowerShell (5.1) terminal in that repo.
3. Attempt any shell/Bash tool call.

### Expected behavior

Expected behavior:
The hook executes successfully and either allows or blocks the tool call based on its actual logic, consistent with how the same config works under Claude Code.

Actual behavior:
The tool call is blocked.  /env  confirms the hook is loaded ("preToolUse: N hooks, source: repo settings"), but the underlying command fails silently, because  ||  is invalid syntax in Windows PowerShell 5.1 — the shell that Copilot CLI uses to run the hook (per the docs, the  command  field is used as a fallback for both  bash  and  powershell  execution).

### Additional context

Windows 11 Enterprise, PowerShell terminal (Windows PowerShell 5.1, not  pwsh  7+)

Contributor guide

Open the contributing guide

Research direction

Reproduce the issue with .claude/settings.local.json or .claude/settings.json, a PreToolUse command using ||, and Copilot CLI in Windows PowerShell 5.1. Check /env to confirm the hook source and observe whether the command fails during a Bash tool call. Done means the hook executes successfully and allows or blocks the tool call according to its result.

Written by the indexing model from the issue text.

Assessment

Tech stack
powershell, shell
Domain
cli
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.