diff --git a/.DS_Store b/.DS_Store index 1ad06f76..7a04f4bd 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.github/workflows/build-macos-app.yml b/.github/workflows/build-macos-app.yml index 3e3d6555..9ac1448d 100644 --- a/.github/workflows/build-macos-app.yml +++ b/.github/workflows/build-macos-app.yml @@ -6,7 +6,7 @@ on: - 'v*' # Trigger on version tags branches: - main # Also build on main branch for testing - - app-staging # Add app-staging for testing + - python-modules # Add app-staging for testing pull_request: branches: - staging # Test builds on PRs to staging @@ -41,18 +41,12 @@ jobs: uv python install uv sync --locked --all-extras - - name: Install Python Bindings - run: | - uv pip install dist/exo_pyo3_bindings-*.whl - - name: Verify Python Environment run: | - uv run python -c "import exo_pyo3_bindings; print('Python bindings installed successfully')" uv run python -c "import master.main; print('Master module available')" uv run python -c "import worker.main; print('Worker module available')" - name: Prepare Code Signing Keychain - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') env: MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }} MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} @@ -79,35 +73,23 @@ jobs: cd app/exov2 sudo xcode-select -s /Applications/Xcode.app/Contents/Developer - if [[ "${{ github.event_name }}" == "push" && "${{ github.ref }}" == refs/tags/v* ]]; then - # Release build with code signing - security unlock-keychain -p "$MACOS_CERTIFICATE_PASSWORD" exov2.keychain - SIGNING_IDENTITY=$(security find-identity -v -p codesigning | awk -F '"' '{print $2}') - - xcodebuild clean build \ - -project exov2.xcodeproj \ - -scheme exov2 \ - -configuration Release \ - -derivedDataPath build \ - CODE_SIGNING_IDENTITY="$SIGNING_IDENTITY" \ - PROVISIONING_PROFILE_SPECIFIER="Exo Provisioning Profile" \ - CODE_SIGN_INJECT_BASE_ENTITLEMENTS=YES \ - OTHER_CODE_SIGN_FLAGS="--timestamp" - else - # Debug build without code signing for testing - xcodebuild clean build \ - -project exov2.xcodeproj \ - -scheme exov2 \ - -configuration Debug \ - -derivedDataPath build \ - CODE_SIGN_IDENTITY="" \ - CODE_SIGNING_REQUIRED=NO - fi + # Release build with code signing + security unlock-keychain -p "$MACOS_CERTIFICATE_PASSWORD" exov2.keychain + SIGNING_IDENTITY=$(security find-identity -v -p codesigning | awk -F '"' '{print $2}') + + xcodebuild clean build \ + -project exov2.xcodeproj \ + -scheme exov2 \ + -configuration Release \ + -derivedDataPath build \ + CODE_SIGNING_IDENTITY="$SIGNING_IDENTITY" \ + PROVISIONING_PROFILE_SPECIFIER="Exo Provisioning Profile" \ + CODE_SIGN_INJECT_BASE_ENTITLEMENTS=YES \ + OTHER_CODE_SIGN_FLAGS="--timestamp" - mv build/Build/Products/*/exov2.app ../../ + mv build/Build/Products/*/EXO.app ../../ - - name: Sign and Create DMG (Release only) - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + - name: Sign, Notarize, and Create DMG env: APPLE_NOTARIZATION_USERNAME: ${{ secrets.APPLE_NOTARIZATION_USERNAME }} APPLE_NOTARIZATION_PASSWORD: ${{ secrets.APPLE_NOTARIZATION_PASSWORD }} @@ -119,21 +101,21 @@ jobs: # Sign the app /usr/bin/codesign --deep --force --timestamp --options runtime \ - --sign "$SIGNING_IDENTITY" exov2.app + --sign "$SIGNING_IDENTITY" EXO.app # Verify the signing - codesign -dvv exov2.app + codesign -dvv EXO.app # Create DMG mkdir -p tmp/dmg-contents - cp -r ./exov2.app tmp/dmg-contents/ + cp -r ./EXO.app tmp/dmg-contents/ ln -s /Applications tmp/dmg-contents/Applications - VERSION=$(git describe --tags --abbrev=0 | sed 's/^v//') + DMG_NAME="exo.dmg" # Create and sign DMG - hdiutil create -volname "Exo" -srcfolder tmp/dmg-contents -ov -format UDZO exov2-${VERSION}.dmg + hdiutil create -volname "Exo" -srcfolder tmp/dmg-contents -ov -format UDZO "$DMG_NAME" /usr/bin/codesign --deep --force --timestamp --options runtime \ - --sign "$SIGNING_IDENTITY" exov2-${VERSION}.dmg + --sign "$SIGNING_IDENTITY" "$DMG_NAME" # Setup notarization credentials (optional - comment out if no notarization secrets) if [[ -n "$APPLE_NOTARIZATION_USERNAME" ]]; then @@ -146,24 +128,14 @@ jobs: xcrun notarytool submit --wait \ --team-id "$APPLE_NOTARIZATION_TEAM" \ --keychain-profile notary_pass \ - exov2-${VERSION}.dmg + "$DMG_NAME" # Staple the notarization - xcrun stapler staple exov2-${VERSION}.dmg + xcrun stapler staple "$DMG_NAME" fi - - name: Create DMG (Debug builds) - if: github.event_name != 'push' || !startsWith(github.ref, 'refs/tags/v') - run: | - mkdir -p tmp/dmg-contents - cp -r ./exov2.app tmp/dmg-contents/ - ln -s /Applications tmp/dmg-contents/Applications - VERSION=$(git rev-parse --short HEAD) - - hdiutil create -volname "Exo Debug" -srcfolder tmp/dmg-contents -ov -format UDZO exov2-debug-${VERSION}.dmg - - name: Cleanup Keychain - if: always() && github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') + if: always() run: | security default-keychain -s login.keychain security delete-keychain exov2.keychain @@ -171,11 +143,11 @@ jobs: - name: Upload DMG file uses: actions/upload-artifact@v4 with: - name: exov2-dmg - path: exov2*.dmg + name: exo-dmg + path: exo.dmg - name: Upload App Bundle uses: actions/upload-artifact@v4 with: name: exov2-app - path: exov2.app/ \ No newline at end of file + path: EXO.app/ \ No newline at end of file diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 00000000..7a8425e4 Binary files /dev/null and b/app/.DS_Store differ diff --git a/app/exov2/.DS_Store b/app/exov2/.DS_Store index 31bdd033..facf32c2 100644 Binary files a/app/exov2/.DS_Store and b/app/exov2/.DS_Store differ diff --git a/app/exov2/exov2.xcodeproj/project.pbxproj b/app/exov2/exov2.xcodeproj/project.pbxproj index a4e54fad..432b0c1e 100644 --- a/app/exov2/exov2.xcodeproj/project.pbxproj +++ b/app/exov2/exov2.xcodeproj/project.pbxproj @@ -24,7 +24,7 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - E07D64BA2E36127E009BFB4D /* exov2.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = exov2.app; sourceTree = BUILT_PRODUCTS_DIR; }; + E07D64BA2E36127E009BFB4D /* EXO.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = EXO.app; sourceTree = BUILT_PRODUCTS_DIR; }; E07D64CB2E36127F009BFB4D /* exov2Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = exov2Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; E07D64D52E36127F009BFB4D /* exov2UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = exov2UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -85,7 +85,7 @@ E07D64BB2E36127E009BFB4D /* Products */ = { isa = PBXGroup; children = ( - E07D64BA2E36127E009BFB4D /* exov2.app */, + E07D64BA2E36127E009BFB4D /* EXO.app */, E07D64CB2E36127F009BFB4D /* exov2Tests.xctest */, E07D64D52E36127F009BFB4D /* exov2UITests.xctest */, ); @@ -114,7 +114,7 @@ packageProductDependencies = ( ); productName = exov2; - productReference = E07D64BA2E36127E009BFB4D /* exov2.app */; + productReference = E07D64BA2E36127E009BFB4D /* EXO.app */; productType = "com.apple.product-type.application"; }; E07D64CA2E36127F009BFB4D /* exov2Tests */ = { @@ -399,6 +399,7 @@ DEVELOPMENT_ASSET_PATHS = "\"exov2/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = EXO; INFOPLIST_KEY_LSUIElement = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( @@ -407,7 +408,7 @@ ); MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = exolabs.exov2; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = EXO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; }; @@ -425,6 +426,7 @@ DEVELOPMENT_ASSET_PATHS = "\"exov2/Preview Content\""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = EXO; INFOPLIST_KEY_LSUIElement = YES; INFOPLIST_KEY_NSHumanReadableCopyright = ""; LD_RUNPATH_SEARCH_PATHS = ( @@ -433,7 +435,7 @@ ); MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = exolabs.exov2; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = EXO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; }; diff --git a/app/exov2/exov2.xcodeproj/project.xcworkspace/xcuserdata/samikhan.xcuserdatad/UserInterfaceState.xcuserstate b/app/exov2/exov2.xcodeproj/project.xcworkspace/xcuserdata/samikhan.xcuserdatad/UserInterfaceState.xcuserstate index 92fe6a19..aaaa2c4f 100644 Binary files a/app/exov2/exov2.xcodeproj/project.xcworkspace/xcuserdata/samikhan.xcuserdatad/UserInterfaceState.xcuserstate and b/app/exov2/exov2.xcodeproj/project.xcworkspace/xcuserdata/samikhan.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/app/exov2/exov2.xcodeproj/xcshareddata/xcschemes/exov2.xcscheme b/app/exov2/exov2.xcodeproj/xcshareddata/xcschemes/exov2.xcscheme index b6afb5a7..5d0981dc 100644 --- a/app/exov2/exov2.xcodeproj/xcshareddata/xcschemes/exov2.xcscheme +++ b/app/exov2/exov2.xcodeproj/xcshareddata/xcschemes/exov2.xcscheme @@ -16,7 +16,7 @@ @@ -69,7 +69,7 @@ @@ -93,7 +93,7 @@