cleanup: remove Linux scripts, unify core dir, fix Intel Mac bug
- 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
This commit is contained in:
@@ -88,7 +88,6 @@ Release artifacts go to GitHub Releases, not the repo.
|
|||||||
## Platform Support Status
|
## Platform Support Status
|
||||||
|
|
||||||
- Mac Apple Silicon (ARM64): ✅ Working
|
- 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)
|
- Mac Intel (x64): ✅ Working(portable 需先运行 setup.sh 下载 node-mac-x64)
|
||||||
|
- Windows x64: 🚧 In development
|
||||||
|
- Linux: 不提供脚本,后续只提供教程
|
||||||
|
|||||||
120
README.md
120
README.md
@@ -19,15 +19,6 @@
|
|||||||
|
|
||||||
代码库本身就是 U 盘的文件骨架,运行 `setup.sh` 补齐大依赖后,整个 `portable/` 目录直接拷贝到 U 盘即可。
|
代码库本身就是 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 盘
|
### 快速开始:制作便携版 U 盘
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -44,34 +35,14 @@ cp -R portable/ /Volumes/你的U盘/U-Claw/ # Mac
|
|||||||
|
|
||||||
**完成!** 插上 U 盘,双击启动脚本就能用。
|
**完成!** 插上 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 盘功能一览
|
### U 盘功能一览
|
||||||
|
|
||||||
| 功能 | Mac | Windows | Linux |
|
| 功能 | Mac | Windows |
|
||||||
|------|-----|---------|-------|
|
|------|-----|---------|
|
||||||
| **免安装运行** | `Mac-Start.command` | `Windows-Start.bat` | `bash Linux-Start.sh` |
|
| **免安装运行** | `Mac-Start.command` | `Windows-Start.bat` |
|
||||||
| **功能菜单** | `Mac-Menu.command` | `Windows-Menu.bat` | `bash Linux-Menu.sh` |
|
| **功能菜单** | `Mac-Menu.command` | `Windows-Menu.bat` |
|
||||||
| **安装到电脑** | `Mac-Install.command` | `Windows-Install.bat` | `bash Linux-Install.sh` |
|
| **安装到电脑** | `Mac-Install.command` | `Windows-Install.bat` |
|
||||||
| **首次配置** | `Config.html` | `Config.html` | `Config.html` |
|
| **首次配置** | `Config.html` | `Config.html` |
|
||||||
|
|
||||||
### U 盘文件结构
|
### U 盘文件结构
|
||||||
|
|
||||||
@@ -83,18 +54,14 @@ U-Claw/ ← 整个拷到 U 盘
|
|||||||
├── Windows-Start.bat Windows 免安装运行
|
├── Windows-Start.bat Windows 免安装运行
|
||||||
├── Windows-Menu.bat Windows 功能菜单
|
├── Windows-Menu.bat Windows 功能菜单
|
||||||
├── Windows-Install.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 首次配置页面
|
├── Config.html 首次配置页面
|
||||||
├── setup.sh 补齐依赖(开发者用)
|
├── setup.sh 补齐依赖(开发者用)
|
||||||
├── app/ ← 大依赖(setup.sh 下载,不进 git)
|
├── app/ ← 大依赖(setup.sh 下载,不进 git)
|
||||||
│ ├── core/ OpenClaw + QQ 插件
|
│ ├── core/ OpenClaw + QQ 插件
|
||||||
│ └── runtime/
|
│ └── runtime/
|
||||||
│ ├── node-mac-arm64/ Mac Apple Silicon
|
│ ├── node-mac-arm64/ Mac Apple Silicon
|
||||||
│ ├── node-win-x64/ Windows 64-bit
|
│ ├── node-mac-x64/ Mac Intel
|
||||||
│ └── node-linux-x64/ Linux x86_64
|
│ └── node-win-x64/ Windows 64-bit
|
||||||
└── data/ ← 用户数据(不进 git)
|
└── data/ ← 用户数据(不进 git)
|
||||||
├── .openclaw/ 配置文件
|
├── .openclaw/ 配置文件
|
||||||
├── memory/ AI 记忆
|
├── memory/ AI 记忆
|
||||||
@@ -155,7 +122,6 @@ npm run build:win # 打包 → release/*.exe
|
|||||||
git clone https://github.com/dongsheng123132/u-claw.git
|
git clone https://github.com/dongsheng123132/u-claw.git
|
||||||
cd u-claw/portable && bash setup.sh
|
cd u-claw/portable && bash setup.sh
|
||||||
bash Mac-Start.command # Mac 测试
|
bash Mac-Start.command # Mac 测试
|
||||||
bash Linux-Start.sh # Linux 测试
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**平台支持:**
|
**平台支持:**
|
||||||
@@ -163,12 +129,10 @@ bash Linux-Start.sh # Linux 测试
|
|||||||
| 平台 | 状态 |
|
| 平台 | 状态 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| Mac Apple Silicon (M1-M4) | ✅ |
|
| Mac Apple Silicon (M1-M4) | ✅ |
|
||||||
| Linux x86_64 | ✅ |
|
| Mac Intel (x64) | ✅ |
|
||||||
| Linux ARM64 | ✅ |
|
|
||||||
| Windows x64 | 🚧 开发中 |
|
| Windows x64 | 🚧 开发中 |
|
||||||
| Mac Intel | ❌ 暂不支持 |
|
|
||||||
|
|
||||||
欢迎 PR!特别需要:Windows 脚本完善、新平台支持、教程翻译。
|
欢迎 PR!特别需要:Windows 脚本完善、教程翻译。
|
||||||
|
|
||||||
### FAQ
|
### FAQ
|
||||||
|
|
||||||
@@ -176,7 +140,7 @@ bash Linux-Start.sh # Linux 测试
|
|||||||
不需要。安装和运行全程使用国内镜像,国产模型 API 直连。
|
不需要。安装和运行全程使用国内镜像,国产模型 API 直连。
|
||||||
|
|
||||||
**Q: U 盘需要多大?**
|
**Q: U 盘需要多大?**
|
||||||
便携版 4GB+(完整约 2.3GB)。Linux 启动盘 64GB+ USB 3.0。
|
4GB+(完整约 2.3GB)。
|
||||||
|
|
||||||
**Q: 能分发吗?**
|
**Q: 能分发吗?**
|
||||||
MIT 协议,随便复制分发。
|
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.
|
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
|
### Quick Start: Build a Portable USB
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -222,62 +177,38 @@ cd u-claw/portable && bash setup.sh
|
|||||||
|
|
||||||
# 3. Copy to USB drive
|
# 3. Copy to USB drive
|
||||||
cp -R portable/ /Volumes/YOUR_USB/U-Claw/ # Mac
|
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.
|
**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
|
### USB Features
|
||||||
|
|
||||||
| Feature | Mac | Windows | Linux |
|
| Feature | Mac | Windows |
|
||||||
|---------|-----|---------|-------|
|
|---------|-----|---------|
|
||||||
| **Run (no install)** | `Mac-Start.command` | `Windows-Start.bat` | `bash Linux-Start.sh` |
|
| **Run (no install)** | `Mac-Start.command` | `Windows-Start.bat` |
|
||||||
| **Menu** | `Mac-Menu.command` | `Windows-Menu.bat` | `bash Linux-Menu.sh` |
|
| **Menu** | `Mac-Menu.command` | `Windows-Menu.bat` |
|
||||||
| **Install to PC** | `Mac-Install.command` | `Windows-Install.bat` | `bash Linux-Install.sh` |
|
| **Install to PC** | `Mac-Install.command` | `Windows-Install.bat` |
|
||||||
| **First-time config** | `Config.html` | `Config.html` | `Config.html` |
|
| **First-time config** | `Config.html` | `Config.html` |
|
||||||
|
|
||||||
### File Structure
|
### File Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
U-Claw/ ← Copy entire folder to USB
|
U-Claw/ ← Copy entire folder to USB
|
||||||
├── Mac-Start.command Mac launcher
|
├── Mac-Start.command Mac launcher
|
||||||
├── Mac-Menu.command Mac menu (8 options)
|
├── Mac-Menu.command Mac menu
|
||||||
├── Mac-Install.command Install to Mac
|
├── Mac-Install.command Install to Mac
|
||||||
├── Windows-Start.bat Windows launcher
|
├── Windows-Start.bat Windows launcher
|
||||||
├── Windows-Menu.bat Windows menu
|
├── Windows-Menu.bat Windows menu
|
||||||
├── Windows-Install.bat Install to Windows
|
├── 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
|
├── Config.html First-time config page
|
||||||
├── setup.sh Download dependencies (dev use)
|
├── setup.sh Download dependencies (dev use)
|
||||||
├── app/ ← Large deps (downloaded by setup.sh, not in git)
|
├── app/ ← Large deps (downloaded by setup.sh, not in git)
|
||||||
│ ├── core/ OpenClaw + QQ plugin
|
│ ├── core/ OpenClaw + QQ plugin
|
||||||
│ └── runtime/
|
│ └── runtime/
|
||||||
│ ├── node-mac-arm64/ Mac Apple Silicon
|
│ ├── node-mac-arm64/ Mac Apple Silicon
|
||||||
│ ├── node-win-x64/ Windows 64-bit
|
│ ├── node-mac-x64/ Mac Intel
|
||||||
│ └── node-linux-x64/ Linux x86_64
|
│ └── node-win-x64/ Windows 64-bit
|
||||||
└── data/ ← User data (not in git)
|
└── data/ ← User data (not in git)
|
||||||
├── .openclaw/ Config file
|
├── .openclaw/ Config file
|
||||||
├── memory/ AI memory
|
├── 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
|
git clone https://github.com/dongsheng123132/u-claw.git
|
||||||
cd u-claw/portable && bash setup.sh
|
cd u-claw/portable && bash setup.sh
|
||||||
bash Mac-Start.command # Test on Mac
|
bash Mac-Start.command # Test on Mac
|
||||||
bash Linux-Start.sh # Test on Linux
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**Platform Support:**
|
**Platform Support:**
|
||||||
@@ -344,12 +274,10 @@ bash Linux-Start.sh # Test on Linux
|
|||||||
| Platform | Status |
|
| Platform | Status |
|
||||||
|----------|--------|
|
|----------|--------|
|
||||||
| Mac Apple Silicon (M1-M4) | ✅ |
|
| Mac Apple Silicon (M1-M4) | ✅ |
|
||||||
| Linux x86_64 | ✅ |
|
| Mac Intel (x64) | ✅ |
|
||||||
| Linux ARM64 | ✅ |
|
|
||||||
| Windows x64 | 🚧 In progress |
|
| Windows x64 | 🚧 In progress |
|
||||||
| Mac Intel | ❌ Not yet |
|
|
||||||
|
|
||||||
PRs welcome! Especially: Windows scripts, new platform support, documentation.
|
PRs welcome! Especially: Windows scripts, documentation.
|
||||||
|
|
||||||
### FAQ
|
### 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.
|
No. All downloads use China mirrors. Chinese AI model APIs work directly.
|
||||||
|
|
||||||
**Q: How big should the USB drive be?**
|
**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?**
|
**Q: Can I redistribute?**
|
||||||
MIT license — copy and share freely.
|
MIT license — copy and share freely.
|
||||||
|
|||||||
@@ -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 " 按回车关闭..."
|
|
||||||
@@ -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
|
|
||||||
@@ -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..."
|
|
||||||
@@ -49,15 +49,15 @@ else
|
|||||||
echo -e " ${RED}✗${NC} Node.js: NOT FOUND"
|
echo -e " ${RED}✗${NC} Node.js: NOT FOUND"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2. Check core-mac directory
|
# 2. Check core directory
|
||||||
echo "[2/6] Checking core-mac directory..."
|
echo "[2/6] Checking core directory..."
|
||||||
CORE_DIR="$UCLAW_DIR/app/core-mac"
|
CORE_DIR="$UCLAW_DIR/app/core"
|
||||||
if [ -d "$CORE_DIR" ]; then
|
if [ -d "$CORE_DIR" ]; then
|
||||||
echo " [OK] core-mac directory exists" >> "$LOG_FILE"
|
echo " [OK] core directory exists" >> "$LOG_FILE"
|
||||||
echo -e " ${GREEN}✓${NC} core-mac: Found"
|
echo -e " ${GREEN}✓${NC} core: Found"
|
||||||
else
|
else
|
||||||
echo " [ERROR] core-mac directory not found" >> "$LOG_FILE"
|
echo " [ERROR] core directory not found" >> "$LOG_FILE"
|
||||||
echo -e " ${RED}✗${NC} core-mac: NOT FOUND"
|
echo -e " ${RED}✗${NC} core: NOT FOUND"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 3. Check node_modules
|
# 3. Check node_modules
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
APP_DIR="$UCLAW_DIR/app"
|
APP_DIR="$UCLAW_DIR/app"
|
||||||
CORE_DIR="$APP_DIR/core-mac"
|
CORE_DIR="$APP_DIR/core"
|
||||||
DATA_DIR="$UCLAW_DIR/data"
|
DATA_DIR="$UCLAW_DIR/data"
|
||||||
STATE_DIR="$DATA_DIR/.openclaw"
|
STATE_DIR="$DATA_DIR/.openclaw"
|
||||||
CONFIG_PATH="$STATE_DIR/openclaw.json"
|
CONFIG_PATH="$STATE_DIR/openclaw.json"
|
||||||
@@ -18,8 +18,13 @@ NC='\033[0m'
|
|||||||
BOLD='\033[1m'
|
BOLD='\033[1m'
|
||||||
DIM='\033[2m'
|
DIM='\033[2m'
|
||||||
|
|
||||||
# Node.js (ARM64 only)
|
# Node.js — detect architecture
|
||||||
|
ARCH=$(uname -m)
|
||||||
|
if [ "$ARCH" = "arm64" ]; then
|
||||||
NODE_DIR="$APP_DIR/runtime/node-mac-arm64"
|
NODE_DIR="$APP_DIR/runtime/node-mac-arm64"
|
||||||
|
else
|
||||||
|
NODE_DIR="$APP_DIR/runtime/node-mac-x64"
|
||||||
|
fi
|
||||||
NODE_BIN="$NODE_DIR/bin/node"
|
NODE_BIN="$NODE_DIR/bin/node"
|
||||||
NPM_BIN="$NODE_DIR/bin/npm"
|
NPM_BIN="$NODE_DIR/bin/npm"
|
||||||
export PATH="$NODE_DIR/bin:$PATH"
|
export PATH="$NODE_DIR/bin:$PATH"
|
||||||
|
|||||||
@@ -6,9 +6,13 @@
|
|||||||
|
|
||||||
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
APP_DIR="$UCLAW_DIR/app"
|
APP_DIR="$UCLAW_DIR/app"
|
||||||
CORE_DIR="$APP_DIR/core-mac"
|
CORE_DIR="$APP_DIR/core"
|
||||||
DATA_DIR="$UCLAW_DIR/data"
|
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'
|
GREEN='\033[0;32m'
|
||||||
CYAN='\033[0;36m'
|
CYAN='\033[0;36m'
|
||||||
@@ -93,12 +97,7 @@ export OPENCLAW_HOME="$DATA_DIR"
|
|||||||
export OPENCLAW_STATE_DIR="$STATE_DIR"
|
export OPENCLAW_STATE_DIR="$STATE_DIR"
|
||||||
export OPENCLAW_CONFIG_PATH="$STATE_DIR/openclaw.json"
|
export OPENCLAW_CONFIG_PATH="$STATE_DIR/openclaw.json"
|
||||||
|
|
||||||
# ---- 6. Run migration if exists ----
|
# ---- 6. Check dependencies ----
|
||||||
if [ -f "$SYSTEM_DIR/migrate.js" ]; then
|
|
||||||
"$NODE_BIN" "$SYSTEM_DIR/migrate.js" "$DATA_DIR" 2>/dev/null || true
|
|
||||||
fi
|
|
||||||
|
|
||||||
# ---- 7. Check dependencies ----
|
|
||||||
if [ ! -d "$CORE_DIR/node_modules" ]; then
|
if [ ! -d "$CORE_DIR/node_modules" ]; then
|
||||||
echo -e " ${YELLOW}First run - installing dependencies...${NC}"
|
echo -e " ${YELLOW}First run - installing dependencies...${NC}"
|
||||||
echo " (Using China mirror)"
|
echo " (Using China mirror)"
|
||||||
@@ -110,7 +109,7 @@ fi
|
|||||||
|
|
||||||
# OpenClaw doesn't need a separate build step when installed via npm
|
# OpenClaw doesn't need a separate build step when installed via npm
|
||||||
|
|
||||||
# ---- 8. Find available port ----
|
# ---- 7. Find available port ----
|
||||||
PORT=18789
|
PORT=18789
|
||||||
while lsof -i :$PORT >/dev/null 2>&1; do
|
while lsof -i :$PORT >/dev/null 2>&1; do
|
||||||
echo -e " ${YELLOW}Port $PORT in use, trying next...${NC}"
|
echo -e " ${YELLOW}Port $PORT in use, trying next...${NC}"
|
||||||
@@ -134,7 +133,7 @@ if [ $PORT -ne 18789 ]; then
|
|||||||
" 2>/dev/null || true
|
" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ---- 9. Start gateway ----
|
# ---- 8. Start gateway ----
|
||||||
echo -e " ${CYAN}Starting OpenClaw on port $PORT...${NC}"
|
echo -e " ${CYAN}Starting OpenClaw on port $PORT...${NC}"
|
||||||
echo " Do NOT close this window."
|
echo " Do NOT close this window."
|
||||||
echo ""
|
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" &
|
"$NODE_BIN" "$OPENCLAW_MJS" gateway run --allow-unconfigured --force --port $PORT 2>&1 | tee -a "$GW_LOG" &
|
||||||
GW_PID=$!
|
GW_PID=$!
|
||||||
|
|
||||||
# ---- 10. Wait & open browser ----
|
# ---- 9. Wait & open browser ----
|
||||||
for i in $(seq 1 30); do
|
for i in $(seq 1 30); do
|
||||||
sleep 0.5
|
sleep 0.5
|
||||||
if curl -s -o /dev/null -w '' "http://127.0.0.1:$PORT/" 2>/dev/null; then
|
if curl -s -o /dev/null -w '' "http://127.0.0.1:$PORT/" 2>/dev/null; then
|
||||||
|
|||||||
@@ -35,14 +35,14 @@ if exist "%NODE_BIN%" (
|
|||||||
set /a ERROR_COUNT+=1
|
set /a ERROR_COUNT+=1
|
||||||
)
|
)
|
||||||
|
|
||||||
REM 2. Check core-win directory
|
REM 2. Check core directory
|
||||||
echo [2/6] 检查 Windows 依赖目录...
|
echo [2/6] 检查 Windows 依赖目录...
|
||||||
set "CORE_DIR=%UCLAW_DIR%app\core-win"
|
set "CORE_DIR=%UCLAW_DIR%app\core"
|
||||||
if exist "%CORE_DIR%" (
|
if exist "%CORE_DIR%" (
|
||||||
echo [OK] core-win directory exists >> "%LOG_FILE%"
|
echo [OK] core directory exists >> "%LOG_FILE%"
|
||||||
echo ✓ Windows 依赖目录: 正常
|
echo ✓ Windows 依赖目录: 正常
|
||||||
) else (
|
) else (
|
||||||
echo [ERROR] core-win directory not found >> "%LOG_FILE%"
|
echo [ERROR] core directory not found >> "%LOG_FILE%"
|
||||||
echo ✗ Windows 依赖目录: 缺失
|
echo ✗ Windows 依赖目录: 缺失
|
||||||
set /a ERROR_COUNT+=1
|
set /a ERROR_COUNT+=1
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,7 +3,12 @@ chcp 65001 >nul 2>&1
|
|||||||
title U-Claw Menu
|
title U-Claw Menu
|
||||||
|
|
||||||
set "UCLAW_DIR=%~dp0"
|
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 "DATA_DIR=%UCLAW_DIR%data"
|
||||||
set "STATE_DIR=%DATA_DIR%\.openclaw"
|
set "STATE_DIR=%DATA_DIR%\.openclaw"
|
||||||
set "NODE_DIR=%UCLAW_DIR%app\runtime\node-win-x64"
|
set "NODE_DIR=%UCLAW_DIR%app\runtime\node-win-x64"
|
||||||
|
|||||||
@@ -10,7 +10,11 @@ echo.
|
|||||||
|
|
||||||
set "UCLAW_DIR=%~dp0"
|
set "UCLAW_DIR=%~dp0"
|
||||||
set "APP_DIR=%UCLAW_DIR%app"
|
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 "DATA_DIR=%UCLAW_DIR%data"
|
||||||
set "STATE_DIR=%DATA_DIR%\.openclaw"
|
set "STATE_DIR=%DATA_DIR%\.openclaw"
|
||||||
set "NODE_DIR=%APP_DIR%\runtime\node-win-x64"
|
set "NODE_DIR=%APP_DIR%\runtime\node-win-x64"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/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,
|
# Requires caller to set: $UCLAW_DIR, $DATA_DIR, $STATE_DIR,
|
||||||
# $CONFIG_PATH, $NODE_BIN, $NPM_BIN, $CORE_DIR,
|
# $CONFIG_PATH, $NODE_BIN, $NPM_BIN, $CORE_DIR,
|
||||||
# color vars ($RED $GREEN $YELLOW $CYAN $WHITE $NC $BOLD $DIM),
|
# color vars ($RED $GREEN $YELLOW $CYAN $WHITE $NC $BOLD $DIM),
|
||||||
@@ -275,11 +275,7 @@ do_uninstall() {
|
|||||||
fi
|
fi
|
||||||
echo ""
|
echo ""
|
||||||
echo " Electron 桌面版卸载:"
|
echo " Electron 桌面版卸载:"
|
||||||
if [ "$(uname)" = "Darwin" ]; then
|
|
||||||
echo " macOS: 将 U-Claw.app 从「应用程序」拖到废纸篓"
|
echo " macOS: 将 U-Claw.app 从「应用程序」拖到废纸篓"
|
||||||
else
|
|
||||||
echo " Linux: sudo apt remove u-claw 或 rm ~/.local/share/applications/u-claw.desktop"
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -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 " 按回车关闭..."
|
|
||||||
@@ -9,11 +9,13 @@ set -e
|
|||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
APP_DIR="$SCRIPT_DIR/app"
|
APP_DIR="$SCRIPT_DIR/app"
|
||||||
CORE_DIR="$APP_DIR/core-mac"
|
CORE_DIR="$APP_DIR/core"
|
||||||
RUNTIME_DIR="$APP_DIR/runtime"
|
RUNTIME_DIR="$APP_DIR/runtime"
|
||||||
MIRROR="https://registry.npmmirror.com"
|
MIRROR="https://registry.npmmirror.com"
|
||||||
NODE_MIRROR="https://npmmirror.com/mirrors/node"
|
NODE_MIRROR="https://npmmirror.com/mirrors/node"
|
||||||
NODE_VERSION="v22.14.0"
|
NODE_VERSION="v22.14.0"
|
||||||
|
ALL_PLATFORMS=false
|
||||||
|
[ "$1" = "--all-platforms" ] && ALL_PLATFORMS=true
|
||||||
|
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
CYAN='\033[0;36m'
|
CYAN='\033[0;36m'
|
||||||
@@ -38,11 +40,8 @@ if [ "$OS" = "Darwin" ]; then
|
|||||||
PLATFORM="darwin-x64"
|
PLATFORM="darwin-x64"
|
||||||
NODE_DIR_NAME="node-mac-x64"
|
NODE_DIR_NAME="node-mac-x64"
|
||||||
fi
|
fi
|
||||||
elif [ "$OS" = "Linux" ]; then
|
|
||||||
PLATFORM="linux-x64"
|
|
||||||
NODE_DIR_NAME="node-linux-x64"
|
|
||||||
else
|
else
|
||||||
echo -e "${RED}请在 Mac 或 Linux 上运行此脚本。Windows 请用 setup.bat${NC}"
|
echo -e "${RED}请在 Mac 上运行此脚本。Windows 请用 setup.bat${NC}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -71,7 +70,8 @@ else
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# ---- 1b. Download Node.js for Windows (Cross-platform support) ----
|
# ---- 1b. Download Node.js for Windows (only with --all-platforms) ----
|
||||||
|
if [ "$ALL_PLATFORMS" = "true" ]; then
|
||||||
WIN_NODE_TARGET="$RUNTIME_DIR/node-win-x64"
|
WIN_NODE_TARGET="$RUNTIME_DIR/node-win-x64"
|
||||||
if [ -f "$WIN_NODE_TARGET/node.exe" ]; then
|
if [ -f "$WIN_NODE_TARGET/node.exe" ]; then
|
||||||
echo -e " ${GREEN}✓${NC} Node.js (win-x64) 已存在,跳过下载"
|
echo -e " ${GREEN}✓${NC} Node.js (win-x64) 已存在,跳过下载"
|
||||||
@@ -82,11 +82,9 @@ else
|
|||||||
WIN_NODE_URL="$NODE_MIRROR/$NODE_VERSION/node-$NODE_VERSION-win-x64.zip"
|
WIN_NODE_URL="$NODE_MIRROR/$NODE_VERSION/node-$NODE_VERSION-win-x64.zip"
|
||||||
echo " $WIN_NODE_URL"
|
echo " $WIN_NODE_URL"
|
||||||
|
|
||||||
# Download zip file to temp, extract, then move
|
|
||||||
TMP_ZIP="/tmp/node-win-x64-$$.zip"
|
TMP_ZIP="/tmp/node-win-x64-$$.zip"
|
||||||
curl -fSL "$WIN_NODE_URL" -o "$TMP_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
|
if command -v unzip >/dev/null 2>&1; then
|
||||||
unzip -q "$TMP_ZIP" -d "/tmp/node-win-extract-$$"
|
unzip -q "$TMP_ZIP" -d "/tmp/node-win-extract-$$"
|
||||||
cp -r "/tmp/node-win-extract-$$"/node-$NODE_VERSION-win-x64/* "$WIN_NODE_TARGET/"
|
cp -r "/tmp/node-win-extract-$$"/node-$NODE_VERSION-win-x64/* "$WIN_NODE_TARGET/"
|
||||||
@@ -102,6 +100,7 @@ else
|
|||||||
echo -e " ${CYAN}⚠${NC} Windows runtime下载失败 (不影响当前平台使用)"
|
echo -e " ${CYAN}⚠${NC} Windows runtime下载失败 (不影响当前平台使用)"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# ---- 2. Install OpenClaw ----
|
# ---- 2. Install OpenClaw ----
|
||||||
if [ -d "$CORE_DIR/node_modules/openclaw" ]; then
|
if [ -d "$CORE_DIR/node_modules/openclaw" ]; then
|
||||||
@@ -173,4 +172,6 @@ echo -e " 目录结构:"
|
|||||||
echo -e " app/core/ ← OpenClaw + 依赖"
|
echo -e " app/core/ ← OpenClaw + 依赖"
|
||||||
echo -e " app/runtime/ ← Node.js $NODE_VERSION"
|
echo -e " app/runtime/ ← Node.js $NODE_VERSION"
|
||||||
echo -e " data/ ← 运行后自动生成"
|
echo -e " data/ ← 运行后自动生成"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${CYAN}提示: 制作跨平台 U 盘请用 bash setup.sh --all-platforms${NC}"
|
||||||
echo -e "${GREEN}════════════════════════════════════════${NC}"
|
echo -e "${GREEN}════════════════════════════════════════${NC}"
|
||||||
|
|||||||
@@ -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"
|
|
||||||
@@ -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
|
|
||||||
|
|
||||||
========================================
|
|
||||||
@@ -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"
|
|
||||||
Reference in New Issue
Block a user