-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinit.sh
More file actions
executable file
·230 lines (186 loc) · 5.18 KB
/
init.sh
File metadata and controls
executable file
·230 lines (186 loc) · 5.18 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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
#!/bin/bash
# ============================================
# Opencode 初始化配置脚本 (Mac/Linux)
# ============================================
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 配置文件路径
CONFIG_FILE=".opencode/opencode.json"
SKILLS_DIR=".opencode/skills"
KEEP_SKILLS=("opencode_guide" "skill-creator")
# 打印分隔线
print_line() {
echo "========================================"
}
# 打印成功信息
print_success() {
echo -e "${GREEN}✓ $1${NC}"
}
# 打印警告信息
print_warning() {
echo -e "${YELLOW}⚠ $1${NC}"
}
# 打印错误信息
print_error() {
echo -e "${RED}✗ $1${NC}"
}
# 打印信息
print_info() {
echo -e "${BLUE}$1${NC}"
}
# 检查是否在项目根目录
check_directory() {
if [ ! -f "$CONFIG_FILE" ]; then
print_error "未找到配置文件: $CONFIG_FILE"
print_error "请确保在项目根目录下运行此脚本"
exit 1
fi
}
# 步骤1: 更新 opencode
upgrade_opencode() {
echo ""
print_info "[步骤 1/4] 正在更新 opencode..."
echo "运行命令: opencode upgrade"
if opencode upgrade; then
print_success "更新完成"
else
print_warning "更新失败,跳过此步骤继续执行"
fi
}
# 解析 API Key
resolve_api_key() {
local input="$1"
local api_key=""
# 情况1: 以 $ 开头,明确是环境变量
if [[ "$input" == \$* ]]; then
local var_name="${input:1}" # 去掉 $ 前缀
api_key="${!var_name}" # 间接引用获取环境变量值
if [ -z "$api_key" ]; then
print_error "环境变量 $var_name 不存在或为空" >&2
return 1
fi
print_success "检测到环境变量: $var_name" >&2
echo "$api_key"
return 0
fi
# 情况2: 不以 $ 开头,检查是否与环境变量名匹配
# 获取所有环境变量名
local env_value="${!input}"
if [ -n "$env_value" ]; then
print_success "检测到环境变量: $input" >&2
echo "$env_value"
return 0
fi
# 情况3: 直接作为 API Key 使用
print_info "使用输入值作为 API Key" >&2
echo "$input"
return 0
}
# 步骤2: 配置 API Key
configure_api_key() {
echo ""
print_info "[步骤 2/4] 配置 API Key"
echo "请输入 API Key 或环境变量名:"
print_info "提示:"
echo " - 直接输入 API Key: sk-xxxxxxxxxxxx"
echo " - 使用环境变量: \$ZP_KEY 或 ZP_KEY"
echo ""
read -p "请输入: " user_input
if [ -z "$user_input" ]; then
print_error "输入不能为空"
exit 1
fi
# 解析 API Key
API_KEY=$(resolve_api_key "$user_input")
if [ $? -ne 0 ] || [ -z "$API_KEY" ]; then
print_error "无法解析 API Key"
exit 1
fi
print_success "API Key 已配置"
}
# 步骤3: 替换配置文件
replace_config() {
echo ""
print_info "[步骤 3/4] 替换配置文件"
# 统计替换次数
local count=$(grep -c "zp_api_key" "$CONFIG_FILE" || true)
if [ "$count" -eq 0 ]; then
print_warning "配置文件中未找到 zp_api_key"
return
fi
# 执行替换
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' "s/zp_api_key/$API_KEY/g" "$CONFIG_FILE"
else
# Linux
sed -i "s/zp_api_key/$API_KEY/g" "$CONFIG_FILE"
fi
print_success "已替换 $CONFIG_FILE 中的 $count 处 zp_api_key"
}
# 步骤4: 精简 Skills
cleanup_skills() {
echo ""
print_info "[步骤 4/4] 精简 Skills"
if [ ! -d "$SKILLS_DIR" ]; then
print_warning "skills 目录不存在: $SKILLS_DIR"
return
fi
read -p "是否删除多余的 skills 目录?(y/n): " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
print_info "跳过精简 skills"
return
fi
# 获取所有子目录
local deleted_count=0
local kept_count=0
for dir in "$SKILLS_DIR"/*/; do
if [ ! -d "$dir" ]; then
continue
fi
# 获取目录名(去掉路径和末尾斜杠)
dir_name=$(basename "$dir")
# 检查是否在保留列表中
local keep=false
for keep_name in "${KEEP_SKILLS[@]}"; do
if [ "$dir_name" == "$keep_name" ]; then
keep=true
break
fi
done
if [ "$keep" == true ]; then
kept_count=$((kept_count + 1))
else
rm -rf "$dir"
deleted_count=$((deleted_count + 1))
fi
done
print_success "保留: ${KEEP_SKILLS[*]}"
print_success "已删除 $deleted_count 个目录"
}
# 主函数
main() {
print_line
echo " Opencode 初始化配置脚本 (Mac/Linux)"
print_line
# 检查当前目录
check_directory
# 执行各步骤
upgrade_opencode
configure_api_key
replace_config
cleanup_skills
# 完成
echo ""
print_line
print_success "配置完成!"
print_line
echo ""
}
# 运行主函数
main