最后更新:2026-07-02
用途:本文件是 TagLauncher 的长期工程地图。修改用户可见行为、状态模型、构建/发布入口、核心源码或 QA 入口前,应先读本文件,再读指向的真实源码。若本文件与源码不一致,以源码为准,并在同一任务内更新本文件。
/Users/ar/Projects/Taglauncher2/03-O/Users/ar/Projects/Taglauncher2/03-O/C1.sourceC1.source/Apptag/C1.source/build.shC1.source/make_dmg.shK3.运营与发布资料/Release/C2.builds/C1.source/Scripts/C1.source/Apptag/ApptagApp.swiftTagLauncherApp:SwiftUI App 入口。AppDelegate:菜单栏状态项、Dock 显示策略、热键注册、窗口打开、Quick Search 触发、App 生命周期。taglauncher://show:只做 AppGrid show/focus,不做 toggle;冷启动时请求会排队到初始化完成后执行;不接管原生触控板手势。ProEntitlementCenter,保证免费 / Pro / 老用户自动 Pro 状态进入全局同步快照。👑Pro,点击进入 Pro 设置页,Pro 状态使用金色皇冠图标。C1.source/Apptag/OverlayWindowController.swiftOverlayPanel / OverlayWindowController:AppGrid 浮层窗口与显示/隐藏控制。C1.source/Apptag/ContentView.swiftContentView:AppGrid 主界面、标签导航、编辑模式、拖拽处理、Quick Search 数据刷新、使用技巧浮层入口。appGridThemeID 和炫彩主题调色值,并负责 AppGrid 全屏主题背景渲染。TagDef.customColor 并传入 AppGrid、标签导航和标签编辑器;标签显示优先使用自定义颜色,缺省回退基础色。AppLibrarySnapshot 先渲染 AppGrid,再后台刷新,避免启动/重开时立刻显示转圈。ContentView 统一弹 modal 并写入 hideUsageTips / skipUsageTipsCloseReminder。C1.source/Apptag/PreferencesView.swiftPreferencesView:设置窗口、语言、通用、主题、快捷键、标签、数据、Pro、关于等设置页。Pro 页签位于数据之后、关于之前,使用线型皇冠。settingsFixedProHeader:语言 / 通用 / 主题 / 快捷键 / 标签 / 数据 / Pro / 关于 8 个页签都显示该行且位置不漂移。免费态左侧状态用“当前免费版用户”完整句而不是“免费版”胶囊;通用 / 主题 / 快捷键 / 标签 / 数据页显示当前 tab 对应购买引导和解锁/恢复按钮,语言和关于页只显示状态与操作按钮,不显示购买说明文字;已解锁 Pro 时,语言 / Pro / 关于页统一居中显示 Pro 已解锁 胶囊加 settings.proStatus.proUser 文案,不显示恢复购买按钮,且 settings.proStatus.proUser 本地化文字不再内置皇冠图标。appGridThemeID 和炫彩主题调色值,炫彩滑轨只能影响 AppGrid 背景,不得改变标签、排序、备注或分类数据。ProThemePreviewState.endsAt 推导的 MM:SS 倒计时;倒计时到期只退出预览,不弹阻塞提示。C1.source/Apptag/AppGridCollectionView.swiftAppGridCollectionView:SwiftUI 到 AppKit NSCollectionView 的桥接。AppGridCollectionHostView:滚动容器、背景/使用技巧层、空白拖放处理。AppGridGroupCollectionItem / AppGridGroupCardView:分组容器、图标布局、分组标题、hover/高亮、容器内拖放。AppGridIconNSView:应用图标单元、点击、hover 气泡、拖拽起点。TagDef.customColor 优先解析;custom color signature 参与刷新签名,避免颜色变更后 AppGrid 不刷新。C1.source/Apptag/AppGridTheme.swiftappGridThemeID;暗色 / 亮色炫彩额外使用各自的调色值 key。ProEntitlementConfig.freeThemes 判断,不在主题 UI 中散落规则。C1.source/Apptag/ProEntitlement.swiftProEntitlementCenter:StoreKit 2 当前权益、购买、恢复、交易更新、离线缓存和 QA 状态注入。ProEntitlementPolicy:数据层可同步调用的 Pro 门禁;覆盖主题、彩色容器 / 彩色网格显示模式、导入 / 导出、备注额度、自定义标签颜色、自定义快捷键和应用排序持久化。ProEntitlementConfig:一次性买断商品 ID、免费 + Pro 首个版本、免费主题集合、免费 3 条备注额度和 QA 环境变量的单一配置点。ProThemePreviewState 可携带临时炫彩调色值;免费预览期间只写全局快照,不写真实 UserDefaults。ProDisplayModePreviewState 复用 Pro 主题 5 分钟体验时长;免费试用彩色容器 / 彩色网格时只写 previewDisplayMode 快照,过期或离开试用后按 coloredContainer -> container、coloredGridContainer -> gridContainer 回落。C1.source/Apptag/ProAccessViews.swiftProStatusPill:高级功能入口的小型 Pro 胶囊;Pro / 已锁定高级功能使用金色皇冠体系,免费状态使用中性胶囊。ProUpgradePromptView:功能被锁时的统一解锁提示,购买 / 恢复动作由调用方闭包绑定。C1.source/Apptag/AppGridSupport.swiftC1.source/Apptag/TagNavigationView.swiftTagDef.customColor。C1.source/Apptag/AppDragCoordinator.swiftC1.source/Apptag/DataLayer.swiftAppInfo:应用模型。AppDisplayNameResolver:多语言应用显示名解析。AppIndexer:扫描 /Applications 等应用来源,处理 bundle / wrapper / localized display name。TagGroup / TagColor / TagCustomColor:标签分组、基础色和可选 sRGB 自定义色;TagDef.customColor 为可选字段,旧 JSON 缺字段时保持兼容。TagDatabase:标签、备注、隐藏状态、分类方案、导入导出、备份和持久化。TagEditor:把数据库中的标签/备注/隐藏状态标注回扫描到的 App 列表;setCustomColor 是写入自定义标签颜色的唯一数据层入口,必须先过 Pro gate,基础色切换会清除自定义色。C1.source/Apptag/TagEditorView.swiftColorPicker / color well 打开颜色选择。C1.source/Apptag/AppLibraryController.swiftAppLibrarySnapshot,供新建 overlay 立即复用。C1.source/Apptag/AppDefaults.swift56;已有用户的持久化图标大小不做迁移覆盖。useDarkAppGrid=true 在没有新 theme key 时迁移到 appGridThemeID=deepBlue。hideUsageTips 默认 false;skipUsageTipsCloseReminder 默认 false。C1.source/Apptag/QuickSearch.swiftLauncherHotkey / LauncherHotkeyKind:主面板和 Quick Search 快捷键定义。LauncherHotkeyRegistrationStore:快捷键注册状态持久化。QuickSearchDocument / QuickSearchEngine:搜索索引与排序。QuickSearchPanelPresentationView / QuickSearchOverlayView / QuickSearchResultListHostView:Quick Search 浮层 UI 与结果列表;Quick Search 面板必须是可成为 key 的激活面板,不能使用 .nonactivatingPanel,否则 Return 可能落到前一个前台 App。QuickSearchPanel.sendEvent 对左键点击做 AppKit 层兜底:先通过 hitTest 解析 QuickSearchResultRowView,失败时按窗口坐标递归扫描结果行几何命中,并走同一启动路径,避免 SwiftUI / NSHostingView / NSScrollView 层级吞掉候选行点击。QuickSearchResultRowView:结果行内部文字、图标、标签区域统一命中到整行,保证点击任意可见区域都能启动并关闭浮层。QuickSearchTextField 同时保留 field editor command delegate 和 NSControl.target/action submit fallback,保证 Return / Enter 都能进入 .submit。C1.source/Apptag/LauncherHotkeySettings.swiftLauncherHotkeySettings:Pro 自定义全局快捷键的存储、有效值、结构校验、系统保留组合和内部重复校验事实源。customHotkeys.v1;免费用户、无效保存值或内部重复值都回退内置默认快捷键。Option+Space),仍拒绝无修饰键、Shift-only,以及 Fn-only 非 Space。effectiveHotkey(for:) 不调用公开 validationError(for:),避免重复校验递归。functionKeyCodes 集合,不能写 kVK_F1...kVK_F12 范围。C1.source/Apptag/ApptagApp.swiftregisterConfiguredHotkeys() 只注册 LauncherHotkeySettings.effectiveHotkey(for:)。applyCustomHotkey(_:for:) / restoreDefaultHotkey(for:) 是设置页写入自定义快捷键和恢复默认的唯一入口;候选快捷键必须先 Carbon 注册成功,再替换旧 ref 并持久化。suspendConfiguredHotkeysForRecording() 会临时注销主面板和 Quick Search 全局快捷键;录制成功、失败、取消、切 tab、窗口消失或 Pro 权益变更时通过 resumeConfiguredHotkeysAfterRecording() 恢复 effective hotkeys。C1.source/Apptag/SmartCategorization/SmartCategory.swiftSmartCategoryDefaults.orderedIDs 是 SmartStart 默认初始化标签事实源;当前默认方案为 12 个标签。SmartCategoryID.smartStartDefaultCategoryID 负责把旧细分 catalog 分类归并到 12 个默认标签;Meeting 归入 communication,finance 和 other 返回 nil,回到未分类;这是新 SmartStart 写入前的归并,不做老用户旧标签自动迁移。C1.source/Apptag/SmartCategorization/SmartCategorizationDraft.swiftC1.source/Apptag/SmartCategorization/SmartStartService.swiftC1.source/Apptag/AppleDefaultAppCatalog.swiftC1.source/Apptag/SmartStartNoticeOverlay.swiftC1.source/Apptag/L10n.swiftC1.source/Apptag/Localization/*.jsonsmart.category.* 是 SmartStart/default system tag 的显示事实源;非英文语言不得直接复制英文初始化标签。C1.source/Apptag/Resources/C1.source/Docs/Requirements/C1.source/Apptag/Info.plisttaglauncher,首期路由只支持 taglauncher://show。C1.source/Apptag/TagLauncher.entitlementsC1.source/build.sh.app 的主入口。C1.source/make_dmg.shK3.运营与发布资料/Release/C2.builds/.dmg / .pkg 构建产物。C1.source/Scripts/macos14_availability_typecheck_qa.shC1.source/Scripts/macos14_build_metadata_qa.shC1.source/Scripts/apple_default_apps_resource_qa.shC1.source/Scripts/apple_default_note_policy_qa.shC1.source/Scripts/apple_default_note_migration_qa.shC1.source/Scripts/smartstart_catalog_resource_qa.shC1.source/Scripts/smart_category_localization_qa.shPDF、DevOps 等技术通用词例外。C1.source/Scripts/smartstart_default_categories_qa.shMeeting 归入 communication、finance / other 回未分类、首次 starter tags 和关键多语言目标文案。C1.source/Scripts/quick_search_app_name_qa.shC1.source/Scripts/quick_search_system_app_qa.shC1.source/Scripts/quick_search_launch_contract_qa.shsendEvent 点击兜底存在、Return submit fallback 存在、点击 / submit 都接到 NSWorkspace.openApplication 启动路径。C1.source/Scripts/windowserver_event_safety_qa.shC1.source/Scripts/app_note_bubble_input_qa.shNSTextField 桥接、marked text 期间不覆盖/截断/提交,最终提交仍受备注长度上限约束。C1.source/Scripts/pro_custom_hotkeys_qa.shC1.source/Scripts/pro_tag_custom_color_qa.shTagCustomColor 数据模型、TagDef.customColor 兼容字段、Pro gate、原生颜色选择器、免费态 Pro 提示、基础色回退、横向皇冠色条入口和 AppGrid/标签导航显示传播。C1.source/Scripts/pro_notes_quota_qa.shC1.source/Scripts/tag_navigation_hover_scroll_qa.shC1.source/Scripts/tag_double_click_preferences_qa.shC1.source/Scripts/theme_settings_qa.shC1.source/Scripts/pro_localization_qa.shpro.*、设置页 Pro 状态/对比表、自定义标签颜色、Quick Search 快捷键页和气泡提示设置键完整、占位符完整、无生成污染和非英文语言无英文兜底复制。C1.source/Scripts/pro_feature_gate_qa.shC1.source/Scripts/pro_theme_preview_countdown_qa.shMM:SS、到期清理、29 语种 %time% 占位符和禁止写死体验时长。C1.source/Scripts/pro_display_mode_preview_qa.shC1.source/Scripts/appgrid_startup_loading_qa.shC1.source/Scripts/url_scheme_activation_qa.shtaglauncher://show 注册、AppDelegate show/focus 语义、冷启动 pending、29 语种设置文案和禁止私有触控板捕获。C1.source/Scripts/usage_tips_qa.shC1.source/Scripts/usage_tips_close_reminder_qa.shC1.source/Scripts/window_logic_qa.shC1.source/Scripts/settings_language_title_qa.shonAppear 都回写本地化 NSWindow.title。C1.source/Scripts/app_ordering_data_qa.shC1.source/ 下维护。TagDatabase 的分类/标签业务数据。appGridThemeID,容器内 App 排序预览不写 containerAppOrder,第 6 个新备注不写 appNotes / appNoteMetadata,导入 / 导出拦截必须早于文件面板和文件读写。customColor。originalAppVersion 早于免费 + Pro 首个版本的历史用户必须自动获得 Pro;originalPurchaseDate 只能作为版本不可判断时的兜底。当前免费 + Pro 首个版本边界由 ProEntitlementConfig.firstFreeProVersion 统一维护为 8.3.2,用于保护 8.2.9 及更早付费下载用户。useDarkAppGrid=true 必须迁移到 deepBlue 主题。ContentView 初始 allApps.isEmpty 立刻显示转圈;应先复用最近一次完整快照,并延迟显示 loading。AppInfo.displayName,内部 bundle 名只作为搜索字段。QuickSearchResultRowView.mouseDown 或 QuickSearchPanel.sendEvent 兜底进入同一启动路径;panel 级兜底不得只依赖 hitTest,必须保留窗口坐标递归几何命中结果行的路径。systemCategoryID 的系统标签,不能长期保留旧英文初始化标签。ContentView.swift 通常会影响 AppGrid 主流程、编辑模式、Quick Search 数据刷新或浮层层级,必须做对应 smoke。AppGridCollectionView.swift 通常会影响 AppGrid 布局、拖拽、hover、使用技巧、容器显示和性能,必须扩大视觉/交互回归。AppGridTheme.swift 必须验证全部主题、编辑模式 override、亮/暗玻璃可读性和设置页文案。DataLayer.swift 通常会影响应用扫描、显示名、标签数据、导入导出和迁移,必须补数据 QA。PreferencesView.swift 通常需要检查 29 个本地化 JSON、设置持久化和 macOS 14 UI 表现。ApptagApp.swift 或 OverlayWindowController.swift 必须回归菜单栏、Dock 图标策略、热键、窗口层级、全屏/Split View 行为。Info.plist URL Scheme 或第三方手势说明时,必须运行 url_scheme_activation_qa.sh,并确认不新增 Accessibility/Input Monitoring/private multitouch 依赖。