#!/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 安裝都靠它 ) # ── 去哪裡找值(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 } 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=() { 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 裡。"