feat: USB portable mode, remove pnpm dep, improve install UX
- Config/state/memory now saved to USB drive (portable-home/) - Remove pnpm dependency, use npm directly - Add spinner animation for long copy operations - Use tar instead of cp -R to avoid macOS resource fork issues - Add dashboard menu option [17] - Add safety warnings for shared/temporary computers - Simplify docs: remove Linux support, outdated pricing info - Add ~/.local/bin symlinks (no sudo needed)
This commit is contained in:
@@ -20,10 +20,9 @@ OpenClaw 支持大量国产模型,以下是推荐:
|
|||||||
- 注册: https://platform.moonshot.cn/
|
- 注册: https://platform.moonshot.cn/
|
||||||
- 免费额度: 有
|
- 免费额度: 有
|
||||||
|
|
||||||
3. 通义千问 Qwen(阿里)—— 免费额度最大 ★ 新手推荐
|
3. 通义千问 Qwen(阿里)—— 免费额度最大
|
||||||
- 注册: https://dashscope.console.aliyun.com/
|
- 注册: https://dashscope.console.aliyun.com/
|
||||||
- 免费额度: 新用户 1000万 tokens,每日 2000 次调用
|
- 免费额度: 非常多
|
||||||
- 国内直连,无需翻墙
|
|
||||||
|
|
||||||
4. 智谱 GLM(清华系)—— 学术场景强
|
4. 智谱 GLM(清华系)—— 学术场景强
|
||||||
- 注册: https://open.bigmodel.cn/
|
- 注册: https://open.bigmodel.cn/
|
||||||
@@ -41,19 +40,8 @@ OpenClaw 支持大量国产模型,以下是推荐:
|
|||||||
8. 小米 Mimo
|
8. 小米 Mimo
|
||||||
- 注册: https://dev.mi.com/mimo
|
- 注册: https://dev.mi.com/mimo
|
||||||
|
|
||||||
9. 阶跃星辰 StepFun —— Step 3.5 Flash
|
|
||||||
- 注册: https://platform.stepfun.com/
|
|
||||||
- 免费: OpenRouter 免费使用 Step 3.5 Flash
|
|
||||||
- 首月 Deep Research API 免费
|
|
||||||
|
|
||||||
在启动菜单选 [5] 即可一键配置
|
在启动菜单选 [5] 即可一键配置
|
||||||
|
|
||||||
💡 省钱提示(2026年3月):
|
|
||||||
- 零成本起步: 先用通义千问 Qwen(1000万免费 tokens)
|
|
||||||
- 性价比之王: DeepSeek(约 ¥1/百万 tokens,编程最强)
|
|
||||||
- 免费试用: 阶跃星辰 Step 3.5 Flash(通过 OpenRouter 免费)
|
|
||||||
- 以上优惠信息可能变化,请以各平台官网为准
|
|
||||||
|
|
||||||
|
|
||||||
第二步:选择聊天平台
|
第二步:选择聊天平台
|
||||||
══════════════════════
|
══════════════════════
|
||||||
@@ -150,17 +138,19 @@ U-Claw 已预装 52 个技能,以下是最实用的:
|
|||||||
遇到问题?
|
遇到问题?
|
||||||
══════════════════════
|
══════════════════════
|
||||||
|
|
||||||
1. 插 U 盘
|
1. 插 U 盘,双击「启动菜单」
|
||||||
2. Mac/Windows: 打开「启动菜单」
|
2. 选 [8] 诊断修复
|
||||||
Linux: 运行 `bash ./运行.sh`
|
3. 如果修不好,选 [11] 重置
|
||||||
3. 选 [8] 诊断修复
|
4. 重置前会自动提醒你备份
|
||||||
4. 如果修不好,选 [11] 重置
|
|
||||||
5. 重置前会自动提醒你备份
|
安全提醒:
|
||||||
|
- 老电脑、共享电脑、公司电脑、临时借用电脑
|
||||||
|
更推荐直接从 U 盘运行
|
||||||
|
- 尽量不要把 OpenClaw 和配置安装到不受你控制的本机里
|
||||||
|
- 直接从 U 盘运行时,配置和记忆会保存在 U 盘中
|
||||||
|
- 同一只 U 盘换一台电脑继续插上,仍然能接着用
|
||||||
|
- 但运行过程中不要拔盘,拔掉后当前会话会结束
|
||||||
|
|
||||||
加入社区:
|
加入社区:
|
||||||
- 官网: u-claw.org
|
- u-claw.org
|
||||||
- GitHub: github.com/dongsheng123132/u-claw
|
- GitHub: github.com/dongsheng123132/u-claw
|
||||||
- 邮箱: hefangsheng@gmail.com
|
|
||||||
- 微信: 扫描 U 盘内「微信二维码.jpg」添加作者
|
|
||||||
- 小红书: https://xhslink.com/m/6mf7Mq2M5wP
|
|
||||||
(技术咨询、合作交流、问题反馈、教程更新)
|
|
||||||
|
|||||||
@@ -21,11 +21,10 @@ U 盘里有什么?
|
|||||||
═══════════════
|
═══════════════
|
||||||
U-Claw/
|
U-Claw/
|
||||||
├── 运行.command <- Mac 用户双击这个
|
├── 运行.command <- Mac 用户双击这个
|
||||||
├── 运行.sh <- Linux 用户运行: bash ./运行.sh
|
|
||||||
├── 运行.bat <- Windows 用户双击这个
|
├── 运行.bat <- Windows 用户双击这个
|
||||||
├── 安装到电脑.command <- Mac 永久安装
|
├── 安装到电脑.command <- Mac 永久安装
|
||||||
├── 安装到电脑.bat <- Windows 永久安装
|
├── 安装到电脑.bat <- Windows 永久安装
|
||||||
├── runtime/ <- Node.js 运行环境 (Mac/Linux/Win)
|
├── runtime/ <- Node.js 运行环境 (Mac/Win)
|
||||||
├── openclaw/ <- OpenClaw 源码 + 依赖
|
├── openclaw/ <- OpenClaw 源码 + 依赖
|
||||||
├── memory/ <- AI 记忆文件
|
├── memory/ <- AI 记忆文件
|
||||||
├── persona/ <- AI 人格配置
|
├── persona/ <- AI 人格配置
|
||||||
@@ -36,7 +35,7 @@ U-Claw/
|
|||||||
快速开始
|
快速开始
|
||||||
═══════════════
|
═══════════════
|
||||||
|
|
||||||
【方式一:直接从 U 盘运行(免安装)】
|
【方式一:直接从 U 盘运行(推荐)】
|
||||||
|
|
||||||
Mac 用户:
|
Mac 用户:
|
||||||
1. 插入 U 盘
|
1. 插入 U 盘
|
||||||
@@ -51,16 +50,19 @@ U-Claw/
|
|||||||
3. 双击 "运行.bat"
|
3. 双击 "运行.bat"
|
||||||
4. 等待启动完成
|
4. 等待启动完成
|
||||||
|
|
||||||
Linux 用户:
|
首次运行可能需要几分钟检查环境(主要文件已预打包)
|
||||||
1. 插入 U 盘
|
首次配置、记忆和状态会直接保存在这只 U 盘里
|
||||||
2. 打开 U-Claw 文件夹
|
回家再插到另一台电脑,仍然可以继续使用同一套配置
|
||||||
3. 运行: chmod +x 运行.sh && ./运行.sh
|
如果是老电脑、共享电脑、公司电脑、临时借来的电脑,
|
||||||
4. 等待启动完成
|
强烈建议用这种方式,不要安装到本机。
|
||||||
|
|
||||||
首次运行可能需要几分钟安装依赖(已预打包,无需联网)
|
注意:
|
||||||
|
1. 便携模式运行时,U 盘不能拔掉
|
||||||
|
2. 拔掉 U 盘后,这次运行就会结束
|
||||||
|
3. 但下次把同一只 U 盘插到别的电脑上,仍可继续运行
|
||||||
|
|
||||||
|
|
||||||
【方式二:安装到电脑(推荐)】
|
【方式二:安装到电脑(仅推荐你自己的电脑)】
|
||||||
|
|
||||||
Mac 用户:
|
Mac 用户:
|
||||||
1. 双击 "安装到电脑.command"
|
1. 双击 "安装到电脑.command"
|
||||||
@@ -72,17 +74,14 @@ U-Claw/
|
|||||||
2. 按提示操作
|
2. 按提示操作
|
||||||
3. 安装后在命令提示符输入 openclaw 即可使用
|
3. 安装后在命令提示符输入 openclaw 即可使用
|
||||||
|
|
||||||
Linux 用户:
|
|
||||||
暂不提供一键安装到系统。
|
|
||||||
直接运行 `bash ./运行.sh` 即可使用。
|
|
||||||
|
|
||||||
安装位置: ~/.uclaw/ (Mac) 或 %USERPROFILE%\.uclaw\ (Win)
|
安装位置: ~/.uclaw/ (Mac) 或 %USERPROFILE%\.uclaw\ (Win)
|
||||||
|
注意: 这会把程序和配置写入本机。
|
||||||
|
如果不是你自己的长期使用电脑,请尽量不要选这个方式。
|
||||||
|
|
||||||
|
|
||||||
系统要求
|
系统要求
|
||||||
═══════════════
|
═══════════════
|
||||||
- macOS 12+ (Intel 或 Apple Silicon)
|
- macOS 12+ (Intel 或 Apple Silicon)
|
||||||
- Linux x64 (glibc 环境,bash)
|
|
||||||
- Windows 10/11 (64位)
|
- Windows 10/11 (64位)
|
||||||
- 内存: 2GB 以上(推荐 4GB+)
|
- 内存: 2GB 以上(推荐 4GB+)
|
||||||
- 磁盘: 2GB 可用空间
|
- 磁盘: 2GB 可用空间
|
||||||
@@ -109,6 +108,10 @@ A: U-Claw 自带 Node.js,请确保从 U-Claw 文件夹内启动
|
|||||||
Q: 如何配置 AI 模型的 API Key?
|
Q: 如何配置 AI 模型的 API Key?
|
||||||
A: 运行 openclaw 后按引导配置,或编辑 openclaw/.env 文件
|
A: 运行 openclaw 后按引导配置,或编辑 openclaw/.env 文件
|
||||||
|
|
||||||
|
Q: 能换电脑继续用吗?
|
||||||
|
A: 可以。使用「直接从 U 盘运行」时,配置和状态保存在 U 盘里。
|
||||||
|
同一只 U 盘插到另一台兼容电脑上,可以继续使用。
|
||||||
|
|
||||||
Q: 能离线使用吗?
|
Q: 能离线使用吗?
|
||||||
A: OpenClaw 本身需要联网调用 AI API(如 Claude、DeepSeek)。
|
A: OpenClaw 本身需要联网调用 AI API(如 Claude、DeepSeek)。
|
||||||
但安装过程完全离线,不需要访问 GitHub 或 npm。
|
但安装过程完全离线,不需要访问 GitHub 或 npm。
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
OPENCLAW_DIR="$UCLAW_DIR/openclaw"
|
OPENCLAW_DIR="$UCLAW_DIR/openclaw"
|
||||||
|
PORTABLE_HOME="$UCLAW_DIR/portable-home"
|
||||||
|
PORTABLE_STATE_DIR="$PORTABLE_HOME/.openclaw"
|
||||||
|
PORTABLE_CONFIG_PATH="$PORTABLE_STATE_DIR/openclaw.json"
|
||||||
|
|
||||||
# 颜色
|
# 颜色
|
||||||
RED='\033[0;31m'
|
RED='\033[0;31m'
|
||||||
@@ -29,22 +32,12 @@ else
|
|||||||
fi
|
fi
|
||||||
NODE_BIN="$NODE_DIR/bin/node"
|
NODE_BIN="$NODE_DIR/bin/node"
|
||||||
NPM_BIN="$NODE_DIR/bin/npm"
|
NPM_BIN="$NODE_DIR/bin/npm"
|
||||||
PNPM_BIN="$NODE_DIR/bin/pnpm"
|
|
||||||
export PATH="$NODE_DIR/bin:$PATH"
|
export PATH="$NODE_DIR/bin:$PATH"
|
||||||
|
export OPENCLAW_HOME="$PORTABLE_HOME"
|
||||||
|
export OPENCLAW_STATE_DIR="$PORTABLE_STATE_DIR"
|
||||||
|
export OPENCLAW_CONFIG_PATH="$PORTABLE_CONFIG_PATH"
|
||||||
|
|
||||||
ensure_pnpm() {
|
mkdir -p "$PORTABLE_STATE_DIR"
|
||||||
if [ -x "$PNPM_BIN" ]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e " ${YELLOW}缺少 pnpm,正在补充安装...${NC}"
|
|
||||||
"$NPM_BIN" install -g pnpm --registry=https://registry.npmmirror.com 2>&1
|
|
||||||
|
|
||||||
if [ ! -x "$PNPM_BIN" ]; then
|
|
||||||
echo -e " ${RED}错误: pnpm 安装失败,无法继续构建${NC}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查安装状态
|
# 检查安装状态
|
||||||
check_status() {
|
check_status() {
|
||||||
@@ -52,11 +45,13 @@ check_status() {
|
|||||||
HAS_DIST="no"
|
HAS_DIST="no"
|
||||||
HAS_ENV="no"
|
HAS_ENV="no"
|
||||||
INSTALLED="no"
|
INSTALLED="no"
|
||||||
|
PORTABLE_READY="no"
|
||||||
|
|
||||||
[ -d "$OPENCLAW_DIR/node_modules" ] && HAS_MODULES="yes"
|
[ -d "$OPENCLAW_DIR/node_modules" ] && HAS_MODULES="yes"
|
||||||
[ -d "$OPENCLAW_DIR/dist" ] && HAS_DIST="yes"
|
[ -d "$OPENCLAW_DIR/dist" ] && HAS_DIST="yes"
|
||||||
[ -f "$OPENCLAW_DIR/.env" ] && HAS_ENV="yes"
|
[ -f "$OPENCLAW_DIR/.env" ] && HAS_ENV="yes"
|
||||||
[ -d "$HOME/.uclaw/openclaw" ] && INSTALLED="yes"
|
[ -d "$HOME/.uclaw/openclaw" ] && INSTALLED="yes"
|
||||||
|
[ -f "$PORTABLE_CONFIG_PATH" ] && PORTABLE_READY="yes"
|
||||||
}
|
}
|
||||||
|
|
||||||
# 显示主菜单
|
# 显示主菜单
|
||||||
@@ -85,17 +80,21 @@ show_menu() {
|
|||||||
[ "$HAS_DIST" = "yes" ] && STATUS_BUILD="${GREEN}已构建${NC}"
|
[ "$HAS_DIST" = "yes" ] && STATUS_BUILD="${GREEN}已构建${NC}"
|
||||||
[ "$INSTALLED" = "yes" ] && STATUS_INST="${GREEN}已安装${NC}"
|
[ "$INSTALLED" = "yes" ] && STATUS_INST="${GREEN}已安装${NC}"
|
||||||
|
|
||||||
echo -e " ${CYAN}║${NC} 系统: $(uname -m) | Node: $STATUS_NODE ${CYAN}║${NC}"
|
local STATUS_PORTABLE="${RED}未配置${NC}"
|
||||||
echo -e " ${CYAN}║${NC} 依赖: $STATUS_MOD | 构建: $STATUS_BUILD | 电脑安装: $STATUS_INST ${CYAN}║${NC}"
|
[ "$PORTABLE_READY" = "yes" ] && STATUS_PORTABLE="${GREEN}已配置${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} 系统: $(uname -m) ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} Node: $STATUS_NODE ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} 依赖: $STATUS_MOD 构建: $STATUS_BUILD ${CYAN}║${NC}"
|
||||||
|
echo -e " ${CYAN}║${NC} 便携配置: $STATUS_PORTABLE 电脑安装: $STATUS_INST ${CYAN}║${NC}"
|
||||||
echo -e " ${CYAN}║${NC} ${CYAN}║${NC}"
|
echo -e " ${CYAN}║${NC} ${CYAN}║${NC}"
|
||||||
echo -e " ${CYAN}╠════════════════════════════════════════════════════════╣${NC}"
|
echo -e " ${CYAN}╠════════════════════════════════════════════════════════╣${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${WHITE}${BOLD} ━━━━ 安装 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
echo -e " ${WHITE}${BOLD} ━━━━ 安装 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${GREEN} [1]${NC} 🚀 一键安装 OpenClaw 到电脑(推荐)"
|
echo -e " ${GREEN} [1]${NC} 🚀 安装 OpenClaw 到本机(仅限你自己的电脑)"
|
||||||
echo -e " ${GREEN} [2]${NC} 📦 仅安装依赖(npm install)"
|
echo -e " ${GREEN} [2]${NC} 📦 仅安装依赖(npm install)"
|
||||||
echo -e " ${GREEN} [3]${NC} 🔨 仅构建项目(npm build)"
|
echo -e " ${GREEN} [3]${NC} 🔨 仅构建项目(npm build)"
|
||||||
echo -e " ${GREEN} [4]${NC} ▶️ 直接从 U 盘运行(免安装)"
|
echo -e " ${GREEN} [4]${NC} ▶️ 直接从 U 盘运行(配置也保存在 U 盘里)"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${WHITE}${BOLD} ━━━━ 中国优化 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
echo -e " ${WHITE}${BOLD} ━━━━ 中国优化 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -120,6 +119,7 @@ show_menu() {
|
|||||||
echo ""
|
echo ""
|
||||||
echo -e " ${MAGENTA} [15]${NC} 📋 查看使用说明"
|
echo -e " ${MAGENTA} [15]${NC} 📋 查看使用说明"
|
||||||
echo -e " ${MAGENTA} [16]${NC} ℹ️ 系统信息"
|
echo -e " ${MAGENTA} [16]${NC} ℹ️ 系统信息"
|
||||||
|
echo -e " ${MAGENTA} [17]${NC} 🌐 打开本地网页控制台"
|
||||||
echo -e " ${DIM} [0]${NC} 退出"
|
echo -e " ${DIM} [0]${NC} 退出"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${CYAN}╚════════════════════════════════════════════════════════╝${NC}"
|
echo -e " ${CYAN}╚════════════════════════════════════════════════════════╝${NC}"
|
||||||
@@ -137,14 +137,7 @@ ensure_deps() {
|
|||||||
if [ ! -d "$OPENCLAW_DIR/dist" ]; then
|
if [ ! -d "$OPENCLAW_DIR/dist" ]; then
|
||||||
echo -e " ${YELLOW}正在构建...${NC}"
|
echo -e " ${YELLOW}正在构建...${NC}"
|
||||||
cd "$OPENCLAW_DIR"
|
cd "$OPENCLAW_DIR"
|
||||||
if ! ensure_pnpm; then
|
"$NODE_BIN" "$NPM_BIN" run build 2>&1 || true
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
"$PNPM_BIN" run build 2>&1
|
|
||||||
if [ ! -d "$OPENCLAW_DIR/dist" ]; then
|
|
||||||
echo -e " ${RED}构建失败!请检查上方错误信息${NC}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo -e " ${GREEN}构建完成${NC}"
|
echo -e " ${GREEN}构建完成${NC}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -154,6 +147,9 @@ do_install() {
|
|||||||
echo ""
|
echo ""
|
||||||
echo -e " ${CYAN}${BOLD}━━━ 一键安装 OpenClaw 到电脑 ━━━${NC}"
|
echo -e " ${CYAN}${BOLD}━━━ 一键安装 OpenClaw 到电脑 ━━━${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
|
echo -e " ${YELLOW}提醒:如果这是老电脑、临时电脑、公司电脑或别人的电脑,${NC}"
|
||||||
|
echo -e " ${YELLOW}更推荐返回主菜单选择 [4] 从 U 盘运行,不要安装到本机。${NC}"
|
||||||
|
echo ""
|
||||||
bash "$UCLAW_DIR/安装到电脑.command"
|
bash "$UCLAW_DIR/安装到电脑.command"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,14 +172,7 @@ do_build() {
|
|||||||
echo ""
|
echo ""
|
||||||
ensure_deps
|
ensure_deps
|
||||||
cd "$OPENCLAW_DIR"
|
cd "$OPENCLAW_DIR"
|
||||||
if ! ensure_pnpm; then
|
"$NODE_BIN" "$NPM_BIN" run build 2>&1
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
"$PNPM_BIN" run build 2>&1
|
|
||||||
if [ ! -d "$OPENCLAW_DIR/dist" ]; then
|
|
||||||
echo -e " ${RED}构建失败!请检查上方错误信息${NC}"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${GREEN}构建完成!${NC}"
|
echo -e " ${GREEN}构建完成!${NC}"
|
||||||
}
|
}
|
||||||
@@ -193,15 +182,40 @@ do_run() {
|
|||||||
echo ""
|
echo ""
|
||||||
echo -e " ${CYAN}${BOLD}━━━ 从 U 盘启动 OpenClaw ━━━${NC}"
|
echo -e " ${CYAN}${BOLD}━━━ 从 U 盘启动 OpenClaw ━━━${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
|
echo -e " ${GREEN}便携模式说明:配置、状态、记忆都会写在这只 U 盘里。${NC}"
|
||||||
|
echo -e " ${GREEN}拔掉 U 盘后当前会话会结束,但换一台电脑再插上还能继续用。${NC}"
|
||||||
|
echo ""
|
||||||
ensure_deps
|
ensure_deps
|
||||||
cd "$OPENCLAW_DIR"
|
cd "$OPENCLAW_DIR"
|
||||||
# 首次运行走 onboard,之后直接启动
|
if [ ! -f "$PORTABLE_CONFIG_PATH" ]; then
|
||||||
if [ ! -f "$HOME/.openclaw/openclaw.json" ]; then
|
echo -e " ${YELLOW}检测到你还没有完成首次配置。${NC}"
|
||||||
echo -e " ${YELLOW}首次配置...${NC}"
|
echo " 首次配置会保存在 U 盘中,不会默认写进这台电脑。"
|
||||||
"$NODE_BIN" openclaw.mjs onboard --install-daemon 2>&1
|
echo ""
|
||||||
|
read -p " 现在开始首次配置? (y/n) " -n 1 -r
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
"$NODE_BIN" openclaw.mjs onboard
|
||||||
|
echo ""
|
||||||
|
echo -e " ${GREEN}首次配置完成,已保存到 U 盘。${NC}"
|
||||||
|
echo " 接下来可以选 [17] 打开网页控制台。"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
"$NODE_BIN" openclaw.mjs dashboard || "$NODE_BIN" openclaw.mjs
|
||||||
fi
|
fi
|
||||||
echo -e " ${CYAN}启动 OpenClaw 服务...${NC}"
|
}
|
||||||
"$NODE_BIN" openclaw.mjs 2>&1 || "$NODE_BIN" "$NPM_BIN" start 2>&1
|
|
||||||
|
do_dashboard() {
|
||||||
|
echo ""
|
||||||
|
echo -e " ${CYAN}${BOLD}━━━ 打开本地网页控制台 ━━━${NC}"
|
||||||
|
echo ""
|
||||||
|
ensure_deps
|
||||||
|
cd "$OPENCLAW_DIR"
|
||||||
|
if [ ! -f "$PORTABLE_CONFIG_PATH" ]; then
|
||||||
|
echo -e " ${YELLOW}你还没有完成 U 盘便携配置。请先选 [4] 从 U 盘运行。${NC}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
"$NODE_BIN" openclaw.mjs dashboard || "$NODE_BIN" openclaw.mjs
|
||||||
}
|
}
|
||||||
|
|
||||||
# [5] 配置国产模型
|
# [5] 配置国产模型
|
||||||
@@ -233,7 +247,7 @@ do_china_models() {
|
|||||||
echo -e " ${CYAN}配置 DeepSeek${NC}"
|
echo -e " ${CYAN}配置 DeepSeek${NC}"
|
||||||
echo " 获取 API Key: https://platform.deepseek.com/"
|
echo " 获取 API Key: https://platform.deepseek.com/"
|
||||||
echo ""
|
echo ""
|
||||||
read -s -p " 请输入 DeepSeek API Key: " API_KEY; echo
|
read -p " 请输入 DeepSeek API Key: " API_KEY
|
||||||
if [ -n "$API_KEY" ]; then
|
if [ -n "$API_KEY" ]; then
|
||||||
grep -v "OPENAI_API_KEY\|OPENAI_BASE_URL" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
grep -v "OPENAI_API_KEY\|OPENAI_BASE_URL" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
||||||
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
||||||
@@ -246,7 +260,7 @@ do_china_models() {
|
|||||||
echo -e " ${CYAN}配置 Kimi (月之暗面)${NC}"
|
echo -e " ${CYAN}配置 Kimi (月之暗面)${NC}"
|
||||||
echo " 获取 API Key: https://platform.moonshot.cn/"
|
echo " 获取 API Key: https://platform.moonshot.cn/"
|
||||||
echo ""
|
echo ""
|
||||||
read -s -p " 请输入 Moonshot API Key: " API_KEY; echo
|
read -p " 请输入 Moonshot API Key: " API_KEY
|
||||||
if [ -n "$API_KEY" ]; then
|
if [ -n "$API_KEY" ]; then
|
||||||
grep -v "OPENAI_API_KEY\|OPENAI_BASE_URL" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
grep -v "OPENAI_API_KEY\|OPENAI_BASE_URL" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
||||||
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
||||||
@@ -259,7 +273,7 @@ do_china_models() {
|
|||||||
echo -e " ${CYAN}配置通义千问 Qwen${NC}"
|
echo -e " ${CYAN}配置通义千问 Qwen${NC}"
|
||||||
echo " 获取 API Key: https://dashscope.console.aliyun.com/"
|
echo " 获取 API Key: https://dashscope.console.aliyun.com/"
|
||||||
echo ""
|
echo ""
|
||||||
read -s -p " 请输入 Qwen API Key: " API_KEY; echo
|
read -p " 请输入 Qwen API Key: " API_KEY
|
||||||
if [ -n "$API_KEY" ]; then
|
if [ -n "$API_KEY" ]; then
|
||||||
grep -v "ZAI_API_KEY" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
grep -v "ZAI_API_KEY" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
||||||
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
||||||
@@ -272,7 +286,7 @@ do_china_models() {
|
|||||||
echo " 获取 API Key: https://open.bigmodel.cn/"
|
echo " 获取 API Key: https://open.bigmodel.cn/"
|
||||||
echo " 注意: 通过火山引擎(Volcano Engine)接入"
|
echo " 注意: 通过火山引擎(Volcano Engine)接入"
|
||||||
echo ""
|
echo ""
|
||||||
read -s -p " 请输入 API Key: " API_KEY; echo
|
read -p " 请输入 API Key: " API_KEY
|
||||||
if [ -n "$API_KEY" ]; then
|
if [ -n "$API_KEY" ]; then
|
||||||
echo "# 智谱GLM (via Volcano Engine)" >> "$ENV_FILE"
|
echo "# 智谱GLM (via Volcano Engine)" >> "$ENV_FILE"
|
||||||
echo "VOLCENGINE_API_KEY=$API_KEY" >> "$ENV_FILE"
|
echo "VOLCENGINE_API_KEY=$API_KEY" >> "$ENV_FILE"
|
||||||
@@ -283,7 +297,7 @@ do_china_models() {
|
|||||||
echo -e " ${CYAN}配置 MiniMax${NC}"
|
echo -e " ${CYAN}配置 MiniMax${NC}"
|
||||||
echo " 获取 API Key: https://platform.minimaxi.com/"
|
echo " 获取 API Key: https://platform.minimaxi.com/"
|
||||||
echo ""
|
echo ""
|
||||||
read -s -p " 请输入 MiniMax API Key: " API_KEY; echo
|
read -p " 请输入 MiniMax API Key: " API_KEY
|
||||||
if [ -n "$API_KEY" ]; then
|
if [ -n "$API_KEY" ]; then
|
||||||
grep -v "MINIMAX_API_KEY" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
grep -v "MINIMAX_API_KEY" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
||||||
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
||||||
@@ -295,7 +309,7 @@ do_china_models() {
|
|||||||
echo -e " ${CYAN}配置豆包 Doubao (字节跳动)${NC}"
|
echo -e " ${CYAN}配置豆包 Doubao (字节跳动)${NC}"
|
||||||
echo " 获取 API Key: https://console.volcengine.com/ark"
|
echo " 获取 API Key: https://console.volcengine.com/ark"
|
||||||
echo ""
|
echo ""
|
||||||
read -s -p " 请输入火山引擎 API Key: " API_KEY; echo
|
read -p " 请输入火山引擎 API Key: " API_KEY
|
||||||
if [ -n "$API_KEY" ]; then
|
if [ -n "$API_KEY" ]; then
|
||||||
grep -v "VOLCENGINE_API_KEY" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
grep -v "VOLCENGINE_API_KEY" "$ENV_FILE" > "$ENV_FILE.tmp" 2>/dev/null || true
|
||||||
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
mv "$ENV_FILE.tmp" "$ENV_FILE"
|
||||||
@@ -307,7 +321,7 @@ do_china_models() {
|
|||||||
echo -e " ${CYAN}配置百度千帆${NC}"
|
echo -e " ${CYAN}配置百度千帆${NC}"
|
||||||
echo " 获取 API Key: https://console.bce.baidu.com/qianfan/"
|
echo " 获取 API Key: https://console.bce.baidu.com/qianfan/"
|
||||||
echo ""
|
echo ""
|
||||||
read -s -p " 请输入千帆 API Key: " API_KEY; echo
|
read -p " 请输入千帆 API Key: " API_KEY
|
||||||
if [ -n "$API_KEY" ]; then
|
if [ -n "$API_KEY" ]; then
|
||||||
echo "QIANFAN_API_KEY=$API_KEY" >> "$ENV_FILE"
|
echo "QIANFAN_API_KEY=$API_KEY" >> "$ENV_FILE"
|
||||||
echo -e " ${GREEN}百度千帆已配置!${NC}"
|
echo -e " ${GREEN}百度千帆已配置!${NC}"
|
||||||
@@ -317,7 +331,7 @@ do_china_models() {
|
|||||||
echo -e " ${CYAN}配置小米 Mimo${NC}"
|
echo -e " ${CYAN}配置小米 Mimo${NC}"
|
||||||
echo " 获取 API Key: https://dev.mi.com/mimo"
|
echo " 获取 API Key: https://dev.mi.com/mimo"
|
||||||
echo ""
|
echo ""
|
||||||
read -s -p " 请输入 Mimo API Key: " API_KEY; echo
|
read -p " 请输入 Mimo API Key: " API_KEY
|
||||||
if [ -n "$API_KEY" ]; then
|
if [ -n "$API_KEY" ]; then
|
||||||
echo "MIMO_API_KEY=$API_KEY" >> "$ENV_FILE"
|
echo "MIMO_API_KEY=$API_KEY" >> "$ENV_FILE"
|
||||||
echo -e " ${GREEN}小米 Mimo 已配置!${NC}"
|
echo -e " ${GREEN}小米 Mimo 已配置!${NC}"
|
||||||
@@ -862,13 +876,14 @@ while true; do
|
|||||||
14) do_china_guide ;;
|
14) do_china_guide ;;
|
||||||
15) do_readme ;;
|
15) do_readme ;;
|
||||||
16) do_sysinfo ;;
|
16) do_sysinfo ;;
|
||||||
|
17) do_dashboard ;;
|
||||||
0)
|
0)
|
||||||
echo -e " ${CYAN}再见! 🦞${NC}"
|
echo -e " ${CYAN}再见! 🦞${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
exit 0
|
exit 0
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo -e " ${RED}无效选择,请输入 0-16${NC}"
|
echo -e " ${RED}无效选择,请输入 0-17${NC}"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
# 将 OpenClaw 及运行环境永久安装到电脑上
|
# 将 OpenClaw 及运行环境永久安装到电脑上
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
INSTALL_DIR="$HOME/.uclaw"
|
INSTALL_DIR="$HOME/.uclaw"
|
||||||
|
|
||||||
@@ -13,6 +15,52 @@ RED='\033[0;31m'
|
|||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
|
run_with_spinner() {
|
||||||
|
local message="$1"
|
||||||
|
shift
|
||||||
|
local tmp_log
|
||||||
|
tmp_log="$(mktemp -t uclaw-install.XXXXXX)"
|
||||||
|
"$@" >"$tmp_log" 2>&1 &
|
||||||
|
local cmd_pid=$!
|
||||||
|
local frames='|/-\'
|
||||||
|
local i=0
|
||||||
|
|
||||||
|
while kill -0 "$cmd_pid" 2>/dev/null; do
|
||||||
|
local frame="${frames:i%4:1}"
|
||||||
|
printf "\r %b[%s]%b %s" "$CYAN" "$frame" "$NC" "$message"
|
||||||
|
i=$((i + 1))
|
||||||
|
sleep 0.2
|
||||||
|
done
|
||||||
|
|
||||||
|
wait "$cmd_pid"
|
||||||
|
local status=$?
|
||||||
|
printf "\r"
|
||||||
|
|
||||||
|
if [ $status -ne 0 ]; then
|
||||||
|
echo -e " ${RED}安装步骤失败:${message}${NC}"
|
||||||
|
sed -n '1,120p' "$tmp_log"
|
||||||
|
rm -f "$tmp_log"
|
||||||
|
exit $status
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e " ${GREEN}完成${NC} ${message}"
|
||||||
|
rm -f "$tmp_log"
|
||||||
|
}
|
||||||
|
|
||||||
|
copy_tree_quiet() {
|
||||||
|
local src="$1"
|
||||||
|
local dst="$2"
|
||||||
|
mkdir -p "$dst"
|
||||||
|
(
|
||||||
|
export COPYFILE_DISABLE=1
|
||||||
|
cd "$src"
|
||||||
|
tar --exclude='.DS_Store' --exclude='._*' -cf - .
|
||||||
|
) | (
|
||||||
|
cd "$dst"
|
||||||
|
tar -xpf -
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${CYAN}"
|
echo -e "${CYAN}"
|
||||||
@@ -25,6 +73,10 @@ echo ""
|
|||||||
echo " 安装位置: $INSTALL_DIR"
|
echo " 安装位置: $INSTALL_DIR"
|
||||||
echo " 安装内容: Node.js + OpenClaw + 所有依赖"
|
echo " 安装内容: Node.js + OpenClaw + 所有依赖"
|
||||||
echo ""
|
echo ""
|
||||||
|
echo -e " ${YELLOW}安全提醒: 这会把 OpenClaw 和配置写入当前电脑。${NC}"
|
||||||
|
echo -e " ${YELLOW}如果这是老电脑、共享电脑、公司电脑或临时机器,${NC}"
|
||||||
|
echo -e " ${YELLOW}更推荐回到主菜单选择「直接从 U 盘运行」。${NC}"
|
||||||
|
echo ""
|
||||||
read -p " 是否继续安装? (y/n) " -n 1 -r
|
read -p " 是否继续安装? (y/n) " -n 1 -r
|
||||||
echo ""
|
echo ""
|
||||||
echo ""
|
echo ""
|
||||||
@@ -48,15 +100,24 @@ mkdir -p "$INSTALL_DIR"
|
|||||||
|
|
||||||
echo -e " ${CYAN}[2/4] 安装 Node.js 运行环境...${NC}"
|
echo -e " ${CYAN}[2/4] 安装 Node.js 运行环境...${NC}"
|
||||||
rm -rf "$INSTALL_DIR/node"
|
rm -rf "$INSTALL_DIR/node"
|
||||||
cp -R "$NODE_SRC" "$INSTALL_DIR/node"
|
mkdir -p "$INSTALL_DIR/node"
|
||||||
echo -e " ${GREEN}Node.js $($INSTALL_DIR/node/bin/node --version) 已安装${NC}"
|
run_with_spinner "复制 Node.js 运行环境..." copy_tree_quiet "$NODE_SRC" "$INSTALL_DIR/node"
|
||||||
|
if [ ! -x "$INSTALL_DIR/node/bin/node" ]; then
|
||||||
|
echo -e " ${RED}Node.js 安装失败:$INSTALL_DIR/node/bin/node 不存在${NC}"
|
||||||
|
echo -e " ${YELLOW}请先确认 U 盘复制完成,再重新运行安装。${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
NODE_VERSION_INSTALLED="$("$INSTALL_DIR/node/bin/node" --version)"
|
||||||
|
echo -e " ${GREEN}Node.js ${NODE_VERSION_INSTALLED} 已安装${NC}"
|
||||||
|
|
||||||
echo -e " ${CYAN}[3/4] 安装 OpenClaw...${NC}"
|
echo -e " ${CYAN}[3/4] 安装 OpenClaw...${NC}"
|
||||||
|
echo -e " ${YELLOW}这一步会复制约 861M 文件,首次安装通常需要 3-10 分钟,请耐心等待...${NC}"
|
||||||
if [ -d "$INSTALL_DIR/openclaw" ] && [ -f "$INSTALL_DIR/openclaw/.env" ]; then
|
if [ -d "$INSTALL_DIR/openclaw" ] && [ -f "$INSTALL_DIR/openclaw/.env" ]; then
|
||||||
cp "$INSTALL_DIR/openclaw/.env" "/tmp/.uclaw-env-backup" 2>/dev/null || true
|
cp "$INSTALL_DIR/openclaw/.env" "/tmp/.uclaw-env-backup" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
rm -rf "$INSTALL_DIR/openclaw"
|
rm -rf "$INSTALL_DIR/openclaw"
|
||||||
cp -R "$UCLAW_DIR/openclaw" "$INSTALL_DIR/openclaw"
|
mkdir -p "$INSTALL_DIR/openclaw"
|
||||||
|
run_with_spinner "复制 OpenClaw 主程序和依赖..." copy_tree_quiet "$UCLAW_DIR/openclaw" "$INSTALL_DIR/openclaw"
|
||||||
if [ -f "/tmp/.uclaw-env-backup" ]; then
|
if [ -f "/tmp/.uclaw-env-backup" ]; then
|
||||||
cp "/tmp/.uclaw-env-backup" "$INSTALL_DIR/openclaw/.env"
|
cp "/tmp/.uclaw-env-backup" "$INSTALL_DIR/openclaw/.env"
|
||||||
rm -f "/tmp/.uclaw-env-backup"
|
rm -f "/tmp/.uclaw-env-backup"
|
||||||
@@ -68,13 +129,9 @@ fi
|
|||||||
|
|
||||||
echo -e " ${CYAN}[4/4] 配置环境变量...${NC}"
|
echo -e " ${CYAN}[4/4] 配置环境变量...${NC}"
|
||||||
|
|
||||||
# macOS Catalina+ 默认 zsh,始终写 .zshrc
|
SHELL_RC="$HOME/.zshrc"
|
||||||
if [ "$(basename "$SHELL")" = "zsh" ] || [ ! -f "$HOME/.bashrc" -a ! -f "$HOME/.bash_profile" ]; then
|
[ ! -f "$SHELL_RC" ] && SHELL_RC="$HOME/.bashrc"
|
||||||
SHELL_RC="$HOME/.zshrc"
|
[ ! -f "$SHELL_RC" ] && SHELL_RC="$HOME/.bash_profile"
|
||||||
else
|
|
||||||
SHELL_RC="$HOME/.bashrc"
|
|
||||||
fi
|
|
||||||
touch "$SHELL_RC"
|
|
||||||
|
|
||||||
if ! grep -q ".uclaw/node/bin" "$SHELL_RC" 2>/dev/null; then
|
if ! grep -q ".uclaw/node/bin" "$SHELL_RC" 2>/dev/null; then
|
||||||
echo "" >> "$SHELL_RC"
|
echo "" >> "$SHELL_RC"
|
||||||
@@ -94,12 +151,18 @@ exec "$UCLAW_HOME/node/bin/node" "$UCLAW_HOME/openclaw/openclaw.mjs" "$@"
|
|||||||
SCRIPT
|
SCRIPT
|
||||||
chmod +x "$INSTALL_DIR/uclaw"
|
chmod +x "$INSTALL_DIR/uclaw"
|
||||||
|
|
||||||
|
LOCAL_BIN="$HOME/.local/bin"
|
||||||
|
mkdir -p "$LOCAL_BIN"
|
||||||
|
ln -sf "$INSTALL_DIR/uclaw" "$LOCAL_BIN/uclaw"
|
||||||
|
ln -sf "$INSTALL_DIR/uclaw" "$LOCAL_BIN/openclaw"
|
||||||
|
|
||||||
if [ -d "/usr/local/bin" ] && [ -w "/usr/local/bin" ]; then
|
if [ -d "/usr/local/bin" ] && [ -w "/usr/local/bin" ]; then
|
||||||
ln -sf "$INSTALL_DIR/uclaw" /usr/local/bin/uclaw 2>/dev/null || true
|
ln -sf "$INSTALL_DIR/uclaw" /usr/local/bin/uclaw 2>/dev/null || true
|
||||||
ln -sf "$INSTALL_DIR/uclaw" /usr/local/bin/openclaw 2>/dev/null || true
|
ln -sf "$INSTALL_DIR/uclaw" /usr/local/bin/openclaw 2>/dev/null || true
|
||||||
echo -e " ${GREEN}已创建全局命令: uclaw / openclaw${NC}"
|
echo -e " ${GREEN}已创建全局命令: uclaw / openclaw${NC}"
|
||||||
else
|
else
|
||||||
echo -e " ${YELLOW}提示: 运行 sudo ln -sf $INSTALL_DIR/uclaw /usr/local/bin/uclaw${NC}"
|
echo -e " ${GREEN}已创建用户命令: $LOCAL_BIN/uclaw / $LOCAL_BIN/openclaw${NC}"
|
||||||
|
echo -e " ${YELLOW}如需系统级命令,可运行 sudo ln -sf $INSTALL_DIR/uclaw /usr/local/bin/uclaw${NC}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
@@ -108,14 +171,14 @@ echo -e " ${GREEN}║ 安装完成! ║${NC}"
|
|||||||
echo -e " ${GREEN}╚══════════════════════════════════════╝${NC}"
|
echo -e " ${GREEN}╚══════════════════════════════════════╝${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
echo " 安装位置: $INSTALL_DIR"
|
echo " 安装位置: $INSTALL_DIR"
|
||||||
echo " Node.js: $($INSTALL_DIR/node/bin/node --version)"
|
echo " Node.js: ${NODE_VERSION_INSTALLED}"
|
||||||
echo ""
|
echo ""
|
||||||
echo " 使用方法:"
|
echo " 使用方法:"
|
||||||
echo " 1. 打开新的终端窗口"
|
echo " 1. 打开新的终端窗口"
|
||||||
echo " 2. 运行: openclaw"
|
echo " 2. 运行: openclaw onboard --install-daemon"
|
||||||
echo " 或: uclaw"
|
echo " 3. 配置完成后运行: openclaw dashboard"
|
||||||
echo ""
|
echo ""
|
||||||
echo " 首次使用请运行:"
|
echo " 小白用户推荐:"
|
||||||
echo " openclaw onboard --install-daemon"
|
echo " 先按引导完成首次配置,再打开网页控制台"
|
||||||
echo ""
|
echo ""
|
||||||
read -p " 按回车键关闭..."
|
read -p " 按回车键关闭..."
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
OPENCLAW_DIR="$UCLAW_DIR/openclaw"
|
OPENCLAW_DIR="$UCLAW_DIR/openclaw"
|
||||||
|
PORTABLE_HOME="$UCLAW_DIR/portable-home"
|
||||||
|
PORTABLE_STATE_DIR="$PORTABLE_HOME/.openclaw"
|
||||||
|
PORTABLE_CONFIG_PATH="$PORTABLE_STATE_DIR/openclaw.json"
|
||||||
|
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
CYAN='\033[0;36m'
|
CYAN='\033[0;36m'
|
||||||
@@ -13,6 +16,39 @@ RED='\033[0;31m'
|
|||||||
YELLOW='\033[1;33m'
|
YELLOW='\033[1;33m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
|
run_with_spinner() {
|
||||||
|
local message="$1"
|
||||||
|
shift
|
||||||
|
local tmp_log
|
||||||
|
tmp_log="$(mktemp -t uclaw-run.XXXXXX)"
|
||||||
|
"$@" >"$tmp_log" 2>&1 &
|
||||||
|
local cmd_pid=$!
|
||||||
|
local frames='|/-\'
|
||||||
|
local i=0
|
||||||
|
|
||||||
|
while kill -0 "$cmd_pid" 2>/dev/null; do
|
||||||
|
local frame="${frames:i%4:1}"
|
||||||
|
printf "\r %b[%s]%b %s" "$CYAN" "$frame" "$NC" "$message"
|
||||||
|
i=$((i + 1))
|
||||||
|
sleep 0.2
|
||||||
|
done
|
||||||
|
|
||||||
|
wait "$cmd_pid"
|
||||||
|
local status=$?
|
||||||
|
printf "\r"
|
||||||
|
|
||||||
|
if [ $status -ne 0 ]; then
|
||||||
|
echo -e " ${RED}启动步骤失败:${message}${NC}"
|
||||||
|
sed -n '1,120p' "$tmp_log"
|
||||||
|
rm -f "$tmp_log"
|
||||||
|
read -p " 按回车键退出..."
|
||||||
|
exit $status
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e " ${GREEN}完成${NC} ${message}"
|
||||||
|
rm -f "$tmp_log"
|
||||||
|
}
|
||||||
|
|
||||||
clear
|
clear
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${CYAN}"
|
echo -e "${CYAN}"
|
||||||
@@ -21,6 +57,8 @@ echo " ║ U-Claw 虾盘 v1.0 ║"
|
|||||||
echo " ║ OpenClaw 一键启动 ║"
|
echo " ║ OpenClaw 一键启动 ║"
|
||||||
echo " ╚══════════════════════════════════════╝"
|
echo " ╚══════════════════════════════════════╝"
|
||||||
echo -e "${NC}"
|
echo -e "${NC}"
|
||||||
|
echo -e " ${GREEN}推荐场景:老电脑 / 临时电脑 / 不想改本机环境${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
# 检测 CPU 架构
|
# 检测 CPU 架构
|
||||||
ARCH=$(uname -m)
|
ARCH=$(uname -m)
|
||||||
@@ -34,7 +72,6 @@ fi
|
|||||||
|
|
||||||
NODE_BIN="$NODE_DIR/bin/node"
|
NODE_BIN="$NODE_DIR/bin/node"
|
||||||
NPM_BIN="$NODE_DIR/bin/npm"
|
NPM_BIN="$NODE_DIR/bin/npm"
|
||||||
PNPM_BIN="$NODE_DIR/bin/pnpm"
|
|
||||||
|
|
||||||
if [ ! -f "$NODE_BIN" ]; then
|
if [ ! -f "$NODE_BIN" ]; then
|
||||||
echo -e " ${RED}错误: 找不到 Node.js 运行环境${NC}"
|
echo -e " ${RED}错误: 找不到 Node.js 运行环境${NC}"
|
||||||
@@ -49,21 +86,11 @@ echo -e " Node.js 版本: ${GREEN}${NODE_VER}${NC}"
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
export PATH="$NODE_DIR/bin:$PATH"
|
export PATH="$NODE_DIR/bin:$PATH"
|
||||||
|
export OPENCLAW_HOME="$PORTABLE_HOME"
|
||||||
|
export OPENCLAW_STATE_DIR="$PORTABLE_STATE_DIR"
|
||||||
|
export OPENCLAW_CONFIG_PATH="$PORTABLE_CONFIG_PATH"
|
||||||
|
|
||||||
ensure_pnpm() {
|
mkdir -p "$PORTABLE_STATE_DIR"
|
||||||
if [ -x "$PNPM_BIN" ]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e " ${YELLOW}缺少 pnpm,正在补充安装...${NC}"
|
|
||||||
"$NPM_BIN" install -g pnpm --registry=https://registry.npmmirror.com 2>&1
|
|
||||||
|
|
||||||
if [ ! -x "$PNPM_BIN" ]; then
|
|
||||||
echo -e " ${RED}错误: pnpm 安装失败,无法继续构建${NC}"
|
|
||||||
read -p " 按回车键退出..."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# 检查依赖
|
# 检查依赖
|
||||||
if [ ! -d "$OPENCLAW_DIR/node_modules" ]; then
|
if [ ! -d "$OPENCLAW_DIR/node_modules" ]; then
|
||||||
@@ -71,7 +98,7 @@ if [ ! -d "$OPENCLAW_DIR/node_modules" ]; then
|
|||||||
echo " (使用淘宝镜像,请稍等)"
|
echo " (使用淘宝镜像,请稍等)"
|
||||||
echo ""
|
echo ""
|
||||||
cd "$OPENCLAW_DIR"
|
cd "$OPENCLAW_DIR"
|
||||||
"$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com 2>&1
|
run_with_spinner "安装 npm 依赖..." "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${GREEN}依赖安装完成!${NC}"
|
echo -e " ${GREEN}依赖安装完成!${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -81,13 +108,7 @@ fi
|
|||||||
if [ ! -d "$OPENCLAW_DIR/dist" ]; then
|
if [ ! -d "$OPENCLAW_DIR/dist" ]; then
|
||||||
echo -e " ${YELLOW}首次运行,正在构建...${NC}"
|
echo -e " ${YELLOW}首次运行,正在构建...${NC}"
|
||||||
cd "$OPENCLAW_DIR"
|
cd "$OPENCLAW_DIR"
|
||||||
ensure_pnpm
|
run_with_spinner "构建 OpenClaw..." "$NODE_BIN" "$NPM_BIN" run build
|
||||||
"$PNPM_BIN" run build 2>&1
|
|
||||||
if [ ! -d "$OPENCLAW_DIR/dist" ]; then
|
|
||||||
echo -e " ${RED}构建失败,请检查错误信息${NC}"
|
|
||||||
read -p " 按回车键退出..."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -95,17 +116,25 @@ fi
|
|||||||
echo -e " ${CYAN}正在启动 OpenClaw...${NC}"
|
echo -e " ${CYAN}正在启动 OpenClaw...${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
cd "$OPENCLAW_DIR"
|
cd "$OPENCLAW_DIR"
|
||||||
|
if [ ! -f "$PORTABLE_CONFIG_PATH" ]; then
|
||||||
# 首次运行走 onboard 配置,之后直接启动
|
echo -e " ${YELLOW}检测到你还没有完成首次配置。${NC}"
|
||||||
if [ ! -f "$HOME/.openclaw/openclaw.json" ]; then
|
echo " 首次配置会直接保存到 U 盘里,换电脑插上后还能继续用。"
|
||||||
echo -e " ${YELLOW}首次配置...${NC}"
|
echo ""
|
||||||
"$NODE_BIN" openclaw.mjs onboard --install-daemon 2>&1
|
read -p " 现在开始首次配置? (y/n) " -n 1 -r
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
"$NODE_BIN" openclaw.mjs onboard
|
||||||
|
echo ""
|
||||||
|
echo -e " ${GREEN}首次配置完成,已保存到 U 盘。${NC}"
|
||||||
|
echo " 下次插到别的电脑,也会继续使用这套配置。"
|
||||||
|
else
|
||||||
|
echo " 已跳过首次配置。"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
"$NODE_BIN" openclaw.mjs dashboard || "$NODE_BIN" openclaw.mjs
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${CYAN}启动 OpenClaw 服务...${NC}"
|
echo -e " ${YELLOW}OpenClaw 已退出。拔掉 U 盘后,本次便携运行就会结束。${NC}"
|
||||||
"$NODE_BIN" openclaw.mjs 2>&1 || "$NODE_BIN" "$NPM_BIN" start 2>&1
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo -e " ${YELLOW}OpenClaw 已退出${NC}"
|
|
||||||
read -p " 按回车键关闭窗口..."
|
read -p " 按回车键关闭窗口..."
|
||||||
|
|||||||
Reference in New Issue
Block a user