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