370 lines
12 KiB
Batchfile
370 lines
12 KiB
Batchfile
@echo off
|
|
REM NomadArch Windows Installer - ASCII Safe Version
|
|
REM This installer uses only ASCII characters for maximum compatibility
|
|
|
|
setlocal enabledelayedexpansion
|
|
|
|
title NomadArch Installer - Windows
|
|
|
|
echo.
|
|
echo ===============================================================
|
|
echo NomadArch Installer for Windows
|
|
echo Version: 0.6.1 - Universal Edition
|
|
echo ===============================================================
|
|
echo.
|
|
|
|
set SCRIPT_DIR=%~dp0
|
|
set SCRIPT_DIR=%SCRIPT_DIR:~0,-1%
|
|
set TARGET_DIR=%SCRIPT_DIR%
|
|
set BIN_DIR=%TARGET_DIR%\bin
|
|
set LOG_FILE=%TARGET_DIR%\install.log
|
|
set TEMP_DIR=%TARGET_DIR%\.install-temp
|
|
|
|
set ERRORS=0
|
|
set WARNINGS=0
|
|
set SKIP_OPENCODE=1
|
|
set NODE_INSTALLED_NOW=0
|
|
|
|
echo [%date% %time%] ========== Installer started ========== >> "%LOG_FILE%"
|
|
|
|
REM ---------------------------------------------------------------
|
|
REM STEP 1: OS and Architecture Detection
|
|
REM ---------------------------------------------------------------
|
|
echo [STEP 1/8] Detecting System...
|
|
|
|
for /f "tokens=2 delims==" %%a in ('wmic os get osarchitecture /value 2^>nul ^| find "="') do set ARCH_RAW=%%a
|
|
if "!ARCH_RAW!"=="" set ARCH_RAW=64-bit
|
|
|
|
echo !ARCH_RAW! | findstr /i "64" >nul
|
|
if !ERRORLEVEL! equ 0 (
|
|
set ARCH=x64
|
|
) else (
|
|
set ARCH=x86
|
|
)
|
|
|
|
for /f "tokens=4-5 delims=. " %%i in ('ver') do set WIN_VER=%%i.%%j
|
|
echo [OK] Windows Version: !WIN_VER!
|
|
echo [OK] Architecture: !ARCH!
|
|
echo [%date% %time%] OS: Windows !WIN_VER!, Arch: !ARCH! >> "%LOG_FILE%"
|
|
|
|
REM ---------------------------------------------------------------
|
|
REM STEP 2: Check Write Permissions
|
|
REM ---------------------------------------------------------------
|
|
echo.
|
|
echo [STEP 2/8] Checking Write Permissions...
|
|
|
|
if not exist "%BIN_DIR%" mkdir "%BIN_DIR%" 2>nul
|
|
if not exist "%TEMP_DIR%" mkdir "%TEMP_DIR%" 2>nul
|
|
|
|
echo. > "%SCRIPT_DIR%\.write-test.tmp" 2>nul
|
|
if !ERRORLEVEL! neq 0 (
|
|
echo [WARN] Cannot write to: %SCRIPT_DIR%
|
|
echo [INFO] Using fallback location in user profile...
|
|
set TARGET_DIR=%USERPROFILE%\NomadArch
|
|
set BIN_DIR=!TARGET_DIR!\bin
|
|
set LOG_FILE=!TARGET_DIR!\install.log
|
|
set TEMP_DIR=!TARGET_DIR!\.install-temp
|
|
if not exist "!TARGET_DIR!" mkdir "!TARGET_DIR!"
|
|
if not exist "!BIN_DIR!" mkdir "!BIN_DIR!"
|
|
if not exist "!TEMP_DIR!" mkdir "!TEMP_DIR!"
|
|
echo [OK] Using fallback: !TARGET_DIR!
|
|
) else (
|
|
del "%SCRIPT_DIR%\.write-test.tmp" 2>nul
|
|
echo [OK] Write permissions verified
|
|
)
|
|
echo [%date% %time%] Install target: %TARGET_DIR% >> "%LOG_FILE%"
|
|
|
|
REM ---------------------------------------------------------------
|
|
REM STEP 3: Check and Install Node.js
|
|
REM ---------------------------------------------------------------
|
|
echo.
|
|
echo [STEP 3/8] Checking Node.js...
|
|
|
|
set NODE_OK=0
|
|
set NPM_OK=0
|
|
|
|
where node >nul 2>&1
|
|
if !ERRORLEVEL! equ 0 (
|
|
for /f "tokens=*" %%v in ('node --version 2^>nul') do set NODE_VERSION=%%v
|
|
if defined NODE_VERSION (
|
|
echo [OK] Node.js found: !NODE_VERSION!
|
|
set NODE_OK=1
|
|
)
|
|
)
|
|
|
|
if !NODE_OK! equ 0 (
|
|
echo [INFO] Node.js not found. Attempting automatic installation...
|
|
echo [%date% %time%] Node.js not found, attempting install >> "%LOG_FILE%"
|
|
|
|
REM Try winget first (Windows 10 1709+)
|
|
where winget >nul 2>&1
|
|
if !ERRORLEVEL! equ 0 (
|
|
echo [INFO] Installing Node.js via winget...
|
|
winget install -e --id OpenJS.NodeJS.LTS --accept-source-agreements --accept-package-agreements --silent 2>nul
|
|
if !ERRORLEVEL! equ 0 (
|
|
set NODE_INSTALLED_NOW=1
|
|
echo [OK] Node.js installed via winget
|
|
) else (
|
|
echo [WARN] Winget install failed, trying alternative...
|
|
)
|
|
)
|
|
|
|
REM Try chocolatey if winget failed
|
|
if !NODE_INSTALLED_NOW! equ 0 (
|
|
where choco >nul 2>&1
|
|
if !ERRORLEVEL! equ 0 (
|
|
echo [INFO] Installing Node.js via Chocolatey...
|
|
choco install nodejs-lts -y 2>nul
|
|
if !ERRORLEVEL! equ 0 (
|
|
set NODE_INSTALLED_NOW=1
|
|
echo [OK] Node.js installed via Chocolatey
|
|
)
|
|
)
|
|
)
|
|
|
|
REM Direct download as last resort
|
|
if !NODE_INSTALLED_NOW! equ 0 (
|
|
echo [INFO] Downloading Node.js installer directly...
|
|
set NODE_INSTALLER=%TEMP_DIR%\node-installer.msi
|
|
|
|
REM Download using PowerShell with proper error handling
|
|
powershell -NoProfile -ExecutionPolicy Bypass -Command "$ProgressPreference = 'SilentlyContinue'; try { Invoke-WebRequest -Uri 'https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi' -OutFile '%TEMP_DIR%\node-installer.msi' -UseBasicParsing; exit 0 } catch { exit 1 }" 2>nul
|
|
|
|
if exist "%TEMP_DIR%\node-installer.msi" (
|
|
echo [INFO] Running Node.js installer...
|
|
msiexec /i "%TEMP_DIR%\node-installer.msi" /qn /norestart 2>nul
|
|
if !ERRORLEVEL! equ 0 (
|
|
set NODE_INSTALLED_NOW=1
|
|
echo [OK] Node.js installed successfully
|
|
) else (
|
|
echo [ERROR] Node.js MSI installation failed
|
|
)
|
|
del "%TEMP_DIR%\node-installer.msi" 2>nul
|
|
) else (
|
|
echo [ERROR] Failed to download Node.js installer
|
|
)
|
|
)
|
|
|
|
if !NODE_INSTALLED_NOW! equ 1 (
|
|
echo.
|
|
echo ===============================================================
|
|
echo IMPORTANT: Node.js was just installed!
|
|
echo Please CLOSE this window and run Install-Windows.bat again.
|
|
echo This is required for the PATH to update.
|
|
echo ===============================================================
|
|
echo.
|
|
echo [%date% %time%] Node.js installed, restart required >> "%LOG_FILE%"
|
|
pause
|
|
exit /b 0
|
|
) else (
|
|
echo.
|
|
echo [ERROR] Could not install Node.js automatically.
|
|
echo.
|
|
echo Please install Node.js manually:
|
|
echo 1. Go to https://nodejs.org/
|
|
echo 2. Download and install the LTS version
|
|
echo 3. Restart this installer
|
|
echo.
|
|
echo [%date% %time%] ERROR: Node.js installation failed >> "%LOG_FILE%"
|
|
set /a ERRORS+=1
|
|
goto :SUMMARY
|
|
)
|
|
)
|
|
|
|
REM Verify npm
|
|
where npm >nul 2>&1
|
|
if !ERRORLEVEL! equ 0 (
|
|
for /f "tokens=*" %%v in ('npm --version 2^>nul') do set NPM_VERSION=%%v
|
|
if defined NPM_VERSION (
|
|
echo [OK] npm found: !NPM_VERSION!
|
|
set NPM_OK=1
|
|
)
|
|
)
|
|
|
|
if !NPM_OK! equ 0 (
|
|
echo [ERROR] npm not found. This usually comes with Node.js.
|
|
echo [%date% %time%] ERROR: npm not found >> "%LOG_FILE%"
|
|
set /a ERRORS+=1
|
|
goto :SUMMARY
|
|
)
|
|
|
|
REM ---------------------------------------------------------------
|
|
REM STEP 4: Check Git (optional)
|
|
REM ---------------------------------------------------------------
|
|
echo.
|
|
echo [STEP 4/8] Checking Git (optional)...
|
|
|
|
where git >nul 2>&1
|
|
if !ERRORLEVEL! equ 0 (
|
|
for /f "tokens=*" %%v in ('git --version 2^>nul') do set GIT_VERSION=%%v
|
|
echo [OK] !GIT_VERSION!
|
|
) else (
|
|
echo [INFO] Git not found (optional - not required for basic usage)
|
|
set /a WARNINGS+=1
|
|
)
|
|
|
|
REM ---------------------------------------------------------------
|
|
REM STEP 5: Install npm Dependencies
|
|
REM ---------------------------------------------------------------
|
|
echo.
|
|
echo [STEP 5/8] Installing Dependencies...
|
|
|
|
cd /d "%SCRIPT_DIR%"
|
|
|
|
if not exist "package.json" (
|
|
echo [ERROR] package.json not found in %SCRIPT_DIR%
|
|
echo [ERROR] Make sure you extracted the full NomadArch package.
|
|
echo [%date% %time%] ERROR: package.json missing >> "%LOG_FILE%"
|
|
set /a ERRORS+=1
|
|
goto :SUMMARY
|
|
)
|
|
|
|
echo [INFO] Running npm install (this may take a few minutes)...
|
|
echo [%date% %time%] Running npm install >> "%LOG_FILE%"
|
|
|
|
call npm install --no-audit --no-fund 2>&1
|
|
if !ERRORLEVEL! neq 0 (
|
|
echo [WARN] npm install had issues, trying with legacy peer deps...
|
|
call npm install --legacy-peer-deps --no-audit --no-fund 2>&1
|
|
if !ERRORLEVEL! neq 0 (
|
|
echo [ERROR] npm install failed!
|
|
echo [%date% %time%] ERROR: npm install failed >> "%LOG_FILE%"
|
|
set /a ERRORS+=1
|
|
goto :SUMMARY
|
|
)
|
|
)
|
|
echo [OK] Dependencies installed
|
|
|
|
REM ---------------------------------------------------------------
|
|
REM STEP 6: OpenCode Binary (OPTIONAL)
|
|
REM ---------------------------------------------------------------
|
|
echo.
|
|
echo [STEP 6/8] OpenCode Binary Setup...
|
|
echo.
|
|
echo ===============================================================
|
|
echo NomadArch supports Binary-Free Mode!
|
|
echo You can skip the OpenCode binary and use free cloud models:
|
|
echo - GPT-5 Nano, Grok Code, GLM-4.7, Doubao, and more
|
|
echo ===============================================================
|
|
echo.
|
|
|
|
set SKIP_OPENCODE=1
|
|
echo [OK] Using Binary-Free Mode (default)
|
|
echo [%date% %time%] Using Binary-Free Mode >> "%LOG_FILE%"
|
|
|
|
REM ---------------------------------------------------------------
|
|
REM STEP 7: Build UI Assets
|
|
REM ---------------------------------------------------------------
|
|
echo.
|
|
echo [STEP 7/8] Building UI Assets...
|
|
|
|
if exist "%SCRIPT_DIR%\packages\ui\dist\index.html" (
|
|
echo [OK] UI build already exists
|
|
) else (
|
|
echo [INFO] Building UI (this may take 1-2 minutes)...
|
|
pushd "%SCRIPT_DIR%\packages\ui"
|
|
call npm run build 2>&1
|
|
if !ERRORLEVEL! neq 0 (
|
|
echo [ERROR] UI build failed!
|
|
echo [%date% %time%] ERROR: UI build failed >> "%LOG_FILE%"
|
|
popd
|
|
set /a ERRORS+=1
|
|
goto :SUMMARY
|
|
)
|
|
popd
|
|
echo [OK] UI assets built successfully
|
|
)
|
|
|
|
REM ---------------------------------------------------------------
|
|
REM STEP 8: Health Check and Summary
|
|
REM ---------------------------------------------------------------
|
|
echo.
|
|
echo [STEP 8/8] Running Health Check...
|
|
|
|
set HEALTH_OK=1
|
|
|
|
if not exist "%SCRIPT_DIR%\package.json" (
|
|
echo [FAIL] package.json missing
|
|
set HEALTH_OK=0
|
|
)
|
|
|
|
if not exist "%SCRIPT_DIR%\packages\ui" (
|
|
echo [FAIL] packages\ui directory missing
|
|
set HEALTH_OK=0
|
|
)
|
|
|
|
if not exist "%SCRIPT_DIR%\packages\server" (
|
|
echo [FAIL] packages\server directory missing
|
|
set HEALTH_OK=0
|
|
)
|
|
|
|
if not exist "%SCRIPT_DIR%\packages\ui\dist\index.html" (
|
|
echo [FAIL] UI build missing (packages\ui\dist\index.html)
|
|
set HEALTH_OK=0
|
|
)
|
|
|
|
if not exist "%SCRIPT_DIR%\node_modules" (
|
|
echo [FAIL] node_modules directory missing
|
|
set HEALTH_OK=0
|
|
)
|
|
|
|
if !HEALTH_OK! equ 1 (
|
|
echo [OK] All health checks passed
|
|
) else (
|
|
echo [ERROR] Health checks failed
|
|
set /a ERRORS+=1
|
|
)
|
|
|
|
:SUMMARY
|
|
echo.
|
|
echo ===============================================================
|
|
echo INSTALLATION SUMMARY
|
|
echo ===============================================================
|
|
echo.
|
|
echo Install Directory: %TARGET_DIR%
|
|
echo Architecture: !ARCH!
|
|
if defined NODE_VERSION echo Node.js: !NODE_VERSION!
|
|
if defined NPM_VERSION echo npm: !NPM_VERSION!
|
|
echo Mode: Binary-Free Mode
|
|
echo Errors: !ERRORS!
|
|
echo Warnings: !WARNINGS!
|
|
echo Log File: %LOG_FILE%
|
|
echo.
|
|
|
|
if !ERRORS! gtr 0 (
|
|
echo ===============================================================
|
|
echo INSTALLATION FAILED
|
|
echo ===============================================================
|
|
echo.
|
|
echo Review the errors above and check the log file: %LOG_FILE%
|
|
echo.
|
|
echo Common fixes:
|
|
echo 1. Run as Administrator (right-click, Run as administrator)
|
|
echo 2. Ensure internet connection is stable
|
|
echo 3. Disable antivirus temporarily
|
|
echo 4. Install Node.js manually from https://nodejs.org/
|
|
echo.
|
|
echo [%date% %time%] Installation FAILED with !ERRORS! errors >> "%LOG_FILE%"
|
|
) else (
|
|
echo ===============================================================
|
|
echo INSTALLATION SUCCESSFUL!
|
|
echo ===============================================================
|
|
echo.
|
|
echo To start NomadArch, run:
|
|
echo Launch-Windows.bat
|
|
echo.
|
|
echo Available Free Models:
|
|
echo - GPT-5 Nano (fast)
|
|
echo - Grok Code (coding)
|
|
echo - GLM-4.7 (general)
|
|
echo - Doubao (creative)
|
|
echo - Big Pickle (experimental)
|
|
echo.
|
|
echo [%date% %time%] Installation SUCCESSFUL >> "%LOG_FILE%"
|
|
)
|
|
|
|
echo.
|
|
echo Press any key to exit...
|
|
pause >nul
|
|
exit /b !ERRORS!
|