Skip to content

Commit 4753ee5

Browse files
author
Sisyphus Agent
committed
chore: 清理已提交的任务文件
1 parent 44a18f6 commit 4753ee5

2 files changed

Lines changed: 347 additions & 87 deletions

File tree

oho/install

Lines changed: 347 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,347 @@
1+
#!/usr/bin/env bash
2+
#
3+
# oho 一键安装脚本
4+
# 支持从源码编译或从 GitHub Releases 下载预编译二进制
5+
#
6+
7+
set -e
8+
9+
# 配置
10+
REPO_OWNER="tornado404"
11+
REPO_NAME="opencode_cli"
12+
BINARY_NAME="oho"
13+
INSTALL_DIR="${HOME}/.local/bin"
14+
CONFIG_DIR="${HOME}/.config/oho"
15+
16+
# 颜色定义
17+
RED='\033[0;31m'
18+
GREEN='\033[0;32m'
19+
YELLOW='\033[1;33m'
20+
NC='\033[0m' # No Color
21+
22+
# 获取最新版本
23+
get_latest_version() {
24+
# 尝试从 GitHub API 获取最新 release
25+
if command -v curl &> /dev/null; then
26+
VERSION=$(curl -sSL https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/releases/latest 2>/dev/null | grep -o '"tag_name":.*' | cut -d'"' -f4 || echo "")
27+
elif command -v wget &> /dev/null; then
28+
VERSION=$(wget -qO- https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/releases/latest 2>/dev/null | grep -o '"tag_name":.*' | cut -d'"' -f4 || echo "")
29+
fi
30+
31+
if [ -z "$VERSION" ]; then
32+
echo "${YELLOW}无法获取最新版本,将从源码编译${NC}"
33+
VERSION="build-from-source"
34+
fi
35+
36+
echo "$VERSION"
37+
}
38+
39+
# 检测操作系统和架构
40+
detect_os_arch() {
41+
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
42+
ARCH=$(uname -m)
43+
44+
case "$ARCH" in
45+
x86_64)
46+
ARCH="amd64"
47+
;;
48+
aarch64|arm64)
49+
ARCH="arm64"
50+
;;
51+
armv7)
52+
ARCH="armv7"
53+
;;
54+
*)
55+
echo "${RED}不支持的架构: $ARCH${NC}"
56+
exit 1
57+
;;
58+
esac
59+
60+
# 标准化 OS 名称
61+
case "$OS" in
62+
linux)
63+
OS="linux"
64+
;;
65+
darwin)
66+
OS="darwin"
67+
;;
68+
*)
69+
echo "${RED}不支持的操作系统: $OS${NC}"
70+
exit 1
71+
;;
72+
esac
73+
74+
echo "${OS}-${ARCH}"
75+
}
76+
77+
# 下载预编译二进制
78+
download_binary() {
79+
local version="$1"
80+
local os_arch="$2"
81+
local download_url="https://github.com/${REPO_OWNER}/${REPO_NAME}/releases/download/${version}/${BINARY_NAME}-${os_arch}"
82+
local temp_file="/tmp/${BINARY_NAME}-${os_arch}"
83+
84+
echo "${YELLOW}下载中: ${download_url}${NC}"
85+
86+
if command -v curl &> /dev/null; then
87+
curl -L -o "$temp_file" "$download_url"
88+
elif command -v wget &> /dev/null; then
89+
wget -O "$temp_file" "$download_url"
90+
else
91+
echo "${RED}错误: 需要 curl 或 wget${NC}"
92+
return 1
93+
fi
94+
95+
if [ $? -ne 0 ]; then
96+
echo "${RED}下载失败${NC}"
97+
rm -f "$temp_file"
98+
return 1
99+
fi
100+
101+
# 移动到安装目录
102+
mkdir -p "$INSTALL_DIR"
103+
mv "$temp_file" "${INSTALL_DIR}/${BINARY_NAME}"
104+
chmod +x "${INSTALL_DIR}/${BINARY_NAME}"
105+
106+
echo "${GREEN}安装成功!${NC}"
107+
echo "二进制文件: ${INSTALL_DIR}/${BINARY_NAME}"
108+
}
109+
110+
# 从源码编译
111+
build_from_source() {
112+
echo "${YELLOW}从源码编译...${NC}"
113+
114+
# 检查 Go 是否安装
115+
if ! command -v go &> /dev/null; then
116+
echo "${RED}错误: 需要 Go 1.21+ 来编译${NC}"
117+
echo "请访问 https://golang.org/dl/ 安装 Go"
118+
exit 1
119+
fi
120+
121+
# 检查 Go 版本
122+
GO_VERSION=$(go version | grep -oP 'go\K[0-9]+\.[0-9]+')
123+
GO_MAJOR=$(echo "$GO_VERSION" | cut -d. -f1)
124+
GO_MINOR=$(echo "$GO_VERSION" | cut -d. -f2)
125+
126+
if [ "$GO_MAJOR" -lt 1 ] || ([ "$GO_MAJOR" -eq 1 ] && [ "$GO_MINOR" -lt 21 ]); then
127+
echo "${RED}错误: 需要 Go 1.21+${NC}"
128+
exit 1
129+
fi
130+
131+
# 创建临时目录
132+
TEMP_DIR=$(mktemp -d)
133+
cd "$TEMP_DIR"
134+
135+
# 克隆仓库
136+
echo "克隆仓库..."
137+
if command -v git &> /dev/null; then
138+
git clone --depth 1 "https://github.com/${REPO_OWNER}/${REPO_NAME}.git"
139+
else
140+
echo "${RED}错误: 需要 git${NC}"
141+
exit 1
142+
fi
143+
144+
cd "${REPO_NAME}/oho"
145+
146+
# 编译
147+
echo "编译中..."
148+
go build -o "${INSTALL_DIR}/${BINARY_NAME}" ./cmd
149+
150+
chmod +x "${INSTALL_DIR}/${BINARY_NAME}"
151+
152+
# 清理
153+
cd /
154+
rm -rf "$TEMP_DIR"
155+
156+
echo "${GREEN}编译安装成功!${NC}"
157+
echo "二进制文件: ${INSTALL_DIR}/${BINARY_NAME}"
158+
}
159+
160+
# 创建默认配置
161+
create_config() {
162+
mkdir -p "$CONFIG_DIR"
163+
164+
if [ ! -f "${CONFIG_DIR}/config.json" ]; then
165+
cat > "${CONFIG_DIR}/config.json" << EOF
166+
{
167+
"host": "127.0.0.1",
168+
"port": 4096,
169+
"username": "opencode",
170+
"password": "",
171+
"json": false
172+
}
173+
EOF
174+
echo "${GREEN}配置文件已创建: ${CONFIG_DIR}/config.json${NC}"
175+
fi
176+
}
177+
178+
# 添加到 PATH(如果需要)
179+
add_to_path() {
180+
# 检查是否已经在 PATH 中
181+
if [[ ":$PATH:" == *":${INSTALL_DIR}:"* ]]; then
182+
return
183+
fi
184+
185+
# 检测 shell 配置文件
186+
local shell_rc=""
187+
if [ -n "$ZSH_VERSION" ]; then
188+
shell_rc="${HOME}/.zshrc"
189+
elif [ -n "$BASH_VERSION" ]; then
190+
shell_rc="${HOME}/.bashrc"
191+
fi
192+
193+
if [ -n "$shell_rc" ] && [ -f "$shell_rc" ]; then
194+
# 检查是否已经添加过
195+
if ! grep -q "oho.*local/bin" "$shell_rc"; then
196+
echo "" >> "$shell_rc"
197+
echo "# oho CLI" >> "$shell_rc"
198+
echo "export PATH=\"\${HOME}/.local/bin:\$PATH\"" >> "$shell_rc"
199+
echo "${YELLOW}已将 ${INSTALL_DIR} 添加到 PATH${NC}"
200+
echo "请运行: source $shell_rc"
201+
fi
202+
fi
203+
}
204+
205+
# 验证安装
206+
verify_install() {
207+
if "${INSTALL_DIR}/${BINARY_NAME}" --version &> /dev/null; then
208+
echo "${GREEN}验证成功!${NC}"
209+
"${INSTALL_DIR}/${BINARY_NAME}" --version
210+
return 0
211+
else
212+
echo "${RED}验证失败${NC}"
213+
return 1
214+
fi
215+
}
216+
217+
# 显示帮助
218+
show_help() {
219+
cat << EOF
220+
oho 一键安装脚本
221+
222+
用法: $0 [选项]
223+
224+
选项:
225+
-h, --help 显示帮助信息
226+
-v, --version VERSION 指定版本 (默认: latest)
227+
-d, --dir DIRECTORY 指定安装目录 (默认: ~/.local/bin)
228+
-s, --source 强制从源码编译
229+
-c, --check 仅验证安装
230+
231+
示例:
232+
$0 # 安装最新版本
233+
$0 -s # 从源码编译
234+
$0 -d /usr/local/bin # 安装到指定目录
235+
236+
EOF
237+
}
238+
239+
# 主函数
240+
main() {
241+
local install_dir="$INSTALL_DIR"
242+
local version=""
243+
local force_source=false
244+
local check_only=false
245+
246+
# 解析参数
247+
while [[ $# -gt 0 ]]; do
248+
case $1 in
249+
-h|--help)
250+
show_help
251+
exit 0
252+
;;
253+
-v|--version)
254+
version="$2"
255+
shift 2
256+
;;
257+
-d|--dir)
258+
install_dir="$2"
259+
shift 2
260+
;;
261+
-s|--source)
262+
force_source=true
263+
shift
264+
;;
265+
-c|--check)
266+
check_only=true
267+
shift
268+
;;
269+
*)
270+
echo "${RED}未知选项: $1${NC}"
271+
show_help
272+
exit 1
273+
;;
274+
esac
275+
done
276+
277+
# 验证模式
278+
if [ "$check_only" = true ]; then
279+
if [ -x "${install_dir}/${BINARY_NAME}" ]; then
280+
echo "${GREEN}oho 已安装${NC}"
281+
"${install_dir}/${BINARY_NAME}" --version
282+
exit 0
283+
else
284+
echo "${RED}oho 未安装${NC}"
285+
exit 1
286+
fi
287+
fi
288+
289+
echo "=========================================="
290+
echo " oho 安装脚本"
291+
echo "=========================================="
292+
echo ""
293+
294+
# 设置安装目录
295+
INSTALL_DIR="$install_dir"
296+
297+
# 获取版本
298+
if [ -z "$version" ]; then
299+
version=$(get_latest_version)
300+
fi
301+
302+
echo "版本: $version"
303+
echo "安装目录: $INSTALL_DIR"
304+
echo ""
305+
306+
# 尝试下载或编译
307+
if [ "$force_source" = true ]; then
308+
build_from_source
309+
else
310+
os_arch=$(detect_os_arch)
311+
312+
# 尝试下载
313+
if ! download_binary "$version" "$os_arch"; then
314+
echo "${YELLOW}下载失败,尝试从源码编译...${NC}"
315+
build_from_source
316+
fi
317+
fi
318+
319+
# 创建配置
320+
create_config
321+
322+
# 添加到 PATH
323+
add_to_path
324+
325+
# 验证安装
326+
echo ""
327+
echo "=========================================="
328+
verify_install
329+
echo "=========================================="
330+
echo ""
331+
echo "使用说明:"
332+
echo " 1. 确保 ${INSTALL_DIR} 在 PATH 中"
333+
echo " 2. 配置 OpenCode Server 连接信息:"
334+
echo " export OPENCODE_SERVER_HOST=127.0.0.1"
335+
echo " export OPENCODE_SERVER_PORT=4096"
336+
echo " export OPENCODE_SERVER_PASSWORD=your-password"
337+
echo " 3. 运行: oho --help"
338+
echo ""
339+
echo "快速开始:"
340+
echo " oho global health # 检查服务器状态"
341+
echo " oho session list # 列出所有会话"
342+
echo " oho mcpserver # 启动 MCP 服务器"
343+
echo ""
344+
}
345+
346+
# 运行主函数
347+
main "$@"

0 commit comments

Comments
 (0)