From 9bdd20f83adbc0dc9b89a5cc3fb891e6097729bd Mon Sep 17 00:00:00 2001 From: Brandon Li Date: Sun, 30 Aug 2026 16:16:06 -0500 Subject: [PATCH] Add Windows setup script for new instances Standalone batch file: clones (or pulls), installs, builds, seeds the reporter settings, and writes a start-autofirmer.bat. Prompts for the master dashboard URL and instance name, defaulting to %COMPUTERNAME%. Two install hazards it handles: - better-sqlite3 has no prebuilt binary above Node 22, so install silently falls back to node-gyp and dies without Visual Studio Build Tools. The script warns first and names the fix if install fails anyway - playwright is declared but referenced nowhere in the source, so its postinstall browser download is skipped Co-Authored-By: Claude Opus 5 --- scripts/seed-settings.js | 31 +++++++ setup-windows.bat | 196 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 scripts/seed-settings.js create mode 100644 setup-windows.bat diff --git a/scripts/seed-settings.js b/scripts/seed-settings.js new file mode 100644 index 0000000..2f11357 --- /dev/null +++ b/scripts/seed-settings.js @@ -0,0 +1,31 @@ +/** + * Writes the reporter settings into autotrader.sqlite before first launch. + * + * lib/db.ts seeds these keys with INSERT OR IGNORE, so values written here + * survive the app's own startup seeding. Must be run from the project root — + * lib/db.ts opens the database at process.cwd(). + * + * node scripts/seed-settings.js + */ +const path = require('path'); +const Database = require('better-sqlite3'); + +const [, , url, name] = process.argv; + +const db = new Database(path.join(process.cwd(), 'autotrader.sqlite')); +db.exec(` + CREATE TABLE IF NOT EXISTS settings ( + key TEXT PRIMARY KEY, + value TEXT NOT NULL + ); +`); + +const upsert = db.prepare( + 'INSERT INTO settings (key, value) VALUES (?, ?) ' + + 'ON CONFLICT(key) DO UPDATE SET value = excluded.value' +); + +if (url) { upsert.run('master_dashboard_url', url); console.log(' master_dashboard_url = ' + url); } +if (name) { upsert.run('instance_name', name); console.log(' instance_name = ' + name); } + +db.close(); diff --git a/setup-windows.bat b/setup-windows.bat new file mode 100644 index 0000000..9a8c01a --- /dev/null +++ b/setup-windows.bat @@ -0,0 +1,196 @@ +@echo off +setlocal EnableExtensions +title AutoFirmer - Windows setup + +REM ============================================================================ +REM AutoFirmer instance setup for Windows. +REM +REM Standalone: drop this file anywhere and run it. It clones the repo into a +REM subfolder next to itself, installs, builds, and points the instance at the +REM master dashboard. Safe to re-run - it pulls and rebuilds instead of cloning. +REM ============================================================================ + +set "REPO_URL=https://git.juicerroom.com/senofy/autofirmer-expanded.git" +set "DEFAULT_MASTER=https://master.juicerroom.com" +set "TARGET=%~dp0autofirmer" + +echo. +echo ============================================ +echo AutoFirmer - Windows setup +echo ============================================ +echo. + +REM ---------------------------------------------------------------- git check +where git >nul 2>&1 +if errorlevel 1 ( + echo [X] Git is not installed, or not on PATH. + echo Install it from https://git-scm.com/download/win then re-run. + goto :fail +) +echo [ok] git + +REM --------------------------------------------------------------- node check +where node >nul 2>&1 +if errorlevel 1 ( + echo [X] Node.js is not installed, or not on PATH. + echo Install Node 22 LTS from https://nodejs.org/ then re-run. + goto :fail +) +for /f "tokens=* usebackq" %%v in (`node -p "process.versions.node"`) do set "NODEVER=%%v" +for /f "tokens=1 delims=." %%m in ("%NODEVER%") do set "NODEMAJOR=%%m" +echo [ok] node v%NODEVER% + +REM better-sqlite3 ships prebuilt binaries only for released Node ABIs. On a +REM newer major it falls back to node-gyp, which needs Visual Studio Build +REM Tools - a long, confusing failure if it is not installed. +if %NODEMAJOR% GEQ 23 goto :node_warn +goto :node_ok + +:node_warn +echo. +echo [!] Node %NODEMAJOR% is newer than better-sqlite3's prebuilt binaries. +echo Install may try to compile from source and fail without Visual +echo Studio Build Tools. Node 22 LTS is the safe choice here. +echo. +set "GOON=" +set /p "GOON= Continue anyway? [y/N] " +if /i not "%GOON%"=="y" goto :fail +:node_ok + +REM ------------------------------------------------------------------- python +where python >nul 2>&1 +if errorlevel 1 ( + echo [--] python not found - the dashboard will still work. + echo Needed only for the clicker ^(clicker\runner.py^). + set "HAVE_PY=0" +) else ( + echo [ok] python + set "HAVE_PY=1" +) + +REM ------------------------------------------------------------------- prompts +echo. +set "MASTER_URL=" +set /p "MASTER_URL= Master dashboard URL [%DEFAULT_MASTER%]: " +if "%MASTER_URL%"=="" set "MASTER_URL=%DEFAULT_MASTER%" + +set "INSTANCE=" +set /p "INSTANCE= Instance name [%COMPUTERNAME%]: " +if "%INSTANCE%"=="" set "INSTANCE=%COMPUTERNAME%" + +echo. +echo Installing to: %TARGET% +echo. + +REM -------------------------------------------------------------- clone / pull +if exist "%TARGET%\.git" ( + echo [1/5] Existing checkout found - pulling latest... + pushd "%TARGET%" + git pull --ff-only + if errorlevel 1 ( + popd + echo [X] git pull failed. Resolve local changes and re-run. + goto :fail + ) + popd +) else ( + echo [1/5] Cloning %REPO_URL% ... + git clone "%REPO_URL%" "%TARGET%" + if errorlevel 1 ( + echo [X] Clone failed. Check network access to git.juicerroom.com. + goto :fail + ) +) + +pushd "%TARGET%" + +REM ------------------------------------------------------------------- install +echo. +echo [2/5] Installing npm dependencies ^(this takes a few minutes^)... +REM playwright is declared but unreferenced anywhere in the source; skipping its +REM browser download saves several hundred MB and a lot of time. +set "PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1" +call npm install +if errorlevel 1 ( + echo. + echo [X] npm install failed. + echo If the error mentions node-gyp, MSBuild, or better_sqlite3.cpp, + echo the native module could not find a prebuilt binary. Either switch + echo to Node 22 LTS, or install "Desktop development with C++" from the + echo Visual Studio Build Tools installer. + popd + goto :fail +) + +REM --------------------------------------------------------------------- build +echo. +echo [3/5] Building... +call npm run build +if errorlevel 1 ( + echo [X] Build failed. + popd + goto :fail +) + +REM ------------------------------------------------------------------ settings +echo. +echo [4/5] Writing instance settings... +node scripts\seed-settings.js "%MASTER_URL%" "%INSTANCE%" +if errorlevel 1 ( + echo [X] Could not write settings to autotrader.sqlite. + popd + goto :fail +) + +REM ------------------------------------------------------ python deps (option) +if "%HAVE_PY%"=="1" ( + echo. + echo [5/5] Installing clicker Python dependencies... + python -m pip install --quiet --disable-pip-version-check -r clicker\requirements.txt + if errorlevel 1 ( + echo [!] pip install failed - the dashboard still works, the clicker will not. + ) +) else ( + echo. + echo [5/5] Skipping Python dependencies ^(python not found^). +) + +REM ---------------------------------------------------------------- start file +> "%~dp0start-autofirmer.bat" ( + echo @echo off + echo title AutoFirmer - %INSTANCE% + echo cd /d "%TARGET%" + echo echo Dashboard starting on http://localhost:3000 + echo call npm run start + echo pause +) + +popd + +echo. +echo ============================================ +echo Done. +echo ============================================ +echo. +echo Instance name : %INSTANCE% +echo Reporting to : %MASTER_URL% +echo Installed in : %TARGET% +echo. +echo Start it with : start-autofirmer.bat +echo Dashboard at : http://localhost:3000 +echo. +echo Still manual: +echo - Load the Chrome extension: chrome://extensions, enable Developer +echo mode, "Load unpacked", select %TARGET%\extension +echo - Add your firm credentials on the dashboard's Settings page +echo - Run the clicker when needed: python clicker\runner.py +echo. +pause +exit /b 0 + +:fail +echo. +echo Setup did not complete. +echo. +pause +exit /b 1