claude plugin install fails with empty "Failed to clone repository:" error on Ubuntu server — git never spawned; same install works on macOS
Summary
On a fresh Ubuntu 26.04 VPS, every marketplace plugin whose source requires
cloning (url and git-subdir types) fails with an empty error message:
Installing plugin "airtable@claude-plugins-official"...✘ Failed to install
plugin "airtable@claude-plugins-official": Failed to clone repository for
git-subdir source:
The error text after the colon is always empty, so there is nothing to act on.
Environment
- Server: Ubuntu 26.04 LTS (Hetzner VPS, x86_64), Node v22.23.1, git 2.53.0
- Claude Code 2.1.202 (also reproduced on 2.1.177 on the same machine)
- Installed via npm to a user-local prefix (
~/.npm-global), subscription auth - Shell context: ssh → sudo to an unprivileged user (non-login), no TTY
- Unrestricted outbound network (verified below)
Repro
claude plugin install superpowers@claude-plugins-official # url source → fails
claude plugin install airtable@claude-plugins-official # git-subdir source → fails
claude plugin install agent-sdk-dev@claude-plugins-official # local-path source → works
Evidence collected
- Manual clones of the exact same repos succeed as the same user on the same box:
git clone https://github.com/obra/superpowers.git → OK (pinned sha present)
git clone https://github.com/Airtable/skills.git → OK
- Same plugin (
airtable) installs fine on macOS with Claude Code 2.1.177,
same account.
- Not a version regression: downgraded server to 2.1.177 → same failure.
strace -f -e trace=execve claude plugin install airtable@...shows **no
git execve at all** — the failure occurs before/without spawning git,
which suggests an internal fetch/clone layer whose real error is swallowed.
- Presence/absence of
~/.claude/plugins/cachemakes no difference. - Marketplace itself was fetched successfully (GCS snapshot present,
known_marketplaces.json correct).
Expected
Either the install succeeds, or the underlying error (network/auth/path) is
surfaced after "Failed to clone repository:".
Workaround
Copying the plugin directory from a working macOS install into~/.claude/plugins/cache/... and registering it manually ininstalled_plugins.json works fine.