anthropics / anthropics/claude-code

`claude plugin eval` refuses every Bash-granting run on a Mac with Docker Desktop (symlinks in ~/.docker/cli-plugins)

Open
#94,308 0 comments 0 reactions 0 assignees View on GitHub
area:plugins area:sandbox bug platform:macos
Dominant language
Python
Stars
145k
Forks
23.1k
PR merge metrics
PR metrics pending

Description

## Environment

- Claude Code 2.1.270 (also seen on 2.1.268), macOS 26.6.2, claude.ai login
- Docker Desktop installed with its default layout; Colima also installed

## What happens

```
claude plugin eval --case --runs 1 --ablation none \
--allow-tools Bash Edit Write --scaffold --trust-plugin --no-publish --json out.json
```

exits before any model call (cost 0, duration 1 s). The run's `error` field reads:

> the Docker (~/.docker, DOCKER_CONFIG) credential store on this machine holds a symbolic link inside it, so the Bash sandbox cannot reliably exclude it — a Bash-granting evaluation cannot run here; keep the store's contents in one plain directory (its root may be a link)

The same case runs fine with `--allow-tools Edit Write`.

## Why this is generic, not one machine

Docker Desktop for Mac installs `~/.docker/cli-plugins/docker-*` as symlinks into `/Applications/Docker.app/Contents/Resources/cli-plugins/` (16 of them here: buildx, compose, scout, sbom, ...), plus `~/.docker/bin/lib/*.dylib` version-alias symlinks for Docker Model Runner. Every Docker Desktop install has the `cli-plugins` set, so every such Mac hits this preflight as soon as a case needs Bash. The credential store itself (`config.json`, `credsStore: desktop`) contains no symlinks; only the plugin directory does. Docker Desktop manages those symlinks, so deleting them is not a durable workaround.

## Tried

- `DOCKER_CONFIG=`: same refusal; the check still reads `~/.docker`.
- `HOME= CLAUDE_CONFIG_DIR=~/.claude`: passes the preflight, but the run fails auth (401 OAuth token expired) and writes a stray `/.claude.json`.
- The regular Claude Code Bash sandbox (`sandbox.enabled` with `denyRead` rules) runs on the same machine without complaint, so the plugin eval preflight is stricter than the sandbox itself.

## Expected

One of: resolve symlinks when building the deny rule; deny only `config.json` and the credential helper paths instead of all of `~/.docker`; or document a supported layout that Docker Desktop does not overwrite. As it stands, Bash-granting plugin evals cannot run on a Mac with Docker Desktop.

Contributor guide

No contributing guide indexed for this repository

Research direction

Start at the preflight used by `claude plugin eval` for Bash-granting runs and reproduce it with Docker Desktop's symlinks under `~/.docker/cli-plugins`; compare it with the regular Bash sandbox, which does not refuse the same layout. Done means a Bash-granting evaluation can run with Docker Desktop installed while still protecting the credential store, with coverage for this symlink layout.

Written by the indexing model from the issue text.

Assessment

Tech stack
docker, macos
Domain
cli, security
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.