-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup.sh
More file actions
executable file
·128 lines (111 loc) · 5.01 KB
/
Copy pathsetup.sh
File metadata and controls
executable file
·128 lines (111 loc) · 5.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/usr/bin/env bash
#
# opencode-bootstrap — 一鍵重現 opencode 設定
# 內建 superpowers plugin + harness-creator skill,setup 過程不需連外部 git。
#
# 用法:
# 遠端: export PROXY=http://your-proxy:port # 選用
# curl -fsSL -k --proxy "$PROXY" \
# https://raw.githubusercontent.com/wys1203/opencode-bootstrap/main/setup.sh | bash
# 本地: ./setup.sh # 整包帶到目標機器時
#
# 行為: 安裝內建 superpowers + harness-creator -> 備份既有設定 -> 寫入 opencode.json
# 刻意不做: 不安裝/升級 opencode、不安裝 Ollama、不處理 provider 登入。
#
set -euo pipefail
# --- 設定 -------------------------------------------------------------------
RAW_BASE="${RAW_BASE:-https://raw.githubusercontent.com/wys1203/opencode-bootstrap/main}"
CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/opencode"
CONFIG_FILE="$CONFIG_DIR/opencode.json"
# proxy: PROXY 優先,否則沿用標準 HTTPS_PROXY/https_proxy 環境變數
PROXY="${PROXY:-${HTTPS_PROXY:-${https_proxy:-}}}"
# --- 輸出小工具 -------------------------------------------------------------
info() { printf '\033[34m›\033[0m %s\n' "$1"; }
ok() { printf '\033[32m✓\033[0m %s\n' "$1"; }
warn() { printf '\033[33m!\033[0m %s\n' "$1"; }
die() { printf '\033[31m✗\033[0m %s\n' "$1" >&2; exit 1; }
# --- curl: 一律 -k (配合會攔截 TLS 的企業 proxy),有 PROXY 就走 --proxy -------
curl_get() {
command -v curl >/dev/null 2>&1 || die "找不到 curl"
local args=(-fsSL -k)
[[ -n "$PROXY" ]] && args+=(--proxy "$PROXY")
curl "${args[@]}" "$@"
}
# 透過 `curl | bash` 執行時 BASH_SOURCE 不是真實檔案 -> SCRIPT_DIR 留空 -> 走遠端
SCRIPT_DIR=""
if [[ -n "${BASH_SOURCE[0]:-}" && -f "${BASH_SOURCE[0]:-}" ]]; then
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
fi
# --- 安裝一個 bundle (tarball 內含頂層目錄): 本地優先,否則 curl 遠端 ---------
# install_bundle <名稱> <解壓進的目錄> <頂層目錄名> <用來驗證的相對路徑>
install_bundle() {
local name="$1" into="$2" topdir="$3" verify="$4"
local tarball local_tar="$SCRIPT_DIR/$name.tar.gz"
tarball="$(mktemp)"
if [[ -n "$SCRIPT_DIR" && -f "$local_tar" ]]; then
info "使用本地 $name.tar.gz: $local_tar"
cp "$local_tar" "$tarball"
else
info "下載 $name.tar.gz: $RAW_BASE/$name.tar.gz"
curl_get -o "$tarball" "$RAW_BASE/$name.tar.gz" \
|| { rm -f "$tarball"; die "下載 $name.tar.gz 失敗"; }
fi
if ! tar -tzf "$tarball" >/dev/null 2>&1; then
rm -f "$tarball"; die "$name.tar.gz 不是合法 tar.gz"
fi
mkdir -p "$into"
rm -rf "$into/$topdir" # 重跑前清掉舊版,確保乾淨
tar -xzf "$tarball" -C "$into"
rm -f "$tarball"
[[ -e "$into/$topdir/$verify" ]] \
|| die "解壓後找不到 $topdir/$verify,$name 安裝失敗"
ok "已安裝 $name -> $into/$topdir"
}
# --- 取得 opencode.json: 本地優先,否則 curl 遠端 ----------------------------
fetch_config() {
local local_file="$SCRIPT_DIR/opencode.json"
if [[ -n "$SCRIPT_DIR" && -f "$local_file" ]]; then
info "使用本地設定檔: $local_file" >&2
cat "$local_file"
else
info "下載設定: $RAW_BASE/opencode.json" >&2
curl_get "$RAW_BASE/opencode.json" || die "下載 opencode.json 失敗"
fi
}
# --- 主流程 -----------------------------------------------------------------
main() {
info "opencode-bootstrap: 重現 opencode 設定"
if [[ -n "$PROXY" ]]; then info "curl 走 proxy: $PROXY (一律 -k)"; else info "未設定 PROXY,curl 直連 (一律 -k)"; fi
mkdir -p "$CONFIG_DIR"
# 1) 安裝內建 bundle (離線自帶,無需連外部 git)
# superpowers -> ~/.config/opencode/superpowers/
# harness-creator -> ~/.config/opencode/skills/harness-creator/
install_bundle superpowers "$CONFIG_DIR" superpowers ".opencode/plugins/superpowers.js"
install_bundle harness-creator "$CONFIG_DIR/skills" harness-creator "SKILL.md"
# 2) 取得並驗證 opencode.json
local content
content="$(fetch_config)"
[[ -n "$content" ]] || die "取得的設定內容為空"
if command -v python3 >/dev/null 2>&1; then
printf '%s' "$content" | python3 -c 'import json,sys; json.load(sys.stdin)' \
|| die "設定內容不是合法 JSON,中止"
ok "JSON 格式驗證通過"
else
warn "找不到 python3,略過 JSON 驗證"
fi
# 3) 備份既有設定後寫入
if [[ -f "$CONFIG_FILE" ]]; then
local backup="$CONFIG_FILE.bak.$(date +%Y%m%d-%H%M%S)"
cp "$CONFIG_FILE" "$backup"
ok "已備份舊設定 -> $backup"
fi
printf '%s\n' "$content" > "$CONFIG_FILE" # 補回命令替換吃掉的結尾換行
ok "已寫入 $CONFIG_FILE"
printf '\n'
info "完成。已安裝: superpowers plugin + harness-creator skill"
info "後續仍需自行處理:"
printf ' - 安裝 opencode (若尚未安裝): https://opencode.ai\n'
printf ' - provider 登入: opencode auth login\n'
printf ' - Ollama 本地模型: 確認已安裝並執行 ollama pull qwen2.5-coder:7b\n'
}
main "$@"