فهرست منبع

feat(desktop): add OPENCODE_TEST_ONBOARDING env (#25968)

Brendan Allan 4 ماه پیش
والد
کامیت
efd8024430
3فایلهای تغییر یافته به همراه38 افزوده شده و 7 حذف شده
  1. 30 5
      packages/desktop/src/main/index.ts
  2. 1 1
      packages/desktop/src/main/server.ts
  3. 7 1
      packages/desktop/src/main/store.ts

+ 30 - 5
packages/desktop/src/main/index.ts

@@ -1,9 +1,9 @@
 import { randomUUID } from "node:crypto"
 import { randomUUID } from "node:crypto"
 import { EventEmitter } from "node:events"
 import { EventEmitter } from "node:events"
-import { existsSync } from "node:fs"
+import { existsSync, mkdirSync, rmSync } from "node:fs"
 import * as http from "node:http"
 import * as http from "node:http"
 import { createServer } from "node:net"
 import { createServer } from "node:net"
-import { homedir } from "node:os"
+import { homedir, tmpdir } from "node:os"
 import { join } from "node:path"
 import { join } from "node:path"
 import { getCACertificates, setDefaultCACertificates } from "node:tls"
 import { getCACertificates, setDefaultCACertificates } from "node:tls"
 import type { Event } from "electron"
 import type { Event } from "electron"
@@ -30,10 +30,17 @@ const APP_IDS: Record<string, string> = {
   beta: "ai.opencode.desktop.beta",
   beta: "ai.opencode.desktop.beta",
   prod: "ai.opencode.desktop",
   prod: "ai.opencode.desktop",
 }
 }
+const TEST_ONBOARDING = process.env.OPENCODE_TEST_ONBOARDING === "1"
 const appId = app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev"
 const appId = app.isPackaged ? APP_IDS[CHANNEL] : "ai.opencode.desktop.dev"
+const onboardingTestRoot = setupOnboardingTestEnv()
 app.setName(app.isPackaged ? APP_NAMES[CHANNEL] : "OpenCode Dev")
 app.setName(app.isPackaged ? APP_NAMES[CHANNEL] : "OpenCode Dev")
 app.setAppUserModelId(appId)
 app.setAppUserModelId(appId)
-app.setPath("userData", join(app.getPath("appData"), appId))
+app.setPath(
+  "userData",
+  onboardingTestRoot ? join(onboardingTestRoot, "desktop") : join(app.getPath("appData"), appId),
+)
+if (onboardingTestRoot) app.setPath("sessionData", join(onboardingTestRoot, "session"))
+const logger = initLogging()
 const { autoUpdater } = pkg
 const { autoUpdater } = pkg
 
 
 import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
 import type { InitStep, ServerReadyData, SqliteMigrationProgress, WslConfig } from "../preload/types"
@@ -65,13 +72,29 @@ const loadingComplete = defer<void>()
 const pendingDeepLinks: string[] = []
 const pendingDeepLinks: string[] = []
 
 
 const serverReady = defer<ServerReadyData>()
 const serverReady = defer<ServerReadyData>()
-const logger = initLogging()
 
 
 useSystemCertificates()
 useSystemCertificates()
 
 
+function setupOnboardingTestEnv() {
+  if (!TEST_ONBOARDING) return
+
+  const root = join(tmpdir(), `opencode-onboarding-${randomUUID()}`)
+  rmSync(root, { recursive: true, force: true })
+  ;["data", "config", "cache", "state", "desktop", "session"].forEach((dir) =>
+    mkdirSync(join(root, dir), { recursive: true }),
+  )
+  process.env.OPENCODE_DB = ":memory:"
+  process.env.XDG_DATA_HOME = join(root, "data")
+  process.env.XDG_CONFIG_HOME = join(root, "config")
+  process.env.XDG_CACHE_HOME = join(root, "cache")
+  process.env.XDG_STATE_HOME = join(root, "state")
+  return root
+}
+
 logger.log("app starting", {
 logger.log("app starting", {
   version: app.getVersion(),
   version: app.getVersion(),
   packaged: app.isPackaged,
   packaged: app.isPackaged,
+  onboardingTest: Boolean(onboardingTestRoot),
 })
 })
 
 
 setupApp()
 setupApp()
@@ -118,7 +141,7 @@ function setupApp() {
   }
   }
 
 
   void app.whenReady().then(async () => {
   void app.whenReady().then(async () => {
-    migrate()
+    if (!TEST_ONBOARDING) migrate()
     app.setAsDefaultProtocolClient("opencode")
     app.setAsDefaultProtocolClient("opencode")
     registerRendererProtocol()
     registerRendererProtocol()
     setDockIcon()
     setDockIcon()
@@ -344,6 +367,8 @@ async function getSidecarPort() {
 }
 }
 
 
 function sqliteFileExists() {
 function sqliteFileExists() {
+  if (process.env.OPENCODE_DB === ":memory:") return true
+
   const xdg = process.env.XDG_DATA_HOME
   const xdg = process.env.XDG_DATA_HOME
   const base = xdg && xdg.length > 0 ? xdg : join(homedir(), ".local", "share")
   const base = xdg && xdg.length > 0 ? xdg : join(homedir(), ".local", "share")
   return existsSync(join(base, "opencode", "opencode.db"))
   return existsSync(join(base, "opencode", "opencode.db"))

+ 1 - 1
packages/desktop/src/main/server.ts

@@ -70,7 +70,7 @@ function prepareServerEnv(password: string) {
     OPENCODE_CLIENT: "desktop",
     OPENCODE_CLIENT: "desktop",
     OPENCODE_SERVER_USERNAME: "opencode",
     OPENCODE_SERVER_USERNAME: "opencode",
     OPENCODE_SERVER_PASSWORD: password,
     OPENCODE_SERVER_PASSWORD: password,
-    XDG_STATE_HOME: app.getPath("userData"),
+    XDG_STATE_HOME: process.env.XDG_STATE_HOME ?? app.getPath("userData"),
   }
   }
   Object.assign(process.env, env)
   Object.assign(process.env, env)
 }
 }

+ 7 - 1
packages/desktop/src/main/store.ts

@@ -1,4 +1,5 @@
 import Store from "electron-store"
 import Store from "electron-store"
+import { app } from "electron"
 
 
 import { SETTINGS_STORE } from "./constants"
 import { SETTINGS_STORE } from "./constants"
 
 
@@ -11,7 +12,12 @@ const cache = new Map<string, Store>()
 export function getStore(name = SETTINGS_STORE) {
 export function getStore(name = SETTINGS_STORE) {
   const cached = cache.get(name)
   const cached = cache.get(name)
   if (cached) return cached
   if (cached) return cached
-  const next = new Store({ name, fileExtension: "", accessPropertiesByDotNotation: false })
+  const next = new Store({
+    name,
+    cwd: app.getPath("userData"),
+    fileExtension: "",
+    accessPropertiesByDotNotation: false,
+  })
   cache.set(name, next)
   cache.set(name, next)
   return next
   return next
 }
 }