#!/usr/bin/env bash # check-vendor-drift.sh — 薄殼裡那份複製品,跟 ISEP 真身還一不一樣? # # 🔴 為什麼需要這支(leo 2026-08-21 問的那句): # 「現在雲端 plugin 寫死如果修改會跟著改嗎?」——**不會。** # 複製品是快照。ISEP 改了,薄殼不會自己跟;要有人重跑 vendor-to-shell.py 再推。 # 實證:ISEP 從 0.3.1 一路改到 0.3.4,雲端完全不知道, # 直到有人手動重跑一次。**漂了沒有任何人會知道**——這支就是那個「知道」。 # # 用法:check-vendor-drift.sh <薄殼 repo 路徑> # exit 0 = 一致 exit 1 = 漂了(印出差在哪) set -uo pipefail SHELL_REPO="${1:-}" [ -d "$SHELL_REPO/.claude/isep" ] || { echo "用法:$0 <薄殼 repo 路徑>" >&2; exit 2; } ISEP="$(cd "$(dirname "$0")/.." && pwd)" TMP=$(mktemp -d) trap 'rm -rf "$TMP"' EXIT ISEP_V=$(sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$ISEP/.claude-plugin/plugin.json" | head -1) SH_V=$(sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$SHELL_REPO/.claude/isep/.claude-plugin/plugin.json" 2>/dev/null | head -1) if [ "$ISEP_V" != "$SH_V" ]; then echo "❌ 版本不同:ISEP 真身=$ISEP_V,薄殼裡的複製品=${SH_V:-(讀不到)}" echo " 修法: python3 $ISEP/scripts/vendor-to-shell.py" echo " 再把 $ISEP/.shell-payload/dot-claude/ 蓋進 $SHELL_REPO/.claude/ 後推" exit 1 fi # 版本一樣不代表內容一樣——重新產一份比對,才抓得到「改了東西忘了升版」 python3 "$ISEP/scripts/vendor-to-shell.py" >/dev/null 2>&1 || { echo "❌ vendor 產生失敗" >&2; exit 2; } # 排除「執行期才產生」的東西:它們本來就只存在於跑過的那一邊,不是漂移。 # pending-verification/ 待驗工作單(hook 執行時寫) # pending-main-push/ 推送請求留底 # *.log 各閘的留痕 # __pycache__/ python import 時就地產生 if diff -rq \ -x pending-verification -x pending-main-push -x '*.log' -x __pycache__ -x '*.pyc' \ "$ISEP/.shell-payload/dot-claude" "$SHELL_REPO/.claude" > "$TMP/d" 2>&1; then echo "✅ 一致:薄殼複製品=ISEP v$ISEP_V,逐檔相同" exit 0 fi echo "❌ 版本相同($ISEP_V)但內容不同 —— 有人改了東西沒升版:" head -12 "$TMP/d" exit 1