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:
hfshfg
2026-06-15 12:29:45 +08:00
parent 01ed1348ef
commit 2d0f33d5a0
4 changed files with 963 additions and 942 deletions

21
.gitattributes vendored Normal file
View 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

View File

@@ -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 / Linux7 步)
| 步骤 | 内容 | 说明 |
|------|------|------|
| 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 | 验证 | 检查各组件安装状态 |
### Windows6 步)
| 步骤 | 内容 | 说明 |
|------|------|------|
| 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 / Linux7 步)
| 步骤 | 内容 | 说明 |
|------|------|------|
| 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 | 验证 | 检查各组件安装状态 |
### Windows6 步)
| 步骤 | 内容 | 说明 |
|------|------|------|
| 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

View File

@@ -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