[BUG] claude plugin install: an auto-installed dependency resolves only its first declared dependency

Open 💬 0 comments Opened Jun 14, 2026 by paulbalomiri

Summary

When claude plugin install X pulls in a dependency Y automatically, only Y's first declared dependency is resolved — the rest are silently dropped. Installing Y explicitly resolves all of its deps, so this is specific to the recursive step into auto-installed dependencies. The docs state resolution is fully transitive, so this looks like a bug.

Version

2.1.177 (Claude Code) — also reproduced on 2.1.143.

Minimal repro (self-contained directory marketplace)

S=$(mktemp -d); MKT=$(mktemp -d)
mkdir -p "$MKT/.claude-plugin"; for p in a b c d; do mkdir -p "$MKT/plugins/$p/.claude-plugin"; done
cat > "$MKT/.claude-plugin/marketplace.json" <<'JSON'
{ "name":"repro","owner":{"name":"x"},"plugins":[
 {"name":"a","source":"./plugins/a"},{"name":"b","source":"./plugins/b"},
 {"name":"c","source":"./plugins/c"},{"name":"d","source":"./plugins/d"}]}
JSON
printf '{"name":"a","version":"0.0.1","description":"a","dependencies":["b"]}\n'     > "$MKT/plugins/a/.claude-plugin/plugin.json"
printf '{"name":"b","version":"0.0.1","description":"b","dependencies":["c","d"]}\n' > "$MKT/plugins/b/.claude-plugin/plugin.json"
printf '{"name":"c","version":"0.0.1","description":"c"}\n'                           > "$MKT/plugins/c/.claude-plugin/plugin.json"
printf '{"name":"d","version":"0.0.1","description":"d"}\n'                           > "$MKT/plugins/d/.claude-plugin/plugin.json"

HOME="$S" claude plugin marketplace add "$MKT"
HOME="$S" claude plugin install a@repro     # "✔ installed a@repro (+ 1 dependency: b)"
HOME="$S" claude plugin list                # a, b, c  — d is MISSING

Expected

a, b, c, d all installed (a → b → {c, d}).

Actual

a, b, c installed; d missing. b was auto-installed (as a's dep), and only its first dependency c was resolved.

Confirming it's the recursion, not b's manifest: HOME="$S" claude plugin install b@repro then resolves the remainder (+ 1 dependency: d).

Docs say transitive

Plugin dependencies: "If a dependency has its own dependencies, Claude Code enables those too." Possibly related: #68416 (enable writes all transitive deps to enabledPlugins, so the full set is known).

Real-world impact

A collection plugin pulled in as a dependency loses all but its first dep. We hit this with base-stack → base → [andrej-karpathy-skills, hard-rules, commit, rclone]: only the first (andrej-karpathy-skills) installed; rclone (and its session hooks) silently never installed.

Also (minor)

The install summary undercounts — install a@repro reports + 1 dependency: b even though c is also installed.

View original on GitHub ↗