11import { randomUUID } from "node:crypto"
22import { EventEmitter } from "node:events"
3- import { existsSync } from "node:fs"
3+ import { existsSync , mkdirSync , rmSync } from "node:fs"
44import * as http from "node:http"
55import { createServer } from "node:net"
6- import { homedir } from "node:os"
6+ import { homedir , tmpdir } from "node:os"
77import { join } from "node:path"
88import { getCACertificates , setDefaultCACertificates } from "node:tls"
99import type { Event } from "electron"
@@ -30,10 +30,17 @@ const APP_IDS: Record<string, string> = {
3030 beta : "ai.opencode.desktop.beta" ,
3131 prod : "ai.opencode.desktop" ,
3232}
33+ const TEST_ONBOARDING = process . env . OPENCODE_TEST_ONBOARDING === "1"
3334const appId = app . isPackaged ? APP_IDS [ CHANNEL ] : "ai.opencode.desktop.dev"
35+ const onboardingTestRoot = setupOnboardingTestEnv ( )
3436app . setName ( app . isPackaged ? APP_NAMES [ CHANNEL ] : "OpenCode Dev" )
3537app . setAppUserModelId ( appId )
36- app . setPath ( "userData" , join ( app . getPath ( "appData" ) , appId ) )
38+ app . setPath (
39+ "userData" ,
40+ onboardingTestRoot ? join ( onboardingTestRoot , "desktop" ) : join ( app . getPath ( "appData" ) , appId ) ,
41+ )
42+ if ( onboardingTestRoot ) app . setPath ( "sessionData" , join ( onboardingTestRoot , "session" ) )
43+ const logger = initLogging ( )
3744const { autoUpdater } = pkg
3845
3946import type { InitStep , ServerReadyData , SqliteMigrationProgress , WslConfig } from "../preload/types"
@@ -65,13 +72,29 @@ const loadingComplete = defer<void>()
6572const pendingDeepLinks : string [ ] = [ ]
6673
6774const serverReady = defer < ServerReadyData > ( )
68- const logger = initLogging ( )
6975
7076useSystemCertificates ( )
7177
78+ function setupOnboardingTestEnv ( ) {
79+ if ( ! TEST_ONBOARDING ) return
80+
81+ const root = join ( tmpdir ( ) , `opencode-onboarding-${ randomUUID ( ) } ` )
82+ rmSync ( root , { recursive : true , force : true } )
83+ ; [ "data" , "config" , "cache" , "state" , "desktop" , "session" ] . forEach ( ( dir ) =>
84+ mkdirSync ( join ( root , dir ) , { recursive : true } ) ,
85+ )
86+ process . env . OPENCODE_DB = ":memory:"
87+ process . env . XDG_DATA_HOME = join ( root , "data" )
88+ process . env . XDG_CONFIG_HOME = join ( root , "config" )
89+ process . env . XDG_CACHE_HOME = join ( root , "cache" )
90+ process . env . XDG_STATE_HOME = join ( root , "state" )
91+ return root
92+ }
93+
7294logger . log ( "app starting" , {
7395 version : app . getVersion ( ) ,
7496 packaged : app . isPackaged ,
97+ onboardingTest : Boolean ( onboardingTestRoot ) ,
7598} )
7699
77100setupApp ( )
@@ -118,7 +141,7 @@ function setupApp() {
118141 }
119142
120143 void app . whenReady ( ) . then ( async ( ) => {
121- migrate ( )
144+ if ( ! TEST_ONBOARDING ) migrate ( )
122145 app . setAsDefaultProtocolClient ( "opencode" )
123146 registerRendererProtocol ( )
124147 setDockIcon ( )
@@ -344,6 +367,8 @@ async function getSidecarPort() {
344367}
345368
346369function sqliteFileExists ( ) {
370+ if ( process . env . OPENCODE_DB === ":memory:" ) return true
371+
347372 const xdg = process . env . XDG_DATA_HOME
348373 const base = xdg && xdg . length > 0 ? xdg : join ( homedir ( ) , ".local" , "share" )
349374 return existsSync ( join ( base , "opencode" , "opencode.db" ) )
0 commit comments