diff --git a/scripts/check-vendor-drift.sh b/scripts/check-vendor-drift.sh new file mode 100755 index 0000000..d2387be --- /dev/null +++ b/scripts/check-vendor-drift.sh @@ -0,0 +1,45 @@ +#!/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