From df4554fe1f9a0d3d4e43e2b21f454fb862a131c5 Mon Sep 17 00:00:00 2001 From: Tam Nhu Tran Date: Sun, 7 Jun 2026 15:52:03 -0400 Subject: [PATCH] feat(macos-bar): add ad-hoc packaging script + Info.plist package_app.sh assembles and signs CCS Bar.app (menu-bar-only via LSUIElement). Default ad-hoc signing for v1 with documented Gatekeeper guidance; developer-id mode wired for the notarized public-launch path. --- macos-bar/Resources/Info.plist | 26 ++++++++++++ macos-bar/Scripts/package_app.sh | 68 ++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 macos-bar/Resources/Info.plist create mode 100755 macos-bar/Scripts/package_app.sh diff --git a/macos-bar/Resources/Info.plist b/macos-bar/Resources/Info.plist new file mode 100644 index 00000000..73a77fb9 --- /dev/null +++ b/macos-bar/Resources/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleExecutable + CCSBar + CFBundleIdentifier + ca.kaitran.ccs.bar + CFBundleName + CCS Bar + CFBundleDisplayName + CCS Bar + CFBundlePackageType + APPL + CFBundleShortVersionString + __VERSION__ + CFBundleVersion + __VERSION__ + LSMinimumSystemVersion + 13.0 + LSUIElement + + NSHumanReadableCopyright + CCS Bar + + diff --git a/macos-bar/Scripts/package_app.sh b/macos-bar/Scripts/package_app.sh new file mode 100755 index 00000000..d03e701b --- /dev/null +++ b/macos-bar/Scripts/package_app.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash +# Assemble and sign "CCS Bar.app" from a release build. +# +# Signing mode (CCS_BAR_SIGNING): +# adhoc (default) ad-hoc sign with `codesign -s -`. Free, no Apple +# Developer account. Users open via right-click > Open or clear +# quarantine with `xattr -dr com.apple.quarantine`. +# developer-id Sign with a Developer ID Application identity (set +# CCS_BAR_SIGN_IDENTITY) for the notarized public-launch path. +# +# Usage: +# ./Scripts/package_app.sh [version] +# CCS_BAR_SIGNING=developer-id CCS_BAR_SIGN_IDENTITY="Developer ID Application: ..." ./Scripts/package_app.sh 0.1.0 +set -euo pipefail + +VERSION="${1:-0.0.0}" +SIGNING="${CCS_BAR_SIGNING:-adhoc}" +APP_NAME="CCS Bar" +EXEC_NAME="CCSBar" + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +DIST="$ROOT/dist" +APP="$DIST/$APP_NAME.app" + +echo "[i] Building release binary..." +( cd "$ROOT" && swift build -c release ) +BIN="$ROOT/.build/release/$EXEC_NAME" +if [[ ! -x "$BIN" ]]; then + echo "[X] Release binary not found at $BIN" >&2 + exit 1 +fi + +echo "[i] Assembling $APP_NAME.app (version $VERSION)..." +rm -rf "$APP" +mkdir -p "$APP/Contents/MacOS" "$APP/Contents/Resources" +cp "$BIN" "$APP/Contents/MacOS/$EXEC_NAME" +sed "s/__VERSION__/$VERSION/g" "$ROOT/Resources/Info.plist" > "$APP/Contents/Info.plist" + +echo "[i] Signing ($SIGNING)..." +case "$SIGNING" in + adhoc) + codesign --force --deep --sign - "$APP" + ;; + developer-id) + : "${CCS_BAR_SIGN_IDENTITY:?Set CCS_BAR_SIGN_IDENTITY for developer-id signing}" + codesign --force --deep --options runtime --timestamp \ + --sign "$CCS_BAR_SIGN_IDENTITY" "$APP" + echo "[i] Signed with Developer ID. Notarize before public distribution:" + echo " xcrun notarytool submit --keychain-profile --wait" + ;; + *) + echo "[X] Unknown CCS_BAR_SIGNING: $SIGNING (expected adhoc|developer-id)" >&2 + exit 1 + ;; +esac + +ZIP="$DIST/CCS-Bar.zip" +echo "[i] Zipping -> $ZIP" +rm -f "$ZIP" +( cd "$DIST" && ditto -c -k --keepParent "$APP_NAME.app" "CCS-Bar.zip" ) + +echo "[OK] Packaged: $APP" +echo "[OK] Asset: $ZIP" +if [[ "$SIGNING" == "adhoc" ]]; then + echo "[!] Ad-hoc build: first launch needs right-click > Open, or" + echo " xattr -dr com.apple.quarantine \"/Applications/$APP_NAME.app\"" +fi +echo "[i] To publish: gh release upload ccs-bar-latest \"$ZIP\" --clobber"