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