Files
fusion/packages/desktop/electron-builder.yml
gsxdsm 1f3a15ec1c FN-7360: fix Windows desktop runtime packaging
Fix packaged Windows desktop startup by preserving Node-safe runtime dependencies and dashboard registry assets.

- Externalize Electron main/preload npm packages so CommonJS updater dependencies load natively.
- Load the dashboard plugin registry manifest through file IO and copy it into dashboard server dist from all build paths.
- Split Windows NSIS and portable artifact names and verify required Electron runtime resources in CI.
- Cover the packaging/runtime invariants with desktop and dashboard regression tests.

Files changed:
 .changeset/fn-7360-desktop-windows.md              |  7 +++
 .github/workflows/desktop-windows.yml              | 21 ++++++++
 packages/dashboard/package.json                    |  2 +-
 .../src/__tests__/plugin-registry-dist.test.ts     | 32 ++++++++++++
 .../src/__tests__/routes-plugin-registry.test.ts   | 10 ++--
 packages/dashboard/src/plugin-routes.ts            | 27 +++++++++-
 packages/desktop/README.md                         |  5 +-
 packages/desktop/electron-builder.yml              |  9 ++++
 packages/desktop/scripts/build.ts                  | 29 ++++++++--
 packages/desktop/scripts/workspace-tools.ts        |  4 ++
 .../desktop/src/__tests__/build-bundling.test.ts   | 61 ++++++++++++++++++++++
 .../src/__tests__/electron-builder-config.test.ts  | 15 ++++++
 packages/desktop/src/__tests__/ipc.test.ts         | 15 ++++++
 .../desktop/src/__tests__/local-runtime.test.ts    | 20 +++++++
 14 files changed, 247 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-7360

Fusion-Task-Lineage: a2d88130-c24f-43e2-932a-1e174b6afa35

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
2026-07-01 08:01:59 -07:00

174 lines
5.2 KiB
YAML

appId: com.gsxdsm.fusion.desktop
productName: Fusion
artifactName: "${productName}-${version}-${os}-${arch}.${ext}"
directories:
output: dist-electron
buildResources: src/icons
# The desktop app bundles no native addon that needs an Electron-ABI rebuild: it
# uses Node's built-in `node:sqlite`, and the only native modules in the dependency
# tree (keytar, @homebridge/node-pty-prebuilt-multiarch via @fusion/dashboard) are
# loaded optionally and are NOT in the `files` list, so they're never packaged.
# electron-builder's default rebuild walks the whole tree and tries to source-build
# node-pty (it ships Node-ABI prebuilds only, none for Electron) via node-gyp, which
# fails on the Windows runner ("Could not find any Visual Studio installation").
# Disabling the rebuild skips that pointless, platform-fragile compile entirely.
npmRebuild: false
files:
# pnpm installs workspace/runtime deps as symlinked package entries backed by the
# virtual store. These flat node_modules/X/**/* patterns only work when electron-builder
# follows the symlink chain from the published package entry, so every @fusion/core
# runtime dependency group that the desktop app can load must be listed here.
# If @fusion/core gains a new runtime dependency, add it (and any required leaf deps)
# here or packaged desktop builds can fail at startup/runtime with missing-module errors.
- dist/**/*
- package.json
- node_modules/@fusion/core/**/*
- node_modules/@fusion/dashboard/**/*
- node_modules/better-sqlite3/**/*
- node_modules/electron-updater/**/*
- node_modules/builder-util-runtime/**/*
- node_modules/fs-extra/**/*
- node_modules/jsonfile/**/*
- node_modules/graceful-fs/**/*
- node_modules/universalify/**/*
- node_modules/js-yaml/**/*
- node_modules/argparse/**/*
- node_modules/sprintf-js/**/*
- node_modules/lazy-val/**/*
- node_modules/lodash.escaperegexp/**/*
- node_modules/lodash.isequal/**/*
- node_modules/semver/**/*
- node_modules/tiny-typed-emitter/**/*
- node_modules/debug/**/*
- node_modules/ms/**/*
- node_modules/sax/**/*
# @fusion/core archive parsing deps
- node_modules/extract-zip/**/*
- node_modules/get-stream/**/*
- node_modules/pump/**/*
- node_modules/end-of-stream/**/*
- node_modules/once/**/*
- node_modules/wrappy/**/*
- node_modules/yauzl/**/*
- node_modules/fd-slicer/**/*
- node_modules/pend/**/*
- node_modules/buffer-crc32/**/*
- node_modules/tar/**/*
- node_modules/@isaacs/fs-minipass/**/*
- node_modules/chownr/**/*
- node_modules/minipass/**/*
- node_modules/minizlib/**/*
- node_modules/yallist/**/*
- node_modules/yaml/**/*
# @fusion/core scheduling/automation deps
- node_modules/cron-parser/**/*
- node_modules/luxon/**/*
# @fusion/core discovery/system deps
- node_modules/bonjour-service/**/*
- node_modules/fast-deep-equal/**/*
- node_modules/multicast-dns/**/*
- node_modules/dns-packet/**/*
- node_modules/thunky/**/*
- node_modules/@leichtgewicht/ip-codec/**/*
- node_modules/check-disk-space/**/*
# @fusion/core optional docker runtime deps
- node_modules/dockerode/**/*
- node_modules/@balena/dockerignore/**/*
- node_modules/@grpc/grpc-js/**/*
- node_modules/@grpc/proto-loader/**/*
- node_modules/docker-modem/**/*
- node_modules/protobufjs/**/*
- node_modules/tar-fs/**/*
- node_modules/uuid/**/*
asarUnpack:
- node_modules/better-sqlite3/**/*
extraMetadata:
main: dist/main.js
extraResources:
- from: src/icons
to: icons
filter:
- "tray-*.png"
protocols:
- name: Fusion Deep Links
schemes:
- fusion
fileAssociations:
- ext: fusion
name: Fusion Task Link
description: Fusion desktop deep link
role: Viewer
mimeType: x-scheme-handler/fusion
publish:
provider: github
owner: gsxdsm
repo: fusion
mac:
category: public.app-category.developer-tools
minimumSystemVersion: "10.15"
target:
- target: dmg
- target: zip
hardenedRuntime: true
gatekeeperAssess: false
entitlements: build/entitlements.mac.plist
entitlementsInherit: build/entitlements.mac.plist
notarize: true
win:
target:
- target: nsis
arch:
- x64
- arm64
- target: portable
arch:
- x64
- arm64
signtoolOptions:
signingHashAlgorithms:
- sha256
rfc3161TimeStampServer: http://timestamp.digicert.com
publisherName: Fusion
nsis:
# FNXC:WindowsDesktopPackaging 2026-07-01-08:02:
# NSIS is the installable Windows artifact and must keep the 0.50-style
# Fusion-<version>-win-<arch>.exe name so updater/install docs remain stable.
# The portable target writes a separate -portable EXE below to avoid colliding
# with or overwriting the NSIS installer during x64/arm64 packaging.
artifactName: "${productName}-${version}-${os}-${arch}.${ext}"
oneClick: false
perMachine: false
allowElevation: false
allowToChangeInstallationDirectory: true
portable:
artifactName: "${productName}-${version}-${os}-${arch}-portable.${ext}"
linux:
category: Development
target:
- target: AppImage
arch:
- x64
- arm64
- target: deb
arch:
- x64
- arm64
- target: tar.gz
arch:
- x64
- arm64