c2638668e3
leo 2026-08-20:「同一個 plugin 你用,薄殼也用,保證兩邊同步」
「我要你幫雲端做薄殼,永遠都有問題,你要做的就是這組設定
你自己可以 dogfooding」
搬進來:41 支 hook(51 條註冊)/7 支 command/2 支 skill/23 支腳本。
不搬 .env、wiki、docs——那些是知識不是環境。
51 條 hook 路徑全部從 $CLAUDE_PROJECT_DIR/.claude/hooks/ 改成 ${CLAUDE_PLUGIN_ROOT}/hooks/,
零漏網。那正是薄殼一直壞掉的根:雲端 cwd 不是真身,寫死路徑就斷。
尚未驗證:Claude Code 能不能從私有 Gitea repo 裝 marketplace(要憑證)。
下一步就是在本機實際裝一次,通了才動雲端 bootstrap.sh。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
86 lines
4.8 KiB
Bash
Executable File
86 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
||
# check-deploy-drift.sh — 線上/Gitea/本機三方版本對帳(2026-07-30 立)
|
||
#
|
||
# 為什麼存在:07-30 雲端總管看 Gitea 判「線上 919ed39 的程式碼失蹤」,實情是
|
||
# t143-t150 十筆 commit 只在本機沒 push——雲端缺「本機領先 Gitea 幾筆」的視野就會誤報。
|
||
# 本腳本讓任何 session(含雲端)一條命令看清三方是否一致;有落差 exit 1。
|
||
#
|
||
# 用法:scripts/check-deploy-drift.sh
|
||
# 需要 GITEA_TOKEN(環境變數,或頂層 .env 有就自動吸)。
|
||
# 雲端 checkout 沒有 products/(gitignore)→ 本機欄自動降級成「—」,只比前兩欄。
|
||
set -euo pipefail
|
||
cd "$(dirname "$0")/.."
|
||
TOP="$(pwd)"
|
||
|
||
GITEA="https://git.uncle6.me/api/v1/repos/Leo/arcrun-rag/raw"
|
||
INSTALLER_REF="${INSTALLER_REF:-fix/t75-remove-config-card}"
|
||
LANDING_REF="${LANDING_REF:-feat/daemon}"
|
||
LOCAL_REPO="$TOP/products/arcrun-rag"
|
||
|
||
if [ -z "${GITEA_TOKEN:-}" ] && [ -f "$TOP/.env" ]; then
|
||
set -a; source "$TOP/.env" 2>/dev/null || true; set +a
|
||
fi
|
||
[ -n "${GITEA_TOKEN:-}" ] || { echo "❌ 缺 GITEA_TOKEN(環境變數或頂層 .env)"; exit 2; }
|
||
|
||
VER_PAT='20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]+[0-9a-f]\{7\}'
|
||
|
||
# 從 worker.js 內容推導安裝器版本號(BUNDLE_BUILT + '+' + 釘碼前 7 碼,同 worker.js 顯示邏輯)
|
||
derive_installer_ver() {
|
||
local built pin
|
||
built="$(printf '%s' "$1" | grep -o "BUNDLE_BUILT = '[^']*'" | head -1 | sed "s/.*'\(.*\)'/\1/" || true)"
|
||
pin="$(printf '%s' "$1" | grep -o 'arcrun-rag-bundles@[0-9a-f]*' | head -1 | cut -d@ -f2 | cut -c1-7 || true)"
|
||
{ [ -n "$built" ] && [ -n "$pin" ]; } && printf '%s+%s' "$built" "$pin" || printf '?'
|
||
}
|
||
|
||
# ── 線上 ──
|
||
LIVE_INSTALLER="$(curl -s -m 25 "https://install.arcrun.dev/?cb=$RANDOM" | grep -o "$VER_PAT" | head -1 || true)"
|
||
LIVE_LANDING="$(curl -s -m 25 "https://rag.arcrun.dev/?cb=$RANDOM" | grep -o "$VER_PAT" | head -1 || true)"
|
||
|
||
# ── Gitea ──
|
||
G_WORKER="$(curl -s -m 25 "$GITEA/installer/oauth-prototype/worker.js?ref=$INSTALLER_REF" -H "Authorization: token $GITEA_TOKEN" || true)"
|
||
GITEA_INSTALLER="$(derive_installer_ver "$G_WORKER")"
|
||
GITEA_LANDING="$(curl -s -m 25 "$GITEA/landing/wrangler.toml?ref=$LANDING_REF" -H "Authorization: token $GITEA_TOKEN" \
|
||
| grep -o 'SITE_BUNDLE_VERSION = "[^"]*"' | sed 's/.*"\(.*\)"/\1/' || true)"
|
||
|
||
# ── 本機(沒有 products/ 就降級)──
|
||
if [ -d "$LOCAL_REPO/.git" ]; then
|
||
L_WORKER="$(git -C "$LOCAL_REPO" show "$INSTALLER_REF:installer/oauth-prototype/worker.js" 2>/dev/null || true)"
|
||
LOCAL_INSTALLER="$(derive_installer_ver "$L_WORKER")"
|
||
LOCAL_LANDING="$(git -C "$LOCAL_REPO" show "$LANDING_REF:landing/wrangler.toml" 2>/dev/null \
|
||
| grep -o 'SITE_BUNDLE_VERSION = "[^"]*"' | sed 's/.*"\(.*\)"/\1/' || true)"
|
||
# 本機另一種漂移:commit 了沒推(07-30 事故本尊)
|
||
UNPUSHED_I="$(git -C "$LOCAL_REPO" log --oneline "gitea/$INSTALLER_REF..$INSTALLER_REF" 2>/dev/null | wc -l | tr -d ' ' || true)"
|
||
UNPUSHED_L="$(git -C "$LOCAL_REPO" log --oneline "gitea/$LANDING_REF..$LANDING_REF" 2>/dev/null | wc -l | tr -d ' ' || true)"
|
||
HAS_LOCAL=1
|
||
else
|
||
LOCAL_INSTALLER="—"; LOCAL_LANDING="—"; UNPUSHED_I=""; UNPUSHED_L=""
|
||
HAS_LOCAL=0
|
||
echo "(本機沒有 products/arcrun-rag——雲端模式,只比線上 vs Gitea)"
|
||
fi
|
||
|
||
printf '%-10s %-20s %-20s %-20s\n' "" "線上" "Gitea" "本機"
|
||
printf '%-10s %-20s %-20s %-20s\n' "installer" "${LIVE_INSTALLER:-?}" "${GITEA_INSTALLER:-?}" "${LOCAL_INSTALLER:-?}"
|
||
printf '%-10s %-20s %-20s %-20s\n' "landing" "${LIVE_LANDING:-?}" "${GITEA_LANDING:-?}" "${LOCAL_LANDING:-?}"
|
||
|
||
DRIFT=0
|
||
chk() { # chk 名稱 線上 gitea 本機
|
||
local name="$1" live="$2" gitea="$3" local_="$4"
|
||
[ -n "$live" ] && [ "$gitea" != "?" ] && [ "$live" != "$gitea" ] && { echo "❌ $name:線上($live) ≠ Gitea($gitea)"; DRIFT=1; }
|
||
if [ "$HAS_LOCAL" = "1" ]; then
|
||
[ "$local_" != "?" ] && [ "$gitea" != "?" ] && [ "$local_" != "$gitea" ] && { echo "❌ $name:本機($local_) ≠ Gitea($gitea)——改了沒推?"; DRIFT=1; }
|
||
fi
|
||
true
|
||
}
|
||
chk installer "${LIVE_INSTALLER:-}" "${GITEA_INSTALLER:-?}" "${LOCAL_INSTALLER:-?}"
|
||
chk landing "${LIVE_LANDING:-}" "${GITEA_LANDING:-?}" "${LOCAL_LANDING:-?}"
|
||
[ -n "$UNPUSHED_I" ] && [ "$UNPUSHED_I" != "0" ] && { echo "❌ installer 分支有 $UNPUSHED_I 筆 commit 未推上 Gitea"; DRIFT=1; }
|
||
[ -n "$UNPUSHED_L" ] && [ "$UNPUSHED_L" != "0" ] && { echo "❌ landing 分支有 $UNPUSHED_L 筆 commit 未推上 Gitea"; DRIFT=1; }
|
||
|
||
[ "$DRIFT" = "1" ] && { echo "⚠️ 有漂移(見上)"; exit 1; }
|
||
|
||
# 抓不到 ≠ 驗證通過(假綠禁令):任何欄位是 ? 就不准報 ✅
|
||
if [ -z "${LIVE_INSTALLER:-}" ] || [ -z "${LIVE_LANDING:-}" ] || [ "$GITEA_INSTALLER" = "?" ] || [ -z "${GITEA_LANDING:-}" ]; then
|
||
echo "⚠️ 有欄位抓不到(網路/權限問題)=無法驗證,不算通過;重跑一次試試"; exit 2
|
||
fi
|
||
echo "✅ 無漂移"
|