From 022f4f1f9a8454a2fb0cf0152684cc50d1ad29d7 Mon Sep 17 00:00:00 2001 From: dongsheng123132 <90887123+dongsheng123132@users.noreply.github.com> Date: Wed, 11 Mar 2026 00:09:10 +0800 Subject: [PATCH] feat: v1.1 - simplified menus, pre-installed QQ plugin, updated README - Simplify menus from 17 to 8 options (config, dashboard, QQ, platforms, diagnostics, backup, restore, sysinfo) - Pre-install QQ bot plugin (@sliverp/qqbot) - users only need AppID + Secret - Install scripts now extract next to themselves (works on USB or computer) - Rename all scripts to English (Mac-Install, Windows-Install, Mac-Start, etc.) - Add README.txt for USB drive with bilingual instructions - Rewrite README.md to match current v1.1 structure - Remove old Chinese-named scripts, build script, test files, QR images - Add Toolkit/ and U-Claw-CN/ to .gitignore --- .gitignore | 3 + README.md | 346 +++---- build-uclaw.sh | 177 ---- portable/Mac-Menu.command | 897 ++++-------------- portable/Windows-Menu.bat | 268 ++---- tests/test-scripts.sh | 230 ----- ...安装并启动.command => Mac-Install.command} | 48 +- uclaw-scripts/Mac-从U盘启动.command | 172 ---- uclaw-scripts/Mac-全部功能.command | 839 ---------------- uclaw-scripts/Mac-安装到电脑.command | 184 ---- uclaw-scripts/README.txt | 51 + ...ows-安装并启动.bat => Windows-Install.bat} | 33 +- uclaw-scripts/Windows-从U盘启动.bat | 88 -- uclaw-scripts/Windows-全部功能.bat | 495 ---------- uclaw-scripts/Windows-安装到电脑.bat | 111 --- uclaw-scripts/中国用户指南.txt | 156 --- uclaw-scripts/使用说明.txt | 123 --- 小红书二维码.jpg | Bin 75734 -> 0 bytes 微信二维码.jpg | Bin 147751 -> 0 bytes 19 files changed, 474 insertions(+), 3747 deletions(-) delete mode 100755 build-uclaw.sh delete mode 100644 tests/test-scripts.sh rename uclaw-scripts/{Mac-安装并启动.command => Mac-Install.command} (61%) delete mode 100644 uclaw-scripts/Mac-从U盘启动.command delete mode 100755 uclaw-scripts/Mac-全部功能.command delete mode 100644 uclaw-scripts/Mac-安装到电脑.command create mode 100644 uclaw-scripts/README.txt rename uclaw-scripts/{Windows-安装并启动.bat => Windows-Install.bat} (57%) delete mode 100644 uclaw-scripts/Windows-从U盘启动.bat delete mode 100644 uclaw-scripts/Windows-全部功能.bat delete mode 100644 uclaw-scripts/Windows-安装到电脑.bat delete mode 100644 uclaw-scripts/中国用户指南.txt delete mode 100644 uclaw-scripts/使用说明.txt delete mode 100644 小红书二维码.jpg delete mode 100644 微信二维码.jpg diff --git a/.gitignore b/.gitignore index a8bd817..cd4f7b9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ U-Claw/ U-Claw-v2/ +# Toolkit (engineer DIY package, local only) +Toolkit/ + # Marketing assets marketing/ marketing.zip diff --git a/README.md b/README.md index d06ae1b..ec4cb19 100644 --- a/README.md +++ b/README.md @@ -1,291 +1,167 @@ -# 🦞 U-Claw +# 🦞 U-Claw 虾盘 -**OpenClaw Offline Installer USB — Built for China, Works Everywhere** +**Portable AI Agent — 插上就能用的 AI 助手** -**OpenClaw 离线安装 U 盘 — 专为中国用户打造,全球可用** - -> Like the legendary [YuLinMuFeng](https://en.wikipedia.org/wiki/Ylmf) Windows discs, but for AI. -> 就像当年的雨林木风,把 AI 助手的安装简化到"插 U 盘,双击运行"。 +> 像当年的雨林木风,把 AI 助手简化到"双击运行"。 [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) --- -## Why U-Claw? / 为什么需要 U-Claw? +## 为什么需要 U-Claw? -[OpenClaw](https://github.com/openclaw/openclaw) is the most powerful open-source AI assistant framework — 20+ chat platforms, 50+ AI models. But in China, installing it is a nightmare: +[OpenClaw](https://github.com/openclaw/openclaw) 是最强的开源 AI 助手框架,但在中国安装它是个噩梦:GitHub 访问不了、npm 超时、Node.js 下载慢。 -[OpenClaw](https://github.com/openclaw/openclaw) 是最强的开源 AI 助手框架,但在中国安装它是个噩梦: +**U-Claw 解决所有问题。** Node.js + OpenClaw + 所有依赖 + QQ 插件,全部打包好。双击即用。 -- ❌ GitHub blocked / GitHub 访问不了 -- ❌ npm install timeout / npm install 超时 -- ❌ Node.js download slow / Node.js 下载慢 -- ❌ Dependencies fail / 依赖装不上 +## 快速开始 -**U-Claw solves all of this.** Node.js runtime, OpenClaw source, all npm dependencies, 52 pre-installed skills — everything bundled on a USB drive. Plug in, double-click, done. For teams and schools, it is often lower-cost than cloud deployment for onboarding and day-to-day use. +### 方法 1:从 Releases 下载(推荐) -**U-Claw 解决所有这些问题。** Node.js + OpenClaw + 所有依赖 + 52个技能,全部打包。插上 U 盘,双击即用。对团队和学校场景,部署和培训成本通常也比云端部署更低。 +1. 下载 [U-Claw-v1.1.tar.gz](https://github.com/dongsheng123132/u-claw/releases) +2. 解压到任意位置(U 盘、桌面、文档都行) +3. Mac: 双击 `Mac-Start.command` / Windows: 双击 `Windows-Start.bat` -## Features / 特性 +### 方法 2:用 U 盘安装脚本 -- 🚀 **Easy startup / 快速启动** — macOS + Windows, ready to run from USB -- 📦 **Fully offline / 完全离线** — No internet needed for installation -- 💸 **Lower TCO / 总成本更低** — For repeated deployments, often cheaper than cloud-only rollout -- 🇨🇳 **China-optimized / 中国优化** — 8 Chinese AI models (DeepSeek, Kimi, Qwen, GLM, MiniMax, Doubao, Qianfan, Mimo) -- 💬 **Multi-platform / 多平台** — QQ (official) / Feishu / WeChat / Telegram / Discord / WhatsApp / Slack -- 🔧 **Maintenance tools / 维护工具** — Diagnose, backup, restore, reset -- 🎯 **52 skills / 52个技能** — Pre-installed productivity skills -- 📖 **Bilingual docs / 双语文档** — Chinese + English +U 盘上有安装脚本,双击自动解压 + 启动: +- Mac: `Mac-Install.command` +- Windows: `Windows-Install.bat` -## Quick Start / 快速开始 - -### Option 1: Download Release / 下载发布版(推荐) - -```bash -# Download from Releases / 从 Releases 下载 -# https://github.com/dongsheng123132/u-claw/releases - -# After extracting / 解压后: -# Mac: double-click "Mac-从U盘启动.command" -# Win: double-click "Windows-从U盘启动.bat" -``` - -### Option 2: Build Your Own / 自己构建 - -```bash -# Clone this repo / 克隆仓库 -git clone https://github.com/dongsheng123132/u-claw.git -cd u-claw - -# Download OpenClaw source / 下载 OpenClaw 源码 -git clone https://github.com/openclaw/openclaw.git openclaw-2026.3.7 - -# Build (downloads Node.js + installs deps + builds) -# 构建(自动下载 Node.js + 安装依赖 + 构建) -chmod +x build-uclaw.sh -./build-uclaw.sh - -# Copy U-Claw/ folder to USB drive -# 把 U-Claw/ 文件夹复制到 U 盘 -``` - -Note: `U-Claw/` is a generated release bundle. Keep the scripts/docs in git, and publish the built `U-Claw/` directory through GitHub Releases instead of committing it to the repository history. - -说明:`U-Claw/` 是构建产物。建议把脚本和文档提交到 git,把生成好的 `U-Claw/` 目录通过 GitHub Releases 发布,而不是直接提交到仓库历史。 - -### Option 3: Copy from a Friend / 复制别人的 - -Just copy the `U-Claw/` folder. That's it. +### 方法 3:复制别人的 直接把 `U-Claw/` 文件夹复制一份就行。 -## USB Contents / U 盘内容 +## 目录结构 ``` -U-Claw/ (~1.3GB, 8GB USB minimum) -│ -├── Mac-从U盘启动.command ← macOS: run from USB -├── Windows-从U盘启动.bat ← Windows: run from USB -├── Mac-全部功能.command ← macOS: full feature menu -├── Windows-全部功能.bat ← Windows: full feature menu -├── Mac-安装到电脑.command ← Install to Mac permanently -├── Windows-安装到电脑.bat ← Install to Windows permanently -├── 使用说明.txt ← Basic instructions -├── 中国用户指南.txt ← China quick-start guide -├── 教程-OpenClaw中国区完全指南.md ← Full tutorial (12 chapters) -│ -├── runtime/ ← Node.js 22 runtimes -│ ├── node-mac-arm64/ ← Mac Apple Silicon (M1-M4) -│ ├── node-mac-x64/ ← Mac Intel -│ └── node-win-x64/ ← Windows 64-bit -│ -├── openclaw/ ← OpenClaw + node_modules + dist -│ ├── skills/ ← 52 pre-installed skills -│ └── extensions/ ← 42 channel extensions -│ -├── memory/ ← AI memory (user data) -├── persona/ ← AI personality config -└── backups/ ← Auto-created backups +U-Claw/ (~2.3GB) +├── Mac-Start.command ← Mac 双击启动 +├── Windows-Start.bat ← Windows 双击启动 +├── Mac-Menu.command ← Mac 配置/维护菜单 +├── Windows-Menu.bat ← Windows 配置/维护菜单 +├── U-Claw.html ← 导航页面 +├── app/ +│ ├── core/ ← OpenClaw + 依赖 + QQ 插件 +│ └── runtime/ +│ ├── node-mac-arm64/ ← Mac Apple Silicon +│ └── node-win-x64/ ← Windows 64-bit +├── data/ ← 用户数据(配置、记忆、备份) +│ ├── .openclaw/ +│ ├── memory/ +│ └── backups/ +└── system/ + └── migrate.js ← 配置迁移脚本 ``` -## Launcher Menu / 启动菜单 +## 菜单功能 -17 functions, inspired by YuLinMuFeng (雨林木风) installer UI: +精简到 8 个选项: ``` -╔════════════════════════════════════════════════════════╗ -║ 🦞 U-Claw 虾盘 v1.1 ║ -║ Optimized for China · Offline · One-click ║ -╠════════════════════════════════════════════════════════╣ - - ━━ Install ━━ - [1] Run from USB [2] Install to computer - [3] System info [4] OpenClaw status - - ━━ China Optimization ━━ - [5] Setup wizard (model/platform/API Key) - [6] Chat platforms (QQ/Feishu/WeChat) - [7] Manage channels - - ━━ Maintenance ━━ - [8] Diagnose & repair [9] Update OpenClaw - [10] Skills [11] Tools (MCP) [12] Plugins - - ━━ Skills & Usage ━━ - [13] Browse skills market [14] China user guide - [15] Instructions [16] About - [17] Open web dashboard +[1] 配置向导(选模型、API Key) +[2] 打开网页控制台 +[3] QQ 机器人(已预装,只需输入 ID) +[4] 其他平台(飞书/Telegram/微信) +[5] 诊断修复 +[6] 备份配置 +[7] 恢复备份 +[8] 系统信息 ``` -## Supported AI Models / 支持的 AI 模型 +## 支持的 AI 模型 -### Chinese Models (no VPN needed) / 国产模型(无需翻墙) +### 国产模型(无需翻墙) -| Model 模型 | Provider 提供商 | Best for 推荐场景 | -|------------|----------------|-------------------| -| DeepSeek | 深度求索 | Coding, best value / 编程,性价比首选 | -| Kimi K2.5 | 月之暗面 Moonshot | Long docs, 256K context / 长文档 | -| Qwen | 阿里通义千问 | Large free tier / 免费额度大 | -| GLM 4.7 | 智谱AI Zhipu | Academic, Chinese NLP / 学术 | -| MiniMax | MiniMax | Voice, multimodal / 语音 | -| Doubao | 字节豆包 ByteDance | Volcano Engine / 火山引擎 | -| Qianfan | 百度千帆 Baidu | Baidu Cloud / 百度云 | -| Mimo | 小米 Xiaomi | Xiaomi ecosystem / 小米生态 | +| 模型 | 推荐场景 | +|------|----------| +| DeepSeek | 编程,性价比首选 | +| Kimi K2.5 | 长文档,256K 上下文 | +| 通义千问 Qwen | 免费额度大 | +| 智谱 GLM | 学术 | +| MiniMax | 语音、多模态 | +| 豆包 Doubao | 火山引擎 | -### International Models / 国际模型 +### 国际模型 -| Model | Provider | Best for | -|-------|----------|----------| -| Claude | Anthropic | Best overall + coding | -| GPT | OpenAI | Wide compatibility | -| Gemini | Google | Free tier | +Claude (Anthropic) · GPT (OpenAI) · Gemini (Google) -## Supported Chat Platforms / 支持的聊天平台 +## 聊天平台 -| Platform 平台 | Status 状态 | Notes 说明 | -|---------------|------------|------------| -| QQ | ✅ **Official** 腾讯官方 | 3 commands, 1 min, free / 3条命令搞定 | -| Feishu 飞书 | ✅ Built-in 已内置 | Enterprise best / 企业首选 | -| WeChat 微信 | ✅ Community plugin | iPad protocol | -| Telegram | ✅ Built-in | Recommended for intl users | -| Discord | ✅ Built-in | Gaming / community | -| WhatsApp | ✅ Built-in | International users | -| Slack | ✅ Built-in | Enterprise (intl) | -| WeCom 企业微信 | 🔜 Coming | — | -| DingTalk 钉钉 | 🔜 Coming | — | +| 平台 | 状态 | 说明 | +|------|------|------| +| QQ | ✅ **已预装** | 只需输入 AppID + AppSecret | +| 飞书 | ✅ 内置 | 企业首选 | +| Telegram | ✅ 内置 | 海外推荐 | +| 微信 | ✅ 社区插件 | iPad 协议 | +| Discord | ✅ 内置 | — | +| WhatsApp | ✅ 内置 | — | -### QQ Setup (1 minute) / QQ 接入(1 分钟) +### QQ 接入(1 分钟) -Tencent officially supports OpenClaw QQ bots. 腾讯官方支持: +QQ 插件已预装!只需: +1. 访问 q.qq.com 创建机器人,获取 AppID 和 AppSecret +2. 双击 `Mac-Menu.command`,选 [3] QQ 机器人 +3. 输入 AppID 和 AppSecret,完成 -```bash -# 1. Register / 注册: http://q.qq.com/qqbot/openclaw/login.html -# 2. Create bot, get AppID:AppSecret / 创建机器人 +## 系统要求 -# 3. Run 3 commands / 运行3条命令: -openclaw plugins install @sliverp/qqbot@latest -openclaw channels add --channel qqbot --token "AppID:AppSecret" -openclaw gateway restart +- **macOS**: Apple Silicon (M1-M4), macOS 12+ +- **Windows**: 10/11, 64-bit +- **内存**: 2GB+(推荐 4GB+) +- **存储**: 3GB+ -# 4. Set allowlist! / 设置白名单! -openclaw config set channels.qqbot.allowFrom "your_qq_number" +## 升级 + +下载新版 `app/` 目录替换旧的,`data/` 不动(用户配置和记忆保留)。 + +## U 盘结构 + +``` +UCLAW (U盘) +├── Mac-Install.command ← 首次双击(解压+启动) +├── Windows-Install.bat +├── U-Claw.tar.gz ← 压缩包 +├── README.txt ← 使用说明 +└── Toolkit/ ← 工程师 DIY 素材包 + ├── node-v22-mac-arm64.pkg + ├── node-v22-win-x64.msi + ├── openclaw-source.tar.gz + └── npm-cache.tar.gz ``` -## System Requirements / 系统要求 +## 仓库结构 -- **macOS**: 12+ (Intel or Apple Silicon) -- **Windows**: 10/11 (64-bit) -- **RAM**: 2GB+ (4GB+ recommended) -- **USB**: 8GB+ (16GB recommended) - -## Build Guide / 构建指南 - -### Prerequisites / 前提 - -- macOS or Linux (build environment) -- Internet access (only needed for building, not for end users) -- ~2GB disk space - -### What the build script does / 构建脚本做了什么 - -1. Downloads Node.js 22 for 3 platforms (Mac ARM64 + Mac x64 + Win x64), prefers China mirror -2. Copies OpenClaw source to `U-Claw/openclaw/` -3. Installs `pnpm` and runs `pnpm install` with China mirror (registry.npmmirror.com) -4. Runs `pnpm build` to build OpenClaw -5. Copies launcher scripts and docs -6. Output: ~1.3GB ready to copy to USB - -### Updating / 更新 - -```bash -# Download new OpenClaw source, replace openclaw-2026.3.7/ -./build-uclaw.sh -# Copy new U-Claw/ to USB ``` - -## Contributing / 参与贡献 - -PRs welcome! Especially needed / 欢迎 PR,特别需要: - -- 🔧 More platform repair scripts / 更多平台修复脚本 -- 📖 Tutorials and guides / 教程 -- 💬 More chat bridges (WeCom, DingTalk) / 企业微信、钉钉桥接 -- 🎯 Useful skills / 实用技能 -- 🌐 Translations / 翻译 - -```bash -# Fork → Branch → Commit → PR -git checkout -b feature/my-feature -git commit -m "feat: add xxx" -git push origin feature/my-feature +u-claw/ +├── portable/ ← 脚本源码(打包进 U-Claw) +├── uclaw-scripts/ ← U 盘安装脚本 +├── website/ ← 官网 +├── docs/ ← 文档 +└── README.md ``` -## Related Projects / 相关项目 - -| Project 项目 | Stars | Description 说明 | -|-------------|-------|-----------------| -| [OpenClaw](https://github.com/openclaw/openclaw) | — | The AI assistant framework / AI 助手框架 | -| [hello-claw](https://github.com/datawhalechina/hello-claw) | 90+ | Systematic Chinese tutorial / 体系化中文教程 | -| [openclaw-docs](https://github.com/yeuxuan/openclaw-docs) | 500+ | 276 source-level docs / 源码级文档 | -| [awesome-openclaw-skills-zh](https://github.com/clawdbot-ai/awesome-openclaw-skills-zh) | 2500+ | Chinese skill library / 中文技能库 | -| [NapCatQQ](https://github.com/NapNeko/NapCatQQ) | — | QQ bot framework (OneBot v11) | - ## FAQ -**Q: Do end users need a VPN? / 用户需要翻墙吗?** -A: No for installation. Runtime needs internet for AI APIs — Chinese models (DeepSeek etc.) work without VPN. -安装不需要。运行需要联网调 API,国产模型无需翻墙。 +**Q: 需要翻墙吗?** +安装不需要。运行需要联网调 AI API,国产模型无需翻墙。 -**Q: USB drive size? / U 盘要多大?** -A: 8GB minimum, 16GB recommended. +**Q: 能分发吗?** +可以,MIT 协议,随便复制。 -**Q: Can I share it? / 能分发吗?** -A: Yes, unlimited. MIT license, copy freely. -可以,无限制,MIT 协议。 - -**Q: Windows needs WSL? / Windows 需要 WSL 吗?** -A: No. U-Claw bundles Windows Node.js, runs natively via `.bat`. -不需要。自带 Windows 版 Node.js。 +**Q: Windows 需要 WSL 吗?** +不需要,自带 Windows 版 Node.js。 ## License -[MIT](LICENSE) — Free to use, modify, distribute. +[MIT](LICENSE) -自由使用、修改、分发。 +## 联系 -## Contact / 联系方式 - -- **WeChat 微信**: Scan QR below / 扫码添加 - - WeChat QR - -- **Xiaohongshu 小红书**: [关注主页 / Follow](https://xhslink.com/m/6mf7Mq2M5wP) -- **Email 邮箱**: hefangsheng@gmail.com -- **GitHub**: [@dongsheng123132](https://github.com/dongsheng123132) -- **Website 官网**: [u-claw.org](https://u-claw.org) +- 微信: hecare888 +- GitHub: [@dongsheng123132](https://github.com/dongsheng123132) +- 官网: [u-claw.org](https://u-claw.org) --- -**Made with 🦞 by [dongsheng](https://github.com/dongsheng123132) & OpenClaw Community** - -**Website: [u-claw.org](https://u-claw.org)** · **Email: hefangsheng@gmail.com** +**Made with 🦞 by [dongsheng](https://github.com/dongsheng123132)** diff --git a/build-uclaw.sh b/build-uclaw.sh deleted file mode 100755 index 493f38d..0000000 --- a/build-uclaw.sh +++ /dev/null @@ -1,177 +0,0 @@ -#!/bin/bash -# ============================================================ -# U-Claw 虾盘 构建脚本 -# 在你的 Mac 上运行,打包所有依赖到 U-Claw 目录 -# 用法: ./build-uclaw.sh -# ============================================================ - -set -eo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -UCLAW_DIR="$SCRIPT_DIR/U-Claw" -SOURCE_DIR="$SCRIPT_DIR/openclaw-2026.3.7" -NODE_VERSION="22.16.0" - -# 颜色输出 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -CYAN='\033[0;36m' -NC='\033[0m' - -info() { echo -e "${CYAN}[U-Claw]${NC} $1"; } -ok() { echo -e "${GREEN}[✓]${NC} $1"; } -warn() { echo -e "${YELLOW}[!]${NC} $1"; } -error() { echo -e "${RED}[✗]${NC} $1"; exit 1; } - -echo "" -echo " 🦞 U-Claw 虾盘 构建工具" -echo " ========================" -echo " OpenClaw 一键安装 U 盘制作" -echo "" - -# ---- 1. 创建 U-Claw 目录结构 ---- -info "创建 U-Claw 目录结构..." -rm -rf "$UCLAW_DIR" -mkdir -p "$UCLAW_DIR"/{runtime/{node-mac-arm64,node-mac-x64,node-linux-x64,node-win-x64},openclaw,memory,persona,skills,tools} - -# ---- 2. 下载 Node.js 各平台版本 ---- -DOWNLOAD_DIR="$SCRIPT_DIR/.download-cache" -mkdir -p "$DOWNLOAD_DIR" - -download_node() { - local PLATFORM=$1 # darwin, win - local ARCH=$2 # arm64, x64 - local EXT=$3 # tar.gz, zip - local DEST=$4 # 目标目录名 - - local FILENAME="node-v${NODE_VERSION}-${PLATFORM}-${ARCH}" - local URL="https://nodejs.org/dist/v${NODE_VERSION}/${FILENAME}.${EXT}" - local CACHED="$DOWNLOAD_DIR/${FILENAME}.${EXT}" - - if [ -f "$CACHED" ]; then - ok "Node.js ${PLATFORM}-${ARCH} 已缓存" - else - info "下载 Node.js ${PLATFORM}-${ARCH}..." - # 尝试直接下载,如果失败则使用镜像 - if ! curl -fL --connect-timeout 10 -o "$CACHED" "$URL" 2>/dev/null; then - warn "官方源下载失败,尝试淘宝镜像..." - local MIRROR_URL="https://npmmirror.com/mirrors/node/v${NODE_VERSION}/${FILENAME}.${EXT}" - curl -fL -o "$CACHED" "$MIRROR_URL" || error "下载 Node.js ${PLATFORM}-${ARCH} 失败" - fi - ok "下载完成: Node.js ${PLATFORM}-${ARCH}" - fi - - info "解压 Node.js ${PLATFORM}-${ARCH}..." - if [ "$EXT" = "tar.gz" ]; then - tar xzf "$CACHED" -C "$UCLAW_DIR/runtime/$DEST/" --strip-components=1 - elif [ "$EXT" = "zip" ]; then - # Windows zip - local TMP_UNZIP="$DOWNLOAD_DIR/tmp-unzip-$$" - mkdir -p "$TMP_UNZIP" - unzip -q "$CACHED" -d "$TMP_UNZIP" - cp -R "$TMP_UNZIP"/${FILENAME}/* "$UCLAW_DIR/runtime/$DEST/" - rm -rf "$TMP_UNZIP" - fi - ok "Node.js ${PLATFORM}-${ARCH} 就绪" -} - -# 下载四个平台的 Node.js -download_node "darwin" "arm64" "tar.gz" "node-mac-arm64" # Mac Apple Silicon -download_node "darwin" "x64" "tar.gz" "node-mac-x64" # Mac Intel -download_node "linux" "x64" "tar.gz" "node-linux-x64" # Linux x64 -download_node "win" "x64" "zip" "node-win-x64" # Windows x64 - -# ---- 3. 复制 OpenClaw 源码 ---- -info "复制 OpenClaw 源码..." -rsync -a --exclude='.git' --exclude='node_modules' --exclude='.github' \ - "$SOURCE_DIR/" "$UCLAW_DIR/openclaw/" -ok "OpenClaw 源码复制完成" - -# ---- 4. 安装依赖 (使用淘宝镜像) ---- -info "安装 npm 依赖(使用淘宝镜像)..." - -# 使用 U-Claw 自带的 Node.js 来安装 -if [ "$(uname -m)" = "arm64" ]; then - NODE_DIR="$UCLAW_DIR/runtime/node-mac-arm64" - NODE_BIN="$UCLAW_DIR/runtime/node-mac-arm64/bin/node" - NPM_BIN="$UCLAW_DIR/runtime/node-mac-arm64/bin/npm" -else - NODE_DIR="$UCLAW_DIR/runtime/node-mac-x64" - NODE_BIN="$UCLAW_DIR/runtime/node-mac-x64/bin/node" - NPM_BIN="$UCLAW_DIR/runtime/node-mac-x64/bin/npm" -fi - -cd "$UCLAW_DIR/openclaw" - -# 设置淘宝镜像 -"$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null || true - -# 安装 pnpm(OpenClaw build 脚本依赖 pnpm) -info "安装 pnpm..." -"$NODE_BIN" "$NPM_BIN" install -g pnpm --registry=https://registry.npmmirror.com 2>&1 | tail -3 -PNPM_BIN="$NODE_DIR/bin/pnpm" -[ -x "$PNPM_BIN" ] || error "pnpm 安装失败: $PNPM_BIN 不存在" - -# 安装依赖(使用 pnpm,与上游一致) -info "pnpm install 中...(可能需要几分钟)" -cd "$UCLAW_DIR/openclaw" -"$PNPM_BIN" install --registry=https://registry.npmmirror.com 2>&1 | tail -5 -ok "依赖安装完成" - -# ---- 5. 构建 OpenClaw ---- -info "构建 OpenClaw..." -cd "$UCLAW_DIR/openclaw" -"$PNPM_BIN" run build 2>&1 | tail -10 -if [ -d "$UCLAW_DIR/openclaw/dist" ]; then - ok "构建成功,dist/ 已生成" -else - error "构建失败:dist/ 目录未生成,请检查错误信息" -fi - -cd "$SCRIPT_DIR" - -# ---- 6. 复制用户脚本和说明 ---- -info "复制用户脚本..." - -# 从 scripts 模板目录复制(构建脚本同级的 uclaw-scripts/ 目录) -SCRIPTS_SRC="$SCRIPT_DIR/uclaw-scripts" -if [ -d "$SCRIPTS_SRC" ]; then - cp "$SCRIPTS_SRC/启动菜单.command" "$UCLAW_DIR/" 2>/dev/null || true - cp "$SCRIPTS_SRC/启动菜单.bat" "$UCLAW_DIR/" 2>/dev/null || true - cp "$SCRIPTS_SRC/运行.command" "$UCLAW_DIR/" 2>/dev/null || true - cp "$SCRIPTS_SRC/运行.sh" "$UCLAW_DIR/" 2>/dev/null || true - cp "$SCRIPTS_SRC/运行.bat" "$UCLAW_DIR/" 2>/dev/null || true - cp "$SCRIPTS_SRC/安装到电脑.command" "$UCLAW_DIR/" 2>/dev/null || true - cp "$SCRIPTS_SRC/安装到电脑.bat" "$UCLAW_DIR/" 2>/dev/null || true - cp "$SCRIPTS_SRC/使用说明.txt" "$UCLAW_DIR/" 2>/dev/null || true - cp "$SCRIPTS_SRC/中国用户指南.txt" "$UCLAW_DIR/" 2>/dev/null || true - # 复制教程文档 - mkdir -p "$UCLAW_DIR/docs" - cp "$SCRIPT_DIR/docs/教程-OpenClaw中国区完全指南.md" "$UCLAW_DIR/docs/" 2>/dev/null || true - # 复制二维码 - cp "$SCRIPT_DIR/微信二维码.jpg" "$UCLAW_DIR/" 2>/dev/null || true - cp "$SCRIPT_DIR/小红书二维码.jpg" "$UCLAW_DIR/" 2>/dev/null || true - chmod +x "$UCLAW_DIR/启动菜单.command" "$UCLAW_DIR/运行.command" "$UCLAW_DIR/运行.sh" "$UCLAW_DIR/安装到电脑.command" 2>/dev/null || true - ok "用户脚本已复制(含启动菜单、中国用户指南、微信二维码)" -else - warn "找不到 uclaw-scripts/ 目录,请手动复制脚本到 U-Claw/" -fi - -# ---- 7. 计算大小 ---- -echo "" -echo " ============================================" -info "U-Claw 构建完成!" -echo "" -TOTAL_SIZE=$(du -sh "$UCLAW_DIR" | cut -f1) -echo " 总大小: $TOTAL_SIZE" -echo "" -du -sh "$UCLAW_DIR"/runtime/node-mac-arm64 2>/dev/null | awk '{print " Node.js Mac ARM64: "$1}' -du -sh "$UCLAW_DIR"/runtime/node-mac-x64 2>/dev/null | awk '{print " Node.js Mac x64: "$1}' -du -sh "$UCLAW_DIR"/runtime/node-linux-x64 2>/dev/null | awk '{print " Node.js Linux x64: "$1}' -du -sh "$UCLAW_DIR"/runtime/node-win-x64 2>/dev/null | awk '{print " Node.js Win x64: "$1}' -du -sh "$UCLAW_DIR"/openclaw 2>/dev/null | awk '{print " OpenClaw + 依赖: "$1}' -echo "" -echo " 将 U-Claw 文件夹整个复制到 U 盘即可" -echo " ============================================" -echo "" diff --git a/portable/Mac-Menu.command b/portable/Mac-Menu.command index d822214..9d0999f 100755 --- a/portable/Mac-Menu.command +++ b/portable/Mac-Menu.command @@ -1,35 +1,25 @@ #!/bin/bash -# ============================================================ -# U-Claw 虾盘 - 启动菜单 (雨林木风风格) -# macOS 版本 -# ============================================================ +# U-Claw Menu - Portable AI Agent +# macOS version UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)" -OPENCLAW_DIR="$UCLAW_DIR/app/core" +APP_DIR="$UCLAW_DIR/app" +CORE_DIR="$APP_DIR/core" DATA_DIR="$UCLAW_DIR/data" STATE_DIR="$DATA_DIR/.openclaw" CONFIG_PATH="$STATE_DIR/openclaw.json" -# 颜色 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' -BLUE='\033[0;34m' -MAGENTA='\033[0;35m' WHITE='\033[1;37m' -GRAY='\033[0;37m' NC='\033[0m' BOLD='\033[1m' DIM='\033[2m' -# 检测架构并设置 Node -ARCH=$(uname -m) -if [ "$ARCH" = "arm64" ]; then - NODE_DIR="$UCLAW_DIR/app/runtime/node-mac-arm64" -else - NODE_DIR="$UCLAW_DIR/app/runtime/node-mac-x64" -fi +# Node.js (ARM64 only) +NODE_DIR="$APP_DIR/runtime/node-mac-arm64" NODE_BIN="$NODE_DIR/bin/node" NPM_BIN="$NODE_DIR/bin/npm" export PATH="$NODE_DIR/bin:$PATH" @@ -39,801 +29,246 @@ export OPENCLAW_CONFIG_PATH="$CONFIG_PATH" mkdir -p "$STATE_DIR" "$DATA_DIR/memory" "$DATA_DIR/backups" -# 移除 macOS 隔离标记(解决"无法验证开发者"弹窗) +# Remove macOS quarantine if xattr -l "$NODE_BIN" 2>/dev/null | grep -q "com.apple.quarantine"; then xattr -rd com.apple.quarantine "$UCLAW_DIR" 2>/dev/null || true fi -# 检查安装状态 -check_status() { - HAS_MODULES="no" - HAS_DIST="no" - HAS_ENV="no" - INSTALLED="no" - CONFIG_READY="no" - - [ -d "$OPENCLAW_DIR/node_modules" ] && HAS_MODULES="yes" - [ -d "$OPENCLAW_DIR/dist" ] && HAS_DIST="yes" - [ -f "$OPENCLAW_DIR/.env" ] && HAS_ENV="yes" - [ -d "$HOME/.uclaw/openclaw" ] && INSTALLED="yes" - [ -f "$CONFIG_PATH" ] && CONFIG_READY="yes" +# Run openclaw command +run_oc() { + cd "$CORE_DIR" + "$NODE_BIN" openclaw.mjs "$@" } -# 显示主菜单 +# Show menu show_menu() { - check_status clear - echo "" - echo -e "${CYAN}${BOLD}" - echo " ╔════════════════════════════════════════════════════════╗" - echo " ║ ║" - echo " ║ 🦞 U-Claw 虾盘 v1.0 ║" - echo " ║ OpenClaw AI 助手 一键安装盘 ║" - echo " ║ ║" - echo " ║ 专为中国用户优化 · 免翻墙 · 离线安装 ║" - echo " ║ ║" - echo " ╠════════════════════════════════════════════════════════╣" - echo -e " ║${NC} ${CYAN}║" + local NODE_VER=$("$NODE_BIN" --version 2>/dev/null || echo "N/A") + local CFG_STATUS="${RED}未配置${NC}" + [ -f "$CONFIG_PATH" ] && CFG_STATUS="${GREEN}已配置${NC}" - # 状态栏 - local STATUS_NODE="${GREEN}v$($NODE_BIN --version 2>/dev/null || echo '未找到')${NC}" - local STATUS_MOD="${RED}未安装${NC}" - local STATUS_BUILD="${RED}未构建${NC}" - local STATUS_INST="${RED}未安装${NC}" - - [ "$HAS_MODULES" = "yes" ] && STATUS_MOD="${GREEN}已安装${NC}" - [ "$HAS_DIST" = "yes" ] && STATUS_BUILD="${GREEN}已构建${NC}" - [ "$INSTALLED" = "yes" ] && STATUS_INST="${GREEN}已安装${NC}" - - local STATUS_PORTABLE="${RED}未配置${NC}" - [ "$CONFIG_READY" = "yes" ] && STATUS_PORTABLE="${GREEN}已配置${NC}" - echo -e " ${CYAN}║${NC} 系统: $(uname -m) ${CYAN}║${NC}" - echo -e " ${CYAN}║${NC} Node: $STATUS_NODE ${CYAN}║${NC}" - echo -e " ${CYAN}║${NC} 依赖: $STATUS_MOD 构建: $STATUS_BUILD ${CYAN}║${NC}" - echo -e " ${CYAN}║${NC} 便携配置: $STATUS_PORTABLE 电脑安装: $STATUS_INST ${CYAN}║${NC}" - echo -e " ${CYAN}║${NC} ${CYAN}║${NC}" - echo -e " ${CYAN}╠════════════════════════════════════════════════════════╣${NC}" echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 安装 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e " ${CYAN}${BOLD}╔══════════════════════════════════════╗" + echo -e " ║ U-Claw 虾盘 v1.1 ║" + echo -e " ║ Portable AI Agent ║" + echo -e " ╚══════════════════════════════════════╝${NC}" echo "" - echo -e " ${GREEN} [1]${NC} 🚀 安装 OpenClaw 到本机(仅限你自己的电脑)" - echo -e " ${GREEN} [2]${NC} 📦 仅安装依赖(npm install)" - echo -e " ${GREEN} [3]${NC} 🔨 仅构建项目(npm build)" - echo -e " ${GREEN} [4]${NC} ▶️ 直接从 U 盘运行(配置也保存在 U 盘里)" + echo -e " Node: ${GREEN}${NODE_VER}${NC} 配置: ${CFG_STATUS}" echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 中国优化 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e " ${WHITE}${BOLD}── 配置 ──────────────────────────────${NC}" + echo -e " ${GREEN}[1]${NC} 配置向导(选模型、填 API Key)" + echo -e " ${GREEN}[2]${NC} 打开网页控制台" echo "" - echo -e " ${YELLOW} [5]${NC} ⚙️ 首次配置向导(选模型、选平台、填 API Key)" - echo -e " ${YELLOW} [6]${NC} 💬 配置中国聊天平台(飞书/钉钉)" - echo -e " ${YELLOW} [7]${NC} 🪞 设置国内镜像源" + echo -e " ${WHITE}${BOLD}── 聊天平台 ──────────────────────────${NC}" + echo -e " ${GREEN}[3]${NC} 接入 QQ 机器人(推荐,1分钟搞定)" + echo -e " ${GREEN}[4]${NC} 接入其他平台(飞书/Telegram/微信)" echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 维护工具 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e " ${WHITE}${BOLD}── 维护 ──────────────────────────────${NC}" + echo -e " ${GREEN}[5]${NC} 诊断修复" + echo -e " ${GREEN}[6]${NC} 备份配置" + echo -e " ${GREEN}[7]${NC} 恢复备份" + echo -e " ${GREEN}[8]${NC} 系统信息" echo "" - echo -e " ${CYAN} [8]${NC} 🔧 诊断修复(openclaw doctor)" - echo -e " ${CYAN} [9]${NC} 💾 备份当前状态" - echo -e " ${CYAN} [10]${NC} 📂 恢复备份" - echo -e " ${CYAN} [11]${NC} 🔄 重置 OpenClaw(恢复出厂)" - echo -e " ${CYAN} [12]${NC} 🧹 清理缓存和临时文件" - echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 技能 & 使用 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo "" - echo -e " ${BLUE} [13]${NC} 🎯 浏览预装技能(52个,已离线可用)" - echo -e " ${BLUE} [14]${NC} 📖 中国用户快速上手指南" - echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 其他 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo "" - echo -e " ${MAGENTA} [15]${NC} 📋 查看使用说明" - echo -e " ${MAGENTA} [16]${NC} ℹ️ 系统信息" - echo -e " ${MAGENTA} [17]${NC} 🌐 打开本地网页控制台" - echo -e " ${DIM} [0]${NC} 退出" - echo "" - echo -e " ${CYAN}╚════════════════════════════════════════════════════════╝${NC}" + echo -e " ${DIM}[0] 退出${NC}" echo "" } -# 确保依赖已安装 -ensure_deps() { - if [ ! -d "$OPENCLAW_DIR/node_modules" ]; then - echo -e " ${YELLOW}正在安装依赖(淘宝镜像)...${NC}" - cd "$OPENCLAW_DIR" - "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com 2>&1 - echo -e " ${GREEN}依赖安装完成${NC}" - fi - if [ ! -d "$OPENCLAW_DIR/dist" ]; then - echo -e " ${YELLOW}正在构建...${NC}" - cd "$OPENCLAW_DIR" - "$NODE_BIN" "$NPM_BIN" run build 2>&1 || true - echo -e " ${GREEN}构建完成${NC}" - fi +# [1] Config wizard +do_config() { + echo "" + echo -e " ${CYAN}${BOLD}━━━ 配置向导 ━━━${NC}" + echo "" + echo -e " ${WHITE}国产模型选择提示:${NC}" + echo "" + echo -e " DeepSeek → 选 Custom Provider" + echo -e " URL: https://api.deepseek.com/v1" + echo -e " 模型: deepseek-chat" + echo -e " Kimi → 选 Moonshot AI" + echo -e " 通义千问 → 选 Qwen" + echo -e " 豆包 → 选 Volcano Engine" + echo "" + read -p " 按回车启动配置向导..." + run_oc onboard } -# [1] 一键安装到电脑 -do_install() { +# [2] Web dashboard +do_dashboard() { echo "" - echo -e " ${CYAN}${BOLD}━━━ 一键安装 OpenClaw 到电脑 ━━━${NC}" + echo -e " ${CYAN}启动网页控制台...${NC}" echo "" - echo -e " ${YELLOW}提醒:如果这是老电脑、临时电脑、公司电脑或别人的电脑,${NC}" - echo -e " ${YELLOW}更推荐返回主菜单选择 [4] 从 U 盘运行,不要安装到本机。${NC}" - echo "" - bash "$UCLAW_DIR/安装到电脑.command" -} + cd "$CORE_DIR" -# [2] 安装依赖 -do_npm_install() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 安装 npm 依赖 ━━━${NC}" - echo "" - cd "$OPENCLAW_DIR" - echo -e " ${YELLOW}使用淘宝镜像安装...${NC}" - "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com 2>&1 - echo "" - echo -e " ${GREEN}依赖安装完成!${NC}" -} - -# [3] 构建 -do_build() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 构建 OpenClaw ━━━${NC}" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" "$NPM_BIN" run build 2>&1 - echo "" - echo -e " ${GREEN}构建完成!${NC}" -} - -# [4] 直接运行 -do_run() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 从 U 盘启动 OpenClaw ━━━${NC}" - echo "" - echo -e " ${GREEN}便携模式说明:配置、状态、记忆都会写在这只 U 盘里。${NC}" - echo -e " ${GREEN}拔掉 U 盘后当前会话会结束,但换一台电脑再插上还能继续用。${NC}" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - if [ ! -f "$CONFIG_PATH" ]; then - echo -e " ${YELLOW}检测到你还没有完成首次配置。${NC}" - echo " 首次配置会保存在 U 盘中,不会默认写进这台电脑。" - echo "" - read -p " 现在开始首次配置? (y/n) " -n 1 -r - echo "" - echo "" - if [[ $REPLY =~ ^[Yy]$ ]]; then - "$NODE_BIN" openclaw.mjs onboard - echo "" - echo -e " ${GREEN}首次配置完成,已保存到 U 盘。${NC}" - echo " 接下来可以选 [17] 打开网页控制台。" + # Find free port + local PORT=18789 + while lsof -i :$PORT >/dev/null 2>&1; do + PORT=$((PORT + 1)) + if [ $PORT -gt 18799 ]; then + echo -e " ${RED}端口 18789-18799 全被占用${NC}" + return fi - else - start_gateway - fi -} + done + + local TOKEN=$(python3 -c "import json,os; p='$CONFIG_PATH'; d=json.load(open(p)) if os.path.exists(p) else {}; print(d.get('gateway',{}).get('auth',{}).get('token','uclaw'))" 2>/dev/null || echo "uclaw") + + "$NODE_BIN" openclaw.mjs gateway run --allow-unconfigured --force --port $PORT & + local PID=$! -start_gateway() { - echo -e " ${GREEN}正在启动网关服务...${NC}" - echo " 此窗口不要关闭,关闭后服务会停止。" - echo "" - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs gateway run --allow-unconfigured --force & - local GW_PID=$! for i in $(seq 1 30); do sleep 0.5 - if curl -s -o /dev/null http://127.0.0.1:18789/ 2>/dev/null; then - local TOKEN - TOKEN=$(python3 -c "import json; d=json.load(open('$CONFIG_PATH')); print(d.get('gateway',{}).get('auth',{}).get('token',''))" 2>/dev/null) - local URL="http://127.0.0.1:18789/#token=${TOKEN}" - echo "" - echo -e " ${GREEN}控制台地址: ${URL}${NC}" + if curl --noproxy '*' -s -o /dev/null "http://127.0.0.1:$PORT/" 2>/dev/null; then + local URL="http://127.0.0.1:$PORT/#token=$TOKEN" + echo -e " ${GREEN}控制台: $URL${NC}" open "$URL" 2>/dev/null break fi done - wait $GW_PID + + echo " 关闭此窗口会停止服务" + wait $PID } -do_dashboard() { +# [3] QQ Bot (pre-installed) +do_qq() { echo "" - echo -e " ${CYAN}${BOLD}━━━ 启动网关 + 打开网页控制台 ━━━${NC}" + echo -e " ${CYAN}${BOLD}━━━ 接入 QQ 机器人 ━━━${NC}" echo "" - ensure_deps - cd "$OPENCLAW_DIR" - if [ ! -f "$CONFIG_PATH" ]; then - echo -e " ${YELLOW}你还没有完成 U 盘便携配置。请先选 [4] 从 U 盘运行。${NC}" + echo -e " ${GREEN}QQ 插件已预装!只需输入 AppID 和 AppSecret。${NC}" + echo "" + echo " 获取方式: 访问 q.qq.com → 创建机器人" + echo "" + read -p " AppID: " QQ_ID + read -p " AppSecret: " QQ_SECRET + echo "" + + if [ -z "$QQ_ID" ] || [ -z "$QQ_SECRET" ]; then + echo -e " ${YELLOW}已取消${NC}" return fi - start_gateway -} -# 运行 openclaw 命令(便携模式) -run_openclaw() { - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs "$@" -} - -# [5] 配置 AI 模型(直接用 OpenClaw 自带的配置向导) -do_china_models() { + run_oc channels add --channel qqbot --token "${QQ_ID}:${QQ_SECRET}" 2>&1 || true echo "" - echo -e " ${CYAN}${BOLD}━━━ 首次配置向导 ━━━${NC}" - echo "" - echo -e " ${WHITE}${BOLD}国产模型选择提示:${NC}" - echo "" - echo -e " ${GREEN}DeepSeek${NC} → 选 ${YELLOW}Custom Provider${NC}" - echo -e " Base URL: ${CYAN}https://api.deepseek.com/v1${NC}" - echo -e " 模型名: ${CYAN}deepseek-chat${NC}" - echo -e " ${GREEN}Kimi${NC} → 选 ${YELLOW}Moonshot AI${NC}" - echo -e " ${GREEN}通义千问${NC} → 选 ${YELLOW}Qwen${NC}" - echo -e " ${GREEN}MiniMax${NC} → 选 ${YELLOW}MiniMax${NC}" - echo -e " ${GREEN}豆包${NC} → 选 ${YELLOW}Volcano Engine${NC}" - echo "" - echo -e " ${DIM}按方向键 ↑↓ 滚动列表,回车确认${NC}" - echo "" - read -p " 按回车启动配置向导..." - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - run_openclaw onboard -} - -# [6] 配置中国聊天平台 -do_china_channels() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 配置中国聊天平台 ━━━${NC}" - echo "" - echo -e " OpenClaw 支持的聊天平台:" - echo "" - echo -e " ${WHITE}${BOLD} -- 国内平台 --${NC}" - echo -e " ${GREEN}[a]${NC} 飞书 Feishu/Lark — 已内置,企业首选" - echo -e " ${GREEN}[b]${NC} QQ(腾讯官方)${RED}★推荐${NC} — 3条命令,1分钟,免费免翻墙" - echo -e " ${GREEN}[c]${NC} 微信(社区插件) — iPad协议,文字/图片/文件" - echo -e " ${GRAY}[d]${NC} 企业微信 WeCom — 后续集成" - echo -e " ${GRAY}[e]${NC} 钉钉 DingTalk — 后续集成" - echo "" - echo -e " ${WHITE}${BOLD} -- 国际平台 --${NC}" - echo -e " ${GREEN}[f]${NC} Telegram — 推荐,简单好用" - echo -e " ${GREEN}[g]${NC} Discord — 游戏/社区" - echo -e " ${GREEN}[h]${NC} WhatsApp — 海外用户" - echo -e " ${GREEN}[i]${NC} Slack — 外企用户" - echo "" - read -p " 请选择 (a-i): " -n 1 CH_CHOICE - echo "" - echo "" - - case $CH_CHOICE in - a) - echo -e " ${CYAN}配置飞书 Feishu${NC}" - echo "" - echo " 飞书机器人配置步骤:" - echo " 1. 访问 https://open.feishu.cn/app 创建应用" - echo " 2. 获取 App ID 和 App Secret" - echo " 3. 配置事件订阅和权限" - echo "" - echo " 详细文档: openclaw/docs/channels/feishu.md" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - echo -e " ${YELLOW}启动 OpenClaw 配置向导...${NC}" - "$NODE_BIN" openclaw.mjs onboard 2>&1 || true - ;; - b) - echo -e " ${CYAN}${BOLD}配置 QQ(腾讯官方接入)${NC}" - echo "" - echo -e " ${GREEN}${BOLD}这是国内最简单的 AI 助手接入方式!${NC}" - echo -e " ${GREEN}全程 1 分钟,完全免费,无需翻墙。${NC}" - echo "" - echo -e " ${WHITE}${BOLD}步骤:${NC}" - echo "" - echo " 1. 扫码注册 QQ 机器人:" - echo -e " ${CYAN}http://q.qq.com/qqbot/openclaw/login.html${NC}" - echo "" - echo " 2. 点击「创建机器人」,获取 AppID 和 AppSecret" - echo "" - echo " 3. 运行以下 3 条命令:" - echo "" - echo -e " ${GREEN}openclaw plugins install @sliverp/qqbot@latest${NC}" - echo -e " ${GREEN}openclaw channels add --channel qqbot --token \"AppID:AppSecret\"${NC}" - echo -e " ${GREEN}openclaw gateway restart${NC}" - echo "" - echo -e " ${RED}⚠️ 安全提醒:${NC}" - echo " 默认任何人都能访问你的机器人!接入后请设置白名单:" - echo -e " ${YELLOW}openclaw config set channels.qqbot.allowFrom \"你的QQ号\"${NC}" - echo "" - echo -e " ${DIM}备选方案: 也可以用 NapCatQQ (OneBot v11) 接入${NC}" - echo -e " ${DIM}https://github.com/NapNeko/NapCatQQ/releases${NC}" - echo "" - - # 如果已安装 OpenClaw,直接帮用户执行 - if [ -d "$OPENCLAW_DIR/dist" ]; then - read -p " 是否现在安装 QQ 插件? (y/n) " -n 1 DO_QQ - echo "" - if [[ "$DO_QQ" =~ ^[Yy]$ ]]; then - cd "$OPENCLAW_DIR" - echo "" - echo -e " ${YELLOW}正在安装 QQ 插件...${NC}" - "$NODE_BIN" openclaw.mjs plugins install @sliverp/qqbot@latest 2>&1 || true - echo "" - echo -e " ${WHITE}请输入 QQ 机器人信息(在 q.qq.com 后台查看):${NC}" - echo "" - read -p " AppID: " QQ_APP_ID - echo "" - read -p " AppSecret: " QQ_APP_SECRET - echo "" - if [ -n "$QQ_APP_ID" ] && [ -n "$QQ_APP_SECRET" ]; then - echo -e " ${YELLOW}正在绑定 QQ 机器人...${NC}" - "$NODE_BIN" openclaw.mjs channels add --channel qqbot --token "${QQ_APP_ID}:${QQ_APP_SECRET}" 2>&1 || true - echo "" - read -p " 请输入你自己的 QQ 号(设置白名单,留空跳过): " QQ_ALLOW - if [ -n "$QQ_ALLOW" ]; then - "$NODE_BIN" openclaw.mjs config set channels.qqbot.allowFrom "\"${QQ_ALLOW}\"" 2>&1 || true - echo -e " ${GREEN}白名单已设置: 仅 QQ ${QQ_ALLOW} 可访问${NC}" - fi - echo "" - echo -e " ${GREEN}QQ 机器人配置完成!${NC}" - echo -e " ${YELLOW}请重启网关后生效(主菜单选 [4] 或 [17])${NC}" - else - echo -e " ${YELLOW}已取消:AppID 或 AppSecret 为空。${NC}" - fi - fi - fi - ;; - c) - echo -e " ${CYAN}配置微信(社区插件)${NC}" - echo "" - echo " 安装微信插件:" - echo " openclaw plugins install @icesword760/openclaw-wechat" - echo "" - echo " 基于 iPad 协议,支持:" - echo " - 文字消息" - echo " - 图片发送" - echo " - 文件传输" - echo " - 关键词触发对话" - echo "" - echo " 仓库: https://github.com/icesword0760/openclaw-wechat" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - echo -e " ${YELLOW}正在安装微信插件...${NC}" - "$NODE_BIN" openclaw.mjs plugins install @icesword760/openclaw-wechat 2>&1 || \ - echo -e " ${YELLOW}安装失败,请手动安装${NC}" - ;; - d|e) - echo -e " ${YELLOW}该平台正在开发中,敬请期待${NC}" - echo " 可关注 u-claw.org 获取最新进展" - ;; - f) - echo -e " ${CYAN}配置 Telegram${NC}" - echo "" - echo " 步骤:" - echo " 1. 在 Telegram 中找 @BotFather" - echo " 2. 发送 /newbot 创建机器人" - echo " 3. 获取 Bot Token" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs onboard 2>&1 || true - ;; - g) - echo -e " ${CYAN}配置 Discord${NC}" - echo "" - echo " 步骤:" - echo " 1. 访问 https://discord.com/developers/applications" - echo " 2. 创建 Application -> Bot" - echo " 3. 获取 Bot Token" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs onboard 2>&1 || true - ;; - h|i) - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs onboard 2>&1 || true - ;; - *) - echo -e " ${YELLOW}无效选择${NC}" - ;; - esac -} - -# [7] 设置国内镜像 -do_mirror() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 设置国内镜像源 ━━━${NC}" - echo "" - - # npm 镜像 - echo -e " ${YELLOW}设置 npm 淘宝镜像...${NC}" - "$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null - cd "$OPENCLAW_DIR" 2>/dev/null - "$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null - echo -e " ${GREEN}npm 镜像已设置: registry.npmmirror.com${NC}" - - # 创建 .npmrc - NPMRC="$OPENCLAW_DIR/.npmrc" - if ! grep -q "npmmirror" "$NPMRC" 2>/dev/null; then - echo "" >> "$NPMRC" - echo "registry=https://registry.npmmirror.com" >> "$NPMRC" + read -p " 你的 QQ 号(设白名单,留空跳过): " QQ_ALLOW + if [ -n "$QQ_ALLOW" ]; then + run_oc config set channels.qqbot.allowFrom "\"${QQ_ALLOW}\"" 2>&1 || true + echo -e " ${GREEN}白名单已设置${NC}" fi - echo "" - echo -e " ${GREEN}国内镜像配置完成!${NC}" - echo " 后续 npm install 将自动使用淘宝镜像" + echo -e " ${GREEN}QQ 机器人配置完成!重启网关后生效。${NC}" } -# [8] 诊断修复 +# [4] Other platforms +do_platforms() { + echo "" + echo -e " ${CYAN}${BOLD}━━━ 其他聊天平台 ━━━${NC}" + echo "" + echo -e " ${GREEN}[a]${NC} 飞书 Feishu — 企业首选" + echo -e " ${GREEN}[b]${NC} Telegram — 海外推荐" + echo -e " ${GREEN}[c]${NC} 微信(社区插件) — iPad协议" + echo -e " ${GREEN}[d]${NC} Discord" + echo "" + read -p " 选择 (a-d): " -n 1 CH + echo "" + echo "" + + case $CH in + a) echo " 飞书: 访问 open.feishu.cn/app 创建应用" ;; + b) echo " Telegram: 找 @BotFather 创建机器人" ;; + c) + echo -e " ${YELLOW}安装微信插件...${NC}" + run_oc plugins install @icesword760/openclaw-wechat 2>&1 || true + ;; + d) echo " Discord: 访问 discord.com/developers/applications" ;; + *) echo " 无效选择" ;; + esac + echo "" + echo " 配置完成后运行配置向导 [1] 绑定平台" +} + +# [5] Doctor do_doctor() { echo "" - echo -e " ${CYAN}${BOLD}━━━ 诊断修复 ━━━${NC}" + echo -e " ${CYAN}━━━ 诊断修复 ━━━${NC}" echo "" - echo -e " ${GREEN}💡 提示: 选 [17] 可打开网页控制台,在浏览器中查看完整状态${NC}" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs doctor --repair 2>&1 || \ - echo -e " ${YELLOW}如果 doctor 无法运行,请先完成安装步骤${NC}" + run_oc doctor --repair 2>&1 || echo -e " ${YELLOW}诊断命令执行失败${NC}" } -# [9] 备份 +# [6] Backup do_backup() { echo "" - echo -e " ${CYAN}${BOLD}━━━ 备份当前状态 ━━━${NC}" + local TS=$(date +%Y%m%d_%H%M%S) + local BK="$DATA_DIR/backups/backup_$TS" + mkdir -p "$BK" + + [ -f "$CONFIG_PATH" ] && cp "$CONFIG_PATH" "$BK/" && echo -e " ${GREEN} + openclaw.json${NC}" + [ -d "$DATA_DIR/memory" ] && cp -R "$DATA_DIR/memory" "$BK/" 2>/dev/null && echo -e " ${GREEN} + memory/${NC}" + echo "" - - BACKUP_DIR="$UCLAW_DIR/backups" - TIMESTAMP=$(date +%Y%m%d_%H%M%S) - BACKUP_NAME="backup_${TIMESTAMP}" - BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME" - - mkdir -p "$BACKUP_PATH" - - echo -e " ${YELLOW}备份中...${NC}" - - # 备份配置 - if [ -f "$OPENCLAW_DIR/.env" ]; then - cp "$OPENCLAW_DIR/.env" "$BACKUP_PATH/.env" - echo -e " ${GREEN} ✓ .env 配置${NC}" - fi - - # 备份 OpenClaw 状态 - if [ -d "$HOME/.openclaw" ]; then - mkdir -p "$BACKUP_PATH/openclaw-state" - cp -R "$HOME/.openclaw/openclaw.json" "$BACKUP_PATH/openclaw-state/" 2>/dev/null || true - cp -R "$HOME/.openclaw/credentials" "$BACKUP_PATH/openclaw-state/" 2>/dev/null || true - echo -e " ${GREEN} ✓ OpenClaw 状态和凭据${NC}" - fi - - # 备份 U-Claw 用户数据 - if [ -d "$UCLAW_DIR/memory" ] && [ "$(ls -A "$UCLAW_DIR/memory" 2>/dev/null)" ]; then - cp -R "$UCLAW_DIR/memory" "$BACKUP_PATH/" - echo -e " ${GREEN} ✓ 记忆文件${NC}" - fi - if [ -d "$UCLAW_DIR/persona" ] && [ "$(ls -A "$UCLAW_DIR/persona" 2>/dev/null)" ]; then - cp -R "$UCLAW_DIR/persona" "$BACKUP_PATH/" - echo -e " ${GREEN} ✓ 人格配置${NC}" - fi - - # 备份已安装的版本 - if [ -d "$HOME/.uclaw/openclaw" ]; then - cp "$HOME/.uclaw/openclaw/.env" "$BACKUP_PATH/installed-env" 2>/dev/null || true - echo -e " ${GREEN} ✓ 已安装版本配置${NC}" - fi - - BACKUP_SIZE=$(du -sh "$BACKUP_PATH" | cut -f1) - echo "" - echo -e " ${GREEN}备份完成!${NC}" - echo " 位置: $BACKUP_PATH" - echo " 大小: $BACKUP_SIZE" - echo "" - - # 显示所有备份 - echo " 所有备份:" - ls -1 "$BACKUP_DIR" 2>/dev/null | while read -r b; do - echo " - $b" - done + echo -e " ${GREEN}备份完成: $BK${NC}" + echo " 大小: $(du -sh "$BK" | cut -f1)" } -# [10] 恢复备份 +# [7] Restore do_restore() { echo "" - echo -e " ${CYAN}${BOLD}━━━ 恢复备份 ━━━${NC}" - echo "" - - BACKUP_DIR="$UCLAW_DIR/backups" - if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR" 2>/dev/null)" ]; then - echo -e " ${YELLOW}没有找到任何备份${NC}" - echo " 请先使用 [9] 创建备份" + local BK_DIR="$DATA_DIR/backups" + if [ ! -d "$BK_DIR" ] || [ -z "$(ls -A "$BK_DIR" 2>/dev/null)" ]; then + echo -e " ${YELLOW}没有备份${NC}" return fi echo " 可用备份:" - echo "" local i=1 - for b in "$BACKUP_DIR"/*/; do - local bname=$(basename "$b") - local bsize=$(du -sh "$b" | cut -f1) - echo -e " ${GREEN}[$i]${NC} $bname ($bsize)" + for b in "$BK_DIR"/*/; do + echo -e " ${GREEN}[$i]${NC} $(basename "$b") ($(du -sh "$b" | cut -f1))" i=$((i+1)) done echo "" - read -p " 选择要恢复的备份编号: " RESTORE_NUM + read -p " 选择编号: " NUM local j=1 - local RESTORE_PATH="" - for b in "$BACKUP_DIR"/*/; do - if [ "$j" = "$RESTORE_NUM" ]; then - RESTORE_PATH="$b" - break + for b in "$BK_DIR"/*/; do + if [ "$j" = "$NUM" ]; then + [ -f "$b/openclaw.json" ] && cp "$b/openclaw.json" "$CONFIG_PATH" && echo -e " ${GREEN} + 配置已恢复${NC}" + [ -d "$b/memory" ] && cp -R "$b/memory" "$DATA_DIR/" && echo -e " ${GREEN} + 记忆已恢复${NC}" + echo -e " ${GREEN}恢复完成${NC}" + return fi j=$((j+1)) done - - if [ -z "$RESTORE_PATH" ]; then - echo -e " ${RED}无效选择${NC}" - return - fi - - echo "" - echo -e " ${YELLOW}正在恢复 $(basename "$RESTORE_PATH")...${NC}" - - # 恢复 .env - if [ -f "$RESTORE_PATH/.env" ]; then - cp "$RESTORE_PATH/.env" "$OPENCLAW_DIR/.env" - echo -e " ${GREEN} ✓ .env 已恢复${NC}" - fi - - # 恢复 OpenClaw 状态 - if [ -d "$RESTORE_PATH/openclaw-state" ]; then - mkdir -p "$HOME/.openclaw" - cp -R "$RESTORE_PATH/openclaw-state/"* "$HOME/.openclaw/" 2>/dev/null || true - echo -e " ${GREEN} ✓ OpenClaw 状态已恢复${NC}" - fi - - # 恢复用户数据 - if [ -d "$RESTORE_PATH/memory" ]; then - cp -R "$RESTORE_PATH/memory" "$UCLAW_DIR/" - echo -e " ${GREEN} ✓ 记忆文件已恢复${NC}" - fi - if [ -d "$RESTORE_PATH/persona" ]; then - cp -R "$RESTORE_PATH/persona" "$UCLAW_DIR/" - echo -e " ${GREEN} ✓ 人格配置已恢复${NC}" - fi - - echo "" - echo -e " ${GREEN}恢复完成!${NC}" + echo -e " ${RED}无效选择${NC}" } -# [11] 重置 -do_reset() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 重置 OpenClaw ━━━${NC}" - echo "" - echo -e " ${RED}警告: 重置将清除配置和状态数据${NC}" - echo "" - echo -e " ${GREEN}[1]${NC} 仅重置配置(保留凭据和会话)" - echo -e " ${YELLOW}[2]${NC} 重置配置 + 凭据 + 会话(保留工作区)" - echo -e " ${RED}[3]${NC} 完全重置(恢复出厂状态)" - echo -e " ${DIM}[0]${NC} 取消" - echo "" - read -p " 选择重置级别: " -n 1 RESET_CHOICE - echo "" - - case $RESET_CHOICE in - 1) - echo "" - echo -e " ${YELLOW}建议先备份! 是否先创建备份? (y/n)${NC}" - read -n 1 DO_BACKUP - echo "" - [ "$DO_BACKUP" = "y" ] && do_backup - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs reset --scope config 2>&1 || true - ;; - 2) - echo "" - echo -e " ${YELLOW}建议先备份! 是否先创建备份? (y/n)${NC}" - read -n 1 DO_BACKUP - echo "" - [ "$DO_BACKUP" = "y" ] && do_backup - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs reset --scope config+creds+sessions 2>&1 || true - ;; - 3) - echo "" - echo -e " ${RED}确定要完全重置吗? 输入 YES 确认:${NC} " - read CONFIRM - if [ "$CONFIRM" = "YES" ]; then - do_backup - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs reset --scope full 2>&1 || true - echo -e " ${GREEN}已恢复出厂状态${NC}" - else - echo " 已取消" - fi - ;; - *) - echo " 已取消" - ;; - esac -} - -# [12] 清理 -do_cleanup() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 清理缓存和临时文件 ━━━${NC}" - echo "" - - FREED=0 - - # 清理 npm 缓存 - echo -e " ${YELLOW}清理 npm 缓存...${NC}" - CACHE_SIZE=$("$NODE_BIN" "$NPM_BIN" cache ls 2>/dev/null | wc -l || echo 0) - "$NODE_BIN" "$NPM_BIN" cache clean --force 2>/dev/null || true - echo -e " ${GREEN} ✓ npm 缓存已清理${NC}" - - # 清理 Node.js 编译缓存 - if [ -d "$HOME/.cache/node" ]; then - NSIZE=$(du -sm "$HOME/.cache/node" 2>/dev/null | cut -f1) - rm -rf "$HOME/.cache/node" - echo -e " ${GREEN} ✓ Node 编译缓存已清理 (${NSIZE}MB)${NC}" - fi - - # 清理 OpenClaw 日志 - if [ -d "$HOME/.openclaw/logs" ]; then - LSIZE=$(du -sm "$HOME/.openclaw/logs" 2>/dev/null | cut -f1) - rm -rf "$HOME/.openclaw/logs" - echo -e " ${GREEN} ✓ 日志已清理 (${LSIZE:-0}MB)${NC}" - fi - - echo "" - echo -e " ${GREEN}清理完成!${NC}" -} - -# [13] 技能浏览器 -do_skills_browser() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 预装技能浏览器(52个,已离线可用)━━━${NC}" - echo "" - echo -e " ${WHITE}${BOLD} 效率 & 编程${NC}" - echo -e " ${GREEN} github${NC} GitHub 操作(Issues/PR/代码审查/CI)" - echo -e " ${GREEN} gh-issues${NC} 获取 Issues 并分配 Agent 修复" - echo -e " ${GREEN} coding-agent${NC} 委派编程任务给 Codex/Claude/Pi" - echo -e " ${GREEN} summarize${NC} 总结文本/网页/播客/视频" - echo -e " ${GREEN} nano-pdf${NC} 自然语言编辑 PDF" - echo -e " ${GREEN} clawhub${NC} 搜索安装更多社区技能" - echo -e " ${GREEN} skill-creator${NC} 创建自定义技能" - echo "" - echo -e " ${WHITE}${BOLD} 笔记 & 任务管理${NC}" - echo -e " ${GREEN} apple-notes${NC} Apple 备忘录(创建/搜索/编辑)" - echo -e " ${GREEN} apple-reminders${NC} Apple 提醒事项" - echo -e " ${GREEN} obsidian${NC} Obsidian 笔记操作" - echo -e " ${GREEN} notion${NC} Notion 页面和数据库" - echo -e " ${GREEN} things-mac${NC} Things 3 任务管理 (macOS)" - echo -e " ${GREEN} trello${NC} Trello 看板操作" - echo -e " ${GREEN} bear-notes${NC} Bear 笔记" - echo "" - echo -e " ${WHITE}${BOLD} AI & 创作${NC}" - echo -e " ${GREEN} openai-image-gen${NC} AI 图片生成" - echo -e " ${GREEN} openai-whisper${NC} 语音转文字(本地)" - echo -e " ${GREEN} openai-whisper-api${NC} 语音转文字(API)" - echo -e " ${GREEN} gemini${NC} Gemini 一键问答" - echo -e " ${GREEN} sag${NC} ElevenLabs 文字转语音" - echo -e " ${GREEN} sherpa-onnx-tts${NC} 本地离线文字转语音" - echo -e " ${GREEN} nano-banana-pro${NC} Gemini 3 图片生成" - echo "" - echo -e " ${WHITE}${BOLD} 通讯 & 社交${NC}" - echo -e " ${GREEN} himalaya${NC} 邮件收发(IMAP/SMTP)" - echo -e " ${GREEN} discord${NC} Discord 消息操作" - echo -e " ${GREEN} slack${NC} Slack 消息操作" - echo -e " ${GREEN} wacli${NC} WhatsApp 消息和历史" - echo -e " ${GREEN} imsg${NC} iMessage/SMS" - echo -e " ${GREEN} xurl${NC} X (Twitter) API" - echo "" - echo -e " ${WHITE}${BOLD} 系统 & 工具${NC}" - echo -e " ${GREEN} weather${NC} 天气查询" - echo -e " ${GREEN} peekaboo${NC} macOS 屏幕截图和 UI 自动化" - echo -e " ${GREEN} tmux${NC} 远程终端管理" - echo -e " ${GREEN} healthcheck${NC} 系统安全检查" - echo -e " ${GREEN} 1password${NC} 1Password 密码管理" - echo -e " ${GREEN} video-frames${NC} 视频截帧 (ffmpeg)" - echo -e " ${GREEN} session-logs${NC} 会话日志搜索分析" - echo -e " ${GREEN} mcporter${NC} MCP 服务管理" - echo "" - echo -e " ${WHITE}${BOLD} 智能家居 & IoT${NC}" - echo -e " ${GREEN} openhue${NC} Philips Hue 灯光控制" - echo -e " ${GREEN} sonoscli${NC} Sonos 音箱控制" - echo -e " ${GREEN} eightctl${NC} Eight Sleep 智能床垫" - echo -e " ${GREEN} camsnap${NC} 摄像头截图/录像" - echo "" - echo -e " ${DIM} 提示: 这些技能已全部预装在 U 盘中,无需联网下载${NC}" - echo -e " ${DIM} 使用: 在 OpenClaw 中直接说 \"帮我查天气\" 或 \"帮我发邮件\" 即可${NC}" - echo -e " ${DIM} 更多: 运行 openclaw 后输入 /skills 查看详情${NC}" -} - -# [14] 中国用户指南 -do_china_guide() { - echo "" - if [ -f "$UCLAW_DIR/中国用户指南.txt" ]; then - cat "$UCLAW_DIR/中国用户指南.txt" - else - echo " 指南文件不存在" - fi -} - -# [15] 使用说明 -do_readme() { - echo "" - if [ -f "$UCLAW_DIR/使用说明.txt" ]; then - cat "$UCLAW_DIR/使用说明.txt" - else - echo " 使用说明文件不存在" - fi -} - -# [16] 系统信息 +# [8] System info do_sysinfo() { echo "" - echo -e " ${CYAN}${BOLD}━━━ 系统信息 ━━━${NC}" - echo "" - echo " 操作系统: $(sw_vers -productName 2>/dev/null || uname -s) $(sw_vers -productVersion 2>/dev/null || uname -r)" - echo " CPU架构: $(uname -m)" - echo " 内存: $(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.1f GB", $1/1024/1024/1024}' || echo '未知')" - echo " Node.js: $($NODE_BIN --version 2>/dev/null || echo '未找到')" - echo " npm: $($NODE_BIN $NPM_BIN --version 2>/dev/null || echo '未找到')" - echo "" - echo " U-Claw 路径: $UCLAW_DIR" - echo " U-Claw 大小: $(du -sh "$UCLAW_DIR" 2>/dev/null | cut -f1)" - echo "" - if [ -d "$HOME/.uclaw" ]; then - echo " 已安装路径: $HOME/.uclaw" - echo " 已安装大小: $(du -sh "$HOME/.uclaw" 2>/dev/null | cut -f1)" - else - echo " 电脑安装: 未安装" - fi - echo "" - if [ -d "$HOME/.openclaw" ]; then - echo " OpenClaw 状态: $HOME/.openclaw" - echo " 状态大小: $(du -sh "$HOME/.openclaw" 2>/dev/null | cut -f1)" - fi - echo "" - echo " 磁盘空间: $(df -h "$UCLAW_DIR" 2>/dev/null | tail -1 | awk '{print $4 " 可用 / " $2 " 总计"}')" + echo " 系统: $(sw_vers -productName 2>/dev/null) $(sw_vers -productVersion 2>/dev/null)" + echo " CPU: $(uname -m)" + echo " 内存: $(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.0f GB", $1/1024/1024/1024}')" + echo " Node: $("$NODE_BIN" --version 2>/dev/null)" + echo " 路径: $UCLAW_DIR" + echo " 大小: $(du -sh "$UCLAW_DIR" 2>/dev/null | cut -f1)" + echo " 磁盘: $(df -h "$UCLAW_DIR" | tail -1 | awk '{print $4 " 可用"}')" } -# 主循环 +# Main loop while true; do show_menu - read -p " 请选择 [0-16]: " CHOICE + read -p " 请选择 [0-8]: " CHOICE echo "" case $CHOICE in - 1) do_install ;; - 2) do_npm_install ;; - 3) do_build ;; - 4) do_run ;; - 5) do_china_models ;; - 6) do_china_channels ;; - 7) do_mirror ;; - 8) do_doctor ;; - 9) do_backup ;; - 10) do_restore ;; - 11) do_reset ;; - 12) do_cleanup ;; - 13) do_skills_browser ;; - 14) do_china_guide ;; - 15) do_readme ;; - 16) do_sysinfo ;; - 17) do_dashboard ;; - 0) - echo -e " ${CYAN}再见! 🦞${NC}" - echo "" - exit 0 - ;; - *) - echo -e " ${RED}无效选择,请输入 0-17${NC}" - ;; + 1) do_config ;; + 2) do_dashboard ;; + 3) do_qq ;; + 4) do_platforms ;; + 5) do_doctor ;; + 6) do_backup ;; + 7) do_restore ;; + 8) do_sysinfo ;; + 0) echo -e " ${CYAN}再见!${NC}"; exit 0 ;; + *) echo -e " ${RED}无效选择${NC}" ;; esac echo "" - read -p " 按回车键返回主菜单..." + read -p " 按回车返回..." done diff --git a/portable/Windows-Menu.bat b/portable/Windows-Menu.bat index cd61e5e..5381694 100644 --- a/portable/Windows-Menu.bat +++ b/portable/Windows-Menu.bat @@ -1,6 +1,6 @@ @echo off chcp 65001 >/dev/null 2>&1 -title U-Claw - Full Menu +title U-Claw Menu set "UCLAW_DIR=%~dp0" set "CORE_DIR=%UCLAW_DIR%app\core" @@ -8,12 +8,11 @@ set "DATA_DIR=%UCLAW_DIR%data" set "STATE_DIR=%DATA_DIR%\.openclaw" set "NODE_DIR=%UCLAW_DIR%app\runtime\node-win-x64" set "NODE_BIN=%NODE_DIR%\node.exe" -set "NPM_BIN=%NODE_DIR%\npm.cmd" set "OPENCLAW_HOME=%DATA_DIR%" set "OPENCLAW_STATE_DIR=%STATE_DIR%" set "OPENCLAW_CONFIG_PATH=%STATE_DIR%\openclaw.json" -set "PATH=%NODE_DIR%;%NODE_DIR%\node_modules\.bin;%PATH%" +set "PATH=%NODE_DIR%;%PATH%" if not exist "%STATE_DIR%" mkdir "%STATE_DIR%" if not exist "%DATA_DIR%\memory" mkdir "%DATA_DIR%\memory" @@ -23,184 +22,63 @@ if not exist "%DATA_DIR%\backups" mkdir "%DATA_DIR%\backups" cls echo. echo ======================================== -echo U-Claw v1.1 - Full Menu +echo U-Claw v1.1 - Menu +echo Portable AI Agent echo ======================================== echo. if exist "%NODE_BIN%" ( - for /f "tokens=*" %%v in ('"%NODE_BIN%" --version') do echo Node.js: %%v + for /f "tokens=*" %%v in ('"%%NODE_BIN%%" --version') do echo Node: %%v ) else ( echo [!] Node.js not found ) -if exist "%CORE_DIR%\node_modules" (echo Dependencies: OK) else (echo Dependencies: NOT INSTALLED) -if exist "%CORE_DIR%\dist" (echo Build: OK) else (echo Build: NOT BUILT) if exist "%STATE_DIR%\openclaw.json" (echo Config: OK) else (echo Config: NOT SET) echo. -echo -- Start -- -echo [1] Quick start (gateway + browser) -echo [2] Setup wizard (choose model, API key) +echo -- Config -- +echo [1] Setup wizard (model, API key) +echo [2] Open web dashboard echo. -echo -- China Platforms -- -echo [3] QQ Bot setup (Tencent official) -echo [4] Feishu / DingTalk / WeChat -echo. -echo -- Skills -- -echo [5] Browse pre-installed skills (52) -echo [6] Install skill from ClawHub +echo -- Chat Platforms -- +echo [3] QQ Bot (pre-installed, enter ID only) +echo [4] Other platforms (Feishu/Telegram/WeChat) echo. echo -- Maintenance -- -echo [7] Diagnostics (openclaw doctor) -echo [8] Backup config and memory -echo [9] Restore backup -echo [10] Reset (factory default) +echo [5] Diagnostics +echo [6] Backup config +echo [7] Restore backup +echo [8] System info echo. -echo -- Other -- -echo [11] Open web dashboard -echo [12] System info -echo [13] Set China mirror echo [0] Exit echo. -set /p choice=" Choose [0-13]: " +set /p choice=" Choose [0-8]: " -if "%choice%"=="1" goto :start -if "%choice%"=="2" goto :onboard +if "%choice%"=="1" goto :onboard +if "%choice%"=="2" goto :dashboard if "%choice%"=="3" goto :qqbot if "%choice%"=="4" goto :channels -if "%choice%"=="5" goto :skills -if "%choice%"=="6" goto :install_skill -if "%choice%"=="7" goto :doctor -if "%choice%"=="8" goto :backup -if "%choice%"=="9" goto :restore -if "%choice%"=="10" goto :reset -if "%choice%"=="11" goto :dashboard -if "%choice%"=="12" goto :sysinfo -if "%choice%"=="13" goto :mirror +if "%choice%"=="5" goto :doctor +if "%choice%"=="6" goto :backup +if "%choice%"=="7" goto :restore +if "%choice%"=="8" goto :sysinfo if "%choice%"=="0" exit /b 0 echo Invalid choice pause goto :menu -:start -call "%UCLAW_DIR%start.bat" -goto :end - :onboard +echo. +echo === Setup Wizard === +echo. +echo DeepSeek - Custom Provider, URL: https://api.deepseek.com/v1 +echo Kimi - Moonshot AI +echo Qwen - Qwen +echo Doubao - Volcano Engine +echo. cd /d "%CORE_DIR%" "%NODE_BIN%" openclaw.mjs onboard pause goto :menu -:qqbot -echo. -echo === QQ Bot Setup (Tencent Official) === -echo. -echo 1. Register: http://q.qq.com/qqbot/openclaw/login.html -echo 2. Create bot, get AppID and AppSecret -echo 3. Run these commands: -echo. -echo openclaw plugins install @sliverp/qqbot@latest -echo openclaw channels add --channel qqbot --token "AppID:AppSecret" -echo openclaw config set channels.qqbot.allowFrom "your_qq_number" -echo openclaw gateway restart -echo. -set /p qqinstall=" Install QQ plugin now? (y/n): " -if /i "%qqinstall%"=="y" ( - cd /d "%CORE_DIR%" - "%NODE_BIN%" openclaw.mjs plugins install @sliverp/qqbot@latest - echo. - set /p qqid=" AppID: " - set /p qqsecret=" AppSecret: " - if not "%qqid%"=="" if not "%qqsecret%"=="" ( - "%NODE_BIN%" openclaw.mjs channels add --channel qqbot --token "%qqid%:%qqsecret%" - set /p qqallow=" Your QQ number (allowlist): " - if not "%qqallow%"=="" "%NODE_BIN%" openclaw.mjs config set channels.qqbot.allowFrom "%qqallow%" - echo QQ Bot configured! - ) -) -pause -goto :menu - -:channels -echo. -echo === Chat Platforms === -echo. -echo [a] Feishu - https://open.feishu.cn/app -echo [b] WeChat - openclaw plugins install @icesword760/openclaw-wechat -echo [c] DingTalk - built-in -echo [d] Telegram / Discord / WhatsApp / Slack - built-in -echo. -echo Use [2] Setup wizard to configure these platforms. -pause -goto :menu - -:skills -echo. -echo === Pre-installed Skills (52) === -echo. -echo Productivity: github, coding-agent, summarize, nano-pdf, clawhub -echo Notes: apple-notes, obsidian, notion, trello, bear-notes -echo AI: openai-image-gen, openai-whisper, gemini, sherpa-onnx-tts -echo Social: himalaya (email), discord, slack, wacli (WhatsApp) -echo System: weather, peekaboo, tmux, healthcheck, 1password -echo IoT: openhue, sonoscli, eightctl, camsnap -echo. -echo Use "openclaw skills list" for full list. -pause -goto :menu - -:install_skill -echo. -set /p skillname=" Skill name: " -if not "%skillname%"=="" ( - cd /d "%CORE_DIR%" - "%NODE_BIN%" openclaw.mjs skills install %skillname% -) -pause -goto :menu - -:doctor -cd /d "%CORE_DIR%" -"%NODE_BIN%" openclaw.mjs doctor --repair -pause -goto :menu - -:backup -echo. -set "TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%" -set "TIMESTAMP=%TIMESTAMP: =0%" -set "BACKUP_PATH=%DATA_DIR%\backups\backup_%TIMESTAMP%" -mkdir "%BACKUP_PATH%" 2>/dev/null -if exist "%STATE_DIR%\openclaw.json" copy "%STATE_DIR%\openclaw.json" "%BACKUP_PATH%\" >/dev/null -if exist "%DATA_DIR%\memory" xcopy /s /q "%DATA_DIR%\memory" "%BACKUP_PATH%\memory\" >/dev/null 2>/dev/null -echo Backup saved to: %BACKUP_PATH% -pause -goto :menu - -:restore -echo. -echo Backups: -dir /b "%DATA_DIR%\backups\" 2>/dev/null -echo. -set /p restorename=" Backup folder name: " -if exist "%DATA_DIR%\backups\%restorename%\openclaw.json" ( - copy "%DATA_DIR%\backups\%restorename%\openclaw.json" "%STATE_DIR%\" >/dev/null - echo Config restored! -) -pause -goto :menu - -:reset -echo. -echo WARNING: This will reset your config! -set /p confirm=" Type YES to confirm: " -if "%confirm%"=="YES" ( - del "%STATE_DIR%\openclaw.json" 2>/dev/null - echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}} > "%STATE_DIR%\openclaw.json" - echo Reset complete. -) -pause -goto :menu - :dashboard echo. echo Starting gateway... @@ -221,22 +99,82 @@ start "" http://127.0.0.1:%PORT%/#token=uclaw pause goto :menu +:qqbot +echo. +echo === QQ Bot Setup === +echo. +echo QQ plugin is pre-installed! +echo You only need your AppID and AppSecret. +echo. +echo Get them at: q.qq.com (create a bot) +echo. +set /p qqid=" AppID: " +set /p qqsecret=" AppSecret: " +if "%qqid%"=="" goto :qq_cancel +if "%qqsecret%"=="" goto :qq_cancel +cd /d "%CORE_DIR%" +"%NODE_BIN%" openclaw.mjs channels add --channel qqbot --token "%qqid%:%qqsecret%" +echo. +set /p qqallow=" Your QQ number (allowlist, empty to skip): " +if not "%qqallow%"=="" "%NODE_BIN%" openclaw.mjs config set channels.qqbot.allowFrom "%qqallow%" +echo. +echo QQ Bot configured! Restart gateway to apply. +pause +goto :menu +:qq_cancel +echo Cancelled. +pause +goto :menu + +:channels +echo. +echo === Other Platforms === +echo. +echo Feishu: Built-in. Use [1] Setup wizard. +echo Telegram: Built-in. Use [1] Setup wizard. +echo Discord: Built-in. Use [1] Setup wizard. +echo WeChat: Community plugin. +echo. +echo Use Setup wizard [1] to configure these. +pause +goto :menu + +:doctor +cd /d "%CORE_DIR%" +"%NODE_BIN%" openclaw.mjs doctor --repair +pause +goto :menu + +:backup +echo. +set "TS=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%" +set "TS=%TS: =0%" +set "BK=%DATA_DIR%\backups\backup_%TS%" +mkdir "%BK%" 2>nul +if exist "%STATE_DIR%\openclaw.json" copy "%STATE_DIR%\openclaw.json" "%BK%\" >nul +if exist "%DATA_DIR%\memory" xcopy /s /q "%DATA_DIR%\memory" "%BK%\memory\" >/dev/null 2>nul +echo Backup saved: %BK% +pause +goto :menu + +:restore +echo. +echo Available backups: +dir /b "%DATA_DIR%\backups\" 2>nul +echo. +set /p rname=" Backup folder name: " +if exist "%DATA_DIR%\backups\%rname%\openclaw.json" ( + copy "%DATA_DIR%\backups\%rname%\openclaw.json" "%STATE_DIR%\" >nul + echo Config restored! +) +pause +goto :menu + :sysinfo echo. echo OS: Windows -echo Node: "%NODE_BIN%" --version -echo U-Claw: %UCLAW_DIR% +echo Path: %UCLAW_DIR% echo Data: %DATA_DIR% pause -goto :menu - -:mirror -echo. -cd /d "%CORE_DIR%" -"%NODE_BIN%" "%NPM_BIN%" config set registry https://registry.npmmirror.com --location=project -echo npm mirror set to: registry.npmmirror.com -pause -goto :menu - -:end +goto :menu \ No newline at end of file diff --git a/tests/test-scripts.sh b/tests/test-scripts.sh deleted file mode 100644 index 251d5a1..0000000 --- a/tests/test-scripts.sh +++ /dev/null @@ -1,230 +0,0 @@ -#!/bin/bash -# ============================================================ -# U-Claw 脚本测试套件 -# 验证 Windows .bat 和 macOS .command 脚本的正确性 -# ============================================================ - -set -euo pipefail - -SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" -UCLAW_SCRIPTS="$SCRIPT_DIR/uclaw-scripts" - -PASS=0 -FAIL=0 -TOTAL=0 - -pass() { - PASS=$((PASS + 1)) - TOTAL=$((TOTAL + 1)) - echo " ✓ $1" -} - -fail() { - FAIL=$((FAIL + 1)) - TOTAL=$((TOTAL + 1)) - echo " ✗ $1" -} - -check() { - local desc="$1" - local file="$2" - local pattern="$3" - if grep -q "$pattern" "$file" 2>/dev/null; then - pass "$desc" - else - fail "$desc" - fi -} - -check_not() { - local desc="$1" - local file="$2" - local pattern="$3" - if grep -q "$pattern" "$file" 2>/dev/null; then - fail "$desc" - else - pass "$desc" - fi -} - -echo "" -echo "==========================================" -echo " U-Claw 脚本测试套件" -echo "==========================================" - -# ── 文件存在性测试 ── -echo "" -echo "── 文件存在性 ──" - -for f in "Windows-从U盘启动.bat" "Mac-从U盘启动.command" "Windows-全部功能.bat" "Mac-全部功能.command" "Windows-安装到电脑.bat" "Mac-安装到电脑.command" "使用说明.txt" "中国用户指南.txt"; do - if [ -f "$UCLAW_SCRIPTS/$f" ]; then - pass "存在: $f" - else - fail "缺失: $f" - fi -done - -# ── macOS .command 语法检查 ── -echo "" -echo "── macOS 脚本语法检查 ──" - -for f in "Mac-从U盘启动.command" "Mac-全部功能.command" "Mac-安装到电脑.command"; do - if bash -n "$UCLAW_SCRIPTS/$f" 2>/dev/null; then - pass "语法正确: $f" - else - fail "语法错误: $f" - fi -done - -# ── 运行.bat 测试 ── -echo "" -echo "── 运行.bat ──" -BAT_RUN="$UCLAW_SCRIPTS/Windows-从U盘启动.bat" - -check "设置 UTF-8 编码" "$BAT_RUN" "chcp 65001" -check "设置便携模式 OPENCLAW_HOME" "$BAT_RUN" "OPENCLAW_HOME" -check "设置便携模式 OPENCLAW_STATE_DIR" "$BAT_RUN" "OPENCLAW_STATE_DIR" -check "设置便携模式 OPENCLAW_CONFIG_PATH" "$BAT_RUN" "OPENCLAW_CONFIG_PATH" -check "使用 gateway run" "$BAT_RUN" "gateway run" -check "使用 --allow-unconfigured" "$BAT_RUN" "\-\-allow-unconfigured" -check "使用 --force" "$BAT_RUN" "\-\-force" -check "首次用户走 onboard" "$BAT_RUN" "onboard" -check "检查 Node.js 存在" "$BAT_RUN" "NODE_BIN" -check_not "不依赖 pnpm" "$BAT_RUN" "pnpm" -check "版本号 v1.1" "$BAT_RUN" "v1.1" - -# ── 运行.command 测试 ── -echo "" -echo "── 运行.command ──" -CMD_RUN="$UCLAW_SCRIPTS/Mac-从U盘启动.command" - -check "设置便携模式 OPENCLAW_HOME" "$CMD_RUN" "OPENCLAW_HOME" -check "设置便携模式 OPENCLAW_STATE_DIR" "$CMD_RUN" "OPENCLAW_STATE_DIR" -check "设置便携模式 OPENCLAW_CONFIG_PATH" "$CMD_RUN" "OPENCLAW_CONFIG_PATH" -check "使用 gateway run" "$CMD_RUN" "gateway run" -check "使用 --allow-unconfigured" "$CMD_RUN" "\-\-allow-unconfigured" -check "使用 --force" "$CMD_RUN" "\-\-force" -check "首次用户走 onboard" "$CMD_RUN" "onboard" -check "自动打开浏览器" "$CMD_RUN" 'open "$URL"' -check "检测 CPU 架构" "$CMD_RUN" "uname -m" -check "支持 arm64" "$CMD_RUN" "arm64" -check_not "不依赖 pnpm" "$CMD_RUN" "pnpm" - -# ── 启动菜单.bat 测试 ── -echo "" -echo "── 启动菜单.bat ──" -BAT_MENU="$UCLAW_SCRIPTS/Windows-全部功能.bat" - -check "设置 UTF-8 编码" "$BAT_MENU" "chcp 65001" -check "便携模式 OPENCLAW_HOME" "$BAT_MENU" "OPENCLAW_HOME" -check "有 QQ Bot 选项" "$BAT_MENU" "QQ Bot" -check "QQ AppID 单独输入" "$BAT_MENU" "AppID" -check "QQ AppSecret 单独输入" "$BAT_MENU" "AppSecret" -check "DeepSeek 模型提示" "$BAT_MENU" "deepseek" -check "Custom Provider 提示" "$BAT_MENU" "Custom Provider" -check "有控制台入口" "$BAT_MENU" "控制台" -check "gateway run 命令" "$BAT_MENU" "gateway run" -check "版本号 v1.1" "$BAT_MENU" "v1.1" -check_not "不依赖 pnpm" "$BAT_MENU" "pnpm" - -# ── 启动菜单.command 测试 ── -echo "" -echo "── 启动菜单.command ──" -CMD_MENU="$UCLAW_SCRIPTS/Mac-全部功能.command" - -check "便携模式 OPENCLAW_HOME" "$CMD_MENU" "OPENCLAW_HOME" -check "有 QQ 选项" "$CMD_MENU" "QQ" -check "QQ AppID 单独输入" "$CMD_MENU" "AppID" -check "QQ AppSecret 单独输入" "$CMD_MENU" "AppSecret" -check "DeepSeek 模型提示" "$CMD_MENU" "deepseek" -check "Custom Provider 提示" "$CMD_MENU" "Custom Provider" -check "有 dashboard 入口" "$CMD_MENU" "dashboard" -check "gateway run 命令" "$CMD_MENU" "gateway run" -check "自动打开浏览器" "$CMD_MENU" 'open "$URL"' - -# ── 安装到电脑.bat 测试 ── -echo "" -echo "── 安装到电脑.bat ──" -BAT_INSTALL="$UCLAW_SCRIPTS/Windows-安装到电脑.bat" - -check "设置 UTF-8 编码" "$BAT_INSTALL" "chcp 65001" -check "安全提醒" "$BAT_INSTALL" "安全提醒" -check "共享电脑警告" "$BAT_INSTALL" "共享电脑" -check "安装到 .uclaw" "$BAT_INSTALL" "\.uclaw" -check "创建 uclaw.cmd" "$BAT_INSTALL" "uclaw.cmd" -check "创建 openclaw.cmd" "$BAT_INSTALL" "openclaw.cmd" -check "添加到 PATH" "$BAT_INSTALL" "setx PATH" -check "PATH 长度检查" "$BAT_INSTALL" "1024" -check "Node.js 安装检查" "$BAT_INSTALL" "node.exe" -check "版本号 v1.1" "$BAT_INSTALL" "v1.1" -check_not "不备份 .env" "$BAT_INSTALL" "env-backup" - -# ── 安装到电脑.command 测试 ── -echo "" -echo "── 安装到电脑.command ──" -CMD_INSTALL="$UCLAW_SCRIPTS/Mac-安装到电脑.command" - -check "安全提醒" "$CMD_INSTALL" "安全提醒" -check "共享电脑警告" "$CMD_INSTALL" "共享电脑" -check "安装到 .uclaw" "$CMD_INSTALL" "\.uclaw" -check "检测 CPU 架构" "$CMD_INSTALL" "uname -m" -check "支持 arm64" "$CMD_INSTALL" "arm64" -check "创建 symlink" "$CMD_INSTALL" "ln -sf" -check "添加到 shell RC" "$CMD_INSTALL" "zshrc" -check "spinner 动画" "$CMD_INSTALL" "run_with_spinner" -check "set -euo pipefail" "$CMD_INSTALL" "set -euo pipefail" - -# ── 安全检查(无敏感信息泄露)── -echo "" -echo "── 安全检查 ──" - -for f in "$UCLAW_SCRIPTS"/*.bat "$UCLAW_SCRIPTS"/*.command "$UCLAW_SCRIPTS"/*.txt; do - fname=$(basename "$f") - check_not "无 API Key: $fname" "$f" "sk-[a-zA-Z0-9]\{20,\}" - check_not "无硬编码密码: $fname" "$f" "password.*=.*['\"][^'\"]\{8,\}" -done - -# ── Windows/Mac 一致性检查 ── -echo "" -echo "── 跨平台一致性 ──" - -# 两边都有 gateway run -if grep -q "gateway run" "$BAT_RUN" && grep -q "gateway run" "$CMD_RUN"; then - pass "运行脚本:两端都用 gateway run" -else - fail "运行脚本:gateway run 不一致" -fi - -# 两边都有 onboard -if grep -q "onboard" "$BAT_RUN" && grep -q "onboard" "$CMD_RUN"; then - pass "运行脚本:两端都有 onboard 流程" -else - fail "运行脚本:onboard 流程不一致" -fi - -# 两边菜单都有 QQ -if grep -q "QQ" "$BAT_MENU" && grep -q "QQ" "$CMD_MENU"; then - pass "启动菜单:两端都有 QQ 接入" -else - fail "启动菜单:QQ 接入不一致" -fi - -# 两边安装都有安全提醒 -if grep -q "安全提醒" "$BAT_INSTALL" && grep -q "安全提醒" "$CMD_INSTALL"; then - pass "安装脚本:两端都有安全提醒" -else - fail "安装脚本:安全提醒不一致" -fi - -# ── 结果汇总 ── -echo "" -echo "==========================================" -if [ $FAIL -eq 0 ]; then - echo " 全部通过! $PASS/$TOTAL" -else - echo " 失败 $FAIL 项 / 共 $TOTAL 项" -fi -echo "==========================================" -echo "" - -exit $FAIL diff --git a/uclaw-scripts/Mac-安装并启动.command b/uclaw-scripts/Mac-Install.command similarity index 61% rename from uclaw-scripts/Mac-安装并启动.command rename to uclaw-scripts/Mac-Install.command index 9635f66..1f1ad0a 100755 --- a/uclaw-scripts/Mac-安装并启动.command +++ b/uclaw-scripts/Mac-Install.command @@ -1,8 +1,5 @@ #!/bin/bash -# ============================================================ -# U-Claw 虾盘 - macOS 一键安装并启动 -# 从 U 盘解压到电脑,然后启动 OpenClaw -# ============================================================ +# U-Claw - Extract and Launch (macOS) GREEN='\033[0;32m' CYAN='\033[0;36m' @@ -15,16 +12,16 @@ echo "" echo -e "${CYAN}" echo " ╔══════════════════════════════════════╗" echo " ║ U-Claw 虾盘 v1.1 ║" -echo " ║ 一键安装并启动 (macOS) ║" +echo " ║ 一键解压并启动 (macOS) ║" echo " ╚══════════════════════════════════════╝" echo -e "${NC}" -USB_DIR="$(cd "$(dirname "$0")" && pwd)" -ARCHIVE="$USB_DIR/U-Claw.tar.gz" -INSTALL_DIR="$HOME/U-Claw" +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +ARCHIVE="$SCRIPT_DIR/U-Claw.tar.gz" +INSTALL_DIR="$SCRIPT_DIR/U-Claw" -# 移除 macOS 隔离标记(解决"无法验证开发者"弹窗) -xattr -rd com.apple.quarantine "$USB_DIR" 2>/dev/null || true +# 移除 macOS 隔离标记 +xattr -rd com.apple.quarantine "$SCRIPT_DIR" 2>/dev/null || true # 检查压缩包 if [ ! -f "$ARCHIVE" ]; then @@ -34,19 +31,19 @@ if [ ! -f "$ARCHIVE" ]; then exit 1 fi -# 检查是否已安装 +# 检查是否已解压 if [ -d "$INSTALL_DIR/app/core/node_modules" ]; then - echo -e " ${GREEN}检测到已安装的 U-Claw${NC}" + echo -e " ${GREEN}检测到已解压的 U-Claw${NC}" echo " 位置: $INSTALL_DIR" echo "" echo -e " ${YELLOW}[1] 直接启动(跳过解压)${NC}" - echo " [2] 重新安装(覆盖现有)" + echo " [2] 重新解压(覆盖现有)" echo "" read -p " 请选择 [1/2,默认1]: " choice choice="${choice:-1}" if [ "$choice" = "2" ]; then echo "" - echo -e " ${YELLOW}正在重新安装...${NC}" + echo -e " ${YELLOW}正在重新解压...${NC}" rm -rf "$INSTALL_DIR" else echo "" @@ -57,12 +54,19 @@ fi # 解压(如果需要) if [ ! -d "$INSTALL_DIR/app/core/node_modules" ]; then echo "" - echo -e " ${CYAN}正在解压 U-Claw 到 $INSTALL_DIR ...${NC}" - echo " 这可能需要 30-60 秒,请稍等..." + echo -e " ${CYAN}正在解压 U-Claw ...${NC}" + echo " 解压到: $INSTALL_DIR" echo "" - mkdir -p "$HOME" - cd "$HOME" + # 检测是否在 U 盘上(挂载点判断) + if echo "$SCRIPT_DIR" | grep -q "/Volumes/"; then + echo -e " ${YELLOW}检测到 U 盘,解压可能需要 3-5 分钟,请耐心等待...${NC}" + else + echo " 大约需要 1-2 分钟..." + fi + echo "" + + cd "$SCRIPT_DIR" tar xzf "$ARCHIVE" if [ $? -ne 0 ]; then @@ -71,14 +75,14 @@ if [ ! -d "$INSTALL_DIR/app/core/node_modules" ]; then exit 1 fi + # 解压后移除隔离标记 + xattr -rd com.apple.quarantine "$INSTALL_DIR" 2>/dev/null || true + echo -e " ${GREEN}解压完成!${NC}" echo "" fi -# 删除 Windows 相关文件(可选,不影响运行) -# rm -f "$INSTALL_DIR"/Windows-*.bat 2>/dev/null - -# 启动 OpenClaw +# 启动 echo -e " ${CYAN}正在启动 OpenClaw...${NC}" echo "" diff --git a/uclaw-scripts/Mac-从U盘启动.command b/uclaw-scripts/Mac-从U盘启动.command deleted file mode 100644 index 8207ae7..0000000 --- a/uclaw-scripts/Mac-从U盘启动.command +++ /dev/null @@ -1,172 +0,0 @@ -#!/bin/bash -# ============================================================ -# U-Claw 虾盘 - macOS 一键启动 -# 双击此文件即可启动 OpenClaw -# ============================================================ - -UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)" -OPENCLAW_DIR="$UCLAW_DIR/openclaw" -PORTABLE_HOME="$UCLAW_DIR/portable-home" -PORTABLE_STATE_DIR="$PORTABLE_HOME/.openclaw" -PORTABLE_CONFIG_PATH="$PORTABLE_STATE_DIR/openclaw.json" - -GREEN='\033[0;32m' -CYAN='\033[0;36m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' - -run_with_spinner() { - local message="$1" - shift - local tmp_log - tmp_log="$(mktemp -t uclaw-run.XXXXXX)" - "$@" >"$tmp_log" 2>&1 & - local cmd_pid=$! - local frames='|/-\' - local i=0 - - while kill -0 "$cmd_pid" 2>/dev/null; do - local frame="${frames:i%4:1}" - printf "\r %b[%s]%b %s" "$CYAN" "$frame" "$NC" "$message" - i=$((i + 1)) - sleep 0.2 - done - - wait "$cmd_pid" - local status=$? - printf "\r" - - if [ $status -ne 0 ]; then - echo -e " ${RED}启动步骤失败:${message}${NC}" - sed -n '1,120p' "$tmp_log" - rm -f "$tmp_log" - read -p " 按回车键退出..." - exit $status - fi - - echo -e " ${GREEN}完成${NC} ${message}" - rm -f "$tmp_log" -} - -clear -echo "" -echo -e "${CYAN}" -echo " ╔══════════════════════════════════════╗" -echo " ║ U-Claw 虾盘 v1.0 ║" -echo " ║ OpenClaw 一键启动 ║" -echo " ╚══════════════════════════════════════╝" -echo -e "${NC}" -echo -e " ${GREEN}推荐场景:老电脑 / 临时电脑 / 不想改本机环境${NC}" -echo "" - -# 检测 CPU 架构 -ARCH=$(uname -m) -if [ "$ARCH" = "arm64" ]; then - NODE_DIR="$UCLAW_DIR/runtime/node-mac-arm64" - echo -e " ${GREEN}检测到 Apple Silicon (M系列芯片)${NC}" -else - NODE_DIR="$UCLAW_DIR/runtime/node-mac-x64" - echo -e " ${GREEN}检测到 Intel Mac${NC}" -fi - -NODE_BIN="$NODE_DIR/bin/node" -NPM_BIN="$NODE_DIR/bin/npm" - -if [ ! -f "$NODE_BIN" ]; then - echo -e " ${RED}错误: 找不到 Node.js 运行环境${NC}" - echo " 请确保 runtime/ 目录完整" - echo "" - read -p " 按回车键退出..." - exit 1 -fi - -NODE_VER=$("$NODE_BIN" --version) -echo -e " Node.js 版本: ${GREEN}${NODE_VER}${NC}" -echo "" - -export PATH="$NODE_DIR/bin:$PATH" -export OPENCLAW_HOME="$PORTABLE_HOME" -export OPENCLAW_STATE_DIR="$PORTABLE_STATE_DIR" -export OPENCLAW_CONFIG_PATH="$PORTABLE_CONFIG_PATH" - -mkdir -p "$PORTABLE_STATE_DIR" - -# 移除 macOS 隔离标记(解决"无法验证开发者"弹窗) -if xattr -l "$NODE_BIN" 2>/dev/null | grep -q "com.apple.quarantine"; then - echo -e " ${YELLOW}正在移除 macOS 安全限制...${NC}" - xattr -rd com.apple.quarantine "$UCLAW_DIR" 2>/dev/null || true - echo -e " ${GREEN}已移除${NC}" - echo "" -fi - -# 检查依赖 -if [ ! -d "$OPENCLAW_DIR/node_modules" ]; then - echo -e " ${YELLOW}首次运行,正在安装依赖...${NC}" - echo " (使用淘宝镜像,请稍等)" - echo "" - cd "$OPENCLAW_DIR" - run_with_spinner "安装 npm 依赖..." "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com - echo "" - echo -e " ${GREEN}依赖安装完成!${NC}" - echo "" -fi - -# 检查构建 -if [ ! -d "$OPENCLAW_DIR/dist" ]; then - echo -e " ${YELLOW}首次运行,正在构建...${NC}" - cd "$OPENCLAW_DIR" - run_with_spinner "构建 OpenClaw..." "$NODE_BIN" "$NPM_BIN" run build - echo "" -fi - -# 首次运行:自动写入最小配置(跳过 onboard) -if [ ! -f "$PORTABLE_CONFIG_PATH" ]; then - echo -e " ${YELLOW}首次运行,正在初始化配置...${NC}" - mkdir -p "$(dirname "$PORTABLE_CONFIG_PATH")" - cat > "$PORTABLE_CONFIG_PATH" << 'CFGEOF' -{ - "gateway": { - "mode": "local", - "auth": { "token": "uclaw" } - } -} -CFGEOF - echo -e " ${GREEN}配置已初始化${NC}" - echo "" -fi - -# 启动网关 -echo -e " ${CYAN}正在启动 OpenClaw...${NC}" -echo " 此窗口不要关闭,关闭后服务会停止。" -echo "" -cd "$OPENCLAW_DIR" -"$NODE_BIN" openclaw.mjs gateway run --allow-unconfigured --force & -GW_PID=$! - -# 等网关启动,最多等 15 秒 -for i in $(seq 1 30); do - sleep 0.5 - if curl -s -o /dev/null http://127.0.0.1:18789/ 2>/dev/null; then - TOKEN=$(python3 -c "import json; d=json.load(open('$PORTABLE_CONFIG_PATH')); print(d.get('gateway',{}).get('auth',{}).get('token',''))" 2>/dev/null) - URL="http://127.0.0.1:18789/#token=${TOKEN}" - echo "" - echo -e " ${GREEN}✅ 启动成功!${NC}" - echo "" - echo -e " ${CYAN}控制台地址: ${URL}${NC}" - echo "" - echo -e " ${YELLOW}▸ 首次使用请在控制台中配置:${NC}" - echo " 1. 设置 AI 模型(DeepSeek / Kimi / 通义千问 等)" - echo " 2. 接入聊天平台(QQ / 飞书 / 钉钉 等)" - echo "" - open "$URL" 2>/dev/null - break - fi -done - -# 前台等待网关进程 -wait $GW_PID - -echo "" -echo -e " ${YELLOW}OpenClaw 已退出。拔掉 U 盘后,本次便携运行就会结束。${NC}" -read -p " 按回车键关闭窗口..." diff --git a/uclaw-scripts/Mac-全部功能.command b/uclaw-scripts/Mac-全部功能.command deleted file mode 100755 index 5469418..0000000 --- a/uclaw-scripts/Mac-全部功能.command +++ /dev/null @@ -1,839 +0,0 @@ -#!/bin/bash -# ============================================================ -# U-Claw 虾盘 - 启动菜单 (雨林木风风格) -# macOS 版本 -# ============================================================ - -UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)" -OPENCLAW_DIR="$UCLAW_DIR/openclaw" -PORTABLE_HOME="$UCLAW_DIR/portable-home" -PORTABLE_STATE_DIR="$PORTABLE_HOME/.openclaw" -PORTABLE_CONFIG_PATH="$PORTABLE_STATE_DIR/openclaw.json" - -# 颜色 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -CYAN='\033[0;36m' -BLUE='\033[0;34m' -MAGENTA='\033[0;35m' -WHITE='\033[1;37m' -GRAY='\033[0;37m' -NC='\033[0m' -BOLD='\033[1m' -DIM='\033[2m' - -# 检测架构并设置 Node -ARCH=$(uname -m) -if [ "$ARCH" = "arm64" ]; then - NODE_DIR="$UCLAW_DIR/runtime/node-mac-arm64" -else - NODE_DIR="$UCLAW_DIR/runtime/node-mac-x64" -fi -NODE_BIN="$NODE_DIR/bin/node" -NPM_BIN="$NODE_DIR/bin/npm" -export PATH="$NODE_DIR/bin:$PATH" -export OPENCLAW_HOME="$PORTABLE_HOME" -export OPENCLAW_STATE_DIR="$PORTABLE_STATE_DIR" -export OPENCLAW_CONFIG_PATH="$PORTABLE_CONFIG_PATH" - -mkdir -p "$PORTABLE_STATE_DIR" - -# 移除 macOS 隔离标记(解决"无法验证开发者"弹窗) -if xattr -l "$NODE_BIN" 2>/dev/null | grep -q "com.apple.quarantine"; then - xattr -rd com.apple.quarantine "$UCLAW_DIR" 2>/dev/null || true -fi - -# 检查安装状态 -check_status() { - HAS_MODULES="no" - HAS_DIST="no" - HAS_ENV="no" - INSTALLED="no" - PORTABLE_READY="no" - - [ -d "$OPENCLAW_DIR/node_modules" ] && HAS_MODULES="yes" - [ -d "$OPENCLAW_DIR/dist" ] && HAS_DIST="yes" - [ -f "$OPENCLAW_DIR/.env" ] && HAS_ENV="yes" - [ -d "$HOME/.uclaw/openclaw" ] && INSTALLED="yes" - [ -f "$PORTABLE_CONFIG_PATH" ] && PORTABLE_READY="yes" -} - -# 显示主菜单 -show_menu() { - check_status - clear - echo "" - echo -e "${CYAN}${BOLD}" - echo " ╔════════════════════════════════════════════════════════╗" - echo " ║ ║" - echo " ║ 🦞 U-Claw 虾盘 v1.0 ║" - echo " ║ OpenClaw AI 助手 一键安装盘 ║" - echo " ║ ║" - echo " ║ 专为中国用户优化 · 免翻墙 · 离线安装 ║" - echo " ║ ║" - echo " ╠════════════════════════════════════════════════════════╣" - echo -e " ║${NC} ${CYAN}║" - - # 状态栏 - local STATUS_NODE="${GREEN}v$($NODE_BIN --version 2>/dev/null || echo '未找到')${NC}" - local STATUS_MOD="${RED}未安装${NC}" - local STATUS_BUILD="${RED}未构建${NC}" - local STATUS_INST="${RED}未安装${NC}" - - [ "$HAS_MODULES" = "yes" ] && STATUS_MOD="${GREEN}已安装${NC}" - [ "$HAS_DIST" = "yes" ] && STATUS_BUILD="${GREEN}已构建${NC}" - [ "$INSTALLED" = "yes" ] && STATUS_INST="${GREEN}已安装${NC}" - - local STATUS_PORTABLE="${RED}未配置${NC}" - [ "$PORTABLE_READY" = "yes" ] && STATUS_PORTABLE="${GREEN}已配置${NC}" - echo -e " ${CYAN}║${NC} 系统: $(uname -m) ${CYAN}║${NC}" - echo -e " ${CYAN}║${NC} Node: $STATUS_NODE ${CYAN}║${NC}" - echo -e " ${CYAN}║${NC} 依赖: $STATUS_MOD 构建: $STATUS_BUILD ${CYAN}║${NC}" - echo -e " ${CYAN}║${NC} 便携配置: $STATUS_PORTABLE 电脑安装: $STATUS_INST ${CYAN}║${NC}" - echo -e " ${CYAN}║${NC} ${CYAN}║${NC}" - echo -e " ${CYAN}╠════════════════════════════════════════════════════════╣${NC}" - echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 安装 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo "" - echo -e " ${GREEN} [1]${NC} 🚀 安装 OpenClaw 到本机(仅限你自己的电脑)" - echo -e " ${GREEN} [2]${NC} 📦 仅安装依赖(npm install)" - echo -e " ${GREEN} [3]${NC} 🔨 仅构建项目(npm build)" - echo -e " ${GREEN} [4]${NC} ▶️ 直接从 U 盘运行(配置也保存在 U 盘里)" - echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 中国优化 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo "" - echo -e " ${YELLOW} [5]${NC} ⚙️ 首次配置向导(选模型、选平台、填 API Key)" - echo -e " ${YELLOW} [6]${NC} 💬 配置中国聊天平台(飞书/钉钉)" - echo -e " ${YELLOW} [7]${NC} 🪞 设置国内镜像源" - echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 维护工具 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo "" - echo -e " ${CYAN} [8]${NC} 🔧 诊断修复(openclaw doctor)" - echo -e " ${CYAN} [9]${NC} 💾 备份当前状态" - echo -e " ${CYAN} [10]${NC} 📂 恢复备份" - echo -e " ${CYAN} [11]${NC} 🔄 重置 OpenClaw(恢复出厂)" - echo -e " ${CYAN} [12]${NC} 🧹 清理缓存和临时文件" - echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 技能 & 使用 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo "" - echo -e " ${BLUE} [13]${NC} 🎯 浏览预装技能(52个,已离线可用)" - echo -e " ${BLUE} [14]${NC} 📖 中国用户快速上手指南" - echo "" - echo -e " ${WHITE}${BOLD} ━━━━ 其他 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" - echo "" - echo -e " ${MAGENTA} [15]${NC} 📋 查看使用说明" - echo -e " ${MAGENTA} [16]${NC} ℹ️ 系统信息" - echo -e " ${MAGENTA} [17]${NC} 🌐 打开本地网页控制台" - echo -e " ${DIM} [0]${NC} 退出" - echo "" - echo -e " ${CYAN}╚════════════════════════════════════════════════════════╝${NC}" - echo "" -} - -# 确保依赖已安装 -ensure_deps() { - if [ ! -d "$OPENCLAW_DIR/node_modules" ]; then - echo -e " ${YELLOW}正在安装依赖(淘宝镜像)...${NC}" - cd "$OPENCLAW_DIR" - "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com 2>&1 - echo -e " ${GREEN}依赖安装完成${NC}" - fi - if [ ! -d "$OPENCLAW_DIR/dist" ]; then - echo -e " ${YELLOW}正在构建...${NC}" - cd "$OPENCLAW_DIR" - "$NODE_BIN" "$NPM_BIN" run build 2>&1 || true - echo -e " ${GREEN}构建完成${NC}" - fi -} - -# [1] 一键安装到电脑 -do_install() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 一键安装 OpenClaw 到电脑 ━━━${NC}" - echo "" - echo -e " ${YELLOW}提醒:如果这是老电脑、临时电脑、公司电脑或别人的电脑,${NC}" - echo -e " ${YELLOW}更推荐返回主菜单选择 [4] 从 U 盘运行,不要安装到本机。${NC}" - echo "" - bash "$UCLAW_DIR/安装到电脑.command" -} - -# [2] 安装依赖 -do_npm_install() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 安装 npm 依赖 ━━━${NC}" - echo "" - cd "$OPENCLAW_DIR" - echo -e " ${YELLOW}使用淘宝镜像安装...${NC}" - "$NODE_BIN" "$NPM_BIN" install --registry=https://registry.npmmirror.com 2>&1 - echo "" - echo -e " ${GREEN}依赖安装完成!${NC}" -} - -# [3] 构建 -do_build() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 构建 OpenClaw ━━━${NC}" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" "$NPM_BIN" run build 2>&1 - echo "" - echo -e " ${GREEN}构建完成!${NC}" -} - -# [4] 直接运行 -do_run() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 从 U 盘启动 OpenClaw ━━━${NC}" - echo "" - echo -e " ${GREEN}便携模式说明:配置、状态、记忆都会写在这只 U 盘里。${NC}" - echo -e " ${GREEN}拔掉 U 盘后当前会话会结束,但换一台电脑再插上还能继续用。${NC}" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - if [ ! -f "$PORTABLE_CONFIG_PATH" ]; then - echo -e " ${YELLOW}检测到你还没有完成首次配置。${NC}" - echo " 首次配置会保存在 U 盘中,不会默认写进这台电脑。" - echo "" - read -p " 现在开始首次配置? (y/n) " -n 1 -r - echo "" - echo "" - if [[ $REPLY =~ ^[Yy]$ ]]; then - "$NODE_BIN" openclaw.mjs onboard - echo "" - echo -e " ${GREEN}首次配置完成,已保存到 U 盘。${NC}" - echo " 接下来可以选 [17] 打开网页控制台。" - fi - else - start_gateway - fi -} - -start_gateway() { - echo -e " ${GREEN}正在启动网关服务...${NC}" - echo " 此窗口不要关闭,关闭后服务会停止。" - echo "" - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs gateway run --allow-unconfigured --force & - local GW_PID=$! - for i in $(seq 1 30); do - sleep 0.5 - if curl -s -o /dev/null http://127.0.0.1:18789/ 2>/dev/null; then - local TOKEN - TOKEN=$(python3 -c "import json; d=json.load(open('$PORTABLE_CONFIG_PATH')); print(d.get('gateway',{}).get('auth',{}).get('token',''))" 2>/dev/null) - local URL="http://127.0.0.1:18789/#token=${TOKEN}" - echo "" - echo -e " ${GREEN}控制台地址: ${URL}${NC}" - open "$URL" 2>/dev/null - break - fi - done - wait $GW_PID -} - -do_dashboard() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 启动网关 + 打开网页控制台 ━━━${NC}" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - if [ ! -f "$PORTABLE_CONFIG_PATH" ]; then - echo -e " ${YELLOW}你还没有完成 U 盘便携配置。请先选 [4] 从 U 盘运行。${NC}" - return - fi - start_gateway -} - -# 运行 openclaw 命令(便携模式) -run_openclaw() { - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs "$@" -} - -# [5] 配置 AI 模型(直接用 OpenClaw 自带的配置向导) -do_china_models() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 首次配置向导 ━━━${NC}" - echo "" - echo -e " ${WHITE}${BOLD}国产模型选择提示:${NC}" - echo "" - echo -e " ${GREEN}DeepSeek${NC} → 选 ${YELLOW}Custom Provider${NC}" - echo -e " Base URL: ${CYAN}https://api.deepseek.com/v1${NC}" - echo -e " 模型名: ${CYAN}deepseek-chat${NC}" - echo -e " ${GREEN}Kimi${NC} → 选 ${YELLOW}Moonshot AI${NC}" - echo -e " ${GREEN}通义千问${NC} → 选 ${YELLOW}Qwen${NC}" - echo -e " ${GREEN}MiniMax${NC} → 选 ${YELLOW}MiniMax${NC}" - echo -e " ${GREEN}豆包${NC} → 选 ${YELLOW}Volcano Engine${NC}" - echo "" - echo -e " ${DIM}按方向键 ↑↓ 滚动列表,回车确认${NC}" - echo "" - read -p " 按回车启动配置向导..." - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - run_openclaw onboard -} - -# [6] 配置中国聊天平台 -do_china_channels() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 配置中国聊天平台 ━━━${NC}" - echo "" - echo -e " OpenClaw 支持的聊天平台:" - echo "" - echo -e " ${WHITE}${BOLD} -- 国内平台 --${NC}" - echo -e " ${GREEN}[a]${NC} 飞书 Feishu/Lark — 已内置,企业首选" - echo -e " ${GREEN}[b]${NC} QQ(腾讯官方)${RED}★推荐${NC} — 3条命令,1分钟,免费免翻墙" - echo -e " ${GREEN}[c]${NC} 微信(社区插件) — iPad协议,文字/图片/文件" - echo -e " ${GRAY}[d]${NC} 企业微信 WeCom — 后续集成" - echo -e " ${GRAY}[e]${NC} 钉钉 DingTalk — 后续集成" - echo "" - echo -e " ${WHITE}${BOLD} -- 国际平台 --${NC}" - echo -e " ${GREEN}[f]${NC} Telegram — 推荐,简单好用" - echo -e " ${GREEN}[g]${NC} Discord — 游戏/社区" - echo -e " ${GREEN}[h]${NC} WhatsApp — 海外用户" - echo -e " ${GREEN}[i]${NC} Slack — 外企用户" - echo "" - read -p " 请选择 (a-i): " -n 1 CH_CHOICE - echo "" - echo "" - - case $CH_CHOICE in - a) - echo -e " ${CYAN}配置飞书 Feishu${NC}" - echo "" - echo " 飞书机器人配置步骤:" - echo " 1. 访问 https://open.feishu.cn/app 创建应用" - echo " 2. 获取 App ID 和 App Secret" - echo " 3. 配置事件订阅和权限" - echo "" - echo " 详细文档: openclaw/docs/channels/feishu.md" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - echo -e " ${YELLOW}启动 OpenClaw 配置向导...${NC}" - "$NODE_BIN" openclaw.mjs onboard 2>&1 || true - ;; - b) - echo -e " ${CYAN}${BOLD}配置 QQ(腾讯官方接入)${NC}" - echo "" - echo -e " ${GREEN}${BOLD}这是国内最简单的 AI 助手接入方式!${NC}" - echo -e " ${GREEN}全程 1 分钟,完全免费,无需翻墙。${NC}" - echo "" - echo -e " ${WHITE}${BOLD}步骤:${NC}" - echo "" - echo " 1. 扫码注册 QQ 机器人:" - echo -e " ${CYAN}http://q.qq.com/qqbot/openclaw/login.html${NC}" - echo "" - echo " 2. 点击「创建机器人」,获取 AppID 和 AppSecret" - echo "" - echo " 3. 运行以下 3 条命令:" - echo "" - echo -e " ${GREEN}openclaw plugins install @sliverp/qqbot@latest${NC}" - echo -e " ${GREEN}openclaw channels add --channel qqbot --token \"AppID:AppSecret\"${NC}" - echo -e " ${GREEN}openclaw gateway restart${NC}" - echo "" - echo -e " ${RED}⚠️ 安全提醒:${NC}" - echo " 默认任何人都能访问你的机器人!接入后请设置白名单:" - echo -e " ${YELLOW}openclaw config set channels.qqbot.allowFrom \"你的QQ号\"${NC}" - echo "" - echo -e " ${DIM}备选方案: 也可以用 NapCatQQ (OneBot v11) 接入${NC}" - echo -e " ${DIM}https://github.com/NapNeko/NapCatQQ/releases${NC}" - echo "" - - # 如果已安装 OpenClaw,直接帮用户执行 - if [ -d "$OPENCLAW_DIR/dist" ]; then - read -p " 是否现在安装 QQ 插件? (y/n) " -n 1 DO_QQ - echo "" - if [[ "$DO_QQ" =~ ^[Yy]$ ]]; then - cd "$OPENCLAW_DIR" - echo "" - echo -e " ${YELLOW}正在安装 QQ 插件...${NC}" - "$NODE_BIN" openclaw.mjs plugins install @sliverp/qqbot@latest 2>&1 || true - echo "" - echo -e " ${WHITE}请输入 QQ 机器人信息(在 q.qq.com 后台查看):${NC}" - echo "" - read -p " AppID: " QQ_APP_ID - echo "" - read -p " AppSecret: " QQ_APP_SECRET - echo "" - if [ -n "$QQ_APP_ID" ] && [ -n "$QQ_APP_SECRET" ]; then - echo -e " ${YELLOW}正在绑定 QQ 机器人...${NC}" - "$NODE_BIN" openclaw.mjs channels add --channel qqbot --token "${QQ_APP_ID}:${QQ_APP_SECRET}" 2>&1 || true - echo "" - read -p " 请输入你自己的 QQ 号(设置白名单,留空跳过): " QQ_ALLOW - if [ -n "$QQ_ALLOW" ]; then - "$NODE_BIN" openclaw.mjs config set channels.qqbot.allowFrom "\"${QQ_ALLOW}\"" 2>&1 || true - echo -e " ${GREEN}白名单已设置: 仅 QQ ${QQ_ALLOW} 可访问${NC}" - fi - echo "" - echo -e " ${GREEN}QQ 机器人配置完成!${NC}" - echo -e " ${YELLOW}请重启网关后生效(主菜单选 [4] 或 [17])${NC}" - else - echo -e " ${YELLOW}已取消:AppID 或 AppSecret 为空。${NC}" - fi - fi - fi - ;; - c) - echo -e " ${CYAN}配置微信(社区插件)${NC}" - echo "" - echo " 安装微信插件:" - echo " openclaw plugins install @icesword760/openclaw-wechat" - echo "" - echo " 基于 iPad 协议,支持:" - echo " - 文字消息" - echo " - 图片发送" - echo " - 文件传输" - echo " - 关键词触发对话" - echo "" - echo " 仓库: https://github.com/icesword0760/openclaw-wechat" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - echo -e " ${YELLOW}正在安装微信插件...${NC}" - "$NODE_BIN" openclaw.mjs plugins install @icesword760/openclaw-wechat 2>&1 || \ - echo -e " ${YELLOW}安装失败,请手动安装${NC}" - ;; - d|e) - echo -e " ${YELLOW}该平台正在开发中,敬请期待${NC}" - echo " 可关注 u-claw.org 获取最新进展" - ;; - f) - echo -e " ${CYAN}配置 Telegram${NC}" - echo "" - echo " 步骤:" - echo " 1. 在 Telegram 中找 @BotFather" - echo " 2. 发送 /newbot 创建机器人" - echo " 3. 获取 Bot Token" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs onboard 2>&1 || true - ;; - g) - echo -e " ${CYAN}配置 Discord${NC}" - echo "" - echo " 步骤:" - echo " 1. 访问 https://discord.com/developers/applications" - echo " 2. 创建 Application -> Bot" - echo " 3. 获取 Bot Token" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs onboard 2>&1 || true - ;; - h|i) - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs onboard 2>&1 || true - ;; - *) - echo -e " ${YELLOW}无效选择${NC}" - ;; - esac -} - -# [7] 设置国内镜像 -do_mirror() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 设置国内镜像源 ━━━${NC}" - echo "" - - # npm 镜像 - echo -e " ${YELLOW}设置 npm 淘宝镜像...${NC}" - "$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null - cd "$OPENCLAW_DIR" 2>/dev/null - "$NODE_BIN" "$NPM_BIN" config set registry https://registry.npmmirror.com --location=project 2>/dev/null - echo -e " ${GREEN}npm 镜像已设置: registry.npmmirror.com${NC}" - - # 创建 .npmrc - NPMRC="$OPENCLAW_DIR/.npmrc" - if ! grep -q "npmmirror" "$NPMRC" 2>/dev/null; then - echo "" >> "$NPMRC" - echo "registry=https://registry.npmmirror.com" >> "$NPMRC" - fi - - echo "" - echo -e " ${GREEN}国内镜像配置完成!${NC}" - echo " 后续 npm install 将自动使用淘宝镜像" -} - -# [8] 诊断修复 -do_doctor() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 诊断修复 ━━━${NC}" - echo "" - echo -e " ${GREEN}💡 提示: 选 [17] 可打开网页控制台,在浏览器中查看完整状态${NC}" - echo "" - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs doctor --repair 2>&1 || \ - echo -e " ${YELLOW}如果 doctor 无法运行,请先完成安装步骤${NC}" -} - -# [9] 备份 -do_backup() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 备份当前状态 ━━━${NC}" - echo "" - - BACKUP_DIR="$UCLAW_DIR/backups" - TIMESTAMP=$(date +%Y%m%d_%H%M%S) - BACKUP_NAME="backup_${TIMESTAMP}" - BACKUP_PATH="$BACKUP_DIR/$BACKUP_NAME" - - mkdir -p "$BACKUP_PATH" - - echo -e " ${YELLOW}备份中...${NC}" - - # 备份配置 - if [ -f "$OPENCLAW_DIR/.env" ]; then - cp "$OPENCLAW_DIR/.env" "$BACKUP_PATH/.env" - echo -e " ${GREEN} ✓ .env 配置${NC}" - fi - - # 备份 OpenClaw 状态 - if [ -d "$HOME/.openclaw" ]; then - mkdir -p "$BACKUP_PATH/openclaw-state" - cp -R "$HOME/.openclaw/openclaw.json" "$BACKUP_PATH/openclaw-state/" 2>/dev/null || true - cp -R "$HOME/.openclaw/credentials" "$BACKUP_PATH/openclaw-state/" 2>/dev/null || true - echo -e " ${GREEN} ✓ OpenClaw 状态和凭据${NC}" - fi - - # 备份 U-Claw 用户数据 - if [ -d "$UCLAW_DIR/memory" ] && [ "$(ls -A "$UCLAW_DIR/memory" 2>/dev/null)" ]; then - cp -R "$UCLAW_DIR/memory" "$BACKUP_PATH/" - echo -e " ${GREEN} ✓ 记忆文件${NC}" - fi - if [ -d "$UCLAW_DIR/persona" ] && [ "$(ls -A "$UCLAW_DIR/persona" 2>/dev/null)" ]; then - cp -R "$UCLAW_DIR/persona" "$BACKUP_PATH/" - echo -e " ${GREEN} ✓ 人格配置${NC}" - fi - - # 备份已安装的版本 - if [ -d "$HOME/.uclaw/openclaw" ]; then - cp "$HOME/.uclaw/openclaw/.env" "$BACKUP_PATH/installed-env" 2>/dev/null || true - echo -e " ${GREEN} ✓ 已安装版本配置${NC}" - fi - - BACKUP_SIZE=$(du -sh "$BACKUP_PATH" | cut -f1) - echo "" - echo -e " ${GREEN}备份完成!${NC}" - echo " 位置: $BACKUP_PATH" - echo " 大小: $BACKUP_SIZE" - echo "" - - # 显示所有备份 - echo " 所有备份:" - ls -1 "$BACKUP_DIR" 2>/dev/null | while read -r b; do - echo " - $b" - done -} - -# [10] 恢复备份 -do_restore() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 恢复备份 ━━━${NC}" - echo "" - - BACKUP_DIR="$UCLAW_DIR/backups" - if [ ! -d "$BACKUP_DIR" ] || [ -z "$(ls -A "$BACKUP_DIR" 2>/dev/null)" ]; then - echo -e " ${YELLOW}没有找到任何备份${NC}" - echo " 请先使用 [9] 创建备份" - return - fi - - echo " 可用备份:" - echo "" - local i=1 - for b in "$BACKUP_DIR"/*/; do - local bname=$(basename "$b") - local bsize=$(du -sh "$b" | cut -f1) - echo -e " ${GREEN}[$i]${NC} $bname ($bsize)" - i=$((i+1)) - done - echo "" - read -p " 选择要恢复的备份编号: " RESTORE_NUM - - local j=1 - local RESTORE_PATH="" - for b in "$BACKUP_DIR"/*/; do - if [ "$j" = "$RESTORE_NUM" ]; then - RESTORE_PATH="$b" - break - fi - j=$((j+1)) - done - - if [ -z "$RESTORE_PATH" ]; then - echo -e " ${RED}无效选择${NC}" - return - fi - - echo "" - echo -e " ${YELLOW}正在恢复 $(basename "$RESTORE_PATH")...${NC}" - - # 恢复 .env - if [ -f "$RESTORE_PATH/.env" ]; then - cp "$RESTORE_PATH/.env" "$OPENCLAW_DIR/.env" - echo -e " ${GREEN} ✓ .env 已恢复${NC}" - fi - - # 恢复 OpenClaw 状态 - if [ -d "$RESTORE_PATH/openclaw-state" ]; then - mkdir -p "$HOME/.openclaw" - cp -R "$RESTORE_PATH/openclaw-state/"* "$HOME/.openclaw/" 2>/dev/null || true - echo -e " ${GREEN} ✓ OpenClaw 状态已恢复${NC}" - fi - - # 恢复用户数据 - if [ -d "$RESTORE_PATH/memory" ]; then - cp -R "$RESTORE_PATH/memory" "$UCLAW_DIR/" - echo -e " ${GREEN} ✓ 记忆文件已恢复${NC}" - fi - if [ -d "$RESTORE_PATH/persona" ]; then - cp -R "$RESTORE_PATH/persona" "$UCLAW_DIR/" - echo -e " ${GREEN} ✓ 人格配置已恢复${NC}" - fi - - echo "" - echo -e " ${GREEN}恢复完成!${NC}" -} - -# [11] 重置 -do_reset() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 重置 OpenClaw ━━━${NC}" - echo "" - echo -e " ${RED}警告: 重置将清除配置和状态数据${NC}" - echo "" - echo -e " ${GREEN}[1]${NC} 仅重置配置(保留凭据和会话)" - echo -e " ${YELLOW}[2]${NC} 重置配置 + 凭据 + 会话(保留工作区)" - echo -e " ${RED}[3]${NC} 完全重置(恢复出厂状态)" - echo -e " ${DIM}[0]${NC} 取消" - echo "" - read -p " 选择重置级别: " -n 1 RESET_CHOICE - echo "" - - case $RESET_CHOICE in - 1) - echo "" - echo -e " ${YELLOW}建议先备份! 是否先创建备份? (y/n)${NC}" - read -n 1 DO_BACKUP - echo "" - [ "$DO_BACKUP" = "y" ] && do_backup - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs reset --scope config 2>&1 || true - ;; - 2) - echo "" - echo -e " ${YELLOW}建议先备份! 是否先创建备份? (y/n)${NC}" - read -n 1 DO_BACKUP - echo "" - [ "$DO_BACKUP" = "y" ] && do_backup - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs reset --scope config+creds+sessions 2>&1 || true - ;; - 3) - echo "" - echo -e " ${RED}确定要完全重置吗? 输入 YES 确认:${NC} " - read CONFIRM - if [ "$CONFIRM" = "YES" ]; then - do_backup - ensure_deps - cd "$OPENCLAW_DIR" - "$NODE_BIN" openclaw.mjs reset --scope full 2>&1 || true - echo -e " ${GREEN}已恢复出厂状态${NC}" - else - echo " 已取消" - fi - ;; - *) - echo " 已取消" - ;; - esac -} - -# [12] 清理 -do_cleanup() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 清理缓存和临时文件 ━━━${NC}" - echo "" - - FREED=0 - - # 清理 npm 缓存 - echo -e " ${YELLOW}清理 npm 缓存...${NC}" - CACHE_SIZE=$("$NODE_BIN" "$NPM_BIN" cache ls 2>/dev/null | wc -l || echo 0) - "$NODE_BIN" "$NPM_BIN" cache clean --force 2>/dev/null || true - echo -e " ${GREEN} ✓ npm 缓存已清理${NC}" - - # 清理 Node.js 编译缓存 - if [ -d "$HOME/.cache/node" ]; then - NSIZE=$(du -sm "$HOME/.cache/node" 2>/dev/null | cut -f1) - rm -rf "$HOME/.cache/node" - echo -e " ${GREEN} ✓ Node 编译缓存已清理 (${NSIZE}MB)${NC}" - fi - - # 清理 OpenClaw 日志 - if [ -d "$HOME/.openclaw/logs" ]; then - LSIZE=$(du -sm "$HOME/.openclaw/logs" 2>/dev/null | cut -f1) - rm -rf "$HOME/.openclaw/logs" - echo -e " ${GREEN} ✓ 日志已清理 (${LSIZE:-0}MB)${NC}" - fi - - echo "" - echo -e " ${GREEN}清理完成!${NC}" -} - -# [13] 技能浏览器 -do_skills_browser() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 预装技能浏览器(52个,已离线可用)━━━${NC}" - echo "" - echo -e " ${WHITE}${BOLD} 效率 & 编程${NC}" - echo -e " ${GREEN} github${NC} GitHub 操作(Issues/PR/代码审查/CI)" - echo -e " ${GREEN} gh-issues${NC} 获取 Issues 并分配 Agent 修复" - echo -e " ${GREEN} coding-agent${NC} 委派编程任务给 Codex/Claude/Pi" - echo -e " ${GREEN} summarize${NC} 总结文本/网页/播客/视频" - echo -e " ${GREEN} nano-pdf${NC} 自然语言编辑 PDF" - echo -e " ${GREEN} clawhub${NC} 搜索安装更多社区技能" - echo -e " ${GREEN} skill-creator${NC} 创建自定义技能" - echo "" - echo -e " ${WHITE}${BOLD} 笔记 & 任务管理${NC}" - echo -e " ${GREEN} apple-notes${NC} Apple 备忘录(创建/搜索/编辑)" - echo -e " ${GREEN} apple-reminders${NC} Apple 提醒事项" - echo -e " ${GREEN} obsidian${NC} Obsidian 笔记操作" - echo -e " ${GREEN} notion${NC} Notion 页面和数据库" - echo -e " ${GREEN} things-mac${NC} Things 3 任务管理 (macOS)" - echo -e " ${GREEN} trello${NC} Trello 看板操作" - echo -e " ${GREEN} bear-notes${NC} Bear 笔记" - echo "" - echo -e " ${WHITE}${BOLD} AI & 创作${NC}" - echo -e " ${GREEN} openai-image-gen${NC} AI 图片生成" - echo -e " ${GREEN} openai-whisper${NC} 语音转文字(本地)" - echo -e " ${GREEN} openai-whisper-api${NC} 语音转文字(API)" - echo -e " ${GREEN} gemini${NC} Gemini 一键问答" - echo -e " ${GREEN} sag${NC} ElevenLabs 文字转语音" - echo -e " ${GREEN} sherpa-onnx-tts${NC} 本地离线文字转语音" - echo -e " ${GREEN} nano-banana-pro${NC} Gemini 3 图片生成" - echo "" - echo -e " ${WHITE}${BOLD} 通讯 & 社交${NC}" - echo -e " ${GREEN} himalaya${NC} 邮件收发(IMAP/SMTP)" - echo -e " ${GREEN} discord${NC} Discord 消息操作" - echo -e " ${GREEN} slack${NC} Slack 消息操作" - echo -e " ${GREEN} wacli${NC} WhatsApp 消息和历史" - echo -e " ${GREEN} imsg${NC} iMessage/SMS" - echo -e " ${GREEN} xurl${NC} X (Twitter) API" - echo "" - echo -e " ${WHITE}${BOLD} 系统 & 工具${NC}" - echo -e " ${GREEN} weather${NC} 天气查询" - echo -e " ${GREEN} peekaboo${NC} macOS 屏幕截图和 UI 自动化" - echo -e " ${GREEN} tmux${NC} 远程终端管理" - echo -e " ${GREEN} healthcheck${NC} 系统安全检查" - echo -e " ${GREEN} 1password${NC} 1Password 密码管理" - echo -e " ${GREEN} video-frames${NC} 视频截帧 (ffmpeg)" - echo -e " ${GREEN} session-logs${NC} 会话日志搜索分析" - echo -e " ${GREEN} mcporter${NC} MCP 服务管理" - echo "" - echo -e " ${WHITE}${BOLD} 智能家居 & IoT${NC}" - echo -e " ${GREEN} openhue${NC} Philips Hue 灯光控制" - echo -e " ${GREEN} sonoscli${NC} Sonos 音箱控制" - echo -e " ${GREEN} eightctl${NC} Eight Sleep 智能床垫" - echo -e " ${GREEN} camsnap${NC} 摄像头截图/录像" - echo "" - echo -e " ${DIM} 提示: 这些技能已全部预装在 U 盘中,无需联网下载${NC}" - echo -e " ${DIM} 使用: 在 OpenClaw 中直接说 \"帮我查天气\" 或 \"帮我发邮件\" 即可${NC}" - echo -e " ${DIM} 更多: 运行 openclaw 后输入 /skills 查看详情${NC}" -} - -# [14] 中国用户指南 -do_china_guide() { - echo "" - if [ -f "$UCLAW_DIR/中国用户指南.txt" ]; then - cat "$UCLAW_DIR/中国用户指南.txt" - else - echo " 指南文件不存在" - fi -} - -# [15] 使用说明 -do_readme() { - echo "" - if [ -f "$UCLAW_DIR/使用说明.txt" ]; then - cat "$UCLAW_DIR/使用说明.txt" - else - echo " 使用说明文件不存在" - fi -} - -# [16] 系统信息 -do_sysinfo() { - echo "" - echo -e " ${CYAN}${BOLD}━━━ 系统信息 ━━━${NC}" - echo "" - echo " 操作系统: $(sw_vers -productName 2>/dev/null || uname -s) $(sw_vers -productVersion 2>/dev/null || uname -r)" - echo " CPU架构: $(uname -m)" - echo " 内存: $(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.1f GB", $1/1024/1024/1024}' || echo '未知')" - echo " Node.js: $($NODE_BIN --version 2>/dev/null || echo '未找到')" - echo " npm: $($NODE_BIN $NPM_BIN --version 2>/dev/null || echo '未找到')" - echo "" - echo " U-Claw 路径: $UCLAW_DIR" - echo " U-Claw 大小: $(du -sh "$UCLAW_DIR" 2>/dev/null | cut -f1)" - echo "" - if [ -d "$HOME/.uclaw" ]; then - echo " 已安装路径: $HOME/.uclaw" - echo " 已安装大小: $(du -sh "$HOME/.uclaw" 2>/dev/null | cut -f1)" - else - echo " 电脑安装: 未安装" - fi - echo "" - if [ -d "$HOME/.openclaw" ]; then - echo " OpenClaw 状态: $HOME/.openclaw" - echo " 状态大小: $(du -sh "$HOME/.openclaw" 2>/dev/null | cut -f1)" - fi - echo "" - echo " 磁盘空间: $(df -h "$UCLAW_DIR" 2>/dev/null | tail -1 | awk '{print $4 " 可用 / " $2 " 总计"}')" -} - -# 主循环 -while true; do - show_menu - read -p " 请选择 [0-16]: " CHOICE - echo "" - - case $CHOICE in - 1) do_install ;; - 2) do_npm_install ;; - 3) do_build ;; - 4) do_run ;; - 5) do_china_models ;; - 6) do_china_channels ;; - 7) do_mirror ;; - 8) do_doctor ;; - 9) do_backup ;; - 10) do_restore ;; - 11) do_reset ;; - 12) do_cleanup ;; - 13) do_skills_browser ;; - 14) do_china_guide ;; - 15) do_readme ;; - 16) do_sysinfo ;; - 17) do_dashboard ;; - 0) - echo -e " ${CYAN}再见! 🦞${NC}" - echo "" - exit 0 - ;; - *) - echo -e " ${RED}无效选择,请输入 0-17${NC}" - ;; - esac - - echo "" - read -p " 按回车键返回主菜单..." -done diff --git a/uclaw-scripts/Mac-安装到电脑.command b/uclaw-scripts/Mac-安装到电脑.command deleted file mode 100644 index 36f31f6..0000000 --- a/uclaw-scripts/Mac-安装到电脑.command +++ /dev/null @@ -1,184 +0,0 @@ -#!/bin/bash -# ============================================================ -# U-Claw 虾盘 - macOS 安装到电脑 -# 将 OpenClaw 及运行环境永久安装到电脑上 -# ============================================================ - -set -euo pipefail - -UCLAW_DIR="$(cd "$(dirname "$0")" && pwd)" -INSTALL_DIR="$HOME/.uclaw" - -GREEN='\033[0;32m' -CYAN='\033[0;36m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' - -run_with_spinner() { - local message="$1" - shift - local tmp_log - tmp_log="$(mktemp -t uclaw-install.XXXXXX)" - "$@" >"$tmp_log" 2>&1 & - local cmd_pid=$! - local frames='|/-\' - local i=0 - - while kill -0 "$cmd_pid" 2>/dev/null; do - local frame="${frames:i%4:1}" - printf "\r %b[%s]%b %s" "$CYAN" "$frame" "$NC" "$message" - i=$((i + 1)) - sleep 0.2 - done - - wait "$cmd_pid" - local status=$? - printf "\r" - - if [ $status -ne 0 ]; then - echo -e " ${RED}安装步骤失败:${message}${NC}" - sed -n '1,120p' "$tmp_log" - rm -f "$tmp_log" - exit $status - fi - - echo -e " ${GREEN}完成${NC} ${message}" - rm -f "$tmp_log" -} - -copy_tree_quiet() { - local src="$1" - local dst="$2" - mkdir -p "$dst" - ( - export COPYFILE_DISABLE=1 - cd "$src" - tar --exclude='.DS_Store' --exclude='._*' -cf - . - ) | ( - cd "$dst" - tar -xpf - - ) -} - -clear -echo "" -echo -e "${CYAN}" -echo " ╔══════════════════════════════════════╗" -echo " ║ U-Claw 安装到电脑 ║" -echo " ║ OpenClaw 永久安装 ║" -echo " ╚══════════════════════════════════════╝" -echo -e "${NC}" -echo "" -echo " 安装位置: $INSTALL_DIR" -echo " 安装内容: Node.js + OpenClaw + 所有依赖" -echo "" -echo -e " ${YELLOW}安全提醒: 这会把 OpenClaw 和配置写入当前电脑。${NC}" -echo -e " ${YELLOW}如果这是老电脑、共享电脑、公司电脑或临时机器,${NC}" -echo -e " ${YELLOW}更推荐回到主菜单选择「直接从 U 盘运行」。${NC}" -echo "" -read -p " 是否继续安装? (y/n) " -n 1 -r -echo "" -echo "" - -if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo " 已取消安装" - exit 0 -fi - -ARCH=$(uname -m) -if [ "$ARCH" = "arm64" ]; then - NODE_SRC="$UCLAW_DIR/runtime/node-mac-arm64" - echo -e " ${GREEN}Apple Silicon (M系列)${NC}" -else - NODE_SRC="$UCLAW_DIR/runtime/node-mac-x64" - echo -e " ${GREEN}Intel Mac${NC}" -fi - -echo -e " ${CYAN}[1/4] 创建安装目录...${NC}" -mkdir -p "$INSTALL_DIR" - -echo -e " ${CYAN}[2/4] 安装 Node.js 运行环境...${NC}" -rm -rf "$INSTALL_DIR/node" -mkdir -p "$INSTALL_DIR/node" -run_with_spinner "复制 Node.js 运行环境..." copy_tree_quiet "$NODE_SRC" "$INSTALL_DIR/node" -if [ ! -x "$INSTALL_DIR/node/bin/node" ]; then - echo -e " ${RED}Node.js 安装失败:$INSTALL_DIR/node/bin/node 不存在${NC}" - echo -e " ${YELLOW}请先确认 U 盘复制完成,再重新运行安装。${NC}" - exit 1 -fi -NODE_VERSION_INSTALLED="$("$INSTALL_DIR/node/bin/node" --version)" -echo -e " ${GREEN}Node.js ${NODE_VERSION_INSTALLED} 已安装${NC}" - -echo -e " ${CYAN}[3/4] 安装 OpenClaw...${NC}" -echo -e " ${YELLOW}这一步会复制约 861M 文件,首次安装通常需要 3-10 分钟,请耐心等待...${NC}" -if [ -d "$INSTALL_DIR/openclaw" ] && [ -f "$INSTALL_DIR/openclaw/.env" ]; then - cp "$INSTALL_DIR/openclaw/.env" "/tmp/.uclaw-env-backup" 2>/dev/null || true -fi -rm -rf "$INSTALL_DIR/openclaw" -mkdir -p "$INSTALL_DIR/openclaw" -run_with_spinner "复制 OpenClaw 主程序和依赖..." copy_tree_quiet "$UCLAW_DIR/openclaw" "$INSTALL_DIR/openclaw" -if [ -f "/tmp/.uclaw-env-backup" ]; then - cp "/tmp/.uclaw-env-backup" "$INSTALL_DIR/openclaw/.env" - rm -f "/tmp/.uclaw-env-backup" -fi - -# 复制用户数据 -[ -d "$UCLAW_DIR/memory" ] && [ "$(ls -A "$UCLAW_DIR/memory" 2>/dev/null)" ] && cp -R "$UCLAW_DIR/memory" "$INSTALL_DIR/" -[ -d "$UCLAW_DIR/persona" ] && [ "$(ls -A "$UCLAW_DIR/persona" 2>/dev/null)" ] && cp -R "$UCLAW_DIR/persona" "$INSTALL_DIR/" - -echo -e " ${CYAN}[4/4] 配置环境变量...${NC}" - -SHELL_RC="$HOME/.zshrc" -[ ! -f "$SHELL_RC" ] && SHELL_RC="$HOME/.bashrc" -[ ! -f "$SHELL_RC" ] && SHELL_RC="$HOME/.bash_profile" - -if ! grep -q ".uclaw/node/bin" "$SHELL_RC" 2>/dev/null; then - echo "" >> "$SHELL_RC" - echo "# U-Claw OpenClaw" >> "$SHELL_RC" - echo 'export PATH="$HOME/.uclaw/node/bin:$PATH"' >> "$SHELL_RC" - echo "alias openclaw='\$HOME/.uclaw/node/bin/node \$HOME/.uclaw/openclaw/openclaw.mjs'" >> "$SHELL_RC" - echo -e " ${GREEN}已添加到 $SHELL_RC${NC}" -else - echo -e " ${YELLOW}PATH 已配置,跳过${NC}" -fi - -# 创建全局命令 -cat > "$INSTALL_DIR/uclaw" << 'SCRIPT' -#!/bin/bash -UCLAW_HOME="$HOME/.uclaw" -exec "$UCLAW_HOME/node/bin/node" "$UCLAW_HOME/openclaw/openclaw.mjs" "$@" -SCRIPT -chmod +x "$INSTALL_DIR/uclaw" - -LOCAL_BIN="$HOME/.local/bin" -mkdir -p "$LOCAL_BIN" -ln -sf "$INSTALL_DIR/uclaw" "$LOCAL_BIN/uclaw" -ln -sf "$INSTALL_DIR/uclaw" "$LOCAL_BIN/openclaw" - -if [ -d "/usr/local/bin" ] && [ -w "/usr/local/bin" ]; then - ln -sf "$INSTALL_DIR/uclaw" /usr/local/bin/uclaw 2>/dev/null || true - ln -sf "$INSTALL_DIR/uclaw" /usr/local/bin/openclaw 2>/dev/null || true - echo -e " ${GREEN}已创建全局命令: uclaw / openclaw${NC}" -else - echo -e " ${GREEN}已创建用户命令: $LOCAL_BIN/uclaw / $LOCAL_BIN/openclaw${NC}" - echo -e " ${YELLOW}如需系统级命令,可运行 sudo ln -sf $INSTALL_DIR/uclaw /usr/local/bin/uclaw${NC}" -fi - -echo "" -echo -e " ${GREEN}╔══════════════════════════════════════╗${NC}" -echo -e " ${GREEN}║ 安装完成! ║${NC}" -echo -e " ${GREEN}╚══════════════════════════════════════╝${NC}" -echo "" -echo " 安装位置: $INSTALL_DIR" -echo " Node.js: ${NODE_VERSION_INSTALLED}" -echo "" -echo " 使用方法:" -echo " 1. 打开新的终端窗口" -echo " 2. 运行: openclaw onboard --install-daemon" -echo " 3. 配置完成后运行: openclaw dashboard" -echo "" -echo " 小白用户推荐:" -echo " 先按引导完成首次配置,再打开网页控制台" -echo "" -read -p " 按回车键关闭..." diff --git a/uclaw-scripts/README.txt b/uclaw-scripts/README.txt new file mode 100644 index 0000000..212185d --- /dev/null +++ b/uclaw-scripts/README.txt @@ -0,0 +1,51 @@ +======================================== + U-Claw 虾盘 v1.1 + 插上就能用的 AI 助手 + u-claw.org +======================================== + +【使用方法】 + + Mac 用户: 双击 Mac-Install.command + Windows 用户: 双击 Windows-Install.bat + + 就这一步!浏览器会自动打开。 + 脚本会把 U-Claw 解压到你的电脑(约2分钟),然后自动启动。 + +======================================== + +【常见问题】 + + Q: Mac 提示"无法验证开发者"怎么办? + A: 右键点击脚本 → 选择"打开" → 再点"打开" + + Q: Windows 弹出安全警告怎么办? + A: 点击"更多信息" → 点击"仍要运行" + + Q: 安装到哪里了? + A: Mac: ~/U-Claw + Windows: C:\Users\你的用户名\U-Claw + + Q: 怎么配置 AI 模型和 API Key? + A: 启动后浏览器会自动打开配置页面,按提示操作即可 + + Q: 支持哪些 AI 模型? + A: DeepSeek、Kimi、通义千问、智谱GLM、MiniMax、豆包 + 全部国内直连,不需要翻墙 + + Q: 怎么升级? + A: 重新运行安装脚本,选择"重新安装" + 你的配置和记忆会保留在 data/ 文件夹里 + + Q: Toolkit 文件夹是什么? + A: 给工程师的 DIY 素材包(Node.js + 源码),普通用户不需要 + +======================================== + +【联系我们】 + + 微信: hecare888 + 官网: u-claw.org + GitHub: github.com/dongsheng123132/u-claw + +======================================== diff --git a/uclaw-scripts/Windows-安装并启动.bat b/uclaw-scripts/Windows-Install.bat similarity index 57% rename from uclaw-scripts/Windows-安装并启动.bat rename to uclaw-scripts/Windows-Install.bat index 89e3c04..626fab4 100644 --- a/uclaw-scripts/Windows-安装并启动.bat +++ b/uclaw-scripts/Windows-Install.bat @@ -1,17 +1,17 @@ @echo off chcp 65001 >/dev/null 2>&1 -title U-Claw - Install and Launch +title U-Claw - Extract and Launch echo. echo ======================================== echo U-Claw v1.1 -echo Install and Launch (Windows) +echo Extract and Launch (Windows) echo ======================================== echo. -set "USB_DIR=%~dp0" -set "ARCHIVE=%USB_DIR%U-Claw.tar.gz" -set "INSTALL_DIR=%USERPROFILE%\U-Claw" +set "SCRIPT_DIR=%~dp0" +set "ARCHIVE=%SCRIPT_DIR%U-Claw.tar.gz" +set "INSTALL_DIR=%SCRIPT_DIR%U-Claw" REM Check archive if not exist "%ARCHIVE%" ( @@ -22,17 +22,17 @@ if not exist "%ARCHIVE%" ( exit /b 1 ) -REM Check if already installed +REM Check if already extracted if exist "%INSTALL_DIR%\app\core\node_modules" ( - echo U-Claw already installed at: %INSTALL_DIR% + echo U-Claw already extracted at: %INSTALL_DIR% echo. echo [1] Launch directly (skip extract) - echo [2] Reinstall (overwrite) + echo [2] Re-extract (overwrite) echo. set /p choice=" Choose [1/2, default 1]: " if "%choice%"=="2" ( echo. - echo Reinstalling... + echo Re-extracting... rmdir /s /q "%INSTALL_DIR%" >/dev/null 2>&1 ) else ( echo. @@ -43,26 +43,22 @@ if exist "%INSTALL_DIR%\app\core\node_modules" ( REM Extract echo. -echo Extracting U-Claw to %INSTALL_DIR% ... -echo This may take 1-2 minutes... +echo Extracting U-Claw to: %INSTALL_DIR% +echo This may take a few minutes... echo. where tar >/dev/null 2>&1 if %errorlevel%==0 ( - cd /d "%USERPROFILE%" + cd /d "%SCRIPT_DIR%" tar xzf "%ARCHIVE%" if %errorlevel% neq 0 ( echo Extract failed! Please extract U-Claw.tar.gz manually - echo using 7-Zip or WinRAR to %USERPROFILE% pause exit /b 1 ) ) else ( - echo tar command not available on this Windows version - echo Please extract U-Claw.tar.gz manually using 7-Zip or WinRAR - echo Extract to: %USERPROFILE% - echo. - echo Then run: %INSTALL_DIR%\Windows-Start.bat + echo tar not available. Please extract U-Claw.tar.gz manually + echo using 7-Zip or WinRAR to this directory. pause exit /b 1 ) @@ -71,7 +67,6 @@ echo Extract complete! echo. :start -REM Launch OpenClaw echo Starting OpenClaw... echo. diff --git a/uclaw-scripts/Windows-从U盘启动.bat b/uclaw-scripts/Windows-从U盘启动.bat deleted file mode 100644 index b92a105..0000000 --- a/uclaw-scripts/Windows-从U盘启动.bat +++ /dev/null @@ -1,88 +0,0 @@ -@echo off -chcp 65001 >nul 2>&1 -title U-Claw - OpenClaw Launcher - -echo. -echo ======================================== -echo U-Claw v1.1 -echo OpenClaw One-Click Launcher (Windows) -echo ======================================== -echo. -echo Recommended: temporary PC / no local install -echo. - -set "UCLAW_DIR=%~dp0" -set "OPENCLAW_DIR=%UCLAW_DIR%openclaw" -set "NODE_DIR=%UCLAW_DIR%runtime\node-win-x64" -set "NODE_BIN=%NODE_DIR%\node.exe" -set "NPM_BIN=%NODE_DIR%\npm.cmd" -set "PORTABLE_HOME=%UCLAW_DIR%portable-home" -set "PORTABLE_STATE_DIR=%PORTABLE_HOME%\.openclaw" -set "PORTABLE_CONFIG_PATH=%PORTABLE_STATE_DIR%\openclaw.json" - -set "OPENCLAW_HOME=%PORTABLE_HOME%" -set "OPENCLAW_STATE_DIR=%PORTABLE_STATE_DIR%" -set "OPENCLAW_CONFIG_PATH=%PORTABLE_CONFIG_PATH%" - -if not exist "%PORTABLE_STATE_DIR%" mkdir "%PORTABLE_STATE_DIR%" - -if not exist "%NODE_BIN%" ( - echo [ERROR] Node.js not found - echo Please ensure runtime\node-win-x64 directory is complete - echo. - pause - exit /b 1 -) - -for /f "tokens=*" %%v in ('"%NODE_BIN%" --version') do set NODE_VER=%%v -echo Node.js: %NODE_VER% -echo. - -set "PATH=%NODE_DIR%;%NODE_DIR%\node_modules\.bin;%PATH%" - -if not exist "%OPENCLAW_DIR%\node_modules" ( - echo First run - installing dependencies... - echo Using China mirror, please wait... - echo. - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" install --registry=https://registry.npmmirror.com - echo. - echo Dependencies installed! - echo. -) - -if not exist "%OPENCLAW_DIR%\dist" ( - echo First run - building... - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" run build - echo. -) - -cd /d "%OPENCLAW_DIR%" - -REM First run: auto-create minimal config (skip onboard) -if not exist "%PORTABLE_CONFIG_PATH%" ( - echo First run - initializing config... - if not exist "%PORTABLE_STATE_DIR%" mkdir "%PORTABLE_STATE_DIR%" - echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}} > "%PORTABLE_CONFIG_PATH%" - echo Config initialized - echo. -) - -echo Starting OpenClaw... -echo DO NOT close this window! -echo. -echo ---------------------------------------- -echo Browser will open automatically. -echo First time setup in web console: -echo 1. Choose AI model (DeepSeek / Kimi / Qwen) -echo 2. Connect chat platform (QQ / Feishu / DingTalk) -echo ---------------------------------------- -echo. - -start "" http://127.0.0.1:18789/#token=uclaw -"%NODE_BIN%" openclaw.mjs gateway run --allow-unconfigured --force - -echo. -echo OpenClaw stopped. You can safely remove the USB drive. -pause diff --git a/uclaw-scripts/Windows-全部功能.bat b/uclaw-scripts/Windows-全部功能.bat deleted file mode 100644 index 14e7f3c..0000000 --- a/uclaw-scripts/Windows-全部功能.bat +++ /dev/null @@ -1,495 +0,0 @@ -@echo off -chcp 65001 >nul 2>&1 -title U-Claw 虾盘 - 启动菜单 -setlocal enabledelayedexpansion - -set "UCLAW_DIR=%~dp0" -set "OPENCLAW_DIR=%UCLAW_DIR%openclaw" -set "NODE_DIR=%UCLAW_DIR%runtime\node-win-x64" -set "NODE_BIN=%NODE_DIR%\node.exe" -set "NPM_BIN=%NODE_DIR%\npm.cmd" -set "PORTABLE_HOME=%UCLAW_DIR%portable-home" -set "PORTABLE_STATE_DIR=%PORTABLE_HOME%\.openclaw" -set "PORTABLE_CONFIG_PATH=%PORTABLE_STATE_DIR%\openclaw.json" - -set "OPENCLAW_HOME=%PORTABLE_HOME%" -set "OPENCLAW_STATE_DIR=%PORTABLE_STATE_DIR%" -set "OPENCLAW_CONFIG_PATH=%PORTABLE_CONFIG_PATH%" -set "PATH=%NODE_DIR%;%PATH%" - -if not exist "%PORTABLE_STATE_DIR%" mkdir "%PORTABLE_STATE_DIR%" - -goto MENU - -:MENU -cls -echo. -echo ╔════════════════════════════════════════════════════════╗ -echo ║ ║ -echo ║ U-Claw 虾盘 v1.1 ║ -echo ║ OpenClaw AI 助手 一键安装盘 ║ -echo ║ ║ -echo ║ 专为中国用户优化 · 免翻墙 · 离线安装 ║ -echo ║ ║ -echo ╠════════════════════════════════════════════════════════╣ -echo ║ ║ - -:: 状态检测 -for /f "tokens=*" %%v in ('"%NODE_BIN%" --version 2^>nul') do set "NODE_VER=%%v" -set "ST_MOD=未安装" -set "ST_BUILD=未构建" -set "ST_INST=未安装" -set "ST_PORT=未配置" -if exist "%OPENCLAW_DIR%\node_modules" set "ST_MOD=已安装" -if exist "%OPENCLAW_DIR%\dist" set "ST_BUILD=已构建" -if exist "%USERPROFILE%\.uclaw\openclaw" set "ST_INST=已安装" -if exist "%PORTABLE_CONFIG_PATH%" set "ST_PORT=已配置" - -echo ║ 系统: x64 ^| Node: %NODE_VER% ║ -echo ║ 依赖: %ST_MOD% ^| 构建: %ST_BUILD% ║ -echo ║ 便携配置: %ST_PORT% ^| 电脑安装: %ST_INST% ║ -echo ║ ║ -echo ╠════════════════════════════════════════════════════════╣ -echo. -echo ---- 安装 ----------------------------------------- -echo. -echo [1] 安装 OpenClaw 到本机(仅限自己的电脑) -echo [2] 仅安装依赖(npm install) -echo [3] 仅构建项目(npm build) -echo [4] 直接从 U 盘运行(配置也保存在 U 盘里) -echo. -echo ---- 中国优化 ------------------------------------- -echo. -echo [5] 首次配置向导(选模型、选平台、填 API Key) -echo [6] 配置中国聊天平台(QQ Bot/飞书/微信) -echo [7] 设置国内镜像源 -echo. -echo ---- 维护工具 ------------------------------------- -echo. -echo [8] 诊断修复(openclaw doctor) -echo [9] 备份当前状态 -echo [10] 恢复备份 -echo [11] 重置 OpenClaw(恢复出厂) -echo [12] 清理缓存和临时文件 -echo. -echo ---- 其他 ----------------------------------------- -echo. -echo [13] 浏览预装技能(58个,已离线可用) -echo [14] 中国用户快速上手指南 -echo [15] 查看使用说明 -echo [16] 系统信息 -echo [17] 打开本地网页控制台 -echo [0] 退出 -echo. -echo ╚════════════════════════════════════════════════════════╝ -echo. - -set /p CHOICE=" 请选择 [0-17]: " - -if "%CHOICE%"=="1" goto INSTALL -if "%CHOICE%"=="2" goto NPM_INSTALL -if "%CHOICE%"=="3" goto BUILD -if "%CHOICE%"=="4" goto RUN -if "%CHOICE%"=="5" goto CHINA_MODELS -if "%CHOICE%"=="6" goto CHINA_CHANNELS -if "%CHOICE%"=="7" goto MIRROR -if "%CHOICE%"=="8" goto DOCTOR -if "%CHOICE%"=="9" goto BACKUP -if "%CHOICE%"=="10" goto RESTORE -if "%CHOICE%"=="11" goto RESET -if "%CHOICE%"=="12" goto CLEANUP -if "%CHOICE%"=="13" goto SKILLS -if "%CHOICE%"=="14" goto CHINA_GUIDE -if "%CHOICE%"=="15" goto README -if "%CHOICE%"=="16" goto SYSINFO -if "%CHOICE%"=="17" goto DASHBOARD -if "%CHOICE%"=="0" goto EXIT - -echo 无效选择 -pause -goto MENU - -:INSTALL -echo. -echo === 安装 OpenClaw 到电脑 === -echo. -echo 提醒:如果这是临时电脑、公司电脑或别人的电脑, -echo 更推荐返回主菜单选择 [4] 从 U 盘运行。 -echo. -call "%UCLAW_DIR%安装到电脑.bat" -pause -goto MENU - -:NPM_INSTALL -echo. -echo === 安装 npm 依赖 === -echo. -cd /d "%OPENCLAW_DIR%" -call "%NPM_BIN%" install --registry=https://registry.npmmirror.com -echo. -echo 依赖安装完成! -pause -goto MENU - -:BUILD -echo. -echo === 构建 OpenClaw === -echo. -if not exist "%OPENCLAW_DIR%\node_modules" ( - echo 先安装依赖... - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" install --registry=https://registry.npmmirror.com -) -cd /d "%OPENCLAW_DIR%" -call "%NPM_BIN%" run build -echo. -echo 构建完成! -pause -goto MENU - -:RUN -echo. -echo === 从 U 盘启动 OpenClaw === -echo. -echo 便携模式:配置、状态、记忆都会写在这只 U 盘里。 -echo 拔掉 U 盘后当前会话会结束,但换一台电脑再插上还能继续用。 -echo. -if not exist "%OPENCLAW_DIR%\node_modules" ( - echo 先安装依赖... - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" install --registry=https://registry.npmmirror.com -) -if not exist "%OPENCLAW_DIR%\dist" ( - echo 先构建... - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" run build -) -cd /d "%OPENCLAW_DIR%" -if not exist "%PORTABLE_CONFIG_PATH%" ( - echo 检测到你还没有完成首次配置。 - echo 首次配置会保存在 U 盘中,不会写进这台电脑。 - echo. - set /p DO_ONBOARD=" 现在开始首次配置? (y/n) " - if /i "!DO_ONBOARD!"=="y" ( - "%NODE_BIN%" openclaw.mjs onboard - echo. - echo 首次配置完成,已保存到 U 盘。 - ) -) else ( - echo 正在启动网关服务... - echo 此窗口不要关闭,关闭后服务会停止。 - echo. - "%NODE_BIN%" openclaw.mjs gateway run --allow-unconfigured --force -) -pause -goto MENU - -:CHINA_MODELS -echo. -echo === 首次配置向导 === -echo. -echo 国产模型选择提示: -echo. -echo DeepSeek → 选 Custom Provider -echo Base URL: https://api.deepseek.com/v1 -echo 模型名: deepseek-chat -echo Kimi → 选 Moonshot AI -echo 通义千问 → 选 Qwen -echo MiniMax → 选 MiniMax -echo 豆包 → 选 Volcano Engine -echo. -echo 按方向键上下滚动列表,回车确认 -echo. -if not exist "%OPENCLAW_DIR%\node_modules" ( - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" install --registry=https://registry.npmmirror.com -) -cd /d "%OPENCLAW_DIR%" -"%NODE_BIN%" openclaw.mjs onboard -pause -goto MENU - -:CHINA_CHANNELS -echo. -echo === 配置中国聊天平台 === -echo. -echo [a] 飞书 Feishu/Lark — 已内置,企业首选 -echo [b] QQ(腾讯官方)★推荐 — 3条命令,1分钟,免费免翻墙 -echo [c] 微信(社区插件) — iPad协议 -echo [d] Telegram — 推荐,简单好用 -echo. -set /p CH=" 请选择 (a-d): " - -if not exist "%OPENCLAW_DIR%\node_modules" ( - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" install --registry=https://registry.npmmirror.com -) -cd /d "%OPENCLAW_DIR%" - -if /i "%CH%"=="a" ( - echo. - echo 配置飞书 Feishu - echo 1. 访问 https://open.feishu.cn/app 创建应用 - echo 2. 获取 App ID 和 App Secret - echo 3. 配置事件订阅和权限 - echo. - "%NODE_BIN%" openclaw.mjs onboard -) -if /i "%CH%"=="b" ( - echo. - echo 配置 QQ(腾讯官方接入) - echo. - echo 这是国内最简单的 AI 助手接入方式! - echo 全程 1 分钟,完全免费,无需翻墙。 - echo. - echo 1. 扫码注册: http://q.qq.com/qqbot/openclaw/login.html - echo 2. 点击「创建机器人」,获取 AppID 和 AppSecret - echo. - if exist "%OPENCLAW_DIR%\dist" ( - set /p DO_QQ=" 是否现在安装 QQ 插件? (y/n) " - if /i "!DO_QQ!"=="y" ( - echo. - echo 正在安装 QQ 插件... - "%NODE_BIN%" openclaw.mjs plugins install @sliverp/qqbot@latest - echo. - set /p QQ_APP_ID=" AppID: " - echo. - set /p QQ_APP_SECRET=" AppSecret: " - echo. - if not "!QQ_APP_ID!"=="" if not "!QQ_APP_SECRET!"=="" ( - echo 正在绑定 QQ 机器人... - "%NODE_BIN%" openclaw.mjs channels add --channel qqbot --token "!QQ_APP_ID!:!QQ_APP_SECRET!" - echo. - set /p QQ_ALLOW=" 请输入你自己的 QQ 号(设置白名单,留空跳过): " - if not "!QQ_ALLOW!"=="" ( - "%NODE_BIN%" openclaw.mjs config set channels.qqbot.allowFrom "\"!QQ_ALLOW!\"" - echo 白名单已设置 - ) - echo. - echo QQ 机器人配置完成! - echo 请重启网关后生效(主菜单选 [4] 或 [17]) - ) - ) - ) -) -if /i "%CH%"=="c" ( - echo. - echo 配置微信(社区插件) - echo 安装微信插件: - "%NODE_BIN%" openclaw.mjs plugins install @icesword760/openclaw-wechat -) -if /i "%CH%"=="d" ( - echo. - echo 配置 Telegram - echo 1. 在 Telegram 中找 @BotFather - echo 2. 发送 /newbot 创建机器人 - echo 3. 获取 Bot Token - echo. - "%NODE_BIN%" openclaw.mjs onboard -) -pause -goto MENU - -:MIRROR -echo. -echo === 设置国内镜像源 === -echo. -cd /d "%OPENCLAW_DIR%" -call "%NPM_BIN%" config set registry https://registry.npmmirror.com --location=project -echo npm 镜像已设置: registry.npmmirror.com -pause -goto MENU - -:DOCTOR -echo. -echo === 诊断修复 === -echo. -echo 提示: 选 [17] 可打开网页控制台,在浏览器中查看完整状态 -echo. -if not exist "%OPENCLAW_DIR%\node_modules" ( - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" install --registry=https://registry.npmmirror.com -) -cd /d "%OPENCLAW_DIR%" -"%NODE_BIN%" openclaw.mjs doctor --repair -pause -goto MENU - -:BACKUP -echo. -echo === 备份当前状态 === -echo. -set "TIMESTAMP=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%" -set "TIMESTAMP=%TIMESTAMP: =0%" -set "BACKUP_DIR=%UCLAW_DIR%backups\backup_%TIMESTAMP%" -mkdir "%BACKUP_DIR%" 2>nul - -if exist "%PORTABLE_STATE_DIR%" ( - xcopy "%PORTABLE_STATE_DIR%" "%BACKUP_DIR%\portable-state\" /e /i /q >nul 2>&1 - echo [OK] 便携模式状态已备份 -) -if exist "%OPENCLAW_DIR%\.env" ( - copy "%OPENCLAW_DIR%\.env" "%BACKUP_DIR%\.env" >nul - echo [OK] .env 配置已备份 -) - -echo. -echo 备份完成! 位置: %BACKUP_DIR% -pause -goto MENU - -:RESTORE -echo. -echo === 恢复备份 === -echo. -set "BACKUP_BASE=%UCLAW_DIR%backups" -if not exist "%BACKUP_BASE%" ( - echo 没有找到任何备份 - pause - goto MENU -) -echo 可用备份: -dir /b "%BACKUP_BASE%" 2>nul -echo. -set /p RESTORE_NAME=" 输入备份名称: " -set "RESTORE_PATH=%BACKUP_BASE%\%RESTORE_NAME%" - -if not exist "%RESTORE_PATH%" ( - echo 备份不存在 - pause - goto MENU -) - -if exist "%RESTORE_PATH%\portable-state" ( - xcopy "%RESTORE_PATH%\portable-state" "%PORTABLE_STATE_DIR%\" /e /i /q /y >nul 2>&1 - echo [OK] 便携模式状态已恢复 -) -if exist "%RESTORE_PATH%\.env" ( - copy "%RESTORE_PATH%\.env" "%OPENCLAW_DIR%\.env" >nul - echo [OK] .env 已恢复 -) - -echo. -echo 恢复完成! -pause -goto MENU - -:RESET -echo. -echo === 重置 OpenClaw === -echo. -echo [1] 仅重置配置(保留凭据) -echo [2] 重置配置+凭据+会话 -echo [3] 完全重置(恢复出厂) -echo [0] 取消 -echo. -set /p RESET_CHOICE=" 选择重置级别: " - -if "%RESET_CHOICE%"=="0" goto MENU -if not exist "%OPENCLAW_DIR%\node_modules" ( - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" install --registry=https://registry.npmmirror.com -) -cd /d "%OPENCLAW_DIR%" - -if "%RESET_CHOICE%"=="1" "%NODE_BIN%" openclaw.mjs reset --scope config -if "%RESET_CHOICE%"=="2" "%NODE_BIN%" openclaw.mjs reset --scope config+creds+sessions -if "%RESET_CHOICE%"=="3" ( - set /p CONFIRM=" 确定完全重置? 输入 YES 确认: " - if "!CONFIRM!"=="YES" "%NODE_BIN%" openclaw.mjs reset --scope full -) -pause -goto MENU - -:CLEANUP -echo. -echo === 清理缓存 === -echo. -call "%NPM_BIN%" cache clean --force 2>nul -echo npm 缓存已清理 -if exist "%PORTABLE_STATE_DIR%\logs" ( - rmdir /s /q "%PORTABLE_STATE_DIR%\logs" 2>nul - echo 日志已清理 -) -echo. -echo 清理完成! -pause -goto MENU - -:SKILLS -echo. -echo === 预装技能 === -echo. -if not exist "%OPENCLAW_DIR%\node_modules" ( - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" install --registry=https://registry.npmmirror.com -) -cd /d "%OPENCLAW_DIR%" -"%NODE_BIN%" openclaw.mjs plugins list -pause -goto MENU - -:CHINA_GUIDE -echo. -if exist "%UCLAW_DIR%中国用户指南.txt" ( - type "%UCLAW_DIR%中国用户指南.txt" -) else ( - echo 指南文件不存在 -) -pause -goto MENU - -:README -echo. -if exist "%UCLAW_DIR%使用说明.txt" ( - type "%UCLAW_DIR%使用说明.txt" -) else ( - echo 使用说明文件不存在 -) -pause -goto MENU - -:SYSINFO -echo. -echo === 系统信息 === -echo. -echo 操作系统: %OS% -echo 处理器: %PROCESSOR_ARCHITECTURE% -echo Node.js: %NODE_VER% -echo U-Claw 路径: %UCLAW_DIR% -echo 便携配置: %ST_PORT% -echo. -if exist "%USERPROFILE%\.uclaw" ( - echo 已安装路径: %USERPROFILE%\.uclaw -) else ( - echo 电脑安装: 未安装 -) -echo. -pause -goto MENU - -:DASHBOARD -echo. -echo === 启动网关 + 打开网页控制台 === -echo. -if not exist "%PORTABLE_CONFIG_PATH%" ( - echo 你还没有完成便携配置。请先选 [4] 从 U 盘运行。 - pause - goto MENU -) -if not exist "%OPENCLAW_DIR%\node_modules" ( - cd /d "%OPENCLAW_DIR%" - call "%NPM_BIN%" install --registry=https://registry.npmmirror.com -) -cd /d "%OPENCLAW_DIR%" -echo 此窗口不要关闭,关闭后服务会停止。 -echo. -"%NODE_BIN%" openclaw.mjs gateway run --allow-unconfigured --force -pause -goto MENU - -:EXIT -echo. -echo 再见! -echo. -exit /b 0 diff --git a/uclaw-scripts/Windows-安装到电脑.bat b/uclaw-scripts/Windows-安装到电脑.bat deleted file mode 100644 index b0b13bf..0000000 --- a/uclaw-scripts/Windows-安装到电脑.bat +++ /dev/null @@ -1,111 +0,0 @@ -@echo off -chcp 65001 >nul 2>&1 -title U-Claw 虾盘 - 安装 OpenClaw 到电脑 - -echo. -echo ╔══════════════════════════════════════╗ -echo ║ U-Claw 虾盘 v1.1 ║ -echo ║ OpenClaw 永久安装 (Windows) ║ -echo ╚══════════════════════════════════════╝ -echo. - -set "UCLAW_DIR=%~dp0" -set "INSTALL_DIR=%USERPROFILE%\.uclaw" - -echo 安装位置: %INSTALL_DIR% -echo 安装内容: Node.js + OpenClaw + 所有依赖 -echo. -echo [安全提醒] 这会把 OpenClaw 和配置写入当前电脑。 -echo 如果这是老电脑、共享电脑、公司电脑或临时机器, -echo 更推荐回到主菜单选择「直接从 U 盘运行」。 -echo. -set /p CONFIRM=" 是否继续安装? (y/n) " -if /i not "%CONFIRM%"=="y" ( - echo 已取消安装 - pause - exit /b 0 -) -echo. - -echo [1/4] 创建安装目录... -if not exist "%INSTALL_DIR%" mkdir "%INSTALL_DIR%" - -echo [2/4] 安装 Node.js 运行环境... -if exist "%INSTALL_DIR%\node" rmdir /s /q "%INSTALL_DIR%\node" -xcopy "%UCLAW_DIR%runtime\node-win-x64" "%INSTALL_DIR%\node\" /e /i /q >nul -if not exist "%INSTALL_DIR%\node\node.exe" ( - echo [错误] Node.js 安装失败 - echo 请确认 U 盘复制完成,再重新运行安装。 - pause - exit /b 1 -) -for /f "tokens=*" %%v in ('"%INSTALL_DIR%\node\node.exe" --version') do echo Node.js %%v 已安装 - -echo [3/4] 安装 OpenClaw... -echo 这一步会复制大量文件,首次安装通常需要 3-10 分钟,请耐心等待... -if exist "%INSTALL_DIR%\openclaw" rmdir /s /q "%INSTALL_DIR%\openclaw" -xcopy "%UCLAW_DIR%openclaw" "%INSTALL_DIR%\openclaw\" /e /i /q >nul - -if exist "%UCLAW_DIR%memory" xcopy "%UCLAW_DIR%memory" "%INSTALL_DIR%\memory\" /e /i /q >nul 2>&1 -if exist "%UCLAW_DIR%persona" xcopy "%UCLAW_DIR%persona" "%INSTALL_DIR%\persona\" /e /i /q >nul 2>&1 - -echo [4/4] 配置环境变量... - -( -echo @echo off -echo set "UCLAW_HOME=%%USERPROFILE%%\.uclaw" -echo "%%UCLAW_HOME%%\node\node.exe" "%%UCLAW_HOME%%\openclaw\openclaw.mjs" %%* -) > "%INSTALL_DIR%\uclaw.cmd" - -( -echo @echo off -echo set "UCLAW_HOME=%%USERPROFILE%%\.uclaw" -echo "%%UCLAW_HOME%%\node\node.exe" "%%UCLAW_HOME%%\openclaw\openclaw.mjs" %%* -) > "%INSTALL_DIR%\openclaw.cmd" - -echo. -echo 正在添加到系统 PATH... -set "CURRENT_PATH=" -for /f "tokens=2*" %%a in ('reg query "HKCU\Environment" /v PATH 2^>nul') do set "CURRENT_PATH=%%b" - -echo %CURRENT_PATH% | findstr /i ".uclaw" >nul 2>&1 -if errorlevel 1 ( - REM 检查 PATH 是否为空(全新账户) - if not defined CURRENT_PATH ( - setx PATH "%INSTALL_DIR%;%INSTALL_DIR%\node" >nul 2>&1 - ) else ( - REM 检查 setx 1024 字符限制 - set "NEW_PATH=%INSTALL_DIR%;%INSTALL_DIR%\node;%CURRENT_PATH%" - setlocal enabledelayedexpansion - if "!NEW_PATH:~1024,1!" neq "" ( - echo [警告] PATH 超过 1024 字符,setx 会截断! - echo 请手动添加以下路径到系统 PATH: - echo %INSTALL_DIR% - echo %INSTALL_DIR%\node - endlocal - ) else ( - endlocal - setx PATH "%INSTALL_DIR%;%INSTALL_DIR%\node;%CURRENT_PATH%" >nul 2>&1 - ) - ) - echo 已添加到用户 PATH -) else ( - echo PATH 已配置,跳过 -) - -echo. -echo ╔══════════════════════════════════════╗ -echo ║ 安装完成! ║ -echo ╚══════════════════════════════════════╝ -echo. -echo 安装位置: %INSTALL_DIR% -echo. -echo 使用方法: -echo 1. 打开新的命令提示符或 PowerShell -echo 2. 运行: openclaw onboard --install-daemon -echo 3. 配置完成后运行: openclaw dashboard -echo. -echo 小白用户推荐: -echo 先按引导完成首次配置,再打开网页控制台 -echo. -pause diff --git a/uclaw-scripts/中国用户指南.txt b/uclaw-scripts/中国用户指南.txt deleted file mode 100644 index 47ceb73..0000000 --- a/uclaw-scripts/中国用户指南.txt +++ /dev/null @@ -1,156 +0,0 @@ -╔══════════════════════════════════════════════════════════╗ -║ ║ -║ U-Claw 虾盘 — 中国用户快速上手指南 ║ -║ ║ -╚══════════════════════════════════════════════════════════╝ - - -第一步:选择 AI 模型 -══════════════════════ - -OpenClaw 支持大量国产模型,以下是推荐: - -1. DeepSeek(深度求索)—— 推荐首选 - - 便宜好用,编程能力强 - - 注册: https://platform.deepseek.com/ - - 免费额度: 有 - -2. Kimi(月之暗面)—— 超长上下文 - - 256K 上下文,适合长文档 - - 注册: https://platform.moonshot.cn/ - - 免费额度: 有 - -3. 通义千问 Qwen(阿里)—— 免费额度最大 - - 注册: https://dashscope.console.aliyun.com/ - - 免费额度: 非常多 - -4. 智谱 GLM(清华系)—— 学术场景强 - - 注册: https://open.bigmodel.cn/ - - 免费额度: 有 - -5. MiniMax —— 语音和多模态强 - - 注册: https://platform.minimaxi.com/ - -6. 豆包 Doubao(字节跳动)—— 火山引擎 - - 注册: https://console.volcengine.com/ark - -7. 百度千帆 —— 百度智能云 - - 注册: https://console.bce.baidu.com/qianfan/ - -8. 小米 Mimo - - 注册: https://dev.mi.com/mimo - -在启动菜单选 [5] 即可一键配置 - - -第二步:选择聊天平台 -══════════════════════ - -让 AI 接入你的聊天工具: - -已内置: - - QQ(腾讯官方)★ — 国内首选!3条命令搞定,免费免翻墙 - - 飞书 Feishu — 企业首选,功能最全 - - Telegram — 海外推荐 - - Discord — 游戏/社区 - - WhatsApp — 海外用户 - - Slack — 外企用户 - -QQ 接入方法(腾讯官方,1分钟搞定): - 1. 扫码注册: http://q.qq.com/qqbot/openclaw/login.html - 2. 点击"创建机器人",获取 AppID 和 AppSecret - 3. 运行 3 条命令: - openclaw plugins install @sliverp/qqbot@latest - openclaw channels add --channel qqbot --token "AppID:AppSecret" - openclaw gateway restart - 4. 安全: 记得设置白名单 openclaw config set channels.qqbot.allowFrom "你的QQ号" - 详见: 启动菜单 [6] 中国聊天平台 - -微信接入: - - 社区插件: openclaw plugins install @icesword760/openclaw-wechat - - 基于 iPad 协议,支持文字/图片/文件 - - -第三步:常用技能(Skills) -══════════════════════════ - -U-Claw 已预装 52 个技能,以下是最实用的: - -【效率工具】 - - github — GitHub 操作(Issues/PR/代码审查) - - coding-agent — 委派编程任务给其他 AI - - summarize — 总结文本/网页/播客 - - nano-pdf — 自然语言编辑 PDF - -【笔记 & 任务】 - - apple-notes — Apple 备忘录自动化 - - obsidian — Obsidian 笔记操作 - - notion — Notion 页面和数据库 - - apple-reminders— Apple 提醒事项 - - things-mac — Things 3 任务管理 - - trello — Trello 看板 - -【AI & 创作】 - - openai-image-gen — AI 图片生成 - - openai-whisper — 语音转文字 - - gemini — Gemini 一键问答 - - sag — ElevenLabs 文字转语音 - -【通讯】 - - himalaya — 邮件收发(IMAP/SMTP) - - discord — Discord 消息操作 - - slack — Slack 消息操作 - - wacli — WhatsApp 消息 - -【系统 & 搜索】 - - weather — 天气查询 - - peekaboo — macOS 屏幕截图和自动化 - - tmux — 远程终端管理 - - clawhub — 搜索安装更多技能 - -使用方法: 在 OpenClaw 对话中直接说 "帮我查天气" 或 "帮我发邮件" 即可 - - -第四步:日常使用场景 -══════════════════════ - -场景1: 编程助手 - "帮我写一个 Python 脚本,批量重命名文件" - "审查这个 PR: #123" - -场景2: 内容创作 - "帮我总结这篇文章: [URL]" - "帮我生成一张关于AI的图片" - -场景3: 日常办公 - "帮我发邮件给 xxx@example.com,主题是..." - "帮我在 Notion 创建一个新页面" - "提醒我明天下午3点开会" - -场景4: 信息查询 - "今天深圳天气怎么样?" - "帮我搜索 GitHub 上最新的 AI 项目" - -场景5: 多平台 AI 助手 - 配置飞书/QQ/Telegram 后,直接在聊天中 @AI 即可 - - -遇到问题? -══════════════════════ - -1. 插 U 盘,双击「启动菜单」 -2. 选 [8] 诊断修复 -3. 如果修不好,选 [11] 重置 -4. 重置前会自动提醒你备份 - -安全提醒: - - 老电脑、共享电脑、公司电脑、临时借用电脑 - 更推荐直接从 U 盘运行 - - 尽量不要把 OpenClaw 和配置安装到不受你控制的本机里 - - 直接从 U 盘运行时,配置和记忆会保存在 U 盘中 - - 同一只 U 盘换一台电脑继续插上,仍然能接着用 - - 但运行过程中不要拔盘,拔掉后当前会话会结束 - -加入社区: - - u-claw.org - - GitHub: github.com/dongsheng123132/u-claw diff --git a/uclaw-scripts/使用说明.txt b/uclaw-scripts/使用说明.txt deleted file mode 100644 index 0974e07..0000000 --- a/uclaw-scripts/使用说明.txt +++ /dev/null @@ -1,123 +0,0 @@ -╔══════════════════════════════════════════════════════════╗ -║ ║ -║ U-Claw 虾盘 v1.0 ║ -║ OpenClaw 离线安装 U 盘 ║ -║ ║ -║ by OpenClaw Community ║ -║ u-claw.org ║ -║ ║ -╚══════════════════════════════════════════════════════════╝ - -什么是 U-Claw? -═══════════════ -U-Claw 虾盘是 OpenClaw(开源 AI 助手)的离线安装包。 -就像当年的"雨林木风"Windows 光盘一样, -把所有依赖打包好,插上 U 盘就能用。 - -特别适合中国大陆用户 - 不需要访问 GitHub、npm 等海外服务。 - - -U 盘里有什么? -═══════════════ -U-Claw/ -├── 运行.command <- Mac 用户双击这个 -├── 运行.bat <- Windows 用户双击这个 -├── 安装到电脑.command <- Mac 永久安装 -├── 安装到电脑.bat <- Windows 永久安装 -├── runtime/ <- Node.js 运行环境 (Mac/Win) -├── openclaw/ <- OpenClaw 源码 + 依赖 -├── memory/ <- AI 记忆文件 -├── persona/ <- AI 人格配置 -├── skills/ <- AI 技能 -└── 使用说明.txt <- 你正在看的这个 - - -快速开始 -═══════════════ - -【方式一:直接从 U 盘运行(推荐)】 - - Mac 用户: - 1. 插入 U 盘 - 2. 打开 U-Claw 文件夹 - 3. 双击 "运行.command" - 4. 如果提示"无法打开",右键 -> 打开 - 5. 等待启动完成 - - Windows 用户: - 1. 插入 U 盘 - 2. 打开 U-Claw 文件夹 - 3. 双击 "运行.bat" - 4. 等待启动完成 - - 首次运行可能需要几分钟检查环境(主要文件已预打包) - 首次配置、记忆和状态会直接保存在这只 U 盘里 - 回家再插到另一台电脑,仍然可以继续使用同一套配置 - 如果是老电脑、共享电脑、公司电脑、临时借来的电脑, - 强烈建议用这种方式,不要安装到本机。 - - 注意: - 1. 便携模式运行时,U 盘不能拔掉 - 2. 拔掉 U 盘后,这次运行就会结束 - 3. 但下次把同一只 U 盘插到别的电脑上,仍可继续运行 - - -【方式二:安装到电脑(仅推荐你自己的电脑)】 - - Mac 用户: - 1. 双击 "安装到电脑.command" - 2. 按提示操作 - 3. 安装后在终端输入 openclaw 即可使用 - - Windows 用户: - 1. 双击 "安装到电脑.bat" - 2. 按提示操作 - 3. 安装后在命令提示符输入 openclaw 即可使用 - - 安装位置: ~/.uclaw/ (Mac) 或 %USERPROFILE%\.uclaw\ (Win) - 注意: 这会把程序和配置写入本机。 - 如果不是你自己的长期使用电脑,请尽量不要选这个方式。 - - -系统要求 -═══════════════ -- macOS 12+ (Intel 或 Apple Silicon) -- Windows 10/11 (64位) -- 内存: 2GB 以上(推荐 4GB+) -- 磁盘: 2GB 可用空间 - - -更新方法 -═══════════════ -下载新版 U-Claw,重新运行 "安装到电脑" 即可覆盖更新。 -你的记忆文件和配置会自动保留。 - - -常见问题 -═══════════════ - -Q: Mac 提示"无法打开,因为它来自身份不明的开发者" -A: 右键点击文件 -> 选择 "打开" -> 再点 "打开" - -Q: Windows 提示"Windows 已保护你的电脑" -A: 点击 "更多信息" -> "仍要运行" - -Q: 运行报错 "Node.js v22+ is required" -A: U-Claw 自带 Node.js,请确保从 U-Claw 文件夹内启动 - -Q: 如何配置 AI 模型的 API Key? -A: 运行 openclaw 后按引导配置,或编辑 openclaw/.env 文件 - -Q: 能换电脑继续用吗? -A: 可以。使用「直接从 U 盘运行」时,配置和状态保存在 U 盘里。 - 同一只 U 盘插到另一台兼容电脑上,可以继续使用。 - -Q: 能离线使用吗? -A: OpenClaw 本身需要联网调用 AI API(如 Claude、DeepSeek)。 - 但安装过程完全离线,不需要访问 GitHub 或 npm。 - - -获取帮助 -═══════════════ -- OpenClaw 官方: https://github.com/openclaw/openclaw -- U-Claw 项目: https://u-claw.org diff --git a/小红书二维码.jpg b/小红书二维码.jpg deleted file mode 100644 index 8735c1f3604ec14ad99f817e6c8b458547a0ab72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75734 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,^3^gjkjH|mb(@rJ}GzCJZK8r2)ulO9 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 diff --git a/微信二维码.jpg b/微信二维码.jpg deleted file mode 100644 index af269b1d046a4a228914d46c9a34ab7c0450563f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147751 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