Cross-tool .claude/settings.local.json hooks with shell operators ( || , && ) break on Windows PowerShell
Nobody has claimed this yet.
- 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
- 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 {}" }
]
}
]
}
} - Launch copilot in a native Windows PowerShell (5.1) terminal in that repo.
- 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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
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