Add "lessons/patterns/plugin-version-mismatch-causes-silent-load-failure"
@@ -0,0 +1,109 @@
|
||||
# Plugin Version Mismatch Causes Silent Load Failure
|
||||
|
||||
## Context
|
||||
- **Date:** 2026-02-02
|
||||
- **Time Wasted:** 5+ hours debugging across 3 devices
|
||||
- **Severity:** CRITICAL - plugins fail silently with NO error message
|
||||
- **Impact:** User sees "failed to load · 1 error" but NO details
|
||||
|
||||
## Problem
|
||||
|
||||
Plugins failed to load with this unhelpful message:
|
||||
```
|
||||
contract-validator Plugin · leo-claude-mktplace · ✘ failed to load · 1 error
|
||||
```
|
||||
|
||||
**Claude Code provides NO error details.** The user has to guess what's wrong.
|
||||
|
||||
## Root Cause
|
||||
|
||||
**Version mismatch between marketplace.json and plugin.json:**
|
||||
|
||||
| Plugin | marketplace.json | plugin.json | Status |
|
||||
|--------|-----------------|-------------|--------|
|
||||
| contract-validator | 1.2.0 | 1.1.0 | FAILED |
|
||||
| git-flow | 1.2.0 | 1.0.0 | FAILED |
|
||||
| projman | 3.4.0 | 3.3.0 | FAILED |
|
||||
| clarity-assist | 1.2.0 | 1.0.0 | FAILED |
|
||||
| doc-guardian | 1.1.0 | 1.0.0 | FAILED |
|
||||
|
||||
When Claude Code loads a plugin, it checks the version in marketplace.json and expects the same version in plugin.json. If they don't match, it **silently fails**.
|
||||
|
||||
## How This Happened
|
||||
|
||||
1. Version was bumped in marketplace.json during releases
|
||||
2. Individual plugin.json files were NOT updated
|
||||
3. No validation caught the mismatch
|
||||
4. Claude Code loaded plugins but failed silently
|
||||
|
||||
## Solution
|
||||
|
||||
1. Fix all version mismatches:
|
||||
```bash
|
||||
# Check mismatches
|
||||
python3 << 'EOF'
|
||||
import json, os
|
||||
with open('.claude-plugin/marketplace.json') as f:
|
||||
mkt = json.load(f)
|
||||
mkt_ver = {p['name']: p['version'] for p in mkt['plugins']}
|
||||
for p in os.listdir('plugins'):
|
||||
if os.path.exists(f'plugins/{p}/.claude-plugin/plugin.json'):
|
||||
with open(f'plugins/{p}/.claude-plugin/plugin.json') as f:
|
||||
pv = json.load(f)['version']
|
||||
if mkt_ver.get(p) != pv:
|
||||
print(f"MISMATCH: {p} mkt={mkt_ver[p]} plugin={pv}")
|
||||
EOF
|
||||
```
|
||||
|
||||
2. Clear corrupted cache:
|
||||
```bash
|
||||
rm -rf ~/.claude/plugins/cache/leo-claude-mktplace/{plugin-name}/
|
||||
```
|
||||
|
||||
3. Restart Claude Code
|
||||
|
||||
## Prevention
|
||||
|
||||
### 1. Add Version Sync Validation to Pre-Commit Hook
|
||||
|
||||
Add to `scripts/validate-marketplace.sh`:
|
||||
```bash
|
||||
# Validate version consistency
|
||||
for plugin in plugins/*/; do
|
||||
name=$(basename "$plugin")
|
||||
mkt_ver=$(grep -A1 "\"$name\"" .claude-plugin/marketplace.json | grep version | grep -oE '[0-9.]+')
|
||||
plugin_ver=$(grep version "$plugin/.claude-plugin/plugin.json" | grep -oE '[0-9.]+')
|
||||
if [[ "$mkt_ver" != "$plugin_ver" ]]; then
|
||||
echo "ERROR: Version mismatch for $name"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
```
|
||||
|
||||
### 2. Single Version Source
|
||||
|
||||
Consider using a script to update ALL version locations atomically.
|
||||
|
||||
### 3. Release Checklist
|
||||
|
||||
- [ ] Update marketplace.json version
|
||||
- [ ] Update plugin.json version (MUST MATCH)
|
||||
- [ ] Run version consistency check
|
||||
- [ ] Clear plugin cache after update
|
||||
|
||||
## Warning Signs
|
||||
|
||||
If you see this, check version consistency:
|
||||
- "✘ failed to load · 1 error" with no details
|
||||
- Plugin worked before, suddenly doesn't
|
||||
- After version bump, plugins stop loading
|
||||
|
||||
## Related Issues
|
||||
|
||||
- Claude Code provides no error details for plugin load failures
|
||||
- Cache can hold stale/orphaned versions
|
||||
- No built-in version consistency validation
|
||||
|
||||
|
||||
---
|
||||
**Tags:** version, plugin, silent-failure, cache, critical, marketplace, debugging
|
||||
Reference in New Issue
Block a user