Plugin installPath ignores source.path for external git-sourced plugins

Resolved 💬 3 comments Opened Apr 29, 2026 by amdvikasd Closed May 3, 2026

Summary

When a marketplace plugin defines an external git source with a path sub-key, Claude Code clones the repo but sets installPath to the repo root, ignoring the path offset. This prevents skill discovery, MCP config loading, and .claude-plugin detection for the plugin.

Steps to Reproduce

  1. Create a marketplace plugin with an external git source and a path field in marketplace.json:
{
  "name": "dashboard",
  "source": {
    "source": "url",
    "url": "git@github.com:example/my-repo.git",
    "path": "plugin"
  }
}
  1. The repo structure has the plugin assets in the plugin/ subdirectory:
repo-root/
├── backend/
├── frontend/
├── plugin/              ← path points here
│   ├── .claude-plugin/
│   │   └── plugin.json
│   ├── .mcp.json
│   └── skills/
│       └── query/
│           └── SKILL.md
└── README.md
  1. Install and enable the plugin via settings.json:
"enabledPlugins": {
  "dashboard@my_marketplace": true
}
  1. Restart Claude Code and try to invoke the plugin's skill (e.g., /dashboard:query).

Expected Behavior

  • installPath in installed_plugins.json should be set to <cache_dir>/plugin (honoring the path field).
  • Skills, .mcp.json, and .claude-plugin/plugin.json are discovered correctly.
  • /dashboard:query works as a slash command.

Actual Behavior

  • installPath is set to the repo root: <cache_dir>/ (ignoring path).
  • Claude Code cannot find .claude-plugin/plugin.json at the root, so skills are never registered.
  • /dashboard:query returns "Unknown command".
  • The MCP tools defined in .mcp.json do load (likely via a separate mechanism), but skills do not.

Contents of installed_plugins.json after install:

{
  "version": 2,
  "plugins": {
    "dashboard@my_marketplace": [
      {
        "scope": "user",
        "installPath": "/home/user/.claude/plugins/cache/my_marketplace/dashboard/1.0.0",
        ...
      }
    ]
  }
}

Should be:

"installPath": "/home/user/.claude/plugins/cache/my_marketplace/dashboard/1.0.0/plugin"

Workaround

Manually editing installed_plugins.json to append the path value to installPath fixes the issue, but it reverts on every plugin reinstall/update.

Environment

  • Claude Code version: 2.1.119
  • OS: Linux 6.8.0-106-generic

View original on GitHub ↗

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