From d6e1d6360e55274ff300d6e8d59c9a89f03153d4 Mon Sep 17 00:00:00 2001 From: richblack Date: Fri, 21 Aug 2026 06:45:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=96=84=E6=AE=BC=E8=A4=87=E8=A3=BD=E5=93=81?= =?UTF-8?q?=E7=9A=84=E6=BC=82=E7=A7=BB=E6=AA=A2=E6=9F=A5=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=9B=9E=E7=AD=94=E3=80=8C=E6=94=B9=E4=BA=86=E9=9B=B2=E7=AB=AF?= =?UTF-8?q?=E6=9C=83=E4=B8=8D=E6=9C=83=E8=B7=9F=E3=80=8D=E9=80=99=E5=80=8B?= =?UTF-8?q?=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit leo 2026-08-21 問:「現在雲端 plugin 寫死如果修改會跟著改嗎?」 答案是**不會**。複製品是快照,要有人重跑 vendor-to-shell.py 再推薄殼。 實證:ISEP 從 0.3.1 一路改到 0.3.4,薄殼完全不知道, 直到我手動重跑一次。漂了沒有任何人會知道——這支就是那個「知道」。 check-vendor-drift.sh <薄殼路徑>: 版本不同 → 直接說差多少,並印出修法指令 版本相同但內容不同 → 列出是哪幾支檔(抓「改了東西忘了升版」) 執行期產物排除:待驗工作單目錄/推送請求留底/*.log/__pycache__ 三向實測: 一致 → exit 0 改一支閘 → 指名 credential-only-guard.sh 不同 改版本號 → 指出 0.3.4 vs 0.2.0 並給修法 Co-Authored-By: Claude Opus 5 --- scripts/check-vendor-drift.sh | 45 +++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100755 scripts/check-vendor-drift.sh 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