7 files modified
10 files added
| | |
| | | } |
| | | |
| | | var body: some View { |
| | | contentWithStateObservers |
| | | } |
| | | |
| | | private var contentWithNotificationObservers: some View { |
| | | contentStack |
| | | .onAppear(perform: handleContentAppear) |
| | | .onReceive(NotificationCenter.default.publisher(for: .tagLauncherOverlayDidShow), perform: handleOverlayDidShow) |
| | |
| | | .onReceive(NotificationCenter.default.publisher(for: NSApplication.didBecomeActiveNotification), perform: handleApplicationDidBecomeActive) |
| | | .onReceive(NotificationCenter.default.publisher(for: .tagLauncherDataDidChange), perform: handleDataDidChange) |
| | | .onReceive(NotificationCenter.default.publisher(for: .appLanguageDidChange), perform: handleAppLanguageDidChange) |
| | | } |
| | | |
| | | private var contentWithStateObservers: some View { |
| | | contentWithNotificationObservers |
| | | .onChange(of: editPhase) { _, newPhase in |
| | | let active = newPhase != .none |
| | | dismissAppBubble() |
| | |
| | | <key>CFBundlePackageType</key> |
| | | <string>APPL</string> |
| | | <key>CFBundleShortVersionString</key> |
| | | <string>8.3.5</string> |
| | | <string>8.3.6</string> |
| | | <key>CFBundleURLTypes</key> |
| | | <array> |
| | | <dict> |
| | |
| | | </dict> |
| | | </array> |
| | | <key>CFBundleVersion</key> |
| | | <string>20260702.1046</string> |
| | | <string>20260707.1242</string> |
| | | <key>LSApplicationCategoryType</key> |
| | | <string>public.app-category.utilities</string> |
| | | <key>LSMinimumSystemVersion</key> |
| | |
| | | .padding(.vertical, 10) |
| | | .frame(width: dataPanelWidth, alignment: .leading) |
| | | .frame(minHeight: 44) |
| | | .background( |
| | | RoundedRectangle(cornerRadius: 10, style: .continuous) |
| | | .fill(Color(nsColor: .controlBackgroundColor)) |
| | | ) |
| | | .overlay( |
| | | RoundedRectangle(cornerRadius: 10, style: .continuous) |
| | | .stroke(Color.secondary.opacity(0.16), lineWidth: 1) |
| | | ) |
| | | } |
| | | .frame(maxWidth: .infinity, alignment: .center) |
| | | .padding(.top, 12) |
| | |
| | | let verification = try await AppTransaction.shared |
| | | switch verification { |
| | | case .verified(let transaction): |
| | | if #available(macOS 13.0, *) { |
| | | if transaction.revocationDate != nil { |
| | | return nil |
| | | } |
| | | } |
| | | return transaction |
| | | case .unverified: |
| | | return nil |
| | |
| | | |
| | | ## [Unreleased] |
| | | |
| | | ## [8.3.6] — 2026-07-07 |
| | | |
| | | - 设置页顶部固定 Pro 状态 / 引导行移除外层圆角矩形背景和描边,保留原位置、身份文案、购买和恢复购买入口 |
| | | - 扩展 Pro 门禁 QA,防止该固定 Pro 行回退为带外框样式 |
| | | - 版本号更新为 `8.3.6`,Build 更新为 `20260707.1242` |
| | | |
| | | ## [8.3.5] — 2026-07-02 |
| | | |
| | | - 标签列表自身顺序不再作为 Pro 权益:免费用户拖动标签后也会持久保存容器显示顺序 |
| New file |
| | |
| | | # Settings Pro Header Border Removal |
| | | |
| | | Date: 2026-07-07 |
| | | Target version: 8.3.6 |
| | | |
| | | ## Requirement |
| | | |
| | | Across all Settings tabs, the fixed Pro status / guidance row below the tab bar must no longer render an outer rounded rectangle frame. |
| | | |
| | | ## Keep |
| | | |
| | | - Keep `settingsFixedProHeader` visible on Language, General, Theme, Hotkeys, Tags, Data, Pro, and About tabs. |
| | | - Keep the row width, vertical position, status text, Pro pill, purchase button, and restore purchase button behavior. |
| | | - Keep the centered unlocked identity layout for Language, Pro, and About after Pro unlock. |
| | | |
| | | ## Remove |
| | | |
| | | - Remove only the outer rounded rectangle background and stroke from `settingsFixedProHeader`. |
| | | - Do not remove inner Pro pills, tab content cards, Pro comparison rows, data action cards, or modal prompt styling. |
| | | |
| | | ## Evidence |
| | | |
| | | User screenshot: `/var/folders/s4/_92q_d2d7sxczn21bpxjhbv00000gp/T/codex-clipboard-b111590b-42cc-42e5-80f0-be58e0f68eb4.png` |
| | | |
| | | ## Validation |
| | | |
| | | - Static QA must fail if `settingsFixedProHeader` reintroduces the old `controlBackgroundColor` rounded background or secondary stroke. |
| | | - Visual smoke must confirm the header content remains in the same position without the outer frame. |
| | |
| | | fail("fixed Pro header must no longer be hidden on Language and About tabs") |
| | | require(preferences, "if shouldShowSettingsFixedProHeader", "Settings body must conditionally render the fixed Pro header") |
| | | fixed_header_body = function_body(preferences, "private var settingsFixedProHeader: some View") |
| | | if "Color(nsColor: .controlBackgroundColor)" in fixed_header_body: |
| | | fail("fixed Pro header must not render the removed outer rounded background") |
| | | if ".stroke(Color.secondary.opacity(0.16), lineWidth: 1)" in fixed_header_body: |
| | | fail("fixed Pro header must not render the removed outer rounded border") |
| | | require(fixed_header_body, "if shouldCenterUnlockedIdentityHeader", "fixed Pro header must use the centered unlocked identity branch") |
| | | require(fixed_header_body, 'text: tr("pro.status.unlocked")', "centered Pro identity header must start with the Pro unlocked pill") |
| | | require(fixed_header_body, "style: .unlocked", "centered Pro identity pill must use the unlocked style") |
| New file |
| | |
| | | 6b899e1961ac203a777f7d285eaaed0fb14e5c4a4e9cec6500f779cda7a3333e Archive/TagLauncher-8.3.6-build20260707.1242.dmg |
| | |
| | | # TagLauncher CODEGRAPH |
| | | |
| | | 最后更新:2026-07-02 |
| | | 最后更新:2026-07-07 |
| | | |
| | | 用途:本文件是 TagLauncher 的长期工程地图。修改用户可见行为、状态模型、构建/发布入口、核心源码或 QA 入口前,应先读本文件,再读指向的真实源码。若本文件与源码不一致,以源码为准,并在同一任务内更新本文件。 |
| | | |
| | |
| | | - `C1.source/Apptag/PreferencesView.swift` |
| | | - `PreferencesView`:设置窗口、语言、通用、主题、快捷键、标签、数据、Pro、关于等设置页。 |
| | | - 顶部设置页签必须保持 8 个标签总宽不超过旧 7 标签宽度;图标统一使用线型 SF Symbols,`Pro` 页签位于数据之后、关于之前,使用线型皇冠。 |
| | | - 设置页签下方按页签渲染统一固定位置的 `settingsFixedProHeader`:语言 / 通用 / 主题 / 快捷键 / 标签 / 数据 / Pro / 关于 8 个页签都显示该行且位置不漂移。免费态左侧状态用“当前免费版用户”完整句而不是“免费版”胶囊;通用 / 主题 / 快捷键 / 标签 / 数据页显示当前 tab 对应购买引导和解锁/恢复按钮,语言和关于页只显示状态与操作按钮,不显示购买说明文字;已解锁 Pro 时,语言 / Pro / 关于页统一居中显示 `Pro 已解锁` 胶囊加 `settings.proStatus.proUser` 文案,不显示恢复购买按钮,且 `settings.proStatus.proUser` 本地化文字不再内置皇冠图标。 |
| | | - 设置页签下方按页签渲染统一固定位置的 `settingsFixedProHeader`:语言 / 通用 / 主题 / 快捷键 / 标签 / 数据 / Pro / 关于 8 个页签都显示该行且位置不漂移。免费态左侧状态用“当前免费版用户”完整句而不是“免费版”胶囊;通用 / 主题 / 快捷键 / 标签 / 数据页显示当前 tab 对应购买引导和解锁/恢复按钮,语言和关于页只显示状态与操作按钮,不显示购买说明文字;已解锁 Pro 时,语言 / Pro / 关于页统一居中显示 `Pro 已解锁` 胶囊加 `settings.proStatus.proUser` 文案,不显示恢复购买按钮,且 `settings.proStatus.proUser` 本地化文字不再内置皇冠图标。8.3.6 起该固定行不渲染包住整行的外层圆角矩形背景或描边。 |
| | | - Pro 专属主题、彩色容器 / 彩色网格、自定义快捷键、自定义标签颜色和数据导入导出入口即使已解锁,也应保留皇冠 Pro 标识。 |
| | | - Language tab 去掉重复标题说明,语言矩阵在主内容区域上下左右居中;About tab 应用信息块也在主内容区域居中。 |
| | | - Theme tab 只写视觉偏好 `appGridThemeID` 和炫彩主题调色值,炫彩滑轨只能影响 AppGrid 背景,不得改变标签、排序、备注或分类数据。 |
| | |
| | | - `C1.source/Scripts/pro_localization_qa.sh` |
| | | - Pro 文案 29 语种静态门禁;检查 `pro.*`、设置页 Pro 状态/对比表、自定义标签颜色、Quick Search 快捷键页和气泡提示设置键完整、占位符完整、无生成污染和非英文语言无英文兜底复制。 |
| | | - `C1.source/Scripts/pro_feature_gate_qa.sh` |
| | | - Pro 功能源码门禁;检查 StoreKit 权益、老用户自动 Pro、主题门禁、导入导出硬拦截、3 条备注额度、自定义标签颜色、自定义快捷键、容器内 App 排序预览、Pro UI 提示、设置页线型图标、轻量 Pro 权益行、Pro 页签、免费列“不支持”状态和 About 页不回归 Pro 汇总卡。 |
| | | - Pro 功能源码门禁;检查 StoreKit 权益、老用户自动 Pro、主题门禁、导入导出硬拦截、3 条备注额度、自定义标签颜色、自定义快捷键、容器内 App 排序预览、Pro UI 提示、设置页线型图标、轻量 Pro 权益行、固定 Pro 行不回归外层圆角矩形框、Pro 页签、免费列“不支持”状态和 About 页不回归 Pro 汇总卡。 |
| | | - `C1.source/Scripts/pro_theme_preview_countdown_qa.sh` |
| | | - Pro 主题 / 彩色显示模式预览倒计时门禁;检查状态行倒计时、当前预览卡片 `MM:SS`、到期清理、29 语种 `%time%` 占位符和禁止写死体验时长。 |
| | | - `C1.source/Scripts/pro_display_mode_preview_qa.sh` |
| New file |
| | |
| | | # TagLauncher 8.3.6 App Store Upload Blocker |
| | | |
| | | Date: 2026-07-07 |
| | | |
| | | ## Blocker |
| | | |
| | | The App Store Connect upload `.pkg` cannot be generated on this Mac because the required company signing identities and provisioning profile are not available locally. |
| | | |
| | | Required for upload: |
| | | |
| | | - `3rd Party Mac Developer Application: Hainan Wanxing Technology Co., Ltd. (CR3J54M8BQ)` |
| | | - `3rd Party Mac Developer Installer: Hainan Wanxing Technology Co., Ltd. (CR3J54M8BQ)` |
| | | - Mac App Store provisioning profile for `CR3J54M8BQ.com.taglauncher.app` |
| | | |
| | | Observed local keychain identities: |
| | | |
| | | ```text |
| | | PrivateVoice Local Code Signing |
| | | Apple Development: junfeng zhang (9MYR6D5R5U) |
| | | ``` |
| | | |
| | | Observed provisioning profile directory: |
| | | |
| | | ```text |
| | | ~/Library/MobileDevice/Provisioning Profiles |
| | | ``` |
| | | |
| | | No local `.provisionprofile` files were found there during this release gate. |
| | | |
| | | ## Important Constraint |
| | | |
| | | Do not sign the App Store upload package with `Apple Development: junfeng zhang (9MYR6D5R5U)` or any personal development identity. That would produce the wrong distribution artifact and is not acceptable for ASC submission. |
| | | |
| | | ## Completed Anyway |
| | | |
| | | - Source code is frozen at `d76f5d61a7463dee1600d6b40eb85cabfa75a914`. |
| | | - Version/build metadata is `8.3.6 (20260707.1242)`. |
| | | - Local ad-hoc QA app and local rollback DMG were generated and verified. |
| | | |
| | | ## Resume Condition |
| | | |
| | | After the company certificates and provisioning profile are installed, regenerate the App Store upload package from the frozen source commit using the company identities, then run PKG preflight: |
| | | |
| | | ```bash |
| | | cd /Users/ar/Projects/Taglauncher/03-O/C1.source |
| | | APP_STORE=1 \ |
| | | APP_BUILD=20260707.1242 \ |
| | | CODESIGN_IDENTITY="3rd Party Mac Developer Application: Hainan Wanxing Technology Co., Ltd. (CR3J54M8BQ)" \ |
| | | bash build.sh |
| | | ``` |
| | | |
| | | Before final App Store signing, the Mac App Store provisioning profile for `CR3J54M8BQ.com.taglauncher.app` must be embedded into the app bundle and the app must then be signed with the company application identity. The current `build.sh` does not automatically embed a provisioning profile, so the resume step must either update the script to do this or perform the profile copy before the final codesign: |
| | | |
| | | ```bash |
| | | cp "/path/to/TagLauncher Mac App Store.provisionprofile" \ |
| | | build/TagLauncher.app/Contents/embedded.provisionprofile |
| | | |
| | | codesign --force --deep \ |
| | | --sign "3rd Party Mac Developer Application: Hainan Wanxing Technology Co., Ltd. (CR3J54M8BQ)" \ |
| | | --entitlements Apptag/TagLauncher.entitlements \ |
| | | build/TagLauncher.app |
| | | ``` |
| | | |
| | | Then create the ASC upload package with the company installer identity: |
| | | |
| | | ```bash |
| | | productbuild \ |
| | | --component build/TagLauncher.app /Applications \ |
| | | --sign "3rd Party Mac Developer Installer: Hainan Wanxing Technology Co., Ltd. (CR3J54M8BQ)" \ |
| | | /Users/ar/Projects/Taglauncher/03-O/K3.运营与发布资料/Release/AppStore-8.3.6-20260707.1242/Upload/TagLauncher-8.3.6-build20260707.1242.pkg |
| | | ``` |
| | | |
| | | Required preflight after package generation: |
| | | |
| | | ```bash |
| | | pkgutil --check-signature /Users/ar/Projects/Taglauncher/03-O/K3.运营与发布资料/Release/AppStore-8.3.6-20260707.1242/Upload/TagLauncher-8.3.6-build20260707.1242.pkg |
| | | pkgutil --expand-full /Users/ar/Projects/Taglauncher/03-O/K3.运营与发布资料/Release/AppStore-8.3.6-20260707.1242/Upload/TagLauncher-8.3.6-build20260707.1242.pkg /Users/ar/Projects/Taglauncher/03-O/K3.运营与发布资料/Release/AppStore-8.3.6-20260707.1242/Preflight/expanded |
| | | codesign --verify --deep --strict --verbose=2 /Users/ar/Projects/Taglauncher/03-O/K3.运营与发布资料/Release/AppStore-8.3.6-20260707.1242/Preflight/expanded/com.taglauncher.app.pkg/Payload/TagLauncher.app |
| | | ``` |
| New file |
| | |
| | | # TagLauncher 8.3.6 QA Release Evidence |
| | | |
| | | Date: 2026-07-07 |
| | | Build: `8.3.6 (20260707.1242)` |
| | | Source freeze commit: `d76f5d61a7463dee1600d6b40eb85cabfa75a914` |
| | | |
| | | ## User-Facing Requirement |
| | | |
| | | The Settings fixed Pro status / guidance row must no longer have an outer rounded rectangle frame. |
| | | |
| | | ## Visual Smoke |
| | | |
| | | Evidence screenshot: |
| | | |
| | | - `QA/taglauncher-8.3.6-settings-about-no-pro-header-frame.png` |
| | | |
| | | Result: |
| | | |
| | | - PASS: the Settings window opens from the built app. |
| | | - PASS: the About tab shows the fixed Pro status row in the same position. |
| | | - PASS: the row has no outer rounded rectangle background or border. |
| | | - PASS: identity text, unlock button, restore purchase button, tab layout, and app version display remain visible. |
| | | |
| | | ## Automated / Static QA |
| | | |
| | | Passed: |
| | | |
| | | ```bash |
| | | bash Scripts/pro_feature_gate_qa.sh |
| | | bash Scripts/pro_localization_qa.sh |
| | | bash Scripts/pro_theme_preview_countdown_qa.sh |
| | | bash Scripts/macos14_availability_typecheck_qa.sh |
| | | bash Scripts/pro_custom_hotkeys_qa.sh |
| | | bash Scripts/pro_display_mode_preview_qa.sh |
| | | bash Scripts/pro_custom_container_quota_qa.sh |
| | | bash Scripts/quick_search_launch_contract_qa.sh |
| | | bash Scripts/windowserver_event_safety_qa.sh |
| | | bash Scripts/theme_settings_qa.sh |
| | | bash Scripts/settings_language_title_qa.sh |
| | | bash Scripts/app_ordering_data_qa.sh |
| | | bash Scripts/pro_notes_quota_qa.sh |
| | | bash Scripts/pro_tag_custom_color_qa.sh |
| | | bash Scripts/appgrid_startup_loading_qa.sh |
| | | bash Scripts/quick_search_system_app_qa.sh |
| | | bash Scripts/url_scheme_activation_qa.sh |
| | | bash Scripts/usage_tips_qa.sh |
| | | bash Scripts/tag_editor_mouse_event_qa.sh |
| | | bash Scripts/macos14_build_metadata_qa.sh build/TagLauncher.app |
| | | codesign --verify --deep --strict --verbose=2 build/TagLauncher.app |
| | | hdiutil verify build/TagLauncher.dmg |
| | | ``` |
| | | |
| | | Non-PASS items: |
| | | |
| | | - `bash Scripts/quick_search_app_name_qa.sh`: script returned `SKIP Sunlogin wrapper app not installed at /Applications/贝锐向日葵被控.app`. |
| | | - `bash Scripts/window_logic_qa.sh`: script returned `FAIL: cliclick is required for window-position click checks.` |
| | | |
| | | ## Release Gate Conclusion |
| | | |
| | | - Local QA app / DMG: PASS for the scoped UI change. |
| | | - App Store upload package: BLOCKED by missing company signing materials; see `APP_STORE_UPLOAD_BLOCKER.md`. |
| New file |
| | |
| | | # TagLauncher 8.3.6 Release Manifest |
| | | |
| | | Date: 2026-07-07 |
| | | |
| | | ## Version |
| | | |
| | | - Version: `8.3.6` |
| | | - Build: `20260707.1242` |
| | | - Source freeze commit: `d76f5d61a7463dee1600d6b40eb85cabfa75a914` |
| | | - Branch: `codex/slim-migration-taglauncher2` |
| | | - CODEGRAPH: checked and updated for the Settings fixed Pro header visual contract and Pro feature QA coverage. |
| | | - codebase-memory: not applicable for this release gate; current project handoff uses `CODEGRAPH.md` as the maintained engineering map. |
| | | |
| | | ## Release Scope |
| | | |
| | | - Removed the outer rounded rectangle background and border from the fixed Pro status / guidance row under the Settings tab bar. |
| | | - Kept all Pro entitlement, purchase, restore, tab placement, and localization behavior unchanged. |
| | | - Fixed two build-gate blockers found during release validation: |
| | | - Split `ContentView.body` observer chains to avoid Swift compiler type-check timeout. |
| | | - Removed invalid `AppTransaction.revocationDate` access; `AppTransaction` in the current StoreKit SDK exposes original app purchase metadata but no revocation date. |
| | | |
| | | ## Artifacts |
| | | |
| | | - Local QA DMG: `Archive/TagLauncher-8.3.6-build20260707.1242.dmg` |
| | | - Visual QA screenshot: `QA/taglauncher-8.3.6-settings-about-no-pro-header-frame.png` |
| | | - Hash file: `SHA256SUMS.txt` |
| | | - App Store upload package: blocked; see `APP_STORE_UPLOAD_BLOCKER.md` |
| | | |
| | | ## Build Commands |
| | | |
| | | ```bash |
| | | cd /Users/ar/Projects/Taglauncher/03-O/C1.source |
| | | APP_BUILD=20260707.1242 bash build.sh |
| | | bash make_dmg.sh |
| | | ``` |
| | | |
| | | ## Verification Summary |
| | | |
| | | Passed: |
| | | |
| | | - `bash Scripts/pro_feature_gate_qa.sh` |
| | | - `bash Scripts/pro_localization_qa.sh` |
| | | - `bash Scripts/pro_theme_preview_countdown_qa.sh` |
| | | - `bash Scripts/macos14_availability_typecheck_qa.sh` |
| | | - `bash Scripts/macos14_build_metadata_qa.sh build/TagLauncher.app` |
| | | - `codesign --verify --deep --strict --verbose=2 build/TagLauncher.app` |
| | | - `hdiutil verify build/TagLauncher.dmg` |
| | | |
| | | Partial / blocked: |
| | | |
| | | - `bash Scripts/quick_search_app_name_qa.sh`: skipped because the Sunlogin wrapper fixture app is not installed on this Mac. |
| | | - `bash Scripts/window_logic_qa.sh`: blocked because `cliclick` is not installed. |
| | | - App Store `.pkg`: blocked because the company Mac App Store signing identities and provisioning profile are not present locally. |
| | | |
| | | ## Hashes |
| | | |
| | | ```text |
| | | 6b899e1961ac203a777f7d285eaaed0fb14e5c4a4e9cec6500f779cda7a3333e Archive/TagLauncher-8.3.6-build20260707.1242.dmg |
| | | c49127307de06d4be71536502bfdaece185bd0196a668f74e9c7fb55d60a6f8f QA/taglauncher-8.3.6-settings-about-no-pro-header-frame.png |
| | | ``` |
| New file |
| | |
| | | 6b899e1961ac203a777f7d285eaaed0fb14e5c4a4e9cec6500f779cda7a3333e Archive/TagLauncher-8.3.6-build20260707.1242.dmg |
| | | c49127307de06d4be71536502bfdaece185bd0196a668f74e9c7fb55d60a6f8f QA/taglauncher-8.3.6-settings-about-no-pro-header-frame.png |
| New file |
| | |
| | | # Upload |
| | | |
| | | No App Store Connect `.pkg` is present in this directory. |
| | | |
| | | Reason: the required company Mac App Store signing identities and provisioning profile for `Hainan Wanxing Technology Co., Ltd. (CR3J54M8BQ)` are not installed on this Mac. Do not place a package signed with a personal Apple Development identity here. |