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
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -2,6 +2,9 @@
|
|||||||
U-Claw/
|
U-Claw/
|
||||||
U-Claw-v2/
|
U-Claw-v2/
|
||||||
|
|
||||||
|
# Toolkit (engineer DIY package, local only)
|
||||||
|
Toolkit/
|
||||||
|
|
||||||
# Marketing assets
|
# Marketing assets
|
||||||
marketing/
|
marketing/
|
||||||
marketing.zip
|
marketing.zip
|
||||||
|
|||||||
344
README.md
344
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 盘 — 专为中国用户打造,全球可用**
|
> 像当年的雨林木风,把 AI 助手简化到"双击运行"。
|
||||||
|
|
||||||
> Like the legendary [YuLinMuFeng](https://en.wikipedia.org/wiki/Ylmf) Windows discs, but for AI.
|
|
||||||
> 就像当年的雨林木风,把 AI 助手的安装简化到"插 U 盘,双击运行"。
|
|
||||||
|
|
||||||
[](https://opensource.org/licenses/MIT)
|
[](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
|
U 盘上有安装脚本,双击自动解压 + 启动:
|
||||||
- 📦 **Fully offline / 完全离线** — No internet needed for installation
|
- Mac: `Mac-Install.command`
|
||||||
- 💸 **Lower TCO / 总成本更低** — For repeated deployments, often cheaper than cloud-only rollout
|
- Windows: `Windows-Install.bat`
|
||||||
- 🇨🇳 **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
|
|
||||||
|
|
||||||
## Quick Start / 快速开始
|
### 方法 3:复制别人的
|
||||||
|
|
||||||
### 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.
|
|
||||||
|
|
||||||
直接把 `U-Claw/` 文件夹复制一份就行。
|
直接把 `U-Claw/` 文件夹复制一份就行。
|
||||||
|
|
||||||
## USB Contents / U 盘内容
|
## 目录结构
|
||||||
|
|
||||||
```
|
```
|
||||||
U-Claw/ (~1.3GB, 8GB USB minimum)
|
U-Claw/ (~2.3GB)
|
||||||
│
|
├── Mac-Start.command ← Mac 双击启动
|
||||||
├── Mac-从U盘启动.command ← macOS: run from USB
|
├── Windows-Start.bat ← Windows 双击启动
|
||||||
├── Windows-从U盘启动.bat ← Windows: run from USB
|
├── Mac-Menu.command ← Mac 配置/维护菜单
|
||||||
├── Mac-全部功能.command ← macOS: full feature menu
|
├── Windows-Menu.bat ← Windows 配置/维护菜单
|
||||||
├── Windows-全部功能.bat ← Windows: full feature menu
|
├── U-Claw.html ← 导航页面
|
||||||
├── Mac-安装到电脑.command ← Install to Mac permanently
|
├── app/
|
||||||
├── Windows-安装到电脑.bat ← Install to Windows permanently
|
│ ├── core/ ← OpenClaw + 依赖 + QQ 插件
|
||||||
├── 使用说明.txt ← Basic instructions
|
│ └── runtime/
|
||||||
├── 中国用户指南.txt ← China quick-start guide
|
│ ├── node-mac-arm64/ ← Mac Apple Silicon
|
||||||
├── 教程-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
|
│ └── node-win-x64/ ← Windows 64-bit
|
||||||
│
|
├── data/ ← 用户数据(配置、记忆、备份)
|
||||||
├── openclaw/ ← OpenClaw + node_modules + dist
|
│ ├── .openclaw/
|
||||||
│ ├── skills/ ← 52 pre-installed skills
|
│ ├── memory/
|
||||||
│ └── extensions/ ← 42 channel extensions
|
│ └── backups/
|
||||||
│
|
└── system/
|
||||||
├── memory/ ← AI memory (user data)
|
└── migrate.js ← 配置迁移脚本
|
||||||
├── persona/ ← AI personality config
|
|
||||||
└── backups/ ← Auto-created backups
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Launcher Menu / 启动菜单
|
## 菜单功能
|
||||||
|
|
||||||
17 functions, inspired by YuLinMuFeng (雨林木风) installer UI:
|
精简到 8 个选项:
|
||||||
|
|
||||||
```
|
```
|
||||||
╔════════════════════════════════════════════════════════╗
|
[1] 配置向导(选模型、API Key)
|
||||||
║ 🦞 U-Claw 虾盘 v1.1 ║
|
[2] 打开网页控制台
|
||||||
║ Optimized for China · Offline · One-click ║
|
[3] QQ 机器人(已预装,只需输入 ID)
|
||||||
╠════════════════════════════════════════════════════════╣
|
[4] 其他平台(飞书/Telegram/微信)
|
||||||
|
[5] 诊断修复
|
||||||
━━ Install ━━
|
[6] 备份配置
|
||||||
[1] Run from USB [2] Install to computer
|
[7] 恢复备份
|
||||||
[3] System info [4] OpenClaw status
|
[8] 系统信息
|
||||||
|
|
||||||
━━ 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
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Supported AI Models / 支持的 AI 模型
|
## 支持的 AI 模型
|
||||||
|
|
||||||
### Chinese Models (no VPN needed) / 国产模型(无需翻墙)
|
### 国产模型(无需翻墙)
|
||||||
|
|
||||||
| Model 模型 | Provider 提供商 | Best for 推荐场景 |
|
| 模型 | 推荐场景 |
|
||||||
|------------|----------------|-------------------|
|
|------|----------|
|
||||||
| DeepSeek | 深度求索 | Coding, best value / 编程,性价比首选 |
|
| DeepSeek | 编程,性价比首选 |
|
||||||
| Kimi K2.5 | 月之暗面 Moonshot | Long docs, 256K context / 长文档 |
|
| Kimi K2.5 | 长文档,256K 上下文 |
|
||||||
| Qwen | 阿里通义千问 | Large free tier / 免费额度大 |
|
| 通义千问 Qwen | 免费额度大 |
|
||||||
| GLM 4.7 | 智谱AI Zhipu | Academic, Chinese NLP / 学术 |
|
| 智谱 GLM | 学术 |
|
||||||
| MiniMax | MiniMax | Voice, multimodal / 语音 |
|
| MiniMax | 语音、多模态 |
|
||||||
| Doubao | 字节豆包 ByteDance | Volcano Engine / 火山引擎 |
|
| 豆包 Doubao | 火山引擎 |
|
||||||
| Qianfan | 百度千帆 Baidu | Baidu Cloud / 百度云 |
|
|
||||||
| Mimo | 小米 Xiaomi | Xiaomi ecosystem / 小米生态 |
|
|
||||||
|
|
||||||
### International Models / 国际模型
|
### 国际模型
|
||||||
|
|
||||||
| Model | Provider | Best for |
|
Claude (Anthropic) · GPT (OpenAI) · Gemini (Google)
|
||||||
|-------|----------|----------|
|
|
||||||
| Claude | Anthropic | Best overall + coding |
|
|
||||||
| GPT | OpenAI | Wide compatibility |
|
|
||||||
| Gemini | Google | Free tier |
|
|
||||||
|
|
||||||
## Supported Chat Platforms / 支持的聊天平台
|
## 聊天平台
|
||||||
|
|
||||||
| Platform 平台 | Status 状态 | Notes 说明 |
|
| 平台 | 状态 | 说明 |
|
||||||
|---------------|------------|------------|
|
|------|------|------|
|
||||||
| QQ | ✅ **Official** 腾讯官方 | 3 commands, 1 min, free / 3条命令搞定 |
|
| QQ | ✅ **已预装** | 只需输入 AppID + AppSecret |
|
||||||
| Feishu 飞书 | ✅ Built-in 已内置 | Enterprise best / 企业首选 |
|
| 飞书 | ✅ 内置 | 企业首选 |
|
||||||
| WeChat 微信 | ✅ Community plugin | iPad protocol |
|
| Telegram | ✅ 内置 | 海外推荐 |
|
||||||
| Telegram | ✅ Built-in | Recommended for intl users |
|
| 微信 | ✅ 社区插件 | iPad 协议 |
|
||||||
| Discord | ✅ Built-in | Gaming / community |
|
| Discord | ✅ 内置 | — |
|
||||||
| WhatsApp | ✅ Built-in | International users |
|
| WhatsApp | ✅ 内置 | — |
|
||||||
| Slack | ✅ Built-in | Enterprise (intl) |
|
|
||||||
| WeCom 企业微信 | 🔜 Coming | — |
|
|
||||||
| DingTalk 钉钉 | 🔜 Coming | — |
|
|
||||||
|
|
||||||
### 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条命令:
|
- **macOS**: Apple Silicon (M1-M4), macOS 12+
|
||||||
openclaw plugins install @sliverp/qqbot@latest
|
- **Windows**: 10/11, 64-bit
|
||||||
openclaw channels add --channel qqbot --token "AppID:AppSecret"
|
- **内存**: 2GB+(推荐 4GB+)
|
||||||
openclaw gateway restart
|
- **存储**: 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
|
|
||||||
```
|
```
|
||||||
|
u-claw/
|
||||||
## Contributing / 参与贡献
|
├── portable/ ← 脚本源码(打包进 U-Claw)
|
||||||
|
├── uclaw-scripts/ ← U 盘安装脚本
|
||||||
PRs welcome! Especially needed / 欢迎 PR,特别需要:
|
├── website/ ← 官网
|
||||||
|
├── docs/ ← 文档
|
||||||
- 🔧 More platform repair scripts / 更多平台修复脚本
|
└── README.md
|
||||||
- 📖 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
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 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
|
## FAQ
|
||||||
|
|
||||||
**Q: Do end users need a VPN? / 用户需要翻墙吗?**
|
**Q: 需要翻墙吗?**
|
||||||
A: No for installation. Runtime needs internet for AI APIs — Chinese models (DeepSeek etc.) work without VPN.
|
安装不需要。运行需要联网调 AI API,国产模型无需翻墙。
|
||||||
安装不需要。运行需要联网调 API,国产模型无需翻墙。
|
|
||||||
|
|
||||||
**Q: USB drive size? / U 盘要多大?**
|
**Q: 能分发吗?**
|
||||||
A: 8GB minimum, 16GB recommended.
|
可以,MIT 协议,随便复制。
|
||||||
|
|
||||||
**Q: Can I share it? / 能分发吗?**
|
**Q: Windows 需要 WSL 吗?**
|
||||||
A: Yes, unlimited. MIT license, copy freely.
|
不需要,自带 Windows 版 Node.js。
|
||||||
可以,无限制,MIT 协议。
|
|
||||||
|
|
||||||
**Q: Windows needs WSL? / Windows 需要 WSL 吗?**
|
|
||||||
A: No. U-Claw bundles Windows Node.js, runs natively via `.bat`.
|
|
||||||
不需要。自带 Windows 版 Node.js。
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
[MIT](LICENSE) — Free to use, modify, distribute.
|
[MIT](LICENSE)
|
||||||
|
|
||||||
自由使用、修改、分发。
|
## 联系
|
||||||
|
|
||||||
## Contact / 联系方式
|
- 微信: hecare888
|
||||||
|
- GitHub: [@dongsheng123132](https://github.com/dongsheng123132)
|
||||||
- **WeChat 微信**: Scan QR below / 扫码添加
|
- 官网: [u-claw.org](https://u-claw.org)
|
||||||
|
|
||||||
<img src="微信二维码.jpg" alt="WeChat QR" width="200">
|
|
||||||
|
|
||||||
- **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)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Made with 🦞 by [dongsheng](https://github.com/dongsheng123132) & OpenClaw Community**
|
**Made with 🦞 by [dongsheng](https://github.com/dongsheng123132)**
|
||||||
|
|
||||||
**Website: [u-claw.org](https://u-claw.org)** · **Email: hefangsheng@gmail.com**
|
|
||||||
|
|||||||
177
build-uclaw.sh
177
build-uclaw.sh
@@ -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 ""
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
@echo off
|
@echo off
|
||||||
chcp 65001 >/dev/null 2>&1
|
chcp 65001 >/dev/null 2>&1
|
||||||
title U-Claw - Full Menu
|
title U-Claw Menu
|
||||||
|
|
||||||
set "UCLAW_DIR=%~dp0"
|
set "UCLAW_DIR=%~dp0"
|
||||||
set "CORE_DIR=%UCLAW_DIR%app\core"
|
set "CORE_DIR=%UCLAW_DIR%app\core"
|
||||||
@@ -8,12 +8,11 @@ set "DATA_DIR=%UCLAW_DIR%data"
|
|||||||
set "STATE_DIR=%DATA_DIR%\.openclaw"
|
set "STATE_DIR=%DATA_DIR%\.openclaw"
|
||||||
set "NODE_DIR=%UCLAW_DIR%app\runtime\node-win-x64"
|
set "NODE_DIR=%UCLAW_DIR%app\runtime\node-win-x64"
|
||||||
set "NODE_BIN=%NODE_DIR%\node.exe"
|
set "NODE_BIN=%NODE_DIR%\node.exe"
|
||||||
set "NPM_BIN=%NODE_DIR%\npm.cmd"
|
|
||||||
|
|
||||||
set "OPENCLAW_HOME=%DATA_DIR%"
|
set "OPENCLAW_HOME=%DATA_DIR%"
|
||||||
set "OPENCLAW_STATE_DIR=%STATE_DIR%"
|
set "OPENCLAW_STATE_DIR=%STATE_DIR%"
|
||||||
set "OPENCLAW_CONFIG_PATH=%STATE_DIR%\openclaw.json"
|
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 "%STATE_DIR%" mkdir "%STATE_DIR%"
|
||||||
if not exist "%DATA_DIR%\memory" mkdir "%DATA_DIR%\memory"
|
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
|
cls
|
||||||
echo.
|
echo.
|
||||||
echo ========================================
|
echo ========================================
|
||||||
echo U-Claw v1.1 - Full Menu
|
echo U-Claw v1.1 - Menu
|
||||||
|
echo Portable AI Agent
|
||||||
echo ========================================
|
echo ========================================
|
||||||
echo.
|
echo.
|
||||||
|
|
||||||
if exist "%NODE_BIN%" (
|
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 (
|
) else (
|
||||||
echo [!] Node.js not found
|
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)
|
if exist "%STATE_DIR%\openclaw.json" (echo Config: OK) else (echo Config: NOT SET)
|
||||||
echo.
|
echo.
|
||||||
echo -- Start --
|
echo -- Config --
|
||||||
echo [1] Quick start (gateway + browser)
|
echo [1] Setup wizard (model, API key)
|
||||||
echo [2] Setup wizard (choose model, API key)
|
echo [2] Open web dashboard
|
||||||
echo.
|
echo.
|
||||||
echo -- China Platforms --
|
echo -- Chat Platforms --
|
||||||
echo [3] QQ Bot setup (Tencent official)
|
echo [3] QQ Bot (pre-installed, enter ID only)
|
||||||
echo [4] Feishu / DingTalk / WeChat
|
echo [4] Other platforms (Feishu/Telegram/WeChat)
|
||||||
echo.
|
|
||||||
echo -- Skills --
|
|
||||||
echo [5] Browse pre-installed skills (52)
|
|
||||||
echo [6] Install skill from ClawHub
|
|
||||||
echo.
|
echo.
|
||||||
echo -- Maintenance --
|
echo -- Maintenance --
|
||||||
echo [7] Diagnostics (openclaw doctor)
|
echo [5] Diagnostics
|
||||||
echo [8] Backup config and memory
|
echo [6] Backup config
|
||||||
echo [9] Restore backup
|
echo [7] Restore backup
|
||||||
echo [10] Reset (factory default)
|
echo [8] System info
|
||||||
echo.
|
echo.
|
||||||
echo -- Other --
|
|
||||||
echo [11] Open web dashboard
|
|
||||||
echo [12] System info
|
|
||||||
echo [13] Set China mirror
|
|
||||||
echo [0] Exit
|
echo [0] Exit
|
||||||
echo.
|
echo.
|
||||||
set /p choice=" Choose [0-13]: "
|
set /p choice=" Choose [0-8]: "
|
||||||
|
|
||||||
if "%choice%"=="1" goto :start
|
if "%choice%"=="1" goto :onboard
|
||||||
if "%choice%"=="2" goto :onboard
|
if "%choice%"=="2" goto :dashboard
|
||||||
if "%choice%"=="3" goto :qqbot
|
if "%choice%"=="3" goto :qqbot
|
||||||
if "%choice%"=="4" goto :channels
|
if "%choice%"=="4" goto :channels
|
||||||
if "%choice%"=="5" goto :skills
|
if "%choice%"=="5" goto :doctor
|
||||||
if "%choice%"=="6" goto :install_skill
|
if "%choice%"=="6" goto :backup
|
||||||
if "%choice%"=="7" goto :doctor
|
if "%choice%"=="7" goto :restore
|
||||||
if "%choice%"=="8" goto :backup
|
if "%choice%"=="8" goto :sysinfo
|
||||||
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%"=="0" exit /b 0
|
if "%choice%"=="0" exit /b 0
|
||||||
echo Invalid choice
|
echo Invalid choice
|
||||||
pause
|
pause
|
||||||
goto :menu
|
goto :menu
|
||||||
|
|
||||||
:start
|
|
||||||
call "%UCLAW_DIR%start.bat"
|
|
||||||
goto :end
|
|
||||||
|
|
||||||
:onboard
|
: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%"
|
cd /d "%CORE_DIR%"
|
||||||
"%NODE_BIN%" openclaw.mjs onboard
|
"%NODE_BIN%" openclaw.mjs onboard
|
||||||
pause
|
pause
|
||||||
goto :menu
|
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
|
:dashboard
|
||||||
echo.
|
echo.
|
||||||
echo Starting gateway...
|
echo Starting gateway...
|
||||||
@@ -221,22 +99,82 @@ start "" http://127.0.0.1:%PORT%/#token=uclaw
|
|||||||
pause
|
pause
|
||||||
goto :menu
|
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
|
:sysinfo
|
||||||
echo.
|
echo.
|
||||||
echo OS: Windows
|
echo OS: Windows
|
||||||
echo Node:
|
|
||||||
"%NODE_BIN%" --version
|
"%NODE_BIN%" --version
|
||||||
echo U-Claw: %UCLAW_DIR%
|
echo Path: %UCLAW_DIR%
|
||||||
echo Data: %DATA_DIR%
|
echo Data: %DATA_DIR%
|
||||||
pause
|
pause
|
||||||
goto :menu
|
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
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# ============================================================
|
# U-Claw - Extract and Launch (macOS)
|
||||||
# U-Claw 虾盘 - macOS 一键安装并启动
|
|
||||||
# 从 U 盘解压到电脑,然后启动 OpenClaw
|
|
||||||
# ============================================================
|
|
||||||
|
|
||||||
GREEN='\033[0;32m'
|
GREEN='\033[0;32m'
|
||||||
CYAN='\033[0;36m'
|
CYAN='\033[0;36m'
|
||||||
@@ -15,16 +12,16 @@ echo ""
|
|||||||
echo -e "${CYAN}"
|
echo -e "${CYAN}"
|
||||||
echo " ╔══════════════════════════════════════╗"
|
echo " ╔══════════════════════════════════════╗"
|
||||||
echo " ║ U-Claw 虾盘 v1.1 ║"
|
echo " ║ U-Claw 虾盘 v1.1 ║"
|
||||||
echo " ║ 一键安装并启动 (macOS) ║"
|
echo " ║ 一键解压并启动 (macOS) ║"
|
||||||
echo " ╚══════════════════════════════════════╝"
|
echo " ╚══════════════════════════════════════╝"
|
||||||
echo -e "${NC}"
|
echo -e "${NC}"
|
||||||
|
|
||||||
USB_DIR="$(cd "$(dirname "$0")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
ARCHIVE="$USB_DIR/U-Claw.tar.gz"
|
ARCHIVE="$SCRIPT_DIR/U-Claw.tar.gz"
|
||||||
INSTALL_DIR="$HOME/U-Claw"
|
INSTALL_DIR="$SCRIPT_DIR/U-Claw"
|
||||||
|
|
||||||
# 移除 macOS 隔离标记(解决"无法验证开发者"弹窗)
|
# 移除 macOS 隔离标记
|
||||||
xattr -rd com.apple.quarantine "$USB_DIR" 2>/dev/null || true
|
xattr -rd com.apple.quarantine "$SCRIPT_DIR" 2>/dev/null || true
|
||||||
|
|
||||||
# 检查压缩包
|
# 检查压缩包
|
||||||
if [ ! -f "$ARCHIVE" ]; then
|
if [ ! -f "$ARCHIVE" ]; then
|
||||||
@@ -34,19 +31,19 @@ if [ ! -f "$ARCHIVE" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 检查是否已安装
|
# 检查是否已解压
|
||||||
if [ -d "$INSTALL_DIR/app/core/node_modules" ]; then
|
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 " 位置: $INSTALL_DIR"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${YELLOW}[1] 直接启动(跳过解压)${NC}"
|
echo -e " ${YELLOW}[1] 直接启动(跳过解压)${NC}"
|
||||||
echo " [2] 重新安装(覆盖现有)"
|
echo " [2] 重新解压(覆盖现有)"
|
||||||
echo ""
|
echo ""
|
||||||
read -p " 请选择 [1/2,默认1]: " choice
|
read -p " 请选择 [1/2,默认1]: " choice
|
||||||
choice="${choice:-1}"
|
choice="${choice:-1}"
|
||||||
if [ "$choice" = "2" ]; then
|
if [ "$choice" = "2" ]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${YELLOW}正在重新安装...${NC}"
|
echo -e " ${YELLOW}正在重新解压...${NC}"
|
||||||
rm -rf "$INSTALL_DIR"
|
rm -rf "$INSTALL_DIR"
|
||||||
else
|
else
|
||||||
echo ""
|
echo ""
|
||||||
@@ -57,12 +54,19 @@ fi
|
|||||||
# 解压(如果需要)
|
# 解压(如果需要)
|
||||||
if [ ! -d "$INSTALL_DIR/app/core/node_modules" ]; then
|
if [ ! -d "$INSTALL_DIR/app/core/node_modules" ]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " ${CYAN}正在解压 U-Claw 到 $INSTALL_DIR ...${NC}"
|
echo -e " ${CYAN}正在解压 U-Claw ...${NC}"
|
||||||
echo " 这可能需要 30-60 秒,请稍等..."
|
echo " 解压到: $INSTALL_DIR"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
mkdir -p "$HOME"
|
# 检测是否在 U 盘上(挂载点判断)
|
||||||
cd "$HOME"
|
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"
|
tar xzf "$ARCHIVE"
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
@@ -71,14 +75,14 @@ if [ ! -d "$INSTALL_DIR/app/core/node_modules" ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# 解压后移除隔离标记
|
||||||
|
xattr -rd com.apple.quarantine "$INSTALL_DIR" 2>/dev/null || true
|
||||||
|
|
||||||
echo -e " ${GREEN}解压完成!${NC}"
|
echo -e " ${GREEN}解压完成!${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 删除 Windows 相关文件(可选,不影响运行)
|
# 启动
|
||||||
# rm -f "$INSTALL_DIR"/Windows-*.bat 2>/dev/null
|
|
||||||
|
|
||||||
# 启动 OpenClaw
|
|
||||||
echo -e " ${CYAN}正在启动 OpenClaw...${NC}"
|
echo -e " ${CYAN}正在启动 OpenClaw...${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
@@ -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 " 按回车键关闭窗口..."
|
|
||||||
@@ -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
|
|
||||||
@@ -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 " 按回车键关闭..."
|
|
||||||
51
uclaw-scripts/README.txt
Normal file
51
uclaw-scripts/README.txt
Normal file
@@ -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
|
||||||
|
|
||||||
|
========================================
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
@echo off
|
@echo off
|
||||||
chcp 65001 >/dev/null 2>&1
|
chcp 65001 >/dev/null 2>&1
|
||||||
title U-Claw - Install and Launch
|
title U-Claw - Extract and Launch
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo ========================================
|
echo ========================================
|
||||||
echo U-Claw v1.1
|
echo U-Claw v1.1
|
||||||
echo Install and Launch (Windows)
|
echo Extract and Launch (Windows)
|
||||||
echo ========================================
|
echo ========================================
|
||||||
echo.
|
echo.
|
||||||
|
|
||||||
set "USB_DIR=%~dp0"
|
set "SCRIPT_DIR=%~dp0"
|
||||||
set "ARCHIVE=%USB_DIR%U-Claw.tar.gz"
|
set "ARCHIVE=%SCRIPT_DIR%U-Claw.tar.gz"
|
||||||
set "INSTALL_DIR=%USERPROFILE%\U-Claw"
|
set "INSTALL_DIR=%SCRIPT_DIR%U-Claw"
|
||||||
|
|
||||||
REM Check archive
|
REM Check archive
|
||||||
if not exist "%ARCHIVE%" (
|
if not exist "%ARCHIVE%" (
|
||||||
@@ -22,17 +22,17 @@ if not exist "%ARCHIVE%" (
|
|||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
|
|
||||||
REM Check if already installed
|
REM Check if already extracted
|
||||||
if exist "%INSTALL_DIR%\app\core\node_modules" (
|
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.
|
||||||
echo [1] Launch directly (skip extract)
|
echo [1] Launch directly (skip extract)
|
||||||
echo [2] Reinstall (overwrite)
|
echo [2] Re-extract (overwrite)
|
||||||
echo.
|
echo.
|
||||||
set /p choice=" Choose [1/2, default 1]: "
|
set /p choice=" Choose [1/2, default 1]: "
|
||||||
if "%choice%"=="2" (
|
if "%choice%"=="2" (
|
||||||
echo.
|
echo.
|
||||||
echo Reinstalling...
|
echo Re-extracting...
|
||||||
rmdir /s /q "%INSTALL_DIR%" >/dev/null 2>&1
|
rmdir /s /q "%INSTALL_DIR%" >/dev/null 2>&1
|
||||||
) else (
|
) else (
|
||||||
echo.
|
echo.
|
||||||
@@ -43,26 +43,22 @@ if exist "%INSTALL_DIR%\app\core\node_modules" (
|
|||||||
|
|
||||||
REM Extract
|
REM Extract
|
||||||
echo.
|
echo.
|
||||||
echo Extracting U-Claw to %INSTALL_DIR% ...
|
echo Extracting U-Claw to: %INSTALL_DIR%
|
||||||
echo This may take 1-2 minutes...
|
echo This may take a few minutes...
|
||||||
echo.
|
echo.
|
||||||
|
|
||||||
where tar >/dev/null 2>&1
|
where tar >/dev/null 2>&1
|
||||||
if %errorlevel%==0 (
|
if %errorlevel%==0 (
|
||||||
cd /d "%USERPROFILE%"
|
cd /d "%SCRIPT_DIR%"
|
||||||
tar xzf "%ARCHIVE%"
|
tar xzf "%ARCHIVE%"
|
||||||
if %errorlevel% neq 0 (
|
if %errorlevel% neq 0 (
|
||||||
echo Extract failed! Please extract U-Claw.tar.gz manually
|
echo Extract failed! Please extract U-Claw.tar.gz manually
|
||||||
echo using 7-Zip or WinRAR to %USERPROFILE%
|
|
||||||
pause
|
pause
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
) else (
|
) else (
|
||||||
echo tar command not available on this Windows version
|
echo tar not available. Please extract U-Claw.tar.gz manually
|
||||||
echo Please extract U-Claw.tar.gz manually using 7-Zip or WinRAR
|
echo using 7-Zip or WinRAR to this directory.
|
||||||
echo Extract to: %USERPROFILE%
|
|
||||||
echo.
|
|
||||||
echo Then run: %INSTALL_DIR%\Windows-Start.bat
|
|
||||||
pause
|
pause
|
||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
@@ -71,7 +67,6 @@ echo Extract complete!
|
|||||||
echo.
|
echo.
|
||||||
|
|
||||||
:start
|
:start
|
||||||
REM Launch OpenClaw
|
|
||||||
echo Starting OpenClaw...
|
echo Starting OpenClaw...
|
||||||
echo.
|
echo.
|
||||||
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
@@ -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
|
|
||||||
BIN
小红书二维码.jpg
BIN
小红书二维码.jpg
Binary file not shown.
|
Before Width: | Height: | Size: 74 KiB |
Reference in New Issue
Block a user