From f1f48e8ba2f676da15002939fee00cbe63f8e95a Mon Sep 17 00:00:00 2001 From: YE Date: Sat, 8 Aug 2026 00:30:46 +0900 Subject: [PATCH] release: v1.47.0 (build 100) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ships the helper-agent self-heal (#425), which missed the 1.46.0 cut by three commits. That is the most user-visible fix of the day and 1.46.0 does not have it: HelperAgentHealth.swift is on main but absent from the published 1.46.0 DMG. WHY IT MATTERS MORE THAN THE TELEMETRY FIXES IT TRAVELS WITH `yyh.CLI-Pulse.helper.agent` can be registered and still have never executed. Measured on a real machine: 22,138 consecutive failed spawns over ~11 days, while every signal the app used said healthy — SMAppService `.status` returned `.enabled`, `register()` returned without throwing, and `launchctl kickstart` exited 0 on a job that failed to exec milliseconds later. A dead helper means no provider data, which means CLI Pulse shows nothing at all. That is the first-value failure the v1.45 telemetry was built to measure, happening silently, to users who then have no reason to come back. ALSO IN THIS RELEASE (both already shipped in 1.46.0, restated for users who skip it): the disclosure card no longer claims statistics are being sent while local-only mode suppresses them (#419), and activation is no longer lost on the launch that shows the disclosure card (#418). DEVID + Homebrew only. iOS 1.45.0 is still WAITING_FOR_REVIEW and a second version cannot sit in review beside it; App Store submission stays the owner's call. swift test: 2678 passed, 0 failures, 4 skipped — including 27 helper-agent tests. Version drift gate passes (Apple 1.47.0 == Android 1.47.0, code 66). Co-Authored-By: Claude Opus 5 --- .../CLI Pulse Bar.xcodeproj/project.pbxproj | 48 +++++++++---------- android/app/build.gradle.kts | 4 +- release/whatsnew_147/en-US.txt | 5 ++ release/whatsnew_147/zh-Hans.txt | 5 ++ 4 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 release/whatsnew_147/en-US.txt create mode 100644 release/whatsnew_147/zh-Hans.txt diff --git a/CLI Pulse Bar/CLI Pulse Bar.xcodeproj/project.pbxproj b/CLI Pulse Bar/CLI Pulse Bar.xcodeproj/project.pbxproj index 9017bcd6..04740a4e 100644 --- a/CLI Pulse Bar/CLI Pulse Bar.xcodeproj/project.pbxproj +++ b/CLI Pulse Bar/CLI Pulse Bar.xcodeproj/project.pbxproj @@ -999,7 +999,7 @@ CODE_SIGN_ENTITLEMENTS = "CLI Pulse Bar/CLI_Pulse_Bar.entitlements"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; DEAD_CODE_STRIPPING = YES; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = "CLI Pulse Bar/Info.plist"; @@ -1007,7 +1007,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse"; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -1027,7 +1027,7 @@ CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_APP_SANDBOX = NO; @@ -1037,7 +1037,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = app.clipulse.qa.local; PRODUCT_NAME = "CLIPulse QA"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1055,7 +1055,7 @@ CODE_SIGN_ENTITLEMENTS = "CLI Pulse Bar/CLI_Pulse_Bar.entitlements"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; DEAD_CODE_STRIPPING = YES; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = "CLI Pulse Bar/Info.plist"; @@ -1063,7 +1063,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse"; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -1079,7 +1079,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "CLI Pulse Bar iOS/CLI_Pulse_iOS.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = "CLI Pulse Bar iOS/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 17.0; @@ -1087,7 +1087,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse"; PRODUCT_NAME = "CLI Pulse"; SDKROOT = iphoneos; @@ -1106,7 +1106,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "CLI Pulse Bar iOS/CLI_Pulse_iOS.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = "CLI Pulse Bar iOS/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 17.0; @@ -1114,7 +1114,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse"; PRODUCT_NAME = "CLI Pulse"; SDKROOT = iphoneos; @@ -1134,14 +1134,14 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "CLI Pulse Bar Watch/CLI_Pulse_Watch.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = "CLI Pulse Bar Watch/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse.watchkitapp"; PRODUCT_NAME = "CLI Pulse Watch"; SDKROOT = watchos; @@ -1161,14 +1161,14 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = "CLI Pulse Bar Watch/CLI_Pulse_Watch.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = "CLI Pulse Bar Watch/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse.watchkitapp"; PRODUCT_NAME = "CLI Pulse Watch"; SDKROOT = watchos; @@ -1189,7 +1189,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = "CLI Pulse Widgets/CLI_Pulse_Widgets.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = "CLI Pulse Widgets/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 17.0; @@ -1198,7 +1198,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse.widgets"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1217,7 +1217,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = "CLI Pulse Widgets/CLI_Pulse_Widgets.entitlements"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; GENERATE_INFOPLIST_FILE = NO; INFOPLIST_FILE = "CLI Pulse Widgets/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 17.0; @@ -1226,7 +1226,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse.widgets"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; @@ -1245,7 +1245,7 @@ CODE_SIGN_ENTITLEMENTS = CLIPulseHelper/CLIPulseHelper.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; DEAD_CODE_STRIPPING = YES; ENABLE_APP_SANDBOX = YES; GENERATE_INFOPLIST_FILE = NO; @@ -1254,7 +1254,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse.helper"; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -1273,7 +1273,7 @@ CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; CODE_SIGN_STYLE = Manual; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = ""; ENABLE_APP_SANDBOX = NO; @@ -1283,7 +1283,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = app.clipulse.qa.local.helper; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1300,7 +1300,7 @@ CODE_SIGN_ENTITLEMENTS = CLIPulseHelper/CLIPulseHelper.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 99; + CURRENT_PROJECT_VERSION = 100; DEAD_CODE_STRIPPING = YES; ENABLE_APP_SANDBOX = YES; GENERATE_INFOPLIST_FILE = NO; @@ -1309,7 +1309,7 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MARKETING_VERSION = 1.46.0; + MARKETING_VERSION = 1.47.0; PRODUCT_BUNDLE_IDENTIFIER = "yyh.CLI-Pulse.helper"; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 10a5cd9e..586ac35d 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -32,8 +32,8 @@ android { applicationId = "com.clipulse.android" minSdk = 26 targetSdk = 35 - versionCode = 65 - versionName = "1.46.0" + versionCode = 66 + versionName = "1.47.0" buildConfigField("String", "SUPABASE_URL", "\"${localProps.getProperty("SUPABASE_URL", "https://gkjwsxotmwrgqsvfijzs.supabase.co")}\"") diff --git a/release/whatsnew_147/en-US.txt b/release/whatsnew_147/en-US.txt new file mode 100644 index 00000000..d54c9c15 --- /dev/null +++ b/release/whatsnew_147/en-US.txt @@ -0,0 +1,5 @@ +Fixed: the background helper could stop starting after an update and stay stopped, with nothing on screen saying so. When that happened CLI Pulse found no CLI activity at all and simply showed nothing. It now checks the helper's real state at every launch and re-registers it when it is registered but failing to start. + +Fixed: with local-only mode turned on, the first-run card about anonymous statistics said they were being sent. Nothing was — local-only mode already covers them. + +Fixed: the counter for "CLI Pulse found a CLI on this machine" often wasn't recorded until a later launch, which made our own numbers read lower than reality. No change to what is collected. diff --git a/release/whatsnew_147/zh-Hans.txt b/release/whatsnew_147/zh-Hans.txt new file mode 100644 index 00000000..317a08ed --- /dev/null +++ b/release/whatsnew_147/zh-Hans.txt @@ -0,0 +1,5 @@ +修复:后台 helper 在更新后可能再也起不来,而且界面上没有任何提示。发生这种情况时,CLI Pulse 完全采集不到 CLI 活动,只会显示一片空白。现在每次启动都会检查 helper 的真实状态,发现"已注册但起不来"就重新注册。 + +修复:开启"仅本地模式"时,首次启动的匿名统计卡片声称统计正在发送。实际上什么都没有发送 —— 仅本地模式本来就已经把它关掉了。 + +修复:"在这台机器上发现了 CLI"这个计数常常要等到之后某次启动才被记录,导致我们自己看到的数字低于实际。收集的内容没有变化。