ca9ea9993b
scripts/make-cloud-env.sh 的 NEEDED 只有 1 個變數,裡面從來沒有任何 CF 憑證 ——雲端 `env | grep -ciE 'cloudflare|^CF_|wrangler'` 回 0 是這麼來的,不是漏設。 - NEEDED 加 CLOUDFLARE_API_TOKEN_YOULIN_CC_USE(youlin = AI 的 stage)。 leo21c 正式環境那 7 把(B 段)一把都沒動,理由寫在清單旁邊。 - 新增 scripts/test-make-cloud-env.sh(docs/TESTING.md A25,10 條): A 段用假 .env 隔離跑(證明缺值會被標紅、什麼都不寫進 repo); B 段拿真 .env 對帳,判準是「值出自哪個檔案」而不是名字裡有沒有某個字, 並用一個已知住在 polaris/mira/.env 的變數自驗偵測真的會亮。 - TESTING.md B1 原本點名「加一個 GITEA_TOKEN_CLAUDE_CODE」已經過時, 改成「① 區塊每一行都貼」。 - README/plugin.json 的 scripts 數字在自己的樹上實數:48 → 49。 值全程沒有進版控、沒有進對話(只印名字與長度)。 版本號待總管定。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
88 lines
4.4 KiB
Bash
Executable File
88 lines
4.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# 管什麼: 產生「可以直接貼進 claude.ai Cloud environment」的兩塊內容,值由本腳本自己去 .env 拉。
|
||
# 為什麼: leo 2026-08-20「這些值你都有,你可以只寫名字然後 build 一個檔案給我」——
|
||
# 之前的做法是叫他自己拼湊,或叫他把設定貼給 AI 看,兩種都錯(一個沒效率,一個讓值經過對話)。
|
||
# 誤觸時怎麼關: 這支不擋任何東西。不想產生就別跑;產物在版控外,刪掉即可。
|
||
#
|
||
# 用法:bash scripts/make-cloud-env.sh
|
||
# 產物:~/.claude/cloud-env/<日期>.txt(權限 600,**不在任何 repo 裡**)
|
||
# 本腳本只寫「變數名字」,值在執行當下才從既有 .env 讀出來寫進產物 —— 值不進版控、不進對話。
|
||
set -euo pipefail
|
||
|
||
# ── 雲端需要哪些變數(只有名字。要加就加在這裡)──────────────────
|
||
NEEDED=(
|
||
GITEA_TOKEN_CLAUDE_CODE # 機器帳號 claude-code 的 Gitea token;bootstrap 與 plugin 安裝都靠它
|
||
CLOUDFLARE_API_TOKEN_YOULIN_CC_USE # youlin = AI 的 stage 實例;D37 起這把就是設計給 CC 用的
|
||
)
|
||
#
|
||
# 🔴 這份清單的邊界——加一把之前先問「這把打得到哪個實例」,不是「這把方便嗎」
|
||
# (依據:inkstone/InkStoneCo#14 comment 3890,leo 2026-08-20 親自把憑證分成 A/B 段)
|
||
#
|
||
# 可以進來的:雲端總管做**自己的工作**要用到的(stage、機器帳號、測試實例)。
|
||
# 🔴 不准進來的:leo21c 正式環境那一段(B 段,leo 明確選擇不放)。
|
||
# 其中 `CLOUDFLARE_API_TOKEN` / `CLOUDFLARE_ACCOUNT_ID` 這兩個**沒有名字**的,
|
||
# 值就是 leo21c 的,而且所有 CF 工具都把它們當預設 ⇒ 雲端一個沒指定帳號的
|
||
# 指令就會打到正式環境。2026-08-14 那輪審查把它列為「本輪最危險的發現」。
|
||
#
|
||
# ⚠️ youlin 沒有對應的 `CLOUDFLARE_ACCOUNT_ID_*`——六個 .env 裡都沒有這個名字。
|
||
# 要 account id 的工具請拿上面那把 token 去問 CF `/accounts`,
|
||
# **不要退而求其次填那個沒有名字的 `CLOUDFLARE_ACCOUNT_ID`**(那是 leo21c)。
|
||
|
||
# ── 去哪裡找值(credentials-map.md 記的六個 .env)────────────────
|
||
BASE="${INKSTONE_ROOT:-$HOME/Documents/tech_projects/InkStoneCo}"
|
||
ENV_FILES=(
|
||
"$BASE/.env"
|
||
"$BASE/matrix/arcrun/.env"
|
||
"$BASE/products/arcrun-rag/.env"
|
||
"$BASE/polaris/mira/.env"
|
||
"$BASE/matrix/kbdb-graph-plugin/.env"
|
||
"$BASE/arcrun_harness/.env"
|
||
)
|
||
|
||
lookup() { # $1=變數名 → 印出值(找不到就空)
|
||
local name="$1" f v
|
||
for f in "${ENV_FILES[@]}"; do
|
||
[ -f "$f" ] || continue
|
||
v=$(grep -E "^[[:space:]]*(export[[:space:]]+)?${name}=" "$f" 2>/dev/null | tail -1 \
|
||
| sed -E "s/^[[:space:]]*(export[[:space:]]+)?${name}=//" \
|
||
| sed -E 's/^"(.*)"$/\1/; s/^'"'"'(.*)'"'"'$/\1/')
|
||
[ -n "$v" ] && { printf '%s' "$v"; return 0; }
|
||
done
|
||
return 1
|
||
}
|
||
|
||
# 預設丟 ~/.claude/cloud-env(權限 700)。要放別的地方= OUT_DIR=~/Desktop bash scripts/make-cloud-env.sh
|
||
OUT_DIR="${OUT_DIR:-$HOME/.claude/cloud-env}"
|
||
mkdir -p "$OUT_DIR"
|
||
# 只在「這個目錄是我們自己造的預設位置」時才收緊權限——
|
||
# OUT_DIR 可被覆寫,不該對使用者指定的既有目錄(例如 ~/Desktop)動權限。
|
||
[ "$OUT_DIR" = "$HOME/.claude/cloud-env" ] && chmod 700 "$OUT_DIR"
|
||
OUT="$OUT_DIR/$(date +%Y%m%d-%H%M%S).txt"
|
||
|
||
SETUP="$(cd "$(dirname "$0")/.." && pwd)/docs/cloud-setup-script.sh"
|
||
[ -f "$SETUP" ] || { echo "🔴 找不到 $SETUP" >&2; exit 1; }
|
||
|
||
MISSING=()
|
||
{
|
||
echo "claude.ai → Cloud environments → 你的環境。下面兩塊各自貼進對應欄位。"
|
||
echo "產生時間:$(date '+%Y-%m-%d %H:%M')"
|
||
echo
|
||
echo "════════ ① Environment variables(一行一個,名字與值分開填)════════"
|
||
for n in "${NEEDED[@]}"; do
|
||
if v=$(lookup "$n"); then
|
||
echo "$n=$v"
|
||
else
|
||
echo "$n=<🔴 這台機器的 .env 裡找不到,要 leo 提供>"
|
||
MISSING+=("$n")
|
||
fi
|
||
done
|
||
echo
|
||
echo "════════ ② Setup script(整段貼,一字不改)════════"
|
||
cat "$SETUP"
|
||
} > "$OUT"
|
||
chmod 600 "$OUT"
|
||
|
||
echo "✅ 產生完成:$OUT"
|
||
echo " 變數 ${#NEEDED[@]} 個|找不到值的 ${#MISSING[@]} 個 ${MISSING[*]:-}"
|
||
echo " 🔴 這個檔含金鑰真身:貼完就刪(rm '$OUT'),它刻意不在任何 repo 裡。"
|