-
-- **Xiaohongshu 小红书**: [关注主页 / Follow](https://xhslink.com/m/6mf7Mq2M5wP)
-- **Email 邮箱**: hefangsheng@gmail.com
-- **GitHub**: [@dongsheng123132](https://github.com/dongsheng123132)
-- **Website 官网**: [u-claw.org](https://u-claw.org)
+- 微信: hecare888
+- GitHub: [@dongsheng123132](https://github.com/dongsheng123132)
+- 官网: [u-claw.org](https://u-claw.org)
---
-**Made with 🦞 by [dongsheng](https://github.com/dongsheng123132) & OpenClaw Community**
-
-**Website: [u-claw.org](https://u-claw.org)** · **Email: hefangsheng@gmail.com**
+**Made with 🦞 by [dongsheng](https://github.com/dongsheng123132)**
diff --git a/build-uclaw.sh b/build-uclaw.sh
deleted file mode 100755
index 493f38d..0000000
--- a/build-uclaw.sh
+++ /dev/null
@@ -1,177 +0,0 @@
-#!/bin/bash
-# ============================================================
-# U-Claw 虾盘 构建脚本
-# 在你的 Mac 上运行,打包所有依赖到 U-Claw 目录
-# 用法: ./build-uclaw.sh
-# ============================================================
-
-set -eo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
-UCLAW_DIR="$SCRIPT_DIR/U-Claw"
-SOURCE_DIR="$SCRIPT_DIR/openclaw-2026.3.7"
-NODE_VERSION="22.16.0"
-
-# 颜色输出
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-CYAN='\033[0;36m'
-NC='\033[0m'
-
-info() { echo -e "${CYAN}[U-Claw]${NC} $1"; }
-ok() { echo -e "${GREEN}[✓]${NC} $1"; }
-warn() { echo -e "${YELLOW}[!]${NC} $1"; }
-error() { echo -e "${RED}[✗]${NC} $1"; exit 1; }
-
-echo ""
-echo " 🦞 U-Claw 虾盘 构建工具"
-echo " ========================"
-echo " OpenClaw 一键安装 U 盘制作"
-echo ""
-
-# ---- 1. 创建 U-Claw 目录结构 ----
-info "创建 U-Claw 目录结构..."
-rm -rf "$UCLAW_DIR"
-mkdir -p "$UCLAW_DIR"/{runtime/{node-mac-arm64,node-mac-x64,node-linux-x64,node-win-x64},openclaw,memory,persona,skills,tools}
-
-# ---- 2. 下载 Node.js 各平台版本 ----
-DOWNLOAD_DIR="$SCRIPT_DIR/.download-cache"
-mkdir -p "$DOWNLOAD_DIR"
-
-download_node() {
- local PLATFORM=$1 # darwin, win
- local ARCH=$2 # arm64, x64
- local EXT=$3 # tar.gz, zip
- local DEST=$4 # 目标目录名
-
- local FILENAME="node-v${NODE_VERSION}-${PLATFORM}-${ARCH}"
- local URL="https://nodejs.org/dist/v${NODE_VERSION}/${FILENAME}.${EXT}"
- local CACHED="$DOWNLOAD_DIR/${FILENAME}.${EXT}"
-
- if [ -f "$CACHED" ]; then
- ok "Node.js ${PLATFORM}-${ARCH} 已缓存"
- else
- info "下载 Node.js ${PLATFORM}-${ARCH}..."
- # 尝试直接下载,如果失败则使用镜像
- if ! curl -fL --connect-timeout 10 -o "$CACHED" "$URL" 2>/dev/null; then
- warn "官方源下载失败,尝试淘宝镜像..."
- local MIRROR_URL="https://npmmirror.com/mirrors/node/v${NODE_VERSION}/${FILENAME}.${EXT}"
- curl -fL -o "$CACHED" "$MIRROR_URL" || error "下载 Node.js ${PLATFORM}-${ARCH} 失败"
- fi
- ok "下载完成: Node.js ${PLATFORM}-${ARCH}"
- fi
-
- info "解压 Node.js ${PLATFORM}-${ARCH}..."
- if [ "$EXT" = "tar.gz" ]; then
- tar xzf "$CACHED" -C "$UCLAW_DIR/runtime/$DEST/" --strip-components=1
- elif [ "$EXT" = "zip" ]; then
- # Windows zip
- local TMP_UNZIP="$DOWNLOAD_DIR/tmp-unzip-$$"
- mkdir -p "$TMP_UNZIP"
- unzip -q "$CACHED" -d "$TMP_UNZIP"
- cp -R "$TMP_UNZIP"/${FILENAME}/* "$UCLAW_DIR/runtime/$DEST/"
- rm -rf "$TMP_UNZIP"
- fi
- ok "Node.js ${PLATFORM}-${ARCH} 就绪"
-}
-
-# 下载四个平台的 Node.js
-download_node "darwin" "arm64" "tar.gz" "node-mac-arm64" # Mac Apple Silicon
-download_node "darwin" "x64" "tar.gz" "node-mac-x64" # Mac Intel
-download_node "linux" "x64" "tar.gz" "node-linux-x64" # Linux x64
-download_node "win" "x64" "zip" "node-win-x64" # Windows x64
-
-# ---- 3. 复制 OpenClaw 源码 ----
-info "复制 OpenClaw 源码..."
-rsync -a --exclude='.git' --exclude='node_modules' --exclude='.github' \
- "$SOURCE_DIR/" "$UCLAW_DIR/openclaw/"
-ok "OpenClaw 源码复制完成"
-
-# ---- 4. 安装依赖 (使用淘宝镜像) ----
-info "安装 npm 依赖(使用淘宝镜像)..."
-
-# 使用 U-Claw 自带的 Node.js 来安装
-if [ "$(uname -m)" = "arm64" ]; then
- NODE_DIR="$UCLAW_DIR/runtime/node-mac-arm64"
- NODE_BIN="$UCLAW_DIR/runtime/node-mac-arm64/bin/node"
- NPM_BIN="$UCLAW_DIR/runtime/node-mac-arm64/bin/npm"
-else
- NODE_DIR="$UCLAW_DIR/runtime/node-mac-x64"
- NODE_BIN="$UCLAW_DIR/runtime/node-mac-x64/bin/node"
- NPM_BIN="$UCLAW_DIR/runtime/node-mac-x64/bin/npm"
-fi
-
-cd "$UCLAW_DIR/openclaw"
-
-# 设置淘宝镜像
-"$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null || true
-
-# 安装 pnpm(OpenClaw build 脚本依赖 pnpm)
-info "安装 pnpm..."
-"$NODE_BIN" "$NPM_BIN" install -g pnpm --registry=https://registry.npmmirror.com 2>&1 | tail -3
-PNPM_BIN="$NODE_DIR/bin/pnpm"
-[ -x "$PNPM_BIN" ] || error "pnpm 安装失败: $PNPM_BIN 不存在"
-
-# 安装依赖(使用 pnpm,与上游一致)
-info "pnpm install 中...(可能需要几分钟)"
-cd "$UCLAW_DIR/openclaw"
-"$PNPM_BIN" install --registry=https://registry.npmmirror.com 2>&1 | tail -5
-ok "依赖安装完成"
-
-# ---- 5. 构建 OpenClaw ----
-info "构建 OpenClaw..."
-cd "$UCLAW_DIR/openclaw"
-"$PNPM_BIN" run build 2>&1 | tail -10
-if [ -d "$UCLAW_DIR/openclaw/dist" ]; then
- ok "构建成功,dist/ 已生成"
-else
- error "构建失败:dist/ 目录未生成,请检查错误信息"
-fi
-
-cd "$SCRIPT_DIR"
-
-# ---- 6. 复制用户脚本和说明 ----
-info "复制用户脚本..."
-
-# 从 scripts 模板目录复制(构建脚本同级的 uclaw-scripts/ 目录)
-SCRIPTS_SRC="$SCRIPT_DIR/uclaw-scripts"
-if [ -d "$SCRIPTS_SRC" ]; then
- cp "$SCRIPTS_SRC/启动菜单.command" "$UCLAW_DIR/" 2>/dev/null || true
- cp "$SCRIPTS_SRC/启动菜单.bat" "$UCLAW_DIR/" 2>/dev/null || true
- cp "$SCRIPTS_SRC/运行.command" "$UCLAW_DIR/" 2>/dev/null || true
- cp "$SCRIPTS_SRC/运行.sh" "$UCLAW_DIR/" 2>/dev/null || true
- cp "$SCRIPTS_SRC/运行.bat" "$UCLAW_DIR/" 2>/dev/null || true
- cp "$SCRIPTS_SRC/安装到电脑.command" "$UCLAW_DIR/" 2>/dev/null || true
- cp "$SCRIPTS_SRC/安装到电脑.bat" "$UCLAW_DIR/" 2>/dev/null || true
- cp "$SCRIPTS_SRC/使用说明.txt" "$UCLAW_DIR/" 2>/dev/null || true
- cp "$SCRIPTS_SRC/中国用户指南.txt" "$UCLAW_DIR/" 2>/dev/null || true
- # 复制教程文档
- mkdir -p "$UCLAW_DIR/docs"
- cp "$SCRIPT_DIR/docs/教程-OpenClaw中国区完全指南.md" "$UCLAW_DIR/docs/" 2>/dev/null || true
- # 复制二维码
- cp "$SCRIPT_DIR/微信二维码.jpg" "$UCLAW_DIR/" 2>/dev/null || true
- cp "$SCRIPT_DIR/小红书二维码.jpg" "$UCLAW_DIR/" 2>/dev/null || true
- chmod +x "$UCLAW_DIR/启动菜单.command" "$UCLAW_DIR/运行.command" "$UCLAW_DIR/运行.sh" "$UCLAW_DIR/安装到电脑.command" 2>/dev/null || true
- ok "用户脚本已复制(含启动菜单、中国用户指南、微信二维码)"
-else
- warn "找不到 uclaw-scripts/ 目录,请手动复制脚本到 U-Claw/"
-fi
-
-# ---- 7. 计算大小 ----
-echo ""
-echo " ============================================"
-info "U-Claw 构建完成!"
-echo ""
-TOTAL_SIZE=$(du -sh "$UCLAW_DIR" | cut -f1)
-echo " 总大小: $TOTAL_SIZE"
-echo ""
-du -sh "$UCLAW_DIR"/runtime/node-mac-arm64 2>/dev/null | awk '{print " Node.js Mac ARM64: "$1}'
-du -sh "$UCLAW_DIR"/runtime/node-mac-x64 2>/dev/null | awk '{print " Node.js Mac x64: "$1}'
-du -sh "$UCLAW_DIR"/runtime/node-linux-x64 2>/dev/null | awk '{print " Node.js Linux x64: "$1}'
-du -sh "$UCLAW_DIR"/runtime/node-win-x64 2>/dev/null | awk '{print " Node.js Win x64: "$1}'
-du -sh "$UCLAW_DIR"/openclaw 2>/dev/null | awk '{print " OpenClaw + 依赖: "$1}'
-echo ""
-echo " 将 U-Claw 文件夹整个复制到 U 盘即可"
-echo " ============================================"
-echo ""
diff --git a/portable/Mac-Menu.command b/portable/Mac-Menu.command
index d822214..9d0999f 100755
--- a/portable/Mac-Menu.command
+++ b/portable/Mac-Menu.command
@@ -1,35 +1,25 @@
#!/bin/bash
-# ============================================================
-# U-Claw 虾盘 - 启动菜单 (雨林木风风格)
-# macOS 版本
-# ============================================================
+# U-Claw Menu - Portable AI Agent
+# macOS version
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
-OPENCLAW_DIR="$UCLAW_DIR/app/core"
+APP_DIR="$UCLAW_DIR/app"
+CORE_DIR="$APP_DIR/core"
DATA_DIR="$UCLAW_DIR/data"
STATE_DIR="$DATA_DIR/.openclaw"
CONFIG_PATH="$STATE_DIR/openclaw.json"
-# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
-BLUE='\033[0;34m'
-MAGENTA='\033[0;35m'
WHITE='\033[1;37m'
-GRAY='\033[0;37m'
NC='\033[0m'
BOLD='\033[1m'
DIM='\033[2m'
-# 检测架构并设置 Node
-ARCH=$(uname -m)
-if [ "$ARCH" = "arm64" ]; then
- NODE_DIR="$UCLAW_DIR/app/runtime/node-mac-arm64"
-else
- NODE_DIR="$UCLAW_DIR/app/runtime/node-mac-x64"
-fi
+# Node.js (ARM64 only)
+NODE_DIR="$APP_DIR/runtime/node-mac-arm64"
NODE_BIN="$NODE_DIR/bin/node"
NPM_BIN="$NODE_DIR/bin/npm"
export PATH="$NODE_DIR/bin:$PATH"
@@ -39,801 +29,246 @@ export OPENCLAW_CONFIG_PATH="$CONFIG_PATH"
mkdir -p "$STATE_DIR" "$DATA_DIR/memory" "$DATA_DIR/backups"
-# 移除 macOS 隔离标记(解决"无法验证开发者"弹窗)
+# Remove macOS quarantine
if xattr -l "$NODE_BIN" 2>/dev/null | grep -q "com.apple.quarantine"; then
xattr -rd com.apple.quarantine "$UCLAW_DIR" 2>/dev/null || true
fi
-# 检查安装状态
-check_status() {
- HAS_MODULES="no"
- HAS_DIST="no"
- HAS_ENV="no"
- INSTALLED="no"
- CONFIG_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 "$CONFIG_PATH" ] && CONFIG_READY="yes"
+# Run openclaw command
+run_oc() {
+ cd "$CORE_DIR"
+ "$NODE_BIN" openclaw.mjs "$@"
}
-# 显示主菜单
+# Show menu
show_menu() {
- check_status
clear
- echo ""
- echo -e "${CYAN}${BOLD}"
- echo " ╔════════════════════════════════════════════════════════╗"
- echo " ║ ║"
- echo " ║ 🦞 U-Claw 虾盘 v1.0 ║"
- echo " ║ OpenClaw AI 助手 一键安装盘 ║"
- echo " ║ ║"
- echo " ║ 专为中国用户优化 · 免翻墙 · 离线安装 ║"
- echo " ║ ║"
- echo " ╠════════════════════════════════════════════════════════╣"
- echo -e " ║${NC} ${CYAN}║"
+ local NODE_VER=$("$NODE_BIN" --version 2>/dev/null || echo "N/A")
+ local CFG_STATUS="${RED}未配置${NC}"
+ [ -f "$CONFIG_PATH" ] && CFG_STATUS="${GREEN}已配置${NC}"
- # 状态栏
- local STATUS_NODE="${GREEN}v$($NODE_BIN --version 2>/dev/null || echo '未找到')${NC}"
- local STATUS_MOD="${RED}未安装${NC}"
- local STATUS_BUILD="${RED}未构建${NC}"
- local STATUS_INST="${RED}未安装${NC}"
-
- [ "$HAS_MODULES" = "yes" ] && STATUS_MOD="${GREEN}已安装${NC}"
- [ "$HAS_DIST" = "yes" ] && STATUS_BUILD="${GREEN}已构建${NC}"
- [ "$INSTALLED" = "yes" ] && STATUS_INST="${GREEN}已安装${NC}"
-
- local STATUS_PORTABLE="${RED}未配置${NC}"
- [ "$CONFIG_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 -e " ${CYAN}${BOLD}╔══════════════════════════════════════╗"
+ echo -e " ║ U-Claw 虾盘 v1.1 ║"
+ echo -e " ║ Portable AI Agent ║"
+ echo -e " ╚══════════════════════════════════════╝${NC}"
echo ""
- 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 盘运行(配置也保存在 U 盘里)"
+ echo -e " Node: ${GREEN}${NODE_VER}${NC} 配置: ${CFG_STATUS}"
echo ""
- echo -e " ${WHITE}${BOLD} ━━━━ 中国优化 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
+ echo -e " ${WHITE}${BOLD}── 配置 ──────────────────────────────${NC}"
+ echo -e " ${GREEN}[1]${NC} 配置向导(选模型、填 API Key)"
+ echo -e " ${GREEN}[2]${NC} 打开网页控制台"
echo ""
- echo -e " ${YELLOW} [5]${NC} ⚙️ 首次配置向导(选模型、选平台、填 API Key)"
- echo -e " ${YELLOW} [6]${NC} 💬 配置中国聊天平台(飞书/钉钉)"
- echo -e " ${YELLOW} [7]${NC} 🪞 设置国内镜像源"
+ echo -e " ${WHITE}${BOLD}── 聊天平台 ──────────────────────────${NC}"
+ echo -e " ${GREEN}[3]${NC} 接入 QQ 机器人(推荐,1分钟搞定)"
+ echo -e " ${GREEN}[4]${NC} 接入其他平台(飞书/Telegram/微信)"
echo ""
- echo -e " ${WHITE}${BOLD} ━━━━ 维护工具 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
+ echo -e " ${WHITE}${BOLD}── 维护 ──────────────────────────────${NC}"
+ echo -e " ${GREEN}[5]${NC} 诊断修复"
+ echo -e " ${GREEN}[6]${NC} 备份配置"
+ echo -e " ${GREEN}[7]${NC} 恢复备份"
+ echo -e " ${GREEN}[8]${NC} 系统信息"
echo ""
- echo -e " ${CYAN} [8]${NC} 🔧 诊断修复(openclaw doctor)"
- echo -e " ${CYAN} [9]${NC} 💾 备份当前状态"
- echo -e " ${CYAN} [10]${NC} 📂 恢复备份"
- echo -e " ${CYAN} [11]${NC} 🔄 重置 OpenClaw(恢复出厂)"
- echo -e " ${CYAN} [12]${NC} 🧹 清理缓存和临时文件"
- echo ""
- echo -e " ${WHITE}${BOLD} ━━━━ 技能 & 使用 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
- echo ""
- echo -e " ${BLUE} [13]${NC} 🎯 浏览预装技能(52个,已离线可用)"
- echo -e " ${BLUE} [14]${NC} 📖 中国用户快速上手指南"
- echo ""
- echo -e " ${WHITE}${BOLD} ━━━━ 其他 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
- 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}"
+ echo -e " ${DIM}[0] 退出${NC}"
echo ""
}
-# 确保依赖已安装
-ensure_deps() {
- if [ ! -d "$OPENCLAW_DIR/node_modules" ]; then
- echo -e " ${YELLOW}正在安装依赖(淘宝镜像)...${NC}"
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com 2>&1
- echo -e " ${GREEN}依赖安装完成${NC}"
- fi
- if [ ! -d "$OPENCLAW_DIR/dist" ]; then
- echo -e " ${YELLOW}正在构建...${NC}"
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" "$NPM_BIN" run build 2>&1 || true
- echo -e " ${GREEN}构建完成${NC}"
- fi
+# [1] Config wizard
+do_config() {
+ echo ""
+ echo -e " ${CYAN}${BOLD}━━━ 配置向导 ━━━${NC}"
+ echo ""
+ echo -e " ${WHITE}国产模型选择提示:${NC}"
+ echo ""
+ echo -e " DeepSeek → 选 Custom Provider"
+ echo -e " URL: https://api.deepseek.com/v1"
+ echo -e " 模型: deepseek-chat"
+ echo -e " Kimi → 选 Moonshot AI"
+ echo -e " 通义千问 → 选 Qwen"
+ echo -e " 豆包 → 选 Volcano Engine"
+ echo ""
+ read -p " 按回车启动配置向导..."
+ run_oc onboard
}
-# [1] 一键安装到电脑
-do_install() {
+# [2] Web dashboard
+do_dashboard() {
echo ""
- echo -e " ${CYAN}${BOLD}━━━ 一键安装 OpenClaw 到电脑 ━━━${NC}"
+ echo -e " ${CYAN}启动网页控制台...${NC}"
echo ""
- echo -e " ${YELLOW}提醒:如果这是老电脑、临时电脑、公司电脑或别人的电脑,${NC}"
- echo -e " ${YELLOW}更推荐返回主菜单选择 [4] 从 U 盘运行,不要安装到本机。${NC}"
- echo ""
- bash "$UCLAW_DIR/安装到电脑.command"
-}
+ cd "$CORE_DIR"
-# [2] 安装依赖
-do_npm_install() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 安装 npm 依赖 ━━━${NC}"
- echo ""
- cd "$OPENCLAW_DIR"
- echo -e " ${YELLOW}使用淘宝镜像安装...${NC}"
- "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com 2>&1
- echo ""
- echo -e " ${GREEN}依赖安装完成!${NC}"
-}
-
-# [3] 构建
-do_build() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 构建 OpenClaw ━━━${NC}"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" "$NPM_BIN" run build 2>&1
- echo ""
- echo -e " ${GREEN}构建完成!${NC}"
-}
-
-# [4] 直接运行
-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"
- if [ ! -f "$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] 打开网页控制台。"
+ # Find free port
+ local PORT=18789
+ while lsof -i :$PORT >/dev/null 2>&1; do
+ PORT=$((PORT + 1))
+ if [ $PORT -gt 18799 ]; then
+ echo -e " ${RED}端口 18789-18799 全被占用${NC}"
+ return
fi
- else
- start_gateway
- fi
-}
+ done
+
+ local TOKEN=$(python3 -c "import json,os; p='$CONFIG_PATH'; d=json.load(open(p)) if os.path.exists(p) else {}; print(d.get('gateway',{}).get('auth',{}).get('token','uclaw'))" 2>/dev/null || echo "uclaw")
+
+ "$NODE_BIN" openclaw.mjs gateway run --allow-unconfigured --force --port $PORT &
+ local PID=$!
-start_gateway() {
- echo -e " ${GREEN}正在启动网关服务...${NC}"
- echo " 此窗口不要关闭,关闭后服务会停止。"
- echo ""
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs gateway run --allow-unconfigured --force &
- local GW_PID=$!
for i in $(seq 1 30); do
sleep 0.5
- if curl -s -o /dev/null http://127.0.0.1:18789/ 2>/dev/null; then
- local TOKEN
- TOKEN=$(python3 -c "import json; d=json.load(open('$CONFIG_PATH')); print(d.get('gateway',{}).get('auth',{}).get('token',''))" 2>/dev/null)
- local URL="http://127.0.0.1:18789/#token=${TOKEN}"
- echo ""
- echo -e " ${GREEN}控制台地址: ${URL}${NC}"
+ if curl --noproxy '*' -s -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null; then
+ local URL="http://127.0.0.1:$PORT/#token=$TOKEN"
+ echo -e " ${GREEN}控制台: $URL${NC}"
open "$URL" 2>/dev/null
break
fi
done
- wait $GW_PID
+
+ echo " 关闭此窗口会停止服务"
+ wait $PID
}
-do_dashboard() {
+# [3] QQ Bot (pre-installed)
+do_qq() {
echo ""
- echo -e " ${CYAN}${BOLD}━━━ 启动网关 + 打开网页控制台 ━━━${NC}"
+ echo -e " ${CYAN}${BOLD}━━━ 接入 QQ 机器人 ━━━${NC}"
echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- if [ ! -f "$CONFIG_PATH" ]; then
- echo -e " ${YELLOW}你还没有完成 U 盘便携配置。请先选 [4] 从 U 盘运行。${NC}"
+ echo -e " ${GREEN}QQ 插件已预装!只需输入 AppID 和 AppSecret。${NC}"
+ echo ""
+ echo " 获取方式: 访问 q.qq.com → 创建机器人"
+ echo ""
+ read -p " AppID: " QQ_ID
+ read -p " AppSecret: " QQ_SECRET
+ echo ""
+
+ if [ -z "$QQ_ID" ] || [ -z "$QQ_SECRET" ]; then
+ echo -e " ${YELLOW}已取消${NC}"
return
fi
- start_gateway
-}
-# 运行 openclaw 命令(便携模式)
-run_openclaw() {
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs "$@"
-}
-
-# [5] 配置 AI 模型(直接用 OpenClaw 自带的配置向导)
-do_china_models() {
+ run_oc channels add --channel qqbot --token "${QQ_ID}:${QQ_SECRET}" 2>&1 || true
echo ""
- echo -e " ${CYAN}${BOLD}━━━ 首次配置向导 ━━━${NC}"
- echo ""
- echo -e " ${WHITE}${BOLD}国产模型选择提示:${NC}"
- echo ""
- echo -e " ${GREEN}DeepSeek${NC} → 选 ${YELLOW}Custom Provider${NC}"
- echo -e " Base URL: ${CYAN}https://api.deepseek.com/v1${NC}"
- echo -e " 模型名: ${CYAN}deepseek-chat${NC}"
- echo -e " ${GREEN}Kimi${NC} → 选 ${YELLOW}Moonshot AI${NC}"
- echo -e " ${GREEN}通义千问${NC} → 选 ${YELLOW}Qwen${NC}"
- echo -e " ${GREEN}MiniMax${NC} → 选 ${YELLOW}MiniMax${NC}"
- echo -e " ${GREEN}豆包${NC} → 选 ${YELLOW}Volcano Engine${NC}"
- echo ""
- echo -e " ${DIM}按方向键 ↑↓ 滚动列表,回车确认${NC}"
- echo ""
- read -p " 按回车启动配置向导..."
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- run_openclaw onboard
-}
-
-# [6] 配置中国聊天平台
-do_china_channels() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 配置中国聊天平台 ━━━${NC}"
- echo ""
- echo -e " OpenClaw 支持的聊天平台:"
- echo ""
- echo -e " ${WHITE}${BOLD} -- 国内平台 --${NC}"
- echo -e " ${GREEN}[a]${NC} 飞书 Feishu/Lark — 已内置,企业首选"
- echo -e " ${GREEN}[b]${NC} QQ(腾讯官方)${RED}★推荐${NC} — 3条命令,1分钟,免费免翻墙"
- echo -e " ${GREEN}[c]${NC} 微信(社区插件) — iPad协议,文字/图片/文件"
- echo -e " ${GRAY}[d]${NC} 企业微信 WeCom — 后续集成"
- echo -e " ${GRAY}[e]${NC} 钉钉 DingTalk — 后续集成"
- echo ""
- echo -e " ${WHITE}${BOLD} -- 国际平台 --${NC}"
- echo -e " ${GREEN}[f]${NC} Telegram — 推荐,简单好用"
- echo -e " ${GREEN}[g]${NC} Discord — 游戏/社区"
- echo -e " ${GREEN}[h]${NC} WhatsApp — 海外用户"
- echo -e " ${GREEN}[i]${NC} Slack — 外企用户"
- echo ""
- read -p " 请选择 (a-i): " -n 1 CH_CHOICE
- echo ""
- echo ""
-
- case $CH_CHOICE in
- a)
- echo -e " ${CYAN}配置飞书 Feishu${NC}"
- echo ""
- echo " 飞书机器人配置步骤:"
- echo " 1. 访问 https://open.feishu.cn/app 创建应用"
- echo " 2. 获取 App ID 和 App Secret"
- echo " 3. 配置事件订阅和权限"
- echo ""
- echo " 详细文档: openclaw/docs/channels/feishu.md"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- echo -e " ${YELLOW}启动 OpenClaw 配置向导...${NC}"
- "$NODE_BIN" openclaw.mjs onboard 2>&1 || true
- ;;
- b)
- echo -e " ${CYAN}${BOLD}配置 QQ(腾讯官方接入)${NC}"
- echo ""
- echo -e " ${GREEN}${BOLD}这是国内最简单的 AI 助手接入方式!${NC}"
- echo -e " ${GREEN}全程 1 分钟,完全免费,无需翻墙。${NC}"
- echo ""
- echo -e " ${WHITE}${BOLD}步骤:${NC}"
- echo ""
- echo " 1. 扫码注册 QQ 机器人:"
- echo -e " ${CYAN}http://q.qq.com/qqbot/openclaw/login.html${NC}"
- echo ""
- echo " 2. 点击「创建机器人」,获取 AppID 和 AppSecret"
- echo ""
- echo " 3. 运行以下 3 条命令:"
- echo ""
- echo -e " ${GREEN}openclaw plugins install @sliverp/qqbot@latest${NC}"
- echo -e " ${GREEN}openclaw channels add --channel qqbot --token \"AppID:AppSecret\"${NC}"
- echo -e " ${GREEN}openclaw gateway restart${NC}"
- echo ""
- echo -e " ${RED}⚠️ 安全提醒:${NC}"
- echo " 默认任何人都能访问你的机器人!接入后请设置白名单:"
- echo -e " ${YELLOW}openclaw config set channels.qqbot.allowFrom \"你的QQ号\"${NC}"
- echo ""
- echo -e " ${DIM}备选方案: 也可以用 NapCatQQ (OneBot v11) 接入${NC}"
- echo -e " ${DIM}https://github.com/NapNeko/NapCatQQ/releases${NC}"
- echo ""
-
- # 如果已安装 OpenClaw,直接帮用户执行
- if [ -d "$OPENCLAW_DIR/dist" ]; then
- read -p " 是否现在安装 QQ 插件? (y/n) " -n 1 DO_QQ
- echo ""
- if [[ "$DO_QQ" =~ ^[Yy]$ ]]; then
- cd "$OPENCLAW_DIR"
- echo ""
- echo -e " ${YELLOW}正在安装 QQ 插件...${NC}"
- "$NODE_BIN" openclaw.mjs plugins install @sliverp/qqbot@latest 2>&1 || true
- echo ""
- echo -e " ${WHITE}请输入 QQ 机器人信息(在 q.qq.com 后台查看):${NC}"
- echo ""
- read -p " AppID: " QQ_APP_ID
- echo ""
- read -p " AppSecret: " QQ_APP_SECRET
- echo ""
- if [ -n "$QQ_APP_ID" ] && [ -n "$QQ_APP_SECRET" ]; then
- echo -e " ${YELLOW}正在绑定 QQ 机器人...${NC}"
- "$NODE_BIN" openclaw.mjs channels add --channel qqbot --token "${QQ_APP_ID}:${QQ_APP_SECRET}" 2>&1 || true
- echo ""
- read -p " 请输入你自己的 QQ 号(设置白名单,留空跳过): " QQ_ALLOW
- if [ -n "$QQ_ALLOW" ]; then
- "$NODE_BIN" openclaw.mjs config set channels.qqbot.allowFrom "\"${QQ_ALLOW}\"" 2>&1 || true
- echo -e " ${GREEN}白名单已设置: 仅 QQ ${QQ_ALLOW} 可访问${NC}"
- fi
- echo ""
- echo -e " ${GREEN}QQ 机器人配置完成!${NC}"
- echo -e " ${YELLOW}请重启网关后生效(主菜单选 [4] 或 [17])${NC}"
- else
- echo -e " ${YELLOW}已取消:AppID 或 AppSecret 为空。${NC}"
- fi
- fi
- fi
- ;;
- c)
- echo -e " ${CYAN}配置微信(社区插件)${NC}"
- echo ""
- echo " 安装微信插件:"
- echo " openclaw plugins install @icesword760/openclaw-wechat"
- echo ""
- echo " 基于 iPad 协议,支持:"
- echo " - 文字消息"
- echo " - 图片发送"
- echo " - 文件传输"
- echo " - 关键词触发对话"
- echo ""
- echo " 仓库: https://github.com/icesword0760/openclaw-wechat"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- echo -e " ${YELLOW}正在安装微信插件...${NC}"
- "$NODE_BIN" openclaw.mjs plugins install @icesword760/openclaw-wechat 2>&1 || \
- echo -e " ${YELLOW}安装失败,请手动安装${NC}"
- ;;
- d|e)
- echo -e " ${YELLOW}该平台正在开发中,敬请期待${NC}"
- echo " 可关注 u-claw.org 获取最新进展"
- ;;
- f)
- echo -e " ${CYAN}配置 Telegram${NC}"
- echo ""
- echo " 步骤:"
- echo " 1. 在 Telegram 中找 @BotFather"
- echo " 2. 发送 /newbot 创建机器人"
- echo " 3. 获取 Bot Token"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs onboard 2>&1 || true
- ;;
- g)
- echo -e " ${CYAN}配置 Discord${NC}"
- echo ""
- echo " 步骤:"
- echo " 1. 访问 https://discord.com/developers/applications"
- echo " 2. 创建 Application -> Bot"
- echo " 3. 获取 Bot Token"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs onboard 2>&1 || true
- ;;
- h|i)
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs onboard 2>&1 || true
- ;;
- *)
- echo -e " ${YELLOW}无效选择${NC}"
- ;;
- esac
-}
-
-# [7] 设置国内镜像
-do_mirror() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 设置国内镜像源 ━━━${NC}"
- echo ""
-
- # npm 镜像
- echo -e " ${YELLOW}设置 npm 淘宝镜像...${NC}"
- "$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null
- cd "$OPENCLAW_DIR" 2>/dev/null
- "$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null
- echo -e " ${GREEN}npm 镜像已设置: registry.npmmirror.com${NC}"
-
- # 创建 .npmrc
- NPMRC="$OPENCLAW_DIR/.npmrc"
- if ! grep -q "npmmirror" "$NPMRC" 2>/dev/null; then
- echo "" >> "$NPMRC"
- echo "registry=https://registry.npmmirror.com" >> "$NPMRC"
+ read -p " 你的 QQ 号(设白名单,留空跳过): " QQ_ALLOW
+ if [ -n "$QQ_ALLOW" ]; then
+ run_oc config set channels.qqbot.allowFrom "\"${QQ_ALLOW}\"" 2>&1 || true
+ echo -e " ${GREEN}白名单已设置${NC}"
fi
-
echo ""
- echo -e " ${GREEN}国内镜像配置完成!${NC}"
- echo " 后续 npm install 将自动使用淘宝镜像"
+ echo -e " ${GREEN}QQ 机器人配置完成!重启网关后生效。${NC}"
}
-# [8] 诊断修复
+# [4] Other platforms
+do_platforms() {
+ echo ""
+ echo -e " ${CYAN}${BOLD}━━━ 其他聊天平台 ━━━${NC}"
+ echo ""
+ echo -e " ${GREEN}[a]${NC} 飞书 Feishu — 企业首选"
+ echo -e " ${GREEN}[b]${NC} Telegram — 海外推荐"
+ echo -e " ${GREEN}[c]${NC} 微信(社区插件) — iPad协议"
+ echo -e " ${GREEN}[d]${NC} Discord"
+ echo ""
+ read -p " 选择 (a-d): " -n 1 CH
+ echo ""
+ echo ""
+
+ case $CH in
+ a) echo " 飞书: 访问 open.feishu.cn/app 创建应用" ;;
+ b) echo " Telegram: 找 @BotFather 创建机器人" ;;
+ c)
+ echo -e " ${YELLOW}安装微信插件...${NC}"
+ run_oc plugins install @icesword760/openclaw-wechat 2>&1 || true
+ ;;
+ d) echo " Discord: 访问 discord.com/developers/applications" ;;
+ *) echo " 无效选择" ;;
+ esac
+ echo ""
+ echo " 配置完成后运行配置向导 [1] 绑定平台"
+}
+
+# [5] Doctor
do_doctor() {
echo ""
- echo -e " ${CYAN}${BOLD}━━━ 诊断修复 ━━━${NC}"
+ echo -e " ${CYAN}━━━ 诊断修复 ━━━${NC}"
echo ""
- echo -e " ${GREEN}💡 提示: 选 [17] 可打开网页控制台,在浏览器中查看完整状态${NC}"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs doctor --repair 2>&1 || \
- echo -e " ${YELLOW}如果 doctor 无法运行,请先完成安装步骤${NC}"
+ run_oc doctor --repair 2>&1 || echo -e " ${YELLOW}诊断命令执行失败${NC}"
}
-# [9] 备份
+# [6] Backup
do_backup() {
echo ""
- echo -e " ${CYAN}${BOLD}━━━ 备份当前状态 ━━━${NC}"
+ local TS=$(date +%Y%m%d_%H%M%S)
+ local BK="$DATA_DIR/backups/backup_$TS"
+ mkdir -p "$BK"
+
+ [ -f "$CONFIG_PATH" ] && cp "$CONFIG_PATH" "$BK/" && echo -e " ${GREEN} + openclaw.json${NC}"
+ [ -d "$DATA_DIR/memory" ] && cp -R "$DATA_DIR/memory" "$BK/" 2>/dev/null && echo -e " ${GREEN} + memory/${NC}"
+
echo ""
-
- BACKUP_DIR="$UCLAW_DIR/backups"
- TIMESTAMP=$(date +%Y%m%d_%H%M%S)
- BACKUP_NAME="backup_${TIMESTAMP}"
- BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
-
- mkdir -p "$BACKUP_PATH"
-
- echo -e " ${YELLOW}备份中...${NC}"
-
- # 备份配置
- if [ -f "$OPENCLAW_DIR/.env" ]; then
- cp "$OPENCLAW_DIR/.env" "$BACKUP_PATH/.env"
- echo -e " ${GREEN} ✓ .env 配置${NC}"
- fi
-
- # 备份 OpenClaw 状态
- if [ -d "$HOME/.openclaw" ]; then
- mkdir -p "$BACKUP_PATH/openclaw-state"
- cp -R "$HOME/.openclaw/openclaw.json" "$BACKUP_PATH/openclaw-state/" 2>/dev/null || true
- cp -R "$HOME/.openclaw/credentials" "$BACKUP_PATH/openclaw-state/" 2>/dev/null || true
- echo -e " ${GREEN} ✓ OpenClaw 状态和凭据${NC}"
- fi
-
- # 备份 U-Claw 用户数据
- if [ -d "$UCLAW_DIR/memory" ] && [ "$(ls -A "$UCLAW_DIR/memory" 2>/dev/null)" ]; then
- cp -R "$UCLAW_DIR/memory" "$BACKUP_PATH/"
- echo -e " ${GREEN} ✓ 记忆文件${NC}"
- fi
- if [ -d "$UCLAW_DIR/persona" ] && [ "$(ls -A "$UCLAW_DIR/persona" 2>/dev/null)" ]; then
- cp -R "$UCLAW_DIR/persona" "$BACKUP_PATH/"
- echo -e " ${GREEN} ✓ 人格配置${NC}"
- fi
-
- # 备份已安装的版本
- if [ -d "$HOME/.uclaw/openclaw" ]; then
- cp "$HOME/.uclaw/openclaw/.env" "$BACKUP_PATH/installed-env" 2>/dev/null || true
- echo -e " ${GREEN} ✓ 已安装版本配置${NC}"
- fi
-
- BACKUP_SIZE=$(du -sh "$BACKUP_PATH" | cut -f1)
- echo ""
- echo -e " ${GREEN}备份完成!${NC}"
- echo " 位置: $BACKUP_PATH"
- echo " 大小: $BACKUP_SIZE"
- echo ""
-
- # 显示所有备份
- echo " 所有备份:"
- ls -1 "$BACKUP_DIR" 2>/dev/null | while read -r b; do
- echo " - $b"
- done
+ echo -e " ${GREEN}备份完成: $BK${NC}"
+ echo " 大小: $(du -sh "$BK" | cut -f1)"
}
-# [10] 恢复备份
+# [7] Restore
do_restore() {
echo ""
- echo -e " ${CYAN}${BOLD}━━━ 恢复备份 ━━━${NC}"
- echo ""
-
- BACKUP_DIR="$UCLAW_DIR/backups"
- if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR" 2>/dev/null)" ]; then
- echo -e " ${YELLOW}没有找到任何备份${NC}"
- echo " 请先使用 [9] 创建备份"
+ local BK_DIR="$DATA_DIR/backups"
+ if [ ! -d "$BK_DIR" ] || [ -z "$(ls -A "$BK_DIR" 2>/dev/null)" ]; then
+ echo -e " ${YELLOW}没有备份${NC}"
return
fi
echo " 可用备份:"
- echo ""
local i=1
- for b in "$BACKUP_DIR"/*/; do
- local bname=$(basename "$b")
- local bsize=$(du -sh "$b" | cut -f1)
- echo -e " ${GREEN}[$i]${NC} $bname ($bsize)"
+ for b in "$BK_DIR"/*/; do
+ echo -e " ${GREEN}[$i]${NC} $(basename "$b") ($(du -sh "$b" | cut -f1))"
i=$((i+1))
done
echo ""
- read -p " 选择要恢复的备份编号: " RESTORE_NUM
+ read -p " 选择编号: " NUM
local j=1
- local RESTORE_PATH=""
- for b in "$BACKUP_DIR"/*/; do
- if [ "$j" = "$RESTORE_NUM" ]; then
- RESTORE_PATH="$b"
- break
+ for b in "$BK_DIR"/*/; do
+ if [ "$j" = "$NUM" ]; then
+ [ -f "$b/openclaw.json" ] && cp "$b/openclaw.json" "$CONFIG_PATH" && echo -e " ${GREEN} + 配置已恢复${NC}"
+ [ -d "$b/memory" ] && cp -R "$b/memory" "$DATA_DIR/" && echo -e " ${GREEN} + 记忆已恢复${NC}"
+ echo -e " ${GREEN}恢复完成${NC}"
+ return
fi
j=$((j+1))
done
-
- if [ -z "$RESTORE_PATH" ]; then
- echo -e " ${RED}无效选择${NC}"
- return
- fi
-
- echo ""
- echo -e " ${YELLOW}正在恢复 $(basename "$RESTORE_PATH")...${NC}"
-
- # 恢复 .env
- if [ -f "$RESTORE_PATH/.env" ]; then
- cp "$RESTORE_PATH/.env" "$OPENCLAW_DIR/.env"
- echo -e " ${GREEN} ✓ .env 已恢复${NC}"
- fi
-
- # 恢复 OpenClaw 状态
- if [ -d "$RESTORE_PATH/openclaw-state" ]; then
- mkdir -p "$HOME/.openclaw"
- cp -R "$RESTORE_PATH/openclaw-state/"* "$HOME/.openclaw/" 2>/dev/null || true
- echo -e " ${GREEN} ✓ OpenClaw 状态已恢复${NC}"
- fi
-
- # 恢复用户数据
- if [ -d "$RESTORE_PATH/memory" ]; then
- cp -R "$RESTORE_PATH/memory" "$UCLAW_DIR/"
- echo -e " ${GREEN} ✓ 记忆文件已恢复${NC}"
- fi
- if [ -d "$RESTORE_PATH/persona" ]; then
- cp -R "$RESTORE_PATH/persona" "$UCLAW_DIR/"
- echo -e " ${GREEN} ✓ 人格配置已恢复${NC}"
- fi
-
- echo ""
- echo -e " ${GREEN}恢复完成!${NC}"
+ echo -e " ${RED}无效选择${NC}"
}
-# [11] 重置
-do_reset() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 重置 OpenClaw ━━━${NC}"
- echo ""
- echo -e " ${RED}警告: 重置将清除配置和状态数据${NC}"
- echo ""
- echo -e " ${GREEN}[1]${NC} 仅重置配置(保留凭据和会话)"
- echo -e " ${YELLOW}[2]${NC} 重置配置 + 凭据 + 会话(保留工作区)"
- echo -e " ${RED}[3]${NC} 完全重置(恢复出厂状态)"
- echo -e " ${DIM}[0]${NC} 取消"
- echo ""
- read -p " 选择重置级别: " -n 1 RESET_CHOICE
- echo ""
-
- case $RESET_CHOICE in
- 1)
- echo ""
- echo -e " ${YELLOW}建议先备份! 是否先创建备份? (y/n)${NC}"
- read -n 1 DO_BACKUP
- echo ""
- [ "$DO_BACKUP" = "y" ] && do_backup
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs reset --scope config 2>&1 || true
- ;;
- 2)
- echo ""
- echo -e " ${YELLOW}建议先备份! 是否先创建备份? (y/n)${NC}"
- read -n 1 DO_BACKUP
- echo ""
- [ "$DO_BACKUP" = "y" ] && do_backup
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs reset --scope config+creds+sessions 2>&1 || true
- ;;
- 3)
- echo ""
- echo -e " ${RED}确定要完全重置吗? 输入 YES 确认:${NC} "
- read CONFIRM
- if [ "$CONFIRM" = "YES" ]; then
- do_backup
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs reset --scope full 2>&1 || true
- echo -e " ${GREEN}已恢复出厂状态${NC}"
- else
- echo " 已取消"
- fi
- ;;
- *)
- echo " 已取消"
- ;;
- esac
-}
-
-# [12] 清理
-do_cleanup() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 清理缓存和临时文件 ━━━${NC}"
- echo ""
-
- FREED=0
-
- # 清理 npm 缓存
- echo -e " ${YELLOW}清理 npm 缓存...${NC}"
- CACHE_SIZE=$("$NODE_BIN" "$NPM_BIN" cache ls 2>/dev/null | wc -l || echo 0)
- "$NODE_BIN" "$NPM_BIN" cache clean --force 2>/dev/null || true
- echo -e " ${GREEN} ✓ npm 缓存已清理${NC}"
-
- # 清理 Node.js 编译缓存
- if [ -d "$HOME/.cache/node" ]; then
- NSIZE=$(du -sm "$HOME/.cache/node" 2>/dev/null | cut -f1)
- rm -rf "$HOME/.cache/node"
- echo -e " ${GREEN} ✓ Node 编译缓存已清理 (${NSIZE}MB)${NC}"
- fi
-
- # 清理 OpenClaw 日志
- if [ -d "$HOME/.openclaw/logs" ]; then
- LSIZE=$(du -sm "$HOME/.openclaw/logs" 2>/dev/null | cut -f1)
- rm -rf "$HOME/.openclaw/logs"
- echo -e " ${GREEN} ✓ 日志已清理 (${LSIZE:-0}MB)${NC}"
- fi
-
- echo ""
- echo -e " ${GREEN}清理完成!${NC}"
-}
-
-# [13] 技能浏览器
-do_skills_browser() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 预装技能浏览器(52个,已离线可用)━━━${NC}"
- echo ""
- echo -e " ${WHITE}${BOLD} 效率 & 编程${NC}"
- echo -e " ${GREEN} github${NC} GitHub 操作(Issues/PR/代码审查/CI)"
- echo -e " ${GREEN} gh-issues${NC} 获取 Issues 并分配 Agent 修复"
- echo -e " ${GREEN} coding-agent${NC} 委派编程任务给 Codex/Claude/Pi"
- echo -e " ${GREEN} summarize${NC} 总结文本/网页/播客/视频"
- echo -e " ${GREEN} nano-pdf${NC} 自然语言编辑 PDF"
- echo -e " ${GREEN} clawhub${NC} 搜索安装更多社区技能"
- echo -e " ${GREEN} skill-creator${NC} 创建自定义技能"
- echo ""
- echo -e " ${WHITE}${BOLD} 笔记 & 任务管理${NC}"
- echo -e " ${GREEN} apple-notes${NC} Apple 备忘录(创建/搜索/编辑)"
- echo -e " ${GREEN} apple-reminders${NC} Apple 提醒事项"
- echo -e " ${GREEN} obsidian${NC} Obsidian 笔记操作"
- echo -e " ${GREEN} notion${NC} Notion 页面和数据库"
- echo -e " ${GREEN} things-mac${NC} Things 3 任务管理 (macOS)"
- echo -e " ${GREEN} trello${NC} Trello 看板操作"
- echo -e " ${GREEN} bear-notes${NC} Bear 笔记"
- echo ""
- echo -e " ${WHITE}${BOLD} AI & 创作${NC}"
- echo -e " ${GREEN} openai-image-gen${NC} AI 图片生成"
- echo -e " ${GREEN} openai-whisper${NC} 语音转文字(本地)"
- echo -e " ${GREEN} openai-whisper-api${NC} 语音转文字(API)"
- echo -e " ${GREEN} gemini${NC} Gemini 一键问答"
- echo -e " ${GREEN} sag${NC} ElevenLabs 文字转语音"
- echo -e " ${GREEN} sherpa-onnx-tts${NC} 本地离线文字转语音"
- echo -e " ${GREEN} nano-banana-pro${NC} Gemini 3 图片生成"
- echo ""
- echo -e " ${WHITE}${BOLD} 通讯 & 社交${NC}"
- echo -e " ${GREEN} himalaya${NC} 邮件收发(IMAP/SMTP)"
- echo -e " ${GREEN} discord${NC} Discord 消息操作"
- echo -e " ${GREEN} slack${NC} Slack 消息操作"
- echo -e " ${GREEN} wacli${NC} WhatsApp 消息和历史"
- echo -e " ${GREEN} imsg${NC} iMessage/SMS"
- echo -e " ${GREEN} xurl${NC} X (Twitter) API"
- echo ""
- echo -e " ${WHITE}${BOLD} 系统 & 工具${NC}"
- echo -e " ${GREEN} weather${NC} 天气查询"
- echo -e " ${GREEN} peekaboo${NC} macOS 屏幕截图和 UI 自动化"
- echo -e " ${GREEN} tmux${NC} 远程终端管理"
- echo -e " ${GREEN} healthcheck${NC} 系统安全检查"
- echo -e " ${GREEN} 1password${NC} 1Password 密码管理"
- echo -e " ${GREEN} video-frames${NC} 视频截帧 (ffmpeg)"
- echo -e " ${GREEN} session-logs${NC} 会话日志搜索分析"
- echo -e " ${GREEN} mcporter${NC} MCP 服务管理"
- echo ""
- echo -e " ${WHITE}${BOLD} 智能家居 & IoT${NC}"
- echo -e " ${GREEN} openhue${NC} Philips Hue 灯光控制"
- echo -e " ${GREEN} sonoscli${NC} Sonos 音箱控制"
- echo -e " ${GREEN} eightctl${NC} Eight Sleep 智能床垫"
- echo -e " ${GREEN} camsnap${NC} 摄像头截图/录像"
- echo ""
- echo -e " ${DIM} 提示: 这些技能已全部预装在 U 盘中,无需联网下载${NC}"
- echo -e " ${DIM} 使用: 在 OpenClaw 中直接说 \"帮我查天气\" 或 \"帮我发邮件\" 即可${NC}"
- echo -e " ${DIM} 更多: 运行 openclaw 后输入 /skills 查看详情${NC}"
-}
-
-# [14] 中国用户指南
-do_china_guide() {
- echo ""
- if [ -f "$UCLAW_DIR/中国用户指南.txt" ]; then
- cat "$UCLAW_DIR/中国用户指南.txt"
- else
- echo " 指南文件不存在"
- fi
-}
-
-# [15] 使用说明
-do_readme() {
- echo ""
- if [ -f "$UCLAW_DIR/使用说明.txt" ]; then
- cat "$UCLAW_DIR/使用说明.txt"
- else
- echo " 使用说明文件不存在"
- fi
-}
-
-# [16] 系统信息
+# [8] System info
do_sysinfo() {
echo ""
- echo -e " ${CYAN}${BOLD}━━━ 系统信息 ━━━${NC}"
- echo ""
- echo " 操作系统: $(sw_vers -productName 2>/dev/null || uname -s) $(sw_vers -productVersion 2>/dev/null || uname -r)"
- echo " CPU架构: $(uname -m)"
- echo " 内存: $(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.1f GB", $1/1024/1024/1024}' || echo '未知')"
- echo " Node.js: $($NODE_BIN --version 2>/dev/null || echo '未找到')"
- echo " npm: $($NODE_BIN $NPM_BIN --version 2>/dev/null || echo '未找到')"
- echo ""
- echo " U-Claw 路径: $UCLAW_DIR"
- echo " U-Claw 大小: $(du -sh "$UCLAW_DIR" 2>/dev/null | cut -f1)"
- echo ""
- if [ -d "$HOME/.uclaw" ]; then
- echo " 已安装路径: $HOME/.uclaw"
- echo " 已安装大小: $(du -sh "$HOME/.uclaw" 2>/dev/null | cut -f1)"
- else
- echo " 电脑安装: 未安装"
- fi
- echo ""
- if [ -d "$HOME/.openclaw" ]; then
- echo " OpenClaw 状态: $HOME/.openclaw"
- echo " 状态大小: $(du -sh "$HOME/.openclaw" 2>/dev/null | cut -f1)"
- fi
- echo ""
- echo " 磁盘空间: $(df -h "$UCLAW_DIR" 2>/dev/null | tail -1 | awk '{print $4 " 可用 / " $2 " 总计"}')"
+ echo " 系统: $(sw_vers -productName 2>/dev/null) $(sw_vers -productVersion 2>/dev/null)"
+ echo " CPU: $(uname -m)"
+ echo " 内存: $(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.0f GB", $1/1024/1024/1024}')"
+ echo " Node: $("$NODE_BIN" --version 2>/dev/null)"
+ echo " 路径: $UCLAW_DIR"
+ echo " 大小: $(du -sh "$UCLAW_DIR" 2>/dev/null | cut -f1)"
+ echo " 磁盘: $(df -h "$UCLAW_DIR" | tail -1 | awk '{print $4 " 可用"}')"
}
-# 主循环
+# Main loop
while true; do
show_menu
- read -p " 请选择 [0-16]: " CHOICE
+ read -p " 请选择 [0-8]: " CHOICE
echo ""
case $CHOICE in
- 1) do_install ;;
- 2) do_npm_install ;;
- 3) do_build ;;
- 4) do_run ;;
- 5) do_china_models ;;
- 6) do_china_channels ;;
- 7) do_mirror ;;
- 8) do_doctor ;;
- 9) do_backup ;;
- 10) do_restore ;;
- 11) do_reset ;;
- 12) do_cleanup ;;
- 13) do_skills_browser ;;
- 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-17${NC}"
- ;;
+ 1) do_config ;;
+ 2) do_dashboard ;;
+ 3) do_qq ;;
+ 4) do_platforms ;;
+ 5) do_doctor ;;
+ 6) do_backup ;;
+ 7) do_restore ;;
+ 8) do_sysinfo ;;
+ 0) echo -e " ${CYAN}再见!${NC}"; exit 0 ;;
+ *) echo -e " ${RED}无效选择${NC}" ;;
esac
echo ""
- read -p " 按回车键返回主菜单..."
+ read -p " 按回车返回..."
done
diff --git a/portable/Windows-Menu.bat b/portable/Windows-Menu.bat
index cd61e5e..5381694 100644
--- a/portable/Windows-Menu.bat
+++ b/portable/Windows-Menu.bat
@@ -1,6 +1,6 @@
@echo off
chcp 65001 >/dev/null 2>&1
-title U-Claw - Full Menu
+title U-Claw Menu
set "UCLAW_DIR=%~dp0"
set "CORE_DIR=%UCLAW_DIR%app\core"
@@ -8,12 +8,11 @@ set "DATA_DIR=%UCLAW_DIR%data"
set "STATE_DIR=%DATA_DIR%\.openclaw"
set "NODE_DIR=%UCLAW_DIR%app\runtime\node-win-x64"
set "NODE_BIN=%NODE_DIR%\node.exe"
-set "NPM_BIN=%NODE_DIR%\npm.cmd"
set "OPENCLAW_HOME=%DATA_DIR%"
set "OPENCLAW_STATE_DIR=%STATE_DIR%"
set "OPENCLAW_CONFIG_PATH=%STATE_DIR%\openclaw.json"
-set "PATH=%NODE_DIR%;%NODE_DIR%\node_modules\.bin;%PATH%"
+set "PATH=%NODE_DIR%;%PATH%"
if not exist "%STATE_DIR%" mkdir "%STATE_DIR%"
if not exist "%DATA_DIR%\memory" mkdir "%DATA_DIR%\memory"
@@ -23,184 +22,63 @@ if not exist "%DATA_DIR%\backups" mkdir "%DATA_DIR%\backups"
cls
echo.
echo ========================================
-echo U-Claw v1.1 - Full Menu
+echo U-Claw v1.1 - Menu
+echo Portable AI Agent
echo ========================================
echo.
if exist "%NODE_BIN%" (
- for /f "tokens=*" %%v in ('"%NODE_BIN%" --version') do echo Node.js: %%v
+ for /f "tokens=*" %%v in ('"%%NODE_BIN%%" --version') do echo Node: %%v
) else (
echo [!] Node.js not found
)
-if exist "%CORE_DIR%\node_modules" (echo Dependencies: OK) else (echo Dependencies: NOT INSTALLED)
-if exist "%CORE_DIR%\dist" (echo Build: OK) else (echo Build: NOT BUILT)
if exist "%STATE_DIR%\openclaw.json" (echo Config: OK) else (echo Config: NOT SET)
echo.
-echo -- Start --
-echo [1] Quick start (gateway + browser)
-echo [2] Setup wizard (choose model, API key)
+echo -- Config --
+echo [1] Setup wizard (model, API key)
+echo [2] Open web dashboard
echo.
-echo -- China Platforms --
-echo [3] QQ Bot setup (Tencent official)
-echo [4] Feishu / DingTalk / WeChat
-echo.
-echo -- Skills --
-echo [5] Browse pre-installed skills (52)
-echo [6] Install skill from ClawHub
+echo -- Chat Platforms --
+echo [3] QQ Bot (pre-installed, enter ID only)
+echo [4] Other platforms (Feishu/Telegram/WeChat)
echo.
echo -- Maintenance --
-echo [7] Diagnostics (openclaw doctor)
-echo [8] Backup config and memory
-echo [9] Restore backup
-echo [10] Reset (factory default)
+echo [5] Diagnostics
+echo [6] Backup config
+echo [7] Restore backup
+echo [8] System info
echo.
-echo -- Other --
-echo [11] Open web dashboard
-echo [12] System info
-echo [13] Set China mirror
echo [0] Exit
echo.
-set /p choice=" Choose [0-13]: "
+set /p choice=" Choose [0-8]: "
-if "%choice%"=="1" goto :start
-if "%choice%"=="2" goto :onboard
+if "%choice%"=="1" goto :onboard
+if "%choice%"=="2" goto :dashboard
if "%choice%"=="3" goto :qqbot
if "%choice%"=="4" goto :channels
-if "%choice%"=="5" goto :skills
-if "%choice%"=="6" goto :install_skill
-if "%choice%"=="7" goto :doctor
-if "%choice%"=="8" goto :backup
-if "%choice%"=="9" goto :restore
-if "%choice%"=="10" goto :reset
-if "%choice%"=="11" goto :dashboard
-if "%choice%"=="12" goto :sysinfo
-if "%choice%"=="13" goto :mirror
+if "%choice%"=="5" goto :doctor
+if "%choice%"=="6" goto :backup
+if "%choice%"=="7" goto :restore
+if "%choice%"=="8" goto :sysinfo
if "%choice%"=="0" exit /b 0
echo Invalid choice
pause
goto :menu
-:start
-call "%UCLAW_DIR%start.bat"
-goto :end
-
:onboard
+echo.
+echo === Setup Wizard ===
+echo.
+echo DeepSeek - Custom Provider, URL: https://api.deepseek.com/v1
+echo Kimi - Moonshot AI
+echo Qwen - Qwen
+echo Doubao - Volcano Engine
+echo.
cd /d "%CORE_DIR%"
"%NODE_BIN%" openclaw.mjs onboard
pause
goto :menu
-:qqbot
-echo.
-echo === QQ Bot Setup (Tencent Official) ===
-echo.
-echo 1. Register: http://q.qq.com/qqbot/openclaw/login.html
-echo 2. Create bot, get AppID and AppSecret
-echo 3. Run these commands:
-echo.
-echo openclaw plugins install @sliverp/qqbot@latest
-echo openclaw channels add --channel qqbot --token "AppID:AppSecret"
-echo openclaw config set channels.qqbot.allowFrom "your_qq_number"
-echo openclaw gateway restart
-echo.
-set /p qqinstall=" Install QQ plugin now? (y/n): "
-if /i "%qqinstall%"=="y" (
- cd /d "%CORE_DIR%"
- "%NODE_BIN%" openclaw.mjs plugins install @sliverp/qqbot@latest
- echo.
- set /p qqid=" AppID: "
- set /p qqsecret=" AppSecret: "
- if not "%qqid%"=="" if not "%qqsecret%"=="" (
- "%NODE_BIN%" openclaw.mjs channels add --channel qqbot --token "%qqid%:%qqsecret%"
- set /p qqallow=" Your QQ number (allowlist): "
- if not "%qqallow%"=="" "%NODE_BIN%" openclaw.mjs config set channels.qqbot.allowFrom "%qqallow%"
- echo QQ Bot configured!
- )
-)
-pause
-goto :menu
-
-:channels
-echo.
-echo === Chat Platforms ===
-echo.
-echo [a] Feishu - https://open.feishu.cn/app
-echo [b] WeChat - openclaw plugins install @icesword760/openclaw-wechat
-echo [c] DingTalk - built-in
-echo [d] Telegram / Discord / WhatsApp / Slack - built-in
-echo.
-echo Use [2] Setup wizard to configure these platforms.
-pause
-goto :menu
-
-:skills
-echo.
-echo === Pre-installed Skills (52) ===
-echo.
-echo Productivity: github, coding-agent, summarize, nano-pdf, clawhub
-echo Notes: apple-notes, obsidian, notion, trello, bear-notes
-echo AI: openai-image-gen, openai-whisper, gemini, sherpa-onnx-tts
-echo Social: himalaya (email), discord, slack, wacli (WhatsApp)
-echo System: weather, peekaboo, tmux, healthcheck, 1password
-echo IoT: openhue, sonoscli, eightctl, camsnap
-echo.
-echo Use "openclaw skills list" for full list.
-pause
-goto :menu
-
-:install_skill
-echo.
-set /p skillname=" Skill name: "
-if not "%skillname%"=="" (
- cd /d "%CORE_DIR%"
- "%NODE_BIN%" openclaw.mjs skills install %skillname%
-)
-pause
-goto :menu
-
-:doctor
-cd /d "%CORE_DIR%"
-"%NODE_BIN%" openclaw.mjs doctor --repair
-pause
-goto :menu
-
-:backup
-echo.
-set "TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%"
-set "TIMESTAMP=%TIMESTAMP: =0%"
-set "BACKUP_PATH=%DATA_DIR%\backups\backup_%TIMESTAMP%"
-mkdir "%BACKUP_PATH%" 2>/dev/null
-if exist "%STATE_DIR%\openclaw.json" copy "%STATE_DIR%\openclaw.json" "%BACKUP_PATH%\" >/dev/null
-if exist "%DATA_DIR%\memory" xcopy /s /q "%DATA_DIR%\memory" "%BACKUP_PATH%\memory\" >/dev/null 2>/dev/null
-echo Backup saved to: %BACKUP_PATH%
-pause
-goto :menu
-
-:restore
-echo.
-echo Backups:
-dir /b "%DATA_DIR%\backups\" 2>/dev/null
-echo.
-set /p restorename=" Backup folder name: "
-if exist "%DATA_DIR%\backups\%restorename%\openclaw.json" (
- copy "%DATA_DIR%\backups\%restorename%\openclaw.json" "%STATE_DIR%\" >/dev/null
- echo Config restored!
-)
-pause
-goto :menu
-
-:reset
-echo.
-echo WARNING: This will reset your config!
-set /p confirm=" Type YES to confirm: "
-if "%confirm%"=="YES" (
- del "%STATE_DIR%\openclaw.json" 2>/dev/null
- echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}} > "%STATE_DIR%\openclaw.json"
- echo Reset complete.
-)
-pause
-goto :menu
-
:dashboard
echo.
echo Starting gateway...
@@ -221,22 +99,82 @@ start "" http://127.0.0.1:%PORT%/#token=uclaw
pause
goto :menu
+:qqbot
+echo.
+echo === QQ Bot Setup ===
+echo.
+echo QQ plugin is pre-installed!
+echo You only need your AppID and AppSecret.
+echo.
+echo Get them at: q.qq.com (create a bot)
+echo.
+set /p qqid=" AppID: "
+set /p qqsecret=" AppSecret: "
+if "%qqid%"=="" goto :qq_cancel
+if "%qqsecret%"=="" goto :qq_cancel
+cd /d "%CORE_DIR%"
+"%NODE_BIN%" openclaw.mjs channels add --channel qqbot --token "%qqid%:%qqsecret%"
+echo.
+set /p qqallow=" Your QQ number (allowlist, empty to skip): "
+if not "%qqallow%"=="" "%NODE_BIN%" openclaw.mjs config set channels.qqbot.allowFrom "%qqallow%"
+echo.
+echo QQ Bot configured! Restart gateway to apply.
+pause
+goto :menu
+:qq_cancel
+echo Cancelled.
+pause
+goto :menu
+
+:channels
+echo.
+echo === Other Platforms ===
+echo.
+echo Feishu: Built-in. Use [1] Setup wizard.
+echo Telegram: Built-in. Use [1] Setup wizard.
+echo Discord: Built-in. Use [1] Setup wizard.
+echo WeChat: Community plugin.
+echo.
+echo Use Setup wizard [1] to configure these.
+pause
+goto :menu
+
+:doctor
+cd /d "%CORE_DIR%"
+"%NODE_BIN%" openclaw.mjs doctor --repair
+pause
+goto :menu
+
+:backup
+echo.
+set "TS=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%"
+set "TS=%TS: =0%"
+set "BK=%DATA_DIR%\backups\backup_%TS%"
+mkdir "%BK%" 2>nul
+if exist "%STATE_DIR%\openclaw.json" copy "%STATE_DIR%\openclaw.json" "%BK%\" >nul
+if exist "%DATA_DIR%\memory" xcopy /s /q "%DATA_DIR%\memory" "%BK%\memory\" >/dev/null 2>nul
+echo Backup saved: %BK%
+pause
+goto :menu
+
+:restore
+echo.
+echo Available backups:
+dir /b "%DATA_DIR%\backups\" 2>nul
+echo.
+set /p rname=" Backup folder name: "
+if exist "%DATA_DIR%\backups\%rname%\openclaw.json" (
+ copy "%DATA_DIR%\backups\%rname%\openclaw.json" "%STATE_DIR%\" >nul
+ echo Config restored!
+)
+pause
+goto :menu
+
:sysinfo
echo.
echo OS: Windows
-echo Node:
"%NODE_BIN%" --version
-echo U-Claw: %UCLAW_DIR%
+echo Path: %UCLAW_DIR%
echo Data: %DATA_DIR%
pause
-goto :menu
-
-:mirror
-echo.
-cd /d "%CORE_DIR%"
-"%NODE_BIN%" "%NPM_BIN%" config set registry https://registry.npmmirror.com --location=project
-echo npm mirror set to: registry.npmmirror.com
-pause
-goto :menu
-
-:end
+goto :menu
\ No newline at end of file
diff --git a/tests/test-scripts.sh b/tests/test-scripts.sh
deleted file mode 100644
index 251d5a1..0000000
--- a/tests/test-scripts.sh
+++ /dev/null
@@ -1,230 +0,0 @@
-#!/bin/bash
-# ============================================================
-# U-Claw 脚本测试套件
-# 验证 Windows .bat 和 macOS .command 脚本的正确性
-# ============================================================
-
-set -euo pipefail
-
-SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
-UCLAW_SCRIPTS="$SCRIPT_DIR/uclaw-scripts"
-
-PASS=0
-FAIL=0
-TOTAL=0
-
-pass() {
- PASS=$((PASS + 1))
- TOTAL=$((TOTAL + 1))
- echo " ✓ $1"
-}
-
-fail() {
- FAIL=$((FAIL + 1))
- TOTAL=$((TOTAL + 1))
- echo " ✗ $1"
-}
-
-check() {
- local desc="$1"
- local file="$2"
- local pattern="$3"
- if grep -q "$pattern" "$file" 2>/dev/null; then
- pass "$desc"
- else
- fail "$desc"
- fi
-}
-
-check_not() {
- local desc="$1"
- local file="$2"
- local pattern="$3"
- if grep -q "$pattern" "$file" 2>/dev/null; then
- fail "$desc"
- else
- pass "$desc"
- fi
-}
-
-echo ""
-echo "=========================================="
-echo " U-Claw 脚本测试套件"
-echo "=========================================="
-
-# ── 文件存在性测试 ──
-echo ""
-echo "── 文件存在性 ──"
-
-for f in "Windows-从U盘启动.bat" "Mac-从U盘启动.command" "Windows-全部功能.bat" "Mac-全部功能.command" "Windows-安装到电脑.bat" "Mac-安装到电脑.command" "使用说明.txt" "中国用户指南.txt"; do
- if [ -f "$UCLAW_SCRIPTS/$f" ]; then
- pass "存在: $f"
- else
- fail "缺失: $f"
- fi
-done
-
-# ── macOS .command 语法检查 ──
-echo ""
-echo "── macOS 脚本语法检查 ──"
-
-for f in "Mac-从U盘启动.command" "Mac-全部功能.command" "Mac-安装到电脑.command"; do
- if bash -n "$UCLAW_SCRIPTS/$f" 2>/dev/null; then
- pass "语法正确: $f"
- else
- fail "语法错误: $f"
- fi
-done
-
-# ── 运行.bat 测试 ──
-echo ""
-echo "── 运行.bat ──"
-BAT_RUN="$UCLAW_SCRIPTS/Windows-从U盘启动.bat"
-
-check "设置 UTF-8 编码" "$BAT_RUN" "chcp 65001"
-check "设置便携模式 OPENCLAW_HOME" "$BAT_RUN" "OPENCLAW_HOME"
-check "设置便携模式 OPENCLAW_STATE_DIR" "$BAT_RUN" "OPENCLAW_STATE_DIR"
-check "设置便携模式 OPENCLAW_CONFIG_PATH" "$BAT_RUN" "OPENCLAW_CONFIG_PATH"
-check "使用 gateway run" "$BAT_RUN" "gateway run"
-check "使用 --allow-unconfigured" "$BAT_RUN" "\-\-allow-unconfigured"
-check "使用 --force" "$BAT_RUN" "\-\-force"
-check "首次用户走 onboard" "$BAT_RUN" "onboard"
-check "检查 Node.js 存在" "$BAT_RUN" "NODE_BIN"
-check_not "不依赖 pnpm" "$BAT_RUN" "pnpm"
-check "版本号 v1.1" "$BAT_RUN" "v1.1"
-
-# ── 运行.command 测试 ──
-echo ""
-echo "── 运行.command ──"
-CMD_RUN="$UCLAW_SCRIPTS/Mac-从U盘启动.command"
-
-check "设置便携模式 OPENCLAW_HOME" "$CMD_RUN" "OPENCLAW_HOME"
-check "设置便携模式 OPENCLAW_STATE_DIR" "$CMD_RUN" "OPENCLAW_STATE_DIR"
-check "设置便携模式 OPENCLAW_CONFIG_PATH" "$CMD_RUN" "OPENCLAW_CONFIG_PATH"
-check "使用 gateway run" "$CMD_RUN" "gateway run"
-check "使用 --allow-unconfigured" "$CMD_RUN" "\-\-allow-unconfigured"
-check "使用 --force" "$CMD_RUN" "\-\-force"
-check "首次用户走 onboard" "$CMD_RUN" "onboard"
-check "自动打开浏览器" "$CMD_RUN" 'open "$URL"'
-check "检测 CPU 架构" "$CMD_RUN" "uname -m"
-check "支持 arm64" "$CMD_RUN" "arm64"
-check_not "不依赖 pnpm" "$CMD_RUN" "pnpm"
-
-# ── 启动菜单.bat 测试 ──
-echo ""
-echo "── 启动菜单.bat ──"
-BAT_MENU="$UCLAW_SCRIPTS/Windows-全部功能.bat"
-
-check "设置 UTF-8 编码" "$BAT_MENU" "chcp 65001"
-check "便携模式 OPENCLAW_HOME" "$BAT_MENU" "OPENCLAW_HOME"
-check "有 QQ Bot 选项" "$BAT_MENU" "QQ Bot"
-check "QQ AppID 单独输入" "$BAT_MENU" "AppID"
-check "QQ AppSecret 单独输入" "$BAT_MENU" "AppSecret"
-check "DeepSeek 模型提示" "$BAT_MENU" "deepseek"
-check "Custom Provider 提示" "$BAT_MENU" "Custom Provider"
-check "有控制台入口" "$BAT_MENU" "控制台"
-check "gateway run 命令" "$BAT_MENU" "gateway run"
-check "版本号 v1.1" "$BAT_MENU" "v1.1"
-check_not "不依赖 pnpm" "$BAT_MENU" "pnpm"
-
-# ── 启动菜单.command 测试 ──
-echo ""
-echo "── 启动菜单.command ──"
-CMD_MENU="$UCLAW_SCRIPTS/Mac-全部功能.command"
-
-check "便携模式 OPENCLAW_HOME" "$CMD_MENU" "OPENCLAW_HOME"
-check "有 QQ 选项" "$CMD_MENU" "QQ"
-check "QQ AppID 单独输入" "$CMD_MENU" "AppID"
-check "QQ AppSecret 单独输入" "$CMD_MENU" "AppSecret"
-check "DeepSeek 模型提示" "$CMD_MENU" "deepseek"
-check "Custom Provider 提示" "$CMD_MENU" "Custom Provider"
-check "有 dashboard 入口" "$CMD_MENU" "dashboard"
-check "gateway run 命令" "$CMD_MENU" "gateway run"
-check "自动打开浏览器" "$CMD_MENU" 'open "$URL"'
-
-# ── 安装到电脑.bat 测试 ──
-echo ""
-echo "── 安装到电脑.bat ──"
-BAT_INSTALL="$UCLAW_SCRIPTS/Windows-安装到电脑.bat"
-
-check "设置 UTF-8 编码" "$BAT_INSTALL" "chcp 65001"
-check "安全提醒" "$BAT_INSTALL" "安全提醒"
-check "共享电脑警告" "$BAT_INSTALL" "共享电脑"
-check "安装到 .uclaw" "$BAT_INSTALL" "\.uclaw"
-check "创建 uclaw.cmd" "$BAT_INSTALL" "uclaw.cmd"
-check "创建 openclaw.cmd" "$BAT_INSTALL" "openclaw.cmd"
-check "添加到 PATH" "$BAT_INSTALL" "setx PATH"
-check "PATH 长度检查" "$BAT_INSTALL" "1024"
-check "Node.js 安装检查" "$BAT_INSTALL" "node.exe"
-check "版本号 v1.1" "$BAT_INSTALL" "v1.1"
-check_not "不备份 .env" "$BAT_INSTALL" "env-backup"
-
-# ── 安装到电脑.command 测试 ──
-echo ""
-echo "── 安装到电脑.command ──"
-CMD_INSTALL="$UCLAW_SCRIPTS/Mac-安装到电脑.command"
-
-check "安全提醒" "$CMD_INSTALL" "安全提醒"
-check "共享电脑警告" "$CMD_INSTALL" "共享电脑"
-check "安装到 .uclaw" "$CMD_INSTALL" "\.uclaw"
-check "检测 CPU 架构" "$CMD_INSTALL" "uname -m"
-check "支持 arm64" "$CMD_INSTALL" "arm64"
-check "创建 symlink" "$CMD_INSTALL" "ln -sf"
-check "添加到 shell RC" "$CMD_INSTALL" "zshrc"
-check "spinner 动画" "$CMD_INSTALL" "run_with_spinner"
-check "set -euo pipefail" "$CMD_INSTALL" "set -euo pipefail"
-
-# ── 安全检查(无敏感信息泄露)──
-echo ""
-echo "── 安全检查 ──"
-
-for f in "$UCLAW_SCRIPTS"/*.bat "$UCLAW_SCRIPTS"/*.command "$UCLAW_SCRIPTS"/*.txt; do
- fname=$(basename "$f")
- check_not "无 API Key: $fname" "$f" "sk-[a-zA-Z0-9]\{20,\}"
- check_not "无硬编码密码: $fname" "$f" "password.*=.*['\"][^'\"]\{8,\}"
-done
-
-# ── Windows/Mac 一致性检查 ──
-echo ""
-echo "── 跨平台一致性 ──"
-
-# 两边都有 gateway run
-if grep -q "gateway run" "$BAT_RUN" && grep -q "gateway run" "$CMD_RUN"; then
- pass "运行脚本:两端都用 gateway run"
-else
- fail "运行脚本:gateway run 不一致"
-fi
-
-# 两边都有 onboard
-if grep -q "onboard" "$BAT_RUN" && grep -q "onboard" "$CMD_RUN"; then
- pass "运行脚本:两端都有 onboard 流程"
-else
- fail "运行脚本:onboard 流程不一致"
-fi
-
-# 两边菜单都有 QQ
-if grep -q "QQ" "$BAT_MENU" && grep -q "QQ" "$CMD_MENU"; then
- pass "启动菜单:两端都有 QQ 接入"
-else
- fail "启动菜单:QQ 接入不一致"
-fi
-
-# 两边安装都有安全提醒
-if grep -q "安全提醒" "$BAT_INSTALL" && grep -q "安全提醒" "$CMD_INSTALL"; then
- pass "安装脚本:两端都有安全提醒"
-else
- fail "安装脚本:安全提醒不一致"
-fi
-
-# ── 结果汇总 ──
-echo ""
-echo "=========================================="
-if [ $FAIL -eq 0 ]; then
- echo " 全部通过! $PASS/$TOTAL"
-else
- echo " 失败 $FAIL 项 / 共 $TOTAL 项"
-fi
-echo "=========================================="
-echo ""
-
-exit $FAIL
diff --git a/uclaw-scripts/Mac-安装并启动.command b/uclaw-scripts/Mac-Install.command
similarity index 61%
rename from uclaw-scripts/Mac-安装并启动.command
rename to uclaw-scripts/Mac-Install.command
index 9635f66..1f1ad0a 100755
--- a/uclaw-scripts/Mac-安装并启动.command
+++ b/uclaw-scripts/Mac-Install.command
@@ -1,8 +1,5 @@
#!/bin/bash
-# ============================================================
-# U-Claw 虾盘 - macOS 一键安装并启动
-# 从 U 盘解压到电脑,然后启动 OpenClaw
-# ============================================================
+# U-Claw - Extract and Launch (macOS)
GREEN='\033[0;32m'
CYAN='\033[0;36m'
@@ -15,16 +12,16 @@ echo ""
echo -e "${CYAN}"
echo " ╔══════════════════════════════════════╗"
echo " ║ U-Claw 虾盘 v1.1 ║"
-echo " ║ 一键安装并启动 (macOS) ║"
+echo " ║ 一键解压并启动 (macOS) ║"
echo " ╚══════════════════════════════════════╝"
echo -e "${NC}"
-USB_DIR="$(cd "$(dirname "$0")" && pwd)"
-ARCHIVE="$USB_DIR/U-Claw.tar.gz"
-INSTALL_DIR="$HOME/U-Claw"
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+ARCHIVE="$SCRIPT_DIR/U-Claw.tar.gz"
+INSTALL_DIR="$SCRIPT_DIR/U-Claw"
-# 移除 macOS 隔离标记(解决"无法验证开发者"弹窗)
-xattr -rd com.apple.quarantine "$USB_DIR" 2>/dev/null || true
+# 移除 macOS 隔离标记
+xattr -rd com.apple.quarantine "$SCRIPT_DIR" 2>/dev/null || true
# 检查压缩包
if [ ! -f "$ARCHIVE" ]; then
@@ -34,19 +31,19 @@ if [ ! -f "$ARCHIVE" ]; then
exit 1
fi
-# 检查是否已安装
+# 检查是否已解压
if [ -d "$INSTALL_DIR/app/core/node_modules" ]; then
- echo -e " ${GREEN}检测到已安装的 U-Claw${NC}"
+ echo -e " ${GREEN}检测到已解压的 U-Claw${NC}"
echo " 位置: $INSTALL_DIR"
echo ""
echo -e " ${YELLOW}[1] 直接启动(跳过解压)${NC}"
- echo " [2] 重新安装(覆盖现有)"
+ echo " [2] 重新解压(覆盖现有)"
echo ""
read -p " 请选择 [1/2,默认1]: " choice
choice="${choice:-1}"
if [ "$choice" = "2" ]; then
echo ""
- echo -e " ${YELLOW}正在重新安装...${NC}"
+ echo -e " ${YELLOW}正在重新解压...${NC}"
rm -rf "$INSTALL_DIR"
else
echo ""
@@ -57,12 +54,19 @@ fi
# 解压(如果需要)
if [ ! -d "$INSTALL_DIR/app/core/node_modules" ]; then
echo ""
- echo -e " ${CYAN}正在解压 U-Claw 到 $INSTALL_DIR ...${NC}"
- echo " 这可能需要 30-60 秒,请稍等..."
+ echo -e " ${CYAN}正在解压 U-Claw ...${NC}"
+ echo " 解压到: $INSTALL_DIR"
echo ""
- mkdir -p "$HOME"
- cd "$HOME"
+ # 检测是否在 U 盘上(挂载点判断)
+ if echo "$SCRIPT_DIR" | grep -q "/Volumes/"; then
+ echo -e " ${YELLOW}检测到 U 盘,解压可能需要 3-5 分钟,请耐心等待...${NC}"
+ else
+ echo " 大约需要 1-2 分钟..."
+ fi
+ echo ""
+
+ cd "$SCRIPT_DIR"
tar xzf "$ARCHIVE"
if [ $? -ne 0 ]; then
@@ -71,14 +75,14 @@ if [ ! -d "$INSTALL_DIR/app/core/node_modules" ]; then
exit 1
fi
+ # 解压后移除隔离标记
+ xattr -rd com.apple.quarantine "$INSTALL_DIR" 2>/dev/null || true
+
echo -e " ${GREEN}解压完成!${NC}"
echo ""
fi
-# 删除 Windows 相关文件(可选,不影响运行)
-# rm -f "$INSTALL_DIR"/Windows-*.bat 2>/dev/null
-
-# 启动 OpenClaw
+# 启动
echo -e " ${CYAN}正在启动 OpenClaw...${NC}"
echo ""
diff --git a/uclaw-scripts/Mac-从U盘启动.command b/uclaw-scripts/Mac-从U盘启动.command
deleted file mode 100644
index 8207ae7..0000000
--- a/uclaw-scripts/Mac-从U盘启动.command
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/bin/bash
-# ============================================================
-# U-Claw 虾盘 - macOS 一键启动
-# 双击此文件即可启动 OpenClaw
-# ============================================================
-
-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'
-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}"
-echo " ╔══════════════════════════════════════╗"
-echo " ║ U-Claw 虾盘 v1.0 ║"
-echo " ║ OpenClaw 一键启动 ║"
-echo " ╚══════════════════════════════════════╝"
-echo -e "${NC}"
-echo -e " ${GREEN}推荐场景:老电脑 / 临时电脑 / 不想改本机环境${NC}"
-echo ""
-
-# 检测 CPU 架构
-ARCH=$(uname -m)
-if [ "$ARCH" = "arm64" ]; then
- NODE_DIR="$UCLAW_DIR/runtime/node-mac-arm64"
- echo -e " ${GREEN}检测到 Apple Silicon (M系列芯片)${NC}"
-else
- NODE_DIR="$UCLAW_DIR/runtime/node-mac-x64"
- echo -e " ${GREEN}检测到 Intel Mac${NC}"
-fi
-
-NODE_BIN="$NODE_DIR/bin/node"
-NPM_BIN="$NODE_DIR/bin/npm"
-
-if [ ! -f "$NODE_BIN" ]; then
- echo -e " ${RED}错误: 找不到 Node.js 运行环境${NC}"
- echo " 请确保 runtime/ 目录完整"
- echo ""
- read -p " 按回车键退出..."
- exit 1
-fi
-
-NODE_VER=$("$NODE_BIN" --version)
-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"
-
-mkdir -p "$PORTABLE_STATE_DIR"
-
-# 移除 macOS 隔离标记(解决"无法验证开发者"弹窗)
-if xattr -l "$NODE_BIN" 2>/dev/null | grep -q "com.apple.quarantine"; then
- echo -e " ${YELLOW}正在移除 macOS 安全限制...${NC}"
- xattr -rd com.apple.quarantine "$UCLAW_DIR" 2>/dev/null || true
- echo -e " ${GREEN}已移除${NC}"
- echo ""
-fi
-
-# 检查依赖
-if [ ! -d "$OPENCLAW_DIR/node_modules" ]; then
- echo -e " ${YELLOW}首次运行,正在安装依赖...${NC}"
- echo " (使用淘宝镜像,请稍等)"
- echo ""
- cd "$OPENCLAW_DIR"
- run_with_spinner "安装 npm 依赖..." "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com
- echo ""
- echo -e " ${GREEN}依赖安装完成!${NC}"
- echo ""
-fi
-
-# 检查构建
-if [ ! -d "$OPENCLAW_DIR/dist" ]; then
- echo -e " ${YELLOW}首次运行,正在构建...${NC}"
- cd "$OPENCLAW_DIR"
- run_with_spinner "构建 OpenClaw..." "$NODE_BIN" "$NPM_BIN" run build
- echo ""
-fi
-
-# 首次运行:自动写入最小配置(跳过 onboard)
-if [ ! -f "$PORTABLE_CONFIG_PATH" ]; then
- echo -e " ${YELLOW}首次运行,正在初始化配置...${NC}"
- mkdir -p "$(dirname "$PORTABLE_CONFIG_PATH")"
- cat > "$PORTABLE_CONFIG_PATH" << 'CFGEOF'
-{
- "gateway": {
- "mode": "local",
- "auth": { "token": "uclaw" }
- }
-}
-CFGEOF
- echo -e " ${GREEN}配置已初始化${NC}"
- echo ""
-fi
-
-# 启动网关
-echo -e " ${CYAN}正在启动 OpenClaw...${NC}"
-echo " 此窗口不要关闭,关闭后服务会停止。"
-echo ""
-cd "$OPENCLAW_DIR"
-"$NODE_BIN" openclaw.mjs gateway run --allow-unconfigured --force &
-GW_PID=$!
-
-# 等网关启动,最多等 15 秒
-for i in $(seq 1 30); do
- sleep 0.5
- if curl -s -o /dev/null http://127.0.0.1:18789/ 2>/dev/null; then
- TOKEN=$(python3 -c "import json; d=json.load(open('$PORTABLE_CONFIG_PATH')); print(d.get('gateway',{}).get('auth',{}).get('token',''))" 2>/dev/null)
- URL="http://127.0.0.1:18789/#token=${TOKEN}"
- echo ""
- echo -e " ${GREEN}✅ 启动成功!${NC}"
- echo ""
- echo -e " ${CYAN}控制台地址: ${URL}${NC}"
- echo ""
- echo -e " ${YELLOW}▸ 首次使用请在控制台中配置:${NC}"
- echo " 1. 设置 AI 模型(DeepSeek / Kimi / 通义千问 等)"
- echo " 2. 接入聊天平台(QQ / 飞书 / 钉钉 等)"
- echo ""
- open "$URL" 2>/dev/null
- break
- fi
-done
-
-# 前台等待网关进程
-wait $GW_PID
-
-echo ""
-echo -e " ${YELLOW}OpenClaw 已退出。拔掉 U 盘后,本次便携运行就会结束。${NC}"
-read -p " 按回车键关闭窗口..."
diff --git a/uclaw-scripts/Mac-全部功能.command b/uclaw-scripts/Mac-全部功能.command
deleted file mode 100755
index 5469418..0000000
--- a/uclaw-scripts/Mac-全部功能.command
+++ /dev/null
@@ -1,839 +0,0 @@
-#!/bin/bash
-# ============================================================
-# U-Claw 虾盘 - 启动菜单 (雨林木风风格)
-# macOS 版本
-# ============================================================
-
-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'
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-CYAN='\033[0;36m'
-BLUE='\033[0;34m'
-MAGENTA='\033[0;35m'
-WHITE='\033[1;37m'
-GRAY='\033[0;37m'
-NC='\033[0m'
-BOLD='\033[1m'
-DIM='\033[2m'
-
-# 检测架构并设置 Node
-ARCH=$(uname -m)
-if [ "$ARCH" = "arm64" ]; then
- NODE_DIR="$UCLAW_DIR/runtime/node-mac-arm64"
-else
- NODE_DIR="$UCLAW_DIR/runtime/node-mac-x64"
-fi
-NODE_BIN="$NODE_DIR/bin/node"
-NPM_BIN="$NODE_DIR/bin/npm"
-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"
-
-mkdir -p "$PORTABLE_STATE_DIR"
-
-# 移除 macOS 隔离标记(解决"无法验证开发者"弹窗)
-if xattr -l "$NODE_BIN" 2>/dev/null | grep -q "com.apple.quarantine"; then
- xattr -rd com.apple.quarantine "$UCLAW_DIR" 2>/dev/null || true
-fi
-
-# 检查安装状态
-check_status() {
- HAS_MODULES="no"
- 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"
-}
-
-# 显示主菜单
-show_menu() {
- check_status
- clear
- echo ""
- echo -e "${CYAN}${BOLD}"
- echo " ╔════════════════════════════════════════════════════════╗"
- echo " ║ ║"
- echo " ║ 🦞 U-Claw 虾盘 v1.0 ║"
- echo " ║ OpenClaw AI 助手 一键安装盘 ║"
- echo " ║ ║"
- echo " ║ 专为中国用户优化 · 免翻墙 · 离线安装 ║"
- echo " ║ ║"
- echo " ╠════════════════════════════════════════════════════════╣"
- echo -e " ║${NC} ${CYAN}║"
-
- # 状态栏
- local STATUS_NODE="${GREEN}v$($NODE_BIN --version 2>/dev/null || echo '未找到')${NC}"
- local STATUS_MOD="${RED}未安装${NC}"
- local STATUS_BUILD="${RED}未构建${NC}"
- local STATUS_INST="${RED}未安装${NC}"
-
- [ "$HAS_MODULES" = "yes" ] && STATUS_MOD="${GREEN}已安装${NC}"
- [ "$HAS_DIST" = "yes" ] && STATUS_BUILD="${GREEN}已构建${NC}"
- [ "$INSTALLED" = "yes" ] && STATUS_INST="${GREEN}已安装${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} [2]${NC} 📦 仅安装依赖(npm install)"
- echo -e " ${GREEN} [3]${NC} 🔨 仅构建项目(npm build)"
- echo -e " ${GREEN} [4]${NC} ▶️ 直接从 U 盘运行(配置也保存在 U 盘里)"
- echo ""
- echo -e " ${WHITE}${BOLD} ━━━━ 中国优化 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
- echo ""
- echo -e " ${YELLOW} [5]${NC} ⚙️ 首次配置向导(选模型、选平台、填 API Key)"
- echo -e " ${YELLOW} [6]${NC} 💬 配置中国聊天平台(飞书/钉钉)"
- echo -e " ${YELLOW} [7]${NC} 🪞 设置国内镜像源"
- echo ""
- echo -e " ${WHITE}${BOLD} ━━━━ 维护工具 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
- echo ""
- echo -e " ${CYAN} [8]${NC} 🔧 诊断修复(openclaw doctor)"
- echo -e " ${CYAN} [9]${NC} 💾 备份当前状态"
- echo -e " ${CYAN} [10]${NC} 📂 恢复备份"
- echo -e " ${CYAN} [11]${NC} 🔄 重置 OpenClaw(恢复出厂)"
- echo -e " ${CYAN} [12]${NC} 🧹 清理缓存和临时文件"
- echo ""
- echo -e " ${WHITE}${BOLD} ━━━━ 技能 & 使用 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
- echo ""
- echo -e " ${BLUE} [13]${NC} 🎯 浏览预装技能(52个,已离线可用)"
- echo -e " ${BLUE} [14]${NC} 📖 中国用户快速上手指南"
- echo ""
- echo -e " ${WHITE}${BOLD} ━━━━ 其他 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
- 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}"
- echo ""
-}
-
-# 确保依赖已安装
-ensure_deps() {
- if [ ! -d "$OPENCLAW_DIR/node_modules" ]; then
- echo -e " ${YELLOW}正在安装依赖(淘宝镜像)...${NC}"
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com 2>&1
- echo -e " ${GREEN}依赖安装完成${NC}"
- fi
- if [ ! -d "$OPENCLAW_DIR/dist" ]; then
- echo -e " ${YELLOW}正在构建...${NC}"
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" "$NPM_BIN" run build 2>&1 || true
- echo -e " ${GREEN}构建完成${NC}"
- fi
-}
-
-# [1] 一键安装到电脑
-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"
-}
-
-# [2] 安装依赖
-do_npm_install() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 安装 npm 依赖 ━━━${NC}"
- echo ""
- cd "$OPENCLAW_DIR"
- echo -e " ${YELLOW}使用淘宝镜像安装...${NC}"
- "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com 2>&1
- echo ""
- echo -e " ${GREEN}依赖安装完成!${NC}"
-}
-
-# [3] 构建
-do_build() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 构建 OpenClaw ━━━${NC}"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" "$NPM_BIN" run build 2>&1
- echo ""
- echo -e " ${GREEN}构建完成!${NC}"
-}
-
-# [4] 直接运行
-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"
- 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
- start_gateway
- fi
-}
-
-start_gateway() {
- echo -e " ${GREEN}正在启动网关服务...${NC}"
- echo " 此窗口不要关闭,关闭后服务会停止。"
- echo ""
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs gateway run --allow-unconfigured --force &
- local GW_PID=$!
- for i in $(seq 1 30); do
- sleep 0.5
- if curl -s -o /dev/null http://127.0.0.1:18789/ 2>/dev/null; then
- local TOKEN
- TOKEN=$(python3 -c "import json; d=json.load(open('$PORTABLE_CONFIG_PATH')); print(d.get('gateway',{}).get('auth',{}).get('token',''))" 2>/dev/null)
- local URL="http://127.0.0.1:18789/#token=${TOKEN}"
- echo ""
- echo -e " ${GREEN}控制台地址: ${URL}${NC}"
- open "$URL" 2>/dev/null
- break
- fi
- done
- wait $GW_PID
-}
-
-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
- start_gateway
-}
-
-# 运行 openclaw 命令(便携模式)
-run_openclaw() {
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs "$@"
-}
-
-# [5] 配置 AI 模型(直接用 OpenClaw 自带的配置向导)
-do_china_models() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 首次配置向导 ━━━${NC}"
- echo ""
- echo -e " ${WHITE}${BOLD}国产模型选择提示:${NC}"
- echo ""
- echo -e " ${GREEN}DeepSeek${NC} → 选 ${YELLOW}Custom Provider${NC}"
- echo -e " Base URL: ${CYAN}https://api.deepseek.com/v1${NC}"
- echo -e " 模型名: ${CYAN}deepseek-chat${NC}"
- echo -e " ${GREEN}Kimi${NC} → 选 ${YELLOW}Moonshot AI${NC}"
- echo -e " ${GREEN}通义千问${NC} → 选 ${YELLOW}Qwen${NC}"
- echo -e " ${GREEN}MiniMax${NC} → 选 ${YELLOW}MiniMax${NC}"
- echo -e " ${GREEN}豆包${NC} → 选 ${YELLOW}Volcano Engine${NC}"
- echo ""
- echo -e " ${DIM}按方向键 ↑↓ 滚动列表,回车确认${NC}"
- echo ""
- read -p " 按回车启动配置向导..."
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- run_openclaw onboard
-}
-
-# [6] 配置中国聊天平台
-do_china_channels() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 配置中国聊天平台 ━━━${NC}"
- echo ""
- echo -e " OpenClaw 支持的聊天平台:"
- echo ""
- echo -e " ${WHITE}${BOLD} -- 国内平台 --${NC}"
- echo -e " ${GREEN}[a]${NC} 飞书 Feishu/Lark — 已内置,企业首选"
- echo -e " ${GREEN}[b]${NC} QQ(腾讯官方)${RED}★推荐${NC} — 3条命令,1分钟,免费免翻墙"
- echo -e " ${GREEN}[c]${NC} 微信(社区插件) — iPad协议,文字/图片/文件"
- echo -e " ${GRAY}[d]${NC} 企业微信 WeCom — 后续集成"
- echo -e " ${GRAY}[e]${NC} 钉钉 DingTalk — 后续集成"
- echo ""
- echo -e " ${WHITE}${BOLD} -- 国际平台 --${NC}"
- echo -e " ${GREEN}[f]${NC} Telegram — 推荐,简单好用"
- echo -e " ${GREEN}[g]${NC} Discord — 游戏/社区"
- echo -e " ${GREEN}[h]${NC} WhatsApp — 海外用户"
- echo -e " ${GREEN}[i]${NC} Slack — 外企用户"
- echo ""
- read -p " 请选择 (a-i): " -n 1 CH_CHOICE
- echo ""
- echo ""
-
- case $CH_CHOICE in
- a)
- echo -e " ${CYAN}配置飞书 Feishu${NC}"
- echo ""
- echo " 飞书机器人配置步骤:"
- echo " 1. 访问 https://open.feishu.cn/app 创建应用"
- echo " 2. 获取 App ID 和 App Secret"
- echo " 3. 配置事件订阅和权限"
- echo ""
- echo " 详细文档: openclaw/docs/channels/feishu.md"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- echo -e " ${YELLOW}启动 OpenClaw 配置向导...${NC}"
- "$NODE_BIN" openclaw.mjs onboard 2>&1 || true
- ;;
- b)
- echo -e " ${CYAN}${BOLD}配置 QQ(腾讯官方接入)${NC}"
- echo ""
- echo -e " ${GREEN}${BOLD}这是国内最简单的 AI 助手接入方式!${NC}"
- echo -e " ${GREEN}全程 1 分钟,完全免费,无需翻墙。${NC}"
- echo ""
- echo -e " ${WHITE}${BOLD}步骤:${NC}"
- echo ""
- echo " 1. 扫码注册 QQ 机器人:"
- echo -e " ${CYAN}http://q.qq.com/qqbot/openclaw/login.html${NC}"
- echo ""
- echo " 2. 点击「创建机器人」,获取 AppID 和 AppSecret"
- echo ""
- echo " 3. 运行以下 3 条命令:"
- echo ""
- echo -e " ${GREEN}openclaw plugins install @sliverp/qqbot@latest${NC}"
- echo -e " ${GREEN}openclaw channels add --channel qqbot --token \"AppID:AppSecret\"${NC}"
- echo -e " ${GREEN}openclaw gateway restart${NC}"
- echo ""
- echo -e " ${RED}⚠️ 安全提醒:${NC}"
- echo " 默认任何人都能访问你的机器人!接入后请设置白名单:"
- echo -e " ${YELLOW}openclaw config set channels.qqbot.allowFrom \"你的QQ号\"${NC}"
- echo ""
- echo -e " ${DIM}备选方案: 也可以用 NapCatQQ (OneBot v11) 接入${NC}"
- echo -e " ${DIM}https://github.com/NapNeko/NapCatQQ/releases${NC}"
- echo ""
-
- # 如果已安装 OpenClaw,直接帮用户执行
- if [ -d "$OPENCLAW_DIR/dist" ]; then
- read -p " 是否现在安装 QQ 插件? (y/n) " -n 1 DO_QQ
- echo ""
- if [[ "$DO_QQ" =~ ^[Yy]$ ]]; then
- cd "$OPENCLAW_DIR"
- echo ""
- echo -e " ${YELLOW}正在安装 QQ 插件...${NC}"
- "$NODE_BIN" openclaw.mjs plugins install @sliverp/qqbot@latest 2>&1 || true
- echo ""
- echo -e " ${WHITE}请输入 QQ 机器人信息(在 q.qq.com 后台查看):${NC}"
- echo ""
- read -p " AppID: " QQ_APP_ID
- echo ""
- read -p " AppSecret: " QQ_APP_SECRET
- echo ""
- if [ -n "$QQ_APP_ID" ] && [ -n "$QQ_APP_SECRET" ]; then
- echo -e " ${YELLOW}正在绑定 QQ 机器人...${NC}"
- "$NODE_BIN" openclaw.mjs channels add --channel qqbot --token "${QQ_APP_ID}:${QQ_APP_SECRET}" 2>&1 || true
- echo ""
- read -p " 请输入你自己的 QQ 号(设置白名单,留空跳过): " QQ_ALLOW
- if [ -n "$QQ_ALLOW" ]; then
- "$NODE_BIN" openclaw.mjs config set channels.qqbot.allowFrom "\"${QQ_ALLOW}\"" 2>&1 || true
- echo -e " ${GREEN}白名单已设置: 仅 QQ ${QQ_ALLOW} 可访问${NC}"
- fi
- echo ""
- echo -e " ${GREEN}QQ 机器人配置完成!${NC}"
- echo -e " ${YELLOW}请重启网关后生效(主菜单选 [4] 或 [17])${NC}"
- else
- echo -e " ${YELLOW}已取消:AppID 或 AppSecret 为空。${NC}"
- fi
- fi
- fi
- ;;
- c)
- echo -e " ${CYAN}配置微信(社区插件)${NC}"
- echo ""
- echo " 安装微信插件:"
- echo " openclaw plugins install @icesword760/openclaw-wechat"
- echo ""
- echo " 基于 iPad 协议,支持:"
- echo " - 文字消息"
- echo " - 图片发送"
- echo " - 文件传输"
- echo " - 关键词触发对话"
- echo ""
- echo " 仓库: https://github.com/icesword0760/openclaw-wechat"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- echo -e " ${YELLOW}正在安装微信插件...${NC}"
- "$NODE_BIN" openclaw.mjs plugins install @icesword760/openclaw-wechat 2>&1 || \
- echo -e " ${YELLOW}安装失败,请手动安装${NC}"
- ;;
- d|e)
- echo -e " ${YELLOW}该平台正在开发中,敬请期待${NC}"
- echo " 可关注 u-claw.org 获取最新进展"
- ;;
- f)
- echo -e " ${CYAN}配置 Telegram${NC}"
- echo ""
- echo " 步骤:"
- echo " 1. 在 Telegram 中找 @BotFather"
- echo " 2. 发送 /newbot 创建机器人"
- echo " 3. 获取 Bot Token"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs onboard 2>&1 || true
- ;;
- g)
- echo -e " ${CYAN}配置 Discord${NC}"
- echo ""
- echo " 步骤:"
- echo " 1. 访问 https://discord.com/developers/applications"
- echo " 2. 创建 Application -> Bot"
- echo " 3. 获取 Bot Token"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs onboard 2>&1 || true
- ;;
- h|i)
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs onboard 2>&1 || true
- ;;
- *)
- echo -e " ${YELLOW}无效选择${NC}"
- ;;
- esac
-}
-
-# [7] 设置国内镜像
-do_mirror() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 设置国内镜像源 ━━━${NC}"
- echo ""
-
- # npm 镜像
- echo -e " ${YELLOW}设置 npm 淘宝镜像...${NC}"
- "$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null
- cd "$OPENCLAW_DIR" 2>/dev/null
- "$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null
- echo -e " ${GREEN}npm 镜像已设置: registry.npmmirror.com${NC}"
-
- # 创建 .npmrc
- NPMRC="$OPENCLAW_DIR/.npmrc"
- if ! grep -q "npmmirror" "$NPMRC" 2>/dev/null; then
- echo "" >> "$NPMRC"
- echo "registry=https://registry.npmmirror.com" >> "$NPMRC"
- fi
-
- echo ""
- echo -e " ${GREEN}国内镜像配置完成!${NC}"
- echo " 后续 npm install 将自动使用淘宝镜像"
-}
-
-# [8] 诊断修复
-do_doctor() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 诊断修复 ━━━${NC}"
- echo ""
- echo -e " ${GREEN}💡 提示: 选 [17] 可打开网页控制台,在浏览器中查看完整状态${NC}"
- echo ""
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs doctor --repair 2>&1 || \
- echo -e " ${YELLOW}如果 doctor 无法运行,请先完成安装步骤${NC}"
-}
-
-# [9] 备份
-do_backup() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 备份当前状态 ━━━${NC}"
- echo ""
-
- BACKUP_DIR="$UCLAW_DIR/backups"
- TIMESTAMP=$(date +%Y%m%d_%H%M%S)
- BACKUP_NAME="backup_${TIMESTAMP}"
- BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME"
-
- mkdir -p "$BACKUP_PATH"
-
- echo -e " ${YELLOW}备份中...${NC}"
-
- # 备份配置
- if [ -f "$OPENCLAW_DIR/.env" ]; then
- cp "$OPENCLAW_DIR/.env" "$BACKUP_PATH/.env"
- echo -e " ${GREEN} ✓ .env 配置${NC}"
- fi
-
- # 备份 OpenClaw 状态
- if [ -d "$HOME/.openclaw" ]; then
- mkdir -p "$BACKUP_PATH/openclaw-state"
- cp -R "$HOME/.openclaw/openclaw.json" "$BACKUP_PATH/openclaw-state/" 2>/dev/null || true
- cp -R "$HOME/.openclaw/credentials" "$BACKUP_PATH/openclaw-state/" 2>/dev/null || true
- echo -e " ${GREEN} ✓ OpenClaw 状态和凭据${NC}"
- fi
-
- # 备份 U-Claw 用户数据
- if [ -d "$UCLAW_DIR/memory" ] && [ "$(ls -A "$UCLAW_DIR/memory" 2>/dev/null)" ]; then
- cp -R "$UCLAW_DIR/memory" "$BACKUP_PATH/"
- echo -e " ${GREEN} ✓ 记忆文件${NC}"
- fi
- if [ -d "$UCLAW_DIR/persona" ] && [ "$(ls -A "$UCLAW_DIR/persona" 2>/dev/null)" ]; then
- cp -R "$UCLAW_DIR/persona" "$BACKUP_PATH/"
- echo -e " ${GREEN} ✓ 人格配置${NC}"
- fi
-
- # 备份已安装的版本
- if [ -d "$HOME/.uclaw/openclaw" ]; then
- cp "$HOME/.uclaw/openclaw/.env" "$BACKUP_PATH/installed-env" 2>/dev/null || true
- echo -e " ${GREEN} ✓ 已安装版本配置${NC}"
- fi
-
- BACKUP_SIZE=$(du -sh "$BACKUP_PATH" | cut -f1)
- echo ""
- echo -e " ${GREEN}备份完成!${NC}"
- echo " 位置: $BACKUP_PATH"
- echo " 大小: $BACKUP_SIZE"
- echo ""
-
- # 显示所有备份
- echo " 所有备份:"
- ls -1 "$BACKUP_DIR" 2>/dev/null | while read -r b; do
- echo " - $b"
- done
-}
-
-# [10] 恢复备份
-do_restore() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 恢复备份 ━━━${NC}"
- echo ""
-
- BACKUP_DIR="$UCLAW_DIR/backups"
- if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR" 2>/dev/null)" ]; then
- echo -e " ${YELLOW}没有找到任何备份${NC}"
- echo " 请先使用 [9] 创建备份"
- return
- fi
-
- echo " 可用备份:"
- echo ""
- local i=1
- for b in "$BACKUP_DIR"/*/; do
- local bname=$(basename "$b")
- local bsize=$(du -sh "$b" | cut -f1)
- echo -e " ${GREEN}[$i]${NC} $bname ($bsize)"
- i=$((i+1))
- done
- echo ""
- read -p " 选择要恢复的备份编号: " RESTORE_NUM
-
- local j=1
- local RESTORE_PATH=""
- for b in "$BACKUP_DIR"/*/; do
- if [ "$j" = "$RESTORE_NUM" ]; then
- RESTORE_PATH="$b"
- break
- fi
- j=$((j+1))
- done
-
- if [ -z "$RESTORE_PATH" ]; then
- echo -e " ${RED}无效选择${NC}"
- return
- fi
-
- echo ""
- echo -e " ${YELLOW}正在恢复 $(basename "$RESTORE_PATH")...${NC}"
-
- # 恢复 .env
- if [ -f "$RESTORE_PATH/.env" ]; then
- cp "$RESTORE_PATH/.env" "$OPENCLAW_DIR/.env"
- echo -e " ${GREEN} ✓ .env 已恢复${NC}"
- fi
-
- # 恢复 OpenClaw 状态
- if [ -d "$RESTORE_PATH/openclaw-state" ]; then
- mkdir -p "$HOME/.openclaw"
- cp -R "$RESTORE_PATH/openclaw-state/"* "$HOME/.openclaw/" 2>/dev/null || true
- echo -e " ${GREEN} ✓ OpenClaw 状态已恢复${NC}"
- fi
-
- # 恢复用户数据
- if [ -d "$RESTORE_PATH/memory" ]; then
- cp -R "$RESTORE_PATH/memory" "$UCLAW_DIR/"
- echo -e " ${GREEN} ✓ 记忆文件已恢复${NC}"
- fi
- if [ -d "$RESTORE_PATH/persona" ]; then
- cp -R "$RESTORE_PATH/persona" "$UCLAW_DIR/"
- echo -e " ${GREEN} ✓ 人格配置已恢复${NC}"
- fi
-
- echo ""
- echo -e " ${GREEN}恢复完成!${NC}"
-}
-
-# [11] 重置
-do_reset() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 重置 OpenClaw ━━━${NC}"
- echo ""
- echo -e " ${RED}警告: 重置将清除配置和状态数据${NC}"
- echo ""
- echo -e " ${GREEN}[1]${NC} 仅重置配置(保留凭据和会话)"
- echo -e " ${YELLOW}[2]${NC} 重置配置 + 凭据 + 会话(保留工作区)"
- echo -e " ${RED}[3]${NC} 完全重置(恢复出厂状态)"
- echo -e " ${DIM}[0]${NC} 取消"
- echo ""
- read -p " 选择重置级别: " -n 1 RESET_CHOICE
- echo ""
-
- case $RESET_CHOICE in
- 1)
- echo ""
- echo -e " ${YELLOW}建议先备份! 是否先创建备份? (y/n)${NC}"
- read -n 1 DO_BACKUP
- echo ""
- [ "$DO_BACKUP" = "y" ] && do_backup
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs reset --scope config 2>&1 || true
- ;;
- 2)
- echo ""
- echo -e " ${YELLOW}建议先备份! 是否先创建备份? (y/n)${NC}"
- read -n 1 DO_BACKUP
- echo ""
- [ "$DO_BACKUP" = "y" ] && do_backup
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs reset --scope config+creds+sessions 2>&1 || true
- ;;
- 3)
- echo ""
- echo -e " ${RED}确定要完全重置吗? 输入 YES 确认:${NC} "
- read CONFIRM
- if [ "$CONFIRM" = "YES" ]; then
- do_backup
- ensure_deps
- cd "$OPENCLAW_DIR"
- "$NODE_BIN" openclaw.mjs reset --scope full 2>&1 || true
- echo -e " ${GREEN}已恢复出厂状态${NC}"
- else
- echo " 已取消"
- fi
- ;;
- *)
- echo " 已取消"
- ;;
- esac
-}
-
-# [12] 清理
-do_cleanup() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 清理缓存和临时文件 ━━━${NC}"
- echo ""
-
- FREED=0
-
- # 清理 npm 缓存
- echo -e " ${YELLOW}清理 npm 缓存...${NC}"
- CACHE_SIZE=$("$NODE_BIN" "$NPM_BIN" cache ls 2>/dev/null | wc -l || echo 0)
- "$NODE_BIN" "$NPM_BIN" cache clean --force 2>/dev/null || true
- echo -e " ${GREEN} ✓ npm 缓存已清理${NC}"
-
- # 清理 Node.js 编译缓存
- if [ -d "$HOME/.cache/node" ]; then
- NSIZE=$(du -sm "$HOME/.cache/node" 2>/dev/null | cut -f1)
- rm -rf "$HOME/.cache/node"
- echo -e " ${GREEN} ✓ Node 编译缓存已清理 (${NSIZE}MB)${NC}"
- fi
-
- # 清理 OpenClaw 日志
- if [ -d "$HOME/.openclaw/logs" ]; then
- LSIZE=$(du -sm "$HOME/.openclaw/logs" 2>/dev/null | cut -f1)
- rm -rf "$HOME/.openclaw/logs"
- echo -e " ${GREEN} ✓ 日志已清理 (${LSIZE:-0}MB)${NC}"
- fi
-
- echo ""
- echo -e " ${GREEN}清理完成!${NC}"
-}
-
-# [13] 技能浏览器
-do_skills_browser() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 预装技能浏览器(52个,已离线可用)━━━${NC}"
- echo ""
- echo -e " ${WHITE}${BOLD} 效率 & 编程${NC}"
- echo -e " ${GREEN} github${NC} GitHub 操作(Issues/PR/代码审查/CI)"
- echo -e " ${GREEN} gh-issues${NC} 获取 Issues 并分配 Agent 修复"
- echo -e " ${GREEN} coding-agent${NC} 委派编程任务给 Codex/Claude/Pi"
- echo -e " ${GREEN} summarize${NC} 总结文本/网页/播客/视频"
- echo -e " ${GREEN} nano-pdf${NC} 自然语言编辑 PDF"
- echo -e " ${GREEN} clawhub${NC} 搜索安装更多社区技能"
- echo -e " ${GREEN} skill-creator${NC} 创建自定义技能"
- echo ""
- echo -e " ${WHITE}${BOLD} 笔记 & 任务管理${NC}"
- echo -e " ${GREEN} apple-notes${NC} Apple 备忘录(创建/搜索/编辑)"
- echo -e " ${GREEN} apple-reminders${NC} Apple 提醒事项"
- echo -e " ${GREEN} obsidian${NC} Obsidian 笔记操作"
- echo -e " ${GREEN} notion${NC} Notion 页面和数据库"
- echo -e " ${GREEN} things-mac${NC} Things 3 任务管理 (macOS)"
- echo -e " ${GREEN} trello${NC} Trello 看板操作"
- echo -e " ${GREEN} bear-notes${NC} Bear 笔记"
- echo ""
- echo -e " ${WHITE}${BOLD} AI & 创作${NC}"
- echo -e " ${GREEN} openai-image-gen${NC} AI 图片生成"
- echo -e " ${GREEN} openai-whisper${NC} 语音转文字(本地)"
- echo -e " ${GREEN} openai-whisper-api${NC} 语音转文字(API)"
- echo -e " ${GREEN} gemini${NC} Gemini 一键问答"
- echo -e " ${GREEN} sag${NC} ElevenLabs 文字转语音"
- echo -e " ${GREEN} sherpa-onnx-tts${NC} 本地离线文字转语音"
- echo -e " ${GREEN} nano-banana-pro${NC} Gemini 3 图片生成"
- echo ""
- echo -e " ${WHITE}${BOLD} 通讯 & 社交${NC}"
- echo -e " ${GREEN} himalaya${NC} 邮件收发(IMAP/SMTP)"
- echo -e " ${GREEN} discord${NC} Discord 消息操作"
- echo -e " ${GREEN} slack${NC} Slack 消息操作"
- echo -e " ${GREEN} wacli${NC} WhatsApp 消息和历史"
- echo -e " ${GREEN} imsg${NC} iMessage/SMS"
- echo -e " ${GREEN} xurl${NC} X (Twitter) API"
- echo ""
- echo -e " ${WHITE}${BOLD} 系统 & 工具${NC}"
- echo -e " ${GREEN} weather${NC} 天气查询"
- echo -e " ${GREEN} peekaboo${NC} macOS 屏幕截图和 UI 自动化"
- echo -e " ${GREEN} tmux${NC} 远程终端管理"
- echo -e " ${GREEN} healthcheck${NC} 系统安全检查"
- echo -e " ${GREEN} 1password${NC} 1Password 密码管理"
- echo -e " ${GREEN} video-frames${NC} 视频截帧 (ffmpeg)"
- echo -e " ${GREEN} session-logs${NC} 会话日志搜索分析"
- echo -e " ${GREEN} mcporter${NC} MCP 服务管理"
- echo ""
- echo -e " ${WHITE}${BOLD} 智能家居 & IoT${NC}"
- echo -e " ${GREEN} openhue${NC} Philips Hue 灯光控制"
- echo -e " ${GREEN} sonoscli${NC} Sonos 音箱控制"
- echo -e " ${GREEN} eightctl${NC} Eight Sleep 智能床垫"
- echo -e " ${GREEN} camsnap${NC} 摄像头截图/录像"
- echo ""
- echo -e " ${DIM} 提示: 这些技能已全部预装在 U 盘中,无需联网下载${NC}"
- echo -e " ${DIM} 使用: 在 OpenClaw 中直接说 \"帮我查天气\" 或 \"帮我发邮件\" 即可${NC}"
- echo -e " ${DIM} 更多: 运行 openclaw 后输入 /skills 查看详情${NC}"
-}
-
-# [14] 中国用户指南
-do_china_guide() {
- echo ""
- if [ -f "$UCLAW_DIR/中国用户指南.txt" ]; then
- cat "$UCLAW_DIR/中国用户指南.txt"
- else
- echo " 指南文件不存在"
- fi
-}
-
-# [15] 使用说明
-do_readme() {
- echo ""
- if [ -f "$UCLAW_DIR/使用说明.txt" ]; then
- cat "$UCLAW_DIR/使用说明.txt"
- else
- echo " 使用说明文件不存在"
- fi
-}
-
-# [16] 系统信息
-do_sysinfo() {
- echo ""
- echo -e " ${CYAN}${BOLD}━━━ 系统信息 ━━━${NC}"
- echo ""
- echo " 操作系统: $(sw_vers -productName 2>/dev/null || uname -s) $(sw_vers -productVersion 2>/dev/null || uname -r)"
- echo " CPU架构: $(uname -m)"
- echo " 内存: $(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.1f GB", $1/1024/1024/1024}' || echo '未知')"
- echo " Node.js: $($NODE_BIN --version 2>/dev/null || echo '未找到')"
- echo " npm: $($NODE_BIN $NPM_BIN --version 2>/dev/null || echo '未找到')"
- echo ""
- echo " U-Claw 路径: $UCLAW_DIR"
- echo " U-Claw 大小: $(du -sh "$UCLAW_DIR" 2>/dev/null | cut -f1)"
- echo ""
- if [ -d "$HOME/.uclaw" ]; then
- echo " 已安装路径: $HOME/.uclaw"
- echo " 已安装大小: $(du -sh "$HOME/.uclaw" 2>/dev/null | cut -f1)"
- else
- echo " 电脑安装: 未安装"
- fi
- echo ""
- if [ -d "$HOME/.openclaw" ]; then
- echo " OpenClaw 状态: $HOME/.openclaw"
- echo " 状态大小: $(du -sh "$HOME/.openclaw" 2>/dev/null | cut -f1)"
- fi
- echo ""
- echo " 磁盘空间: $(df -h "$UCLAW_DIR" 2>/dev/null | tail -1 | awk '{print $4 " 可用 / " $2 " 总计"}')"
-}
-
-# 主循环
-while true; do
- show_menu
- read -p " 请选择 [0-16]: " CHOICE
- echo ""
-
- case $CHOICE in
- 1) do_install ;;
- 2) do_npm_install ;;
- 3) do_build ;;
- 4) do_run ;;
- 5) do_china_models ;;
- 6) do_china_channels ;;
- 7) do_mirror ;;
- 8) do_doctor ;;
- 9) do_backup ;;
- 10) do_restore ;;
- 11) do_reset ;;
- 12) do_cleanup ;;
- 13) do_skills_browser ;;
- 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-17${NC}"
- ;;
- esac
-
- echo ""
- read -p " 按回车键返回主菜单..."
-done
diff --git a/uclaw-scripts/Mac-安装到电脑.command b/uclaw-scripts/Mac-安装到电脑.command
deleted file mode 100644
index 36f31f6..0000000
--- a/uclaw-scripts/Mac-安装到电脑.command
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/bin/bash
-# ============================================================
-# U-Claw 虾盘 - macOS 安装到电脑
-# 将 OpenClaw 及运行环境永久安装到电脑上
-# ============================================================
-
-set -euo pipefail
-
-UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
-INSTALL_DIR="$HOME/.uclaw"
-
-GREEN='\033[0;32m'
-CYAN='\033[0;36m'
-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}"
-echo " ╔══════════════════════════════════════╗"
-echo " ║ U-Claw 安装到电脑 ║"
-echo " ║ OpenClaw 永久安装 ║"
-echo " ╚══════════════════════════════════════╝"
-echo -e "${NC}"
-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 ""
-
-if [[ ! $REPLY =~ ^[Yy]$ ]]; then
- echo " 已取消安装"
- exit 0
-fi
-
-ARCH=$(uname -m)
-if [ "$ARCH" = "arm64" ]; then
- NODE_SRC="$UCLAW_DIR/runtime/node-mac-arm64"
- echo -e " ${GREEN}Apple Silicon (M系列)${NC}"
-else
- NODE_SRC="$UCLAW_DIR/runtime/node-mac-x64"
- echo -e " ${GREEN}Intel Mac${NC}"
-fi
-
-echo -e " ${CYAN}[1/4] 创建安装目录...${NC}"
-mkdir -p "$INSTALL_DIR"
-
-echo -e " ${CYAN}[2/4] 安装 Node.js 运行环境...${NC}"
-rm -rf "$INSTALL_DIR/node"
-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"
-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"
-fi
-
-# 复制用户数据
-[ -d "$UCLAW_DIR/memory" ] && [ "$(ls -A "$UCLAW_DIR/memory" 2>/dev/null)" ] && cp -R "$UCLAW_DIR/memory" "$INSTALL_DIR/"
-[ -d "$UCLAW_DIR/persona" ] && [ "$(ls -A "$UCLAW_DIR/persona" 2>/dev/null)" ] && cp -R "$UCLAW_DIR/persona" "$INSTALL_DIR/"
-
-echo -e " ${CYAN}[4/4] 配置环境变量...${NC}"
-
-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"
- echo "# U-Claw OpenClaw" >> "$SHELL_RC"
- echo 'export PATH="$HOME/.uclaw/node/bin:$PATH"' >> "$SHELL_RC"
- echo "alias openclaw='\$HOME/.uclaw/node/bin/node \$HOME/.uclaw/openclaw/openclaw.mjs'" >> "$SHELL_RC"
- echo -e " ${GREEN}已添加到 $SHELL_RC${NC}"
-else
- echo -e " ${YELLOW}PATH 已配置,跳过${NC}"
-fi
-
-# 创建全局命令
-cat > "$INSTALL_DIR/uclaw" << 'SCRIPT'
-#!/bin/bash
-UCLAW_HOME="$HOME/.uclaw"
-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 " ${GREEN}已创建用户命令: $LOCAL_BIN/uclaw / $LOCAL_BIN/openclaw${NC}"
- echo -e " ${YELLOW}如需系统级命令,可运行 sudo ln -sf $INSTALL_DIR/uclaw /usr/local/bin/uclaw${NC}"
-fi
-
-echo ""
-echo -e " ${GREEN}╔══════════════════════════════════════╗${NC}"
-echo -e " ${GREEN}║ 安装完成! ║${NC}"
-echo -e " ${GREEN}╚══════════════════════════════════════╝${NC}"
-echo ""
-echo " 安装位置: $INSTALL_DIR"
-echo " Node.js: ${NODE_VERSION_INSTALLED}"
-echo ""
-echo " 使用方法:"
-echo " 1. 打开新的终端窗口"
-echo " 2. 运行: openclaw onboard --install-daemon"
-echo " 3. 配置完成后运行: openclaw dashboard"
-echo ""
-echo " 小白用户推荐:"
-echo " 先按引导完成首次配置,再打开网页控制台"
-echo ""
-read -p " 按回车键关闭..."
diff --git a/uclaw-scripts/README.txt b/uclaw-scripts/README.txt
new file mode 100644
index 0000000..212185d
--- /dev/null
+++ b/uclaw-scripts/README.txt
@@ -0,0 +1,51 @@
+========================================
+ U-Claw 虾盘 v1.1
+ 插上就能用的 AI 助手
+ u-claw.org
+========================================
+
+【使用方法】
+
+ Mac 用户: 双击 Mac-Install.command
+ Windows 用户: 双击 Windows-Install.bat
+
+ 就这一步!浏览器会自动打开。
+ 脚本会把 U-Claw 解压到你的电脑(约2分钟),然后自动启动。
+
+========================================
+
+【常见问题】
+
+ Q: Mac 提示"无法验证开发者"怎么办?
+ A: 右键点击脚本 → 选择"打开" → 再点"打开"
+
+ Q: Windows 弹出安全警告怎么办?
+ A: 点击"更多信息" → 点击"仍要运行"
+
+ Q: 安装到哪里了?
+ A: Mac: ~/U-Claw
+ Windows: C:\Users\你的用户名\U-Claw
+
+ Q: 怎么配置 AI 模型和 API Key?
+ A: 启动后浏览器会自动打开配置页面,按提示操作即可
+
+ Q: 支持哪些 AI 模型?
+ A: DeepSeek、Kimi、通义千问、智谱GLM、MiniMax、豆包
+ 全部国内直连,不需要翻墙
+
+ Q: 怎么升级?
+ A: 重新运行安装脚本,选择"重新安装"
+ 你的配置和记忆会保留在 data/ 文件夹里
+
+ Q: Toolkit 文件夹是什么?
+ A: 给工程师的 DIY 素材包(Node.js + 源码),普通用户不需要
+
+========================================
+
+【联系我们】
+
+ 微信: hecare888
+ 官网: u-claw.org
+ GitHub: github.com/dongsheng123132/u-claw
+
+========================================
diff --git a/uclaw-scripts/Windows-安装并启动.bat b/uclaw-scripts/Windows-Install.bat
similarity index 57%
rename from uclaw-scripts/Windows-安装并启动.bat
rename to uclaw-scripts/Windows-Install.bat
index 89e3c04..626fab4 100644
--- a/uclaw-scripts/Windows-安装并启动.bat
+++ b/uclaw-scripts/Windows-Install.bat
@@ -1,17 +1,17 @@
@echo off
chcp 65001 >/dev/null 2>&1
-title U-Claw - Install and Launch
+title U-Claw - Extract and Launch
echo.
echo ========================================
echo U-Claw v1.1
-echo Install and Launch (Windows)
+echo Extract and Launch (Windows)
echo ========================================
echo.
-set "USB_DIR=%~dp0"
-set "ARCHIVE=%USB_DIR%U-Claw.tar.gz"
-set "INSTALL_DIR=%USERPROFILE%\U-Claw"
+set "SCRIPT_DIR=%~dp0"
+set "ARCHIVE=%SCRIPT_DIR%U-Claw.tar.gz"
+set "INSTALL_DIR=%SCRIPT_DIR%U-Claw"
REM Check archive
if not exist "%ARCHIVE%" (
@@ -22,17 +22,17 @@ if not exist "%ARCHIVE%" (
exit /b 1
)
-REM Check if already installed
+REM Check if already extracted
if exist "%INSTALL_DIR%\app\core\node_modules" (
- echo U-Claw already installed at: %INSTALL_DIR%
+ echo U-Claw already extracted at: %INSTALL_DIR%
echo.
echo [1] Launch directly (skip extract)
- echo [2] Reinstall (overwrite)
+ echo [2] Re-extract (overwrite)
echo.
set /p choice=" Choose [1/2, default 1]: "
if "%choice%"=="2" (
echo.
- echo Reinstalling...
+ echo Re-extracting...
rmdir /s /q "%INSTALL_DIR%" >/dev/null 2>&1
) else (
echo.
@@ -43,26 +43,22 @@ if exist "%INSTALL_DIR%\app\core\node_modules" (
REM Extract
echo.
-echo Extracting U-Claw to %INSTALL_DIR% ...
-echo This may take 1-2 minutes...
+echo Extracting U-Claw to: %INSTALL_DIR%
+echo This may take a few minutes...
echo.
where tar >/dev/null 2>&1
if %errorlevel%==0 (
- cd /d "%USERPROFILE%"
+ cd /d "%SCRIPT_DIR%"
tar xzf "%ARCHIVE%"
if %errorlevel% neq 0 (
echo Extract failed! Please extract U-Claw.tar.gz manually
- echo using 7-Zip or WinRAR to %USERPROFILE%
pause
exit /b 1
)
) else (
- echo tar command not available on this Windows version
- echo Please extract U-Claw.tar.gz manually using 7-Zip or WinRAR
- echo Extract to: %USERPROFILE%
- echo.
- echo Then run: %INSTALL_DIR%\Windows-Start.bat
+ echo tar not available. Please extract U-Claw.tar.gz manually
+ echo using 7-Zip or WinRAR to this directory.
pause
exit /b 1
)
@@ -71,7 +67,6 @@ echo Extract complete!
echo.
:start
-REM Launch OpenClaw
echo Starting OpenClaw...
echo.
diff --git a/uclaw-scripts/Windows-从U盘启动.bat b/uclaw-scripts/Windows-从U盘启动.bat
deleted file mode 100644
index b92a105..0000000
--- a/uclaw-scripts/Windows-从U盘启动.bat
+++ /dev/null
@@ -1,88 +0,0 @@
-@echo off
-chcp 65001 >nul 2>&1
-title U-Claw - OpenClaw Launcher
-
-echo.
-echo ========================================
-echo U-Claw v1.1
-echo OpenClaw One-Click Launcher (Windows)
-echo ========================================
-echo.
-echo Recommended: temporary PC / no local install
-echo.
-
-set "UCLAW_DIR=%~dp0"
-set "OPENCLAW_DIR=%UCLAW_DIR%openclaw"
-set "NODE_DIR=%UCLAW_DIR%runtime\node-win-x64"
-set "NODE_BIN=%NODE_DIR%\node.exe"
-set "NPM_BIN=%NODE_DIR%\npm.cmd"
-set "PORTABLE_HOME=%UCLAW_DIR%portable-home"
-set "PORTABLE_STATE_DIR=%PORTABLE_HOME%\.openclaw"
-set "PORTABLE_CONFIG_PATH=%PORTABLE_STATE_DIR%\openclaw.json"
-
-set "OPENCLAW_HOME=%PORTABLE_HOME%"
-set "OPENCLAW_STATE_DIR=%PORTABLE_STATE_DIR%"
-set "OPENCLAW_CONFIG_PATH=%PORTABLE_CONFIG_PATH%"
-
-if not exist "%PORTABLE_STATE_DIR%" mkdir "%PORTABLE_STATE_DIR%"
-
-if not exist "%NODE_BIN%" (
- echo [ERROR] Node.js not found
- echo Please ensure runtime\node-win-x64 directory is complete
- echo.
- pause
- exit /b 1
-)
-
-for /f "tokens=*" %%v in ('"%NODE_BIN%" --version') do set NODE_VER=%%v
-echo Node.js: %NODE_VER%
-echo.
-
-set "PATH=%NODE_DIR%;%NODE_DIR%\node_modules\.bin;%PATH%"
-
-if not exist "%OPENCLAW_DIR%\node_modules" (
- echo First run - installing dependencies...
- echo Using China mirror, please wait...
- echo.
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
- echo.
- echo Dependencies installed!
- echo.
-)
-
-if not exist "%OPENCLAW_DIR%\dist" (
- echo First run - building...
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" run build
- echo.
-)
-
-cd /d "%OPENCLAW_DIR%"
-
-REM First run: auto-create minimal config (skip onboard)
-if not exist "%PORTABLE_CONFIG_PATH%" (
- echo First run - initializing config...
- if not exist "%PORTABLE_STATE_DIR%" mkdir "%PORTABLE_STATE_DIR%"
- echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}} > "%PORTABLE_CONFIG_PATH%"
- echo Config initialized
- echo.
-)
-
-echo Starting OpenClaw...
-echo DO NOT close this window!
-echo.
-echo ----------------------------------------
-echo Browser will open automatically.
-echo First time setup in web console:
-echo 1. Choose AI model (DeepSeek / Kimi / Qwen)
-echo 2. Connect chat platform (QQ / Feishu / DingTalk)
-echo ----------------------------------------
-echo.
-
-start "" http://127.0.0.1:18789/#token=uclaw
-"%NODE_BIN%" openclaw.mjs gateway run --allow-unconfigured --force
-
-echo.
-echo OpenClaw stopped. You can safely remove the USB drive.
-pause
diff --git a/uclaw-scripts/Windows-全部功能.bat b/uclaw-scripts/Windows-全部功能.bat
deleted file mode 100644
index 14e7f3c..0000000
--- a/uclaw-scripts/Windows-全部功能.bat
+++ /dev/null
@@ -1,495 +0,0 @@
-@echo off
-chcp 65001 >nul 2>&1
-title U-Claw 虾盘 - 启动菜单
-setlocal enabledelayedexpansion
-
-set "UCLAW_DIR=%~dp0"
-set "OPENCLAW_DIR=%UCLAW_DIR%openclaw"
-set "NODE_DIR=%UCLAW_DIR%runtime\node-win-x64"
-set "NODE_BIN=%NODE_DIR%\node.exe"
-set "NPM_BIN=%NODE_DIR%\npm.cmd"
-set "PORTABLE_HOME=%UCLAW_DIR%portable-home"
-set "PORTABLE_STATE_DIR=%PORTABLE_HOME%\.openclaw"
-set "PORTABLE_CONFIG_PATH=%PORTABLE_STATE_DIR%\openclaw.json"
-
-set "OPENCLAW_HOME=%PORTABLE_HOME%"
-set "OPENCLAW_STATE_DIR=%PORTABLE_STATE_DIR%"
-set "OPENCLAW_CONFIG_PATH=%PORTABLE_CONFIG_PATH%"
-set "PATH=%NODE_DIR%;%PATH%"
-
-if not exist "%PORTABLE_STATE_DIR%" mkdir "%PORTABLE_STATE_DIR%"
-
-goto MENU
-
-:MENU
-cls
-echo.
-echo ╔════════════════════════════════════════════════════════╗
-echo ║ ║
-echo ║ U-Claw 虾盘 v1.1 ║
-echo ║ OpenClaw AI 助手 一键安装盘 ║
-echo ║ ║
-echo ║ 专为中国用户优化 · 免翻墙 · 离线安装 ║
-echo ║ ║
-echo ╠════════════════════════════════════════════════════════╣
-echo ║ ║
-
-:: 状态检测
-for /f "tokens=*" %%v in ('"%NODE_BIN%" --version 2^>nul') do set "NODE_VER=%%v"
-set "ST_MOD=未安装"
-set "ST_BUILD=未构建"
-set "ST_INST=未安装"
-set "ST_PORT=未配置"
-if exist "%OPENCLAW_DIR%\node_modules" set "ST_MOD=已安装"
-if exist "%OPENCLAW_DIR%\dist" set "ST_BUILD=已构建"
-if exist "%USERPROFILE%\.uclaw\openclaw" set "ST_INST=已安装"
-if exist "%PORTABLE_CONFIG_PATH%" set "ST_PORT=已配置"
-
-echo ║ 系统: x64 ^| Node: %NODE_VER% ║
-echo ║ 依赖: %ST_MOD% ^| 构建: %ST_BUILD% ║
-echo ║ 便携配置: %ST_PORT% ^| 电脑安装: %ST_INST% ║
-echo ║ ║
-echo ╠════════════════════════════════════════════════════════╣
-echo.
-echo ---- 安装 -----------------------------------------
-echo.
-echo [1] 安装 OpenClaw 到本机(仅限自己的电脑)
-echo [2] 仅安装依赖(npm install)
-echo [3] 仅构建项目(npm build)
-echo [4] 直接从 U 盘运行(配置也保存在 U 盘里)
-echo.
-echo ---- 中国优化 -------------------------------------
-echo.
-echo [5] 首次配置向导(选模型、选平台、填 API Key)
-echo [6] 配置中国聊天平台(QQ Bot/飞书/微信)
-echo [7] 设置国内镜像源
-echo.
-echo ---- 维护工具 -------------------------------------
-echo.
-echo [8] 诊断修复(openclaw doctor)
-echo [9] 备份当前状态
-echo [10] 恢复备份
-echo [11] 重置 OpenClaw(恢复出厂)
-echo [12] 清理缓存和临时文件
-echo.
-echo ---- 其他 -----------------------------------------
-echo.
-echo [13] 浏览预装技能(58个,已离线可用)
-echo [14] 中国用户快速上手指南
-echo [15] 查看使用说明
-echo [16] 系统信息
-echo [17] 打开本地网页控制台
-echo [0] 退出
-echo.
-echo ╚════════════════════════════════════════════════════════╝
-echo.
-
-set /p CHOICE=" 请选择 [0-17]: "
-
-if "%CHOICE%"=="1" goto INSTALL
-if "%CHOICE%"=="2" goto NPM_INSTALL
-if "%CHOICE%"=="3" goto BUILD
-if "%CHOICE%"=="4" goto RUN
-if "%CHOICE%"=="5" goto CHINA_MODELS
-if "%CHOICE%"=="6" goto CHINA_CHANNELS
-if "%CHOICE%"=="7" goto MIRROR
-if "%CHOICE%"=="8" goto DOCTOR
-if "%CHOICE%"=="9" goto BACKUP
-if "%CHOICE%"=="10" goto RESTORE
-if "%CHOICE%"=="11" goto RESET
-if "%CHOICE%"=="12" goto CLEANUP
-if "%CHOICE%"=="13" goto SKILLS
-if "%CHOICE%"=="14" goto CHINA_GUIDE
-if "%CHOICE%"=="15" goto README
-if "%CHOICE%"=="16" goto SYSINFO
-if "%CHOICE%"=="17" goto DASHBOARD
-if "%CHOICE%"=="0" goto EXIT
-
-echo 无效选择
-pause
-goto MENU
-
-:INSTALL
-echo.
-echo === 安装 OpenClaw 到电脑 ===
-echo.
-echo 提醒:如果这是临时电脑、公司电脑或别人的电脑,
-echo 更推荐返回主菜单选择 [4] 从 U 盘运行。
-echo.
-call "%UCLAW_DIR%安装到电脑.bat"
-pause
-goto MENU
-
-:NPM_INSTALL
-echo.
-echo === 安装 npm 依赖 ===
-echo.
-cd /d "%OPENCLAW_DIR%"
-call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
-echo.
-echo 依赖安装完成!
-pause
-goto MENU
-
-:BUILD
-echo.
-echo === 构建 OpenClaw ===
-echo.
-if not exist "%OPENCLAW_DIR%\node_modules" (
- echo 先安装依赖...
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
-)
-cd /d "%OPENCLAW_DIR%"
-call "%NPM_BIN%" run build
-echo.
-echo 构建完成!
-pause
-goto MENU
-
-:RUN
-echo.
-echo === 从 U 盘启动 OpenClaw ===
-echo.
-echo 便携模式:配置、状态、记忆都会写在这只 U 盘里。
-echo 拔掉 U 盘后当前会话会结束,但换一台电脑再插上还能继续用。
-echo.
-if not exist "%OPENCLAW_DIR%\node_modules" (
- echo 先安装依赖...
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
-)
-if not exist "%OPENCLAW_DIR%\dist" (
- echo 先构建...
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" run build
-)
-cd /d "%OPENCLAW_DIR%"
-if not exist "%PORTABLE_CONFIG_PATH%" (
- echo 检测到你还没有完成首次配置。
- echo 首次配置会保存在 U 盘中,不会写进这台电脑。
- echo.
- set /p DO_ONBOARD=" 现在开始首次配置? (y/n) "
- if /i "!DO_ONBOARD!"=="y" (
- "%NODE_BIN%" openclaw.mjs onboard
- echo.
- echo 首次配置完成,已保存到 U 盘。
- )
-) else (
- echo 正在启动网关服务...
- echo 此窗口不要关闭,关闭后服务会停止。
- echo.
- "%NODE_BIN%" openclaw.mjs gateway run --allow-unconfigured --force
-)
-pause
-goto MENU
-
-:CHINA_MODELS
-echo.
-echo === 首次配置向导 ===
-echo.
-echo 国产模型选择提示:
-echo.
-echo DeepSeek → 选 Custom Provider
-echo Base URL: https://api.deepseek.com/v1
-echo 模型名: deepseek-chat
-echo Kimi → 选 Moonshot AI
-echo 通义千问 → 选 Qwen
-echo MiniMax → 选 MiniMax
-echo 豆包 → 选 Volcano Engine
-echo.
-echo 按方向键上下滚动列表,回车确认
-echo.
-if not exist "%OPENCLAW_DIR%\node_modules" (
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
-)
-cd /d "%OPENCLAW_DIR%"
-"%NODE_BIN%" openclaw.mjs onboard
-pause
-goto MENU
-
-:CHINA_CHANNELS
-echo.
-echo === 配置中国聊天平台 ===
-echo.
-echo [a] 飞书 Feishu/Lark — 已内置,企业首选
-echo [b] QQ(腾讯官方)★推荐 — 3条命令,1分钟,免费免翻墙
-echo [c] 微信(社区插件) — iPad协议
-echo [d] Telegram — 推荐,简单好用
-echo.
-set /p CH=" 请选择 (a-d): "
-
-if not exist "%OPENCLAW_DIR%\node_modules" (
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
-)
-cd /d "%OPENCLAW_DIR%"
-
-if /i "%CH%"=="a" (
- echo.
- echo 配置飞书 Feishu
- echo 1. 访问 https://open.feishu.cn/app 创建应用
- echo 2. 获取 App ID 和 App Secret
- echo 3. 配置事件订阅和权限
- echo.
- "%NODE_BIN%" openclaw.mjs onboard
-)
-if /i "%CH%"=="b" (
- echo.
- echo 配置 QQ(腾讯官方接入)
- echo.
- echo 这是国内最简单的 AI 助手接入方式!
- echo 全程 1 分钟,完全免费,无需翻墙。
- echo.
- echo 1. 扫码注册: http://q.qq.com/qqbot/openclaw/login.html
- echo 2. 点击「创建机器人」,获取 AppID 和 AppSecret
- echo.
- if exist "%OPENCLAW_DIR%\dist" (
- set /p DO_QQ=" 是否现在安装 QQ 插件? (y/n) "
- if /i "!DO_QQ!"=="y" (
- echo.
- echo 正在安装 QQ 插件...
- "%NODE_BIN%" openclaw.mjs plugins install @sliverp/qqbot@latest
- echo.
- set /p QQ_APP_ID=" AppID: "
- echo.
- set /p QQ_APP_SECRET=" AppSecret: "
- echo.
- if not "!QQ_APP_ID!"=="" if not "!QQ_APP_SECRET!"=="" (
- echo 正在绑定 QQ 机器人...
- "%NODE_BIN%" openclaw.mjs channels add --channel qqbot --token "!QQ_APP_ID!:!QQ_APP_SECRET!"
- echo.
- set /p QQ_ALLOW=" 请输入你自己的 QQ 号(设置白名单,留空跳过): "
- if not "!QQ_ALLOW!"=="" (
- "%NODE_BIN%" openclaw.mjs config set channels.qqbot.allowFrom "\"!QQ_ALLOW!\""
- echo 白名单已设置
- )
- echo.
- echo QQ 机器人配置完成!
- echo 请重启网关后生效(主菜单选 [4] 或 [17])
- )
- )
- )
-)
-if /i "%CH%"=="c" (
- echo.
- echo 配置微信(社区插件)
- echo 安装微信插件:
- "%NODE_BIN%" openclaw.mjs plugins install @icesword760/openclaw-wechat
-)
-if /i "%CH%"=="d" (
- echo.
- echo 配置 Telegram
- echo 1. 在 Telegram 中找 @BotFather
- echo 2. 发送 /newbot 创建机器人
- echo 3. 获取 Bot Token
- echo.
- "%NODE_BIN%" openclaw.mjs onboard
-)
-pause
-goto MENU
-
-:MIRROR
-echo.
-echo === 设置国内镜像源 ===
-echo.
-cd /d "%OPENCLAW_DIR%"
-call "%NPM_BIN%" config set registry https://registry.npmmirror.com --location=project
-echo npm 镜像已设置: registry.npmmirror.com
-pause
-goto MENU
-
-:DOCTOR
-echo.
-echo === 诊断修复 ===
-echo.
-echo 提示: 选 [17] 可打开网页控制台,在浏览器中查看完整状态
-echo.
-if not exist "%OPENCLAW_DIR%\node_modules" (
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
-)
-cd /d "%OPENCLAW_DIR%"
-"%NODE_BIN%" openclaw.mjs doctor --repair
-pause
-goto MENU
-
-:BACKUP
-echo.
-echo === 备份当前状态 ===
-echo.
-set "TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%"
-set "TIMESTAMP=%TIMESTAMP: =0%"
-set "BACKUP_DIR=%UCLAW_DIR%backups\backup_%TIMESTAMP%"
-mkdir "%BACKUP_DIR%" 2>nul
-
-if exist "%PORTABLE_STATE_DIR%" (
- xcopy "%PORTABLE_STATE_DIR%" "%BACKUP_DIR%\portable-state\" /e /i /q >nul 2>&1
- echo [OK] 便携模式状态已备份
-)
-if exist "%OPENCLAW_DIR%\.env" (
- copy "%OPENCLAW_DIR%\.env" "%BACKUP_DIR%\.env" >nul
- echo [OK] .env 配置已备份
-)
-
-echo.
-echo 备份完成! 位置: %BACKUP_DIR%
-pause
-goto MENU
-
-:RESTORE
-echo.
-echo === 恢复备份 ===
-echo.
-set "BACKUP_BASE=%UCLAW_DIR%backups"
-if not exist "%BACKUP_BASE%" (
- echo 没有找到任何备份
- pause
- goto MENU
-)
-echo 可用备份:
-dir /b "%BACKUP_BASE%" 2>nul
-echo.
-set /p RESTORE_NAME=" 输入备份名称: "
-set "RESTORE_PATH=%BACKUP_BASE%\%RESTORE_NAME%"
-
-if not exist "%RESTORE_PATH%" (
- echo 备份不存在
- pause
- goto MENU
-)
-
-if exist "%RESTORE_PATH%\portable-state" (
- xcopy "%RESTORE_PATH%\portable-state" "%PORTABLE_STATE_DIR%\" /e /i /q /y >nul 2>&1
- echo [OK] 便携模式状态已恢复
-)
-if exist "%RESTORE_PATH%\.env" (
- copy "%RESTORE_PATH%\.env" "%OPENCLAW_DIR%\.env" >nul
- echo [OK] .env 已恢复
-)
-
-echo.
-echo 恢复完成!
-pause
-goto MENU
-
-:RESET
-echo.
-echo === 重置 OpenClaw ===
-echo.
-echo [1] 仅重置配置(保留凭据)
-echo [2] 重置配置+凭据+会话
-echo [3] 完全重置(恢复出厂)
-echo [0] 取消
-echo.
-set /p RESET_CHOICE=" 选择重置级别: "
-
-if "%RESET_CHOICE%"=="0" goto MENU
-if not exist "%OPENCLAW_DIR%\node_modules" (
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
-)
-cd /d "%OPENCLAW_DIR%"
-
-if "%RESET_CHOICE%"=="1" "%NODE_BIN%" openclaw.mjs reset --scope config
-if "%RESET_CHOICE%"=="2" "%NODE_BIN%" openclaw.mjs reset --scope config+creds+sessions
-if "%RESET_CHOICE%"=="3" (
- set /p CONFIRM=" 确定完全重置? 输入 YES 确认: "
- if "!CONFIRM!"=="YES" "%NODE_BIN%" openclaw.mjs reset --scope full
-)
-pause
-goto MENU
-
-:CLEANUP
-echo.
-echo === 清理缓存 ===
-echo.
-call "%NPM_BIN%" cache clean --force 2>nul
-echo npm 缓存已清理
-if exist "%PORTABLE_STATE_DIR%\logs" (
- rmdir /s /q "%PORTABLE_STATE_DIR%\logs" 2>nul
- echo 日志已清理
-)
-echo.
-echo 清理完成!
-pause
-goto MENU
-
-:SKILLS
-echo.
-echo === 预装技能 ===
-echo.
-if not exist "%OPENCLAW_DIR%\node_modules" (
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
-)
-cd /d "%OPENCLAW_DIR%"
-"%NODE_BIN%" openclaw.mjs plugins list
-pause
-goto MENU
-
-:CHINA_GUIDE
-echo.
-if exist "%UCLAW_DIR%中国用户指南.txt" (
- type "%UCLAW_DIR%中国用户指南.txt"
-) else (
- echo 指南文件不存在
-)
-pause
-goto MENU
-
-:README
-echo.
-if exist "%UCLAW_DIR%使用说明.txt" (
- type "%UCLAW_DIR%使用说明.txt"
-) else (
- echo 使用说明文件不存在
-)
-pause
-goto MENU
-
-:SYSINFO
-echo.
-echo === 系统信息 ===
-echo.
-echo 操作系统: %OS%
-echo 处理器: %PROCESSOR_ARCHITECTURE%
-echo Node.js: %NODE_VER%
-echo U-Claw 路径: %UCLAW_DIR%
-echo 便携配置: %ST_PORT%
-echo.
-if exist "%USERPROFILE%\.uclaw" (
- echo 已安装路径: %USERPROFILE%\.uclaw
-) else (
- echo 电脑安装: 未安装
-)
-echo.
-pause
-goto MENU
-
-:DASHBOARD
-echo.
-echo === 启动网关 + 打开网页控制台 ===
-echo.
-if not exist "%PORTABLE_CONFIG_PATH%" (
- echo 你还没有完成便携配置。请先选 [4] 从 U 盘运行。
- pause
- goto MENU
-)
-if not exist "%OPENCLAW_DIR%\node_modules" (
- cd /d "%OPENCLAW_DIR%"
- call "%NPM_BIN%" install --registry=https://registry.npmmirror.com
-)
-cd /d "%OPENCLAW_DIR%"
-echo 此窗口不要关闭,关闭后服务会停止。
-echo.
-"%NODE_BIN%" openclaw.mjs gateway run --allow-unconfigured --force
-pause
-goto MENU
-
-:EXIT
-echo.
-echo 再见!
-echo.
-exit /b 0
diff --git a/uclaw-scripts/Windows-安装到电脑.bat b/uclaw-scripts/Windows-安装到电脑.bat
deleted file mode 100644
index b0b13bf..0000000
--- a/uclaw-scripts/Windows-安装到电脑.bat
+++ /dev/null
@@ -1,111 +0,0 @@
-@echo off
-chcp 65001 >nul 2>&1
-title U-Claw 虾盘 - 安装 OpenClaw 到电脑
-
-echo.
-echo ╔══════════════════════════════════════╗
-echo ║ U-Claw 虾盘 v1.1 ║
-echo ║ OpenClaw 永久安装 (Windows) ║
-echo ╚══════════════════════════════════════╝
-echo.
-
-set "UCLAW_DIR=%~dp0"
-set "INSTALL_DIR=%USERPROFILE%\.uclaw"
-
-echo 安装位置: %INSTALL_DIR%
-echo 安装内容: Node.js + OpenClaw + 所有依赖
-echo.
-echo [安全提醒] 这会把 OpenClaw 和配置写入当前电脑。
-echo 如果这是老电脑、共享电脑、公司电脑或临时机器,
-echo 更推荐回到主菜单选择「直接从 U 盘运行」。
-echo.
-set /p CONFIRM=" 是否继续安装? (y/n) "
-if /i not "%CONFIRM%"=="y" (
- echo 已取消安装
- pause
- exit /b 0
-)
-echo.
-
-echo [1/4] 创建安装目录...
-if not exist "%INSTALL_DIR%" mkdir "%INSTALL_DIR%"
-
-echo [2/4] 安装 Node.js 运行环境...
-if exist "%INSTALL_DIR%\node" rmdir /s /q "%INSTALL_DIR%\node"
-xcopy "%UCLAW_DIR%runtime\node-win-x64" "%INSTALL_DIR%\node\" /e /i /q >nul
-if not exist "%INSTALL_DIR%\node\node.exe" (
- echo [错误] Node.js 安装失败
- echo 请确认 U 盘复制完成,再重新运行安装。
- pause
- exit /b 1
-)
-for /f "tokens=*" %%v in ('"%INSTALL_DIR%\node\node.exe" --version') do echo Node.js %%v 已安装
-
-echo [3/4] 安装 OpenClaw...
-echo 这一步会复制大量文件,首次安装通常需要 3-10 分钟,请耐心等待...
-if exist "%INSTALL_DIR%\openclaw" rmdir /s /q "%INSTALL_DIR%\openclaw"
-xcopy "%UCLAW_DIR%openclaw" "%INSTALL_DIR%\openclaw\" /e /i /q >nul
-
-if exist "%UCLAW_DIR%memory" xcopy "%UCLAW_DIR%memory" "%INSTALL_DIR%\memory\" /e /i /q >nul 2>&1
-if exist "%UCLAW_DIR%persona" xcopy "%UCLAW_DIR%persona" "%INSTALL_DIR%\persona\" /e /i /q >nul 2>&1
-
-echo [4/4] 配置环境变量...
-
-(
-echo @echo off
-echo set "UCLAW_HOME=%%USERPROFILE%%\.uclaw"
-echo "%%UCLAW_HOME%%\node\node.exe" "%%UCLAW_HOME%%\openclaw\openclaw.mjs" %%*
-) > "%INSTALL_DIR%\uclaw.cmd"
-
-(
-echo @echo off
-echo set "UCLAW_HOME=%%USERPROFILE%%\.uclaw"
-echo "%%UCLAW_HOME%%\node\node.exe" "%%UCLAW_HOME%%\openclaw\openclaw.mjs" %%*
-) > "%INSTALL_DIR%\openclaw.cmd"
-
-echo.
-echo 正在添加到系统 PATH...
-set "CURRENT_PATH="
-for /f "tokens=2*" %%a in ('reg query "HKCU\Environment" /v PATH 2^>nul') do set "CURRENT_PATH=%%b"
-
-echo %CURRENT_PATH% | findstr /i ".uclaw" >nul 2>&1
-if errorlevel 1 (
- REM 检查 PATH 是否为空(全新账户)
- if not defined CURRENT_PATH (
- setx PATH "%INSTALL_DIR%;%INSTALL_DIR%\node" >nul 2>&1
- ) else (
- REM 检查 setx 1024 字符限制
- set "NEW_PATH=%INSTALL_DIR%;%INSTALL_DIR%\node;%CURRENT_PATH%"
- setlocal enabledelayedexpansion
- if "!NEW_PATH:~1024,1!" neq "" (
- echo [警告] PATH 超过 1024 字符,setx 会截断!
- echo 请手动添加以下路径到系统 PATH:
- echo %INSTALL_DIR%
- echo %INSTALL_DIR%\node
- endlocal
- ) else (
- endlocal
- setx PATH "%INSTALL_DIR%;%INSTALL_DIR%\node;%CURRENT_PATH%" >nul 2>&1
- )
- )
- echo 已添加到用户 PATH
-) else (
- echo PATH 已配置,跳过
-)
-
-echo.
-echo ╔══════════════════════════════════════╗
-echo ║ 安装完成! ║
-echo ╚══════════════════════════════════════╝
-echo.
-echo 安装位置: %INSTALL_DIR%
-echo.
-echo 使用方法:
-echo 1. 打开新的命令提示符或 PowerShell
-echo 2. 运行: openclaw onboard --install-daemon
-echo 3. 配置完成后运行: openclaw dashboard
-echo.
-echo 小白用户推荐:
-echo 先按引导完成首次配置,再打开网页控制台
-echo.
-pause
diff --git a/uclaw-scripts/中国用户指南.txt b/uclaw-scripts/中国用户指南.txt
deleted file mode 100644
index 47ceb73..0000000
--- a/uclaw-scripts/中国用户指南.txt
+++ /dev/null
@@ -1,156 +0,0 @@
-╔══════════════════════════════════════════════════════════╗
-║ ║
-║ U-Claw 虾盘 — 中国用户快速上手指南 ║
-║ ║
-╚══════════════════════════════════════════════════════════╝
-
-
-第一步:选择 AI 模型
-══════════════════════
-
-OpenClaw 支持大量国产模型,以下是推荐:
-
-1. DeepSeek(深度求索)—— 推荐首选
- - 便宜好用,编程能力强
- - 注册: https://platform.deepseek.com/
- - 免费额度: 有
-
-2. Kimi(月之暗面)—— 超长上下文
- - 256K 上下文,适合长文档
- - 注册: https://platform.moonshot.cn/
- - 免费额度: 有
-
-3. 通义千问 Qwen(阿里)—— 免费额度最大
- - 注册: https://dashscope.console.aliyun.com/
- - 免费额度: 非常多
-
-4. 智谱 GLM(清华系)—— 学术场景强
- - 注册: https://open.bigmodel.cn/
- - 免费额度: 有
-
-5. MiniMax —— 语音和多模态强
- - 注册: https://platform.minimaxi.com/
-
-6. 豆包 Doubao(字节跳动)—— 火山引擎
- - 注册: https://console.volcengine.com/ark
-
-7. 百度千帆 —— 百度智能云
- - 注册: https://console.bce.baidu.com/qianfan/
-
-8. 小米 Mimo
- - 注册: https://dev.mi.com/mimo
-
-在启动菜单选 [5] 即可一键配置
-
-
-第二步:选择聊天平台
-══════════════════════
-
-让 AI 接入你的聊天工具:
-
-已内置:
- - QQ(腾讯官方)★ — 国内首选!3条命令搞定,免费免翻墙
- - 飞书 Feishu — 企业首选,功能最全
- - Telegram — 海外推荐
- - Discord — 游戏/社区
- - WhatsApp — 海外用户
- - Slack — 外企用户
-
-QQ 接入方法(腾讯官方,1分钟搞定):
- 1. 扫码注册: http://q.qq.com/qqbot/openclaw/login.html
- 2. 点击"创建机器人",获取 AppID 和 AppSecret
- 3. 运行 3 条命令:
- openclaw plugins install @sliverp/qqbot@latest
- openclaw channels add --channel qqbot --token "AppID:AppSecret"
- openclaw gateway restart
- 4. 安全: 记得设置白名单 openclaw config set channels.qqbot.allowFrom "你的QQ号"
- 详见: 启动菜单 [6] 中国聊天平台
-
-微信接入:
- - 社区插件: openclaw plugins install @icesword760/openclaw-wechat
- - 基于 iPad 协议,支持文字/图片/文件
-
-
-第三步:常用技能(Skills)
-══════════════════════════
-
-U-Claw 已预装 52 个技能,以下是最实用的:
-
-【效率工具】
- - github — GitHub 操作(Issues/PR/代码审查)
- - coding-agent — 委派编程任务给其他 AI
- - summarize — 总结文本/网页/播客
- - nano-pdf — 自然语言编辑 PDF
-
-【笔记 & 任务】
- - apple-notes — Apple 备忘录自动化
- - obsidian — Obsidian 笔记操作
- - notion — Notion 页面和数据库
- - apple-reminders— Apple 提醒事项
- - things-mac — Things 3 任务管理
- - trello — Trello 看板
-
-【AI & 创作】
- - openai-image-gen — AI 图片生成
- - openai-whisper — 语音转文字
- - gemini — Gemini 一键问答
- - sag — ElevenLabs 文字转语音
-
-【通讯】
- - himalaya — 邮件收发(IMAP/SMTP)
- - discord — Discord 消息操作
- - slack — Slack 消息操作
- - wacli — WhatsApp 消息
-
-【系统 & 搜索】
- - weather — 天气查询
- - peekaboo — macOS 屏幕截图和自动化
- - tmux — 远程终端管理
- - clawhub — 搜索安装更多技能
-
-使用方法: 在 OpenClaw 对话中直接说 "帮我查天气" 或 "帮我发邮件" 即可
-
-
-第四步:日常使用场景
-══════════════════════
-
-场景1: 编程助手
- "帮我写一个 Python 脚本,批量重命名文件"
- "审查这个 PR: #123"
-
-场景2: 内容创作
- "帮我总结这篇文章: [URL]"
- "帮我生成一张关于AI的图片"
-
-场景3: 日常办公
- "帮我发邮件给 xxx@example.com,主题是..."
- "帮我在 Notion 创建一个新页面"
- "提醒我明天下午3点开会"
-
-场景4: 信息查询
- "今天深圳天气怎么样?"
- "帮我搜索 GitHub 上最新的 AI 项目"
-
-场景5: 多平台 AI 助手
- 配置飞书/QQ/Telegram 后,直接在聊天中 @AI 即可
-
-
-遇到问题?
-══════════════════════
-
-1. 插 U 盘,双击「启动菜单」
-2. 选 [8] 诊断修复
-3. 如果修不好,选 [11] 重置
-4. 重置前会自动提醒你备份
-
-安全提醒:
- - 老电脑、共享电脑、公司电脑、临时借用电脑
- 更推荐直接从 U 盘运行
- - 尽量不要把 OpenClaw 和配置安装到不受你控制的本机里
- - 直接从 U 盘运行时,配置和记忆会保存在 U 盘中
- - 同一只 U 盘换一台电脑继续插上,仍然能接着用
- - 但运行过程中不要拔盘,拔掉后当前会话会结束
-
-加入社区:
- - u-claw.org
- - GitHub: github.com/dongsheng123132/u-claw
diff --git a/uclaw-scripts/使用说明.txt b/uclaw-scripts/使用说明.txt
deleted file mode 100644
index 0974e07..0000000
--- a/uclaw-scripts/使用说明.txt
+++ /dev/null
@@ -1,123 +0,0 @@
-╔══════════════════════════════════════════════════════════╗
-║ ║
-║ U-Claw 虾盘 v1.0 ║
-║ OpenClaw 离线安装 U 盘 ║
-║ ║
-║ by OpenClaw Community ║
-║ u-claw.org ║
-║ ║
-╚══════════════════════════════════════════════════════════╝
-
-什么是 U-Claw?
-═══════════════
-U-Claw 虾盘是 OpenClaw(开源 AI 助手)的离线安装包。
-就像当年的"雨林木风"Windows 光盘一样,
-把所有依赖打包好,插上 U 盘就能用。
-
-特别适合中国大陆用户 - 不需要访问 GitHub、npm 等海外服务。
-
-
-U 盘里有什么?
-═══════════════
-U-Claw/
-├── 运行.command <- Mac 用户双击这个
-├── 运行.bat <- Windows 用户双击这个
-├── 安装到电脑.command <- Mac 永久安装
-├── 安装到电脑.bat <- Windows 永久安装
-├── runtime/ <- Node.js 运行环境 (Mac/Win)
-├── openclaw/ <- OpenClaw 源码 + 依赖
-├── memory/ <- AI 记忆文件
-├── persona/ <- AI 人格配置
-├── skills/ <- AI 技能
-└── 使用说明.txt <- 你正在看的这个
-
-
-快速开始
-═══════════════
-
-【方式一:直接从 U 盘运行(推荐)】
-
- Mac 用户:
- 1. 插入 U 盘
- 2. 打开 U-Claw 文件夹
- 3. 双击 "运行.command"
- 4. 如果提示"无法打开",右键 -> 打开
- 5. 等待启动完成
-
- Windows 用户:
- 1. 插入 U 盘
- 2. 打开 U-Claw 文件夹
- 3. 双击 "运行.bat"
- 4. 等待启动完成
-
- 首次运行可能需要几分钟检查环境(主要文件已预打包)
- 首次配置、记忆和状态会直接保存在这只 U 盘里
- 回家再插到另一台电脑,仍然可以继续使用同一套配置
- 如果是老电脑、共享电脑、公司电脑、临时借来的电脑,
- 强烈建议用这种方式,不要安装到本机。
-
- 注意:
- 1. 便携模式运行时,U 盘不能拔掉
- 2. 拔掉 U 盘后,这次运行就会结束
- 3. 但下次把同一只 U 盘插到别的电脑上,仍可继续运行
-
-
-【方式二:安装到电脑(仅推荐你自己的电脑)】
-
- Mac 用户:
- 1. 双击 "安装到电脑.command"
- 2. 按提示操作
- 3. 安装后在终端输入 openclaw 即可使用
-
- Windows 用户:
- 1. 双击 "安装到电脑.bat"
- 2. 按提示操作
- 3. 安装后在命令提示符输入 openclaw 即可使用
-
- 安装位置: ~/.uclaw/ (Mac) 或 %USERPROFILE%\.uclaw\ (Win)
- 注意: 这会把程序和配置写入本机。
- 如果不是你自己的长期使用电脑,请尽量不要选这个方式。
-
-
-系统要求
-═══════════════
-- macOS 12+ (Intel 或 Apple Silicon)
-- Windows 10/11 (64位)
-- 内存: 2GB 以上(推荐 4GB+)
-- 磁盘: 2GB 可用空间
-
-
-更新方法
-═══════════════
-下载新版 U-Claw,重新运行 "安装到电脑" 即可覆盖更新。
-你的记忆文件和配置会自动保留。
-
-
-常见问题
-═══════════════
-
-Q: Mac 提示"无法打开,因为它来自身份不明的开发者"
-A: 右键点击文件 -> 选择 "打开" -> 再点 "打开"
-
-Q: Windows 提示"Windows 已保护你的电脑"
-A: 点击 "更多信息" -> "仍要运行"
-
-Q: 运行报错 "Node.js v22+ is required"
-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。
-
-
-获取帮助
-═══════════════
-- OpenClaw 官方: https://github.com/openclaw/openclaw
-- U-Claw 项目: https://u-claw.org
diff --git a/小红书二维码.jpg b/小红书二维码.jpg
deleted file mode 100644
index 8735c1f3604ec14ad99f817e6c8b458547a0ab72..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 75734
zcmd432|SeT+dn+^CDJmoRMwV3$ud$|Mz@A6Su3(7N|uNeN|qMNkUb>(u0pa$R18`q
zOO&NTku{R+yvKQsy6@lbdEV!F{?GeHYNA4Clk46;-z57?^-zAaBcNM${yXzBju3ecpr+RpjmvDbjIAN;^SXh z!vS@V+<9|1_OC_G86vd(J?$|83q>U&!LQL4uQz4xz9%{ofS9C1WJsl}S?!`OHu|%Z z^leFsv6tuR$RQnUH|b6FJ8ARj+XtJtnL63XiXVsGAK(w#EURVIK-y0-z@my1C9lmD zIy75iR$?=Bf4B(O<<*Ng{+OrsvX%E3IdSc3Z=}A?eC-q2falFT3z~3E1W|2_qM?DU z`-?tO?%9)kt7-bx%FB$G2PS{^zh@*?W~JF@MfJgnk@JZwhR+-K98kUNT!ZkE^0i5c z?p^858$sT;Ygx_M@|Tf*jXNri#Rb#HV#|ab-v0#O&Hfp_yQQ@E0_gwYU!ecv(-io; zLJGbS0OLN+R4QdURX);ocK$)nYt}Z>`AZ<@A^84NgiNnw2sD*mw}oeb2f$ZOK;#F{ z8;RA!)15&%TPGMe_6xM}CoREoQ2}3X0?b3UaxW$zT^w@85{)^Cr^ZThlOQF&0k^Ctay ztZma+3#Sl)ZX0Ze-?DLkNd)g>wPg5@zJQ^eYX)AfUK?Mx_}5dfVf^urq@(e;lw 2Gy9@Dw`DuZ^LF~$j>7eloHl2SU#=k_Zu`ry%Yu o z9LS@pnBjfz!GK2??vBLqr2zZcM}Y!Wseh$W^{@&cGdztw#P*T?>NixT%wx}BZZ}nG zMJr0UyqS!sZueRPFN$`zg6*CEikrq+^}gQVK+?6CuhmQzYh6u{O!H3YarankhyobZ z4o!6oje*-vgS@dJcgMw74^6x{5hgGF$nD9bWSKxRPB8q9 r@OmGqCMW(KKK3+ivM$f z-w6cxYyKYK*MXG<;k=fS`#s3TxReud ID!0&o 0gPS>>vm zos`u1-1Q<56P9q4a7X>n8E)I}DRjE`#l&hcp>FH$7AYx_$BXTVNgl$r<3j$8f=ii~ zCS_TB4~^U)(__NUA`f&{+bPOdD6jnfmSbPCanExX>bJ>tMU)=<#fjzlp(mdW7QHlo z7aN%FdiK__veIn$w@WytQWdWjphhYV$%#;^3PLH)BJWAyvO_31W?&Y-_1#^gCfd2i z74hq+OJJ5d78Tdj>s`KUP-^GpkgwnSMY7OySLD;8*UZdJ }ex8w_a@ekDvT=EhFvWBu=s zIIe}mRBJ0Lt9|2Qu8U5E$Jh;WiQ@86+j5X+0@7g?MrV*Q$uju}Z5#UDjN?)tB)Zh6 z4W{V4BTEVuR-mWn$a$i~BGYg)UJN>!V>&GQ76Qre#bMvgtRWeevq`VA{J3*4NPiMO z!G3~3em^KG3V{}I +yc^!K*K2~vyn>H3`>Fw7!>+)HuKv9nWXUd!W*j>qR8N!1mnC+aj`0r` t;ehohC^^nS{GQdVs^K9sZP3g zB715D&*SKZ1dJnWXeX{EaRlDF-!yOYs%612x7#C^PL)KZ!9PoPxieEPXZ#E@OYQhQ zNqA*R(myF_H+DL4LAdxW`{ki;2YtOckK870u4}_LE99jD`TFeSc?g%LX>rUWd$WV) zy9!^L;cvY+fyyJ`^2f5KJPJkoZigA%2$id>ss9!zn7qgmaP3tvySF^iIrj?$oqNS; zD`ij}iecNO1(nQ+@gG}>7DCw}So>QU1#l*cog9v@-1dqF;(esegV2Iu3nybb3i#7s z$o_DHpqa*y>8;a1_+b$_{*l#kA`jvBG%U+3K;*i)7J2wJ#px5CLKdVC>H_FUi_MUZ z9{YfQ%{R`IN_DLgdnsEG=eZ_g4`^O-pdvdI8;4m%Tv)wqkrA4|rraAN^^+YTQiCC} z7h`ol*6tsgFe`o|2RXnf`JM8q$bOGu!!_Te>F1^$-f5R!_WsQ#+6%dKJJG54k@{f$ z(M8ox+vG3nOlwMqikMC7<-U{0{9<${_nDy#3iI%&&nnZ3FVP)OReUKIPVdg^>qCqH z64YFA2so-PZivW@f~A-3lKAqyec+ZEO1ieMwI6H0E0^Ho+pybc{q>4x=j*5&M3d~} z+vY_DemRZ-aju%p!dWY&tug>-L`|PBCC}bT^O5*^*RM4?;%?YHYCr>QORM5YnWg{W z251l^bj(ATRErS|*j&1+lJ>0Z?R+$~UW)Cli i`hjueK`P(;dhXb3F*cv`dO~`= zSWSlUke#Vdz|3vaQR<#W*0szSWyRm0Bh{6dt{45*(S4?StvtN$-pKaSYt__;dNEHR z=t2x)q!9GmAyL^1a#Xp$P-L@bExqc}zG7OTVC3uDNwk+Q?)}*$>-)>W*Bk4zrV~bf z*TR)q&)GsuGY;Bzpf$hFy!TZs*xlvl$k6m@==wl{h?}(OdYBPQfD@>*2?M!>K-k_L z7>?i!+IWxrhl9BF|LA !#`2({_JB3J|4!ClHF}hWvtHp-c{A2edY=R=R>wVk#r^c8jeC!z zjtWn|6oy nAQL>|SZpIr%pCnK;5Q-!_ZCX;gZfb$(&Siw$X3#1lk*M#-RU{z}tqo(|SX zw(K)^dB4!;^{@r5hyh^}=~hZUgAj<1K@C&npF8bUaiUn3yyU+q`65Q)@iAVw9PC=m zqX|I}8?n(eR$F$+20!VQIfifmG_V)(oY`JT=J9kN#xFE7st_ULxsoj$U+Sv3-}JP_ zWfunJ$f-J+*hoXe4&h4B4KCML1_E&?%AwVNW!?YZ|9>}a|7q3eFI2hKAnj;@^vh&5 z*i`$(;j+~eQ0iPT>7s`38cbd?H~pdc6sI5sznKUPq<@hbXfis;FW;$XXO|Hh@8F!K z2gZ`zI~+vYK@#74>3%5(dhQe?=?YEtMc9e7X9B&;HK^3t>-VK `*iC@S8w*?yVPOd^8-9MiJ(O8R^v^MXAIM#OZPlcq9Z? zbAwbv-=MQd{VqFen!3XekeSi}@ACJKd=YLLm0_KC3(Un!SqWrl)t=j8gOm~t1tgX$ zJ>~(wI}5PTJ!;22L~&htF B3!RoYNde_^CFv*`)>gG8r= ziOZ@-m3K0glHNG@CPK*}zW^oQUkSW-K;!A5R>4-Gjb`G2 wV?$jn3N1M7_3A)F>FMzrf%oFI&ohU`b7!gJrv{Kqc&d|4 zAEDfWeUxLxi+nEvQ&C7*#UoGW*?R^TnwCZhmn1Vf0?U89_gmQEB*HB3w?Qd?)-Q)U zVNu~ps>DBe{v|B=_i~#5A;-_nGz~YJvTr`_=$g`Fzcd=zwOdGTqWH><>qV|l>7`MZ zB8O(#;^M7+7b5a$W4E<3WE7kNifx}>E!#RiHk`M5U^v7zDD+zZ9olWoLHz_`YPW*_ z?d%CSYri-tP`D7N78gg6l12wr3}$uLIkeix@VxK}E^>HUThV|*S0>MjZV2rz{&@bK zirWPAvkLjt6kBJjXYqmb&TmCkm?n4eQc4TGcB_`w)t6Rg7A%$w1y5$l$H FL7PW^M3&DnJ#;huz0d;0K4LyAKc&zt~+8lHPO~y^(NAJ#Q=L zWilJe_uNToGv=Y`i{FIMJ<(3mEJtVO_z_=x7j4_(y~WY0&Z0Le@KyzN6}hpl?vT5T zP?AydRNe7NZ=g-ikmJYAH;<0OTG=w#D0v9*oRx`N3RRUAk)AO;V|Pe7{HIE97CUu$ zfc|N%lMC%7OB)m-F9?#H^NNI6J|sR5toEQS;rCf0lOmPkgUOcF4q5BWT6?e3)P0G( zH6Qsjc6z|)9 >9T$fQz+EXnm3rCVwGO^Mz1F;ZoP8HnLldxFdya#mKXo$mblp{NC&PPHU<)nJ_b zbpfzpy82mOOJ#mX+!z_iYeQ DU%}n= z5bl^1jostIvwi6Z5prcfh*VG)*0&Y03h^>A>Jl}!!@3vfvTrjWfo{#~ZsRs2LO0pv_cCn{rDbDgYaRn#&QNfFDcRSY9 z-LcdW>eq?8D1I@khlElbkinu;EtsG8ZCtOb3;^wsUFO8NVOg(#ujn`xq 7CfjP{prkrLS9x-}{y5Ero_QzJKwV}9;`{es(gWp~W#08&0B zMY`J2<&*kCx#X8e=9L^ w(sSie#qGhTbzCRjc!%hODa!NBKzWr>O2CW&=rpnN#s+pSmr^ zoacWTE^?#TcwrQidQEOF8IwOv?oG7+5*v?#3&^ID?Q`MBw;x&TTslw|-sO^UHHySn z!9E*|;3SM3va2e~Lzptu`|B*}<{kVa(!ZD|xejV+owV6YC%|U;ayM|xgbXbV51#cs z-9XlJ-s(!3?ZEo+cHlT`;HQK$xO_hJH1lJ8phM)zf|ZfMkoMz2lWI@e3^FO*uc?$y zWhWBTbZr(dZCF)*<92JP>Rd&8=i%^2D_dpb5{nO9&OLrA;o{tF=6b(reQ!>xU8Svm zmy5etigYcdy^@FU@}Xk?>kX5t#AX^+#pe-H5}Gig=Wfoss~4$*C&fnn(>WxKw(%Mb z+;RK-@~8)ul47(^6iis>j!*6MS#K*`P@=Ocr@5cIN0 {3Y+*gOM~^Si^yjJ}SOoOZ_JICfuh_)C87Sk`G~{I|R5N SUqb7uQkm6(cZ za@op$dnM}Tqj$ScTA j}Edo#!MyKBpqp z5_Xkt*$YrYhs~Oq^=h1xRQkpxw-#@0lD_a-GnS)O)Hjk@$|r{KP9Om Ac?S!Q(#;?dIs+Wpaz4(ebZZ*-3&PLo0?tgkZ ze9nhgHoJ{ILTGMRVZrUOmunMzq`IC{-R5HaV7cpOPOa-qarTTZIEig6%4{rw%j)Vz zv}RBm6CFXjC8~SY?aJU@nFD0I^SA{vitI|p#p>V7vzAPJ9DhK|m`y=s%<8z2;`yp5 z(}H T^_s`xJgr9Dc~~KID|LYr_bn`g;S4Daq+VSr0{m* zR8YG;a030uU*&GIJ1Silf1_%5G~~Z9qe|jjnm)FQ*B-+)ExZ~3I#+aee5|w)O)+q4 z2Hm~1gUaaaKxyHe=rb$PhtPhEMp>H1Jg!%XVL7CP2`XpO$( zmaJ}rKj=? =9~&gv{4&8FE5HJRdKMTfT+Vi zzdJ^0t94vZqg5ADcaPIE_2F@KQNec&ysVV$>=Fa!bO+g7vQO _Mc1N%qmOpGTO@j zsk8V$z@ZNNuNum|`nzBEUk20vqX7H={p|ma-~XUB@N-)_<6d;C{`5Gn&{t3jc1|P7 zw}%W~2wC>)p?sW9ifNXMJv>-%|12$g_LjPe0Ac^ct)P~QVU@v Fm0!3w2o@*b!k5x_jMv-@TUPy#~r&mV?9cSm|FPkns z3pH-A(6Ig_+4^0gWS`4!MPK-zdpyy% ;BG$Z{^V2eHuR zSfhaw5qBy$jB*p9Z4T#k9Bs9~y&=P3o-0tyzn*qyvX_n~ayG6x^4Ab~{>o B4n&sx=vg++soOyDty%e0_DHt+&seKe7)aSfs3*%PDl{KFCf1v8Ivf!z0j^KtN3+ zb!hJ--=DaAziv?Q*<9T7Af|c3#G3y#qJK_|?UlS6BQH-UcPjnT;Tc3brHiV-Y{m*? zl;U+fCr$!XpGbAW9&HKC1?pNDeb!8ie)NM13VX4HDY_=9KQm1!^mRqi(C&2UH|Gy7 z$D;^>j*>R$LAK{3ry;GbR&m`?32Mn6`H8)onde9wkQB>!5Rm$j@CAv2oqp6#@VvjR z8T2mk$EdE#CEX8`Txqf#bI^;F2YWcHKF=p@c;+V?T~hCjPZf2b9E=fOPONbagaG#F z3NBv4D+_m=I)4Hc0+!R*+W^01PVZv@AfeDAc?TG5iF5c`kU2{q^N}*7|1_(wQl?M2 zq^9^bds22(m#LGmcuq&N$5RpHo%u8XD+`oTrxijfGriOz?;QQT54zqw%$D*!bcB{f z*~|UTAnG*#R_#Qu{Tf+oOJfr2`O?=tkRByM=B_#p&~&2ZKzex d=-}`1JoSIeOj#auVN5A_r;>U!T^*EL$TjBJ zh`HCURxi3L#k*Ky#kTmt!R8KWh+@K{=nVrmj8rFnB+T~qdE~Mq!K(1*{8i@~sjv@Y zZ tFR99L_ED*irkHW5!LjKdFmG0S%G X~;$e|l@r;4c4!e0&?cvz+zS$6lr-MDt> zK)Sro0!6afJhoiaB58GfV(&)}95lv_fNd{<2u7pej?U&D)e*GPxWDoLu=mzcajc7; zXcH_XNP;^gXo3ZI8j@fkcyJ4W0FApt69{er0t9Uc9xO=X7Mu{Yafikl@8H&ZYM=XN zy?1BMtb5P8Z_d3lYyZJwEvl=!sjjN;`+mxV3F5^5d@%xikFAxrP(Dm_VhO69P{?mc zX3B?;FGS^@((|Ubq*!8?0Xtj0&`XMa= L5f$=e}JyfU^hA-w>i9cyb!c0-F*e0 z$1kn$v_#zqIK)66GReCh>rISRP8Bx>;Tkmtx-=GVDP^%;2=JN77WB&EK7(rit+~bj zA=}-SA84(q 6o_(h#9ZS zHx=)WJ51@C8tfwN?=*^=)5k=qk3PU(jRLL6a9)JX8~Z7pEVP!FI9ts;mwX_A7XZ4o zYd~|{BoTmjd->MkfybSO6dTE{`B%O^l SDZP0iLqu)n$fZG z7cG!4Z!4uJoZsZ`HRB&)eT&X?2eNQ#jJLYuFG=C*SDWouw9|@n-)wyY+6t_BvepCb z$v~{H6B@9yb3y?19@mi@MxF}LvzCApr^Q#}FS)6fPv^F-rhzqvYDz5R%tV5OowTRU z$!h%^&{uyuTcQ~+7mgIR^HWW&rnE{La!XwF2Jj#d#1z_ByL>v-p6mnb0F*9s_19HU z(MpX3ozYTv^AH1Hrf~NmqD={t%GsM6r(2|mOJ=~D%fv|zk?%1ywrW8*EPbHCuq@H% z3##QqJvi*@B&yO6g1cWczu1}dg1L(&CPbD#KHOh%m5b=!?AL}m_!H9b*d$WNK5>v` z=J{qr_aqpO;h0_K<|B7qc=?XFf$iBHST`X?c=-oFBzHM45QJs5gnX)G5s2@|R;=nT zCy?ULS1wij*7`*>VSi?I26yh6jD}0cSq`xzGXBN~1w9 SRxB{93j@+e!YH`tUp>TA?!X4Q$ 2Lh*;T7MI!nfF(TJ6q?6!R%_`DzvPe4r~eJVePgzF-~0)ijyPVKPI zgN)PF*scnq_X% JULcr~y0h%XliDLZU$^OU_s1#!>%5=;h!X$5%D(*n0~GW( zkl?Ss{fh|xuk-NNdHCxZ`0E<@>l*m$8u%}B4Ja&G1#0jgK)`;tfMcmG{z3z%_KjI9 zW(T^gc*A*nc&?4P0 uo^g1yE4(*UJY*w ?6szYcK?0gKEDE)QZzs|#7*Tes%_r=ryr1p@1W>d*u?*+&u|Ho#Re|Npi z|24?>e<2d)Kl7aab;JM9H^YCwIm!Zzx_wQPfbzrhgqMq->x_QWkGZZAOn3%2i|{KO z%lCEfQ?fr6YWm`v|CVGTDjY+Zk^scyq%NO#0@8aa^nqtt4dox8jrr@iv#6E!RS1OX z7zKzX`~l3F0>}{OVZj9OwI2fT(^~OXybEA(e+M)v{`+3-jQQ0AbVJskGwf6RfOd|L zgSW=7F+e;IVEQyPRJ^$|gDw;NDfS;>T)j;Lz-yS(f#e()KxKp$aa&To$ZFq`S9 zwl@Cqqz#xTlKlaS%FCASx)ubmOPS>buL(VDz>%c_P$V#w!|PSRD$oc)vpmlV?mzwk zyWFM0qyaA FqsteHUwa}7M~=a;xh?)JS1N5VsAkxA5BNJ zSU6AHvVP{jtl*^&3jBC_!-)-;Ay=i3zB?2d)Z_0!JK^s8*6I^KBm&k&srTXtZc6*1 ztEzT%g15PL%?QA+d2b6IPjC_6Ng7?v@Q{Rx@<546OPnbd6hJ2r1bM1QC>kWVmzzwO zS)6N~kX|#+w`cjPg2;6(8JQ8*69+;U6%-W?N&cm`V>*w}j 5{|sV zuR!xDZ{lq{b-0~#GA$AQ6US1myPFo0UT*OPE^W`CB(_I3^ R4+S<*3qQ#!TnG6|`VAI2Ua!_*tS4jRwn6sj26_#$Iw2 zJfG4&S&}mli~uoTF8ztI{X2u1@6~)txFU}{M#9}mh)hjpcAQ+^C6RGgyXrK6EN(XI z9sRZQ4d-Xoh3Cq=*13s7j?+PN#pCh;^ZNYS!C1pY8WNaH;pB0D^x2fj8rb&7k#t=& zUO|~iLb0kB*YNAXNBuGDN76ncK=kS>ba!*XdmU7w^Hal(z{f@qJwtlCax>-kptM&_ z9vtIMT(Z%SyRr4mvgFyW{5>F`yDnAtEWsyLTk#&$_r(Xm4ihhBh94@l`sj{PWA&qG zaLHLEr4E`S?o@$mb5S|lc_!|epD&gy<04;N3qP4dfbG0j702bh=E943g^3xSxFRP( zrd5)VOGdka+zZjNCK8FONje1UAD~AD>4#lT4{Q>If7#aabFh^Uuv)Z<2?1F`6l=@G z7*-QQ6Zt~#Fx`~J2&GM@)`uq+3jw}*wJdlVZ-Pmf<4*n|iiu6Hr73D0Kih{=3`t{c z5rq4?o0Byiy&TEN9-w=<$Gv<@I{UpFI;ePfK^(FSd;M~&zrvR$@SgYFw@lBSffhY9 z-T| &Z?>I!04T?!4I0eE2~CPrBhT5RYlfDG`JJx;4q; z7Yl#Y4r*K76>Qcqouija^Mot!m|K_D+pr>8byQQHLh;#uByjW}*;j|b^#anQGr8-^ zvu52_f*sXryxbkTd=z4P9eAE}D-ZH6`dC}i@_y}zkGiRUU+Qon$W;+J-dftj_z2-o zmiKb#0lj_j-J`~iTl`j^z7Bh6=Zk>sc55W&ihMb4$?Jx-?$zvX`Qlkr))1_(03>wt zehPzV G4Mb5s1%zNf~j*)Td01 zv?FMY18cDokV7;rY-`IWk1e7f+bFGk$V48mwH|k+C+^I#WnG HIs2H3EfY=Njzx{;GKngBaQY$ zh6qMQ{h_C&((~QeJv-6#W;20$JiYrfH^;CpAm7W#j^WNY2Ggg`XpRSY$rbiF4uYYc zRIAT>;qPEsdn_PTA`wGdRZ0g(@Dit!FYd``1co+SeY-G#>yEv}Eb5P6XRS$D&>)Kd z-8j&H!P#P#_e18-L~Q7{W`YC~*1# & z81tHvA%fp2#ueO|;lLM55?V>SMrU3Ye%qndFq;6gM~V%p6t_nQcIDA2m8%YzpRKqA zi46 d5!K1}_aEwN>I&TpdRp9pokNkj>NN>d2yJ;@Rem{)X5^1SBjSJ7ZUN70 zACW&m?#SOcB-v7Ce&A>+FK(BOk4g9S^}cI3gS)3|=i~}5m^%Lei98OTl}o7l6@RNN z&DAS~3vYWgOXKqgNZGNi1$kQe{9?}va6#FQvis+`iXv|j@w>A0n+50$ZNHk^3=0Q} zHgB>!zZ4sBuuS5E+8)hcWII)vJm+z$OSxN~{K>1=X9Vs|;owa@EM=a5`-SP*q9Ov} zJhB=yif@jFbsnMWt8CBsKSpgQJgx*h@!(i5FoAH1FqELPo~X(0#d?*r5|cZuE55Vj z#;Nb-(Li(MoVL@t9e9Ni2rJc=mRj$-{cVFi!I|U!->0zu_HXe+h8^gv3`1jsZg-4` zA_jeUK?v(?;aZq3x_RI57@=N|e`{H`g}H+dOj=FN($~5ro0)Q*7jX#%ODC&r@-a_$ z0%_(7rlT}1<( RF?t{rpWPYKzbGaAlI|C<+Cz*ayjdH%7tt zRqSxW#E^U}NpRVI5H!}4k!Y*433}^S;Gq@Ioh~CN+8f|@UkzSfD)m(TbOeJg^r{$H z_3hz^;$_LAn9T9S3iBZZU!CTmZF}dI4plfyanwwVzn;*jxm=|8&HA-WOP{9~ze{=8 z=h5CjaiN_Tkn}1^Bg=(n-oJ6@f&0y{I)b7HNLkd8sEjD&Z?yA+E^_4d5ke_Pq&p~f zo21Xuq@Lhqc{n|b1HKN~o;U9OJ6xYHa(TkC3b>!mch>90*1P85aQ@&Z8VwX~$-Qo7 z68zBf( k#&Nl=-FA-}&iIf?z5F>lqtxGVQrKwhQzmaO!!EWFs$;Tz zy0GO>kw3HS{S7nqdyzd@*fnal<534jq1APGcxil*xjsgb+`{(j$( O-nc1}^zEs&idTrGTu8gYGc7I3^b=c43 zSh1#Pb!<(SyVS|x*Tc~XH7$$M2|*)_zV*xw_P%7WL6jjQZp}1Li>3#A9>e&&kSory ze)8}s3yl~m9oi#F^lHtBrgp}Wb*7qt5Sx|cQ;^GU{CG)^upiB6xgkY1-8_V?b=YD} zA)yGRceY!^8SyhTKT`RT&k9n?8s^CLc~^x?QmNO<_42abTKs%OJRb>nQC{2*IJg&6 zJQ~BsYt@u06!2V?OS`@$Xub22*^A-sje>jtzMaI7V`8rtOYwV|oMSW5sB<&Wu%kam zQ8Rr4 B1nU6k~LsIx3br}s4W1Wq#9OV$X9ffqOxIR#| z8Vfo96;6HSFyyNje8XnFvM=yrGd!yowH1hmZ@$eHY8FeC0bZwgXz#J)0xNJceT43d z@YlhF(Ih@0#%;M5=wuP63gYYLal??pC==e%tUl-2@4(3T#+L{mw9z1-)k62VhzWw3 z^W#lVf86k0__3!wwVj)IYl8LVt< OFMMbSs6m7~ec6p!8T^wo2oLE<;Q7UEm&LN KnB-Caz~qHa8uf{$F}sGJ(El&O1H7&YFg@_G80x zg5MIVjW+Pz_d^!EQ(xsmNpU#kRWv&DK2G{&S4Q73AnChBe|1)RHm94gDkjXMwuCPy zVg (wB0Om~L`j)I9B+dh8n>(jvR&?G-YhKMeDboE6s&Z%7l95F< zQNQ_WyW3mjU7GlJ6m3T)rPM77?dl|?JBQ9P7JT08Jr!^k2y9C$`muV;+o#<+x%MHn z=hu5H$w)$pOp?x^XSD&K1#iP^^%}I`QtdG*AIsJtbFf~Rw9CljCOT!FS{|97gPIc> zgC9th1#t!H*L 3b5l5_5G|?`FwFrZ1y%g}QBtI`#A)sC_H05%eKCBN zlyw(GTrF1q94^8e5CG04`7r9Go=N#P0tr0@I^U04H_9YB+u$yIXCEwRSiZPrXI>*? z^tAO&nb5*1&2D~9R!Lm5G6PcGb0n;mfr=HJ*i>(hjtwqk=2ctJEb~Izcbr(o78BK$ zlunW9dpu!0?-;E!K4SY|cqK5x!~XIClspt95xLoRPQsoMfoF%m^yIDHiG0d%e(8tz z>&gNMFgWg^L|mx%X|?#!@#1!?&IAK9m)3H%RAl_U-!D_nl?1RZ^UQA|gw@wbLd?-R z!FyZ`d(4;WGk<`p17f`wv(6)0aKA~h48iR;))HJ3{jQjbbBJygS1|Py1GE7>@Seu& zvICu RxGc0V}+1?-G=VX{|aA|4uKuP5=(|?s1+r zMPG>$>u7hndYYTm{{WJvqE-Prx})M|*9})>Ma^npMS5WCnRSOs&kRW(Na^O1N$V-+ zjm_aO^Hy+r+?jBjpv>-~IJha1X~YJTJbxi((dp|24DmiiG3i^~Z9LgL0wN99-0z-| z$MtQ3(|UZNVGi%Bjy7VbxT^J6 ?=-1o z!jt)hPtUQgU_WbO+C4|Csh(^8g6OEI&@mC5#8++a`!RRdhdZCiWd{1g3b{zuQj)zL zm)~Tsk<<`|Q%iZKv*aOFAhx;ZsK!rdlwRHzHW0_&*9zvJ!U{*>1LI0+U(1s?xdb z^WKRC3)g&{P@048txtG?Fhhqn75$aYdTzgNH$aR#YWDFGm`D~>0a)ANO^=hm^~fx@ z;2$7qqsx0zSgSnRFQ-)}x5Ed2r^zS|4E#XF+fH4?uL6-f59Dmqp{Y$A-1GBJI9S`Z zpUrB%>-CKJl-WJuHQf?lVWL18%EX@8p-kA0^^ZQr1X65YIqXTq#^`yj*J@R4u)am2 zOi3ziQVrSW=1src^vWX5`+sn>;XB*S`U8OB<7`0xZmf7Lq~&;17IS$2Ilq3oR=XhQ zAR1pbN rAM!NHxK;>eaqOo_Q`4{h^o(GSh;vxWlaC?U+<8L$vUS&lUF)LV zf{?bnVD1U&0t SyoC`__ou@q&`kcxhIM>-rBX= zZN+z2pUdOv&}B2zt|^BdPO2#Xj|YQ4JB1n7SM)~Hg%crH9<60&p43zPC-k}v9;Ma^ zJrwV9?*%xy9syC=9xy`kf1>o3BBRts!m5J5ME{3duK;Rf%TOm|ErZ7vy$7wT93NE_ zK~)R3N^{-`x^P)_xNfhWMl~QWr>2ruZ@HA1&^+J6W)gyRd~S9XN^DIXhGAYrv7J3G zRSA|XkLc)0Iq#hExP+^sUuKgBFEN;sl@NFdcmAdk@Wuyxz5AyrO> CYCG#J%kh|_IdFN=o#pwFd%(lWb2Fe zQ17y!&0_rPD_y=Qo>RXf#Jv1OUUlqyJQJX!Wh?-{a=f16gA3iWWByFCk!ip*W?*}@ z|BJT2WlV(5IQqT#EfAL_zB`}LW8 bF!7%q}oSpuo^qAf^#;Z`diIl=U# zwPtjx;H`Jcpiy&5PpzsP;0F~Hdp~@NjK{!1PVN*qx<}84&7;JAg}YH`h{CjYAeeVf z^DU0O&gx=UTKQ2ub>AIY9uNbQ2l1R>_gN{Gr|a|*!2%M_wr|C-a~MhzC5nFSeQV2K z(Iu{gl&P;ti}*3Tk_?arPj~nZjfkBhnO=dmcM5Jp3vL2UPFviH@}usSusMl{TZDH0 zq>4XNrYGe}sX_R^UZQNN3$UVrKVfC(3TnLDNW&l kmdUV|RTimViG1;s#_T}Wh zXs03ZmrfOFUR;+Oc`w@BZx9TNh@p^%En42?{s;GUi(wREx}9MMX}AkMO1+;@-0eQX z8Und7IK8 c5;c3%z@XGst-3na7Q9gvDI(U;v)Jve7cNw z3gx{MCz0p*xVl6=i?L1T%OJMlAE5UK-ndWsV<(ZU59Dy@-^P8Uoknwn9iGtTG5mD= z2wVJ>7X}o=?U3w GM8%&%uj5SmDwy^-wFH@dHl6hOVsAITl&~2 zoE35E%~!GJmrJs!b@8K*{*yODTX4 `cfCdFUf`0{4T;8;w zUqD0oZg>C{_BIvYp9eCv?xEM*w|bAMT!ALvZZ5|NkFD{j@{y8(^k3@pWPi*&VT6y` zfFB@K#(DNsLk8Cihn8#r7qxJwdqKfIYu4DbHdmKU9xbWqo+tbD>u8^|F9vy^lsBI+ zb-E>7(w< #9bb`(vLRBuD*zMKo$O6bHDtY=*7R}hkHDww!c zwaSBx_Kg+8gtG8ZH!rLU&4vU`>Qh|_e!M=oZfjK+uHlF<1XIS|zZO~PeRnJ~UizC@ zFdlVUHbSyfSCtjGhLBAhSFz&0*2Y^8^7TU_mV)@^iMTpU8N%*o)L#n>)JkP0{&Jhk zZ$H}4t|^D4uQq&we+`RxbZL|sg7F=PXw3nU>1fq&koPQJ3(Nq2#BeuHXF4ve0+RmH z(7n3PlYg^UMk!qG!uMJOch|&At!1)8sDWeA%U)FJ%l6Zv*j2>V(c-ur6^WCL>;mfi z!+yMBTl)LZtc~6R+|Tb0G$UE%FBga>f2po{pF;7M%}g%>*OV-v+;guQc?GAB4rR$m z?n5LtL%-g2+_W>|sk~pZ(ZO&FE_!89Ui$(~E1rI(zHg2v6~Edmwlz(UM3*lU4bV3c z#eA9*{_H^dxt;}&9~G5c+syI}YIB>;S7$%NK7Z_RG6Yf$@SsR8s~08O=pv=^I=PcG z=Aoi$tsZyPsV+hwfbEX@kw49* +dyW-sZU{=Rn>I_$xmlj!Hd(=(iGpbET2+ii05%wa~(|r|EO*u zm$XpneaV4SIzO@T9i8q(&Mq (xLAu7K>e9jlI$^| z1(@lDF;5MX}wIeY?#=A0xrv$f8RMvsa_Fz^oPu*)fBp4mMZ_l|Sm&OoTGR1-&Cj zq7W}>13F$XrJZH^!(Pob26L5q1+U^%_1~)&eGY`6yI{E5j?N>bc!(y?a?mriNXrOf zl{*S|^C$OfDbcziY&|C>KI9gARl!OLZa+Bc)VFl~jTqB%y z}&)>=Dqmlzz)Aem&)_#PAvu5BBjnittSuDh85t|K=fU^oh8 z$eU3 ~cA|jMY`xwOZ;vc3`?QLD?NYExvA1KVEm>u-5cpr6HCz zN>*oV`cZf;1tZMDp>VDM{*eIZ$ryz*F35=CAK}-Z@T 8WWWf;o&P?sW@op)wfJJFMH(VZ`hzP z$qg5S7shV}x;za?80=W5%|jX zz=y!x2`#)QcJ?*i;=$iuEV|+iB=0e}{q0zNz_EZD4gFo%@lqEC0|xwgrd{%ky^n6& z<1iL|?f+_v;=kI>ZpJ2WRu){3UjF5M{;#$GV_c|31$4xZ 9<;C{V%6dJyQtn#U)&fkpvZ_i_1AhAZ$aGMa!xzh7^nW?h%u>< zB2g)JqU&N4v~o=x+|;9y2htkT{hC*`q1*kYlGnDn`5tG^By}hc8~Hy(%Kk?eBJVFE z;cR0EbT8l7Ed=g?)qPXt?T`iY3_6-lA|zrQs*7m7UF;r1qT%W@9)}WTi!%fN-iJUU zo*ZgI1KZN+A+*!@Tf&dq@D0m)x^s)^3b%`QrI6S)7@xtly=QYHW~BF-8nLLw(XMKM z4ERDF+3esRDHQ{?28^aLr>NxuyAc Sun@D+A+4*bQ1eXgO;(_7W&1+=MX}|o5 zed6>UVLR$$_6sPb Q{P$svbBC)K+=WVC6eLFqg>jRPg1EVW+C9SkUimLUuvHrXzP7yFVQL| zBWHPg9qsG>B05h?WLy@1`pycmdCYL>W++|V2|oQ=)eV__T{c5qs4(CDGtp;_i=SpW zJ`Ak5moH6V4I2!sy{NP$@FHiL%_W&t+A*s016p1}RaYseiD6IBw9o5JAv2Hr7WOm! zHgmooZ7jA&2=mCDLe}Gc3q+FGL>`FuF*J|^6;pJbO+v^wld(T(2*Z3bu&_G%SVysM zv@nmA%b=@_N(QfCC`K!pL&o-aH9P;aj+@d1bZBc^(QSfMAkb7C`+h0IC^`lSas>~R zlkCyKE>!SpZVN z|#dFzOZ~Ww#g2*sgf=h-xXhK%>Kac#k=}lQPb#= zF{j6(RwM4J*XTb$+!wn#QV$(dvKi~cq}8uA^~4&6<+gIRa&m~~{wD?Izs=PBDO7tf zrlS1+0(*C&a6vrOU!!o?pQw^++ I!D=DpvAycC@moNx-X{K4N%5IfF$F=UnB^TQXC|0JO z++DFD5ZTFNvK5nJG7W+Gf@<>=E ~b-dkqr_k7o?2lg|Cnm5dkEpO%(rO5A4b zaZYKr`46XpBy2m;-RbYVT{qyx*+%@a{b>to-o1Cr$4+__g_NI?CsRzsJm_Ku>=i=> zHipElUm*g0z%cb5u5tEl<8#i5)bU~F1gUZkNrX$cgB51>nTx25KJ|)6ugfw8w7V&; zyif$j7+DZdEzU~7Oa6g2kU^#>D)!(MD9tPni!1EzN@?r+MJ(ZnnvU@}lx5(d(AG&` zTUKjG878S!i+Jq<4QResvTC>ZLSxLladKa#&+~GT@@@w{Xyv!yR1ou|l*;=*`3L#V zk+bLpAN!JI8ZjEMS!Jt(MC60g6Z?`1H{;fc9JE3jZed)#ZZ)*LiG`gz+u84}+lXm! z)06v;MJ5+!SV^=|veeHmBwvQhH;h}r-`6xi1zsK#D-X*J2b2giSgRbl(>i9q`ywwG z@koE#bJ c4c4AKRh5Bw42kZMaffP((`YW^!_dVyCO#!|Lq!!Cd4>7auW@3K zG8(6hFzp_YyZ5ef8d@Y45TH$H^|(%*$)&8mde}f1pNcQtT3R}SmuqBaNlbe8vy$tD zhA0!%5Y%(TJ!jlTSLZ-X@Ti)tF28Ys7@4`XR0!}c?+bTR3}2!IjZI^6U;d1987RKd z^DEw-d+qA&_u6RS jthQENNNkcAy%=3en^1 zF;xRC=&d2x(`X4zx+mM~45bZMYa5sH%QaS9|1}kZF^*>DbbZzlOfrfPy1vzEQU3Nr z
>qXM#U|tOpQ*>@{Uk|I#=3@0-0Cl$R