Plugin install fails with EXDEV when ~/.claude and /tmp are on different filesystems

Open 💬 6 comments Opened Jan 14, 2026 by pmatos

Description

When installing a plugin from a marketplace, the installation fails with an EXDEV: cross-device link not permitted error if the user's ~/.claude directory and /tmp are on different mount points/filesystems.

Steps to Reproduce

  1. Have a system where ~/.claude and /tmp are on different filesystems (e.g., /tmp on tmpfs, home on ext4/btrfs)
  2. Add a marketplace: /plugin marketplace add pmatos/badminton-cli
  3. Install a plugin: /plugin install badminton-cli@badminton-cli

Expected Behavior

Plugin installs successfully.

Actual Behavior

Error: Failed to install: EXDEV: cross-device link not permitted, rename '/home/user/.claude/plugins/cache/badminton-cli' -> '/tmp/claude-plugin-temp-1768379668576

Environment

  • OS: Linux (Arch Linux 6.18.1)
  • Shell: zsh

Analysis

The error occurs because rename() syscall cannot move files across different filesystems. The code likely uses fs.rename() which fails with EXDEV in this case.

The fix would be to fall back to copy + delete when EXDEV is encountered, or use a temp directory on the same filesystem as the target.

Workaround

Users can work around this by cloning the repo locally and installing from the local path:

git clone https://github.com/user/plugin-repo.git /tmp/plugin

Then in Claude Code:

/plugin install /tmp/plugin/claude-plugin --scope user

View original on GitHub ↗

This issue has 6 comments on GitHub. Read the full discussion on GitHub ↗