票上回碼解的保險寫回專案根,出貨線讀得到(inkstone/ISEP#156)
gitea-arm-to-github-armed.sh 原本用腳本自己的上一層決定 .github-armed 寫在哪;
plugin 發佈後那是 ~/.claude/plugins/cache/inkstone/isep/<ver>/,
於是保險寫進快取、印「已解」、ship.mjs 與各閘讀不到(arcrun-rag#202 c7598)。
改寫到 gitea_arm_proj_dir(${CLAUDE_PROJECT_DIR:-$(pwd)}),與
main-and-prod-push-guard/github-contact-guard/stage-before-prod-guard 讀的位置、
以及 check 自己讀 token/待核請求的位置一致。擋下時印的 request 路徑改絕對路徑。
測試:hooks/tests/gitea-arm-to-github-armed.test.sh 18/18;修之前 11 條紅。
TESTING.md 補 A42。版本待總管定。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -21,17 +21,36 @@
|
||||
# ⇒ 拿掉那個條件,這支就變成「AI 自己批准自己發佈」——**那正是 D20 要擋的事**。
|
||||
set -eu
|
||||
|
||||
ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
|
||||
ARMED="$ROOT/.github-armed"
|
||||
SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||
# shellcheck source=lib/gitea-arm-common.sh
|
||||
. "$SCRIPT_DIR/lib/gitea-arm-common.sh"
|
||||
|
||||
# ── 保險寫在哪:**讀的人在哪讀,就寫在哪**(inkstone/ISEP#156,2026-09-17 實撞)──────
|
||||
#
|
||||
# 🔴 舊版寫 `ROOT=$(dirname $0)/..`(腳本自己的上一層)。ISEP 還住在 InkStoneCo 裡時兩者剛好
|
||||
# 同一個位置;**改成 plugin 發佈後,腳本住在 `~/.claude/plugins/cache/inkstone/isep/<ver>/`**
|
||||
# ⇒ 保險被寫進 plugin 快取資料夾,印「✅ 保險已解」,而出貨線與每一道閘都讀不到
|
||||
# ⇒ leo 回了碼、出貨照樣卡住,總管手動把檔案搬過去才通(inkstone/arcrun-rag#202 c7598)。
|
||||
# **一句「已解」卻沒解,比單純失敗更糟——它讓 leo 以為自己的動作生效了。**
|
||||
#
|
||||
# ⇒ 改用 `gitea_arm_proj_dir`(=`${CLAUDE_PROJECT_DIR:-$(pwd)}`),理由是**跟讀的人對齊**:
|
||||
# · main-and-prod-push-guard.sh/github-contact-guard.sh/stage-before-prod-guard.sh
|
||||
# 全部讀 `${CLAUDE_PROJECT_DIR:-$(pwd)}/.github-armed`
|
||||
# · ship.mjs 讀 `InkStoneCo/.github-armed`(總管 session 的 CLAUDE_PROJECT_DIR 就是它)
|
||||
# · 本檔自己的核准來源(`gitea-arm-check.sh` 讀的 token 與待核請求)本來就住在這裡
|
||||
# ⇒ 專案根猜錯時 check 會先因為讀不到 `.env`/待核請求而 fail-closed,**不會寫到錯的地方**
|
||||
# 不要再改回「腳本的位置」:腳本住哪是安裝方式決定的,保險住哪是讀的人決定的,兩者無關。
|
||||
ARMED="$(gitea_arm_proj_dir)/.github-armed"
|
||||
|
||||
# ── 唯一的授權來源:leo 在 Gitea 票上的回覆 ────────────────────────────
|
||||
# 不捕捉、不吞錯——check 失敗就讓它把原因印到 stderr 並中止本支。
|
||||
# 🔴 `--consume` 是必要的(2026-08-16 起 check 預設唯讀):本檔會**寫出保險**,
|
||||
# 那就是「放行」本身 ⇒ 這一次核准必須當場作廢,否則同一組碼能重複解保險。
|
||||
OUT=$("$ROOT/scripts/gitea-arm-check.sh" --consume) || {
|
||||
OUT=$("$SCRIPT_DIR/gitea-arm-check.sh" --consume) || {
|
||||
echo "" >&2
|
||||
echo "⛔ 沒有取得 leo 的核准 ⇒ 不寫保險(fail-closed)" >&2
|
||||
echo " 先跑:scripts/gitea-arm-request.sh <票號> \"<要做什麼>\",把代碼給 leo 回在那張票上。" >&2
|
||||
# 印絕對路徑:相對的 `scripts/…` 會對貼上那個人的 cwd 解析,站在 InkStoneCo 會叫到舊複本(ISEP#112 同病)
|
||||
echo " 先跑:$SCRIPT_DIR/gitea-arm-request.sh <票號> \"<要做什麼>\",把代碼給 leo 回在那張票上。" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -50,6 +69,7 @@ printf '%s\n%s\n%s\n' \
|
||||
> "$ARMED"
|
||||
|
||||
echo "✅ 保險已解(來源:leo 在 Gitea 票上的核准)"
|
||||
echo " 寫在:$ARMED"
|
||||
echo " 任務:$MISSION"
|
||||
echo " 有效至:$(date -r "$EXPIRY" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo "$EXPIRY")"
|
||||
echo " 提前上保險:rm $ARMED"
|
||||
|
||||
Reference in New Issue
Block a user