Files
ISEP/scripts/make-cloud-env.sh
Leo 3ca066260c fix(cloud): make-cloud-env.sh 改三段輸出(A/B/C)+修 bash 3.2 相容性
main 回饋:靜默排除 leo21c 憑證會讓 leo 明天卡住而不知道為什麼——
改成 A(cloud 總管工作需要,直接貼)/B(leo21c 正式環境憑證+已知過時,
值已備好+附理由,leo 自己決定要不要留)/C(舊雲端有這個名字但本機
六個 .env 都找不到值的)三段,讓 leo 自己看得見取捨。

同時修掉 `local -n`(nameref)在 macOS 內建 bash 3.2 會直接噴語法錯誤的問題
(leo 本機跑的就是這支 bash)——改成兩個各自展開的函式,不依賴 bash 4.3+。

實跑驗證:A 8 個+B 7 個=15 個,跟舊雲端環境變數清單數量一致,C 段 0 個
(這次盤點六個 .env 全部找得到值)。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 22:09:36 +08:00

137 lines
7.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 讀出來寫進產物 —— 值不進版控、不進對話。
#
# 🔴 2026-08-20inkstone/InkStoneCo#14)分三段輸出,不是「總管幫你篩過」:
# 舊雲端環境的 15 個變數,逐一對過 credentials-map.md 後發現有 7 個其實是
# polaris/mira/.envleo21c 現役)的正式環境憑證。總管第一版做法是「照抄
# 舊清單、值填回去」——沒有問過「這些憑證憑什麼該出現在雲端」,那是錯的。
# 但「總管建議不放」≠「總管替你拿掉」:B 段照樣給值+理由,你自己決定。
set -euo pipefail
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=變數名 → 印出值(找不到就空、回傳非 0)
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
}
# ── A. cloud 總管工作需要的(只有名字+一句理由。要加就加在這裡)──────
A_NEEDED=(
"GITEA_TOKEN_CLAUDE_CODE|機器帳號 claude-code 的 Gitea tokenplugin 安裝與 git push-back 都靠它"
"TELEGRAM_BOT_TOKEN|notify_leo 備援路徑(優先路徑是 arcrun MCP workflow,免密碼)"
"TELEGRAM_CHAT_ID|同上"
"GEMINI_API_KEY|arcrun 工作流用(matrix/arcrun、products/arcrun-rag 兩邊 .env 都列)"
"NOTION_INTEGRATION_TOKEN|leo 註記「給 arcrun 用的」"
"UNCLE6_CF_API_KEY|uncle6 帳號(非 leo21c)的 CF 操作"
"N8N_UNCLE6_API_KEY|n8n MCP 用"
"CLOUDFLARE_API_TOKEN_YOULIN_CC_USE|D37 測試帳號,本來就是設計給 CC 用的"
)
# 想加 geek6688 出貨機能力(讓雲端能自走完 D82 三步)就在這裡補兩行:
# "CLOUDFLARE_API_TOKEN_CC_SHIPPING_CORE|geek6688 出貨機 token——加了雲端就有出貨寫入能力"
# "CLOUDFLARE_ACCOUNT_ID_GEEK6688|同上,成對變數"
# 沒有預設放進來,因為那是「要不要讓雲端有出貨能力」的風險判斷,屬於 leo。
# ── B. 建議不放,但值已備好+附理由,leo 自己決定要不要留 ────────────
# 前 5 項全部來自 polaris/mira/.envleo21c 現役正式環境),不是 cloud 總管
# 工作需要的東西;credentials-map.md 逐檔核對,2026-08-14 那輪審查已把
# 「無名字的 CLOUDFLARE_API_TOKEN 讀得到 leo21c 6 顆正式 worker」列為
# 「本輪最危險的發現」。完整依據見 docs/cloud-environment-audit-20260820.md §7。
B_LEGACY=(
"NAMESPACE|miraleo21c 現役)自己的環境變數,cloud 總管的工作不吃它;拿掉沒有已知副作用"
"PRIVATE_KEY|mira 用的 Google 服務帳號私鑰;拿掉沒有已知副作用(cloud 總管目前的工作不碰 Google API"
"CLIENT_EMAIL|PRIVATE_KEY 的配對變數,同上"
"CLOUDFLARE_API_TOKEN|沒有名字,實測讀得到 leo21c 的 6 顆正式 worker,會被所有工具當預設 token;拿掉會失去「不指定帳號也能操作 CF」的能力——但那正是最危險的情境本身,不是值得保留的功能"
"CLOUDFLARE_ACCOUNT_ID| leo21c 帳號 id;拿掉會讓 CLI 不再預設打 leo21c——這是拿掉的目的,不是副作用"
"CLAUDE_CODE_OAUTH_TOKEN|leo 自己在舊快照裡標記「這個已經不需要了」;拿掉沒有已知副作用"
"CLOUDFLARE_API_TOKEN_leo21c|明確具名指向 leo21c;留著的話能對 leo21c 做診斷(GET),但風險是否可接受要看這把 token 在 CF 控制台的實際權限範圍——這台機器沒辦法幫你查,请自己到 CF dashboard 確認是唯讀還是可寫"
)
OUT_DIR="$HOME/.claude/cloud-env"
mkdir -p "$OUT_DIR"; 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_NAMES=() # A/B 兩段裡,本機 .env 完全找不到值的(落進 C 段)
# bash 3.2macOS 內建)沒有 `local -n`nameref),這裡故意不用函式傳陣列名,
# 兩段各自展開迴圈,維持跨平台可跑(leo 本機/雲端 Ubuntu 都要能跑)。
render_A() {
local entry name reason v
for entry in "${A_NEEDED[@]}"; do
name="${entry%%|*}"; reason="${entry#*|}"
if v=$(lookup "$name"); then
printf '%s=%s ← %s\n' "$name" "$v" "$reason"
else
MISSING_NAMES+=("$name")
fi
done
}
render_B() {
local entry name reason v
for entry in "${B_LEGACY[@]}"; do
name="${entry%%|*}"; reason="${entry#*|}"
if v=$(lookup "$name"); then
printf '%s=%s ← %s\n' "$name" "$v" "$reason"
else
MISSING_NAMES+=("$name")
fi
done
}
{
echo "claude.ai → Cloud environments → 你的環境。"
echo "產生時間:$(date '+%Y-%m-%d %H:%M')"
echo "依據:docs/cloud-environment-audit-20260820.md §7(完整比對表與理由)"
echo
echo "════════ A. Environment variables — cloud 總管工作需要,直接貼 ════════"
render_A
echo
echo "════════ B. leo21c 正式環境憑證/已知過時 — 建議不放,值已備好,你決定 ════════"
echo "# 格式:NAME=值 ← 為什麼建議不放"
echo "# 要留哪一條,把那一行搬到上面 A 段、拿掉後面的「← 理由」註解即可"
render_B
echo
echo "════════ C. 舊雲端有這個名字、但本機六個 .env 都找不到值 ════════"
if [ ${#MISSING_NAMES[@]} -eq 0 ]; then
echo "(無——A/B 兩段的變數這台機器上全部找得到值)"
else
for n in "${MISSING_NAMES[@]}"; do
echo "$n=<🔴 這台機器找不到,若還要這個能力,從舊的雲端設定手動搬過來>"
done
fi
echo
echo "════════ D. Setup script(整段貼,一字不改)════════"
cat "$SETUP"
} > "$OUT"
chmod 600 "$OUT"
A_COUNT=${#A_NEEDED[@]}
B_COUNT=${#B_LEGACY[@]}
echo "✅ 產生完成:$OUT"
echo " A 段 $A_COUNT 個(直接貼)|B 段 $B_COUNT 個(建議不放,附值與理由)|C 段找不到值 ${#MISSING_NAMES[@]}${MISSING_NAMES[*]:-}"
echo " 🔴 這個檔含金鑰真身:貼完就刪(rm '$OUT'),它刻意不在任何 repo 裡。"