From c63849502841c3678a369f4585083dfec5f46f30 Mon Sep 17 00:00:00 2001 From: wflixu Date: Sun, 5 Jul 2026 20:45:14 +0800 Subject: [PATCH 1/5] fix: add sandbox entitlement for FinderSyncExt and set icons for collapsed parent menus - Add com.apple.security.app-sandbox to FinderSyncExt entitlements so pkd can load the extension - Add ellipsis.circle icon for collapsed Actions parent menu item - Add square.and.arrow.up.on.square icon for collapsed Open With parent menu item Co-Authored-By: Claude --- FinderSyncExt/FinderSyncExt.entitlements | 2 ++ FinderSyncExt/FinderSyncExt.swift | 2 ++ 2 files changed, 4 insertions(+) diff --git a/FinderSyncExt/FinderSyncExt.entitlements b/FinderSyncExt/FinderSyncExt.entitlements index 7a99def..9818f2d 100644 --- a/FinderSyncExt/FinderSyncExt.entitlements +++ b/FinderSyncExt/FinderSyncExt.entitlements @@ -2,6 +2,8 @@ + com.apple.security.app-sandbox + com.apple.security.application-groups group.cn.wflixu.RClick diff --git a/FinderSyncExt/FinderSyncExt.swift b/FinderSyncExt/FinderSyncExt.swift index f1bb52d..da4e327 100644 --- a/FinderSyncExt/FinderSyncExt.swift +++ b/FinderSyncExt/FinderSyncExt.swift @@ -280,6 +280,7 @@ class FinderSyncExt: FIFinderSync, @unchecked Sendable { } let actionsItem = NSMenuItem(title: actionsTitle, action: nil, keyEquivalent: "") actionsItem.submenu = actionsSubMenu + actionsItem.image = templateSymbol("ellipsis.circle") menu.addItem(actionsItem) } else { // 不折叠:直接显示菜单项 @@ -310,6 +311,7 @@ class FinderSyncExt: FIFinderSync, @unchecked Sendable { } let appsItem = NSMenuItem(title: appsTitle, action: nil, keyEquivalent: "") appsItem.submenu = appsSubMenu + appsItem.image = templateSymbol("square.and.arrow.up.on.square") menu.addItem(appsItem) } else { // 不折叠:直接显示菜单项 From d6b21d44a3a7326993f55905f6c42a41c8374668 Mon Sep 17 00:00:00 2001 From: wflixu Date: Sun, 5 Jul 2026 20:52:15 +0800 Subject: [PATCH 2/5] chore: bump version to 2.0.4 (build 20260705001) Co-Authored-By: Claude --- RClick.xcodeproj/project.pbxproj | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/RClick.xcodeproj/project.pbxproj b/RClick.xcodeproj/project.pbxproj index fc532ad..aa327f6 100644 --- a/RClick.xcodeproj/project.pbxproj +++ b/RClick.xcodeproj/project.pbxproj @@ -552,7 +552,7 @@ CODE_SIGN_ENTITLEMENTS = RClick/RClickDebug.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 20260704002; + CURRENT_PROJECT_VERSION = 20260705001; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4L3563XCBN; ENABLE_APP_SANDBOX = YES; @@ -568,7 +568,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 15.6; - MARKETING_VERSION = 2.0.3; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = cn.wflixu.RClick; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -590,7 +590,7 @@ CODE_SIGN_ENTITLEMENTS = RClick/RClick.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 20260704002; + CURRENT_PROJECT_VERSION = 20260705001; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4L3563XCBN; ENABLE_APP_SANDBOX = YES; @@ -606,7 +606,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 15.6; - MARKETING_VERSION = 2.0.3; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = cn.wflixu.RClick; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -669,7 +669,7 @@ CODE_SIGN_ENTITLEMENTS = FinderSyncExt/FinderSyncExt.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 20260704002; + CURRENT_PROJECT_VERSION = 20260705001; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4L3563XCBN; ENABLE_APP_SANDBOX = YES; @@ -685,7 +685,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 15.6; - MARKETING_VERSION = 2.0.3; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = cn.wflixu.RClick.FinderSyncExt; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -704,7 +704,7 @@ CODE_SIGN_ENTITLEMENTS = FinderSyncExt/FinderSyncExt.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 20260704002; + CURRENT_PROJECT_VERSION = 20260705001; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4L3563XCBN; ENABLE_APP_SANDBOX = YES; @@ -720,7 +720,7 @@ "@executable_path/../../../../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 15.6; - MARKETING_VERSION = 2.0.3; + MARKETING_VERSION = 2.0.4; PRODUCT_BUNDLE_IDENTIFIER = cn.wflixu.RClick.FinderSyncExt; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; From 249124716bed831de9560a37e0c4fefd76f53c03 Mon Sep 17 00:00:00 2001 From: wflixu Date: Sun, 5 Jul 2026 21:04:54 +0800 Subject: [PATCH 3/5] fix: prevent nested .app in release zip caused by stale DMG temp copy Step 7 (DMG) created ./RClick.app but never cleaned it up. Step 8 (ZIP) then ran cp -R into the existing directory, nesting RClick.app inside RClick.app. Fix: - Clean up ./RClick.app after DMG creation (step 7) - Defensive rm -rf before cp in ZIP creation (step 8) Co-Authored-By: Claude --- .github/workflows/release.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5deab05..04c65f4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -216,6 +216,8 @@ jobs: codesign --force --sign "$CERT_NAME" "$DMG_NAME" + rm -rf "./${APP_NAME}.app" + echo "DMG_NAME=$DMG_NAME" >> $GITHUB_ENV # --- 7b. DMG 公证 --- @@ -255,7 +257,8 @@ jobs: VERSION=${{ steps.version.outputs.version }} ZIP_NAME="${APP_NAME}-v${VERSION}.app.zip" - # 复制到当前目录再压缩,保留 .app 层级 + # 先清理可能残留的临时目录,再复制(防御性,避免嵌套) + rm -rf "./${APP_NAME}.app" cp -R "$APP_PATH" "./${APP_NAME}.app" ditto -c -k --sequesterRsrc --keepParent "./${APP_NAME}.app" "$ZIP_NAME" rm -rf "./${APP_NAME}.app" From 7c7135436fdc16c350894eac95aad0a15e1331b3 Mon Sep 17 00:00:00 2001 From: wflixu Date: Sun, 5 Jul 2026 21:50:40 +0800 Subject: [PATCH 4/5] fix: isolate DMG and ZIP staging into separate subdirectories MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DMG uses dmg-staging/, ZIP uses zip-staging/ — no shared state, no risk of cross-contamination or nested .app bundles. Co-Authored-By: Claude --- .github/workflows/release.yml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04c65f4..2c61ba1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -201,7 +201,10 @@ jobs: VERSION=${{ steps.version.outputs.version }} DMG_NAME="${APP_NAME}-v${VERSION}.dmg" - cp -R "$APP_PATH" "./${APP_NAME}.app" + DMG_STAGING="dmg-staging" + rm -rf "$DMG_STAGING" + mkdir -p "$DMG_STAGING" + ditto "$APP_PATH" "$DMG_STAGING/${APP_NAME}.app" create-dmg \ --volname "${APP_NAME}" \ @@ -212,11 +215,11 @@ jobs: --hide-extension "${APP_NAME}.app" \ --app-drop-link 450 200 \ "$DMG_NAME" \ - "./${APP_NAME}.app" + "$DMG_STAGING/${APP_NAME}.app" codesign --force --sign "$CERT_NAME" "$DMG_NAME" - rm -rf "./${APP_NAME}.app" + rm -rf "$DMG_STAGING" echo "DMG_NAME=$DMG_NAME" >> $GITHUB_ENV @@ -257,11 +260,12 @@ jobs: VERSION=${{ steps.version.outputs.version }} ZIP_NAME="${APP_NAME}-v${VERSION}.app.zip" - # 先清理可能残留的临时目录,再复制(防御性,避免嵌套) - rm -rf "./${APP_NAME}.app" - cp -R "$APP_PATH" "./${APP_NAME}.app" - ditto -c -k --sequesterRsrc --keepParent "./${APP_NAME}.app" "$ZIP_NAME" - rm -rf "./${APP_NAME}.app" + ZIP_STAGING="zip-staging" + rm -rf "$ZIP_STAGING" + mkdir -p "$ZIP_STAGING" + ditto "$APP_PATH" "$ZIP_STAGING/${APP_NAME}.app" + ditto -c -k --sequesterRsrc --keepParent "$ZIP_STAGING/${APP_NAME}.app" "$ZIP_NAME" + rm -rf "$ZIP_STAGING" SHA256=$(shasum -a 256 "$ZIP_NAME" | awk '{print $1}') printf '%s %s\n' "$SHA256" "$ZIP_NAME" > "${ZIP_NAME}.sha256" From 9bb984a109767a44433ffab431fc155c49392b4d Mon Sep 17 00:00:00 2001 From: wflixu Date: Sun, 5 Jul 2026 21:54:46 +0800 Subject: [PATCH 5/5] chore: bump actions/checkout from v4 to v5 v4 uses deprecated Node.js 20 runtime. Co-Authored-By: Claude --- .github/workflows/pr-build.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index aaa20cb..9338fc5 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -16,7 +16,7 @@ jobs: runs-on: macos-latest steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Select Xcode run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2c61ba1..1ee1bfb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,7 @@ jobs: steps: # --- 0. 准备工作 --- - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Select Xcode run: |