From a892db775eca41bf50f332bd21f05ca967388dd8 Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Tue, 2 Jun 2026 12:48:29 -0400 Subject: [PATCH 1/3] feat(packaging): build .deb and .rpm packages Add MakerDeb and MakerRpm to the Electron Forge config so Linux releases also produce .deb and .rpm packages alongside the AppImage and zip. Both declare mimeType x-scheme-handler/posthog-code, so installing registers the posthog-code:// deep-link handler system-wide via the generated .desktop file and the package manager's update-desktop-database trigger. The package name/bin yield /usr/bin/posthog-code, consistent with the AUR package. The publish-linux CI job (x64 + arm64) now installs fakeroot (maker-deb) and rpm (maker-rpm), so both arches are built and uploaded automatically. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/code-release.yml | 6 +- apps/code/forge.config.ts | 31 ++++ apps/code/package.json | 2 + apps/code/scripts/build-linux-docker.sh | 38 +++- pnpm-lock.yaml | 223 ++++++++++++++++++++++++ 5 files changed, 296 insertions(+), 4 deletions(-) diff --git a/.github/workflows/code-release.yml b/.github/workflows/code-release.yml index ae3317bf15..c3f8d5a3ca 100644 --- a/.github/workflows/code-release.yml +++ b/.github/workflows/code-release.yml @@ -273,11 +273,13 @@ jobs: token: ${{ steps.app-token.outputs.token }} persist-credentials: false - - name: Install AppImage build tooling + - name: Install Linux packaging tooling + # squashfs-tools/zsync/libfuse2t64: AppImage. fakeroot: maker-deb. + # rpm: maker-rpm (provides rpmbuild). run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ - squashfs-tools zsync libfuse2t64 + squashfs-tools zsync libfuse2t64 fakeroot rpm - name: Setup pnpm uses: pnpm/action-setup@b906affcce14559ad1aafd4ab0e942779e9f58b1 # v4 diff --git a/apps/code/forge.config.ts b/apps/code/forge.config.ts index e64e4f57a9..8955729cab 100644 --- a/apps/code/forge.config.ts +++ b/apps/code/forge.config.ts @@ -2,7 +2,9 @@ import type { ChildProcess } from "node:child_process"; import { execSync } from "node:child_process"; import { cpSync, existsSync, mkdirSync, rmSync } from "node:fs"; import path from "node:path"; +import { MakerDeb } from "@electron-forge/maker-deb"; import { MakerDMG } from "@electron-forge/maker-dmg"; +import { MakerRpm } from "@electron-forge/maker-rpm"; import { MakerSquirrel } from "@electron-forge/maker-squirrel"; import { MakerZIP } from "@electron-forge/maker-zip"; import { VitePlugin } from "@electron-forge/plugin-vite"; @@ -206,6 +208,35 @@ const config: ForgeConfig = { bin: "PostHog Code", }, }), + new MakerDeb({ + options: { + name: "posthog-code", + productName: "PostHog Code", + genericName: "Code Editor", + description: "PostHog Code desktop app", + bin: "PostHog Code", + icon: "./build/app-icon.png", + categories: ["Development"], + section: "devel", + maintainer: "PostHog ", + homepage: "https://github.com/PostHog/code", + mimeType: ["x-scheme-handler/posthog-code"], + }, + }), + new MakerRpm({ + options: { + name: "posthog-code", + productName: "PostHog Code", + genericName: "Code Editor", + description: "PostHog Code desktop app", + bin: "PostHog Code", + license: "MIT", + icon: "./build/app-icon.png", + categories: ["Development"], + homepage: "https://github.com/PostHog/code", + mimeType: ["x-scheme-handler/posthog-code"], + }, + }), new MakerZIP({}, ["darwin", "linux"]), ], hooks: { diff --git a/apps/code/package.json b/apps/code/package.json index dee944027f..12b76f386f 100644 --- a/apps/code/package.json +++ b/apps/code/package.json @@ -45,7 +45,9 @@ "devDependencies": { "@biomejs/biome": "2.2.4", "@electron-forge/cli": "^7.11.1", + "@electron-forge/maker-deb": "^7.11.1", "@electron-forge/maker-dmg": "^7.11.1", + "@electron-forge/maker-rpm": "^7.11.1", "@electron-forge/maker-squirrel": "^7.11.1", "@electron-forge/maker-zip": "^7.11.1", "@electron-forge/plugin-vite": "^7.11.1", diff --git a/apps/code/scripts/build-linux-docker.sh b/apps/code/scripts/build-linux-docker.sh index 7497d53c1f..19e51fa9b5 100755 --- a/apps/code/scripts/build-linux-docker.sh +++ b/apps/code/scripts/build-linux-docker.sh @@ -8,6 +8,36 @@ case "$ARCH" in *) echo "Unsupported ARCH=$ARCH (expected x64 or arm64)" >&2; exit 1 ;; esac +# Optional maker targets. Without any, all configured makers run (default). +# Accept friendly aliases or full maker package names, via repeatable +# --target/--targets flags (comma-separated) or the TARGETS env var. +RAW_TARGETS="${TARGETS:-}" +while [ $# -gt 0 ]; do + case "$1" in + --target|--targets) RAW_TARGETS="${RAW_TARGETS:+$RAW_TARGETS,}$2"; shift 2 ;; + --target=*|--targets=*) RAW_TARGETS="${RAW_TARGETS:+$RAW_TARGETS,}${1#*=}"; shift ;; + *) echo "Unknown argument: $1" >&2; exit 1 ;; + esac +done + +MAKE_TARGETS="" +if [ -n "$RAW_TARGETS" ]; then + IFS=',' read -ra _targets <<< "$RAW_TARGETS" + for t in "${_targets[@]}"; do + t="$(echo "$t" | tr '[:upper:]' '[:lower:]' | xargs)" # lowercase + trim + [ -z "$t" ] && continue + case "$t" in + deb) pkg="@electron-forge/maker-deb" ;; + rpm) pkg="@electron-forge/maker-rpm" ;; + zip) pkg="@electron-forge/maker-zip" ;; + appimage) pkg="@reforged/maker-appimage" ;; + */*) pkg="$t" ;; # already a maker package name + *) echo "Unknown target '$t' (expected: deb, rpm, zip, appimage, or a maker package name)" >&2; exit 1 ;; + esac + MAKE_TARGETS="${MAKE_TARGETS:+$MAKE_TARGETS,}$pkg" + done +fi + REPO_ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" OUT_DIR="$REPO_ROOT/apps/code/out" mkdir -p "$OUT_DIR" @@ -40,6 +70,7 @@ COPYFILE_DISABLE=1 tar -cf - \ -e NODE_ENV=production \ -e ARCH="$ARCH" \ -e BUILD_COMMIT="$HOST_COMMIT" \ + -e MAKE_TARGETS="$MAKE_TARGETS" \ -v "$OUT_DIR":/out \ node:22-bookworm bash -lc ' set -euo pipefail @@ -47,7 +78,8 @@ COPYFILE_DISABLE=1 tar -cf - \ mkdir -p /work && cd /work && tar -xf - corepack enable apt-get update && apt-get install -y --no-install-recommends \ - libsecret-1-dev fuse libfuse2 ca-certificates git squashfs-tools zsync zip + libsecret-1-dev fuse libfuse2 ca-certificates git squashfs-tools zsync zip \ + fakeroot rpm # Tarball arrived owned by the host uid; tell git not to refuse on uid mismatch. git config --global --add safe.directory /work # Postinstall scripts call `git rev-parse` — give them a repo to find. @@ -59,7 +91,9 @@ COPYFILE_DISABLE=1 tar -cf - \ pnpm --filter @posthog/git build pnpm --filter @posthog/enricher build pnpm --filter @posthog/agent build - pnpm --filter code make --platform=linux --arch="$ARCH" + MAKE_TARGETS_FLAG="" + [ -n "${MAKE_TARGETS:-}" ] && MAKE_TARGETS_FLAG="--targets=$MAKE_TARGETS" + pnpm --filter code make --platform=linux --arch="$ARCH" $MAKE_TARGETS_FLAG mkdir -p /out cp -r apps/code/out/make /out/ ' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e7c6a229c..624d5eb0ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -398,9 +398,15 @@ importers: '@electron-forge/cli': specifier: ^7.11.1 version: 7.11.1(encoding@0.1.13)(esbuild@0.25.12) + '@electron-forge/maker-deb': + specifier: ^7.11.1 + version: 7.11.2 '@electron-forge/maker-dmg': specifier: ^7.11.1 version: 7.11.1 + '@electron-forge/maker-rpm': + specifier: ^7.11.1 + version: 7.11.2 '@electron-forge/maker-squirrel': specifier: ^7.11.1 version: 7.11.1 @@ -1796,10 +1802,22 @@ packages: resolution: {integrity: sha512-yhZrCGoN6bDeiB5DHFaueZ1h84AReElEj+f0hl2Ph4UbZnO0cnLpbx+Bs+XfMLAiA+beC8muB5UDK5ysfuT9BQ==} engines: {node: '>= 16.4.0'} + '@electron-forge/maker-base@7.11.2': + resolution: {integrity: sha512-9934zYu9WVdgCYQXvtS+eL1oyLagsY8JlWhZmoK8yWTYftSAydH7jb3seVpfy6n85SYmY/yjcAy2lvOTy5dUwA==} + engines: {node: '>= 16.4.0'} + + '@electron-forge/maker-deb@7.11.2': + resolution: {integrity: sha512-MYSdCTsqzKNmsmaq7CIFh2kJdBWUZ4njxnVGrIRClzueVITk5Kots3+eQo+e5QQLvXTVn2XTNDc2nYjvtBh+Mw==} + engines: {node: '>= 16.4.0'} + '@electron-forge/maker-dmg@7.11.1': resolution: {integrity: sha512-7zs5/Ewz1PcOl4N1102stFgBiFGWxU18+UPFUSd/fgf9MErBl4HBWuVNMIHyeJ/56rdfkcmTxTqE+9TBEYrZcg==} engines: {node: '>= 16.4.0'} + '@electron-forge/maker-rpm@7.11.2': + resolution: {integrity: sha512-BEj/DcW6bSpmOyKUa3UsOgT7Hm3ZuP0Wa6OuQEunjxeCWn7yoDTDtjuYA0xRvzk+T4NCyDO3RBGjy6nYNSPU2Q==} + engines: {node: '>= 16.4.0'} + '@electron-forge/maker-squirrel@7.11.1': resolution: {integrity: sha512-oSg7fgad6l+X0DjtRkSpMzB0AjzyDO4mb2gzM4kTodkP1ADeiMi08bxy0ZeCESqLm5+fG72cAPmEr3BAPvI1yw==} engines: {node: '>= 16.4.0'} @@ -1828,6 +1846,10 @@ packages: resolution: {integrity: sha512-vvBWdAEh53UJlDGUevpaJk1+sqDMQibfrbHR+0IPA4MPyQex7/Uhv3vYH9oGHujBVAChQahjAuJt0fG6IJBLZg==} engines: {node: '>= 16.4.0'} + '@electron-forge/shared-types@7.11.2': + resolution: {integrity: sha512-Tcles7y74xy3jN5dEC+Pt1duJYk4c7W2xu98tjWW8RewmfKD2uHkie6I1I3yifPFZXZ/QfTlaFOOoKIQ9ENZjg==} + engines: {node: '>= 16.4.0'} + '@electron-forge/template-base@7.11.1': resolution: {integrity: sha512-XpTaEf+EfQw+0BlSAtSpZKYIKYvKu4raNzSGHZZoSYHp+HDC7R+MlpFQmSJiGdYQzQ14C+uxO42tVjgM0DMbpw==} engines: {node: '>= 16.4.0'} @@ -1852,6 +1874,10 @@ packages: resolution: {integrity: sha512-tiB6cglVQFcSw9N8GRwVwZUeB9u0DOx2Mj7aFXBUsFLUYQapvVGv51tUSy/UAW5lvmubGscYIILuVko+II3+NA==} engines: {node: '>= 14.17.5'} + '@electron-forge/tracer@7.11.2': + resolution: {integrity: sha512-U8j5Hyj2Zt7I5PciJvPJfmEv69Gb/Da9v+k655z3Jj1cuY0UnToEJ61IhXrzlTYqo+jUKC+fgAjDJ6vltJTS0A==} + engines: {node: '>= 14.17.5'} + '@electron/asar@3.4.1': resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} engines: {node: '>=10.12.0'} @@ -3174,6 +3200,10 @@ packages: peerDependencies: '@inquirer/prompts': '>= 3 < 8' + '@malept/cross-spawn-promise@1.1.1': + resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} + engines: {node: '>= 10'} + '@malept/cross-spawn-promise@2.0.0': resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} engines: {node: '>= 12.13.0'} @@ -5366,6 +5396,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -6318,6 +6351,9 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -6894,11 +6930,27 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + electron-installer-common@0.10.4: + resolution: {integrity: sha512-8gMNPXfAqUE5CfXg8RL0vXpLE9HAaPkgLXVoHE3BMUzogMWenf4LmwQ27BdCUrEhkjrKl+igs2IHJibclR3z3Q==} + engines: {node: '>= 10.0.0'} + + electron-installer-debian@3.2.0: + resolution: {integrity: sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==} + engines: {node: '>= 10.0.0'} + os: [darwin, linux] + hasBin: true + electron-installer-dmg@5.0.1: resolution: {integrity: sha512-qOa1aAQdX57C+vzhDk3549dd/PRlNL4F8y736MTD1a43qptD+PvHY97Bo9gSf+OZ8iUWE7BrYSpk/FgLUe40EA==} engines: {node: '>= 16'} hasBin: true + electron-installer-redhat@3.4.0: + resolution: {integrity: sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==} + engines: {node: '>= 10.0.0'} + os: [darwin, linux] + hasBin: true + electron-log@5.4.3: resolution: {integrity: sha512-sOUsM3LjZdugatazSQ/XTyNcw8dfvH1SYhXWiJyfYodAAKOZdHs0txPiLDXFzOZbhXgAgshQkshH2ccq0feyLQ==} engines: {node: '>= 14'} @@ -7699,6 +7751,10 @@ packages: resolution: {integrity: sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==} engines: {node: '>= 12'} + gar@1.0.4: + resolution: {integrity: sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} @@ -7721,6 +7777,10 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} + get-folder-size@2.0.1: + resolution: {integrity: sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==} + hasBin: true + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -11313,6 +11373,9 @@ packages: throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + tiny-each-async@2.0.3: + resolution: {integrity: sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -11382,10 +11445,17 @@ packages: resolution: {integrity: sha512-nqpKFC53CgopKPjT6Wfb6tpIcZXHcI6G37hesvikhx0EmUGPkZrujRyAjgnmp1SHNgpQfKVanZ+KfpANFt2Hxw==} hasBin: true + tmp-promise@3.0.3: + resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -12150,6 +12220,10 @@ packages: wonka@6.3.5: resolution: {integrity: sha512-SSil+ecw6B4/Dm7Pf2sAshKQ5hWFvfyGlfPbEd6A14dOH6VDjrmbY86u6nZvy9omGwwIPFR8V41+of1EezgoUw==} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -12269,10 +12343,18 @@ packages: engines: {node: '>= 14.6'} hasBin: true + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -13542,6 +13624,25 @@ snapshots: - bluebird - supports-color + '@electron-forge/maker-base@7.11.2': + dependencies: + '@electron-forge/shared-types': 7.11.2 + fs-extra: 10.1.0 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + + '@electron-forge/maker-deb@7.11.2': + dependencies: + '@electron-forge/maker-base': 7.11.2 + '@electron-forge/shared-types': 7.11.2 + optionalDependencies: + electron-installer-debian: 3.2.0 + transitivePeerDependencies: + - bluebird + - supports-color + '@electron-forge/maker-dmg@7.11.1': dependencies: '@electron-forge/maker-base': 7.11.1 @@ -13553,6 +13654,16 @@ snapshots: - bluebird - supports-color + '@electron-forge/maker-rpm@7.11.2': + dependencies: + '@electron-forge/maker-base': 7.11.2 + '@electron-forge/shared-types': 7.11.2 + optionalDependencies: + electron-installer-redhat: 3.4.0 + transitivePeerDependencies: + - bluebird + - supports-color + '@electron-forge/maker-squirrel@7.11.1': dependencies: '@electron-forge/maker-base': 7.11.1 @@ -13629,6 +13740,16 @@ snapshots: - bluebird - supports-color + '@electron-forge/shared-types@7.11.2': + dependencies: + '@electron-forge/tracer': 7.11.2 + '@electron/packager': 18.4.4 + '@electron/rebuild': 3.7.2 + listr2: 7.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + '@electron-forge/template-base@7.11.1': dependencies: '@electron-forge/core-utils': 7.11.1 @@ -13688,6 +13809,10 @@ snapshots: dependencies: chrome-trace-event: 1.0.4 + '@electron-forge/tracer@7.11.2': + dependencies: + chrome-trace-event: 1.0.4 + '@electron/asar@3.4.1': dependencies: commander: 5.1.0 @@ -15236,6 +15361,11 @@ snapshots: '@inquirer/prompts': 6.0.1 '@inquirer/type': 1.5.5 + '@malept/cross-spawn-promise@1.1.1': + dependencies: + cross-spawn: 7.0.6 + optional: true + '@malept/cross-spawn-promise@2.0.0': dependencies: cross-spawn: 7.0.6 @@ -17551,6 +17681,11 @@ snapshots: '@types/estree@1.0.8': {} + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 24.12.0 + optional: true + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 24.12.0 @@ -18698,6 +18833,13 @@ snapshots: client-only@0.0.1: {} + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + optional: true + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -19156,6 +19298,37 @@ snapshots: ee-first@1.1.1: {} + electron-installer-common@0.10.4: + dependencies: + '@electron/asar': 3.4.1 + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.3 + fs-extra: 9.1.0 + glob: 7.2.3 + lodash: 4.17.23 + parse-author: 2.0.0 + semver: 7.7.3 + tmp-promise: 3.0.3 + optionalDependencies: + '@types/fs-extra': 9.0.13 + transitivePeerDependencies: + - supports-color + optional: true + + electron-installer-debian@3.2.0: + dependencies: + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.3 + electron-installer-common: 0.10.4 + fs-extra: 9.1.0 + get-folder-size: 2.0.1 + lodash: 4.17.23 + word-wrap: 1.2.5 + yargs: 16.2.0 + transitivePeerDependencies: + - supports-color + optional: true + electron-installer-dmg@5.0.1: dependencies: '@types/appdmg': 0.5.5 @@ -19167,6 +19340,19 @@ snapshots: - supports-color optional: true + electron-installer-redhat@3.4.0: + dependencies: + '@malept/cross-spawn-promise': 1.1.1 + debug: 4.4.3 + electron-installer-common: 0.10.4 + fs-extra: 9.1.0 + lodash: 4.17.23 + word-wrap: 1.2.5 + yargs: 16.2.0 + transitivePeerDependencies: + - supports-color + optional: true + electron-log@5.4.3: {} electron-store@11.0.2: @@ -20148,6 +20334,9 @@ snapshots: transitivePeerDependencies: - supports-color + gar@1.0.4: + optional: true + generate-function@2.3.1: dependencies: is-property: 1.0.2 @@ -20166,6 +20355,12 @@ snapshots: get-east-asian-width@1.4.0: {} + get-folder-size@2.0.1: + dependencies: + gar: 1.0.4 + tiny-each-async: 2.0.3 + optional: true + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -24540,6 +24735,9 @@ snapshots: throat@5.0.0: {} + tiny-each-async@2.0.3: + optional: true + tiny-invariant@1.3.3: {} tiny-lru@11.4.7: {} @@ -24587,10 +24785,18 @@ snapshots: dependencies: tldts-core: 7.0.22 + tmp-promise@3.0.3: + dependencies: + tmp: 0.2.5 + optional: true + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 + tmp@0.2.5: + optional: true + tmpl@1.0.5: {} tn1150@0.1.0: @@ -25375,6 +25581,9 @@ snapshots: wonka@6.3.5: {} + word-wrap@1.2.5: + optional: true + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -25461,8 +25670,22 @@ snapshots: yaml@2.8.2: {} + yargs-parser@20.2.9: + optional: true + yargs-parser@21.1.1: {} + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + optional: true + yargs@17.7.2: dependencies: cliui: 8.0.1 From ce944056d9ba7db8c3a63badf8ed8a97f6f32e45 Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi <3247106+gantoine@users.noreply.github.com> Date: Thu, 4 Jun 2026 15:37:15 -0400 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- apps/code/forge.config.ts | 4 ++-- apps/code/scripts/build-linux-docker.sh | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/code/forge.config.ts b/apps/code/forge.config.ts index 8955729cab..52f4bafa34 100644 --- a/apps/code/forge.config.ts +++ b/apps/code/forge.config.ts @@ -214,7 +214,7 @@ const config: ForgeConfig = { productName: "PostHog Code", genericName: "Code Editor", description: "PostHog Code desktop app", - bin: "PostHog Code", + bin: "posthog-code", icon: "./build/app-icon.png", categories: ["Development"], section: "devel", @@ -229,7 +229,7 @@ const config: ForgeConfig = { productName: "PostHog Code", genericName: "Code Editor", description: "PostHog Code desktop app", - bin: "PostHog Code", + bin: "posthog-code", license: "MIT", icon: "./build/app-icon.png", categories: ["Development"], diff --git a/apps/code/scripts/build-linux-docker.sh b/apps/code/scripts/build-linux-docker.sh index 19e51fa9b5..263c49593e 100755 --- a/apps/code/scripts/build-linux-docker.sh +++ b/apps/code/scripts/build-linux-docker.sh @@ -14,7 +14,9 @@ esac RAW_TARGETS="${TARGETS:-}" while [ $# -gt 0 ]; do case "$1" in - --target|--targets) RAW_TARGETS="${RAW_TARGETS:+$RAW_TARGETS,}$2"; shift 2 ;; + --target|--targets) + [ -n "${2-}" ] || { echo "Missing value for $1" >&2; exit 1; } + RAW_TARGETS="${RAW_TARGETS:+$RAW_TARGETS,}$2"; shift 2 ;; --target=*|--targets=*) RAW_TARGETS="${RAW_TARGETS:+$RAW_TARGETS,}${1#*=}"; shift ;; *) echo "Unknown argument: $1" >&2; exit 1 ;; esac From f6959b723f4d00d0e61b32e8f06d8b7d837b193b Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Thu, 4 Jun 2026 15:41:01 -0400 Subject: [PATCH 3/3] refactor(packaging): extract shared Linux maker options Co-Authored-By: Claude Opus 4.8 (1M context) --- apps/code/forge.config.ts | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/apps/code/forge.config.ts b/apps/code/forge.config.ts index 52f4bafa34..9042d2d52c 100644 --- a/apps/code/forge.config.ts +++ b/apps/code/forge.config.ts @@ -145,6 +145,18 @@ function copySync(dependency: string, destinationRoot: string, source: string) { const hasAssetsCar = existsSync("build/Assets.car"); +const sharedLinuxOptions = { + name: "posthog-code", + productName: "PostHog Code", + genericName: "Code Editor", + description: "PostHog Code desktop app", + bin: "posthog-code", + icon: "./build/app-icon.png", + categories: ["Development"], + homepage: "https://github.com/PostHog/code", + mimeType: ["x-scheme-handler/posthog-code"], +}; + const config: ForgeConfig = { packagerConfig: { asar: { @@ -210,31 +222,15 @@ const config: ForgeConfig = { }), new MakerDeb({ options: { - name: "posthog-code", - productName: "PostHog Code", - genericName: "Code Editor", - description: "PostHog Code desktop app", - bin: "posthog-code", - icon: "./build/app-icon.png", - categories: ["Development"], + ...sharedLinuxOptions, section: "devel", maintainer: "PostHog ", - homepage: "https://github.com/PostHog/code", - mimeType: ["x-scheme-handler/posthog-code"], }, }), new MakerRpm({ options: { - name: "posthog-code", - productName: "PostHog Code", - genericName: "Code Editor", - description: "PostHog Code desktop app", - bin: "posthog-code", + ...sharedLinuxOptions, license: "MIT", - icon: "./build/app-icon.png", - categories: ["Development"], - homepage: "https://github.com/PostHog/code", - mimeType: ["x-scheme-handler/posthog-code"], }, }), new MakerZIP({}, ["darwin", "linux"]),