Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 0 additions & 15 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,24 +40,9 @@ jobs:
node-version: 24
cache: npm

- name: (macOS) setuptools for node-gyp β€” appdmg's native deps
# maker-dmg's `appdmg` pulls native addons (macos-alias, fs-xattr) that
# node-gyp compiles. Python 3.12 (default on macos runners) dropped
# distutils, so those builds fail and `npm ci` SILENTLY drops the whole
# optional appdmg chain β€” later surfacing as "Cannot find module
# 'appdmg'" when MakerDMG runs. setuptools restores the distutils shim.
if: runner.os == 'macOS'
run: python3 -m pip install --break-system-packages setuptools

- name: Install dependencies
run: npm ci

- name: (macOS) Assert appdmg is installed (fail loud, never silent)
# If the native build above still failed, npm would have dropped appdmg
# again; catch it here instead of deep inside `electron-forge publish`.
if: runner.os == 'macOS'
run: node -e "require.resolve('appdmg')"

- name: Publish app (creates/updates a draft release for this tag)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Expand Down
11 changes: 10 additions & 1 deletion forge.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { MakerDeb } from '@electron-forge/maker-deb';
import { MakerRpm } from '@electron-forge/maker-rpm';
import { VitePlugin } from '@electron-forge/plugin-vite';
import { PublisherGithub } from '@electron-forge/publisher-github';
import { existsSync } from 'node:fs';

// ── Code signing β€” env-gated, degrades to unsigned builds (audit 1.1) ───────
// None of these secrets exist in this repo yet, so every branch below is
Expand Down Expand Up @@ -91,9 +92,17 @@ console.log(
// releases (release.yml) and local `make` still build the full installer set.
const zipOnly = process.env.HELIOX_MAKE_ZIP_ONLY === '1';

// maker-dmg needs the darwin-only native `appdmg`, whose macos-alias/fs-xattr
// addons don't compile on hosted macOS runners (old native code, no prebuilds),
// so npm drops the optional chain and MakerDMG throws "Cannot find module
// 'appdmg'". Build the DMG only where appdmg actually resolved (local mac dev);
// CI ships the portable mac .zip instead β€” which is also exactly what
// Squirrel.Mac auto-update consumes, so the mac update path is unaffected.
const appdmgAvailable = existsSync('node_modules/appdmg/package.json');

const installerMakers = [
new MakerSquirrel({ name: 'HelioxIDE', authors: 'Heliox', setupIcon: './assets/icon.ico', ...windowsSigning }),
new MakerDMG({ format: 'ULFO', icon: './assets/icon.icns' }),
...(appdmgAvailable ? [new MakerDMG({ format: 'ULFO', icon: './assets/icon.icns' })] : []),
new MakerDeb({
options: {
maintainer: 'Heliox',
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"version": "0.2.0",
"description": "Open-source dashboard for designing agentic flows β€” compose visually, verify by execution, and export portable flows that run across TypeScript, Java, and Python.",
"author": "Heliox",
"license": "Apache-2.0",
"main": ".vite/build/index.js",
"engines": {
"node": ">=24"
Expand Down
Loading