chore: 加 .gitattributes 锁定换行符(修跨平台脚本隐患)
core.autocrlf 在不同机器上会把 .command/.sh 转成 CRLF,导致 Mac 用户 双击 .command 报 bad interpreter。明确锁定: - .bat/.cmd/.ps1 → CRLF(Windows 批处理需要) - .command/.sh/.mjs/.js/.json → LF(Mac/Linux 需要) 附带把 install/README.md、Windows-Menu.bat 的换行一次性规范化(纯换行, 无内容改动)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
21
.gitattributes
vendored
Normal file
21
.gitattributes
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# 锁定换行符,保证跨平台分发的脚本可用:
|
||||
# - Windows 批处理 .bat/.cmd 必须 CRLF,否则部分 Windows 环境解析异常
|
||||
# - Mac/Linux 的 .command/.sh 必须 LF,否则双击/执行会报 bad interpreter
|
||||
# - .mjs/.js 统一 LF
|
||||
# 防止 core.autocrlf 在不同机器上把换行改乱。
|
||||
|
||||
*.bat text eol=crlf
|
||||
*.cmd text eol=crlf
|
||||
*.ps1 text eol=crlf
|
||||
|
||||
*.command text eol=lf
|
||||
*.sh text eol=lf
|
||||
*.mjs text eol=lf
|
||||
*.js text eol=lf
|
||||
*.json text eol=lf
|
||||
|
||||
# 二进制:不做换行转换
|
||||
*.png binary
|
||||
*.jpg binary
|
||||
*.zip binary
|
||||
*.ico binary
|
||||
@@ -1,132 +1,132 @@
|
||||
# U-Claw 一键安装 / One-Line Install
|
||||
|
||||
> 一行命令安装 OpenClaw + 技能包 + 模型配置
|
||||
> One command to install OpenClaw + skills + model config
|
||||
|
||||
## 安装 / Install
|
||||
|
||||
### Mac / Linux
|
||||
|
||||
```bash
|
||||
curl -fsSL https://u-claw.org/install.sh | bash
|
||||
```
|
||||
|
||||
### Windows (PowerShell 管理员)
|
||||
|
||||
```powershell
|
||||
irm https://u-claw.org/install.ps1 | iex
|
||||
```
|
||||
|
||||
### 本地运行
|
||||
|
||||
```bash
|
||||
# Mac/Linux
|
||||
bash install/install.sh
|
||||
|
||||
# Windows
|
||||
powershell -ExecutionPolicy Bypass -File install\install.ps1
|
||||
```
|
||||
|
||||
## 安装流程
|
||||
|
||||
### Mac / Linux(7 步)
|
||||
|
||||
| 步骤 | 内容 | 说明 |
|
||||
|------|------|------|
|
||||
| 1 | Node.js v22 | 安装到 `~/.uclaw/runtime/`,系统有 v20+ 则复用 |
|
||||
| 2 | OpenClaw | npm 安装到 `~/.uclaw/core/` |
|
||||
| 3 | QQ 插件 | 非致命,失败不影响主功能 |
|
||||
| 4 | 10 个中国技能 | 小红书、B站、微博等内容创作技能 |
|
||||
| 5 | 模型配置 | 中文交互菜单,默认 DeepSeek |
|
||||
| 6 | 启动脚本 | 生成 start.command (Mac) / start.sh (Linux) |
|
||||
| 7 | 验证 | 检查各组件安装状态 |
|
||||
|
||||
### Windows(6 步)
|
||||
|
||||
| 步骤 | 内容 | 说明 |
|
||||
|------|------|------|
|
||||
| 1 | Node.js v22 | 下载到 `%USERPROFILE%\.uclaw\runtime\`,系统有 v20+ 则复用 |
|
||||
| 2 | OpenClaw + QQ 插件 | 下载预打包 bundle,走国内镜像 |
|
||||
| 3 | 10 个中国技能 | 小红书、B站、微博等内容创作技能 |
|
||||
| 4 | 模型配置 | 交互菜单,默认 DeepSeek |
|
||||
| 5 | 启动脚本 | 生成 start.bat |
|
||||
| 6 | 验证 | 检查各组件安装状态 |
|
||||
|
||||
## 支持的 AI 模型
|
||||
|
||||
### 国内(无需翻墙)
|
||||
|
||||
| 编号 | 模型 | 说明 |
|
||||
|------|------|------|
|
||||
| 1 | DeepSeek | ⭐ 推荐,性价比最高 |
|
||||
| 2 | Kimi/月之暗面 | 长文档 |
|
||||
| 3 | 通义千问 | 有免费额度 |
|
||||
| 4 | 智谱GLM | 学术场景 |
|
||||
| 5 | MiniMax | 多模态 |
|
||||
| 6 | 豆包 | 火山引擎 |
|
||||
| 7 | 硅基流动 | 聚合多模型 |
|
||||
|
||||
### 海外
|
||||
|
||||
| 编号 | 模型 |
|
||||
|------|------|
|
||||
| 8 | Claude |
|
||||
| 9 | GPT |
|
||||
|
||||
### 本地
|
||||
|
||||
| 编号 | 模型 |
|
||||
|------|------|
|
||||
| 10 | Ollama |
|
||||
|
||||
## 安装目录结构
|
||||
|
||||
```
|
||||
~/.uclaw/
|
||||
├── runtime/node-{platform}/ # Node.js v22
|
||||
├── core/ # OpenClaw + QQ 插件
|
||||
│ ├── package.json
|
||||
│ └── node_modules/
|
||||
│ └── openclaw/skills/ ← 技能在这里
|
||||
├── data/
|
||||
│ ├── .openclaw/openclaw.json ← 模型配置
|
||||
│ ├── memory/ ← AI 记忆
|
||||
│ └── backups/ ← 备份
|
||||
├── start.command (Mac) ← 启动脚本
|
||||
└── start.bat (Windows) ← 启动脚本
|
||||
```
|
||||
|
||||
## 技术细节
|
||||
|
||||
- **Node.js**: 只装到 `~/.uclaw/runtime/`,不动系统 Node;系统已有 v20+ 则复用
|
||||
- **镜像**: Mac/Linux 全走 `npmmirror.com`(Node 二进制 + npm 包);Windows bundle 下载依次尝试 ghfast.top → ghproxy.net → gh.idayer.com → 直连,国内无需翻墙
|
||||
- **Windows 编码**: `chcp 65001` + UTF8 输出确保中文显示
|
||||
- **管道模式**: `curl | bash` 时自动跳过交互,使用默认配置
|
||||
- **卸载**: `rm -rf ~/.uclaw` (Mac/Linux) 或删除 `%USERPROFILE%\.uclaw` (Windows)
|
||||
|
||||
## 包含技能
|
||||
|
||||
| 技能 | 用途 |
|
||||
|------|------|
|
||||
| xiaohongshu-writer | 小红书笔记写作 |
|
||||
| bilibili-helper | B站视频优化 |
|
||||
| weibo-poster | 微博内容创作 |
|
||||
| wechat-article | 微信公众号文章 |
|
||||
| zhihu-writer | 知乎回答/文章 |
|
||||
| douyin-script | 抖音短视频脚本 |
|
||||
| china-search | 国内搜索引擎 |
|
||||
| china-translate | 中英互译 |
|
||||
| china-weather | 天气查询 |
|
||||
| deepseek-helper | DeepSeek API 助手 |
|
||||
|
||||
## 与其他分发形式的关系
|
||||
|
||||
```
|
||||
install/ ← 一键在线安装(本模块)
|
||||
portable/ ← U 盘便携版
|
||||
u-claw-app/ ← Electron 桌面版
|
||||
bootable/ ← Linux 可启动 U 盘
|
||||
```
|
||||
|
||||
install/ 安装的结果与 portable/ 的 Mac-Install.command 相同,
|
||||
区别是不需要 U 盘,直接从网络下载所有组件。
|
||||
# U-Claw 一键安装 / One-Line Install
|
||||
|
||||
> 一行命令安装 OpenClaw + 技能包 + 模型配置
|
||||
> One command to install OpenClaw + skills + model config
|
||||
|
||||
## 安装 / Install
|
||||
|
||||
### Mac / Linux
|
||||
|
||||
```bash
|
||||
curl -fsSL https://u-claw.org/install.sh | bash
|
||||
```
|
||||
|
||||
### Windows (PowerShell 管理员)
|
||||
|
||||
```powershell
|
||||
irm https://u-claw.org/install.ps1 | iex
|
||||
```
|
||||
|
||||
### 本地运行
|
||||
|
||||
```bash
|
||||
# Mac/Linux
|
||||
bash install/install.sh
|
||||
|
||||
# Windows
|
||||
powershell -ExecutionPolicy Bypass -File install\install.ps1
|
||||
```
|
||||
|
||||
## 安装流程
|
||||
|
||||
### Mac / Linux(7 步)
|
||||
|
||||
| 步骤 | 内容 | 说明 |
|
||||
|------|------|------|
|
||||
| 1 | Node.js v22 | 安装到 `~/.uclaw/runtime/`,系统有 v20+ 则复用 |
|
||||
| 2 | OpenClaw | npm 安装到 `~/.uclaw/core/` |
|
||||
| 3 | QQ 插件 | 非致命,失败不影响主功能 |
|
||||
| 4 | 10 个中国技能 | 小红书、B站、微博等内容创作技能 |
|
||||
| 5 | 模型配置 | 中文交互菜单,默认 DeepSeek |
|
||||
| 6 | 启动脚本 | 生成 start.command (Mac) / start.sh (Linux) |
|
||||
| 7 | 验证 | 检查各组件安装状态 |
|
||||
|
||||
### Windows(6 步)
|
||||
|
||||
| 步骤 | 内容 | 说明 |
|
||||
|------|------|------|
|
||||
| 1 | Node.js v22 | 下载到 `%USERPROFILE%\.uclaw\runtime\`,系统有 v20+ 则复用 |
|
||||
| 2 | OpenClaw + QQ 插件 | 下载预打包 bundle,走国内镜像 |
|
||||
| 3 | 10 个中国技能 | 小红书、B站、微博等内容创作技能 |
|
||||
| 4 | 模型配置 | 交互菜单,默认 DeepSeek |
|
||||
| 5 | 启动脚本 | 生成 start.bat |
|
||||
| 6 | 验证 | 检查各组件安装状态 |
|
||||
|
||||
## 支持的 AI 模型
|
||||
|
||||
### 国内(无需翻墙)
|
||||
|
||||
| 编号 | 模型 | 说明 |
|
||||
|------|------|------|
|
||||
| 1 | DeepSeek | ⭐ 推荐,性价比最高 |
|
||||
| 2 | Kimi/月之暗面 | 长文档 |
|
||||
| 3 | 通义千问 | 有免费额度 |
|
||||
| 4 | 智谱GLM | 学术场景 |
|
||||
| 5 | MiniMax | 多模态 |
|
||||
| 6 | 豆包 | 火山引擎 |
|
||||
| 7 | 硅基流动 | 聚合多模型 |
|
||||
|
||||
### 海外
|
||||
|
||||
| 编号 | 模型 |
|
||||
|------|------|
|
||||
| 8 | Claude |
|
||||
| 9 | GPT |
|
||||
|
||||
### 本地
|
||||
|
||||
| 编号 | 模型 |
|
||||
|------|------|
|
||||
| 10 | Ollama |
|
||||
|
||||
## 安装目录结构
|
||||
|
||||
```
|
||||
~/.uclaw/
|
||||
├── runtime/node-{platform}/ # Node.js v22
|
||||
├── core/ # OpenClaw + QQ 插件
|
||||
│ ├── package.json
|
||||
│ └── node_modules/
|
||||
│ └── openclaw/skills/ ← 技能在这里
|
||||
├── data/
|
||||
│ ├── .openclaw/openclaw.json ← 模型配置
|
||||
│ ├── memory/ ← AI 记忆
|
||||
│ └── backups/ ← 备份
|
||||
├── start.command (Mac) ← 启动脚本
|
||||
└── start.bat (Windows) ← 启动脚本
|
||||
```
|
||||
|
||||
## 技术细节
|
||||
|
||||
- **Node.js**: 只装到 `~/.uclaw/runtime/`,不动系统 Node;系统已有 v20+ 则复用
|
||||
- **镜像**: Mac/Linux 全走 `npmmirror.com`(Node 二进制 + npm 包);Windows bundle 下载依次尝试 ghfast.top → ghproxy.net → gh.idayer.com → 直连,国内无需翻墙
|
||||
- **Windows 编码**: `chcp 65001` + UTF8 输出确保中文显示
|
||||
- **管道模式**: `curl | bash` 时自动跳过交互,使用默认配置
|
||||
- **卸载**: `rm -rf ~/.uclaw` (Mac/Linux) 或删除 `%USERPROFILE%\.uclaw` (Windows)
|
||||
|
||||
## 包含技能
|
||||
|
||||
| 技能 | 用途 |
|
||||
|------|------|
|
||||
| xiaohongshu-writer | 小红书笔记写作 |
|
||||
| bilibili-helper | B站视频优化 |
|
||||
| weibo-poster | 微博内容创作 |
|
||||
| wechat-article | 微信公众号文章 |
|
||||
| zhihu-writer | 知乎回答/文章 |
|
||||
| douyin-script | 抖音短视频脚本 |
|
||||
| china-search | 国内搜索引擎 |
|
||||
| china-translate | 中英互译 |
|
||||
| china-weather | 天气查询 |
|
||||
| deepseek-helper | DeepSeek API 助手 |
|
||||
|
||||
## 与其他分发形式的关系
|
||||
|
||||
```
|
||||
install/ ← 一键在线安装(本模块)
|
||||
portable/ ← U 盘便携版
|
||||
u-claw-app/ ← Electron 桌面版
|
||||
bootable/ ← Linux 可启动 U 盘
|
||||
```
|
||||
|
||||
install/ 安装的结果与 portable/ 的 Mac-Install.command 相同,
|
||||
区别是不需要 U 盘,直接从网络下载所有组件。
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,180 +1,180 @@
|
||||
@echo off
|
||||
chcp 65001 >nul 2>&1
|
||||
title U-Claw - Portable AI Agent
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo U-Claw v1.1 - Portable AI Agent
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
set "UCLAW_DIR=%~dp0"
|
||||
set "APP_DIR=%UCLAW_DIR%app"
|
||||
|
||||
REM Migration shim: rename old core-win to core for existing USB users
|
||||
if exist "%APP_DIR%\core-win" if not exist "%APP_DIR%\core" ren "%APP_DIR%\core-win" core
|
||||
|
||||
set "CORE_DIR=%APP_DIR%\core"
|
||||
set "DATA_DIR=%UCLAW_DIR%data"
|
||||
set "STATE_DIR=%DATA_DIR%\.openclaw"
|
||||
set "NODE_DIR=%APP_DIR%\runtime\node-win-x64"
|
||||
set "NODE_BIN=%NODE_DIR%\node.exe"
|
||||
set "NPM_BIN=%NODE_DIR%\npm.cmd"
|
||||
|
||||
set "OPENCLAW_HOME=%DATA_DIR%"
|
||||
set "OPENCLAW_STATE_DIR=%STATE_DIR%"
|
||||
set "OPENCLAW_CONFIG_PATH=%STATE_DIR%\openclaw.json"
|
||||
REM U-Claw opens the local dashboard directly; disable mDNS discovery on Windows
|
||||
REM to avoid OpenClaw/@homebridge ciao crashes during bonjour re-advertise.
|
||||
set "OPENCLAW_DISABLE_BONJOUR=1"
|
||||
|
||||
REM Check runtime
|
||||
if not exist "%NODE_BIN%" (
|
||||
echo [ERROR] Node.js runtime not found
|
||||
echo Please ensure app\runtime\node-win-x64 is complete
|
||||
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%"
|
||||
|
||||
REM Init data directories
|
||||
if not exist "%DATA_DIR%" mkdir "%DATA_DIR%"
|
||||
if not exist "%STATE_DIR%" mkdir "%STATE_DIR%"
|
||||
if not exist "%DATA_DIR%\memory" mkdir "%DATA_DIR%\memory"
|
||||
if not exist "%DATA_DIR%\backups" mkdir "%DATA_DIR%\backups"
|
||||
if not exist "%DATA_DIR%\logs" mkdir "%DATA_DIR%\logs"
|
||||
|
||||
REM Default config (migrate legacy if present, otherwise create)
|
||||
if not exist "%STATE_DIR%\openclaw.json" (
|
||||
if exist "%DATA_DIR%\config.json" (
|
||||
echo Migrating legacy config...
|
||||
copy "%DATA_DIR%\config.json" "%STATE_DIR%\openclaw.json" >nul
|
||||
echo Config migrated
|
||||
) else (
|
||||
echo First run - creating default config...
|
||||
(echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}})>"%STATE_DIR%\openclaw.json"
|
||||
echo Config created
|
||||
)
|
||||
echo.
|
||||
)
|
||||
|
||||
REM Check dependencies
|
||||
REM Note: avoid unescaped parens inside this block — cmd.exe treats ) as block-end.
|
||||
if not exist "%CORE_DIR%\node_modules" (
|
||||
echo ========================================
|
||||
echo [WARN] node_modules not found
|
||||
echo ========================================
|
||||
echo This release should ship with deps pre-installed.
|
||||
echo Falling back to npm install ^(USB drives may take 20+ minutes^).
|
||||
echo.
|
||||
echo TIP: Re-download u-claw-portable-*.zip from GitHub releases,
|
||||
echo which includes pre-installed deps ^(~200 MB^).
|
||||
echo.
|
||||
echo File system: NTFS recommended. exFAT/FAT32 will be very slow.
|
||||
echo.
|
||||
cd /d "%CORE_DIR%"
|
||||
REM 把 npm 缓存留在盘内,避免污染系统 %APPDATA%\npm-cache(拔盘不留痕)
|
||||
set "npm_config_cache=%APP_DIR%\.npm-cache"
|
||||
call "%NPM_BIN%" install --registry=https://registry.npmmirror.com --ignore-scripts --no-audit --no-fund --omit=dev
|
||||
echo.
|
||||
echo Dependencies installed!
|
||||
echo.
|
||||
)
|
||||
|
||||
REM Bind device fingerprint and inject Xiapan Cloud apiKey into openclaw.json
|
||||
echo Binding device fingerprint to Xiapan Cloud...
|
||||
set "UCLAW_APP_ROOT=%UCLAW_DIR%"
|
||||
"%NODE_BIN%" "%UCLAW_DIR%lib\bootstrap-xiapan.mjs" "%STATE_DIR%\openclaw.json"
|
||||
echo.
|
||||
|
||||
REM Async update check (non-blocking, 5s timeout, silent failure)
|
||||
REM Writes data\.openclaw\update-available.json if a newer version is on OSS.
|
||||
REM Welcome.html / Config.html read this file and show a banner.
|
||||
REM Version file lookup order: portable/OPENCLAW_VERSION (USB), then repo-root ../OPENCLAW_VERSION (dev)
|
||||
set "VERSION_FILE=%UCLAW_DIR%OPENCLAW_VERSION"
|
||||
if not exist "%VERSION_FILE%" set "VERSION_FILE=%UCLAW_DIR%..\OPENCLAW_VERSION"
|
||||
if exist "%VERSION_FILE%" (
|
||||
start /B "" "%NODE_BIN%" "%UCLAW_DIR%lib\check-update.mjs" "%VERSION_FILE%" "%STATE_DIR%" >nul 2>&1
|
||||
)
|
||||
|
||||
|
||||
REM Auto-install WeChat plugin if available
|
||||
set "WECHAT_PLUGIN_SRC=%APP_DIR%\extensions\openclaw-weixin"
|
||||
set "WECHAT_PLUGIN_DST=%USERPROFILE%\.openclaw\extensions\openclaw-weixin"
|
||||
if exist "%WECHAT_PLUGIN_SRC%\openclaw.plugin.json" (
|
||||
if not exist "%WECHAT_PLUGIN_DST%\openclaw.plugin.json" (
|
||||
echo Installing WeChat plugin...
|
||||
mkdir "%USERPROFILE%\.openclaw\extensions" 2>nul
|
||||
xcopy /s /e /q /y "%WECHAT_PLUGIN_SRC%" "%WECHAT_PLUGIN_DST%\" >nul
|
||||
echo WeChat plugin installed!
|
||||
echo.
|
||||
)
|
||||
)
|
||||
|
||||
REM Find available port
|
||||
set PORT=18789
|
||||
:check_port
|
||||
netstat -an | findstr ":%PORT% " | findstr "LISTENING" >nul 2>&1
|
||||
if %errorlevel%==0 (
|
||||
echo Port %PORT% in use, trying next...
|
||||
set /a PORT+=1
|
||||
if %PORT% gtr 18799 (
|
||||
echo No available port 18789-18799
|
||||
REM 自动上报:端口全被占,gateway 无法启动(detach、静默、失败不影响)
|
||||
start /B "" "%NODE_BIN%" "%UCLAW_DIR%lib\report-bug.mjs" --auto --title "gateway-no-free-port" --desc "Ports 18789-18799 all in use" --root "%UCLAW_DIR%." >nul 2>&1
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
goto :check_port
|
||||
)
|
||||
|
||||
echo Starting OpenClaw on port %PORT%...
|
||||
echo.
|
||||
|
||||
REM Start Config Server in background
|
||||
echo Starting Config Center on port 18788...
|
||||
set "CONFIG_SERVER=%UCLAW_DIR%config-server"
|
||||
start /B "" "%NODE_BIN%" "%CONFIG_SERVER%\server.js" >nul 2>&1
|
||||
|
||||
REM Wait for config server to start
|
||||
timeout /t 2 /nobreak >nul
|
||||
|
||||
REM IMPORTANT: 不要在 gateway 启动前就开 Dashboard 浏览器!
|
||||
REM 慢 U 盘上 OpenClaw 首次启动要 staging bundled deps(几十秒),
|
||||
REM 过早打开 http://127.0.0.1:18789 会"拒绝连接",是 issue #46/#48 的根因。
|
||||
REM 改为后台等待器:轮询端口,gateway 真正 LISTENING 后再开 Dashboard。
|
||||
echo Opening Config Center...
|
||||
start "" http://127.0.0.1:18788/
|
||||
|
||||
REM 后台等待器:每 2s 探测 %PORT%,最多 ~5 分钟(150 次),监听到就开 Dashboard
|
||||
start /B "" cmd /c ""%UCLAW_DIR%lib\wait-gateway.bat" %PORT%"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo Starting OpenClaw Gateway on port %PORT%...
|
||||
echo First run on a USB drive may take 30-90 seconds
|
||||
echo (unpacking bundled components). Please wait;
|
||||
echo the Dashboard opens automatically when ready.
|
||||
echo DO NOT close this window while using U-Claw!
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
cd /d "%CORE_DIR%"
|
||||
set "OPENCLAW_MJS=%CORE_DIR%\node_modules\openclaw\openclaw.mjs"
|
||||
"%NODE_BIN%" "%OPENCLAW_MJS%" gateway run --allow-unconfigured --force --port %PORT%
|
||||
set "GW_EXIT=%errorlevel%"
|
||||
|
||||
echo.
|
||||
REM 自动上报:gateway 异常退出(退出码非 0 且非 Ctrl+C/0xC000013A=-1073741510)
|
||||
REM 用户正常 Ctrl+C 停止不上报,避免噪音。detach、静默、失败不影响。
|
||||
if not "%GW_EXIT%"=="0" if not "%GW_EXIT%"=="-1073741510" (
|
||||
echo OpenClaw exited unexpectedly (code %GW_EXIT%), reporting...
|
||||
start /B "" "%NODE_BIN%" "%UCLAW_DIR%lib\report-bug.mjs" --auto --title "gateway-exited-code-%GW_EXIT%" --desc "Gateway exited with code %GW_EXIT% on port %PORT%" --root "%UCLAW_DIR%." >nul 2>&1
|
||||
)
|
||||
echo OpenClaw stopped.
|
||||
pause
|
||||
@echo off
|
||||
chcp 65001 >nul 2>&1
|
||||
title U-Claw - Portable AI Agent
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo U-Claw v1.1 - Portable AI Agent
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
set "UCLAW_DIR=%~dp0"
|
||||
set "APP_DIR=%UCLAW_DIR%app"
|
||||
|
||||
REM Migration shim: rename old core-win to core for existing USB users
|
||||
if exist "%APP_DIR%\core-win" if not exist "%APP_DIR%\core" ren "%APP_DIR%\core-win" core
|
||||
|
||||
set "CORE_DIR=%APP_DIR%\core"
|
||||
set "DATA_DIR=%UCLAW_DIR%data"
|
||||
set "STATE_DIR=%DATA_DIR%\.openclaw"
|
||||
set "NODE_DIR=%APP_DIR%\runtime\node-win-x64"
|
||||
set "NODE_BIN=%NODE_DIR%\node.exe"
|
||||
set "NPM_BIN=%NODE_DIR%\npm.cmd"
|
||||
|
||||
set "OPENCLAW_HOME=%DATA_DIR%"
|
||||
set "OPENCLAW_STATE_DIR=%STATE_DIR%"
|
||||
set "OPENCLAW_CONFIG_PATH=%STATE_DIR%\openclaw.json"
|
||||
REM U-Claw opens the local dashboard directly; disable mDNS discovery on Windows
|
||||
REM to avoid OpenClaw/@homebridge ciao crashes during bonjour re-advertise.
|
||||
set "OPENCLAW_DISABLE_BONJOUR=1"
|
||||
|
||||
REM Check runtime
|
||||
if not exist "%NODE_BIN%" (
|
||||
echo [ERROR] Node.js runtime not found
|
||||
echo Please ensure app\runtime\node-win-x64 is complete
|
||||
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%"
|
||||
|
||||
REM Init data directories
|
||||
if not exist "%DATA_DIR%" mkdir "%DATA_DIR%"
|
||||
if not exist "%STATE_DIR%" mkdir "%STATE_DIR%"
|
||||
if not exist "%DATA_DIR%\memory" mkdir "%DATA_DIR%\memory"
|
||||
if not exist "%DATA_DIR%\backups" mkdir "%DATA_DIR%\backups"
|
||||
if not exist "%DATA_DIR%\logs" mkdir "%DATA_DIR%\logs"
|
||||
|
||||
REM Default config (migrate legacy if present, otherwise create)
|
||||
if not exist "%STATE_DIR%\openclaw.json" (
|
||||
if exist "%DATA_DIR%\config.json" (
|
||||
echo Migrating legacy config...
|
||||
copy "%DATA_DIR%\config.json" "%STATE_DIR%\openclaw.json" >nul
|
||||
echo Config migrated
|
||||
) else (
|
||||
echo First run - creating default config...
|
||||
(echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}})>"%STATE_DIR%\openclaw.json"
|
||||
echo Config created
|
||||
)
|
||||
echo.
|
||||
)
|
||||
|
||||
REM Check dependencies
|
||||
REM Note: avoid unescaped parens inside this block — cmd.exe treats ) as block-end.
|
||||
if not exist "%CORE_DIR%\node_modules" (
|
||||
echo ========================================
|
||||
echo [WARN] node_modules not found
|
||||
echo ========================================
|
||||
echo This release should ship with deps pre-installed.
|
||||
echo Falling back to npm install ^(USB drives may take 20+ minutes^).
|
||||
echo.
|
||||
echo TIP: Re-download u-claw-portable-*.zip from GitHub releases,
|
||||
echo which includes pre-installed deps ^(~200 MB^).
|
||||
echo.
|
||||
echo File system: NTFS recommended. exFAT/FAT32 will be very slow.
|
||||
echo.
|
||||
cd /d "%CORE_DIR%"
|
||||
REM 把 npm 缓存留在盘内,避免污染系统 %APPDATA%\npm-cache(拔盘不留痕)
|
||||
set "npm_config_cache=%APP_DIR%\.npm-cache"
|
||||
call "%NPM_BIN%" install --registry=https://registry.npmmirror.com --ignore-scripts --no-audit --no-fund --omit=dev
|
||||
echo.
|
||||
echo Dependencies installed!
|
||||
echo.
|
||||
)
|
||||
|
||||
REM Bind device fingerprint and inject Xiapan Cloud apiKey into openclaw.json
|
||||
echo Binding device fingerprint to Xiapan Cloud...
|
||||
set "UCLAW_APP_ROOT=%UCLAW_DIR%"
|
||||
"%NODE_BIN%" "%UCLAW_DIR%lib\bootstrap-xiapan.mjs" "%STATE_DIR%\openclaw.json"
|
||||
echo.
|
||||
|
||||
REM Async update check (non-blocking, 5s timeout, silent failure)
|
||||
REM Writes data\.openclaw\update-available.json if a newer version is on OSS.
|
||||
REM Welcome.html / Config.html read this file and show a banner.
|
||||
REM Version file lookup order: portable/OPENCLAW_VERSION (USB), then repo-root ../OPENCLAW_VERSION (dev)
|
||||
set "VERSION_FILE=%UCLAW_DIR%OPENCLAW_VERSION"
|
||||
if not exist "%VERSION_FILE%" set "VERSION_FILE=%UCLAW_DIR%..\OPENCLAW_VERSION"
|
||||
if exist "%VERSION_FILE%" (
|
||||
start /B "" "%NODE_BIN%" "%UCLAW_DIR%lib\check-update.mjs" "%VERSION_FILE%" "%STATE_DIR%" >nul 2>&1
|
||||
)
|
||||
|
||||
|
||||
REM Auto-install WeChat plugin if available
|
||||
set "WECHAT_PLUGIN_SRC=%APP_DIR%\extensions\openclaw-weixin"
|
||||
set "WECHAT_PLUGIN_DST=%USERPROFILE%\.openclaw\extensions\openclaw-weixin"
|
||||
if exist "%WECHAT_PLUGIN_SRC%\openclaw.plugin.json" (
|
||||
if not exist "%WECHAT_PLUGIN_DST%\openclaw.plugin.json" (
|
||||
echo Installing WeChat plugin...
|
||||
mkdir "%USERPROFILE%\.openclaw\extensions" 2>nul
|
||||
xcopy /s /e /q /y "%WECHAT_PLUGIN_SRC%" "%WECHAT_PLUGIN_DST%\" >nul
|
||||
echo WeChat plugin installed!
|
||||
echo.
|
||||
)
|
||||
)
|
||||
|
||||
REM Find available port
|
||||
set PORT=18789
|
||||
:check_port
|
||||
netstat -an | findstr ":%PORT% " | findstr "LISTENING" >nul 2>&1
|
||||
if %errorlevel%==0 (
|
||||
echo Port %PORT% in use, trying next...
|
||||
set /a PORT+=1
|
||||
if %PORT% gtr 18799 (
|
||||
echo No available port 18789-18799
|
||||
REM 自动上报:端口全被占,gateway 无法启动(detach、静默、失败不影响)
|
||||
start /B "" "%NODE_BIN%" "%UCLAW_DIR%lib\report-bug.mjs" --auto --title "gateway-no-free-port" --desc "Ports 18789-18799 all in use" --root "%UCLAW_DIR%." >nul 2>&1
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
goto :check_port
|
||||
)
|
||||
|
||||
echo Starting OpenClaw on port %PORT%...
|
||||
echo.
|
||||
|
||||
REM Start Config Server in background
|
||||
echo Starting Config Center on port 18788...
|
||||
set "CONFIG_SERVER=%UCLAW_DIR%config-server"
|
||||
start /B "" "%NODE_BIN%" "%CONFIG_SERVER%\server.js" >nul 2>&1
|
||||
|
||||
REM Wait for config server to start
|
||||
timeout /t 2 /nobreak >nul
|
||||
|
||||
REM IMPORTANT: 不要在 gateway 启动前就开 Dashboard 浏览器!
|
||||
REM 慢 U 盘上 OpenClaw 首次启动要 staging bundled deps(几十秒),
|
||||
REM 过早打开 http://127.0.0.1:18789 会"拒绝连接",是 issue #46/#48 的根因。
|
||||
REM 改为后台等待器:轮询端口,gateway 真正 LISTENING 后再开 Dashboard。
|
||||
echo Opening Config Center...
|
||||
start "" http://127.0.0.1:18788/
|
||||
|
||||
REM 后台等待器:每 2s 探测 %PORT%,最多 ~5 分钟(150 次),监听到就开 Dashboard
|
||||
start /B "" cmd /c ""%UCLAW_DIR%lib\wait-gateway.bat" %PORT%"
|
||||
|
||||
echo.
|
||||
echo ========================================
|
||||
echo Starting OpenClaw Gateway on port %PORT%...
|
||||
echo First run on a USB drive may take 30-90 seconds
|
||||
echo (unpacking bundled components). Please wait;
|
||||
echo the Dashboard opens automatically when ready.
|
||||
echo DO NOT close this window while using U-Claw!
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
cd /d "%CORE_DIR%"
|
||||
set "OPENCLAW_MJS=%CORE_DIR%\node_modules\openclaw\openclaw.mjs"
|
||||
"%NODE_BIN%" "%OPENCLAW_MJS%" gateway run --allow-unconfigured --force --port %PORT%
|
||||
set "GW_EXIT=%errorlevel%"
|
||||
|
||||
echo.
|
||||
REM 自动上报:gateway 异常退出(退出码非 0 且非 Ctrl+C/0xC000013A=-1073741510)
|
||||
REM 用户正常 Ctrl+C 停止不上报,避免噪音。detach、静默、失败不影响。
|
||||
if not "%GW_EXIT%"=="0" if not "%GW_EXIT%"=="-1073741510" (
|
||||
echo OpenClaw exited unexpectedly (code %GW_EXIT%), reporting...
|
||||
start /B "" "%NODE_BIN%" "%UCLAW_DIR%lib\report-bug.mjs" --auto --title "gateway-exited-code-%GW_EXIT%" --desc "Gateway exited with code %GW_EXIT% on port %PORT%" --root "%UCLAW_DIR%." >nul 2>&1
|
||||
)
|
||||
echo OpenClaw stopped.
|
||||
pause
|
||||
|
||||
Reference in New Issue
Block a user