From 3c5daa141d30f72eac55bf84765c41f960116417 Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Thu, 11 Jun 2026 20:40:57 +0800
Subject: [PATCH] Record app ordering implementation todo

---
 src/TODO.md |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/src/TODO.md b/src/TODO.md
index 1132d25..8f86fc7 100644
--- a/src/TODO.md
+++ b/src/TODO.md
@@ -13,6 +13,43 @@
 
 ## Todo
 
+- [新需求] 容器内 App 手动拖拽排序。
+  - 目标: 用户可以在同一个容器/分组内拖动 App,改变该容器内默认显示顺序;重启、刷新、语言切换、导入导出、恢复布局后顺序仍保持。
+  - 核心决策: 这不是纯 UI 数组重排;App 顺序必须作为“分类与布局方案”的一部分持久化到 `TagDatabase.Store`。
+  - 最小版本范围:
+    - 只支持同一容器内排序,不改变 App 的标签归属。
+    - 跨容器拖动继续沿用现有移动/复制标签逻辑。
+    - 拖到空白区域继续沿用现有移除来源标签/归为未分类确认逻辑。
+    - 不改 Quick Search 排名,不改 `appTags[path]` 语义,不存像素坐标、row/column 或 `IndexPath`。
+  - 数据层 TODO:
+    - 在 `TagDatabase.Store` 新增 `containerAppOrder: [String: [String]]`,旧 JSON 用 `decodeIfPresent` 默认空字典。
+    - 定义稳定容器 ID,不能用本地化显示名;建议普通标签 `tag:<tagName>`,系统分类 `system:<SmartCategoryID>`,特殊容器 `__container.uncategorized` / `__container.appleBuiltIn`。
+    - `TagGroup` 或分组构造链路携带稳定 container key,显示名继续只用于 UI。
+    - 在 `makeDisplayGroups` / 分组生成后按 `containerAppOrder` 排组内 apps;未命中的新 App 按现有默认名称排序追加。
+    - 新增 `TagEditor.reorderApps(inContainer:orderedPaths:)`,走 `saveUserCategorySchemeMutation(reason: "reorder-apps")`。
+    - `CategorySchemeFingerprint` 纳入 `containerAppOrder`,确保自动快照、恢复上一方案和导出/导入不会漏掉顺序。
+    - tag rename/delete/relocalize、卸载 App reconcile、未分类重置、SmartStart replace 必须同步迁移或清理顺序字段。
+  - UI TODO:
+    - 不使用 SwiftUI `onDrag/onDrop`;当前 App Grid 是 AppKit `NSViewRepresentable` + 自绘拖拽,应在 `AppGridCollectionView` / `AppGridGroupCardView` / `AppGridIconNSView` 链路扩展。
+    - 为同容器排序增加独立 intent 和 insertion index hit-test,避免误触发跨标签移动、复制、拖空白移除或 Apple 内置保护逻辑。
+    - 第一版可只显示插入位置指示线/占位,不做复杂跨容器预览。
+    - 排序开始时继续抑制 hover bubble;结束、取消、滚动、Esc、切换窗口时必须清理拖拽状态。
+    - 编辑模式的批量添加/移除标签界面第一版不开放 App 排序,只读取排序结果。
+  - 推荐开发切分:
+    1. 数据层 PR: schema、容器 ID、排序 helper、fingerprint、导入导出/恢复/重置/SmartStart 规则;先不接 UI。
+    2. UI hit-test PR: 同容器插入位置计算和本地预览,不落盘,不改变跨容器拖拽。
+    3. 集成 PR: `ContentView` 接入 reorder callback,drop/end 时保存该容器完整顺序并刷新。
+    4. 回归 PR: 数据脚本 QA、macOS 14 typecheck/build、窗口/拖拽 smoke、真实鼠标手工验收。
+  - QA 阻断项:
+    - 旧 `tags.json` 无顺序字段可加载,默认顺序与现版本一致。
+    - 新字段导出/导入 roundtrip 保留顺序;恢复上一方案恢复顺序。
+    - 排序后刷新、重启、语言切换、SmartStart 备份/恢复均不丢顺序。
+    - 同容器排序不破坏跨容器移动/Option 复制、拖空白移除、拖到 Apple 内置保护。
+    - 多标签 App 在 A 容器排序不影响 B 容器顺序。
+    - macOS 14、5 种 displayMode、左/右/顶部标签位置、hide names 开关、icon size 40/64/80 至少 smoke。
+  - 风险等级: 最小方案中等;若一次性做跨容器插入、跨机器稳定匹配、复杂拖拽 payload 和所有模式完整预览,风险升为高。
+  - 参考记录: `.codex-sessionhistory/2026-06-11-App容器排序方案.md`。
+
 - [发布后独立任务] 设置页 tab 容器 AppKit/自控化评估与实现。
   - 决策: 当前发布前 No-Go;保留 SwiftUI `TabView`,不改 QA 脚本。
   - 背景: QA 过程中曾观察到设置页顶部 tab 偶发折叠/消失,但目前不是稳定可复现 release blocker。
@@ -23,6 +60,22 @@
 
 ## Done
 
+- [2026-06-09] 多语种 App 显示名通用加固。
+  - 结果: 新增统一 `AppDisplayNameResolver`;App Grid 与 Quick Search 标题优先走当前语种/同语系/系统可见名/英文官方名/基础 bundle 名 fallback,内部 bundle 名和 bundle id 只作为搜索别名;`7.8.26` 进一步加固 `/Wrapper/`、`/Contents/Helpers/`、`.app/.../*.app` 内部 helper 过滤。
+  - 范围: `AppInfo` 增加系统显示名与 bundle 显示名候选;App 扫描层和 Quick Search 文档层都过滤内部 helper;Quick Search 文档使用 resolver 生成别名;版本更新为 `7.8.26 (20260609.2004)`。
+  - 不改范围: 未做第三方 App 名称机器翻译,未改 Quick Search 排名算法、App Grid 布局、窗口层级或 Smart Start 分类规则。
+  - 验证: `APP_BUILD=20260609.2004 bash build.sh`、`codesign --verify --deep --strict src/build/TagLauncher.app`、`Scripts/quick_search_app_name_qa.sh`、`Scripts/quick_search_system_app_qa.sh` 通过;构建产物 Info.plist 为 `7.8.26 (20260609.2004)`。
+
+- [2026-06-09] 修复首安 Smart Start 提示确认后 App Grid 消失的问题。
+  - 结果: Smart Start 自动整理完成提示出现期间会抑制 AppKit 级 backdrop dismiss;点击“OK/好的”只关闭提示弹窗,不再关闭整个 App Grid。
+  - 范围: 只改 `ContentView.swift` 的 modal interaction 发布状态,不改 Smart Start 分类规则、不改 App Grid 布局、不改窗口层级。
+  - 验证: `APP_BUILD=20260609.1221 bash build.sh`、`codesign --verify --deep --strict build/TagLauncher.app`、版本/build/category 检查、Apple 默认资源 QA、SmartStart catalog QA 通过;首安真实点击路径待最终视觉验收。
+
+- [2026-06-08] 修复 App Grid 顶部 tag hover 触发自动滚动导致的抖动。
+  - 结果: hover 只保留 tag 高亮/填色,不再自动滚动;点击 tag 仍滚动到对应分组。
+  - 范围: 只改 `Apptag/ContentView.swift` 的 tag hover 处理,不改 App Grid 布局算法、不改拖拽、不改点击导航语义。
+  - 验证: `bash build.sh` 和 `codesign --verify --deep --strict build/TagLauncher.app` 通过;用户使用新版后确认仍有轻微小抖,但效果可接受,本轮不继续扩大修复范围。
+
 - [2026-06-04] 修复新安装 App 后 App Grid / Quick Search 不能立即检索到的问题。
   - 提交: 本次提交
   - 结果: App Grid / Quick Search 打开时先轻量检查标准应用目录签名;签名未变化时不刷新也不重建界面,目录变化时才后台重扫应用索引。

--
Gitblit v1.9.3