ISEP 0.1.0:環境設定收成一個 plugin,本機與雲端共用一份

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>
This commit is contained in:
2026-08-20 11:41:46 +08:00
commit c2638668e3
85 changed files with 11879 additions and 0 deletions
+55
View File
@@ -0,0 +1,55 @@
#!/bin/sh
# gitea-arm-to-github-armed.sh — 把「leo 在 Gitea 票上的核准」轉成出貨線認得的 `.github-armed`
#
# 🔴 這支存在的理由(2026-08-13 實撞):
# arm 機制上線當天,總管把它接到了 `main-and-prod-push-guard.sh`(推 main 那道閘),
# **但出貨線 `ship.mjs` 的 preflight 只認舊的 `.github-armed`**
# ⇒ leo 在票上回了碼、`gitea-arm-check.sh` 回 ARMED**出貨照樣斷在第 1 站**。
# ⇒ 總管審 PR 時查了「機制本身安不安全」,**沒查「它有沒有接到真正擋路的地方」**。
# 同款形狀:做好了一半,而那一半不是會擋住人的那半。
#
# 🔴 這支**不是**繞過 D20,它是同一道閘的另一個入口:
# `.github-armed` 代表的權威來自「leo 親自做了一個機器做不到的動作」。
# 舊入口=他在終端機打字;新入口=他在 Gitea 票上回覆一組碼。
# **兩者的不可偽造性來源不同,但都不在機器手上**:
# · 終端機:機器碰不到那個鍵盤
# · Gitea:機器寫不出作者是 `Leo` 的留言(2026-08-13 身分分離完成,總管親手攻擊驗過)
#
# ⛔ **唯一的安全條件**:本檔**只在 `gitea-arm-check.sh` 成功時**才寫出保險。
# 那支是 fail-closed 的(沒回覆/過期/已消耗/作者不是 Leo/Gitea 不通 → 全部 exit 1),
# 而且核准者與頻道票**寫死在 `lib/gitea-arm-common.sh`**,環境變數改不動。
# ⇒ 拿掉那個條件,這支就變成「AI 自己批准自己發佈」——**那正是 D20 要擋的事**。
set -eu
ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
ARMED="$ROOT/.github-armed"
# ── 唯一的授權來源:leo 在 Gitea 票上的回覆 ────────────────────────────
# 不捕捉、不吞錯——check 失敗就讓它把原因印到 stderr 並中止本支。
# 🔴 `--consume` 是必要的(2026-08-16 起 check 預設唯讀):本檔會**寫出保險**,
# 那就是「放行」本身 ⇒ 這一次核准必須當場作廢,否則同一組碼能重複解保險。
OUT=$("$ROOT/scripts/gitea-arm-check.sh" --consume) || {
echo "" >&2
echo "⛔ 沒有取得 leo 的核准 ⇒ 不寫保險(fail-closed" >&2
echo " 先跑:scripts/gitea-arm-request.sh <票號> \"<要做什麼>\",把代碼給 leo 回在那張票上。" >&2
exit 1
}
# `.github-armed` 的格式(照 scripts/github-arm.sh:93):
# 第 1 行:到期 epoch/第 2 行:任務說明/第 3 行:armed_at=…
MISSION=$(printf '%s' "$OUT" | sed -n 's/^ARMED: //p' | head -1)
[ -n "$MISSION" ] || MISSION="gitea-arm 核准,未帶說明)"
NOW=$(date +%s)
EXPIRY=$((NOW + 1800)) # 30 分鐘,與 gitea-arm-request 的時效一致
printf '%s\n%s\n%s\n' \
"$EXPIRY" \
"$MISSION" \
"armed_at=$(date '+%Y-%m-%d %H:%M:%S')(來源:Gitea 票 leo 核准,非終端機)" \
> "$ARMED"
echo "✅ 保險已解(來源:leo 在 Gitea 票上的核准)"
echo " 任務:$MISSION"
echo " 有效至:$(date -r "$EXPIRY" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo "$EXPIRY")"
echo " 提前上保險:rm $ARMED"