anthropics / anthropics/claude-code

[BUG] Startup workspace-trust dialog does not warn about hooks in .claude/settings.json, while the /cd dialog does

Open
#94,277 0 comments 0 reactions 0 assignees View on GitHub
area:hooks area:security bug has repro platform:macos
Dominant language
Python
Stars
145k
Forks
23.1k
PR merge metrics
PR metrics pending

Description

### Preflight Checklist

- [x] I have searched [existing issues](https://github.com/anthropics/claude-code/issues?q=is%3Aissue%20state%3Aopen%20label%3Abug) and this hasn't been reported yet
- [x] This is a single bug report (please file separate reports for different bugs)
- [x] I am using the latest version of Claude Code

### What's Wrong?

The two trust dialogs disclose different things for the same directory.

Starting `claude` inside an untrusted directory whose `.claude/settings.json` defines a
`PreToolUse` command hook shows (2.1.270, verbatim):

```
Accessing workspace:
/Users/flo/claude-poc-sandbox/parent/sub
Quick safety check: Is this a project you created or one you trust? (Like your
own code, a well-known open source project, or work from your team). If not,
take a moment to review what's in this folder first.
Claude Code'll be able to read, edit, and execute files here.
Security guide
❯ No, exit
Yes, I trust this folder
```

No mention of hooks. Using `/cd` into the very same directory from a trusted session shows:

```
Moving to a new directory:
/Users/flo/claude-poc-sandbox/parent/sub
This session hasn't worked here before. Is this a directory you created or one you trust?
Claude Code'll be able to read, edit, and execute files here.
⚠ This directory configures hooks that run commands, declared in .claude/settings.json
These will apply to this session as soon as you move. Only proceed if you trust this configuration.
❯ No, stay put
Yes, move here
```

The startup dialog already inspects the settings file for pre-approved permissions (see #87012,
"This folder pre-approves 35 tool permissions in .claude/settings.local.json"), so the hook check
that `/cd` performs should be cheap to add there. Hooks are the more consequential of the two:
they run commands on the first tool call regardless of what the user later approves.

### What Should Happen?

The startup trust dialog should carry the same hook warning as the `/cd` dialog, naming the file
and ideally the event types and commands, e.g.:

```
⚠ This folder configures hooks that run commands, declared in .claude/settings.json
PreToolUse: /Users/flo/claude-poc-sandbox/fire.sh SUB_HOOK
These will run as soon as you start using tools. Only proceed if you trust this configuration.
```

### Error Messages/Logs

```shell
n/a (dialog text above)
```

### Steps to Reproduce

1. Create an untrusted repo with a command hook:
```sh
mkdir -p /tmp/hookrepo/.claude && cd /tmp/hookrepo && git init -q
cat > .claude/settings.json <<'JSON'
{"hooks":{"PreToolUse":[{"matcher":"","hooks":[{"type":"command","command":"touch /tmp/hookrepo/HOOK_FIRED"}]}]}}
JSON
```
Make sure `~/.claude.json` has no `projects["/tmp/hookrepo"]` entry.
2. `cd /tmp/hookrepo && claude` → dialog shown without any hook warning. Choose "No, exit".
3. `cd /tmp && claude`, trust `/tmp` if asked, then `/cd /tmp/hookrepo` → dialog shown **with**
the hook warning.
4. Accept in step 3, ask Claude to run `ls`, observe `/tmp/hookrepo/HOOK_FIRED` exists.
(Same would happen after accepting in step 2, without having been told.)

### Claude Model

Other

### Is this a regression?

I don't know

### Last Working Version

n/a

### Claude Code Version

2.1.270

### Platform

Anthropic API

### Operating System

macOS

### Terminal/Shell

iTerm2

### Additional Information

- Related: #87012 (same dialog, truncated permissions list), #92911 (trust prompt suppressed,
hooks silently disabled), #67319 (VS Code never shows the dialog).
- The `/cd` dialog's behavior is good and not documented; the docs for `/cd` (v2.1.246 notes)
say settings are re-read but not that trust is re-evaluated. Worth a line in the docs.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the startup workspace-trust dialog and compare its handling of .claude/settings.json with the existing /cd dialog behavior. Reproduce the untrusted /tmp/hookrepo case from the issue, then trace the hook-warning check and its dialog text. Done means startup trust disclosure matches the /cd warning, including the configured hook information, with coverage for the reported flow.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
cli, security
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Active
Clarity
Clearly specified
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.