@echo off setlocal EnableExtensions EnableDelayedExpansion title AetherForge — Pack USB cd /d "%~dp0" set "ROOT=%CD%" set "USB=%ROOT%\usb" echo. echo ================================================================ echo AetherForge — Pack Portable USB echo ================================================================ echo. echo Assembles a self-contained copy in: %USB%\ echo Copy that entire folder to a USB drive — nothing else needed. echo. :: ---------------------------------------------------------------- :: 0. Check prerequisites :: ---------------------------------------------------------------- where go >nul 2>nul if errorlevel 1 ( echo ERROR: Go not found on PATH. echo Install from https://go.dev/dl/ or add it to PATH. pause exit /b 1 ) where npm >nul 2>nul if errorlevel 1 ( echo WARNING: npm not found. Skipping frontend build. set "SKIP_FRONTEND=1" ) if not exist "%USB%" mkdir "%USB%" :: ---------------------------------------------------------------- :: 0b. Ensure portable Go toolchain (forge on PCs without system Go) :: ---------------------------------------------------------------- echo [0/8] Ensuring Go toolchain... if not exist "%USB%\toolchain" mkdir "%USB%\toolchain" if not exist "%USB%\toolchain\pack" mkdir "%USB%\toolchain\pack" set "GO_PACK=%USB%\toolchain\pack\go1.26.3.windows-amd64.zip" if not exist "%USB%\toolchain\go\bin\go.exe" ( if exist "C:\Program Files\Go\bin\go.exe" ( echo [0/8] Copying Go from C:\Program Files\Go... if exist "%USB%\toolchain\go" rd /s /q "%USB%\toolchain\go" robocopy "C:\Program Files\Go" "%USB%\toolchain\go" /E /NFL /NDL /NJH /NJS /NC /NS >nul ) ) if not exist "%GO_PACK%" ( if exist "%ROOT%\usb\toolchain\pack\go1.26.3.windows-amd64.zip" ( copy /y "%ROOT%\usb\toolchain\pack\go1.26.3.windows-amd64.zip" "%GO_PACK%" >nul echo [0/8] Offline Go zip copied from existing usb pack. ) else ( echo [0/8] Downloading offline Go zip for amd64... powershell -NoProfile -Command "& { [Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12; Invoke-WebRequest -Uri 'https://go.dev/dl/go1.26.3.windows-amd64.zip' -OutFile '%GO_PACK%' }" ) ) if exist "%USB%\toolchain\go\bin\go.exe" ( echo [0/8] Go toolchain ready in usb\toolchain\go\ ) else ( echo [0/8] WARNING: Go not bundled — LAUNCH.bat will extract from pack zip on first run. ) :: ---------------------------------------------------------------- :: 1. Build the frontend when npm is available :: ---------------------------------------------------------------- if not defined SKIP_FRONTEND ( echo [1/8] Building frontend... cd "%ROOT%\server\web" call npm install --silent call npm run build if errorlevel 1 ( echo ERROR: Frontend build failed. cd "%ROOT%" pause exit /b 1 ) cd "%ROOT%" echo [1/8] Frontend built. ) else ( echo [1/8] Skipped - npm not found. ) :: ---------------------------------------------------------------- :: 2. Build AetherForge.exe for Windows amd64 :: ---------------------------------------------------------------- echo [2/8] Compiling AetherForge.exe... cd "%ROOT%\server" set "CGO_ENABLED=0" set "GOOS=windows" set "GOARCH=amd64" go build -ldflags="-s -w" -o "%USB%\AetherForge.exe" . if errorlevel 1 ( echo ERROR: Go build failed. cd "%ROOT%" pause exit /b 1 ) cd "%ROOT%" echo [2/8] AetherForge.exe ready. :: ---------------------------------------------------------------- :: 3. Copy webroot - dashboard UI :: ---------------------------------------------------------------- echo [3/8] Copying webroot... if exist "%USB%\webroot" rd /s /q "%USB%\webroot" if exist "%ROOT%\server\web\dist" ( xcopy /e /i /q "%ROOT%\server\web\dist" "%USB%\webroot" >nul ) else if exist "%ROOT%\server\webroot" ( xcopy /e /i /q "%ROOT%\server\webroot" "%USB%\webroot" >nul ) else ( echo ERROR: No webroot found. Run npm run build in server\web first. pause exit /b 1 ) echo [3/8] webroot copied. :: ---------------------------------------------------------------- :: 4. Copy agent and fusion source - Forge needs these at runtime :: ---------------------------------------------------------------- echo [4/8] Copying agent + fusion source... if exist "%USB%\agent" rd /s /q "%USB%\agent" if exist "%USB%\fusion" rd /s /q "%USB%\fusion" robocopy "%ROOT%\agent" "%USB%\agent" /E /XD node_modules dist .git /XF crypto-miner-agent crypto-miner-fusion /NFL /NDL /NJH /NJS /NC /NS >nul if errorlevel 8 ( echo ERROR: Failed to copy agent source. pause exit /b 1 ) robocopy "%ROOT%\fusion" "%USB%\fusion" /E /XD node_modules dist .git /XF crypto-miner-fusion /NFL /NDL /NJH /NJS /NC /NS >nul if errorlevel 8 ( echo ERROR: Failed to copy fusion source. pause exit /b 1 ) echo [4/8] Source trees copied. :: ---------------------------------------------------------------- :: 5. Launcher + docs (always sync from project root) :: ---------------------------------------------------------------- echo [5/8] Syncing LAUNCH.bat and README... copy /y "%ROOT%\LAUNCH.bat" "%USB%\LAUNCH.bat" >nul if not exist "%USB%\README.txt" ( if exist "%ROOT%\usb\README.txt" copy /y "%ROOT%\usb\README.txt" "%USB%\README.txt" >nul ) :: run.bat is a project-root marker used by some tooling echo @echo off > "%USB%\run.bat" echo rem AetherForge portable root marker >> "%USB%\run.bat" echo [5/8] Launcher synced. :: ---------------------------------------------------------------- :: 6. Remove stale nested server mirror (not needed for portable) :: ---------------------------------------------------------------- echo [6/8] Cleaning stale artifacts... if exist "%USB%\server" rd /s /q "%USB%\server" echo [6/8] Done. :: ---------------------------------------------------------------- :: 7. Ensure data directories exist - preserve existing config and db :: ---------------------------------------------------------------- echo [7/8] Ensuring data directories... if not exist "%USB%\data" mkdir "%USB%\data" if not exist "%USB%\data\builds" mkdir "%USB%\data\builds" if not exist "%USB%\data\logs" mkdir "%USB%\data\logs" if not exist "%USB%\data\blueprints" mkdir "%USB%\data\blueprints" if not exist "%USB%\data\preps" mkdir "%USB%\data\preps" if not exist "%USB%\data\spread-kits" mkdir "%USB%\data\spread-kits" if not exist "%USB%\data\uploads" mkdir "%USB%\data\uploads" if not exist "%USB%\data\config.json" ( echo [7/8] Writing starter config.json... powershell -NoProfile -Command ^ "$j = @{ port = 8989; data_dir = 'data'; pool = @{ host = 'pool.supportxmr.com'; port = 443; use_tls = $true; password = 'x'; backup_pools = @(@{ host = 'gulf.moneroocean.stream'; port = 20128; use_tls = $true }, @{ host = 'xmr.herominers.com'; port = 1120; use_tls = $true }) }; wallet = @{ address = ''; payment_id = '' }; server = @{ public_url = ''; open_firewall_on_start = $true } }; $j | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath '%USB%\data\config.json' -Encoding utf8" echo [7/8] Starter config.json created ^(empty wallet, TLS pool presets^). ) else ( echo [7/8] data\ ready - existing config and db preserved. ) :: ---------------------------------------------------------------- :: Summary :: ---------------------------------------------------------------- echo. echo ================================================================ echo USB pack complete! echo. echo Folder: %USB%\ echo. dir /b "%USB%" echo. echo To use: echo 1. Copy the entire usb\ folder to your USB drive echo 2. Double-click LAUNCH.bat on any Windows PC echo 3. Open http://localhost:8989 echo. echo Your data\ and toolchain\ folders are preserved across repacks. echo Go is bundled in toolchain\go\ (offline zip in toolchain\pack\). echo First launch without bundled Go: LAUNCH.bat extracts from pack zip. echo ================================================================ echo. pause endlocal