Procedure
まず
dryモードで現状を把握する:~/.claude/scripts/plugin-cache-repair.sh dry出力で確認するのは 3 数値:
cache present/cache missing/restorablevsflip to false。cache missingが 0 なら何もしない(healthy)。cache missing > 0の場合:restorableが出ていれば.disabled-cache/<name>からcache/<marketplace>/<name>/へcp -Rで復元される。flip to falseが出ていればsettings.json内の該当enabledPlugins[key]がfalseに倒される(プラグイン本体が無いので enable 状態を維持しても起動エラーを誘発するだけ)。
内容を確認したら適用:
~/.claude/scripts/plugin-cache-repair.sh applysettings.jsonは~/.claude/backups/settings.json.before-plugin-cache-repair-<timestamp>に自動バックアップされる。再度
dryでcache present == enabled(true) totalになっていることを確認。
Pitfalls
- cache のレイアウトは
<marketplace>/<plugin-name>/階層。 キーvercel@claude-plugins-officialはcache/claude-plugins-official/vercel/を見る。 平面構造だと思って書くと全件 missing と誤判定するので注意。 .disabled-cacheは marketplace で区切られていない。直下にプラグイン名だけ。 だから復元時はcp -R .disabled-cache/<name> cache/<marketplace>/<name>と marketplace を補う。- 既存 cache は絶対に上書きしない。スクリプトは
[ -e "$DST" ] && SKIPを入れてある。手動で実行する場合も同じ姿勢で。 apply前に必ずdryを読む。restorableとflip to falseの内訳を確認してから走らせる(特に flip 多発時は別問題の可能性)。- bash 3.2 互換のため
mapfile/ 連想配列は使っていない。改修するときも 3.2 互換を維持する(macOS の/bin/bashがまだ 3.2)。 settings.json編集はpython3 + jsonモジュール経由。jq での書き戻しはコメントや末尾改行が壊れるので避ける。- 大規模 flip が出る場合の判断: 例えば 30 件以上が flip 候補なら、cache ディレクトリ自体が消えた・marketplace 名がリネームされたなどの別障害を疑い、apply の前にユーザーに報告。
Verification
dry出力にall enabled plugins have cache. healthy.が出ること。- 直近の
~/.claude/backups/settings.json.before-plugin-cache-repair-*と現行をdiffして、flip した key 以外には差分が無いこと:diff <(jq -S . ~/.claude/backups/settings.json.before-plugin-cache-repair-*) \ <(jq -S . ~/.claude/settings.json) | head -40 - 復元したプラグインが実際に手元で参照可能であること:
ls ~/.claude/plugins/cache/<marketplace>/<plugin-name>/ | head - Claude Code を起動し直して
Plugin directory does not existがログから消えていること。