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

This commit is contained in:
Brendan Allan 2026-05-06 12:30:20 +08:00 committed by GitHub
commit efd8024430
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 38 additions and 7 deletions

View file

@ -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"))

View file

@ -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)
} }

View file

@ -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
} }