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 # U-Claw 一键安装 / One-Line Install
> 一行命令安装 OpenClaw + 技能包 + 模型配置 > 一行命令安装 OpenClaw + 技能包 + 模型配置
> One command to install OpenClaw + skills + model config > One command to install OpenClaw + skills + model config
## 安装 / Install ## 安装 / Install
### Mac / Linux ### Mac / Linux
```bash ```bash
curl -fsSL https://u-claw.org/install.sh | bash curl -fsSL https://u-claw.org/install.sh | bash
``` ```
### Windows (PowerShell 管理员) ### Windows (PowerShell 管理员)
```powershell ```powershell
irm https://u-claw.org/install.ps1 | iex irm https://u-claw.org/install.ps1 | iex
``` ```
### 本地运行 ### 本地运行
```bash ```bash
# Mac/Linux # Mac/Linux
bash install/install.sh bash install/install.sh
# Windows # Windows
powershell -ExecutionPolicy Bypass -File install\install.ps1 powershell -ExecutionPolicy Bypass -File install\install.ps1
``` ```
## 安装流程 ## 安装流程
### Mac / Linux7 步) ### Mac / Linux7 步)
| 步骤 | 内容 | 说明 | | 步骤 | 内容 | 说明 |
|------|------|------| |------|------|------|
| 1 | Node.js v22 | 安装到 `~/.uclaw/runtime/`,系统有 v20+ 则复用 | | 1 | Node.js v22 | 安装到 `~/.uclaw/runtime/`,系统有 v20+ 则复用 |
| 2 | OpenClaw | npm 安装到 `~/.uclaw/core/` | | 2 | OpenClaw | npm 安装到 `~/.uclaw/core/` |
| 3 | QQ 插件 | 非致命,失败不影响主功能 | | 3 | QQ 插件 | 非致命,失败不影响主功能 |
| 4 | 10 个中国技能 | 小红书、B站、微博等内容创作技能 | | 4 | 10 个中国技能 | 小红书、B站、微博等内容创作技能 |
| 5 | 模型配置 | 中文交互菜单,默认 DeepSeek | | 5 | 模型配置 | 中文交互菜单,默认 DeepSeek |
| 6 | 启动脚本 | 生成 start.command (Mac) / start.sh (Linux) | | 6 | 启动脚本 | 生成 start.command (Mac) / start.sh (Linux) |
| 7 | 验证 | 检查各组件安装状态 | | 7 | 验证 | 检查各组件安装状态 |
### Windows6 步) ### Windows6 步)
| 步骤 | 内容 | 说明 | | 步骤 | 内容 | 说明 |
|------|------|------| |------|------|------|
| 1 | Node.js v22 | 下载到 `%USERPROFILE%\.uclaw\runtime\`,系统有 v20+ 则复用 | | 1 | Node.js v22 | 下载到 `%USERPROFILE%\.uclaw\runtime\`,系统有 v20+ 则复用 |
| 2 | OpenClaw + QQ 插件 | 下载预打包 bundle走国内镜像 | | 2 | OpenClaw + QQ 插件 | 下载预打包 bundle走国内镜像 |
| 3 | 10 个中国技能 | 小红书、B站、微博等内容创作技能 | | 3 | 10 个中国技能 | 小红书、B站、微博等内容创作技能 |
| 4 | 模型配置 | 交互菜单,默认 DeepSeek | | 4 | 模型配置 | 交互菜单,默认 DeepSeek |
| 5 | 启动脚本 | 生成 start.bat | | 5 | 启动脚本 | 生成 start.bat |
| 6 | 验证 | 检查各组件安装状态 | | 6 | 验证 | 检查各组件安装状态 |
## 支持的 AI 模型 ## 支持的 AI 模型
### 国内(无需翻墙) ### 国内(无需翻墙)
| 编号 | 模型 | 说明 | | 编号 | 模型 | 说明 |
|------|------|------| |------|------|------|
| 1 | DeepSeek | ⭐ 推荐,性价比最高 | | 1 | DeepSeek | ⭐ 推荐,性价比最高 |
| 2 | Kimi/月之暗面 | 长文档 | | 2 | Kimi/月之暗面 | 长文档 |
| 3 | 通义千问 | 有免费额度 | | 3 | 通义千问 | 有免费额度 |
| 4 | 智谱GLM | 学术场景 | | 4 | 智谱GLM | 学术场景 |
| 5 | MiniMax | 多模态 | | 5 | MiniMax | 多模态 |
| 6 | 豆包 | 火山引擎 | | 6 | 豆包 | 火山引擎 |
| 7 | 硅基流动 | 聚合多模型 | | 7 | 硅基流动 | 聚合多模型 |
### 海外 ### 海外
| 编号 | 模型 | | 编号 | 模型 |
|------|------| |------|------|
| 8 | Claude | | 8 | Claude |
| 9 | GPT | | 9 | GPT |
### 本地 ### 本地
| 编号 | 模型 | | 编号 | 模型 |
|------|------| |------|------|
| 10 | Ollama | | 10 | Ollama |
## 安装目录结构 ## 安装目录结构
``` ```
~/.uclaw/ ~/.uclaw/
├── runtime/node-{platform}/ # Node.js v22 ├── runtime/node-{platform}/ # Node.js v22
├── core/ # OpenClaw + QQ 插件 ├── core/ # OpenClaw + QQ 插件
│ ├── package.json │ ├── package.json
│ └── node_modules/ │ └── node_modules/
│ └── openclaw/skills/ ← 技能在这里 │ └── openclaw/skills/ ← 技能在这里
├── data/ ├── data/
│ ├── .openclaw/openclaw.json ← 模型配置 │ ├── .openclaw/openclaw.json ← 模型配置
│ ├── memory/ ← AI 记忆 │ ├── memory/ ← AI 记忆
│ └── backups/ ← 备份 │ └── backups/ ← 备份
├── start.command (Mac) ← 启动脚本 ├── start.command (Mac) ← 启动脚本
└── start.bat (Windows) ← 启动脚本 └── start.bat (Windows) ← 启动脚本
``` ```
## 技术细节 ## 技术细节
- **Node.js**: 只装到 `~/.uclaw/runtime/`,不动系统 Node系统已有 v20+ 则复用 - **Node.js**: 只装到 `~/.uclaw/runtime/`,不动系统 Node系统已有 v20+ 则复用
- **镜像**: Mac/Linux 全走 `npmmirror.com`Node 二进制 + npm 包Windows bundle 下载依次尝试 ghfast.top → ghproxy.net → gh.idayer.com → 直连,国内无需翻墙 - **镜像**: Mac/Linux 全走 `npmmirror.com`Node 二进制 + npm 包Windows bundle 下载依次尝试 ghfast.top → ghproxy.net → gh.idayer.com → 直连,国内无需翻墙
- **Windows 编码**: `chcp 65001` + UTF8 输出确保中文显示 - **Windows 编码**: `chcp 65001` + UTF8 输出确保中文显示
- **管道模式**: `curl | bash` 时自动跳过交互,使用默认配置 - **管道模式**: `curl | bash` 时自动跳过交互,使用默认配置
- **卸载**: `rm -rf ~/.uclaw` (Mac/Linux) 或删除 `%USERPROFILE%\.uclaw` (Windows) - **卸载**: `rm -rf ~/.uclaw` (Mac/Linux) 或删除 `%USERPROFILE%\.uclaw` (Windows)
## 包含技能 ## 包含技能
| 技能 | 用途 | | 技能 | 用途 |
|------|------| |------|------|
| xiaohongshu-writer | 小红书笔记写作 | | xiaohongshu-writer | 小红书笔记写作 |
| bilibili-helper | B站视频优化 | | bilibili-helper | B站视频优化 |
| weibo-poster | 微博内容创作 | | weibo-poster | 微博内容创作 |
| wechat-article | 微信公众号文章 | | wechat-article | 微信公众号文章 |
| zhihu-writer | 知乎回答/文章 | | zhihu-writer | 知乎回答/文章 |
| douyin-script | 抖音短视频脚本 | | douyin-script | 抖音短视频脚本 |
| china-search | 国内搜索引擎 | | china-search | 国内搜索引擎 |
| china-translate | 中英互译 | | china-translate | 中英互译 |
| china-weather | 天气查询 | | china-weather | 天气查询 |
| deepseek-helper | DeepSeek API 助手 | | deepseek-helper | DeepSeek API 助手 |
## 与其他分发形式的关系 ## 与其他分发形式的关系
``` ```
install/ ← 一键在线安装(本模块) install/ ← 一键在线安装(本模块)
portable/ ← U 盘便携版 portable/ ← U 盘便携版
u-claw-app/ ← Electron 桌面版 u-claw-app/ ← Electron 桌面版
bootable/ ← Linux 可启动 U 盘 bootable/ ← Linux 可启动 U 盘
``` ```
install/ 安装的结果与 portable/ 的 Mac-Install.command 相同, install/ 安装的结果与 portable/ 的 Mac-Install.command 相同,
区别是不需要 U 盘,直接从网络下载所有组件。 区别是不需要 U 盘,直接从网络下载所有组件。

File diff suppressed because it is too large Load Diff

View File

@@ -1,180 +1,180 @@
@echo off @echo off
chcp 65001 >nul 2>&1 chcp 65001 >nul 2>&1
title U-Claw - Portable AI Agent title U-Claw - Portable AI Agent
echo. echo.
echo ======================================== echo ========================================
echo U-Claw v1.1 - Portable AI Agent echo U-Claw v1.1 - Portable AI Agent
echo ======================================== echo ========================================
echo. echo.
set "UCLAW_DIR=%~dp0" set "UCLAW_DIR=%~dp0"
set "APP_DIR=%UCLAW_DIR%app" set "APP_DIR=%UCLAW_DIR%app"
REM Migration shim: rename old core-win to core for existing USB users 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 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 "CORE_DIR=%APP_DIR%\core"
set "DATA_DIR=%UCLAW_DIR%data" set "DATA_DIR=%UCLAW_DIR%data"
set "STATE_DIR=%DATA_DIR%\.openclaw" set "STATE_DIR=%DATA_DIR%\.openclaw"
set "NODE_DIR=%APP_DIR%\runtime\node-win-x64" set "NODE_DIR=%APP_DIR%\runtime\node-win-x64"
set "NODE_BIN=%NODE_DIR%\node.exe" set "NODE_BIN=%NODE_DIR%\node.exe"
set "NPM_BIN=%NODE_DIR%\npm.cmd" 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"
REM U-Claw opens the local dashboard directly; disable mDNS discovery on Windows REM U-Claw opens the local dashboard directly; disable mDNS discovery on Windows
REM to avoid OpenClaw/@homebridge ciao crashes during bonjour re-advertise. REM to avoid OpenClaw/@homebridge ciao crashes during bonjour re-advertise.
set "OPENCLAW_DISABLE_BONJOUR=1" set "OPENCLAW_DISABLE_BONJOUR=1"
REM Check runtime REM Check runtime
if not exist "%NODE_BIN%" ( if not exist "%NODE_BIN%" (
echo [ERROR] Node.js runtime not found echo [ERROR] Node.js runtime not found
echo Please ensure app\runtime\node-win-x64 is complete echo Please ensure app\runtime\node-win-x64 is complete
pause pause
exit /b 1 exit /b 1
) )
for /f "tokens=*" %%v in ('"%NODE_BIN%" --version') do set NODE_VER=%%v for /f "tokens=*" %%v in ('"%NODE_BIN%" --version') do set NODE_VER=%%v
echo Node.js: %NODE_VER% echo Node.js: %NODE_VER%
echo. echo.
set "PATH=%NODE_DIR%;%NODE_DIR%\node_modules\.bin;%PATH%" set "PATH=%NODE_DIR%;%NODE_DIR%\node_modules\.bin;%PATH%"
REM Init data directories REM Init data directories
if not exist "%DATA_DIR%" mkdir "%DATA_DIR%" if not exist "%DATA_DIR%" mkdir "%DATA_DIR%"
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"
if not exist "%DATA_DIR%\backups" mkdir "%DATA_DIR%\backups" if not exist "%DATA_DIR%\backups" mkdir "%DATA_DIR%\backups"
if not exist "%DATA_DIR%\logs" mkdir "%DATA_DIR%\logs" if not exist "%DATA_DIR%\logs" mkdir "%DATA_DIR%\logs"
REM Default config (migrate legacy if present, otherwise create) REM Default config (migrate legacy if present, otherwise create)
if not exist "%STATE_DIR%\openclaw.json" ( if not exist "%STATE_DIR%\openclaw.json" (
if exist "%DATA_DIR%\config.json" ( if exist "%DATA_DIR%\config.json" (
echo Migrating legacy config... echo Migrating legacy config...
copy "%DATA_DIR%\config.json" "%STATE_DIR%\openclaw.json" >nul copy "%DATA_DIR%\config.json" "%STATE_DIR%\openclaw.json" >nul
echo Config migrated echo Config migrated
) else ( ) else (
echo First run - creating default config... echo First run - creating default config...
(echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}})>"%STATE_DIR%\openclaw.json" (echo {"gateway":{"mode":"local","auth":{"token":"uclaw"}}})>"%STATE_DIR%\openclaw.json"
echo Config created echo Config created
) )
echo. echo.
) )
REM Check dependencies REM Check dependencies
REM Note: avoid unescaped parens inside this block — cmd.exe treats ) as block-end. REM Note: avoid unescaped parens inside this block — cmd.exe treats ) as block-end.
if not exist "%CORE_DIR%\node_modules" ( if not exist "%CORE_DIR%\node_modules" (
echo ======================================== echo ========================================
echo [WARN] node_modules not found echo [WARN] node_modules not found
echo ======================================== echo ========================================
echo This release should ship with deps pre-installed. echo This release should ship with deps pre-installed.
echo Falling back to npm install ^(USB drives may take 20+ minutes^). echo Falling back to npm install ^(USB drives may take 20+ minutes^).
echo. echo.
echo TIP: Re-download u-claw-portable-*.zip from GitHub releases, echo TIP: Re-download u-claw-portable-*.zip from GitHub releases,
echo which includes pre-installed deps ^(~200 MB^). echo which includes pre-installed deps ^(~200 MB^).
echo. echo.
echo File system: NTFS recommended. exFAT/FAT32 will be very slow. echo File system: NTFS recommended. exFAT/FAT32 will be very slow.
echo. echo.
cd /d "%CORE_DIR%" cd /d "%CORE_DIR%"
REM 把 npm 缓存留在盘内,避免污染系统 %APPDATA%\npm-cache拔盘不留痕 REM 把 npm 缓存留在盘内,避免污染系统 %APPDATA%\npm-cache拔盘不留痕
set "npm_config_cache=%APP_DIR%\.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 call "%NPM_BIN%" install --registry=https://registry.npmmirror.com --ignore-scripts --no-audit --no-fund --omit=dev
echo. echo.
echo Dependencies installed! echo Dependencies installed!
echo. echo.
) )
REM Bind device fingerprint and inject Xiapan Cloud apiKey into openclaw.json REM Bind device fingerprint and inject Xiapan Cloud apiKey into openclaw.json
echo Binding device fingerprint to Xiapan Cloud... echo Binding device fingerprint to Xiapan Cloud...
set "UCLAW_APP_ROOT=%UCLAW_DIR%" set "UCLAW_APP_ROOT=%UCLAW_DIR%"
"%NODE_BIN%" "%UCLAW_DIR%lib\bootstrap-xiapan.mjs" "%STATE_DIR%\openclaw.json" "%NODE_BIN%" "%UCLAW_DIR%lib\bootstrap-xiapan.mjs" "%STATE_DIR%\openclaw.json"
echo. echo.
REM Async update check (non-blocking, 5s timeout, silent failure) 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 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 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) REM Version file lookup order: portable/OPENCLAW_VERSION (USB), then repo-root ../OPENCLAW_VERSION (dev)
set "VERSION_FILE=%UCLAW_DIR%OPENCLAW_VERSION" set "VERSION_FILE=%UCLAW_DIR%OPENCLAW_VERSION"
if not exist "%VERSION_FILE%" set "VERSION_FILE=%UCLAW_DIR%..\OPENCLAW_VERSION" if not exist "%VERSION_FILE%" set "VERSION_FILE=%UCLAW_DIR%..\OPENCLAW_VERSION"
if exist "%VERSION_FILE%" ( if exist "%VERSION_FILE%" (
start /B "" "%NODE_BIN%" "%UCLAW_DIR%lib\check-update.mjs" "%VERSION_FILE%" "%STATE_DIR%" >nul 2>&1 start /B "" "%NODE_BIN%" "%UCLAW_DIR%lib\check-update.mjs" "%VERSION_FILE%" "%STATE_DIR%" >nul 2>&1
) )
REM Auto-install WeChat plugin if available REM Auto-install WeChat plugin if available
set "WECHAT_PLUGIN_SRC=%APP_DIR%\extensions\openclaw-weixin" set "WECHAT_PLUGIN_SRC=%APP_DIR%\extensions\openclaw-weixin"
set "WECHAT_PLUGIN_DST=%USERPROFILE%\.openclaw\extensions\openclaw-weixin" set "WECHAT_PLUGIN_DST=%USERPROFILE%\.openclaw\extensions\openclaw-weixin"
if exist "%WECHAT_PLUGIN_SRC%\openclaw.plugin.json" ( if exist "%WECHAT_PLUGIN_SRC%\openclaw.plugin.json" (
if not exist "%WECHAT_PLUGIN_DST%\openclaw.plugin.json" ( if not exist "%WECHAT_PLUGIN_DST%\openclaw.plugin.json" (
echo Installing WeChat plugin... echo Installing WeChat plugin...
mkdir "%USERPROFILE%\.openclaw\extensions" 2>nul mkdir "%USERPROFILE%\.openclaw\extensions" 2>nul
xcopy /s /e /q /y "%WECHAT_PLUGIN_SRC%" "%WECHAT_PLUGIN_DST%\" >nul xcopy /s /e /q /y "%WECHAT_PLUGIN_SRC%" "%WECHAT_PLUGIN_DST%\" >nul
echo WeChat plugin installed! echo WeChat plugin installed!
echo. echo.
) )
) )
REM Find available port REM Find available port
set PORT=18789 set PORT=18789
:check_port :check_port
netstat -an | findstr ":%PORT% " | findstr "LISTENING" >nul 2>&1 netstat -an | findstr ":%PORT% " | findstr "LISTENING" >nul 2>&1
if %errorlevel%==0 ( if %errorlevel%==0 (
echo Port %PORT% in use, trying next... echo Port %PORT% in use, trying next...
set /a PORT+=1 set /a PORT+=1
if %PORT% gtr 18799 ( if %PORT% gtr 18799 (
echo No available port 18789-18799 echo No available port 18789-18799
REM 自动上报端口全被占gateway 无法启动detach、静默、失败不影响 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 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 pause
exit /b 1 exit /b 1
) )
goto :check_port goto :check_port
) )
echo Starting OpenClaw on port %PORT%... echo Starting OpenClaw on port %PORT%...
echo. echo.
REM Start Config Server in background REM Start Config Server in background
echo Starting Config Center on port 18788... echo Starting Config Center on port 18788...
set "CONFIG_SERVER=%UCLAW_DIR%config-server" set "CONFIG_SERVER=%UCLAW_DIR%config-server"
start /B "" "%NODE_BIN%" "%CONFIG_SERVER%\server.js" >nul 2>&1 start /B "" "%NODE_BIN%" "%CONFIG_SERVER%\server.js" >nul 2>&1
REM Wait for config server to start REM Wait for config server to start
timeout /t 2 /nobreak >nul timeout /t 2 /nobreak >nul
REM IMPORTANT: 不要在 gateway 启动前就开 Dashboard 浏览器! REM IMPORTANT: 不要在 gateway 启动前就开 Dashboard 浏览器!
REM 慢 U 盘上 OpenClaw 首次启动要 staging bundled deps几十秒 REM 慢 U 盘上 OpenClaw 首次启动要 staging bundled deps几十秒
REM 过早打开 http://127.0.0.1:18789 会"拒绝连接",是 issue #46/#48 的根因。 REM 过早打开 http://127.0.0.1:18789 会"拒绝连接",是 issue #46/#48 的根因。
REM 改为后台等待器轮询端口gateway 真正 LISTENING 后再开 Dashboard。 REM 改为后台等待器轮询端口gateway 真正 LISTENING 后再开 Dashboard。
echo Opening Config Center... echo Opening Config Center...
start "" http://127.0.0.1:18788/ start "" http://127.0.0.1:18788/
REM 后台等待器:每 2s 探测 %PORT%,最多 ~5 分钟150 次),监听到就开 Dashboard REM 后台等待器:每 2s 探测 %PORT%,最多 ~5 分钟150 次),监听到就开 Dashboard
start /B "" cmd /c ""%UCLAW_DIR%lib\wait-gateway.bat" %PORT%" start /B "" cmd /c ""%UCLAW_DIR%lib\wait-gateway.bat" %PORT%"
echo. echo.
echo ======================================== echo ========================================
echo Starting OpenClaw Gateway on port %PORT%... echo Starting OpenClaw Gateway on port %PORT%...
echo First run on a USB drive may take 30-90 seconds echo First run on a USB drive may take 30-90 seconds
echo (unpacking bundled components). Please wait; echo (unpacking bundled components). Please wait;
echo the Dashboard opens automatically when ready. echo the Dashboard opens automatically when ready.
echo DO NOT close this window while using U-Claw! echo DO NOT close this window while using U-Claw!
echo ======================================== echo ========================================
echo. echo.
cd /d "%CORE_DIR%" cd /d "%CORE_DIR%"
set "OPENCLAW_MJS=%CORE_DIR%\node_modules\openclaw\openclaw.mjs" set "OPENCLAW_MJS=%CORE_DIR%\node_modules\openclaw\openclaw.mjs"
"%NODE_BIN%" "%OPENCLAW_MJS%" gateway run --allow-unconfigured --force --port %PORT% "%NODE_BIN%" "%OPENCLAW_MJS%" gateway run --allow-unconfigured --force --port %PORT%
set "GW_EXIT=%errorlevel%" set "GW_EXIT=%errorlevel%"
echo. echo.
REM 自动上报gateway 异常退出(退出码非 0 且非 Ctrl+C/0xC000013A=-1073741510 REM 自动上报gateway 异常退出(退出码非 0 且非 Ctrl+C/0xC000013A=-1073741510
REM 用户正常 Ctrl+C 停止不上报避免噪音。detach、静默、失败不影响。 REM 用户正常 Ctrl+C 停止不上报避免噪音。detach、静默、失败不影响。
if not "%GW_EXIT%"=="0" if not "%GW_EXIT%"=="-1073741510" ( if not "%GW_EXIT%"=="0" if not "%GW_EXIT%"=="-1073741510" (
echo OpenClaw exited unexpectedly (code %GW_EXIT%), reporting... 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 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. echo OpenClaw stopped.
pause pause