[Bug] Marketplace update (pull) does not sync git submodules
Description
When a marketplace repository uses git submodules to compose plugins from independent repos, git pull during marketplace update does not run git submodule update, leaving submodule checkouts pinned to stale commits. This causes plugin installation to fail with:
Source path does not exist: ~/.claude/plugins/marketplaces/<name>/plugins/<submodule-plugin>
Distinction from #17293
#17293 (fixed in v2.1.7) addressed the initial clone path by adding --recurse-submodules. However, the update (pull) path remains unfixed — after the marketplace remote advances its submodule pointers, git pull only updates the pointer in the index but does not checkout the new submodule commit.
Previous reports of this exact issue (#30696, #25598) were incorrectly auto-closed as duplicates of #17293 by the bot, despite being a different code path.
Reproduction
- Install a marketplace that uses git submodules (e.g., a marketplace with
plugins/fooas a submodule) - The plugin author pushes new commits to the
fooplugin repo - The marketplace CI updates the submodule pointer and pushes
- Run
/plugin→ "Update marketplace" - Try to install the plugin that was added after the initial clone
Expected: Submodule checkout advances to the new pointer — new plugin directories are available.
Actual: Submodule stays at old commit. Installation fails with "Source path does not exist."
Root cause
The marketplace update logic runs git pull but does not follow up with git submodule update --init (or use git pull --recurse-submodules).
Suggested fix
Either:
- Use
git pull --recurse-submoduleswhen updating marketplaces, or - Run
git submodule update --initaftergit pull
Environment
- Claude Code version: 2.1.72
- OS: macOS (Darwin 24.5.0)
Workaround
cd ~/.claude/plugins/marketplaces/<name>
git submodule update --init
Or set git config submodule.recurse true in the marketplace repo to make git pull auto-update submodules.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗