github / github/copilot-cli

Hook `ask` decisions show raw JSON instead of diff view

Open
#4,135 1 comment 0 reactions 0 assignees View on GitHub
area:permissions area:terminal-rendering
Dominant language
Shell
Stars
11.2k
Forks
1.9k
Avg merge
14h 16m
Merged PRs (30d)
6

Description

### Describe the bug

Copilot CLI normally shows a rich diff/content view when asking permission to create or edit a file. However, when the `ask` decision comes from a `PreToolUse` hook (i.e. the hook returns `{"permissionDecision": "ask", "permissionDecisionReason": "..."}`) rather than from the default built-in ask-before-write behavior, that rich diff view does not get triggered.

Instead, the "Hook permission request" dialog renders the `permissionDecisionReason` correctly as readable yellow text, but shows the proposed change as a single JSON line containing the raw tool input (file path plus the entire file content field), hard-wrapped at the current terminal width. For a file write/edit with non-trivial content this becomes a wall of wrapped JSON (quotes, escaped `\n`, braces, etc.) that is effectively unreadable, instead of the normal diff view Copilot CLI already has and uses elsewhere.

### Affected version

```
$ copilot --version
GitHub Copilot CLI 1.0.70.
```

### Steps to reproduce the behavior

1. Configure a `PreToolUse` hook script for Copilot CLI (a hook that reads the tool-call JSON from stdin and can return a permission decision).
2. Have the hook return an `ask` decision for a file create/edit tool call, e.g.:
```json
{
"permissionDecision": "ask",
"permissionDecisionReason": "Human review requested for this file write."
}
```
3. Trigger a tool call that creates or edits a file with non-trivial (multi-line) content.
4. Observe the "Hook permission request" dialog that Copilot CLI shows: compare it to the normal ask-before-write dialog (without a hook forcing `ask`), which renders a proper diff/content view for the same kind of file change.

### Expected behavior

- The `permissionDecisionReason` should display as it currently does (readable yellow text) — this part works correctly.
- When the `ask` decision is produced by a hook for a file create/edit tool, the dialog should render the proposed change using the same rich diff/content view Copilot CLI already uses for its default ask-before-write flow, instead of falling back to a single wrapped line of raw JSON tool input.

### Additional context

- OS: Windows 11
- CPU architecture: x86_64
- Terminal: Windows Terminal
- Shell: PowerShell 7 — note that Copilot CLI runs its own tool calls (including file create/edit) via its internal PowerShell invocation regardless of the interactive shell, so this shouldn't affect reproduction

Contributor guide

Open the contributing guide

Research direction

Reproduce the issue through a PreToolUse hook that returns an ask decision for a multiline file create or edit, then compare the Hook permission request dialog with the default ask-before-write flow. Trace the hook permission request entry point and the existing diff/content view; done means the hook path preserves the readable reason and uses that same rich view instead of wrapped raw JSON.

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
55/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.