From 83b8b66fe7b9db206c1d0e0278bf4c183dd9c7f9 Mon Sep 17 00:00:00 2001 From: OmikronApex Date: Fri, 10 Jul 2026 15:04:31 +0200 Subject: [PATCH 1/3] =?UTF-8?q?fix(ci):=20rename=20entitlements=20file=20?= =?UTF-8?q?=E2=80=94=20vpk=20requires=20.entitlements=20extension?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nightly run 29093119570 failed: --signEntitlements does not have an .entitlements extension vpk validates the file extension. Rename resources/entitlements.mac.plist -> entitlements.mac.entitlements and update all references (electron-builder config, sign-macos-binaries.sh, both workflows). Content unchanged; codesign/electron-builder accept any extension. Co-Authored-By: Claude Fable 5 --- .github/workflows/build.yml | 2 +- .github/workflows/nightly.yml | 2 +- package.json | 4 ++-- .../{entitlements.mac.plist => entitlements.mac.entitlements} | 0 scripts/sign-macos-binaries.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename resources/{entitlements.mac.plist => entitlements.mac.entitlements} (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 588bfbe..597a05d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -449,7 +449,7 @@ jobs: --mainExe "$mainexe" \ -o release/velopack \ --signAppIdentity "$APPLE_SIGNING_IDENTITY" \ - --signEntitlements "$PWD/resources/entitlements.mac.plist" \ + --signEntitlements "$PWD/resources/entitlements.mac.entitlements" \ --notaryProfile "velopack-notary" fi diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 999243b..561ccf5 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -304,7 +304,7 @@ jobs: --mainExe "$mainexe" \ -o release/velopack \ --signAppIdentity "$APPLE_SIGNING_IDENTITY" \ - --signEntitlements "$PWD/resources/entitlements.mac.plist" \ + --signEntitlements "$PWD/resources/entitlements.mac.entitlements" \ --notaryProfile "velopack-notary" fi diff --git a/package.json b/package.json index c60a750..83bac93 100644 --- a/package.json +++ b/package.json @@ -111,8 +111,8 @@ "icon": "resources/icons/icon.icns", "hardenedRuntime": true, "gatekeeperAssess": false, - "entitlements": "resources/entitlements.mac.plist", - "entitlementsInherit": "resources/entitlements.mac.plist", + "entitlements": "resources/entitlements.mac.entitlements", + "entitlementsInherit": "resources/entitlements.mac.entitlements", "notarize": true, "extendInfo": { "NSMicrophoneUsageDescription": "fee[dB]ack needs microphone access for guitar input and note detection." diff --git a/resources/entitlements.mac.plist b/resources/entitlements.mac.entitlements similarity index 100% rename from resources/entitlements.mac.plist rename to resources/entitlements.mac.entitlements diff --git a/scripts/sign-macos-binaries.sh b/scripts/sign-macos-binaries.sh index f8a368e..b537ef1 100755 --- a/scripts/sign-macos-binaries.sh +++ b/scripts/sign-macos-binaries.sh @@ -29,7 +29,7 @@ fi SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" -ENTITLEMENTS="$PROJECT_DIR/resources/entitlements.mac.plist" +ENTITLEMENTS="$PROJECT_DIR/resources/entitlements.mac.entitlements" if [[ ! -f "$ENTITLEMENTS" ]]; then echo "[sign-macos] entitlements file missing: $ENTITLEMENTS" >&2 From add4facb85d64f79e4a5dc951a75d70951ce60fd Mon Sep 17 00:00:00 2001 From: OmikronApex Date: Fri, 10 Jul 2026 16:22:05 +0200 Subject: [PATCH 2/3] fix(bundle): copy all top-level core .py modules, not just server.py Core added appstate.py (core#833); bundle-slopsmith.sh's whitelist only copied server.py, so packaged builds crashed on startup with ModuleNotFoundError: No module named 'appstate'. Glob top-level *.py so future sibling modules can't repeat this. Co-Authored-By: Claude Fable 5 --- scripts/bundle-slopsmith.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/bundle-slopsmith.sh b/scripts/bundle-slopsmith.sh index 97b8887..e383528 100755 --- a/scripts/bundle-slopsmith.sh +++ b/scripts/bundle-slopsmith.sh @@ -47,8 +47,11 @@ echo " Source: $SLOPSMITH_DIR" rm -rf "$BUNDLE_DIR" mkdir -p "$BUNDLE_DIR/static" "$BUNDLE_DIR/plugins" -# Server + lib -cp "$SLOPSMITH_DIR/server.py" "$BUNDLE_DIR/" +# Server + lib. Copy ALL top-level .py modules, not just server.py — core +# grows sibling modules (e.g. appstate.py, added in core#833) and a stale +# whitelist here ships a server.py whose imports are missing, crashing the +# packaged backend with ModuleNotFoundError on startup. +cp "$SLOPSMITH_DIR"/*.py "$BUNDLE_DIR/" cp "$SLOPSMITH_DIR/VERSION" "$BUNDLE_DIR/" cp -r "$SLOPSMITH_DIR/lib" "$BUNDLE_DIR/" rm -rf "$BUNDLE_DIR/lib/__pycache__" From 09617aa417c67bd88ec9b6822fc3ee37f9a639cc Mon Sep 17 00:00:00 2001 From: OmikronApex Date: Fri, 10 Jul 2026 16:47:32 +0200 Subject: [PATCH 3/3] fix(bundle): copy all top-level core python packages (routers/ etc.) core#834 extracted routes into a new top-level routers/ package; the bundle script only copied lib/, so the packaged backend would die with ModuleNotFoundError: No module named 'routers'. Copy every top-level package (dir with __init__.py) except plugins/ (bundled selectively below) and tests/ (never ships), so the ongoing R3 extraction series can't keep breaking packaged builds. Co-Authored-By: Claude Fable 5 --- scripts/bundle-slopsmith.sh | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/scripts/bundle-slopsmith.sh b/scripts/bundle-slopsmith.sh index e383528..38255ea 100755 --- a/scripts/bundle-slopsmith.sh +++ b/scripts/bundle-slopsmith.sh @@ -53,8 +53,20 @@ mkdir -p "$BUNDLE_DIR/static" "$BUNDLE_DIR/plugins" # packaged backend with ModuleNotFoundError on startup. cp "$SLOPSMITH_DIR"/*.py "$BUNDLE_DIR/" cp "$SLOPSMITH_DIR/VERSION" "$BUNDLE_DIR/" +# Copy every top-level python package (dir with __init__.py), not a hardcoded +# list — core's R3 refactor keeps adding packages (routers/ in core#834, lib +# extractions in #830/#831) and each miss ships a backend that dies on import. +# plugins/ is bundled selectively further down; tests/ must never ship. +for pkg in "$SLOPSMITH_DIR"/*/__init__.py; do + [ -f "$pkg" ] || continue + pkg_dir="$(dirname "$pkg")" + case "$(basename "$pkg_dir")" in + plugins|tests) continue ;; + esac + cp -r "$pkg_dir" "$BUNDLE_DIR/" +done cp -r "$SLOPSMITH_DIR/lib" "$BUNDLE_DIR/" -rm -rf "$BUNDLE_DIR/lib/__pycache__" +find "$BUNDLE_DIR" -type d -name '__pycache__' -prune -exec rm -rf {} + # Bundled content (progression paths, quests, shop definitions) [ -d "$SLOPSMITH_DIR/data" ] && cp -r "$SLOPSMITH_DIR/data" "$BUNDLE_DIR/"