diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a79331a..65c2f22 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,7 +60,7 @@ jobs: BUILD_DIR=build PKG_ROOT=$BUILD_DIR/pkg-root PACKAGING_DIR=packaging - APP_PATH="$PKG_ROOT/Applications/Utilities/BootstrapMate.app" + APP_PATH="$PKG_ROOT/Applications/Utilities/Managed Bootstrap Install.app" # Create app bundle mkdir -p "$APP_PATH/Contents/MacOS" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6f2bc5c..7e92b74 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -78,7 +78,7 @@ jobs: PACKAGING_DIR=packaging SWIFT_REL=.build/apple/Products/Release ACTOOL_OUT="$BUILD_DIR/actool-out" - APP="$PKG_ROOT/Applications/Utilities/BootstrapMate.app" + APP="$PKG_ROOT/Applications/Utilities/Managed Bootstrap Install.app" APP_MACOS="$APP/Contents/MacOS" APP_RES="$APP/Contents/Resources" APP_HELPER_LD="$APP/Contents/Library/LaunchDaemons" diff --git a/Makefile b/Makefile index 7205e53..b642882 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ BINARY_NAME = managedbootstrapinstall GUI_BINARY_NAME = BootstrapMateGUI HELPER_BINARY_NAME = BootstrapMateHelper BINARY_INSTALL_PATH = usr/local/bootstrapmate -APP_BUNDLE_PATH = Applications/Utilities/BootstrapMate.app +APP_BUNDLE_PATH = Applications/Utilities/Managed Bootstrap Install.app APP_MACOS_DIR = $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/MacOS APP_RESOURCES_DIR = $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Resources APP_HELPER_LD_DIR = $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Library/LaunchDaemons @@ -126,7 +126,7 @@ swift-build: copy-binary: swift-build @echo "$(BLUE)Signing and copying binaries to app bundle...$(NC)" - @mkdir -p $(APP_MACOS_DIR) + @mkdir -p "$(APP_MACOS_DIR)" # Sign the CLI binary with hardened runtime before packaging @codesign --force --sign "$(SIGNING_IDENTITY_APP)" \ @@ -150,12 +150,12 @@ copy-binary: swift-build $(SWIFT_HELPER_BINARY) # Copy all binaries to app bundle MacOS directory - @cp $(SWIFT_BINARY) $(APP_MACOS_DIR)/$(BINARY_NAME) - @chmod 755 $(APP_MACOS_DIR)/$(BINARY_NAME) - @cp $(SWIFT_GUI_BINARY) $(APP_MACOS_DIR)/$(GUI_BINARY_NAME) - @chmod 755 $(APP_MACOS_DIR)/$(GUI_BINARY_NAME) - @cp $(SWIFT_HELPER_BINARY) $(APP_MACOS_DIR)/$(HELPER_BINARY_NAME) - @chmod 755 $(APP_MACOS_DIR)/$(HELPER_BINARY_NAME) + @cp $(SWIFT_BINARY) "$(APP_MACOS_DIR)/$(BINARY_NAME)" + @chmod 755 "$(APP_MACOS_DIR)/$(BINARY_NAME)" + @cp $(SWIFT_GUI_BINARY) "$(APP_MACOS_DIR)/$(GUI_BINARY_NAME)" + @chmod 755 "$(APP_MACOS_DIR)/$(GUI_BINARY_NAME)" + @cp $(SWIFT_HELPER_BINARY) "$(APP_MACOS_DIR)/$(HELPER_BINARY_NAME)" + @chmod 755 "$(APP_MACOS_DIR)/$(HELPER_BINARY_NAME)" # Create placeholder for symlink directory @mkdir -p $(PKG_ROOT)/$(BINARY_INSTALL_PATH) @@ -177,19 +177,19 @@ compile-icon: create-app-bundle: copy-binary compile-icon @echo "$(BLUE)Creating app bundle...$(NC)" - @mkdir -p $(APP_RESOURCES_DIR) - @rm -rf $(APP_RESOURCES_DIR)/* - + @mkdir -p "$(APP_RESOURCES_DIR)" + @rm -rf "$(APP_RESOURCES_DIR)"/* + # Copy Info.plist template and substitute version placeholders @sed -e 's/{{MARKETING_VERSION}}/$(MARKETING_VERSION)/g' \ -e 's/{{BUILD_NUMBER}}/$(BUILD_NUMBER)/g' \ - $(PACKAGING_DIR)/resources/Info.plist.template > $(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Info.plist - + $(PACKAGING_DIR)/resources/Info.plist.template > "$(PKG_ROOT)/$(APP_BUNDLE_PATH)/Contents/Info.plist" + # Copy compiled Assets.car (contains Liquid Glass icon for macOS 26+) - @cp $(ACTOOL_OUT)/Assets.car $(APP_RESOURCES_DIR)/Assets.car - + @cp $(ACTOOL_OUT)/Assets.car "$(APP_RESOURCES_DIR)/Assets.car" + # Copy .icns fallback (macOS 13–25) - composited by actool, not a raw layer PNG - @cp $(ACTOOL_OUT)/$(ICON_NAME).icns $(APP_RESOURCES_DIR)/$(ICON_NAME).icns + @cp $(ACTOOL_OUT)/$(ICON_NAME).icns "$(APP_RESOURCES_DIR)/$(ICON_NAME).icns" @echo "$(GREEN)✓ App bundle created$(NC)" @@ -197,9 +197,9 @@ create-launchdaemon: create-app-bundle @echo "$(BLUE)Copying LaunchDaemon plists...$(NC)" @mkdir -p $(PKG_ROOT)/Library/LaunchDaemons @mkdir -p $(SCRIPTS_DIR) - @mkdir -p $(APP_HELPER_LD_DIR) + @mkdir -p "$(APP_HELPER_LD_DIR)" @cp $(PACKAGING_DIR)/LaunchDaemons/com.github.bootstrapmate.plist $(PKG_ROOT)/Library/LaunchDaemons/ - @cp $(PACKAGING_DIR)/LaunchDaemons/com.github.bootstrapmate.helper.plist $(APP_HELPER_LD_DIR)/ + @cp $(PACKAGING_DIR)/LaunchDaemons/com.github.bootstrapmate.helper.plist "$(APP_HELPER_LD_DIR)/" @cp $(PACKAGING_DIR)/scripts/postinstall $(SCRIPTS_DIR)/ @chmod +x $(SCRIPTS_DIR)/postinstall @echo "$(GREEN)✓ LaunchDaemon plists and scripts copied$(NC)" @@ -210,7 +210,7 @@ sign-app: create-launchdaemon --options runtime \ --timestamp \ --deep \ - $(PKG_ROOT)/$(APP_BUNDLE_PATH) + "$(PKG_ROOT)/$(APP_BUNDLE_PATH)" @echo "$(GREEN)✓ App bundle signed$(NC)" build-pkg: sign-app diff --git a/Sources/app/Views/RunView.swift b/Sources/app/Views/RunView.swift index 2151bf9..963f94c 100644 --- a/Sources/app/Views/RunView.swift +++ b/Sources/app/Views/RunView.swift @@ -67,7 +67,7 @@ struct RunView: View { Button { startRun() } label: { - Label("Run BootstrapMate", systemImage: "play.fill") + Label("Run Managed Bootstrap Install", systemImage: "play.fill") } .buttonStyle(.glassProminent) .tint(.green) @@ -77,7 +77,7 @@ struct RunView: View { Button { startRun() } label: { - Label("Run BootstrapMate", systemImage: "play.fill") + Label("Run Managed Bootstrap Install", systemImage: "play.fill") } .controlSize(.large) .disabled(xpcClient.helperStatus != .registered) diff --git a/Sources/app/Views/SettingsView.swift b/Sources/app/Views/SettingsView.swift index 77fd08c..cc5b21a 100644 --- a/Sources/app/Views/SettingsView.swift +++ b/Sources/app/Views/SettingsView.swift @@ -66,7 +66,7 @@ struct SettingsView: View { .aspectRatio(contentMode: .fit) .frame(width: 72, height: 72) - Text("BootstrapMate") + Text("Managed Bootstrap Install") .font(.largeTitle.bold()) Text("Enterprise management tools provisioning for automated device setup using manifests.") diff --git a/Sources/core/Utilities/BootstrapMateConstants.swift b/Sources/core/Utilities/BootstrapMateConstants.swift index a0902b3..73cb49b 100644 --- a/Sources/core/Utilities/BootstrapMateConstants.swift +++ b/Sources/core/Utilities/BootstrapMateConstants.swift @@ -2,7 +2,7 @@ import Foundation public enum BootstrapMateConstants { public static let daemonIdentifier = "com.github.bootstrapmate" - public static let executablePath = "/Applications/Utilities/BootstrapMate.app/Contents/MacOS/managedbootstrapinstall" + public static let executablePath = "/Applications/Utilities/Managed Bootstrap Install.app/Contents/MacOS/managedbootstrapinstall" public static let helperBundleID = "com.github.bootstrapmate.helper" public static let helperPlistName = "com.github.bootstrapmate.helper.plist" public static let defaultRetryCount = 3 diff --git a/packaging/LaunchDaemons/com.github.bootstrapmate.plist b/packaging/LaunchDaemons/com.github.bootstrapmate.plist index 07cfcee..22d4a1c 100644 --- a/packaging/LaunchDaemons/com.github.bootstrapmate.plist +++ b/packaging/LaunchDaemons/com.github.bootstrapmate.plist @@ -6,7 +6,7 @@ com.github.bootstrapmate ProgramArguments - /Applications/Utilities/BootstrapMate.app/Contents/MacOS/managedbootstrapinstall + /Applications/Utilities/Managed Bootstrap Install.app/Contents/MacOS/managedbootstrapinstall RunAtLoad diff --git a/packaging/resources/Info.plist.template b/packaging/resources/Info.plist.template index 46a456b..e2be4bd 100644 --- a/packaging/resources/Info.plist.template +++ b/packaging/resources/Info.plist.template @@ -7,7 +7,9 @@ CFBundleIdentifier com.github.bootstrapmate CFBundleName - BootstrapMate + Managed Bootstrap Install + CFBundleDisplayName + Managed Bootstrap Install CFBundleIconFile BootstrapMate CFBundleIconName diff --git a/packaging/scripts/postinstall b/packaging/scripts/postinstall index 0aeb733..7db560f 100755 --- a/packaging/scripts/postinstall +++ b/packaging/scripts/postinstall @@ -11,7 +11,8 @@ log() { log "=== BootstrapMate postinstall started ===" -APP_PATH="/Applications/Utilities/BootstrapMate.app" +APP_PATH="/Applications/Utilities/Managed Bootstrap Install.app" +LEGACY_APP_PATH="/Applications/Utilities/BootstrapMate.app" BINARY_PATH="${APP_PATH}/Contents/MacOS/managedbootstrapinstall" SYMLINK_DIR="/usr/local/bootstrapmate" SYMLINK_PATH="${SYMLINK_DIR}/managedbootstrapinstall" @@ -24,6 +25,13 @@ CACHE_DIR="${MANAGED_DIR}/cache" log "Creating directories..." +# Remove the pre-rename app bundle: the payload no longer covers the old path, +# so an upgrade would otherwise leave both apps in /Applications/Utilities +if [[ -d "${LEGACY_APP_PATH}" ]]; then + rm -rf "${LEGACY_APP_PATH}" + log "Removed legacy app bundle: ${LEGACY_APP_PATH}" +fi + # Create Managed Bootstrap directories FIRST (before daemon can start) mkdir -p "${LOG_DIR}" chmod 755 "${LOG_DIR}" @@ -37,7 +45,7 @@ if [[ -x "${BINARY_PATH}" ]]; then log "Binary found: ${BINARY_PATH}" # Get binary info - log "Binary architecture: $(file ${BINARY_PATH})" + log "Binary architecture: $(file "${BINARY_PATH}")" # Create symlink directory and symlink rm -f "${SYMLINK_DIR}/.placeholder" 2>/dev/null || true