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:
dongsheng123132
2026-03-09 17:53:14 +08:00
parent 6be637b77c
commit 069e348f6f
5 changed files with 238 additions and 138 deletions

View File

@@ -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月:
- 零成本起步: 先用通义千问 Qwen1000万免费 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
(技术咨询、合作交流、问题反馈、教程更新)

View File

@@ -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。

View File

@@ -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
echo -e " ${CYAN}启动 OpenClaw 服务...${NC}"
"$NODE_BIN" openclaw.mjs 2>&1 || "$NODE_BIN" "$NPM_BIN" start 2>&1
else
"$NODE_BIN" openclaw.mjs dashboard || "$NODE_BIN" openclaw.mjs
fi
}
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

View File

@@ -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 " 按回车键关闭..."

View File

@@ -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 " 按回车键关闭窗口..."