fix(desktop): restore linux launcher identity (#31709)

This commit is contained in:
Filip
2026-06-10 17:54:49 +02:00
committed by GitHub
parent 019ec586a6
commit 4b913d901c
3 changed files with 95 additions and 8 deletions
+37 -8
View File
@@ -6,8 +6,14 @@ import { promisify } from "node:util"
import type { Configuration } from "electron-builder"
const execFileAsync = promisify(execFile)
const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..")
const packageDir = path.dirname(fileURLToPath(import.meta.url))
const rootDir = path.resolve(packageDir, "../..")
const signScript = path.join(rootDir, "script", "sign-windows.ps1")
// The Electron 42 packaging update briefly installed Linux launchers/icons under
// "opencode-desktop". Keep that hidden desktop entry around so existing GNOME/KDE
// pins still resolve after the canonical app id changes back to ai.opencode.desktop.
const legacyDesktopEntry = path.join(packageDir, "resources", "linux", "opencode-desktop.desktop")
const legacyDesktopEntryFpm = `${legacyDesktopEntry}=/usr/share/applications/opencode-desktop.desktop`
async function signWindows(configuration: { path: string }) {
if (process.platform !== "win32") return
@@ -26,12 +32,26 @@ const channel = (() => {
return "dev"
})()
const getBase = (): Configuration => ({
const APP_IDS = {
dev: "ai.opencode.desktop.dev",
beta: "ai.opencode.desktop.beta",
prod: "ai.opencode.desktop",
} as const
const getBase = (appId: string): Configuration => ({
artifactName: "opencode-desktop-${os}-${arch}.${ext}",
directories: {
output: "dist",
buildResources: "resources",
},
// Linux launchers are .desktop files, so this is the desktop file name,
// not just the app id. For prod, app id "ai.opencode.desktop" becomes
// "ai.opencode.desktop.desktop".
// https://developer.gnome.org/documentation/guidelines/maintainer/integrating.html
// https://www.electron.build/docs/linux/
extraMetadata: {
desktopName: `${appId}.desktop`,
},
files: ["out/**/*", "resources/**/*"],
extraResources: [
{
@@ -74,19 +94,27 @@ const getBase = (): Configuration => ({
linux: {
icon: `resources/icons`,
category: "Development",
executableName: "opencode-desktop",
executableName: appId,
desktop: {
entry: {
// Match the installed .desktop file and hicolor icon basename so
// Linux shells can associate the running Electron window with its launcher.
StartupWMClass: appId,
},
},
target: ["AppImage", "deb", "rpm"],
},
})
function getConfig() {
const base = getBase()
const appId = APP_IDS[channel]
const base = getBase(appId)
switch (channel) {
case "dev": {
return {
...base,
appId: "ai.opencode.desktop.dev",
appId,
productName: "OpenCode Dev",
rpm: { packageName: "opencode-dev" },
}
@@ -94,7 +122,7 @@ function getConfig() {
case "beta": {
return {
...base,
appId: "ai.opencode.desktop.beta",
appId,
productName: "OpenCode Beta",
protocols: { name: "OpenCode Beta", schemes: ["opencode"] },
publish: { provider: "github", owner: "anomalyco", repo: "opencode-beta", channel: "latest" },
@@ -104,11 +132,12 @@ function getConfig() {
case "prod": {
return {
...base,
appId: "ai.opencode.desktop",
appId,
productName: "OpenCode",
protocols: { name: "OpenCode", schemes: ["opencode"] },
publish: { provider: "github", owner: "anomalyco", repo: "opencode", channel: "latest" },
rpm: { packageName: "opencode" },
deb: { fpm: [legacyDesktopEntryFpm] },
rpm: { packageName: "opencode", fpm: [legacyDesktopEntryFpm] },
}
}
}