ð» ãPlugin directory does not existããèªå修埩ããã¹ã¯ãªããèšèš
æ10äžã®å€§åŠçããæãæã¡ã§æ60äžãäŒç€Ÿéœåã®è§£éã§ãŒããå幎ã§Claude CodeèªåŸç°å¢ã建ãŠçŽããŠä»ã¯æå120äžããã®ç°å¢ãæ¯ããã¹ã¯ãªãããäžæ¬ãã€è§£åããŠãããŸãã
ãªããã®ä»çµã¿ãå¹ãã®ã
Claude Codeãæ¬æ Œçã«äœ¿ã蟌ãã§ãããšãããæ¥çªç¶ãèµ·åæã«ãããªãšã©ãŒãåºãããã«ãªããŸãã
Plugin directory does not exist: ~/.claude/plugins/cache/marketplace/plugin-name
çŠã£ãŠ ~/.claude/settings.json ãèŠããŠã¿ããšãenabledPlugins ã«ã¯ã¡ãããš true ã䞊ãã§ããŸããèšå®äžã¯ãæå¹ããªã®ã«ã察å¿ãããã£ãã·ã¥ãã£ã¬ã¯ããªãç©ççã«ååšããªãããããã幜éãšã³ããªãåé¡ã§ãã
ãªã幜éãšã³ããªãçãŸããã
åå ã¯è€æ°ãããŸããäžçªå€ãã®ã¯ããã©ã°ã€ã³ãæåã§ç¡å¹åãããšãïŒãããã¯ç¡å¹åã¹ã¯ãªãããèµ°ã£ããšãïŒã«ãã£ãã·ã¥ãã£ã¬ã¯ããªã ãéé¿ã»åé€ãããsettings.json äžã®ãã©ã°ã true ã®ãŸãŸæ®ãã±ãŒã¹ã§ããClaude Codeã®ãã©ã°ã€ã³ãã£ãã·ã¥ã¯ ~/.claude/plugins/cache/<marketplace>/<plugin-name>/ ãšãã2段ãã£ã¬ã¯ããªæ§é ãåã£ãŠããŸããããã®ãå®äœããšãèšå®ãã¡ã€ã«ã®ãšã³ããªãã¯ç¬ç«ããŠç®¡çãããŠããŸããèšå®ãšãã£ãã·ã¥ã®ã©ã¡ããã ãã倿Žããããšãäž¡è
ããºã¬ãŸãã
ããäžã€ã¯ãOSç§»è¡ãããã¯ã¢ããããã®åŸ©å
ã§ããèšå®ãã¡ã€ã«ã¯ .dotfiles ã§ç®¡çããŠããã®ã«ãã£ãã·ã¥ã¯å¯Ÿè±¡å€ããšããã±ãŒã¹ã§åæ§ã®ãºã¬ãèµ·ããŸããèªåã®ç°å¢ã§ããmacOSãç§»è¡ãããšãã«äžæ°ã«7ã8æ¬ã®å¹œéãšã³ããªãçãŸããŸããã
ãäœæ¥ãã§ã¯ãªããç°å¢ããçŽã
ãã®åé¡ãåä»ãªã®ã¯ãçºçãæ£çºçã§åçŸæ§ãäœãç¹ã§ããæ¯æ¥äœ¿ã£ãŠããŠãæ°ã¥ããªãæ¥ãããã°ããã©ã°ã€ã³ãå¿
èŠãªã¿ã¹ã¯ãå§ããç¬éã«ãšã©ãŒã§æ¢ãŸãæ¥ãããããããŠæåã§çŽããšãªãã°ãsettings.json ãéããŠã©ã®ããŒãåé¡ãªã®ããç®ã§ç¢ºèªãã察å¿ãããšã³ããªãæžãæããããã©ã°ã€ã³ã10æ¬ä»¥äžããã°äžã€äžã€ç¢ºèªããã ãã§æ°åæ¶ããŸãã
ããã§å€§äºãªã®ã¯ãããããäœæ¥ã®åé¡ãã§ã¯ãªããç°å¢ã®åé¡ãã ãšããããšã§ããClaude Codeãåºããšã©ãŒãæ¯åæã§çŽããŠãããã¡ã¯ãèªåãç°å¢ã®ç®¡çè ã§ã¯ãªãç°å¢ã®æ¶èåã«ãªã£ãŠããŸããèªååã§ä»çµã¿ãšããŠè§£æ±ºããããšã§ãåãåé¡ãäœååèµ·ããŠã察åŠã³ã¹ãããŒãã«ãªããŸãã
2段ãã©ãŒã«ããã¯ãšããèšèš
åçŽã«ã幜éãšã³ããªãèŠã€ããã false ã«åããã ãã§ã¯æ
å ±ã倱ãããŸãããã£ãã·ã¥ãæ¶ããŠããã ãã§ãå¥ã®å ŽæïŒ.disabled-cache/ïŒã«ã³ããŒãæ®ã£ãŠããã°åŸ©å
ã§ããå¯èœæ§ãããããã§ãã
plugin-cache-repair.sh ã¯ã埩å
ã§ãããã®ã¯åŸ©å
ãã埩å
ã§ããªããã®ã ãç¡å¹åããããšãã2段ãã©ãŒã«ããã¯ãåã£ãŠããŸãããã®åºå¥ãã修埩åŸã«ãã©ã°ã€ã³ããã䜿ããç¶æ
ã«æ»ãããã©ãããå·Šå³ããŸãã
ããã«ããããªãèšå®ãæžãæããã®ã§ã¯ãªããdryïŒç¢ºèªã®ã¿ïŒãšapplyïŒå®è¡ïŒã®2段éãåããããšã§ãå¯äœçšããŒãã«è¿ã¥ããŠããŸããèªååã¹ã¯ãªãããèªåã®ç¥ããªããšããã§äœãã倿ŽããŠããããšããç¶æ³ã¯çç£ç°å¢ã§ãå人ã®éçºç°å¢ã§ãåæ§ã«æããdryã©ã³ã§ãããããäœãããããã衚瀺ããã確èªããŠããapplyããèšèšã¯ãä¿¡é Œã§ããèªååã®åºæ¬ã§ãã
å šäœã®æµã
ã¹ã¯ãªããã®åŠçã¯4ãã§ãŒãºã«åãããŠããŸãã
settings.json
enabledPlugins: { "plugin-name@marketplace": true, ... }
â
âŒ
ããã§ãŒãº1: æ€åºã
Python ã§ enabledPlugins:true ã®ããŒãæœåº
â
âŒ
ããã§ãŒãº2: åé¡ã
åããŒã«ã€ã㊠cache/<marketplace>/<name>/ ã®ååšç¢ºèª
â
ââ ååšãã â OKïŒã¹ãããïŒ
ââ ååšããªã â MISSING
â
ââ .disabled-cache/<name>/ ãã â RESTOREåè£
ââ .disabled-cache/<name>/ ãªã â FLIPåè£
â
âŒ
ããã§ãŒãº3: dry衚瀺ã
OK/RESTORE/FLIP ã®ä»¶æ°ãšè©³çŽ°ãæšæºåºå
â
âŒïŒapplyã¢ãŒãã®ãšãïŒ
ããã§ãŒãº4: applyå®è¡ã
1) RESTORE: cp -R .disabled-cache/<name>/ â cache/<market>/<name>/
2) FLIP: python3 ã§ settings.json ã®è©²åœããŒã false ã«æžãæã
â
âŒ
verify: ã¹ã¯ãªããèªèº«ã dry ã¢ãŒãã§åå®è¡ïŒå
šä»¶OKãªã修埩å®äºïŒ
ãã§ãŒãº1ïŒPython ã«ãã JSON ããŒã¹
settings.json ã®èªã¿åãã« jq ã䜿ãã python3 ãéžãã§ããã®ã¯ãbash 3.2 äºæãä¿ã¡ãªããå€éšã³ãã³ãäŸåãæå°ã«ããããã§ããã³ã¡ã³ãã«ã bash 3.2 äºæïŒmapfile / 飿³é
åã䜿ããªãïŒ ãšæèšãããŠããŸãã
ENABLED_KEYS=$(python3 - "$SETTINGS" <<'PY'
import json, sys
with open(sys.argv[1]) as f:
s = json.load(f)
for k, v in (s.get('enabledPlugins') or {}).items():
if v is True and '@' in k:
print(k)
PY
)
enabledPlugins ããŒãååšããªãå Žåã or {} ã§å®å
šã«ç©ºdictã«èœã¡ãŸãã'@' in k ã®æ¡ä»¶ã¯ plugin-name@marketplace ãšãã圢åŒãåæã«ãäžæ£ãªãšã³ããªãæé»ã§ã¹ãããããã¬ãŒãã§ããçµæã¯æ¹è¡åºåãã®æååãšã㊠ENABLED_KEYS ã«å
¥ããŸãã
ãã§ãŒãº2ïŒåé¡ã«ãŒã
æœåºããããŒãäžæ¬ãã€åŠçããŠãRESTORE_LIST ãš FLIP_LIST ã®2æ¬ã®ãªã¹ãã«æ¯ãåããŸãã
while IFS= read -r KEY; do
[ -z "$KEY" ] && continue
NAME="${KEY%@*}"
MARKET="${KEY#*@}"
EXPECTED="$CACHE_DIR/$MARKET/$NAME"
if [ -d "$EXPECTED" ]; then
OK_COUNT=$((OK_COUNT + 1))
continue
fi
MISSING_COUNT=$((MISSING_COUNT + 1))
if [ -d "$DISABLED_DIR/$NAME" ]; then
RESTORE_LIST="${RESTORE_LIST}${KEY}|${NAME}|${MARKET}
"
else
FLIP_LIST="${FLIP_LIST}${KEY}
"
fi
done <<EOF
$ENABLED_KEYS
EOF
${KEY%@*} ã§ãã©ã°ã€ã³åã${KEY#*@} ã§ããŒã±ãããã¬ã€ã¹åãåå²ããã·ã§ã«å±éã¯ãbashçµã¿èŸŒã¿ã ãã§åãç¹ãéèŠã§ãããã£ãã·ã¥ã®æåŸ
ãã¹ã¯ $CACHE_DIR/$MARKET/$NAME ãšãªãã-d ã§ãã£ã¬ã¯ããªãšããŠååšãããã確èªããŸããååšããªãã£ãå Žåã.disabled-cache/$NAME ãæ¬¡ã«ç¢ºèªããŸããããŒã±ãããã¬ã€ã¹åã¯ããã§ã¯ãã§ãã¯ããªãââ.disabled-cache ã¯ããŒã±ãããã¬ã€ã¹ãåãããã©ã°ã€ã³åã ãã§æ ŒçŽãããèšèšã ããã§ãã
飿³é
åã䜿ãã RESTORE_LIST ããã€ãåºåãã®æ¹è¡æååãšããŠç©ã¿äžããŠããã®ããbash 3.2 å¶çŽãžã®å¯Ÿå¿ã§ãã
ãã§ãŒãº3ïŒdry 衚瀺
apply ãæž¡ããªãéãïŒãããã¯ããã©ã«ãã® dry ã§å®è¡ããå ŽåïŒãã¹ã¯ãªããã¯äœã倿Žããéèšçµæã ãã衚瀺ããŸãã
=== plugin-cache-repair (dry) ===
enabled(true) total : 14
cache present : 11
cache missing : 3
-> restorable : 2 (will cp from .disabled-cache)
-> flip to false : 1 (no copy available)
ãã®åºåã ãã§ã3æ¬ãºã¬ãŠããã»ãã¡2æ¬ã¯åŸ©å å¯èœã»1æ¬ã¯ç¡å¹åãããããªãããšããç¶æ³ãäžç®ã§åãããŸããå¯äœçšãŒãã§çŸç¶ææ¡ã§ããã®ãdryã¢ãŒãã®äŸ¡å€ã§ããapplyåã«ããªãããã®åºåã確èªããã®ãæ£ããäœ¿ãæ¹ã§ãã
ãã§ãŒãº4ïŒapply å®è¡
applyã¢ãŒãã§ã¯æåã« settings.json ã®ããã¯ã¢ãããåããŸãã
TS=$(date +%Y%m%d-%H%M%S)
BACKUP="$BACKUP_DIR/settings.json.before-plugin-cache-repair-$TS"
cp "$SETTINGS" "$BACKUP"
ã¿ã€ã ã¹ã¿ã³ããå«ãããã¯ã¢ããåã«ããããšã§ãè€æ°åå®è¡ããŠãäžæžããããŸããã~/.claude/backups/ ã«ç©ã¿äžãã£ãŠãããŸãã
埩å åŠçïŒRESTOREïŒ
SRC="$DISABLED_DIR/$N"
DST_PARENT="$CACHE_DIR/$M"
DST="$DST_PARENT/$N"
if [ "$SRC" = "$DST" ]; then
echo " SKIP (src==dst): $K"
continue
fi
if [ -e "$DST" ]; then
echo " SKIP (already exists): $DST"
continue
fi
mkdir -p "$DST_PARENT"
if cp -R "$SRC" "$DST" 2>/dev/null; then
echo " RESTORED: $K"
ã³ã¡ã³ãã« æ¢å cache ã¯çµ¶å¯Ÿã«äžæžãããªãïŒsrc/dst éè€ç¢ºèªïŒ ãšããéããsrc=dst ã®äžèŽãã§ãã¯ãš -e "$DST" ã®äºå確èªã§äºéã¬ãŒãããããŠããŸãããã£ãã·ã¥ãå£ããŠããŠç©ºãã£ã¬ã¯ããªã ãæ®ã£ãŠããã±ãŒã¹ã§äžæžããèµ·ããªãããã«ããããã§ãã
ç¡å¹ååŠçïŒFLIPïŒ
埩å
ã§ããªãã£ããšã³ããªã¯ Python ã§ settings.json ãæžãæããŸãã
echo "$FLIP_LIST" | python3 - "$SETTINGS" <<'PY'
import json, sys
settings_path = sys.argv[1]
flips = [line.strip() for line in sys.stdin if line.strip()]
with open(settings_path) as f:
s = json.load(f)
ep = s.setdefault('enabledPlugins', {})
flipped = 0
for k in flips:
if ep.get(k) is True:
ep[k] = False
flipped += 1
print(f" FLIPPED: {k}")
with open(settings_path, 'w') as f:
json.dump(s, f, indent=2, ensure_ascii=False)
f.write('\n')
print(f"flipped total: {flipped}")
PY
ep.get(k) is True ã® is True æ¯èŒã¯æå³çã§ããNone ãæååãæ··å
¥ããŠãããšãã«èª€ã£ãŠæžãæããªãããã®å³å¯ãã§ãã¯ã§ããæžãèŸŒã¿æã« indent=2 ãšæ«å°Ÿæ¹è¡ïŒf.write('\n')ïŒãä»ããããšã§ãæ¢åã® settings.json ã®ãã©ãŒãããã厩ããªãããã«ããŠããŸãã
修埩åŸã®æ€èšŒã³ãã³ã
applyãçµãããšãã¹ã¯ãªããã®æåŸã«ãã®äžè¡ãåºåãããŸãã
echo "verify with: $0 dry"
修埩çŽåŸã«èªåèªèº«ãdryã¢ãŒãã§åå®è¡ããããšãä¿ããŠããŸããcache missing: 0 ã衚瀺ãããã°ä¿®åŸ©å®äºãcache missing ããŸã æ®ã£ãŠããã°äœããã®ç°åžžããã£ãïŒcpæš©éãšã©ãŒã»ãã¹ã®äžäžèŽãªã©ïŒãšå€æã§ããŸãã修埩ã¹ã¯ãªããããæ€èšŒã³ãã³ããŸã§ã»ããã§æç€ºãããèšèšã«ãªã£ãŠããã®ã¯ããapplyåŸã«èªåã§ç¢ºèªããæé ã人éãå¿ããããšããå®éçšã®çµéšããããŠããŸãã
å®è£ ã®è©³çް
plugin-disable.sh ãæã€3å±€ã®é²åŸ¡
plugin-cache-repair.sh ãããã£ãã·ã¥ãšèšå®ã®ãºã¬ãçŽããã¹ã¯ãªãããªããplugin-disable.sh ã¯ãæå³ããŠãã©ã°ã€ã³ãç¡å¹åãããã¹ã¯ãªããã§ãããã®2æ¬ãã»ããã«ãªã£ãŠããŸããrepairãpassiveãªä¿®åŸ©ããŒã«ãªã®ã«å¯Ÿããdisableã¯activeã«èšå®ãæžãæããããã誀çæã®åœ±é¿ãçŽæ¥çã§ããããã§disableã®ã»ãã«ã¯æç€ºçãªé²åŸ¡ã¬ã€ã€ãŒã3æéãã§å
¥ã£ãŠããŸãã
第1å±€ïŒç©ºæåã»çãããåŒæ°ã匟ã
# DEFENSE: skip empty plugin names (otherwise startswith("") matches ALL)
[ -z "$p" ] && { echo " (skipped empty arg)"; continue; }
# DEFENSE: require at least 3 chars to avoid accidental wildcard
[ ${#p} -lt 3 ] && { echo " (skipped too-short: '$p')"; continue; }
ã³ã¡ã³ããå
šãŠãç©èªã£ãŠããŸããstartswith("") ã¯jqã®ä»æ§äžãå
šãŠã®ããŒã«ãããããŸãã空æåãæž¡ãã ãã§ enabledPlugins ã®å
šãšã³ããªãç¡å¹åãããŸããããã空æåãã§ãã¯ãš3æåæäœã«ãŒã«ã§å¡ãã§ããŸããã3æåããšããæ°åã¯æ£æçã«èŠããŸãããèªåã®ç°å¢ã§æçã®ãã©ã°ã€ã³åã4æåã ã£ã宿ž¬å€ããæ±ºããŠããŸãã
第2å±€ïŒå®å šäžèŽãåªå ããåæ¹äžèŽã¯åäžãããæã®ã¿èš±å¯
EXACT=$(jq -r --arg p "$p" \
'.enabledPlugins // {} | keys[] | select(. | split("@")[0] == $p)' "$TMP")
if [ -n "$EXACT" ]; then
KEYS="$EXACT"
else
KEYS=$(jq -r --arg p "$p" \
'.enabledPlugins // {} | keys[] | select(startswith($p))' "$TMP")
HIT_COUNT=$(echo "$KEYS" | grep -c .)
if [ "$HIT_COUNT" -gt 1 ]; then
echo " â '$p' matches $HIT_COUNT entries via prefix (no exact match found):"
echo "$KEYS" | sed 's/^/ /'
echo " â use exact plugin name to be safe. SKIPPING."
continue
fi
fi
ããŒã®åœ¢åŒã¯ plugin-name@marketplace ãªã®ã§ãå®å
šäžèŽã¯ split("@")[0] == $p ã§ãã©ã°ã€ã³åéšåã ããæ¯èŒããŸããåæ¹äžèŽã¯ãã©ãŒã«ããã¯ãšããŠæ®ããŠããã®ã¯ãClaude Codeã®ããŒãžã§ã³ã«ãã£ãŠmarketplaceåãããŸã«å€ããã±ãŒã¹ãžã®å¯Ÿå¿ã§ãããã ãåæ¹äžèŽã2件以äžãããããå Žåã¯ãambiguousããšããŠå¿
ãSKIPãããŠãŒã¶ãŒã«æ£ç¢ºãªååã§ã®åå®è¡ãä¿ããŸããåæ¹äžèŽã§è€æ°ãäžæ°ã«ç¡å¹åããã®ã¯èšèšãšããŠèš±å¯ããªãããšãã倿ã§ãã
第3å±€ïŒ50%ã¬ãŒã
ORIG_COUNT=$(jq -r '.enabledPlugins // {} | length' "$SETTINGS")
NEW_COUNT=$(jq -r '.enabledPlugins // {} | length' "$TMP")
if [ "$NEW_COUNT" -lt $((ORIG_COUNT / 2)) ]; then
echo "REFUSED: would disable >50% of plugins ($ORIG_COUNT -> $NEW_COUNT). Aborting."
rm -f "$TMP"
exit 1
fi
åŠçåŸã®ãšã³ããªæ°ãå
ã®åæ°ãäžåã£ããæžã蟌ã¿ãæåŠããŸããåé€ã®åäœã¯jqã«ãã del(.enabledPlugins[$k]) ãªã®ã§ã誀ã£ãããŒãè€æ°ããããããšãã«äžæ°ã«æ¶ããå¯èœæ§ããããŸãããããæçµçã«ã忰以äžãæ¶ããã®ã¯ããããããšããéçãã§ãã¯ã§æãŸããŸãã
ããã¯ã¢ããäžä»£ç®¡ç
ls -1t "$BACKUP_DIR"/settings.json.before-plugin-disable-* 2>/dev/null \
| tail -n +6 | while IFS= read -r old; do rm -f "$old"; done
ls -1t ã§ã¿ã€ã ã¹ã¿ã³ãéé ã«äžŠã¹ã6çªç®ä»¥éãåé€ããããšã§çŽè¿5äžä»£ã ãä¿æããŸãã~/.claude/backups/ ã¯repairãšdisableã®äž¡æ¹ãããã¯ã¢ãããç©ããã£ã¬ã¯ããªãªã®ã§ãäžä»£å¶éãªãã§éçšãããšæ°é±éã§æ°ååã«èšãã¿ãŸãã5äžä»£ããã°1é±éåã®å€æŽã¯åŸ©å
ã§ããŸãã
from-auditã¢ãŒããšèªååãã€ãã©ã€ã³ãžã®æ¥ç¶
plugin-disable.sh ã«ã¯ from-audit ãšããã¢ãŒãããããŸãã
extract_dormant() {
awk '/^## Dormant/{flag=1; next} /^## /{flag=0} flag && /^[a-z]/' "$AUDIT" \
| sed 's/```//' | grep -v '^$' | head -100
}
~/.claude/scripts/plugin-audit-latest.md ãšããç£æ»ã¬ããŒãã® ## Dormant Plugins ã»ã¯ã·ã§ã³ã awk ã§ããŒã¹ããäŒç äžã®ãã©ã°ã€ã³åãæœåºããŸãã/^## Dormant/{flag=1} ã§ã»ã¯ã·ã§ã³éå§ãæ€ç¥ã/^## /{flag=0} ã§æ¬¡ã®ã»ã¯ã·ã§ã³éå§ãæ€ç¥ããŠãã©ã°ãèœãšããã·ã³ãã«ã§ããæ£ç¢ºã«åããŸãã
ããã« PROTECTED_FILE ã䜿ã£ãŠãäŒç ã«èŠãããæå³çã«åžžèšããŠãããã©ã°ã€ã³ããé€å€ããŸãã
PROTECTED_FILE="$HOME/.claude/scripts/lib/protected-plugins.txt"
if [ -f "$PROTECTED_FILE" ]; then
PLUGINS=$(extract_dormant | grep -vxF -f "$PROTECTED_FILE" || true)
fi
grep -vxF -f ã¯ããã¡ã€ã«ã«æžãããã¿ãŒã³ãšå®å
šäžèŽããè¡ãé€å€ããã圢åŒã§ããLSPç³»ãããã»ã¹ç®¡çç³»ã®ãã©ã°ã€ã³ã¯äœ¿çšé »åºŠãäœããŠãåžžã«æå¹ã«ããŠããå¿
èŠããããç£æ»ã¬ããŒãã§ã¯ãäŒç ããšå€å®ãããŠããŸããŸãããã®é€å€ãªã¹ããããããšã§ãfrom-auditã®äžæ¬ç¡å¹åãæå³ãããã®ã ãã«çµãããŸãã
launchdã§æ¯é±æ¥æ6:45ã«èªååãã
com.shun.plugin-auto-disable.plist ããã®èªååã®èµ·ç¹ã§ãã
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>6</integer>
<key>Minute</key>
<integer>45</integer>
<key>Weekday</key>
<integer>0</integer>
</dict>
macOSã®launchdã§ã¯ Weekday=0 ãæ¥ææ¥ã§ããæ¯é±æ¥æã®æ6æ45åãèµ·åºåã«èªåå®è¡ãããŸãã
<key>LowPriorityIO</key>
<true/>
<key>Nice</key>
<integer>10</integer>
<key>ProcessType</key>
<string>Background</string>
LowPriorityIO=true ãš Nice=10 ãš ProcessType=Background ã®3ã€ãæã£ãŠããŸãããã£ã¹ã¯IOã®åªå
床ãäžããCPUã¹ã±ãžã¥ãŒãªã³ã°ã®åªå
床ãäžããããã»ã¹çš®å¥ãããã¯ã°ã©ãŠã³ãã«ããããã®èšå®ã«ããŠãããšãä»®ã«æ6:45ã«èµ·ããŠMacãè§Šã£ãŠããŠãåŠçã«æ°ã¥ããªããããéãã«åããŸããèªååã¹ã¯ãªãããäœæ¥ã劚ããŠã¯ãããªãããšããèãæ¹ã§ãã
å®è¡å 容ã¯ã·ã³ãã«ã§ãã
<string>~/.claude/scripts/plugin-auto-disable.sh apply >>
~/.claude/logs/plugin-auto-disable.log 2>&1</string>
ãã°ã¯ ~/.claude/logs/plugin-auto-disable.log ã«è¿œèšãããŸãã鱿¬¡ã§å®è¡ãããããããã°ãè¥å€§åããªããã plugin-auto-disable.sh åŽã§ãã°ããŒããŒã·ã§ã³ãå¥éèšããŠããŸãã
ç§ãè©°ãŸã£ã話
ãã®1ïŒset -uo pipefail ãš grep -c . ã®æ»é
æåã«æžããããŒãžã§ã³ã®åé¡ã«ãŒãã¯ãRESTOREãšFLIPã®ã«ãŠã³ããããåã£ãŠããŸããã
RESTORE_COUNT=$(printf '%s' "$RESTORE_LIST" | grep -c .)
FLIP_COUNT=$(printf '%s' "$FLIP_LIST" | grep -c .)
ããŒã«ã«ã§ãã¹ãããŠããéã¯åé¡ãããŸããã§ãããå®éã«å šãã©ã°ã€ã³ãæ£åžžãªïŒMISSINGããŒãã®ïŒç°å¢ã§èµ°ãããç¬éãã¹ã¯ãªãããéäžã§æ¢ãŸããŸããã
çç¶ïŒRESTORE_LIST ã空æåã®ãšããprintf '%s' "" | grep -c . ã¯ãããããŒããªã®ã§çµäºã³ãŒã1ãè¿ããŸããset -uo pipefail ç°å¢ã§ã¯ããã€ãã©ã€ã³ã®æåŸã®ã³ãã³ãã®çµäºã³ãŒãã1ã ãšã¹ã¯ãªããå
šäœãããã§æ¢ãŸããŸããå
šä»¶OKã®ã¯ãããexit code 1ã§ç°åžžçµäºããŠããããã§ãã
åå ã«æ°ã¥ããŸã§30åããããŸããããªããªãæå ã§ãã¹ããããšãã¯å¿ ãMISSINGã1件以äžãã£ãããã§ããå®å šã«ã¯ãªãŒã³ãªç¶æ ãããããäœããªããšãã®ãã¹ã¯éããªãã
ä¿®æ£ã¯ã·ã³ãã«ã§ã|| true ãæ«å°Ÿã«è¶³ãã ãã§ãã
RESTORE_COUNT=$(printf '%s' "$RESTORE_LIST" | grep -c . || true)
FLIP_COUNT=$(printf '%s' "$FLIP_LIST" | grep -c . || true)
|| true ãä»ããããšã§grepçµäºã³ãŒã1ãã·ã§ã«ãç¡èŠããã¹ã¯ãªããã¯ç¶ç¶ããŸããããããã±ãŒã¹ãèžãã åŸãããã空å
¥åã®grep -cãã䜿ããšãã¯å¿
ãã»ããã§æžãããã«ããŠããŸãã
ãã®2ïŒmacOSããã©ã«ãbashã§é£æ³é åã䜿ããªã
åçš¿ã§ã¯ RESTORE_MAP ã飿³é
åã§å®è£
ããŠããŸããã
declare -A RESTORE_MAP
RESTORE_MAP["$NAME"]="$MARKET"
æå
ã§ã¯åé¡ãªãåããŠããŸãããããããã¹ã¯ãªããã /bin/bash ã§æç€ºå®è¡ãããåããªãããšãããã¿ãŒã³ã«åŸã§æ°ã¥ããŸãããmacOSã«å
¥ã£ãŠããããã©ã«ãã® /bin/bash ã¯ããŒãžã§ã³3.2ã§ãã飿³é
åïŒdeclare -AïŒã¯ bash 4.0 以éã®æ©èœãªã®ã§ãshebangã #!/usr/bin/env bash ã«ããŠããŠããç°å¢ã«ãã£ãŠã¯ 3.2 ãæŸãããŸãã
homebrew ã§å
¥ãã bash 5.x ã PATH ã®åã«æ¥ãŠããç°å¢ã§ã¯åããŸãããããã§ãªãç°å¢ã§ã¯ declare: -A: invalid option ã§å³æ»ããŸãã
ãããèžãã§ããã³ã¡ã³ãã«æèšããŸããã
# bash 3.2 äºæïŒmapfile / 飿³é
åã䜿ããªãïŒ
代æ¿å®è£ ãšããŠæ¡çšããã®ããã€ãåºåãã®æ¹è¡æååã§ãã
RESTORE_LIST="${RESTORE_LIST}${KEY}|${NAME}|${MARKET}
"
èªã¿åºããšã㯠IFS='|' read -r K N M ã§åå²ããŸãã飿³é
åããäžèŠããªãããŒã§ãããbash 3.2ã§ãåãããå€éšã³ãã³ããå¢ãããªããšããç¹ã§ã·ã§ã«ã¹ã¯ãªããã®çæ³ã«è¿ãã§ãããã®å¶çŽãèªåã«èª²ããããšã§ãã¹ã¯ãªããã®åäœç°å¢ãäžã€åºãããŸããã
ãã®3ïŒsettings.json ãgitã§å·šå€§ãªå·®åã«ãªã
applyã¢ãŒãã§ settings.json ãæžãæãããšããæå㯠json.dump ããªãã·ã§ã³ãªãã§åŒãã§ããŸããã
with open(settings_path, 'w') as f:
json.dump(s, f)
json.dump ã®ããã©ã«ãåºåã¯1è¡ã«å
šãŠè©°ã蟌ãã ãããã¡ã€åœ¢åŒã§ããå
ã
ã® settings.json ãã€ã³ãã³ã2ã®ãã©ãŒãããã§æžãããŠããå Žåã1ãšã³ããªã false ã«å€ããã ãã§ git diff ãæ°çŸè¡ã«èšãã¿ãŸããClaude Codeèªèº«ãsettings.jsonãèªã¿æžãããã®ã§ã次åClaude Codeãä¿åããæç¹ã§ãŸããã©ãŒããããå€ãããå·®åãæå³ãæããªããªããŸãã
ããã«ãæ«å°Ÿæ¹è¡ããªããšäžéšã®ãšãã£ã¿ãgitããŒã«ãããã¡ã€ã«ã®æ«å°Ÿã«æ¹è¡ããªããèŠåãåºãç¶ããŸãã
ä¿®æ£ã¯2ç¹ã§ãã
json.dump(s, f, indent=2, ensure_ascii=False)
f.write('\n')
indent=2 ã§å
ã®ãã©ãŒãããã«åãããensure_ascii=False ã§æ¥æ¬èªãã©ã°ã€ã³åãUnicodeãšã¹ã±ãŒãã«åããªãããã«ããŸããf.write('\n') ã§æ«å°Ÿæ¹è¡ãä¿èšŒããŸãããã®3è¡ãæããŠåããŠã1ãšã³ããªå€ãããš1è¡ã ãå·®åãåºãããšããç¶æ
ã«ãªããŸãã
ãã®4ïŒ50%ã¬ãŒããæ£åœãªãããæäœãæ¢ãã
from-audit apply ãåããŠæ¬çªç°å¢ã§èµ°ããããšãããããªã¡ãã»ãŒãžãåºãŠã¹ã¯ãªãããæ¢ãŸããŸããã
REFUSED: would disable >50% of plugins (22 -> 8). Aborting.
22æ¬ã®ãã¡14æ¬ãäŒç å€å®ãããŠããŸããã確ãã«åæ°ä»¥äžã§ããã§ã宿 ãšããŠ14æ¬ãäžæ°ã«ç¡å¹åãããã£ãã®ã«ãã¬ãŒããæ£åœãªæäœãæ¢ããŠããŸããŸããã
åå 㯠protected-plugins.txt ã®æŽæ°æŒãã§ããç£æ»ã¬ããŒããåºãåŸãæ°ããLSPç³»ãã©ã°ã€ã³2æ¬ãå°å
¥ããŠããã®ã«ä¿è·ãªã¹ãã«è¿œèšãå¿ããŠããŸããããã®2æ¬ããäŒç ïŒå®éã¯æå³çåžžèšïŒããšããŠç¡å¹å察象ã«å«ãŸããåèš14æ¬ã«ãªã£ãŠããã
察åŠã¯2段éã§ããããŸã protected-plugins.txt ã«2æ¬ã远èšããŠãã from-audit dry ã§ä»¶æ°ã確èªã9æ¬ã«æžã£ãããšã確èªããŠãã from-audit apply ãåå®è¡ãä»åºŠã¯REFUSEDãåºãã«éããŸããã
ãã®çµéšãããç£æ»ãèµ°ãããåã«ä¿è·ãªã¹ããææ°åããããšããã«ãŒãã£ã³ã launchd ã®å段ã«çœ®ãããã«ããŠããŸããã©ã®ãã©ã°ã€ã³ãä¿è·å¯Ÿè±¡ã«ãããã¯æ°é±éã«äžåºŠã¬ãã¥ãŒãããã®ãªã®ã§ãèªååã®äžã«äººéã®ã¬ãã¥ãŒãã€ã³ããæãã§ããèšèšãæ£è§£ã§ããã
ãã®5ïŒä¿®åŸ©åŸdryã©ã³ãå¿ããŠãšã©ãŒãæ®ãç¶ãã
apply ãèµ°ãããŠãã Claude Code ãåèµ·åãããšãããŸã åããšã©ãŒãåºãããšããããŸããã
Plugin directory does not exist: ~/.claude/plugins/cache/marketplace/plugin-name
dryã©ã³ã§ç¢ºèªããªãã£ãã®ãåå ã§ãããcp -R ãæš©éãšã©ãŒã§éãã«å€±æããŠããïŒ2>/dev/null ã§é ããŠããïŒã®ã«ããã°ãèŠãŠããªãã£ãããæ°ã¥ããªãã£ãã®ã§ãã
ã¹ã¯ãªãããæåŸã«åºåããäžè¡ã®éããæ¹ããŠå®æããŸããã
echo "verify with: $0 dry"
applyããçµäºãããããšãšãæå³ããéãã«å®äºãããããšã¯å¥ã§ãã修埩åŸã«dryãèµ°ãã㊠cache missing: 0 ã確èªããããšããå®äºã®å®çŸ©ã«ãªããŸãããã®æ€èšŒã³ãã³ããã¹ã¯ãªããèªèº«ãæç€ºããã®ã¯ããverify ã人éãå¿ããããšããçµéšããæ¥ãŠããŸããèªååãä¿¡é Œããããã確èªã³ãã³ããŸã§äžåŒãšããŠæäŸããããšããèªåŸç°å¢ãå¥å
šã«ä¿ã€ããã®çŸå®çãªèšèšã§ãã
ã€ãŸãããã€ã³ã
åæ®µã§æžãã5ã€ã®è©°ãŸããšã¯å¥ã«ããã®ã¹ã¯ãªãã矀ãå®éã«æå ã§åããããšãããšãã«è¿œå ã§ããã£ãç®æããŸãšããŸãããã³ãŒãã¯èªãã ãåããããæ»ãã ããšãããã¿ãŒã³ã®ã»ãŒå šãŠãããã«éçŽãããŠããŸãã
-
launchdãnvmãç¥ããªãåé¡ã
.plistã®EnvironmentVariablesã«PATHãæç€ºããªããšãlaunchdãèµ·åããã·ã§ã«ã¯/usr/binãš/binããèŠãŸãããnvm管çäžã® node ã homebrew çµç±ã® bash ã¯å šæ» ã§ããå®éã® plist ã«ã¯.nvm/versions/node/v24.13.0/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbinãšããå®å šPATHãçŽæžããããŠããŸããããããçç¥ãããšcommand not foundã~/.claude/logs/com.shun.plugin-auto-disable.logã«ç©ãŸãç¶ããŸãããã°ã確èªããç¿æ £ããªããã°ãæ¯é±èªåã§åããŠããã¯ãããšæããªããäœã¶æãäœãããŠããªãç¶æ ãç¶ããŸãã -
.disabled-cacheã«ããŒã±ãããã¬ã€ã¹åããªãèšèšã®ç²ç¹ã repairã¹ã¯ãªããã¯.disabled-cache/$NAMEã§æ¢ããŸãããcacheåŽã¯$CACHE_DIR/$MARKET/$NAMEãšãã2段æ§é ã§ããããååã®ãã©ã°ã€ã³ãç°ãªãããŒã±ãããã¬ã€ã¹ã«ååšããå Žåã.disabled-cacheã«ã¯æåŸã«éé¿ããããã®ã ããæ®ããå¥ããŒã±ããã®ååãšã³ããªã«èª€ã£ãŠåŸ©å ãããŸããçŸå®çã«ã¯ã»ãŒèµ·ããŸããããããŒã±ãããã¬ã€ã¹ããŸããã§å®éšçãªãã©ã°ã€ã³ã詊ããŠããç°å¢ã§ã¯æèããŠããå¿ èŠããããŸãã -
cp -Rã®2>/dev/nullã倱æãé ããã¬ãŒããªãã ã³ãŒãã«ã¯if cp -R "$SRC" "$DST" 2>/dev/null; then echo " RESTORED: $K"; else echo " FAIL: $K (cp failed)"; fiãšãããŸããFAILã®ã¡ãã»ãŒãžã¯æšæºåºåã«åºãŸããããªã倱æãããã®è©³çŽ°ïŒæš©éãšã©ãŒãªã®ããã¹ã®åé¡ãªã®ãïŒã¯2>/dev/nullã§æšãŠãŠããŸãããããã°äžã¯äžæçã«2>/dev/nullãå€ããŠå®è¡ãããšåå ãå³åº§ã«åãããŸããæ¬çªéçšã§ã¯éãã«å€±æããã»ããåŸç¶åŠçãæ¢ããªãã®ã§æ£è§£ã§ãããä¿®åŸ©åŸ dry ã©ã³ã§FAILãèŠãããšãã®èª¿æ»æé ãšããŠèŠããŠããå¿ èŠããããŸãã -
repair åŽã®ããã¯ã¢ããã«äžä»£ç®¡çããªãã
plugin-disable.shã¯ls -1t | tail -n +6ã§çŽè¿5äžä»£ã ãä¿æããŸãããplugin-cache-repair.shåŽã®ããã¯ã¢ããåé€ããžãã¯ã¯ã³ãŒãã«ååšããŸãããapplyãèµ°ããããã³ã«settings.json.before-plugin-cache-repair-YYYYMMDD-HHMMSSã~/.claude/backups/ã«ç©ã¿äžãããŸãã鱿¬¡ã§èªååããŠãããªã幎é52åãè€æ°ç°å¢ã§äœ¿ã£ãŠãããšæ°çŸåã«ãªããŸãã宿çã«æåã§æé€ããããls -1t "$BACKUP_DIR"/settings.json.before-plugin-cache-repair-* | tail -n +6 | xargs rm -fã repair åŽã«ãè¶³ããŠããã®ãçŸå®çãªéçšã§ãã -
Python3 ã®ãã¢ããã¥ã¡ã³ãæ§æã zsh çŽæ¥å®è¡ã§æ»ã¬ã
plugin-cache-repair.shã¯shebangã«#!/usr/bin/env bashã䜿ããpython3 - "$SETTINGS" <<'PY'ãšãã bash ã®ãã¢ããã¥ã¡ã³ã圢åŒã§ Python ãåŒã³åºããŠããŸããbash çµç±ã§ã¯åé¡ãããŸããããã¹ã¯ãªããã®äžèº«ãåãåºã㊠zsh ã®ããã³ããã«çŽæ¥è²Œãä»ãããšæ§æãšã©ãŒã«ãªããŸãããããã°æã¯ã¹ã¯ãªããå šäœãbash script.sh dryã§åŒã¶ãããã㯠Python éšåã ããå¥ãã¡ã€ã«ã«åãåºããŠåŒã¶ã®ãå®å šã§ãã -
Claude Code èµ·åäžã« apply ãèµ°ããããšç«¶åããã
settings.jsonã¯Claude Codeæ¬äœãèµ·åæã»èšå®å€æŽæã«èªã¿æžãããŸããapply ã¢ãŒãã§ã¹ã¯ãªãããjson.dumpã§æžã蟌ãã§ããæäžã« Claude Code ãåããã¡ã€ã«ãæžãæãããšãåŸåã¡ã§äžæ¹ã®å€æŽãæ¶ããŸããã¹ã¯ãªããå ã«ããã¯æ©æ§ã¯ãããŸãããrepair ã disable ã® apply 㯠Claude Code ãçµäºããç¶æ ã§èµ°ãããã®ãååã§ããlaunchd ã®é±æ¬¡èªåå®è¡ãæ¥æ 6:45 ã«ããŠããã®ã¯ãClaude Codeã䜿ã£ãŠããªãæé垯ããšããæå³ãå«ãŸããŠããŸãã -
from-auditã® awk ãã¿ãŒã³ãå°æåå§ãŸãã«ãã察å¿ããªããextract_dormant颿°ã®æçµãã¿ãŒã³ã¯/^[a-z]/ã§ãã## Dormantã»ã¯ã·ã§ã³å ã§ãã©ã°ã€ã³åã倧æåã§å§ãŸãå ŽåïŒäŸïŒLSP-serverïŒã¯ãããããŸãããä»ã®ç°å¢ã§ã¯å šãã©ã°ã€ã³åãå°æåå§ãŸããªã®ã§å®å®³ã¯ãããŸããããããŒã±ãããã¬ã€ã¹ã«ãã£ãŠã¯å€§æåãã©ã°ã€ã³ãæ··åšããŸããèªåã®ç°å¢ã«å€§æåå§ãŸãã®ãã©ã°ã€ã³ããããªã/^[a-zA-Z]/ã«å€æŽããå¿ èŠããããŸãã -
launchctl loadãå¿ããã.plistã~/Library/LaunchAgents/ã«çœ®ããã ãã§ã¯åããŸãããlaunchctl load ~/Library/LaunchAgents/com.shun.plugin-auto-disable.plistãå¿ èŠã§ãã眮ããçŽåŸãããæ¯é±åããŠããã¯ãããšä¿¡ããŠæ°ã¶æåŸã«ãã°ãèŠããäžåºŠãèµ°ã£ãŠããªãã£ãããšããçµéšãäžåºŠãããŸããé 眮åŸã¯launchctl list | grep plugin-auto-disableã§ PID æ¬ã確èªããã®ãæåã®æ€èšŒæé ã§ãã -
set -uãšshift || trueã®çµã¿åãããplugin-disable.shã®åé ã«MODE="${1:-}"; shift || trueãšããè¡ããããŸããset -uo pipefailç°å¢ã§shiftãåŒæ°ãªãã§åŒã¶ãšçµäºã³ãŒã1ã«ãªããã|| trueãå¿ èŠã§ãããããç¥ããã«ã¹ã¯ãªãããã³ããŒããŠæ¹å€ããshift || trueãshiftã«å€ãããšåŒæ°ãªãå®è¡ã§å³æ»ããŸããset -uãšset -eïŒpipefailãå«ãïŒã䜿ã£ãŠããã¹ã¯ãªããã§ã¯ãçµäºã³ãŒã1ãè¿ãããå šãŠã®çµã¿èŸŒã¿ã³ãã³ãã«ãã®èãæ¹ãå¿ èŠã§ãã -
protected-plugins.txtãšç£æ»ã¬ããŒãã®ã¿ã€ãã³ã°ãããfrom-audit applyã¯ç£æ»ã¬ããŒããšä¿è·ãªã¹ãã®ãäž¡æ¹ãææ°ãã§ããããšãåæã«ããŸããç£æ»ãèµ°ãããåŸã«æ°ãããã©ã°ã€ã³ãå°å ¥ããä¿è·ãªã¹ãã«è¿œå ããã®ãå¿ãããšã次ã®from-auditã§æå³ããªãç¡å¹åãèµ·ããŸãã50%ã¬ãŒããããã®ã§å£æ» ã¯ããŸããããæåã§ãªã¹ãã¢ããäœæ¥ãçºçããŸããç£æ»âä¿è·ãªã¹ã確èªâfrom-audit dryã§ä»¶æ°ãã§ãã¯âfrom-audit applyãšããé åºã厩ããªãããšãéçšäžã®éåã§ãã
ãã¹ããã©ã¯ãã£ã¹
ãã®ä»çµã¿ãå幎以äžéçšããŠãããããæåããç¥ã£ãŠããã°è©°ãŸããªãã£ãããšæãããšãæŽçããŸããã
1. dry ãããã©ã«ãã«ããapply ã¯æç€ºåŒæ°ã§ããåããªãããã«ããã
MODE="${1:-dry}" ãšããããã©ã«ãèšå®ãrepairã¹ã¯ãªããã«ãããŸããåŒæ°ãæž¡ãå¿ããå®è¡ãå¯äœçšãåºããªãããšããä¿¡é Œã§ããèªååã¹ã¯ãªããã®æäœæ¡ä»¶ã§ããapply ãã©ã°ãåŒæ°ã§æç€ºãããèšèšã¯å
šãŠã®èªååã¹ã¯ãªããã«é©çšããŠãã ããã
2. ããã¯ã¢ããã¯ã¿ã€ã ã¹ã¿ã³ãä»ãããã¡ã€ã«åã«äœãããããå«ããã
settings.json.before-plugin-cache-repair-20260120-064523 ãšããåœåèŠåã«ã¯ãæ¥æããšãäœã®æäœã®åããã®äž¡æ¹ãå
¥ã£ãŠããŸããããã«ãã ls -lt ã§æç³»åã«äžŠã¹ããšãã«ãã©ã®æäœã§äœãå€ãã£ããããäžç®ã§åãããŸããbackup.json ã®ãããªæ±çšåã¯è€æ°æäœãæ··åšãããšãã«åºå¥ã§ããªããªããŸãã
3. bash 3.2 äºæãåºæºã«æžããšç°å¢äŸåãäžã€åããã
declare -AïŒé£æ³é
åïŒãmapfileã<<<ïŒãã¢ã¹ããªã³ã°ïŒ 㯠bash 4.0 以éã®æ©èœã§ããmacOS ã®ããã©ã«ã /bin/bash 㯠3.2 ã§ãããhomebrew ã§ bash 5.x ãå
¥ããŠããŠã shebang ã PATH ã®é åºã«ãã£ãŠã¯ 3.2 ãæŸãããŸããæåãã 3.2 ã®å¶çŽã§æžããŠãããšãç¹å®ã®ç°å¢ã§ã ãåããªãããšããé¡ã®ãã°ãçºçããŸããã
4. å€éšã³ãã³ãäŸåãã python3 ã®ã»ããå®å®ããã
jq ã¯å€ãã®ç°å¢ã«ãããŸãããã€ã³ã¹ããŒã«ãå¿
èŠãªå€éšããŒã«ã§ããpython3 㯠macOS 11 以éãªãããªã€ã³ã¹ããŒã«ãããŠããŸããrepairã¹ã¯ãªããã jq ã§ã¯ãªã python3 ã§ JSON ãæäœããŠããã®ã¯ãã®å€æããã§ããimport json, sys ã®2è¡ã ãã§å€éšäŸåããŒãã«ãªããŸãããã ã disable ã¹ã¯ãªãã㯠jq ã® .enabledPlugins[$k] ã«ããéšååé€ã䜿ã£ãŠãããã jq äŸåãæ®ã£ãŠããŸããçšéã«ãã£ãŠäœ¿ãåããã®ãçŸå®çã§ãã
5. set -uo pipefail ã䜿ããªã grep -c ã«ã¯å¿
ã || true ãæ·»ããã
空æååãå
¥åãã grep -c . ã¯çµäºã³ãŒã1ãè¿ããŸããset -eïŒpipefailå«ãïŒç°å¢ã§ãããèµ·ãããšã¹ã¯ãªããå
šäœãããã§æ¢ãŸããŸããããŒãä»¶ããšããæ£åžžç¶æ
ãããšã©ãŒããšèª€èªãããªãèšèšãšã㊠RESTORE_COUNT=$(printf '%s' "$RESTORE_LIST" | grep -c . || true) ã®ãã¿ãŒã³ã培åºããŠãã ããã
6. JSON ã®æžãæ»ã㯠indent=2, ensure_ascii=False ãã©ã¹æ«å°Ÿæ¹è¡ãå¿
ãã»ããã«ããã
json.dump(s, f, indent=2, ensure_ascii=False) ãš f.write('\n') ã®3ç¹ã»ãããçããšã次㮠git diff ãæ°çŸè¡ã«ãªããŸããindent=2 ã¯å
ã®ãã©ãŒãããã«åããããããensure_ascii=False ã¯æ¥æ¬èªãèšå·ã \u ãšã¹ã±ãŒãã«åããªããããæ«å°Ÿæ¹è¡ã¯ãšãã£ã¿ãšgitããŒã«ã®èŠåæå¶ã®ããã§ããPython ã§èšå®ãã¡ã€ã«ãæžãæããå
šãŠã®ã¹ã¯ãªããã«ãããå
¥ããŠãã ããã
7. is True ã§å³å¯æ¯èŒããNone ãæååã誀ã£ãŠæžãæããªãã
if ep.get(k) is True: ã® is True ã¯æå³çãªå³å¯æ¯èŒã§ãã== True ã§ã¯ 1 ã空ã§ãªãæååããããããŸããèšå®ãã¡ã€ã«ã®ãšã³ããªã«ã¯äºæããªãåãæ··å
¥ããããšããããããã誀ã£ãŠ false ã«åããŠããŸãã®ãé²ãããã®äžè¡ã§ããis True / is False ãç¿æ
£ã«ããã ãã§ãã®çš®ã®ãã°ãæ ¹çµ¶ã§ããŸãã
8. 50%ã¬ãŒãã¯ãäœããããããããšããéçã·ã°ãã«ãšããŠæ©èœããã
NEW_COUNT < ORIG_COUNT / 2 ãšããå€å®ã¯ãåæ°ä»¥äžæ¶ããã®ã¯ããããããšããçŽæçãªéŸå€ã§ããå®å
šãªæ£ãããããæãããªç°åžžãæ¢ãããããšãåªå
ããèšèšã§ãããã®æ°åã¯ç°å¢ã«åãããŠèª¿æŽããŠãã ããããã©ã°ã€ã³ã5æ¬ãããªãç°å¢ã§ã¯50%ã¬ãŒããå¹ããããããšããããŸãã30æ¬ä»¥äžããã°50%ã¯å®çšçãªéŸå€ã§ãã
9. launchd ã®èªåå®è¡ã¿ã¹ã¯ã«ã¯ LowPriorityIO + Nice + ProcessType=Background ãå¿
ãä»ããã
com.shun.plugin-auto-disable.plist ã«ã¯ LowPriorityIO=trueãNice=10ãProcessType=Background ã®3ã€ãæã£ãŠããŸãããããçããšã6:45ã«èµ·ããŠMacã䜿ã£ãŠãããšããèªåã¿ã¹ã¯ã®ãã£ã¹ã¯IOãCPUãåé¢ã®äœæ¥ã劚ããŸããã³ã¹ãçã«ã¯ plist ã«3è¡è¶³ãã ãã§ã广ã¯ãèªååãäœæ¥ãéªéããªãããšããä¿¡é Œæã§ãã
10. æ€èšŒã³ãã³ãã修埩ã¹ã¯ãªããèªèº«ã«åºåãããã
echo "verify with: $0 dry" ãšããã¹ã¯ãªããæ«å°Ÿã®äžè¡ã¯ãapplyå®äºåŸã«äººéãäœããã¹ãããæç€ºããŸãããapplyãçµäºããããšãæå³éãã«å®äºãããã¯å¥ã®ããšã§ãã修埩ã¹ã¯ãªãããèªåèªèº«ã®dryã³ãã³ããæç€ºããããšã§ã人éããäœã確èªãããããèããªããŠæžã¿ãŸãã確èªã®ååšãç¥ã£ãŠããããããæ¬¡ã®ã³ãã³ããç»é¢ã«è¡šç€ºãããŠããã»ããå®éã«ç¢ºèªãã確çãäžãããŸãã
11. protected-plugins.txt ã¯èªååãã€ãã©ã€ã³ã®å¯äžã®ã人éã®ä»å
¥ç¹ããšããŠæ©èœãããã
å
šèªååã®äžã«ã人éãã¬ãã¥ãŒãããã¡ã€ã«ããäžã€çœ®ãããšã§ãæå³ããªãå
šæ¶ããé²ãç·©è¡æã«ãªããŸããgrep -vxF -f "$PROTECTED_FILE" ã«ããé€å€ã¯ãç£æ»ã®èªåå€å®ãèŠãæåŸã®ç Šã§ãããã®ãã¡ã€ã«ããæŽæ°ãé¢åãªäœèšãªãã®ãã§ã¯ãªããèªååãžã®ä¿¡é Œã®æ ¹æ ããšããŠæ±ãããšããfrom-auditãã€ãã©ã€ã³ãå®å
šã«éçšããåææ¡ä»¶ã§ãã
12. launchdé
眮åŸã¯ launchctl list ã§ PID ãå³ç¢ºèªããã
ãã¡ã€ã«ã眮ããã ãã§ã¯äœãèµ·ããŸãããlaunchctl load ~/Library/LaunchAgents/com.shun.plugin-auto-disable.plist ã®åŸãlaunchctl list | grep plugin-auto-disable ã§ãšã³ããªãåºãããšã確èªããŠãã ãããPIDã - ãªããç»é²æžã¿ã»æªå®è¡ããæ°åãªããçŸåšå®è¡äžãã§ãããšã³ããªèªäœããªããã° load ã倱æããŠããŸãã/var/log/system.log ã log stream --predicate 'subsystem == "com.apple.launchd"' ã§ãšã©ãŒãæŸããŸãã
ãŸãšã
plugin-cache-repair.sh ã®æ žå¿ã¯ãèšå®ãã¡ã€ã«ãšãã£ãã·ã¥ã®ãºã¬ããæ
å ±ãæšãŠãã«çŽãããšããæ¹éã§ããåçŽã« false ã«åãã ããªã5è¡ã§æžããŸãããã ããã ãšã埩å
ã§ããã¯ãã®ãã©ã°ã€ã³ãŸã§äžåŸã«ç¡å¹åããŠããŸãã.disabled-cache ãçµç±ãã2段ãã©ãŒã«ããã¯ã«ãã£ãŠãã埩å
ã§ãããã®ã¯åŸ©å
ããæ¬åœã«åŸ©å
ã§ããªããã®ã ãç¡å¹åããããšããåºå¥ãçãŸããŸãã
dry ãš apply ã®åé¢ã¯ããã®ä»çµã¿ãžã®ä¿¡é Œãããäžæ®µé«ããŸããããã®ã¹ã¯ãªãã㯠apply ãæž¡ããªãéãäœãããªãããšããä¿èšŒããããããæ¯æã®ç¢ºèªã«ãŒãã£ã³ã« plugin-cache-repair.sh dry ãå·®ã蟌ããŸããå¯äœçšãŒãã§çŸç¶ææ¡ããå¿
èŠãªãšãã ã apply ãããèªååã¹ã¯ãªããããæããã®ãã§ã¯ãªãããã€ã§ãåŒã¹ããã®ãã«ããã®ã¯ãã®èšèšå€æããããŠããŸãã
plugin-disable.sh ã®3å±€é²åŸ¡ãšäžä»£ç®¡çä»ãããã¯ã¢ããã¯ããæå³ããªãäžæ¬ç¡å¹åãã倿®µã§é²ãããã®ãã®ã§ãã空æåãã§ãã¯ãåæ¹äžèŽã®ææ§ãããçŠæ¢ã50%ã¬ãŒãââãããããç¬ç«ãããã§ã€ã«ã»ãŒããšããŠæ©èœããã®ã§ãäžã€ãæœãæããŠã次ãæãŸããŸãã
launchd ã«ããæ¯é±æ¥æ 6:45 ã®èªåå®è¡ã¯ããã®ä»çµã¿ãã¡ã³ããã³ã¹ããªãŒã«ããŸããLowPriorityIO + Nice + Background ã®3ç¹ã»ããã§äœæ¥ã劚ããããã°ã¯ ~/.claude/logs/com.shun.plugin-auto-disable.log ã«ç©ãŸãç¶ããŸããå幎åŸã«ãããããã°ãã®ã¹ã¯ãªãããã¡ãããšåããŠããããšæã£ããšãã«ãã°ãéãã°é±æ¬¡ã§å®è¡ããã蚌跡ã䞊ãã§ããââãããèªåŸç°å¢ã®æè§Šã§ãã
æå120äžãæ¯ããŠããã®ã¯äžã€ã®å·šå€§ãªã·ã¹ãã ã§ã¯ãªãããã®ã¹ã¯ãªããã®ãããªå°ããªä»çµã¿ã100æ¬ä»¥äžç©ã¿éãªã£ãŠåããŠæç«ããŠããŸããClaude Code ã®èµ·åãšã©ãŒãæ¯åæã§çŽããŠããæéã¯ãå®è³ªçã«ã¿ã¹ã¯ã®åŠçé床ã«çŽçµããŸããç°å¢ã®ç®¡çã³ã¹ãããŒãã«è¿ã¥ããããšã§ãçç£ã§ããéãå€ãããŸãã
ä»çµã¿ã®å šäœåã»æ120äžã®å èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã
ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
- AIå°å ¥ã»èªååã®çžè«ãšå®è£ ãã³ãã¬7æ¬ã®é åžã¯ å ¬åŒLINE ããð¬
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ