From 4fcd22d4e35c1a934d847b1fc2d2ff2637be1fa5 Mon Sep 17 00:00:00 2001 From: dongsheng123132 <90887123+dongsheng123132@users.noreply.github.com> Date: Sat, 14 Mar 2026 00:08:56 +0800 Subject: [PATCH] cleanup: remove Linux scripts, unify core dir, fix Intel Mac bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Delete usb-scripts/, Linux-*.sh, setup-linux-usb.sh, migrate.js - Rename core-mac/core-win → core (with migration shims for existing USBs) - Fix Mac-Menu.command ARM64 hardcode — now detects Intel/Apple Silicon - setup.sh: remove Linux branch, Windows download only with --all-platforms - Update README.md and CLAUDE.md to reflect Mac + Windows only --- CLAUDE.md | 5 +- README.md | 120 +++---------- portable/Linux-Install.sh | 273 ----------------------------- portable/Linux-Menu.sh | 300 -------------------------------- portable/Linux-Start.sh | 185 -------------------- portable/Mac-Diagnose.command | 14 +- portable/Mac-Menu.command | 11 +- portable/Mac-Start.command | 21 ++- portable/Windows-Diagnose.bat | 8 +- portable/Windows-Menu.bat | 7 +- portable/Windows-Start.bat | 6 +- portable/lib/maintain.sh | 8 +- portable/migrate.js | 33 ---- portable/setup-linux-usb.sh | 220 ----------------------- portable/setup.sh | 65 +++---- usb-scripts/Mac-Install.command | 90 ---------- usb-scripts/README.txt | 51 ------ usb-scripts/Windows-Install.bat | 74 -------- 18 files changed, 101 insertions(+), 1390 deletions(-) delete mode 100755 portable/Linux-Install.sh delete mode 100755 portable/Linux-Menu.sh delete mode 100755 portable/Linux-Start.sh delete mode 100644 portable/migrate.js delete mode 100755 portable/setup-linux-usb.sh delete mode 100755 usb-scripts/Mac-Install.command delete mode 100644 usb-scripts/README.txt delete mode 100644 usb-scripts/Windows-Install.bat diff --git a/CLAUDE.md b/CLAUDE.md index 814f271..b6b1d13 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -88,7 +88,6 @@ Release artifacts go to GitHub Releases, not the repo. ## Platform Support Status - Mac Apple Silicon (ARM64): ✅ Working -- Windows x64: 🚧 In development -- Linux x86_64: ✅ Working (scripts + live USB mode) -- Linux ARM64: ✅ Working (scripts) - Mac Intel (x64): ✅ Working(portable 需先运行 setup.sh 下载 node-mac-x64) +- Windows x64: 🚧 In development +- Linux: 不提供脚本,后续只提供教程 diff --git a/README.md b/README.md index 33fc25d..37b74db 100644 --- a/README.md +++ b/README.md @@ -19,15 +19,6 @@ 代码库本身就是 U 盘的文件骨架,运行 `setup.sh` 补齐大依赖后,整个 `portable/` 目录直接拷贝到 U 盘即可。 -### 两种 U 盘模式 - -| | 便携版 U 盘 | Linux 启动盘 | -|---|---|---| -| **原理** | 在已有系统(Mac/Win/Linux)上运行 U 盘里的脚本 | 从 U 盘启动整个 Linux 系统 + OpenClaw | -| **U 盘要求** | 4GB+ | **64GB+ USB 3.0**(USB 2.0 太慢不推荐) | -| **依赖** | 电脑已有操作系统 | 不依赖任何已装系统 | -| **适合** | 临时用、公共电脑、演示 | 专用 AI 工作站、无系统裸机 | - ### 快速开始:制作便携版 U 盘 ```bash @@ -44,34 +35,14 @@ cp -R portable/ /Volumes/你的U盘/U-Claw/ # Mac **完成!** 插上 U 盘,双击启动脚本就能用。 -### 制作 Linux 启动盘 - -把整个 Linux 系统 + OpenClaw 刻在 U 盘,开机从 USB 启动直接进入 AI 助手桌面。 - -**准备:** -- **64GB+ USB 3.0 U 盘**(推荐三星 BAR Plus、闪迪 CZ880 等高速盘) -- Linux Mint ISO([清华镜像](https://mirrors.tuna.tsinghua.edu.cn/linuxmint-cd/stable/) / [中科大镜像](https://mirrors.ustc.edu.cn/linuxmint-cd/stable/)) -- Rufus v4.0+([rufus.ie](https://rufus.ie/zh/)) - -**步骤:** -1. Rufus 刻录 ISO → 开启 **Persistent Storage**(8-16GB) -2. USB 启动 → 进入 Linux Mint 桌面 → 连网 -3. 运行安装脚本: -```bash -curl -O https://raw.githubusercontent.com/dongsheng123132/u-claw/main/portable/setup-linux-usb.sh -bash setup-linux-usb.sh -``` - -详细图文教程见 [guide.html → Linux 启动盘模式](https://u-claw.org/guide.html)。 - ### U 盘功能一览 -| 功能 | Mac | Windows | Linux | -|------|-----|---------|-------| -| **免安装运行** | `Mac-Start.command` | `Windows-Start.bat` | `bash Linux-Start.sh` | -| **功能菜单** | `Mac-Menu.command` | `Windows-Menu.bat` | `bash Linux-Menu.sh` | -| **安装到电脑** | `Mac-Install.command` | `Windows-Install.bat` | `bash Linux-Install.sh` | -| **首次配置** | `Config.html` | `Config.html` | `Config.html` | +| 功能 | Mac | Windows | +|------|-----|---------| +| **免安装运行** | `Mac-Start.command` | `Windows-Start.bat` | +| **功能菜单** | `Mac-Menu.command` | `Windows-Menu.bat` | +| **安装到电脑** | `Mac-Install.command` | `Windows-Install.bat` | +| **首次配置** | `Config.html` | `Config.html` | ### U 盘文件结构 @@ -83,18 +54,14 @@ U-Claw/ ← 整个拷到 U 盘 ├── Windows-Start.bat Windows 免安装运行 ├── Windows-Menu.bat Windows 功能菜单 ├── Windows-Install.bat 安装到 Windows -├── Linux-Start.sh Linux 免安装运行 -├── Linux-Menu.sh Linux 功能菜单 -├── Linux-Install.sh 安装到 Linux -├── setup-linux-usb.sh Linux 启动盘内安装 OpenClaw ├── Config.html 首次配置页面 ├── setup.sh 补齐依赖(开发者用) ├── app/ ← 大依赖(setup.sh 下载,不进 git) │ ├── core/ OpenClaw + QQ 插件 │ └── runtime/ │ ├── node-mac-arm64/ Mac Apple Silicon -│ ├── node-win-x64/ Windows 64-bit -│ └── node-linux-x64/ Linux x86_64 +│ ├── node-mac-x64/ Mac Intel +│ └── node-win-x64/ Windows 64-bit └── data/ ← 用户数据(不进 git) ├── .openclaw/ 配置文件 ├── memory/ AI 记忆 @@ -155,7 +122,6 @@ npm run build:win # 打包 → release/*.exe git clone https://github.com/dongsheng123132/u-claw.git cd u-claw/portable && bash setup.sh bash Mac-Start.command # Mac 测试 -bash Linux-Start.sh # Linux 测试 ``` **平台支持:** @@ -163,12 +129,10 @@ bash Linux-Start.sh # Linux 测试 | 平台 | 状态 | |------|------| | Mac Apple Silicon (M1-M4) | ✅ | -| Linux x86_64 | ✅ | -| Linux ARM64 | ✅ | +| Mac Intel (x64) | ✅ | | Windows x64 | 🚧 开发中 | -| Mac Intel | ❌ 暂不支持 | -欢迎 PR!特别需要:Windows 脚本完善、新平台支持、教程翻译。 +欢迎 PR!特别需要:Windows 脚本完善、教程翻译。 ### FAQ @@ -176,7 +140,7 @@ bash Linux-Start.sh # Linux 测试 不需要。安装和运行全程使用国内镜像,国产模型 API 直连。 **Q: U 盘需要多大?** -便携版 4GB+(完整约 2.3GB)。Linux 启动盘 64GB+ USB 3.0。 +4GB+(完整约 2.3GB)。 **Q: 能分发吗?** MIT 协议,随便复制分发。 @@ -202,15 +166,6 @@ This repo is a **tutorial + complete source code** for building an [OpenClaw](ht The codebase itself is the USB file skeleton. Run `setup.sh` to download large dependencies, then copy the entire `portable/` directory to a USB drive. -### Two USB modes - -| | Portable USB | Linux Live USB | -|---|---|---| -| **How it works** | Runs scripts from USB on existing OS (Mac/Win/Linux) | Boots entire Linux system + OpenClaw from USB | -| **USB requirement** | 4GB+ | **64GB+ USB 3.0** (USB 2.0 too slow) | -| **Depends on** | Existing OS on computer | Nothing — boots independently | -| **Best for** | Temporary use, public computers, demos | Dedicated AI workstation, bare metal | - ### Quick Start: Build a Portable USB ```bash @@ -222,62 +177,38 @@ cd u-claw/portable && bash setup.sh # 3. Copy to USB drive cp -R portable/ /Volumes/YOUR_USB/U-Claw/ # Mac -# Or drag & drop on Windows/Linux +# Or drag & drop on Windows ``` **Done!** Plug in the USB, double-click the start script, and you're running AI. -### Build a Linux Live USB - -Boot an entire Linux system + OpenClaw directly from USB — no existing OS required. - -**You need:** -- **64GB+ USB 3.0 drive** (recommended: Samsung BAR Plus, SanDisk Extreme) -- Linux Mint ISO ([linuxmint.com](https://linuxmint.com/download.php)) -- Rufus v4.0+ ([rufus.ie](https://rufus.ie/en/)) - -**Steps:** -1. Flash ISO with Rufus → enable **Persistent Storage** (8-16GB) -2. Boot from USB → enter Linux Mint desktop → connect to internet -3. Run the install script: -```bash -curl -O https://raw.githubusercontent.com/dongsheng123132/u-claw/main/portable/setup-linux-usb.sh -bash setup-linux-usb.sh -``` - -Full guide at [guide.html → Linux Live USB](https://u-claw.org/guide.html). - ### USB Features -| Feature | Mac | Windows | Linux | -|---------|-----|---------|-------| -| **Run (no install)** | `Mac-Start.command` | `Windows-Start.bat` | `bash Linux-Start.sh` | -| **Menu** | `Mac-Menu.command` | `Windows-Menu.bat` | `bash Linux-Menu.sh` | -| **Install to PC** | `Mac-Install.command` | `Windows-Install.bat` | `bash Linux-Install.sh` | -| **First-time config** | `Config.html` | `Config.html` | `Config.html` | +| Feature | Mac | Windows | +|---------|-----|---------| +| **Run (no install)** | `Mac-Start.command` | `Windows-Start.bat` | +| **Menu** | `Mac-Menu.command` | `Windows-Menu.bat` | +| **Install to PC** | `Mac-Install.command` | `Windows-Install.bat` | +| **First-time config** | `Config.html` | `Config.html` | ### File Structure ``` U-Claw/ ← Copy entire folder to USB ├── Mac-Start.command Mac launcher -├── Mac-Menu.command Mac menu (8 options) +├── Mac-Menu.command Mac menu ├── Mac-Install.command Install to Mac ├── Windows-Start.bat Windows launcher ├── Windows-Menu.bat Windows menu ├── Windows-Install.bat Install to Windows -├── Linux-Start.sh Linux launcher -├── Linux-Menu.sh Linux menu -├── Linux-Install.sh Install to Linux -├── setup-linux-usb.sh Install OpenClaw in Linux live USB ├── Config.html First-time config page ├── setup.sh Download dependencies (dev use) ├── app/ ← Large deps (downloaded by setup.sh, not in git) │ ├── core/ OpenClaw + QQ plugin │ └── runtime/ │ ├── node-mac-arm64/ Mac Apple Silicon -│ ├── node-win-x64/ Windows 64-bit -│ └── node-linux-x64/ Linux x86_64 +│ ├── node-mac-x64/ Mac Intel +│ └── node-win-x64/ Windows 64-bit └── data/ ← User data (not in git) ├── .openclaw/ Config file ├── memory/ AI memory @@ -336,7 +267,6 @@ All scripts use China mirrors by default — no VPN needed: git clone https://github.com/dongsheng123132/u-claw.git cd u-claw/portable && bash setup.sh bash Mac-Start.command # Test on Mac -bash Linux-Start.sh # Test on Linux ``` **Platform Support:** @@ -344,12 +274,10 @@ bash Linux-Start.sh # Test on Linux | Platform | Status | |----------|--------| | Mac Apple Silicon (M1-M4) | ✅ | -| Linux x86_64 | ✅ | -| Linux ARM64 | ✅ | +| Mac Intel (x64) | ✅ | | Windows x64 | 🚧 In progress | -| Mac Intel | ❌ Not yet | -PRs welcome! Especially: Windows scripts, new platform support, documentation. +PRs welcome! Especially: Windows scripts, documentation. ### FAQ @@ -357,7 +285,7 @@ PRs welcome! Especially: Windows scripts, new platform support, documentation. No. All downloads use China mirrors. Chinese AI model APIs work directly. **Q: How big should the USB drive be?** -Portable mode: 4GB+ (~2.3GB full). Linux live USB: 64GB+ USB 3.0. +4GB+ (~2.3GB full). **Q: Can I redistribute?** MIT license — copy and share freely. diff --git a/portable/Linux-Install.sh b/portable/Linux-Install.sh deleted file mode 100755 index 521b66b..0000000 --- a/portable/Linux-Install.sh +++ /dev/null @@ -1,273 +0,0 @@ -#!/bin/bash -# ============================================================ -# U-Claw - Install to Linux (从 U 盘安装到电脑) -# 优先使用 U 盘内的离线资源,缺失时从国内镜像下载 -# ============================================================ - -set -e - -UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)" -APP_DIR="$UCLAW_DIR/app" -INSTALL_TARGET="$HOME/.uclaw" - -GREEN='\033[0;32m' -CYAN='\033[0;36m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' -BOLD='\033[1m' -DIM='\033[2m' - -NODE_VER="v22.14.0" -MIRROR="https://registry.npmmirror.com" -NODE_MIRROR="https://npmmirror.com/mirrors/node" - -clear -echo "" -echo -e "${CYAN}${BOLD}" -echo " ╔══════════════════════════════════════╗" -echo " ║ U-Claw 安装到 Linux ║" -echo " ║ 从 U 盘离线安装 ║" -echo " ╚══════════════════════════════════════╝" -echo -e "${NC}" -echo "" - -# ---- Check CPU ---- -ARCH=$(uname -m) -if [ "$ARCH" = "x86_64" ]; then - echo -e " ${GREEN}Linux x86_64 ✓${NC}" - NODE_PLATFORM="node-linux-x64" -elif [ "$ARCH" = "aarch64" ]; then - echo -e " ${GREEN}Linux ARM64 ✓${NC}" - NODE_PLATFORM="node-linux-arm64" -else - echo -e " ${RED}Unsupported architecture: $ARCH${NC}" - exit 1 -fi -echo "" - -# ---- Check existing installation ---- -if [ -d "$INSTALL_TARGET" ]; then - echo -e " ${YELLOW}检测到已有安装: $INSTALL_TARGET${NC}" - read -p " 覆盖安装?(y/n): " -n 1 OVERWRITE - echo "" - if [ "$OVERWRITE" != "y" ] && [ "$OVERWRITE" != "Y" ]; then - echo -e " ${DIM}已取消${NC}" - exit 0 - fi - echo "" -fi - -# ---- Step 1: Check environment ---- -echo -e " ${BOLD}[1/4] 检查环境...${NC}" - -NEED_DOWNLOAD_NODE=false -NEED_DOWNLOAD_OPENCLAW=false - -# Check Node.js - prefer USB, then system, then download -USB_NODE="$APP_DIR/runtime/$NODE_PLATFORM/bin/node" -USB_NPM="$APP_DIR/runtime/$NODE_PLATFORM/bin/npm" - -if [ -f "$USB_NODE" ]; then - echo -e " ${GREEN}Node.js: 使用 U 盘内的 ($("$USB_NODE" --version))${NC}" - USE_NODE="usb" -elif command -v node >/dev/null 2>&1; then - SYS_VER=$(node --version) - MAJOR=$(echo "$SYS_VER" | sed 's/v//' | cut -d. -f1) - if [ "$MAJOR" -ge 20 ] 2>/dev/null; then - echo -e " ${GREEN}Node.js: 使用系统的 ($SYS_VER)${NC}" - USE_NODE="system" - else - echo -e " ${YELLOW}Node.js: 系统版本太低 ($SYS_VER),需要 v20+${NC}" - NEED_DOWNLOAD_NODE=true - USE_NODE="download" - fi -else - echo -e " ${YELLOW}Node.js: 未安装${NC}" - NEED_DOWNLOAD_NODE=true - USE_NODE="download" -fi - -# Check OpenClaw -USB_OPENCLAW="$APP_DIR/core/node_modules/openclaw/openclaw.mjs" -if [ -f "$USB_OPENCLAW" ]; then - echo -e " ${GREEN}OpenClaw: 使用 U 盘内的${NC}" - USE_OPENCLAW="usb" -else - echo -e " ${YELLOW}OpenClaw: U 盘内未找到,需要在线下载${NC}" - NEED_DOWNLOAD_OPENCLAW=true - USE_OPENCLAW="download" -fi - -echo "" - -# ---- Step 2: Create install directory ---- -echo -e " ${BOLD}[2/4] 安装到 $INSTALL_TARGET ...${NC}" - -mkdir -p "$INSTALL_TARGET" -mkdir -p "$INSTALL_TARGET/data/.openclaw" -mkdir -p "$INSTALL_TARGET/data/memory" -mkdir -p "$INSTALL_TARGET/data/backups" - -# ---- Step 3: Copy/Download Node.js ---- -echo -e " ${BOLD}[3/4] 安装 Node.js...${NC}" - -NODE_INSTALL_DIR="$INSTALL_TARGET/runtime/$NODE_PLATFORM" - -case $USE_NODE in - usb) - echo -e " ${CYAN}从 U 盘复制 Node.js...${NC}" - mkdir -p "$NODE_INSTALL_DIR" - cp -R "$APP_DIR/runtime/$NODE_PLATFORM/"* "$NODE_INSTALL_DIR/" - chmod +x "$NODE_INSTALL_DIR/bin/node" - INSTALL_NODE="$NODE_INSTALL_DIR/bin/node" - INSTALL_NPM="$NODE_INSTALL_DIR/bin/npm" - echo -e " ${GREEN}Node.js 安装完成 ✓${NC}" - ;; - system) - INSTALL_NODE="$(which node)" - INSTALL_NPM="$(which npm)" - echo -e " ${GREEN}使用系统 Node.js ✓${NC}" - ;; - download) - echo -e " ${CYAN}从国内镜像下载 Node.js $NODE_VER...${NC}" - PLATFORM_NAME="linux-$( [ "$ARCH" = "x86_64" ] && echo "x64" || echo "arm64" )" - TARBALL="node-${NODE_VER}-${PLATFORM_NAME}.tar.gz" - URL="${NODE_MIRROR}/${NODE_VER}/${TARBALL}" - - mkdir -p "$NODE_INSTALL_DIR" - curl -# -L "$URL" -o "/tmp/$TARBALL" - tar -xzf "/tmp/$TARBALL" -C "$NODE_INSTALL_DIR" --strip-components=1 - rm -f "/tmp/$TARBALL" - chmod +x "$NODE_INSTALL_DIR/bin/node" - INSTALL_NODE="$NODE_INSTALL_DIR/bin/node" - INSTALL_NPM="$NODE_INSTALL_DIR/bin/npm" - echo -e " ${GREEN}Node.js 下载安装完成 ✓${NC}" - ;; -esac - -echo "" - -# ---- Step 4: Copy/Download OpenClaw ---- -echo -e " ${BOLD}[4/4] 安装 OpenClaw...${NC}" - -CORE_INSTALL_DIR="$INSTALL_TARGET/core" - -case $USE_OPENCLAW in - usb) - echo -e " ${CYAN}从 U 盘复制 OpenClaw + 插件...${NC}" - mkdir -p "$CORE_INSTALL_DIR" - cp -R "$APP_DIR/core/"* "$CORE_INSTALL_DIR/" - echo -e " ${GREEN}OpenClaw 安装完成 ✓${NC}" - ;; - download) - echo -e " ${CYAN}从国内镜像下载 OpenClaw...${NC}" - mkdir -p "$CORE_INSTALL_DIR" - cat > "$CORE_INSTALL_DIR/package.json" << 'PKGEOF' -{ - "name": "u-claw-core", - "version": "1.0.0", - "private": true, - "dependencies": { - "openclaw": "latest" - } -} -PKGEOF - cd "$CORE_INSTALL_DIR" - "$INSTALL_NODE" "$INSTALL_NPM" install --registry="$MIRROR" 2>&1 | tail -3 - "$INSTALL_NODE" "$INSTALL_NPM" install @sliverp/qqbot@latest --registry="$MIRROR" 2>&1 | tail -2 - echo -e " ${GREEN}OpenClaw 下载安装完成 ✓${NC}" - ;; -esac - -# ---- Default config ---- -CONFIG_PATH="$INSTALL_TARGET/data/.openclaw/openclaw.json" -if [ ! -f "$CONFIG_PATH" ]; then - cat > "$CONFIG_PATH" << 'CFGEOF' -{ - "gateway": { - "mode": "local", - "auth": { "token": "uclaw" } - } -} -CFGEOF -fi - -# ---- Copy HTML pages ---- -for f in Config.html U-Claw.html; do - [ -f "$UCLAW_DIR/$f" ] && cp "$UCLAW_DIR/$f" "$INSTALL_TARGET/" -done - -# ---- Create launch script ---- -cat > "$INSTALL_TARGET/start.sh" << 'STARTEOF' -#!/bin/bash -DIR="$(cd "$(dirname "$0")" && pwd)" -ARCH=$(uname -m) -NODE_PLATFORM="node-linux-$( [ "$ARCH" = "x86_64" ] && echo "x64" || echo "arm64" )" - -NODE_BIN="$DIR/runtime/$NODE_PLATFORM/bin/node" -[ ! -f "$NODE_BIN" ] && NODE_BIN="$(which node)" - -CORE_DIR="$DIR/core" -OPENCLAW_MJS="$CORE_DIR/node_modules/openclaw/openclaw.mjs" - -export OPENCLAW_HOME="$DIR/data" -export OPENCLAW_STATE_DIR="$DIR/data/.openclaw" -export OPENCLAW_CONFIG_PATH="$DIR/data/.openclaw/openclaw.json" - -PORT=18789 -while ss -tlnp 2>/dev/null | grep -q ":$PORT " || netstat -tlnp 2>/dev/null | grep -q ":$PORT "; do - PORT=$((PORT + 1)) - [ $PORT -gt 18799 ] && echo "No available port" && exit 1 -done - -cd "$CORE_DIR" -"$NODE_BIN" "$OPENCLAW_MJS" gateway run --allow-unconfigured --force --port $PORT & -PID=$! - -for i in $(seq 1 30); do - sleep 0.5 - if curl -s -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null; then - xdg-open "http://127.0.0.1:$PORT/#token=uclaw" 2>/dev/null || echo "Open: http://127.0.0.1:$PORT/#token=uclaw" - break - fi -done - -wait $PID -STARTEOF -chmod +x "$INSTALL_TARGET/start.sh" - -# ---- Create desktop shortcut ---- -DESKTOP_FILE="$HOME/.local/share/applications/u-claw.desktop" -mkdir -p "$HOME/.local/share/applications" -cat > "$DESKTOP_FILE" << DESKEOF -[Desktop Entry] -Name=U-Claw -Comment=Portable AI Agent -Exec=bash $INSTALL_TARGET/start.sh -Terminal=true -Type=Application -Categories=Utility; -DESKEOF - -echo "" - -# ---- Summary ---- -INSTALL_SIZE=$(du -sh "$INSTALL_TARGET" | cut -f1) - -echo -e " ${GREEN}${BOLD}╔══════════════════════════════════════╗" -echo -e " ║ ✅ 安装成功! ║" -echo -e " ╚══════════════════════════════════════╝${NC}" -echo "" -echo -e " ${BOLD}安装位置:${NC} $INSTALL_TARGET" -echo -e " ${BOLD}大小:${NC} $INSTALL_SIZE" -echo "" -echo -e " ${BOLD}启动方式:${NC}" -echo -e " 终端运行: ${CYAN}bash ~/.uclaw/start.sh${NC}" -echo -e " 或在应用菜单搜索 ${CYAN}U-Claw${NC}" -echo "" -echo -e " ${BOLD}首次使用:${NC}" -echo -e " 启动后浏览器自动打开配置页面" -echo -e " 选择 AI 模型 → 填写 API Key → 开始用" -echo "" -read -p " 按回车关闭..." diff --git a/portable/Linux-Menu.sh b/portable/Linux-Menu.sh deleted file mode 100755 index 63d24e8..0000000 --- a/portable/Linux-Menu.sh +++ /dev/null @@ -1,300 +0,0 @@ -#!/bin/bash -# U-Claw Menu - Portable AI Agent -# Linux version - -UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)" -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' -WHITE='\033[1;37m' -NC='\033[0m' -BOLD='\033[1m' -DIM='\033[2m' - -# Node.js -ARCH=$(uname -m) -if [ "$ARCH" = "x86_64" ]; then - NODE_DIR="$APP_DIR/runtime/node-linux-x64" -elif [ "$ARCH" = "aarch64" ]; then - NODE_DIR="$APP_DIR/runtime/node-linux-arm64" -else - echo -e "${RED}Unsupported architecture: $ARCH${NC}" - exit 1 -fi - -NODE_BIN="$NODE_DIR/bin/node" -NPM_BIN="$NODE_DIR/bin/npm" -export PATH="$NODE_DIR/bin:$PATH" -export OPENCLAW_HOME="$DATA_DIR" -export OPENCLAW_STATE_DIR="$STATE_DIR" -export OPENCLAW_CONFIG_PATH="$CONFIG_PATH" - -mkdir -p "$STATE_DIR" "$DATA_DIR/memory" "$DATA_DIR/backups" "$DATA_DIR/logs" - -# Load maintenance functions -source "$UCLAW_DIR/lib/maintain.sh" - -# Run openclaw command -OPENCLAW_MJS="$CORE_DIR/node_modules/openclaw/openclaw.mjs" - -run_oc() { - cd "$CORE_DIR" - "$NODE_BIN" "$OPENCLAW_MJS" "$@" -} - -# Show menu -show_menu() { - clear - local NODE_VER=$("$NODE_BIN" --version 2>/dev/null || echo "N/A") - local CFG_STATUS="${RED}未配置${NC}" - [ -f "$CONFIG_PATH" ] && CFG_STATUS="${GREEN}已配置${NC}" - - echo "" - echo -e " ${CYAN}${BOLD}╔══════════════════════════════════════╗" - echo -e " ║ U-Claw 虾盘 v1.1 ║" - echo -e " ║ Portable AI Agent (Linux) ║" - echo -e " ╚══════════════════════════════════════╝${NC}" - echo "" - echo -e " Node: ${GREEN}${NODE_VER}${NC} 配置: ${CFG_STATUS}" - echo "" - echo -e " ${WHITE}${BOLD}── 配置 ──────────────────────────────${NC}" - echo -e " ${GREEN}[1]${NC} 配置向导(选模型、填 API Key)" - echo -e " ${GREEN}[2]${NC} 打开网页控制台" - echo "" - 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 " ${GREEN}[5]${NC} 诊断修复" - echo -e " ${GREEN}[6]${NC} 备份配置" - echo -e " ${GREEN}[7]${NC} 恢复备份" - echo -e " ${GREEN}[8]${NC} 系统信息" - echo "" - echo -e " ${WHITE}${BOLD}── 高级维护 ──────────────────────────${NC}" - echo -e " ${GREEN}[9]${NC} 杀死残留进程" - echo -e " ${GREEN}[10]${NC} 查看日志" - echo -e " ${GREEN}[11]${NC} 恢复出厂设置" - echo -e " ${GREEN}[12]${NC} 卸载" - echo -e " ${GREEN}[13]${NC} 检查更新" - echo -e " ${GREEN}[14]${NC} 清理空间" - echo -e " ${GREEN}[15]${NC} 插件管理" - echo "" - echo -e " ${DIM}[0] 退出${NC}" - echo "" -} - -# [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 -} - -# [2] Web dashboard -do_dashboard() { - echo "" - echo -e " ${CYAN}启动网页控制台...${NC}" - echo "" - cd "$CORE_DIR" - - # Find free port - local PORT=18789 - while ss -tlnp 2>/dev/null | grep -q ":$PORT " || netstat -tlnp 2>/dev/null | grep -q ":$PORT "; do - PORT=$((PORT + 1)) - if [ $PORT -gt 18799 ]; then - echo -e " ${RED}端口 18789-18799 全被占用${NC}" - return - 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=$! - - for i in $(seq 1 30); do - sleep 0.5 - 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}" - xdg-open "$URL" 2>/dev/null || echo -e " ${YELLOW}请在浏览器打开: $URL${NC}" - break - fi - done - - echo " 关闭此窗口会停止服务" - wait $PID -} - -# [3] QQ Bot (pre-installed) -do_qq() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 接入 QQ 机器人 ━━━${NC}" - echo "" - 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 - - run_oc channels add --channel qqbot --token "${QQ_ID}:${QQ_SECRET}" 2>&1 || true - echo "" - 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}QQ 机器人配置完成!重启网关后生效。${NC}" -} - -# [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}━━━ 诊断修复 ━━━${NC}" - echo "" - run_oc doctor --repair 2>&1 || echo -e " ${YELLOW}诊断命令执行失败${NC}" -} - -# [6] Backup -do_backup() { - echo "" - 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 "" - echo -e " ${GREEN}备份完成: $BK${NC}" - echo " 大小: $(du -sh "$BK" | cut -f1)" -} - -# [7] Restore -do_restore() { - echo "" - 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 " 可用备份:" - local i=1 - 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 " 选择编号: " NUM - - local j=1 - 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 - echo -e " ${RED}无效选择${NC}" -} - -# [8] System info -do_sysinfo() { - echo "" - echo " 系统: $(uname -s) $(uname -r)" - echo " 发行版: $(cat /etc/os-release 2>/dev/null | grep ^PRETTY_NAME | cut -d= -f2 | tr -d '"' || echo 'Unknown')" - echo " CPU: $(uname -m) $(lscpu 2>/dev/null | grep 'Model name' | sed 's/.*:\s*//' || echo '')" - echo " 内存: $(free -h 2>/dev/null | awk '/^Mem:/{print $2}' || echo 'N/A')" - 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-15]: " CHOICE - echo "" - - case $CHOICE in - 1) do_config ;; - 2) do_dashboard ;; - 3) do_qq ;; - 4) do_platforms ;; - 5) do_doctor ;; - 6) do_backup ;; - 7) do_restore ;; - 8) do_sysinfo ;; - 9) do_kill_gateway ;; - 10) do_logs ;; - 11) do_factory_reset ;; - 12) do_uninstall ;; - 13) do_update ;; - 14) do_cleanup ;; - 15) do_plugins ;; - 0) echo -e " ${CYAN}再见!${NC}"; exit 0 ;; - *) echo -e " ${RED}无效选择${NC}" ;; - esac - - echo "" - read -p " 按回车返回..." -done diff --git a/portable/Linux-Start.sh b/portable/Linux-Start.sh deleted file mode 100755 index c5175a1..0000000 --- a/portable/Linux-Start.sh +++ /dev/null @@ -1,185 +0,0 @@ -#!/bin/bash -# ============================================================ -# U-Claw - Portable AI Agent -# Linux version - run: bash Linux-Start.sh -# ============================================================ - -UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)" -APP_DIR="$UCLAW_DIR/app" -CORE_DIR="$APP_DIR/core" -DATA_DIR="$UCLAW_DIR/data" -SYSTEM_DIR="$UCLAW_DIR/system" - -GREEN='\033[0;32m' -CYAN='\033[0;36m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' - -clear -echo "" -echo -e "${CYAN}" -echo " ╔══════════════════════════════════════╗" -echo " ║ 🦞 U-Claw v1.1 ║" -echo " ║ Portable AI Agent (Linux) ║" -echo " ╚══════════════════════════════════════╝" -echo -e "${NC}" - -# ---- 1. Detect CPU & set runtime ---- -ARCH=$(uname -m) -if [ "$ARCH" = "x86_64" ]; then - NODE_DIR="$APP_DIR/runtime/node-linux-x64" - echo -e " ${GREEN}Linux x86_64${NC}" -elif [ "$ARCH" = "aarch64" ]; then - NODE_DIR="$APP_DIR/runtime/node-linux-arm64" - echo -e " ${GREEN}Linux ARM64${NC}" -else - echo -e " ${RED}Unsupported architecture: $ARCH${NC}" - echo -e " ${RED}Only x86_64 and arm64 are supported.${NC}" - echo "" - read -p " Press Enter to exit..." - exit 1 -fi - -NODE_BIN="$NODE_DIR/bin/node" -export PATH="$NODE_DIR/bin:$PATH" - -# ---- 2. Check runtime ---- -if [ ! -f "$NODE_BIN" ]; then - echo -e " ${RED}Error: Node.js runtime not found${NC}" - echo " Expected: $NODE_BIN" - echo " Please run setup.sh first or ensure app/runtime/ is complete" - read -p " Press Enter to exit..." - exit 1 -fi - -NODE_VER=$("$NODE_BIN" --version) -echo -e " Node.js: ${GREEN}${NODE_VER}${NC}" -echo "" - -# ---- 3. Check & init data ---- -mkdir -p "$DATA_DIR/memory" "$DATA_DIR/backups" "$DATA_DIR/logs" - -if [ ! -f "$DATA_DIR/config.json" ] && [ ! -f "$DATA_DIR/.openclaw/openclaw.json" ]; then - echo -e " ${YELLOW}First run - creating default config...${NC}" - mkdir -p "$DATA_DIR/.openclaw" - cat > "$DATA_DIR/.openclaw/openclaw.json" << 'CFGEOF' -{ - "gateway": { - "mode": "local", - "auth": { "token": "uclaw" } - } -} -CFGEOF - echo -e " ${GREEN}Config created${NC}" - echo "" -fi - -# ---- 4. Set environment (portable mode) ---- -STATE_DIR="$DATA_DIR/.openclaw" -mkdir -p "$STATE_DIR" - -# Sync config to where OpenClaw expects it -if [ -f "$DATA_DIR/config.json" ] && [ ! -f "$STATE_DIR/openclaw.json" ]; then - cp "$DATA_DIR/config.json" "$STATE_DIR/openclaw.json" -fi - -export OPENCLAW_HOME="$DATA_DIR" -export OPENCLAW_STATE_DIR="$STATE_DIR" -export OPENCLAW_CONFIG_PATH="$STATE_DIR/openclaw.json" - -# ---- 5. Run migration if exists ---- -if [ -f "$SYSTEM_DIR/migrate.js" ]; then - "$NODE_BIN" "$SYSTEM_DIR/migrate.js" "$DATA_DIR" 2>/dev/null || true -fi - -# ---- 6. Check dependencies ---- -if [ ! -d "$CORE_DIR/node_modules" ]; then - echo -e " ${YELLOW}First run - installing dependencies...${NC}" - echo " (Using China mirror)" - cd "$CORE_DIR" - "$NODE_BIN" "$NODE_DIR/bin/npm" install --registry=https://registry.npmmirror.com 2>&1 - echo -e " ${GREEN}Dependencies installed${NC}" - echo "" -fi - -# ---- 7. Find available port ---- -PORT=18789 -while ss -tlnp 2>/dev/null | grep -q ":$PORT " || netstat -tlnp 2>/dev/null | grep -q ":$PORT "; do - echo -e " ${YELLOW}Port $PORT in use, trying next...${NC}" - PORT=$((PORT + 1)) - if [ $PORT -gt 18799 ]; then - echo -e " ${RED}No available port (18789-18799)${NC}" - read -p " Press Enter to exit..." - exit 1 - fi -done - -# Update config with correct port if changed -if [ $PORT -ne 18789 ]; then - "$NODE_BIN" -e " - const fs = require('fs'); - const p = '$DATA_DIR/config.json'; - if (fs.existsSync(p)) { - const c = JSON.parse(fs.readFileSync(p, 'utf8')); - c.gateway = c.gateway || {}; - c.gateway.port = $PORT; - fs.writeFileSync(p, JSON.stringify(c, null, 2)); - } - " 2>/dev/null || true -fi - -# ---- 8. Start gateway ---- -echo -e " ${CYAN}Starting OpenClaw on port $PORT...${NC}" -echo " Do NOT close this window." -echo "" - -cd "$CORE_DIR" - -TOKEN=$(python3 -c "import json,os; p='$STATE_DIR/openclaw.json' if os.path.exists('$STATE_DIR/openclaw.json') else '$DATA_DIR/config.json'; d=json.load(open(p)); print(d.get('gateway',{}).get('auth',{}).get('token','uclaw'))" 2>/dev/null || echo "uclaw") - -OPENCLAW_MJS="$CORE_DIR/node_modules/openclaw/openclaw.mjs" -GW_LOG="$DATA_DIR/logs/gateway.log" -"$NODE_BIN" "$OPENCLAW_MJS" gateway run --allow-unconfigured --force --port $PORT 2>&1 | tee -a "$GW_LOG" & -GW_PID=$! - -# ---- 9. Wait & open browser ---- -for i in $(seq 1 30); do - sleep 0.5 - if curl -s -o /dev/null -w '' "http://127.0.0.1:$PORT/" 2>/dev/null; then - DASHBOARD_URL="http://127.0.0.1:$PORT/#token=${TOKEN}" - CONFIG_PAGE="$UCLAW_DIR/Config.html?port=$PORT" - echo "" - echo -e " ${GREEN}✅ Started successfully!${NC}" - echo "" - - # Check if model is configured - HAS_MODEL=$(python3 -c " -import json,os -for p in ['$STATE_DIR/openclaw.json','$DATA_DIR/config.json']: - if os.path.exists(p): - d=json.load(open(p)) - if d.get('agent',{}).get('model'): - print('yes'); break -" 2>/dev/null) - - if [ "$HAS_MODEL" = "yes" ]; then - echo -e " ${CYAN}Dashboard: ${DASHBOARD_URL}${NC}" - echo "" - xdg-open "$DASHBOARD_URL" 2>/dev/null || echo -e " ${YELLOW}Please open in browser: ${DASHBOARD_URL}${NC}" - else - echo -e " ${YELLOW}首次使用,打开配置页面...${NC}" - echo -e " ${CYAN}配置页面: Config.html${NC}" - echo -e " ${CYAN}控制台: ${DASHBOARD_URL}${NC}" - echo "" - xdg-open "$CONFIG_PAGE" 2>/dev/null || echo -e " ${YELLOW}Please open in browser: ${CONFIG_PAGE}${NC}" - fi - break - fi -done - -wait $GW_PID - -echo "" -echo -e " ${YELLOW}OpenClaw stopped.${NC}" -read -p " Press Enter to close..." diff --git a/portable/Mac-Diagnose.command b/portable/Mac-Diagnose.command index cbddca5..a589fd8 100644 --- a/portable/Mac-Diagnose.command +++ b/portable/Mac-Diagnose.command @@ -49,15 +49,15 @@ else echo -e " ${RED}✗${NC} Node.js: NOT FOUND" fi -# 2. Check core-mac directory -echo "[2/6] Checking core-mac directory..." -CORE_DIR="$UCLAW_DIR/app/core-mac" +# 2. Check core directory +echo "[2/6] Checking core directory..." +CORE_DIR="$UCLAW_DIR/app/core" if [ -d "$CORE_DIR" ]; then - echo " [OK] core-mac directory exists" >> "$LOG_FILE" - echo -e " ${GREEN}✓${NC} core-mac: Found" + echo " [OK] core directory exists" >> "$LOG_FILE" + echo -e " ${GREEN}✓${NC} core: Found" else - echo " [ERROR] core-mac directory not found" >> "$LOG_FILE" - echo -e " ${RED}✗${NC} core-mac: NOT FOUND" + echo " [ERROR] core directory not found" >> "$LOG_FILE" + echo -e " ${RED}✗${NC} core: NOT FOUND" fi # 3. Check node_modules diff --git a/portable/Mac-Menu.command b/portable/Mac-Menu.command index 00dc772..ebfdfab 100755 --- a/portable/Mac-Menu.command +++ b/portable/Mac-Menu.command @@ -4,7 +4,7 @@ UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)" APP_DIR="$UCLAW_DIR/app" -CORE_DIR="$APP_DIR/core-mac" +CORE_DIR="$APP_DIR/core" DATA_DIR="$UCLAW_DIR/data" STATE_DIR="$DATA_DIR/.openclaw" CONFIG_PATH="$STATE_DIR/openclaw.json" @@ -18,8 +18,13 @@ NC='\033[0m' BOLD='\033[1m' DIM='\033[2m' -# Node.js (ARM64 only) -NODE_DIR="$APP_DIR/runtime/node-mac-arm64" +# Node.js — detect architecture +ARCH=$(uname -m) +if [ "$ARCH" = "arm64" ]; then + NODE_DIR="$APP_DIR/runtime/node-mac-arm64" +else + NODE_DIR="$APP_DIR/runtime/node-mac-x64" +fi NODE_BIN="$NODE_DIR/bin/node" NPM_BIN="$NODE_DIR/bin/npm" export PATH="$NODE_DIR/bin:$PATH" diff --git a/portable/Mac-Start.command b/portable/Mac-Start.command index e996841..f079c51 100755 --- a/portable/Mac-Start.command +++ b/portable/Mac-Start.command @@ -6,9 +6,13 @@ UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)" APP_DIR="$UCLAW_DIR/app" -CORE_DIR="$APP_DIR/core-mac" +CORE_DIR="$APP_DIR/core" DATA_DIR="$UCLAW_DIR/data" -SYSTEM_DIR="$UCLAW_DIR/system" + +# Migration shim: rename old core-mac to core for existing USB users +if [ -d "$APP_DIR/core-mac" ] && [ ! -d "$APP_DIR/core" ]; then + mv "$APP_DIR/core-mac" "$APP_DIR/core" +fi GREEN='\033[0;32m' CYAN='\033[0;36m' @@ -93,12 +97,7 @@ export OPENCLAW_HOME="$DATA_DIR" export OPENCLAW_STATE_DIR="$STATE_DIR" export OPENCLAW_CONFIG_PATH="$STATE_DIR/openclaw.json" -# ---- 6. Run migration if exists ---- -if [ -f "$SYSTEM_DIR/migrate.js" ]; then - "$NODE_BIN" "$SYSTEM_DIR/migrate.js" "$DATA_DIR" 2>/dev/null || true -fi - -# ---- 7. Check dependencies ---- +# ---- 6. Check dependencies ---- if [ ! -d "$CORE_DIR/node_modules" ]; then echo -e " ${YELLOW}First run - installing dependencies...${NC}" echo " (Using China mirror)" @@ -110,7 +109,7 @@ fi # OpenClaw doesn't need a separate build step when installed via npm -# ---- 8. Find available port ---- +# ---- 7. Find available port ---- PORT=18789 while lsof -i :$PORT >/dev/null 2>&1; do echo -e " ${YELLOW}Port $PORT in use, trying next...${NC}" @@ -134,7 +133,7 @@ if [ $PORT -ne 18789 ]; then " 2>/dev/null || true fi -# ---- 9. Start gateway ---- +# ---- 8. Start gateway ---- echo -e " ${CYAN}Starting OpenClaw on port $PORT...${NC}" echo " Do NOT close this window." echo "" @@ -148,7 +147,7 @@ GW_LOG="$DATA_DIR/logs/gateway.log" "$NODE_BIN" "$OPENCLAW_MJS" gateway run --allow-unconfigured --force --port $PORT 2>&1 | tee -a "$GW_LOG" & GW_PID=$! -# ---- 10. Wait & open browser ---- +# ---- 9. Wait & open browser ---- for i in $(seq 1 30); do sleep 0.5 if curl -s -o /dev/null -w '' "http://127.0.0.1:$PORT/" 2>/dev/null; then diff --git a/portable/Windows-Diagnose.bat b/portable/Windows-Diagnose.bat index 3125c2f..dd0a7c0 100644 --- a/portable/Windows-Diagnose.bat +++ b/portable/Windows-Diagnose.bat @@ -35,14 +35,14 @@ if exist "%NODE_BIN%" ( set /a ERROR_COUNT+=1 ) -REM 2. Check core-win directory +REM 2. Check core directory echo [2/6] 检查 Windows 依赖目录... -set "CORE_DIR=%UCLAW_DIR%app\core-win" +set "CORE_DIR=%UCLAW_DIR%app\core" if exist "%CORE_DIR%" ( - echo [OK] core-win directory exists >> "%LOG_FILE%" + echo [OK] core directory exists >> "%LOG_FILE%" echo ✓ Windows 依赖目录: 正常 ) else ( - echo [ERROR] core-win directory not found >> "%LOG_FILE%" + echo [ERROR] core directory not found >> "%LOG_FILE%" echo ✗ Windows 依赖目录: 缺失 set /a ERROR_COUNT+=1 ) diff --git a/portable/Windows-Menu.bat b/portable/Windows-Menu.bat index 3989bc9..8048799 100644 --- a/portable/Windows-Menu.bat +++ b/portable/Windows-Menu.bat @@ -3,7 +3,12 @@ chcp 65001 >nul 2>&1 title U-Claw Menu set "UCLAW_DIR=%~dp0" -set "CORE_DIR=%UCLAW_DIR%app\core-win" +set "APP_DIR=%UCLAW_DIR%app" + +REM Migration shim: rename old core-win to core for existing USB users +if exist "%APP_DIR%\core-win" if not exist "%APP_DIR%\core" ren "%APP_DIR%\core-win" core + +set "CORE_DIR=%APP_DIR%\core" set "DATA_DIR=%UCLAW_DIR%data" set "STATE_DIR=%DATA_DIR%\.openclaw" set "NODE_DIR=%UCLAW_DIR%app\runtime\node-win-x64" diff --git a/portable/Windows-Start.bat b/portable/Windows-Start.bat index 08e6136..99ca9ed 100644 --- a/portable/Windows-Start.bat +++ b/portable/Windows-Start.bat @@ -10,7 +10,11 @@ echo. set "UCLAW_DIR=%~dp0" set "APP_DIR=%UCLAW_DIR%app" -set "CORE_DIR=%APP_DIR%\core-win" + +REM Migration shim: rename old core-win to core for existing USB users +if exist "%APP_DIR%\core-win" if not exist "%APP_DIR%\core" ren "%APP_DIR%\core-win" core + +set "CORE_DIR=%APP_DIR%\core" set "DATA_DIR=%UCLAW_DIR%data" set "STATE_DIR=%DATA_DIR%\.openclaw" set "NODE_DIR=%APP_DIR%\runtime\node-win-x64" diff --git a/portable/lib/maintain.sh b/portable/lib/maintain.sh index a39fd38..f555c04 100644 --- a/portable/lib/maintain.sh +++ b/portable/lib/maintain.sh @@ -1,6 +1,6 @@ #!/bin/bash # ============================================================ -# U-Claw Maintenance Functions (shared by Mac & Linux menus) +# U-Claw Maintenance Functions (shared by Mac menus) # Requires caller to set: $UCLAW_DIR, $DATA_DIR, $STATE_DIR, # $CONFIG_PATH, $NODE_BIN, $NPM_BIN, $CORE_DIR, # color vars ($RED $GREEN $YELLOW $CYAN $WHITE $NC $BOLD $DIM), @@ -275,11 +275,7 @@ do_uninstall() { fi echo "" echo " Electron 桌面版卸载:" - if [ "$(uname)" = "Darwin" ]; then - echo " macOS: 将 U-Claw.app 从「应用程序」拖到废纸篓" - else - echo " Linux: sudo apt remove u-claw 或 rm ~/.local/share/applications/u-claw.desktop" - fi + echo " macOS: 将 U-Claw.app 从「应用程序」拖到废纸篓" ;; esac } diff --git a/portable/migrate.js b/portable/migrate.js deleted file mode 100644 index fbc2a85..0000000 --- a/portable/migrate.js +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env node -// U-Claw config migration script -// Runs on every startup to ensure config compatibility - -const fs = require('fs'); -const path = require('path'); - -const dataDir = process.argv[2] || path.join(__dirname, '..', 'data'); -const configPath = path.join(dataDir, 'config.json'); - -if (!fs.existsSync(configPath)) process.exit(0); - -try { - const config = JSON.parse(fs.readFileSync(configPath, 'utf8')); - - // Ensure gateway section exists - if (!config.gateway) { - config.gateway = { mode: 'local', auth: { token: 'uclaw' } }; - } - - // Ensure auth token exists - if (!config.gateway.auth || !config.gateway.auth.token) { - config.gateway.auth = { token: 'uclaw' }; - } - - // Future migrations go here: - // if (!config._version) { config._version = '1.1'; ... } - - fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); -} catch (e) { - // Don't crash on migration errors - console.error('Migration warning:', e.message); -} diff --git a/portable/setup-linux-usb.sh b/portable/setup-linux-usb.sh deleted file mode 100755 index 98c99d9..0000000 --- a/portable/setup-linux-usb.sh +++ /dev/null @@ -1,220 +0,0 @@ -#!/bin/bash -# ============================================================ -# U-Claw - Linux 启动盘 OpenClaw 安装脚本 -# 在 Linux Mint 启动盘环境中运行此脚本安装 OpenClaw -# -# 使用方法: -# 1. 用 Rufus 制作 Linux Mint 启动盘(开启 Persistent Storage) -# 2. 从 USB 启动进入 Linux Mint -# 3. 连接网络 -# 4. 打开终端,运行: bash setup-linux-usb.sh -# ============================================================ - -set -e - -GREEN='\033[0;32m' -CYAN='\033[0;36m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' -BOLD='\033[1m' - -NODE_VER="v22.14.0" -MIRROR="https://registry.npmmirror.com" -NODE_MIRROR="https://npmmirror.com/mirrors/node" - -INSTALL_DIR="$HOME/U-Claw" - -clear -echo "" -echo -e "${CYAN}${BOLD}" -echo " ╔══════════════════════════════════════╗" -echo " ║ U-Claw Linux 启动盘安装 ║" -echo " ║ 在 Live Linux 环境中安装 OpenClaw ║" -echo " ╚══════════════════════════════════════╝" -echo -e "${NC}" -echo "" - -# ---- Check network ---- -echo -e " ${BOLD}[0/4] 检查网络连接...${NC}" -if ! ping -c 1 -W 3 npmmirror.com >/dev/null 2>&1; then - echo -e " ${RED}无法连接到网络!${NC}" - echo -e " ${YELLOW}请先连接 WiFi 或插入网线,然后重新运行此脚本。${NC}" - echo "" - read -p " 按回车退出..." - exit 1 -fi -echo -e " ${GREEN}网络正常 ✓${NC}" -echo "" - -# ---- Check CPU ---- -ARCH=$(uname -m) -if [ "$ARCH" = "x86_64" ]; then - NODE_PLATFORM="linux-x64" - NODE_DIR_NAME="node-linux-x64" - echo -e " ${GREEN}架构: x86_64 ✓${NC}" -elif [ "$ARCH" = "aarch64" ]; then - NODE_PLATFORM="linux-arm64" - NODE_DIR_NAME="node-linux-arm64" - echo -e " ${GREEN}架构: ARM64 ✓${NC}" -else - echo -e " ${RED}不支持的架构: $ARCH${NC}" - exit 1 -fi -echo "" - -# ---- Step 1: Install Node.js ---- -echo -e " ${BOLD}[1/4] 安装 Node.js $NODE_VER...${NC}" - -NODE_INSTALL_DIR="$INSTALL_DIR/runtime/$NODE_DIR_NAME" - -if [ -f "$NODE_INSTALL_DIR/bin/node" ]; then - echo -e " ${GREEN}Node.js 已存在,跳过${NC}" -else - TARBALL="node-${NODE_VER}-${NODE_PLATFORM}.tar.gz" - URL="${NODE_MIRROR}/${NODE_VER}/${TARBALL}" - - echo -e " ${CYAN}下载: $URL${NC}" - mkdir -p "$NODE_INSTALL_DIR" - curl -# -L "$URL" -o "/tmp/$TARBALL" - tar -xzf "/tmp/$TARBALL" -C "$NODE_INSTALL_DIR" --strip-components=1 - rm -f "/tmp/$TARBALL" - chmod +x "$NODE_INSTALL_DIR/bin/node" - echo -e " ${GREEN}Node.js 安装完成 ✓${NC}" -fi - -NODE_BIN="$NODE_INSTALL_DIR/bin/node" -NPM_BIN="$NODE_INSTALL_DIR/bin/npm" -export PATH="$NODE_INSTALL_DIR/bin:$PATH" - -echo -e " 版本: $("$NODE_BIN" --version)" -echo "" - -# ---- Step 2: Install OpenClaw ---- -echo -e " ${BOLD}[2/4] 安装 OpenClaw...${NC}" - -CORE_DIR="$INSTALL_DIR/core" -mkdir -p "$CORE_DIR" - -cat > "$CORE_DIR/package.json" << 'PKGEOF' -{ - "name": "u-claw-core", - "version": "1.0.0", - "private": true, - "dependencies": { - "openclaw": "latest" - } -} -PKGEOF - -cd "$CORE_DIR" -echo -e " ${CYAN}从国内镜像下载 OpenClaw...${NC}" -"$NODE_BIN" "$NPM_BIN" install --registry="$MIRROR" 2>&1 | tail -5 -echo -e " ${CYAN}安装 QQ 插件...${NC}" -"$NODE_BIN" "$NPM_BIN" install @sliverp/qqbot@latest --registry="$MIRROR" 2>&1 | tail -2 -echo -e " ${GREEN}OpenClaw 安装完成 ✓${NC}" -echo "" - -# ---- Step 3: Create config & launch script ---- -echo -e " ${BOLD}[3/4] 创建配置和启动脚本...${NC}" - -# Default config -mkdir -p "$INSTALL_DIR/data/.openclaw" -mkdir -p "$INSTALL_DIR/data/memory" -mkdir -p "$INSTALL_DIR/data/backups" - -CONFIG_PATH="$INSTALL_DIR/data/.openclaw/openclaw.json" -if [ ! -f "$CONFIG_PATH" ]; then - cat > "$CONFIG_PATH" << 'CFGEOF' -{ - "gateway": { - "mode": "local", - "auth": { "token": "uclaw" } - } -} -CFGEOF -fi - -# Launch script -cat > "$INSTALL_DIR/start.sh" << STARTEOF -#!/bin/bash -DIR="$INSTALL_DIR" -NODE_BIN="$NODE_BIN" -CORE_DIR="\$DIR/core" -OPENCLAW_MJS="\$CORE_DIR/node_modules/openclaw/openclaw.mjs" - -export OPENCLAW_HOME="\$DIR/data" -export OPENCLAW_STATE_DIR="\$DIR/data/.openclaw" -export OPENCLAW_CONFIG_PATH="\$DIR/data/.openclaw/openclaw.json" - -PORT=18789 -while ss -tlnp 2>/dev/null | grep -q ":\$PORT " || netstat -tlnp 2>/dev/null | grep -q ":\$PORT "; do - PORT=\$((PORT + 1)) - [ \$PORT -gt 18799 ] && echo "No available port" && exit 1 -done - -echo "Starting OpenClaw on port \$PORT..." -cd "\$CORE_DIR" -"\$NODE_BIN" "\$OPENCLAW_MJS" gateway run --allow-unconfigured --force --port \$PORT & -PID=\$! - -for i in \$(seq 1 30); do - sleep 0.5 - if curl -s -o /dev/null "http://127.0.0.1:\$PORT/" 2>/dev/null; then - xdg-open "http://127.0.0.1:\$PORT/#token=uclaw" 2>/dev/null || echo "Open: http://127.0.0.1:\$PORT/#token=uclaw" - break - fi -done - -wait \$PID -STARTEOF -chmod +x "$INSTALL_DIR/start.sh" - -echo -e " ${GREEN}启动脚本已创建 ✓${NC}" -echo "" - -# ---- Step 4: Create desktop shortcut ---- -echo -e " ${BOLD}[4/4] 创建桌面快捷方式...${NC}" - -DESKTOP_FILE="$HOME/Desktop/U-Claw.desktop" -cat > "$DESKTOP_FILE" << DESKEOF -[Desktop Entry] -Name=U-Claw AI 助手 -Comment=Portable AI Agent powered by OpenClaw -Exec=bash $INSTALL_DIR/start.sh -Terminal=true -Type=Application -Categories=Utility; -DESKEOF -chmod +x "$DESKTOP_FILE" - -# Also add to applications menu -mkdir -p "$HOME/.local/share/applications" -cp "$DESKTOP_FILE" "$HOME/.local/share/applications/u-claw.desktop" - -echo -e " ${GREEN}桌面快捷方式已创建 ✓${NC}" -echo "" - -# ---- Summary ---- -INSTALL_SIZE=$(du -sh "$INSTALL_DIR" | cut -f1) - -echo -e " ${GREEN}${BOLD}╔══════════════════════════════════════╗" -echo -e " ║ ✅ 安装成功! ║" -echo -e " ╚══════════════════════════════════════╝${NC}" -echo "" -echo -e " ${BOLD}安装位置:${NC} $INSTALL_DIR" -echo -e " ${BOLD}大小:${NC} $INSTALL_SIZE" -echo "" -echo -e " ${BOLD}启动方式:${NC}" -echo -e " 双击桌面的 ${CYAN}U-Claw AI 助手${NC} 图标" -echo -e " 或终端运行: ${CYAN}bash ~/U-Claw/start.sh${NC}" -echo "" -echo -e " ${BOLD}首次使用:${NC}" -echo -e " 启动后浏览器自动打开 → 选择 AI 模型 → 填写 API Key" -echo "" -echo -e " ${YELLOW}${BOLD}⚠️ 持久化提醒:${NC}" -echo -e " ${YELLOW}如果你用 Rufus 制作启动盘时开启了 Persistent Storage,${NC}" -echo -e " ${YELLOW}上述安装和配置在重启后仍然保留。${NC}" -echo -e " ${YELLOW}如果没有开启持久化,重启后需要重新运行此脚本。${NC}" -echo "" -read -p " 按回车关闭..." diff --git a/portable/setup.sh b/portable/setup.sh index fef4d6b..935c783 100755 --- a/portable/setup.sh +++ b/portable/setup.sh @@ -9,11 +9,13 @@ set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" APP_DIR="$SCRIPT_DIR/app" -CORE_DIR="$APP_DIR/core-mac" +CORE_DIR="$APP_DIR/core" RUNTIME_DIR="$APP_DIR/runtime" MIRROR="https://registry.npmmirror.com" NODE_MIRROR="https://npmmirror.com/mirrors/node" NODE_VERSION="v22.14.0" +ALL_PLATFORMS=false +[ "$1" = "--all-platforms" ] && ALL_PLATFORMS=true GREEN='\033[0;32m' CYAN='\033[0;36m' @@ -38,11 +40,8 @@ if [ "$OS" = "Darwin" ]; then PLATFORM="darwin-x64" NODE_DIR_NAME="node-mac-x64" fi -elif [ "$OS" = "Linux" ]; then - PLATFORM="linux-x64" - NODE_DIR_NAME="node-linux-x64" else - echo -e "${RED}请在 Mac 或 Linux 上运行此脚本。Windows 请用 setup.bat${NC}" + echo -e "${RED}请在 Mac 上运行此脚本。Windows 请用 setup.bat${NC}" exit 1 fi @@ -71,35 +70,35 @@ else fi fi -# ---- 1b. Download Node.js for Windows (Cross-platform support) ---- -WIN_NODE_TARGET="$RUNTIME_DIR/node-win-x64" -if [ -f "$WIN_NODE_TARGET/node.exe" ]; then - echo -e " ${GREEN}✓${NC} Node.js (win-x64) 已存在,跳过下载" -else - echo -e " ${CYAN}↓${NC} 下载 Node.js $NODE_VERSION (win-x64) - Windows支持..." - mkdir -p "$WIN_NODE_TARGET" - - WIN_NODE_URL="$NODE_MIRROR/$NODE_VERSION/node-$NODE_VERSION-win-x64.zip" - echo " $WIN_NODE_URL" - - # Download zip file to temp, extract, then move - TMP_ZIP="/tmp/node-win-x64-$$.zip" - curl -fSL "$WIN_NODE_URL" -o "$TMP_ZIP" - - # Use unzip if available, otherwise try native tools - if command -v unzip >/dev/null 2>&1; then - unzip -q "$TMP_ZIP" -d "/tmp/node-win-extract-$$" - cp -r "/tmp/node-win-extract-$$"/node-$NODE_VERSION-win-x64/* "$WIN_NODE_TARGET/" - rm -rf "/tmp/node-win-extract-$$" - else - echo -e " ${RED}✗ unzip not found, skipping Windows runtime${NC}" - fi - rm -f "$TMP_ZIP" - +# ---- 1b. Download Node.js for Windows (only with --all-platforms) ---- +if [ "$ALL_PLATFORMS" = "true" ]; then + WIN_NODE_TARGET="$RUNTIME_DIR/node-win-x64" if [ -f "$WIN_NODE_TARGET/node.exe" ]; then - echo -e " ${GREEN}✓${NC} Node.js (win-x64) 下载完成" + echo -e " ${GREEN}✓${NC} Node.js (win-x64) 已存在,跳过下载" else - echo -e " ${CYAN}⚠${NC} Windows runtime下载失败 (不影响当前平台使用)" + echo -e " ${CYAN}↓${NC} 下载 Node.js $NODE_VERSION (win-x64) - Windows支持..." + mkdir -p "$WIN_NODE_TARGET" + + WIN_NODE_URL="$NODE_MIRROR/$NODE_VERSION/node-$NODE_VERSION-win-x64.zip" + echo " $WIN_NODE_URL" + + TMP_ZIP="/tmp/node-win-x64-$$.zip" + curl -fSL "$WIN_NODE_URL" -o "$TMP_ZIP" + + if command -v unzip >/dev/null 2>&1; then + unzip -q "$TMP_ZIP" -d "/tmp/node-win-extract-$$" + cp -r "/tmp/node-win-extract-$$"/node-$NODE_VERSION-win-x64/* "$WIN_NODE_TARGET/" + rm -rf "/tmp/node-win-extract-$$" + else + echo -e " ${RED}✗ unzip not found, skipping Windows runtime${NC}" + fi + rm -f "$TMP_ZIP" + + if [ -f "$WIN_NODE_TARGET/node.exe" ]; then + echo -e " ${GREEN}✓${NC} Node.js (win-x64) 下载完成" + else + echo -e " ${CYAN}⚠${NC} Windows runtime下载失败 (不影响当前平台使用)" + fi fi fi @@ -173,4 +172,6 @@ echo -e " 目录结构:" echo -e " app/core/ ← OpenClaw + 依赖" echo -e " app/runtime/ ← Node.js $NODE_VERSION" echo -e " data/ ← 运行后自动生成" +echo "" +echo -e " ${CYAN}提示: 制作跨平台 U 盘请用 bash setup.sh --all-platforms${NC}" echo -e "${GREEN}════════════════════════════════════════${NC}" diff --git a/usb-scripts/Mac-Install.command b/usb-scripts/Mac-Install.command deleted file mode 100755 index 1f1ad0a..0000000 --- a/usb-scripts/Mac-Install.command +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -# U-Claw - Extract and Launch (macOS) - -GREEN='\033[0;32m' -CYAN='\033[0;36m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' - -clear -echo "" -echo -e "${CYAN}" -echo " ╔══════════════════════════════════════╗" -echo " ║ U-Claw 虾盘 v1.1 ║" -echo " ║ 一键解压并启动 (macOS) ║" -echo " ╚══════════════════════════════════════╝" -echo -e "${NC}" - -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 "$SCRIPT_DIR" 2>/dev/null || true - -# 检查压缩包 -if [ ! -f "$ARCHIVE" ]; then - echo -e " ${RED}错误: 找不到 U-Claw.tar.gz${NC}" - echo " 请确保此脚本和压缩包在同一目录" - read -p " 按回车键退出..." - exit 1 -fi - -# 检查是否已解压 -if [ -d "$INSTALL_DIR/app/core/node_modules" ]; then - echo -e " ${GREEN}检测到已解压的 U-Claw${NC}" - echo " 位置: $INSTALL_DIR" - echo "" - echo -e " ${YELLOW}[1] 直接启动(跳过解压)${NC}" - echo " [2] 重新解压(覆盖现有)" - echo "" - read -p " 请选择 [1/2,默认1]: " choice - choice="${choice:-1}" - if [ "$choice" = "2" ]; then - echo "" - echo -e " ${YELLOW}正在重新解压...${NC}" - rm -rf "$INSTALL_DIR" - else - echo "" - echo -e " ${CYAN}跳过解压,直接启动...${NC}" - fi -fi - -# 解压(如果需要) -if [ ! -d "$INSTALL_DIR/app/core/node_modules" ]; then - echo "" - echo -e " ${CYAN}正在解压 U-Claw ...${NC}" - echo " 解压到: $INSTALL_DIR" - echo "" - - # 检测是否在 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 - echo -e " ${RED}解压失败!${NC}" - read -p " 按回车键退出..." - exit 1 - fi - - # 解压后移除隔离标记 - xattr -rd com.apple.quarantine "$INSTALL_DIR" 2>/dev/null || true - - echo -e " ${GREEN}解压完成!${NC}" - echo "" -fi - -# 启动 -echo -e " ${CYAN}正在启动 OpenClaw...${NC}" -echo "" - -cd "$INSTALL_DIR" -exec bash "$INSTALL_DIR/Mac-Start.command" diff --git a/usb-scripts/README.txt b/usb-scripts/README.txt deleted file mode 100644 index 212185d..0000000 --- a/usb-scripts/README.txt +++ /dev/null @@ -1,51 +0,0 @@ -======================================== - 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/usb-scripts/Windows-Install.bat b/usb-scripts/Windows-Install.bat deleted file mode 100644 index 9d6f12b..0000000 --- a/usb-scripts/Windows-Install.bat +++ /dev/null @@ -1,74 +0,0 @@ -@echo off -chcp 65001 >nul 2>&1 -title U-Claw - Extract and Launch - -echo. -echo ======================================== -echo U-Claw v1.1 -echo Extract and Launch (Windows) -echo ======================================== -echo. - -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%" ( - echo [ERROR] U-Claw.tar.gz not found - echo Please ensure this script and the archive are in the same directory - echo. - pause - exit /b 1 -) - -REM Check if already extracted -if exist "%INSTALL_DIR%\app\core\node_modules" ( - echo U-Claw already extracted at: %INSTALL_DIR% - echo. - echo [1] Launch directly (skip extract) - echo [2] Re-extract (overwrite) - echo. - set /p choice=" Choose [1/2, default 1]: " - if "%choice%"=="2" ( - echo. - echo Re-extracting... - rmdir /s /q "%INSTALL_DIR%" >nul 2>&1 - ) else ( - echo. - echo Launching... - goto :start - ) -) - -REM Extract -echo. -echo Extracting U-Claw to: %INSTALL_DIR% -echo This may take a few minutes... -echo. - -where tar >nul 2>&1 -if %errorlevel%==0 ( - cd /d "%SCRIPT_DIR%" - tar xzf "%ARCHIVE%" - if %errorlevel% neq 0 ( - echo Extract failed! Please extract U-Claw.tar.gz manually - pause - exit /b 1 - ) -) else ( - echo tar not available. Please extract U-Claw.tar.gz manually - echo using 7-Zip or WinRAR to this directory. - pause - exit /b 1 -) - -echo Extract complete! -echo. - -:start -echo Starting OpenClaw... -echo. - -cd /d "%INSTALL_DIR%" -call "%INSTALL_DIR%\Windows-Start.bat" \ No newline at end of file