# 时记 TaskChron

> 面向 Windows 桌面端的个人任务记录与日报/周报/月报/年报辅助工具。

时记 TaskChron 是一款本地优先的悬浮窗式工作跟踪应用，帮助用户快速记录任务、管理时间节点、关联对接人与项目，并自动生成日报、周报、月报和年报。所有数据均保存在本地 SQLite 数据库，无需云端同步。

---

## 主要功能

- **四栏桌面布局与三 Tab 导航**：桌面端采用「Rail → 分组 → 任务列表 → 详情」四栏结构；导航简化为「任务」「视图」「日志」三大 Tab，设置与用户管理通过头像菜单打开独立窗体。
- **任务多维度分组**：任务 Tab 内按时间（所有/今天/最近 7 天/收集箱/已完成/垃圾桶）、清单（项目）、标签、对接人分组浏览与过滤。
- **常驻新建任务输入条**：桌面端任务列表顶部常驻「准备做什么？」输入条，支持设置日期、优先级、多标签、项目、对接人等参数，也支持 NLP 自动解析。
- **任务详情面板**：右侧详情区展示选中任务的标题、时间、优先级棋子、描述清单（复选框列表）、多标签、子任务、附件与底部操作栏。
- **五种视图模式**：视图 Tab 提供日程、日、周、月、年五种时间视图，替代原有的今日/收件箱/周/月全屏切换。
- **任务管理**：快速新建任务、编辑详情、设置优先级与时间节点、标记完成、批量操作、回收站恢复；支持子任务与多标签绑定。
- **对接人与项目关联**：为任务绑定对接人和所属项目，便于后续检索与汇总。
- **任务模板**：保存常用任务结构，一键复用。
- **节点提醒**：基于时间节点的到期提醒，通过系统 Toast 通知推送。
- **报告生成与推送**：自动生成日报、周报、月报、年报，支持 Markdown/Word 导出，并可通过企业微信 Webhook 推送。
- **AI 整理**：调用大模型对任务进行总结、润色和分类（需在设置中配置 API）。
- **语音输入**：支持语音快速录入任务内容，并可在「设置 → 语音历史」中查看、删除或重新解析历史语音。
- **悬浮小组件**：主窗口可收起为 180×120px 的迷你悬浮窗，常驻桌面。
- **全局快捷键**：通过快捷键快速唤起窗口、新建任务、切换显示状态；设置页支持按键直接录制组合键。
- **行内编辑撤销**：任务卡片中直接编辑标题、备注等字段时，保存后 5 秒内可按 `Ctrl + Z` 撤销。
- **数据备份与恢复**：一键导出/导入 SQLite 数据库文件，防止数据丢失。
- **回收站自动清理**：可设置回收站保留天数，应用启动时自动清理过期任务。
- **主题切换**：支持浅色/深色/跟随系统三种主题模式，可自定义主题色与字体大小。
- **操作日志**：独立的日志 Tab 记录关键操作，便于回溯与排查问题。
- **移动端适配**：Android 端底部导航固定为「任务 / 视图 / 日志 / 我的」四 Tab；任务 Tab 左侧抽屉复用桌面端分组结构，新建任务与任务详情以 Sheet 形式呈现。

---

## 技术栈

- **前端**：React 19 + TypeScript + Vite + Tailwind CSS v4
- **后端/桌面壳**：Tauri v2 + Rust
- **本地数据库**：SQLite，通过 `tauri-plugin-sql` 访问
- **状态管理**：Zustand
- **图标库**：lucide-react
- **图表**：ECharts（月历趋势图）
- **文档导出**：docx（Word）、原生 Markdown

---

## 开发环境

- **操作系统**：Windows（目前唯一支持平台）
- **Node.js**：20 或更高版本
- **Rust**：最新稳定版
- **Tauri 依赖**：Windows WebView2 运行时

---

## 开发命令

```bash
# 安装前端依赖
npm install

# 启动 Vite 开发服务器（仅前端，不启动 Tauri 窗口）
npm run dev

# TypeScript 类型检查 + Vite 生产构建
npm run build

# 预览生产构建产物
npm run preview

# 启动 Tauri 桌面应用（开发模式）
npm run tauri dev

# 生产构建并打包为 .msi 安装包
npm run tauri build

# 指定目标构建（Windows x86_64）
npm run tauri build -- --target x86_64-pc-windows-msvc

# 移动端：生成 Android 测试签名
npm run mobile:keystore

# 移动端：构建 Debug APK
npm run build:mobile:apk

# 移动端：构建 Release 签名 APK
npm run build:mobile:apk:release
```

测试与质量检查：

```bash
# 前端单元测试
npm test

# 测试覆盖率
npm run test:coverage

# 代码检查
npm run lint

# 代码格式化
npm run format
npm run format:check

# Rust 后端检查
cd src-tauri && cargo check

# Rust 单元测试
cd src-tauri && cargo test
```

---

## 全局快捷键

| 功能 | 默认快捷键 |
| --- | --- |
| 快速新建任务 | `Ctrl + Shift + T` |
| 语音输入 | `Ctrl + Shift + R` |
| 显示/隐藏主窗口 | `Ctrl + Shift + S` |

快捷键可在「设置 → 快捷键」中自定义。

---

## 项目结构

```
├── src/                # React 前端源码
├── src-tauri/          # Tauri/Rust 后端源码
├── design/             # 设计文档
├── docs/               # 使用与测试文档
├── dist/               # 前端构建产物
└── README.md           # 本文件
```

---

## 端到端测试清单

详见 [docs/e2e-checklist.md](./docs/e2e-checklist.md)。

---

## 更新日志

### v0.5.25 - 2026-06-25

- 移动端与桌面端 UI/数据展示同步：
  - 移动端任务详情 Sheet 顶栏项目改为 chip 风格（实体颜色底色 + emoji/默认图标）。
  - 移动端任务详情日期文本改为桌面版优化格式（今天/明天/后天/周X/下周X），并支持时间段与重复规则展示。
  - 移动端任务详情优先级从圆点改为旗帜图标，与桌面端一致。
  - 移动端任务详情日期选择器支持时间段、提醒提前时间、重复规则完整回显与保存。
- 移动端左侧抽屉（TaskDrawer）支持显示项目/标签/对接人自定义 emoji 图标，新建/编辑改用 `EntityDialog`，与桌面端分组面板能力对齐。
- 移动端任务列表顶部增加「全部/待办/已办」状态过滤，与桌面端一致。
- 桌面端分组面板（GroupPanel）删除确认从 `window.confirm` 替换为项目风格 `showConfirm`。
- 清理移动端僵尸组件：`TaskCardMobile`、`TaskDetailMobile`、`QuickAddSheet`、`TodayViewMobile`、`WeekViewMobile`、`InboxViewMobile`、`OverviewViewMobile`、`ProfileViewMobile`、`DataManagementMobile`。

### v0.5.24 - 2026-06-25

- 任务卡片与任务详情中的项目、对接人 chip 统一显示 emoji/默认图标，并以实体颜色作为整个标签底色。
- 新建任务与任务详情中的项目、对接人、标签选择面板列表项改为「左侧符号 + 中间文本 + 右侧颜色圆点」布局。
- 重复任务在日程、日、周、月、年五种视图中按规则展开为多个虚拟 occurrence，数据库中仍只保留一条任务。
- 修复任务卡片循环图标后显示 `0` 的问题（`is_subtask` 字段未正确转换为布尔值）。

### v0.5.23 - 2026-06-25

- 任务卡片项目/对接人 chip 改为显示实体自定义 emoji 与颜色底色，标签保持原样；移除标题前的项目/优先级标记。
- 任务卡片标题行增加循环图标，悬浮提示重复规则（如「每周周五」）。
- 修复描述清单复选框在未完成时显示 `0` 的问题。
- 子任务现在会显示在任务列表中；子任务行增加右侧箭头可进入详情，详情顶部新增返回父任务的面包屑。
- 任务详情面板按原型精简：各信息行去除底色，使用分割线分隔；项目/对接人/标签行去掉前置图标。
- 任务详情的项目、对接人、标签选择弹窗改为 fixed 定位，从触发按钮右下角展开，避免被滚动区域截断。
- QuickAddBar 新建任务时支持将提醒与重复参数写入节点和任务。
- 修复按周等重复规则保存不生效的问题，新建/编辑任务均可正常保存重复规则。

### v0.5.22 - 2026-06-25

- 修复编辑清单/标签/对接人时清除图标后仍保留旧图标的问题。
- 第二栏分组圆点位置固定，无数字时仍保持在数字槽左侧，列表垂直对齐。
- 第三栏状态过滤改为「全部/待办/已办」顺序，选中后切换分组不再重置，并使用主题色高亮。
- 任务卡片显示项目/标签/对接人自定义符号与颜色；无项目时以优先级旗帜作为前置标记。
- 第二栏默认宽度加大（240px），详情面板默认宽度同步加大（400px），并新增 `docs/ui-sizing.md` 记录窗口、面板、字号调整位置。
- 按新原型重构任务详情面板：项目、对接人、标签三行展示；标题/描述改为自动换行文本域；描述区支持自由文本与复选框事项混合；子任务与附件简化为「+ 添加」入口；附件以卡片形式展示，支持打开、另存为、删除。
- 任务详情日期显示优化为「今天/明天/后天/周X/下周X/M月d日 周X」，有时间时附加 HH:mm；已设置日期时使用主题色。
- 日期选择器默认选中今天，点击时间时默认取当前时间下一个 30 分钟边界；提醒与重复参数现在会写入节点 `notify_minutes_before` 与任务 `repeat_rule` 字段并生效。

### v0.5.21 - 2026-06-25

- 第二栏分组计数改为显示待办数量（未完成任务），「已完成」「垃圾桶」仍分别显示已完成和已删除数量。
- 清单/标签/对接人子项右侧颜色圆点移至数字左侧，数字居右对齐。
- 新建/编辑清单、标签、对接人的符号选择器扩充为 10 个分类（常用、表情、人物、动物、自然、食物、物体、符号、箭头、旗帜），并在顶部增加随机选择按钮。
- 修复标签编辑时 icon 字段未写入数据库的问题，标签符号现在可正常保存和显示。
- 缩小第二栏分组项与第三栏任务卡片的标题字号，整体更紧凑。

### v0.5.20 - 2026-06-25

- 第二栏（分组面板）左侧内边距加大，避免紧贴第一栏 Rail。
- 第一栏空白区域支持长按鼠标拖动窗体（Tauri drag-region）。
- 第二栏及新建/编辑任务中的清单、对接人下拉仅显示启用且未归档项，归档项自动隐藏。
- 新建任务对话框优化：标签选择面板去除顶部空白；优先级弹出面板增加带颜色旗子图标；对接人选择改为与任务详情一致的多选 chip 风格。
- 修复清单、标签、对接人在编辑/新建时选择的符号（emoji）不生效的问题；项目编辑、对接人新增/编辑均支持保存图标与颜色。
- 在第二栏每个清单/标签/对接人子项右侧增加颜色圆点，直观展示关联颜色。

### v0.5.19 - 2026-06-26

- 修复悬浮球不可见：悬浮球窗口改回 64×64，去除系统边框并按实际 outerSize 贴右下角定位，避免透明小窗口无法渲染或被截断。
- 修复右键托盘「显示/隐藏悬浮球」无效：确保启动时只创建一个悬浮球实例，且位置始终在当前显示器工作区内。
- 悬浮球透明区域设置 `pointer-events-none`，仅圆形区域响应鼠标，避免遮挡桌面操作。
- 新增后端命令 `set_window_borderless`，用于去除悬浮球/贴边面板的系统标题栏与边框。

### v0.5.18 - 2026-06-25

- 主窗口状态持久化：新增 `windowState.ts`，保存并恢复上次关闭时的位置、大小、最大化状态；主窗口默认尺寸改为 1800×950。
- 悬浮球尺寸缩小为 44×44（约原 2/3），移除边框避免上下截断。
- 悬浮球改为自定义 pointer 拖拽实现，避免 Tauri `startDragging()` 在透明窗口留下静止副本的问题。

### v0.5.17 - 2026-06-25

- 对接人改为多选：新增 `ContactChips` 组件，桌面端任务详情、新建工作、移动端任务详情均支持多选对接人。
- 任务卡片与报告展示多个对接人：解析 `contacts_json`，多个对接人按 chip/顿号展示。
- 新建工作紧急度改为带颜色旗子的按钮组，与任务详情保持一致。
- 数据查询一致性：任务按对接人分组、高级搜索、对接人统计与最近任务均通过 `task_contacts` 关联表查询，支持多对接人。

### v0.5.16 - 2026-06-25

- 修复头像点击无菜单：LeftRail 外层容器改为 `overflow-visible` 并提升 `z-index`，避免菜单被父容器 `overflow-hidden` 裁剪。
- 修复悬浮球外部矩形框：DockBallWindow 初始化时同步清除 `#root` 的 `border`，避免默认边框形成矩形外框。

### v0.5.15 - 2026-06-25

- 修复头像菜单点击无效：拖拽区覆盖层排除左侧 LeftRail 区域（从 left-0 改为 left-14），LeftRail 移除所有 drag-region/no-drag 属性。
- 日程视图左侧日期与右侧第一条任务对齐（items-start），不再垂直居中。
- 任务详情第一行水平对齐（完成按钮+日期+旗子），下方加分隔线；描述/标签/子任务/附件各用圆角矩形包裹，底色 #F4F8F7。

### v0.5.14 - 2026-06-25

- 修复头像菜单点击无效：根因是 drag-region CSS 属性优先级问题，改用 inline style 设置 `appRegion: no-drag`。
- 新建任务对接人改为多选复选框模式，支持选择多个对接人。
- 日程视图改为两列布局：左列日期+周几+农历（日期字号增大，垂直居中对齐），右列工作项色条+色块，中间间隔距离。

### v0.5.13 - 2026-06-25

- 修复第一栏按钮未居中和头像菜单点击无效：统一 flex 居中布局，所有按钮显式添加 no-drag。
- 日/周视图工作项对齐到整点小时格：17:30 的任务从 17:00 位置开始，占满一小时格。
- 日程视图 UI 重设计：左侧日期+周几+农历，无竖线圆点，工作项用色条+淡底色色块，字号缩小。
- 数据模型支持多对接人：新增 `task_contacts` 表和 `contacts_json` 查询，`setTaskContacts`/`loadTaskContacts` API。

### v0.5.12 - 2026-06-25

- 修复切换任务分组时清单/对接人消失：移除 TaskListPanel 中覆盖 GroupPanel 数据的 loadContacts/loadProjects 调用。
- 第四栏上边距增大至 40px，不再与悬浮工具栏重叠。
- 新建任务对话框图标全部列出（日期/优先级/标签/对接人/清单/备注），弹窗统一从图标右下角弹出，z-index 提高避免被遮挡。
- 任务详情完成按钮缩小（w-5→w-4）。
- 第一栏宽度从 48px 增至 56px，图标和头像居中。
- 全局主题色：`:root` 定义 primary CSS 变量，按钮/输入框/复选框等统一应用主题色，支持后续换色。

### v0.5.11 - 2026-06-25

- 窗口上边距增大至 32px，顶部空白区域、第一栏空白处、第三栏标题空白处均可长按拖动窗体。
- 周视图日期与农历改为左对齐+右对齐，不再居中合并。
- 月视图"休"角标移至日期数字右上角（而非格子右上角）。
- 所有视图内容字号增大（日期、农历、任务标题、时间等）。
- 四栏布局后三栏添加极浅绿灰色底色区分。

### v0.5.10 - 2026-06-25

- 视图增强：
  - 月视图/周视图日期格显示农历与节日，法定休息日加绿色"休"角标。
  - 年视图字号增大，悬浮有任务日期显示任务标题列表浮层。
  - 日/周/月/日程视图任务项添加可点击复选框快速完成。
  - 日程视图修复时间段任务只显示起始时间的问题。
- 任务详情优化：
  - 左上角添加快捷完成按钮。
  - 右下角三点菜单增加删除任务选项。
  - 右上角优先级图标从棋子改为旗子。
- 窗口标题栏改为悬浮式：四栏内容顶到窗口顶部，最小化/关闭按钮固定在右上角。

### v0.5.9 - 2026-06-24

- 修复 `task_checklist_items` 表缺少 `deleted` 列导致添加任务时报错：新增 migration 035 补充该列。
- 修复时间段任务大多只保存起始时间：DatePickerPopover 进入时间段模式时自动设置默认结束时间，`handleConfirm` 改为只要有 `startTime` 即返回完整范围。
- 时间段同一天结束时间不能早于开始时间：确认时自动校正。
- 修复切换到视图再切回任务后清单/对接人不显示：GroupPanel 的 `useEffect` 增加对 `mainTab` 依赖，切回任务 Tab 时重新加载数据。

### v0.5.8 - 2026-06-24

- 修复时间段任务丢失结束时间：同一天选择时间段时正确保存并返回 `endTime`。
- 修复日视图/周视图任务色块高度溢出底部时间线：限制色块不超过当天 24:00。
- 修复周视图非当前周也显示红色当前时间线：仅在当前周内显示。
- 移动端新建按钮上移，不再压住底部导航栏。

### v0.5.7 - 2026-06-24

- 修复清单/对接人初次打开不显示：登录时自动迁移旧 `local` 用户数据到当前用户 ID，同步完成后刷新分组数据。
- 任务详情时间段显示修复：同一天显示 `M月d日 HH:mm - HH:mm`，跨天显示 `M/d HH:mm - M/d HH:mm`。
- 桌面端第一栏（LeftRail）改用渐变色背景，与移动端标题风格一致。
- 标签支持层级级联：数据模型新增 `parent_id` 字段，GroupPanel 中子标签缩进显示。
- 第二栏重大重新设计：
  - 顶部新增搜索框，可搜索清单/标签/对接人。
  - 常用项动态排序（基于点击次数，存 localStorage）。
  - 新建/编辑统一使用 EntityDialog 圆角弹框，外部渐变阴影。
  - 清单弹框：名称+emoji 图标、颜色选择、建议日期、牵头部门。
  - 标签弹框：名称+emoji 图标、颜色选择、上级标签。
  - 对接人弹框：名称+emoji 图标、部门、联系方式、备注。
  - 右键菜单合并为编辑+归档+删除。
- 五种视图参照滴答清单重新设计：
  - 日程视图：竖向时间轴，任务色块带项目颜色条。
  - 日视图：全任务栏 + 时间轴色块，多任务并排排列。
  - 周视图：7 列时间轴网格，全天任务栏，色块定位。
  - 月视图：日历格内显示任务文字，最多 3 条，点击展开。
  - 年视图：12 月迷你日历，有任务日期点标记。

### v0.5.6 - 2026-06-24

- 修复桌面端清单/标签/对接人初次打开不显示的问题：GroupPanel 挂载时自动加载数据。
- 修复点击「最近7天」跳转到周视图的问题：任务分组不再跳转到视图 Tab。
- 移动端恢复顶部标题栏与同步状态按钮。
- 移动端「我的」页面恢复 v0.5 之前的设置项布局：默认显示菜单列表，精简为 6 项移动端适用设置。
- 日程视图改为竖向时间轴样式：无任务的日期不显示，有任务的日期以时间轴+节点点形式展示。
- 日视图重写：支持任务时间段跨度高展示、同一时间多任务碰撞检测自适应间距、简化色块式任务展示。

### v0.5.5 - 2026-06-24

- 第三栏标题右侧新增「待办/全部/已办」切换按钮，默认显示待办。
- 任务详情日期显示优化：未选具体时间时不显示 00:00，仅显示日期。
- 第二栏分组标题字号增大（10px→12px），折叠箭头图标增大；展开无内容时显示提示文字。
- 修复设置独立窗口未加载认证状态导致账号显示「未登录」的问题。
- 同步设置移除「测试连接」和「IP 直连测试」按钮。

### v0.5.4 - 2026-06-24

- 修复移动端 Release 打包时历史 APK 被删除的问题：将历史备份目录从 Gradle `build/` 目录内移至 `mobile/apk-history/`，避免 Gradle 构建前清理 `build/` 时连带删除历史包。
- 修复 CSS Grid 四栏布局列数不匹配导致任务列表被挤到详情列的问题：为 ResizableSplitter 分配独立的 grid 列。
- 桌面端 UI 优化：
  - 标题栏精简：移除 app 名称与日期显示，高度从 44px 减至 32px，内容区上移。
  - 窗体改为直角，添加浅色轮廓边框。
  - 任务详情面板移除关闭按钮，始终展开显示。
  - 窗体高度不足时各栏独立滚动，不再截断内容。
  - 第二栏分组支持折叠（清单/标签/对接人），移除多余的添加占位符行。
  - 第三栏新建任务输入条图标移至第二行，输入框获得更多空间。
  - 任务卡片复选框按优先级变色（紧急红/高橙/正常蓝/低灰）。
  - 任务卡片标签移至第三行，显示所有标签而非仅首个。
  - 新建任务未选时间时默认 00:00 而非 23:59；选择时间段时正确显示日期范围。
  - 数据模型新增 `nodes.end_time` 字段和 `tags_json` 多标签查询。
  - 日期浮窗弹出位置修正为图标右下方。

### v0.5.2 - 2026-06-23

- 完成 Phase 9 日志 Tab 与旧入口清理：
  - 删除旧版侧边栏 `src/components/layout/Sidebar.tsx`。
  - 删除废弃的顶层视图组件：`InboxView.tsx`、`OverviewView.tsx`、`SettingsView.tsx`、`TodayView.tsx`。
  - 删除仅被旧视图使用的 `src/lib/hooks/useBulkMode.ts`。
  - 从 `appStore` 中移除旧版 `currentView` / `setCurrentView` / `ViewType`，导航统一使用 `mainTab` / `currentTaskGroup` / `currentViewMode` / `selectedTaskId`。
  - 更新 `DockedPanel` 与 `AdvancedSearch` 的任务跳转逻辑，适配新导航模型。
  - 确认「数据」操作（备份/恢复/导入/清空数据库）仅保留在设置窗体的「数据」分类中，任务分组面板不再重复出现。
  - `LogsView` 继续作为「日志」Tab 主内容区（桌面端与移动端）。
- 版本号同步更新为 `0.5.2`。

### v0.5.1 - 2026-06-23

- 完成 Phase 8 移动端适配：
  - 重构底部导航为「任务 / 视图 / 日志 / 我的」四 Tab。
  - 新增任务 Tab 左侧抽屉 `TaskDrawer`，复用桌面端分组结构。
  - 新增 `ViewsTabMobile` + `ViewToolbar`，支持五种视图切换与布局/更多操作。
  - 新增 `QuickAddBarSheet` 与移动端选择器 Sheets，桌面端 `QuickAddBar` 可在移动端复用。
  - 新增 `TaskDetailSheet`，复用 `TaskChecklist` / `TaskTagChips` / `SubtaskList`。
  - 新增 `MobileSettingsView`，在「我的」Tab 内联展示桌面端设置分类。
  - `App.mobile.tsx` 按新四栏结构路由。
- 版本号同步更新为 `0.5.1`。

### v0.5.0 - 2026-06-23

- 启动并完成 v0.5.0 大版本重设计：桌面端界面与交互参考滴答清单重构为四栏布局，导航简化为「任务 / 视图 / 日志」三大 Tab。
- Phase 1 状态层重构：
  - `src/stores/appStore.ts` 新增 `mainTab`、`currentTaskGroup`、`selectedTaskId`、`currentViewMode`、`settingsWindowOpen`、`usersWindowOpen` 及对应 setter。
  - 新增 `src/lib/taskGroup.ts`，定义分组类型与过滤/计数逻辑。
  - `src/lib/types.ts` 扩展 `Task` 类型，新增 `TaskTagAssignment`、`TaskChecklistItem`。
  - `src/lib/migrations.ts` 新增 `032_v0_5_0_task_groups` 迁移，支持多标签、描述清单、子任务与节点时间段。
- Phase 2 四栏布局骨架与设置/用户管理独立窗体：
  - 重构 `src/components/layout/AppLayout.tsx` 为四栏布局：`48px Rail | 200px GroupPanel | flex TaskListPanel | 360px TaskDetailPanel`，支持可拖拽宽度与详情面板折叠。
  - 新增 `LeftRail`、`GroupPanel`、`TaskListPanel`、`TaskDetailPanel`、`ResizableSplitter`。
  - 新增 `SettingsWindow`/`UsersWindow` 独立子窗体；`SettingsLayout` 重构为窗体内部左侧分类 + 右侧内容布局。
  - `src-tauri/tauri.conf.json` 与 `capabilities/default.json` 补充 `settings`/`users` 窗口配置与权限。
- Phase 3 任务分组侧边栏：
  - 新增 `GroupTreeItem`；完善 `GroupPanel` 的时间/清单/标签/对接人分组，支持添加、重命名、改颜色、归档、删除及计数显示。
  - 实现视图 Tab 五种模式与日志 Tab 分组骨架。
- Phase 4 常驻新建任务输入条与日期选择器：
  - 新增 `QuickAddBar`、`DatePickerPopover`、`EntitySelector`、`TagSelector`；支持 NLP 自动解析与搜索不到时直接新建。
- Phase 5 任务列表与详情联动：
  - 重构 `TaskList`、`TaskCard`；新增 `TaskDetail` 及 `TaskDetailHeader`、`TaskChecklist`、`TaskTagChips`、`SubtaskList`、`TaskDetailBottomBar` 等子组件。
  - `taskStore` 新增清单项、子任务、多标签管理方法。
- Phase 7 视图 Tab 五种模式：
  - 新增 `ScheduleView`、`DayView`、`YearView`；复用适配 `WeekView`、`MonthView`。
- Phase 8 移动端适配（v0.5.1 补丁包发布）：
  - 重构底部导航为「任务 / 视图 / 日志 / 我的」四 Tab。
  - 新增 `TaskDrawer`、`ViewsTabMobile` + `ViewToolbar`、`QuickAddBarSheet`、`TaskDetailSheet`、`MobileSettingsView`。
- Phase 9 日志 Tab 与旧入口清理（v0.5.2 补丁包发布）：
  - 删除旧版 `Sidebar.tsx` 及废弃顶层视图组件 `InboxView.tsx`、`OverviewView.tsx`、`SettingsView.tsx`、`TodayView.tsx`。
  - 从 `appStore` 移除旧版 `currentView` / `setCurrentView`，导航统一使用新状态模型。
  - 确认「数据」操作仅保留在设置窗体中，任务分组面板不再重复出现。
- 数据模型扩展：新增 `task_tag_assignments`（多标签）、`task_checklist_items`（描述清单），`tasks` 表扩展 `parent_task_id`（子任务）。
- 输出完整设计文档：`design/v0.5-redesign.md`。

### v0.5.3 - 2026-06-23

- 完成 Phase 11 文档收尾与发布准备：
  - 更新 `design/v2-final-design.md`：在「视图层级与导航结构」章节说明 v0.5.0 已过渡到四栏布局与三 Tab 导航；更新状态 B 与状态 L 描述以匹配新布局/独立设置窗体。
  - 更新 `README.md`：刷新主要功能列表，体现四栏布局、三 Tab、任务详情结构、五种视图模式与移动端变化；合并两个 `v0.5.0` 更新日志条目为完整总结。
  - 更新 `AGENTS.md`：同步目录结构、导航描述、主窗口尺寸与多窗口能力说明，反映四栏布局、三 Tab、设置/用户管理独立窗体。
  - 版本号同步更新为 `0.5.3`。

### v0.4.24 - 2026-06-23

- 修复桌面端从 v0.4.21 开始同步失败的问题：
  - 根因：v0.4.21 修复 `isTauri()` 后，Tauri 环境改为使用 `tauri-plugin-http` 发起请求，该插件底层使用 Windows 系统证书库（Schannel）。服务器当前使用的 Let's Encrypt ECDSA 证书链依赖 `ISRG Root X2`，而 Windows 系统证书库缺少该根证书，导致 TLS 握手失败，报错 `error sending request for url`。
  - v0.4.20 之所以正常，是因为当时 `isTauri()` 判断错误，实际走了 WebView 原生 fetch（Chromium 证书库），绕过了 Windows 系统证书问题。
  - 修复方案：`syncClient.ts` 在 Tauri 环境下优先使用 WebView 原生 fetch；若原生 fetch 失败（如 CSP/CORS 限制），再回退到 `tauri-plugin-http`。这样既恢复 v0.4.20 的行为，又保留兜底能力。
  - 同步更新 `syncClient.test.ts` 单元测试，覆盖 Tauri 优先原生 fetch 与失败回退逻辑。

### v0.4.23 - 2026-06-23

- 增强桌面端同步服务器连接诊断：
  - 后端 `diagnose_sync_connection` 命令支持 `insecure` 参数，可跳过 TLS 证书校验。
  - 设置 → 同步页面新增「IP 直连测试」按钮，自动把域名替换为服务器 IP（123.57.245.69）并跳过证书校验，用于快速判断域名是否被网络中间设备拦截。
  - 保留「测试连接」按钮用于标准域名+证书校验的诊断。

### v0.4.22 - 2026-06-23

- 新增桌面端同步服务器连接诊断能力：
  - 后端新增 `diagnose_sync_connection` 命令，使用原生 reqwest 访问同步服务器并返回详细错误分类（超时、连接失败、TLS 证书等）。
  - 前端同步请求失败时，自动调用诊断命令并将结果写入日志，便于定位 `error sending request for url` 的具体原因。
  - 设置 → 同步页面新增「测试连接」按钮，可主动检测服务器地址的连通性。
- 说明：桌面端生产包使用 Rust 后端发起 HTTPS 请求，对证书要求比浏览器更严格。如果服务端使用自签名证书或中间证书不完整，需要在服务端更换受信任证书，或在客户端系统证书库中信任该证书。

### v0.4.21 - 2026-06-22

- 修复桌面端日志文件仍未生成的问题：
  - 根因是 `src/lib/platform.ts` 的 `isTauri()` 仅检测 `window.__TAURI__`，而 Tauri v2 生产包通过 `globalThis.isTauri` / `window.__TAURI_INTERNALS__` 标识环境，导致生产包中前端误判为浏览器环境，未启用文件日志。
  - 已改为同时检测 `globalThis.isTauri`、`window.__TAURI_INTERNALS__`、`window.__TAURI__`，与 Tauri v2 官方 `isTauri()` 实现保持一致。
  - 同步替换 `src/stores/authStore.ts` 中硬编码的 `win?.__TAURI__` 判断为 `isTauri()`，避免设备信息识别错误。
- 重新打包后，桌面端 `%LOCALAPPDATA%\com.taskchron.app\logs\` 下应能正常生成 `taskchron.log` 和 `taskchron.error.log`。

### v0.4.20 - 2026-06-22

- 修复桌面端日志文件未生成的问题：
  - 将 Tauri 桌面端文件日志目录从 `BaseDirectory.AppLog` 改为 `BaseDirectory.AppLocalData/logs`，对应 Windows 路径 `%LOCALAPPDATA%\com.taskchron.app\logs\`。
  - 该目录普通用户始终可写，避免生产包因 `AppLog` 路径不一致或权限不足导致 `taskchron.log` / `taskchron.error.log` 无法创建。
  - 后端「打开日志文件夹」命令同步改为 `app_local_data_dir()/logs`，前后端日志路径保持一致。
  - 日志初始化时打印完整日志目录，方便用户定位文件。
- 说明：未将日志放在安装根目录 `logs/` 下，因为 Windows 默认安装目录（`Program Files`）普通用户无写入权限，容易导致日志写入失败。

### v0.4.19 - 2026-06-22

- 统一桌面端与移动端头像存储为压缩后的 base64 Data URL：
  - 桌面端选择/裁剪头像后不再保存本地文件路径，改为返回 Data URL。
  - 移动端保持 Data URL 方案。
  - 两端修改的头像通过同步共享后，任意设备都能直接显示，避免本地路径跨设备不可访问。

### v0.4.18 - 2026-06-22

- 为桌面端 Tauri 添加文件日志（参照移动端实现）：
  - `src/lib/logger.ts` 扩展支持 Tauri 桌面端，使用 `BaseDirectory.AppLog` 写入 `taskchron.log` / `taskchron.error.log`。
  - `src/main.tsx` 启动时调用 `initLogger`，确保 boot、同步、网络等日志落盘。
  - 桌面端导出日志使用系统保存对话框，方便用户发送日志文件排查问题。
  - 放宽 `fs:allow-write-text-file` 的 scope 以支持导出到用户选择路径。
- 修复移动端头像在桌面端无法显示的问题：
  - 移动端上传/裁剪头像后不再保存本地 `file://` URI，改为保存压缩后的 base64 Data URL。
  - 桌面端和其他设备通过同步即可直接显示头像，避免跨设备本地路径不可访问。

### v0.4.17 - 2026-06-22

- 修复桌面端打包后同步一直失败的问题：
  - `syncClient.ts` 在 Tauri 桌面端改用 `@tauri-apps/plugin-http` 的 `fetch`，走后端原生 HTTP 请求，避免生产包中 WebView CSP/CORS 对外部 HTTPS 同步服务器的拦截。
  - 移动端与浏览器环境仍使用原生 `fetch`，保持跨平台兼容。
  - 放宽 `src-tauri/capabilities/default.json` 的 HTTP scope，额外允许 `https://*:*` 以适配带非标准端口的同步服务器地址。
- 新增 `syncClient.test.ts` 单元测试，覆盖 Tauri/原生 fetch 切换、Authorization 头、HTTP 错误及附件上传/下载路径。

### v0.4.16 - 2026-06-22

- 移动端底部导航重构：
  - 新建按钮改为右下角悬浮按钮。
  - 原中央新建按钮改为圆形麦克风按钮，长按触发语音识别。
- 新增移动端语音输入流程：长按麦克风 → 实时转写 → 确认后 NLP 解析 → 自动填入快速新建 Sheet。
- 移动端任务卡片支持左滑完成/删除。
- 移动端今日/收件箱/周视图/总览视图支持下拉刷新（同步并刷新本地数据）。
- 新增移动端本地节点提醒通知：
  - 应用启动创建通知渠道并按当前任务列表调度提醒。
  - 任务变化后自动重新调度。
  - 通知设置中新增「本地推送提醒」开关。
  - AndroidManifest 增加 `SCHEDULE_EXACT_ALARM` / `USE_EXACT_ALARM` 权限。

### v0.4.15 - 2026-06-22

- 优化同步服务端头像字段处理：
  - `sanitizeUser` 对超大 base64 Data URL（>300KB）和超长普通路径/URL（>2048 字节）返回 `null`，小尺寸 Data URL 与正常文件路径仍可正常返回。
  - `PATCH /api/v1/auth/me` 限制 `avatar_url` 长度：普通路径最大 8192 字节，压缩后的小尺寸 base64 Data URL 最大 300KB。
  - 清理线上数据库中 1 条超大 base64 头像记录，避免 `/auth/me` 响应被拖慢。
- 修复 `AvatarCropper` 选择照片后一直显示「加载中」的问题：图片元素被错误地条件渲染，导致 `onLoad` 事件永远不会触发。

### v0.4.14 - 2026-06-22

- 修复启动时 `/api/v1/auth/me` 请求慢且重复的问题：
  - `authStore.loadAuthState` 增加全局 in-flight Promise 守卫，React StrictMode 双挂载只发一次请求；旧请求支持通过 `AbortSignal` 取消。
  - 移除移动端 `App.mobile.tsx` 中重复的 `loadAuthState()` 调用，统一由 `AuthGatewayMobile` 加载。
  - 服务端 `sanitizeUser` 对超过 512 字节的 `avatar_url` 返回 `null`，避免历史 base64 Data URL 拖慢 `/auth/me` 响应。
  - 服务端 `PATCH /api/v1/auth/me` 限制 `avatar_url` 最大长度为 4096 字节。

### v0.4.13 - 2026-06-22

- 修复「用户管理」列表被 React StrictMode 取消请求后误报「请求超时」的问题：`requestJson` 现在区分内部超时与外部主动取消，组件卸载/翻页导致的 `AbortError` 不再显示错误提示。

### v0.4.12 - 2026-06-22

- 优化头像加载性能：
  - 新增 `src/components/common/Avatar.tsx` 全局头像组件，配合 `useAvatarDisplayUrl` Hook 与 URL 缓存，减少父组件 re-render 时重复计算。
  - 替换所有头像渲染位置（桌面端/移动端账号页、我的页、侧边栏、登录页、用户管理）。
  - 用户列表头像启用 `loading="lazy"`。
  - 账号页表单仅在切换用户时初始化，避免 `currentUser` 引用变化导致反复重置。
- 修复桌面端日报/周报/月报生成失败：`src/lib/reportMeta.ts` 中 `INSERT OR REPLACE INTO reports` 占位符数量（16）与列数（15）不一致，修正为 15 个占位符。
- 优化桌面端「用户管理」用户列表接口：
  - 客户端 `UsersManagementView` 使用 `AbortController` 取消旧请求，并支持分页翻页。
  - 服务端 `sync-server/src/routes/admin.ts` 为 `/api/v1/admin/users` 增加 `page`/`pageSize` 分页，单条 `avatar_url` 超过 512 字节时返回空，避免大 payload。
  - 服务端新增覆盖索引迁移 `026_users_admin_list_index`（不含 `avatar_url`），并执行 `VACUUM ANALYZE users`。

### v0.4.11 - 2026-06-22

- 修复移动端 `file://` 头像 URI 无法直接预览的问题：通过 `Capacitor.convertFileSrc` 转换为 Webview 可加载地址。
- 移动端「我的」页面用户信息卡片现在会显示当前用户头像。
- 新增头像裁剪组件 `AvatarCropper`：支持拖拽、缩放滑块、鼠标滚轮及双指捏合缩放，并在圆形遮罩内实时预览。
- 新增 `saveAvatarDataUrl` 与 `compressAvatarDataUrl` 工具函数：桌面端写入 Tauri 应用数据目录，移动端写入 Capacitor Data 目录，Web 端直接返回 Data URL；输出头像压缩至 100–200 KB。
- 桌面端与移动端账号资料页均接入圆形头像裁剪流程：选择图片后先裁剪再保存。

### v0.4.10 - 2026-06-22

- 新增通用 `BootProgress` 启动进度组件，替换桌面端与移动端认证网关的静态“加载中…”占位，支持步骤文案与视觉进度条。
- `authStore` 新增 `bootStep` 状态，在登录/启动/同步各阶段显示“正在读取登录状态…”“正在注册设备…”“正在同步任务数据…”等提示。
- 桌面端与移动端入口的懒加载 fallback 统一使用 `BootProgress` 组件。
- 修复同步服务端管理员编辑用户资料接口的 SQL 参数占位符错误（`$$3` → `$3`），并重启同步服务；该错误曾导致服务端崩溃并表现为桌面端「用户管理」保存时连接被拒绝。

### v0.4.9 - 2026-06-22

- 桌面端同步完成后自动刷新当前视图，并在标题栏显示同步状态（同步中/成功/失败）。
- 桌面端「我的」账号安全页面：修改密码默认折叠，点击标题展开。
- 服务端为账号「吴金豪」清理历史重复已注册设备 21 条，保留各平台最新一条；同步服务已重启并应用 `device_uuid` 去重迁移。

### v0.4.8 - 2026-06-22

- 移动端「我的」账号安全页面：编辑资料、修改密码默认折叠，点击标题展开。
- 修复移动端与桌面端同一设备出现多条已注册记录的问题：
  - 新增 `src/lib/deviceId.ts`，按平台生成/获取稳定设备标识：移动端使用 `@capacitor/device` 硬件 ID，桌面端生成 UUID 后持久化到 `app_state`。
  - `DeviceInfo` 增加 `device_uuid` 与 `app_version`，登录注册设备时上传。
  - 同步服务端 `sync-server/src/index.ts` 按 `user_id + device_uuid` 去重，已存在则更新令牌并复用记录。
- 修复已注册设备「最后同步」显示 Invalid Date：
  - 服务端设备列表接口将 `last_sync_at`/`created_at` 显式转换为数字返回。
  - 客户端 `formatTime` 兼容字符串与数字时间戳。
- 优化移动端系统导航栏/状态栏视觉：
  - Android 主题导航栏颜色改为与底部渐变终点一致的 `#0a9b7e`，并关闭导航栏对比度强制蒙层，使系统导航栏与底部 Tab 栏更像一体背景。

### v0.4.7 - 2026-06-22

- 移动端登录页支持「记住密码」和「自动登录」：
  - 启动时自动填充最近登录账号，勾选记住密码后会回填密码。
  - 开启自动登录且已记住密码时，启动后自动执行在线登录。
  - 在 `saved_accounts` 表新增 `auto_login` 字段保存自动登录开关。
- 修复移动端上传本地头像报错 `Cannot read properties of undefined (reading 'invoke')`：
  - 重写 `src/lib/avatar.ts` 的 `pickAvatar()`，按平台分发：桌面端沿用 Tauri 对话框，移动端使用隐藏 `<input type="file">` + `@capacitor/filesystem` 保存到应用数据目录。
  - 同步调整桌面端 `AccountSettings.tsx` 与移动端 `AccountSettingsMobile.tsx` 的调用方式。
- 修复移动端「快速新建」弹窗布局被输入法/状态栏遮挡的问题：
  - 限制弹窗最大高度为 `85vh`，内容区独立滚动，顶部增加 `pt-safe` 避开系统状态栏。
- 修复移动端可搜索选择器（对接人/项目）的搜索结果被底部输入框遮挡的问题：
  - 搜索框固定在弹窗顶部，结果列表在其下方滚动，底部保留安全区内边距。

### v0.4.6 - 2026-06-22

- 同步更新构建命令文档：
  - `README.md` 的「开发命令」章节新增移动端构建命令：`mobile:keystore`、`build:mobile:apk`、`build:mobile:apk:release`。
  - `AGENTS.md` 的「移动端开发与构建」章节新增同样的构建命令说明。

### v0.4.5 - 2026-06-22

- 移动端 Android 打包脚本支持 Release 签名构建：
  - 新增 `scripts/generate-keystore.js`，一键生成测试 Keystore 与密码文件。
  - 修改 `mobile/android/app/build.gradle`，新增 `signingConfigs.release`，支持从环境变量或本地密码文件读取签名信息。
  - 修改 `scripts/build-mobile-android.js`：支持 `--release` 参数，构建 Release 签名 APK；支持命令行参数、环境变量、本地密码文件三种签名配置方式。
  - 新增 npm script：`build:mobile:apk:release` 用于构建 Release 签名 APK，`mobile:keystore` 用于生成测试签名。
  - 更新 `.gitignore`，忽略 `mobile/android/app/keystore/` 目录，避免签名文件误提交。
  - 验证通过：`npm run build:mobile:apk:release` 成功生成签名 APK，`jarsigner` 验证签名有效。

### v0.4.4 - 2026-06-22

- 优化移动端「我的」页面：
  - 移除头像下方的同步状态卡片。
  - 移除底部「导出日志」和「退出登录」按钮。
  - 修复全面屏手势返回会直接退出应用的问题：现在会先返回我的页面主页、再返回今日 Tab，最后才退出。
- 重做移动端「快速新建」中的选择器：
  - 新增通用 `SearchableSelect` 组件：圆角矩形弹框、顶部搜索框、列表按主题色显示、无匹配项时可直接新建。
  - 对接人和项目改为 `SearchableSelect`，支持搜索和新建。
  - 新建对接人弹框增加「部门」和「备注」选填字段。
  - 任务类型按钮行末尾增加「+」按钮，可快速新建类型。
- 在移动端「我的」中新增「数据管理」入口：
  - 支持管理对接人、项目、任务类型。
  - 支持新增、编辑（名称/部门/备注/颜色）、归档/激活、删除操作。
- 扩展 `taskStore.createContact` 签名以支持 remark 字段。

### v0.4.3 - 2026-06-22

- 重构移动端底部导航：移除「收件箱」，调整顺序为「今日」「周视图」「总览」「我的」；中间「+」按钮改为更小巧的正方形。
- 新增移动端「总览」视图（`src/components/mobile/OverviewViewMobile.tsx`）：支持关键词、状态、年份、月份、日期、项目、对接人、类型多维筛选。
- 优化移动端任务卡片（`src/components/mobile/TaskCardMobile.tsx`）：默认显示创建时间，未完成时显示截止时间，完成后显示完成时间，时间信息独立为第三行。
- 逐一实现移动端「我的」页面全部菜单功能：
  - 「账号与安全」：编辑昵称/头像/邮箱/手机号、修改密码、查看并注销已登录设备、退出登录。
  - 「同步设置」：修改同步服务器地址、查看登录与同步状态、手动立即同步。
  - 「外观主题」：切换浅色/深色/跟随系统、自定义主题色、调整字体大小。
  - 「通知设置」：节点提醒提前时间、日报/周报/月报/年报自动发送与发送时间设置、提醒音效开关。
  - 「帮助与反馈」：使用帮助说明、导出日志。
  - 「关于」：版本号、检查更新、打开日志文件夹。
- 在移动端入口 `src/App.mobile.tsx` 中挂载 `GlobalDialog`，确保 `showConfirm`/`showMessage` 弹窗正常显示。

### v0.4.2 - 2026-06-22

- 修复移动端顶部标题栏与系统状态栏重叠的问题：
  - 在 `src/index.css` 中为 `.pt-safe` 增加 `28px` 兜底 padding，避免 Android 部分机型 `env(safe-area-inset-top)` 不生效导致的内容重叠。

### v0.4.1 - 2026-06-22

- 适配全面屏手势返回：
  - 在 `mobile/android/app/src/main/AndroidManifest.xml` 启用 `android:enableOnBackInvokedCallback="true"`，支持 Android 13+ 预测性返回手势。
  - 在 `src/App.mobile.tsx` 监听 `CapacitorApp.backButton` 事件：当快速新建弹窗或任务详情页打开时先关闭它们，否则退出应用。
- 优化移动端任务信息展示与编辑：
  - `src/components/mobile/TaskCardMobile.tsx` 标签行新增任务类型、截止时间（已过期标红）、完成时间（已完成显示）。
  - `src/components/mobile/TaskDetailMobile.tsx` 属性卡片新增「类型」「截止时间/完成时间」「创建时间」；类型和截止时间支持点击「修改」在行内编辑并保存。
  - 修复备注区域多余的冒号显示。
- 调整移动端底部导航：中间「+」按钮从圆形改为圆角矩形，与导航栏风格更统一。
- 优化移动端浏览器预览体验：
  - 修复 `src/lib/platform.ts` 的 `isCapacitor()` 判断：增加 `Capacitor.isNativePlatform()` 校验，避免浏览器扩展注入的 `window.Capacitor` 对象导致误判。
  - 在 `src/App.mobile.tsx` 中浏览器环境下强制跳过 `AuthGatewayMobile`，无需登录即可直接预览主界面。
  - 修复 `src/components/mobile/SyncStatusBar.tsx` 在未同步时文字重叠显示的问题。
- 增强移动端原生状态栏衔接：新增 `src/lib/statusBar.ts`，在 Capacitor 环境调用 `StatusBar.setOverlaysWebView`、`setStyle`、`setBackgroundColor` 实现状态栏透明与内容延伸；安装 `@capacitor/status-bar` 并同步 Android 工程。
- 修复 Android 打包错误：移除 `mobile/android/app/src/main/res/values/styles.xml` 中不兼容的 `android:windowTranslucentStatusBar` / `android:windowTranslucentNavigation` 属性，仅保留透明状态栏/导航栏颜色，由 StatusBar 插件运行时控制内容延伸。
- 更新开发规范（`AGENTS.md`）：明确 `MAJOR`/`MINOR` 版本号由用户控制，`PATCH` 版本号由 Agent 在功能修改后自动递增，并同步更新 `package.json`、`src-tauri/tauri.conf.json`、`mobile/android/app/build.gradle`。

### v0.4.0 - 2026-06-22

- 修复移动端状态栏与输入法体验问题：
  - 状态栏/导航栏颜色改为应用主题色 `#0DBF9C`，减少顶部区域视觉割裂。
  - 在 `AndroidManifest.xml` 中设置 `android:windowSoftInputMode="adjustPan"`，使输入法弹出时覆盖页面底部，不再把整个新建任务页面顶上去。
- 移除启动时自动创建的 `local` 兜底账号：
  - 删除 `src/lib/boot.ts` 中创建并写入 `local` 用户的逻辑；`users` 表与 `app_state` 表仍保留，用于存储已注册的真实账号与应用状态。
  - 数据库迁移仍会按 `_migrations` 记录跳过已应用的迁移，不会重复执行；启动日志中的 `Applied: xxx` 是迁移框架正常遍历输出，不代表每次都会重建表。
- 移动端离线登录改为使用已有账号：
  - `src/stores/authStore.ts` 的 `loginAsLocal` 不再在没有已保存账号时 fallback 到 `LOCAL_USER_ID`。
  - `src/components/mobile/AuthGatewayMobile.tsx` 登录页新增「已保存账号」区域，展示本地已保存账号并支持一键离线登录，避免再出现 `local` 账号与注册账号数据分离的问题。
- 桌面端与移动端注册必须验证邮箱验证码：
  - 后端 `sync-server/src/routes/auth.ts` 的 `POST /api/v1/auth/register` 改为要求 `email` 与 `email_code`，并校验 `email_verification_codes` 表中未过期未使用的验证码。
  - 桌面端 `src/components/auth/LoginPage.tsx` 注册模式下新增「邮箱（必填）」与「邮箱验证码」输入，支持点击发送验证码与 60 秒倒计时。
  - 移动端 `src/components/mobile/AuthGatewayMobile.tsx` 新增注册模式，同样要求用户名、密码、邮箱与邮箱验证码。
  - `src/lib/syncClient.ts` 的 `RegisterData` 与 `src/stores/authStore.ts` 的 `register` 方法同步增加 `email_code` 字段。
- 重新构建 Android Debug APK（构建环境需安装 JDK 17+）：`mobile/android/app/build/outputs/apk/debug/时记-v0.4.1-debug.apk`。

### v0.4.0 - 2026-06-22

- 移动端任务详情新增附件列表与按需下载：
  - `src/components/mobile/TaskDetailMobile.tsx` 在备注下方新增「附件」区域，展示该任务的附件文件名与大小。
  - 同步时默认只同步附件记录，不自动下载附件文件，避免之前因文件读写导致的卡顿。
  - 点击附件时调用 `src/lib/attachments.ts` 新增的 `downloadAttachmentOnDemand()` 手动下载到本地，下载完成后弹出保存路径提示。
- 清理数据库迁移脚本，消除启动时 `duplicate column name` 报错：
  - 删除 `025_sync_schema_alignment` 中重复的 `ALTER TABLE ... ADD COLUMN user_id` 语句（这些列已在 `019_add_user_id_columns` 中添加）。
  - 删除整个 `027_contacts_linked_user_id` 迁移（`linked_user_id` 已在 `025` 中添加）。
- 彻底修复移动端同步卡顿与报错问题：
  - **问题 1**：`[db] 更新同步元数据失败`——每次数据库写操作后都会调用 Tauri 桌面端专属命令 `update_sync_metadata`，移动端没有该命令导致报错。已增加平台判断，仅桌面端调用。
  - **问题 2**：`[global] 未处理的 Promise 拒绝: {"code":"UNIMPLEMENTED"}` 与 `[syncEngine] 附件文件同步失败`——移动端从云端同步下来的附件记录本地无文件，调用 Capacitor Filesystem 读取/上传时触发兼容性问题并挂起 15 秒。已增加平台判断，移动端直接跳过附件文件同步，改为任务详情页按需下载。
  - 修复后移动端同步应在 1～2 秒内完成，右上角不再长时间显示「同步中」。
- 移动端日志时间戳改为本地时间：格式从 `2026-06-22T02:34:11.105Z` 调整为 `2026-06-22 10:34:11.105`。
- 修复移动端 Android 应用图标显示为灰色团块的问题：删除自适应图标配置，统一使用主题色背景 + 时钟 logo 的普通图标。
- 修复移动端日志导出问题并自动分离错误日志：正常日志写入 `taskchron.log`，warn/error 同时写入 `taskchron.error.log`。
- 重新构建 Android Debug APK：`mobile/android/app/build/outputs/apk/debug/时记-v0.4.0-debug.apk`。

### v0.4.0 - 2026-06-22

- 修复移动端 Android 应用图标显示为灰色团块的问题：
  - 新增 `scripts/generate-android-icons.py`，基于项目根目录 `icon.png` 重新生成全部 `mipmap-*` 图标与自适应图标前景。
  - 将普通图标背景与自适应图标背景色统一为应用主题色 `#0DBF9C`，避免白色表盘 logo 与白色背景融合导致看不清。
  - 重新生成 `ic_launcher.png`、`ic_launcher_round.png`、`ic_launcher_foreground.png`。
- 重新构建 Android Debug APK：`mobile/android/app/build/outputs/apk/debug/时记-v0.4.0-debug.apk`。

### v0.4.0 - 2026-06-22

- 修复移动端同步卡在「同步中」的问题：
  - 定位根因：主同步流程正常，但附件同步阶段因 `CapacitorAttachmentsAdapter.toRelativePath` 路径解析错误导致文件操作异常，同时 Android WebView 中 `new File([bytes], name)` 存在兼容性风险，使整个同步挂起约 76 秒才超时返回。
  - 重写 `src/lib/attachmentsAdapter.ts` 的 `getDirectory()` 与 `toRelativePath()`，统一使用基于 `Directory.Data` 的相对路径 `attachments/...`。
  - 附件上传改为使用 `Blob` 替代 `File` 构造函数，`src/lib/syncClient.ts` 的 `uploadAttachment` 参数改为 `Blob` 并显式传递 `fileName`。
  - 在 `src/lib/attachments.ts` 的 `syncPendingAttachments` 中增加路径解析、文件存在性检查等细粒度日志。
- 重新构建 Android Debug APK：`mobile/android/app/build/outputs/apk/debug/时记-v0.4.0-debug.apk`。

### v0.4.0 - 2026-06-22

- 新增移动端本地日志模块 `src/lib/logger.ts`：运行时自动把所有 `console` 输出、未捕获异常、未处理 Promise 拒绝写入应用私有目录 `logs/taskchron.log`，支持 1MB 自动轮转和最多 5 个历史文件备份。
- 在 `src/main.mobile.tsx` 启动最早期初始化日志模块，确保启动引导、同步、主题初始化等阶段的报错都能被记录。
- 移动端「我的」页面新增「导出日志」按钮：点击后将日志保存为 `Documents/TaskChron/taskchron_logs_时间戳.txt`（失败时回退到应用外部私有目录），方便用户直接通过微信/邮件发送日志文件，无需开启 USB 调试或 adb。
- 重新构建 Android Debug APK：`mobile/android/app/build/outputs/apk/debug/时记-v0.4.0-debug.apk`。

### v0.4.0 - 2026-06-22

- 移动端同步流程增强可观测性：在 `src/lib/syncClient.ts`、`src/lib/syncEngine.ts`、`src/lib/attachments.ts`、`src/stores/authStore.ts` 的关键节点增加结构化日志，便于真机问题定位。
- 为移动端同步请求与附件上传/下载增加超时控制：`syncClient` 单次请求 20 秒超时，`syncEngine` 整体同步 30 秒超时，附件同步 15 秒超时，避免无限等待。
- 修复移动端构建 TypeScript 错误：`src/lib/syncEngine.ts` 中日志误用 `config.table`，已修正为 `config.name`。
- 重新构建 Android Debug APK：`mobile/android/app/build/outputs/apk/debug/时记-v0.4.0-debug.apk`。

### v0.4.0 - 2026-06-21

- 修复 Android 端 Capacitor SQLite 初始化错误 `CapacitorSQLite.then() is not implemented on android`：重构 `src/lib/dbAdapter.ts`，移除异步 `getPlugin()` 包装，直接同步引用 `CapacitorSQLite` 实例，避免插件 Proxy 被当作 thenable 调用。
- 修复首次启动离线登录失败问题：增强 `src/stores/authStore.ts` 中 `loginOffline`，当 `saved_accounts` 表为空时允许从 `users` 表读取本地用户；`loginAsLocal` 在无保存账号时直接以 `LOCAL_USER_ID` 离线登录。
- 完成 TaskChron Mobile Android 模拟器真机级测试：在 Pixel 7 / Android 15 模拟器中验证离线登录、任务创建、任务完成、收件箱/周视图/我的页面切换等核心流程，测试报告见 `docs/android-emulator-test-report-2026-06-21.md`。
- 修复移动端底部「+」按钮位置与新建弹窗透明问题：将 `src/components/mobile/BottomTabBar.tsx` 中快速新建按钮移至底部导航正中间；在 `src/index.css` 补充 `background`/`foreground`/`card`/`muted`/`border` 等 shadcn 基础 CSS 变量，使 `bg-background`/`bg-card`/`border-border` 在移动端正常生效，解决 `QuickAddSheet` 背景透明问题。
- 补齐移动端快速新建任务字段：在 `src/components/mobile/QuickAddSheet.tsx` 中参照桌面端新增「任务类型」横向单选按钮组、「对接人」下拉选择（支持行内新建对接人）、「节点类型」下拉选择（截止/里程碑/提醒），保存时正确透传 `typeId`/`contactId`/`nodeType`。

### v0.3.0 - 2026-06-20

- 简化登录方式并新增邮箱验证码登录：隐藏 `src/components/auth/LoginPage.tsx` 中的微信、企业微信、短信验证码登录入口，仅保留「账号密码」与「邮箱验证码」两种 Tab；`src/lib/syncClient.ts` 新增 `sendEmailCode` 与 `loginByEmail` API；后端 `sync-server/src/routes/oauth.ts` 新增基于 `nodemailer` 的邮件验证码发送与校验逻辑，未配置 SMTP 时接口返回 `SMTP not configured`；`sync-server/src/migrations.ts` 新增迁移 `024_email_verification` 创建 `email_verification_codes` 表。微信/企业微信/短信登录后端代码保留但不推荐启用。
- 修复同步时报错「table projects has no column named description」：对比后端 PostgreSQL schema 与前端 SQLite schema，发现前端大量业务表缺少同步所需的列。新增迁移 `025_sync_schema_alignment`，为 `projects`、`contacts`、`task_types`、`tasks`、`nodes`、`task_templates`、`activity_logs`、`voice_records`、`task_attachments` 及四张报告表补齐 `description`、`icon`、`sort_order`、`external_id`、`deleted`、`user_id` 等缺失列；同步更新 `src/lib/types.ts` 中所有实体类型；`src/lib/syncEngine.ts` 扩展软删除识别与处理逻辑，覆盖全部具备 `deleted` 列的表；`src/stores/taskStore.ts` 中项目、对接人、任务类型、模板、语音记录等查询增加 `deleted = 0 OR deleted IS NULL` 过滤，避免同步下来的已删除记录显示在界面中；同步更新 `src/stores/__tests__/taskStore.test.ts` 中的 SQL 断言。
- 修复设置页「登录账号」按钮点击无反应：修改 `src/components/auth/AuthGateway.tsx`，引入 `useAppStore` 监听 `loginPageOpen` 状态；当设置页点击「登录账号」触发 `openLoginPage()` 后，即使当前已有用户登录，网关也会强制渲染 `LoginPage`，登录成功后再通过 `onLogin` 回调关闭登录页。未登录时行为保持不变。
- 登录页支持账号历史下拉选择与记住密码：新增 `saved_accounts` 表（迁移 `026_saved_accounts`）和 `src/lib/accountMemory.ts`；`src/stores/authStore.ts` 在登录/注册成功后将账号信息写入本地，并可选保存 Base64 编码密码；`src/components/auth/LoginPage.tsx` 增加账号下拉框，选择后自动填充用户名、密码和服务器地址。
- 登录页 UI 改造：右下角显示应用版本号，点击「服务器」按钮弹出同步服务器设置弹窗，默认不再直接显示服务器地址输入框。
- 离线模式改造：离线不再使用 `local` 兜底账号，而是允许选择已注册并保存在本地的账号进行离线登录；`authStore` 新增 `isOffline` 状态和 `loginOffline(userId)` 方法；离线时仍按该账号 `user_id` 读写本地 SQLite，同步按钮禁用并提示离线中；`AccountSettings.tsx` 和 `SyncSettings.tsx` 同步显示在线/离线状态。
- 新增数据架构说明文档 `docs/sync-data-architecture.md`，梳理本地 SQLite、云端 PostgreSQL、同步协议、数据流及当前边界注意事项。
- 修复 Tauri 桌面环境中 `window.confirm` 不可用导致的退出登录/注销设备报错：在 `src/components/settings/AccountSettings.tsx` 中改用 `@tauri-apps/plugin-dialog` 的 `confirm` API。
- 账号资料头像改为本地上传：新增 `src/lib/avatar.ts` 提供 `pickAvatar`、`saveAvatarToApp`、`getAvatarDisplayUrl`；`src/components/settings/AccountSettings.tsx` 中编辑资料表单删除「头像 URL」输入框，改为可点击头像区域 +「上传本地头像」按钮；选择图片后自动复制到应用数据目录 `avatars/` 下并生成唯一文件名，显示时使用 `convertFileSrc` 转换为可访问 URL。
- 修复同步时报错「table contacts has no column named linked_user_id」：在迁移 `025_sync_schema_alignment` 中为 `contacts` 表补回 `linked_user_id` 列，并同步更新 `src/lib/types.ts` 中的 `Contact` 类型；后续又新增迁移 `027_contacts_linked_user_id`，确保已应用过 `025` 的本地数据库也能补齐该列。
- 部署后端邮箱验证码登录：将 `sync-server` 最新代码、`package.json`、`package-lock.json` 同步到云服务器 `/home/taskchron/taskchron-server/`，安装 `nodemailer` 依赖，执行 `npm run build`，通过 `systemctl restart taskchron-sync.service` 重启服务，数据库迁移 `024_email_verification` 已成功应用；后续在服务器 `.env` 中配置 QQ 邮箱 SMTP 参数并重启服务，调用 `POST /api/v1/auth/email/send` 接口返回 `success: true`，邮件验证码发送正常。
- 改造应用启动流程为「先登录后进入主界面」：新增 `src/components/auth/AuthGateway.tsx` 作为身份网关，`src/App.tsx` 直接渲染网关；`src/lib/boot.ts` 不再自动将 `current_user_id` 设为本地离线账号；未登录时显示登录页，离线使用也需显式选择本地账号，确保任何数据操作都有明确的 `user_id` 归属。
- 登录方式扩展：在 `src/components/auth/LoginPage.tsx` 中增加微信登录、企业微信登录、手机验证码登录三种方式；`src/lib/syncClient.ts` 新增对应 API；后端 `sync-server/src/routes/oauth.ts` 实现微信/企业微信扫码登录轮询与短信验证码登录接口；`sync-server/src/migrations.ts` 新增迁移 `023_oauth_and_sms` 创建 `user_oauth_bindings`、`sms_verification_codes`、`oauth_login_states` 表。
- 用户信息完善：`src/components/settings/AccountSettings.tsx` 新增可折叠「编辑资料」表单，支持修改昵称、头像 URL、邮箱、手机号；后端 `sync-server/src/routes/auth.ts` 新增 `PATCH /api/v1/auth/me`；`src/lib/types.ts` 与 `src/stores/authStore.ts` 同步支持 `phone` 字段读写。
- 全面修复前后端同步一致性问题：
  - 前端 SQLite 为 `projects`、`contacts`、`task_types`、`nodes`、`task_templates`、`activity_logs`、`voice_records`、`task_attachments` 添加 `updated_at` 列（迁移 `022_add_updated_at_columns`），并同步更新 `src/lib/types.ts` 中相关类型。
  - 前端 `src/lib/syncEngine.ts` 将上述表的 `timestampColumn` 从 `created_at` 改为 `updated_at`，与后端保持一致，确保修改后的记录能被正确同步。
  - 前端 `src/stores/taskStore.ts` 及 `src/lib/activityLog.ts`、`src/lib/attachments.ts` 在上述表的 INSERT/UPDATE 操作中补充 `updated_at`，避免首次创建或后续修改同步到服务端时缺少 `updated_at`。
  - 后端 `sync-server/src/sync.ts` 在 `buildUpsertSql` 中处理 `updates` 为空字符串的边界情况，避免所有列均为主键时生成非法 SQL；同时限制 `created_at` 自动填充仅在表存在该列时执行。
  - 已部署到云服务器并验证：注册、登录、设备注册、推送 `projects`/`contacts`/`nodes` 变更、拉取变更均正常，`npm test` 73 个测试全部通过。
- 修复同步服务端（`sync-server`）同步失败问题（参数数量不匹配）：在 `sync.ts` 的 `applyChange` 中修正 `existingParams` 组装逻辑，`user_settings` 表主键已包含 `user_id` 不再重复附加，避免查询时出现 `bind message supplies 3 parameters, but prepared statement requires 2` 错误，解决点击同步按钮提示 `HTTP 500 Sync failed` 的问题。
- 修复同步服务端（`sync-server`）同步失败问题（缺失列）：在 `sync.ts` 的 `applyChange` 中，根据表实际列动态决定是否查询 `created_at`，避免对没有该列的 `user_settings` 等表查询时报 `column \"created_at\" does not exist` 错误，解决登录后首次同步提示 `Sync failed` 的问题。
- 修复同步服务端（`sync-server`）设备注册接口路径不一致的问题：将后端路由由 `POST /api/v1/devices/register` 改为 `POST /api/v1/devices`，与前端 `syncClient.registerDevice` 及 RESTful 设计保持一致，解决注册成功后调用设备注册返回 `Cannot POST /api/v1/devices` 404 错误的问题。
- 修复同步服务端（`sync-server`）CORS 跨域问题：为 Express 引入 `cors` 中间件，默认允许 `http://localhost:5173` 来源，支持通过 `CORS_ORIGINS` 环境变量配置多个允许来源，解决前端在 Vite 开发环境下调用注册接口 `POST /api/v1/auth/register` 被浏览器 CORS 策略拦截的问题。
- 修复启动时 `no such table: app_state` 导致白屏（仅显示标题栏无内容）的问题：将 `main.tsx` 中的启动顺序由「先 `initTheme` 后 `bootApp`」调整为「先 `bootApp` 再 `initTheme`」，因为 `initTheme` 需读取 `user_settings`/`app_state`，而这些表由 `bootApp` 的 `ensureMinimalSchema` 创建；同时对 `initTheme` 包裹 try/catch，避免主题初始化失败再次导致 React 不渲染。
- 修复 Rust 后端 reminder 服务在 `user_id` 列补齐逻辑中的类型解码错误：将 `PRAGMA table_info` 改为使用参数化查询 `SELECT name FROM pragma_table_info(?) WHERE name = ?`，避免 `cid` INTEGER 列被错误解码为 `String`，确保启动时能正确检测并补齐缺失的 `user_id` 列。
- 端到端测试验证通过：`npm run lint`、`npm run format:check`、`npm test`、`npm run build`、`cargo test`、`cargo check` 均通过；`npm run tauri dev` 启动后 reminder 服务成功为 projects/contacts/tasks/nodes 等表添加 `user_id` 列，控制台不再出现 `no such column: nodes.user_id` 错误。
- 新增用户权限管理功能：后端 `sync-server/src/routes/admin.ts` 提供 `GET /api/v1/admin/users`、`PATCH /api/v1/admin/users/:id/role`、`PATCH /api/v1/admin/users/:id/status`，并在 `sync-server/src/index.ts` 挂载 `/api/v1/admin` 路由，仅管理员可调用；前端新增 `src/components/views/UsersManagementView.tsx`，管理员可在侧栏「用户管理」查看所有同步账号、切换角色（普通用户/管理员）及启用/禁用账号；`src/lib/syncClient.ts` 同步增加 `adminListUsers`、`adminUpdateRole`、`adminUpdateStatus` API；`src/components/layout/AppLayout.tsx` 注册 `users` 视图入口。
- 完善侧栏用户菜单：`src/components/layout/Sidebar.tsx` 顶部显示当前用户头像、昵称与用户名，点击展开下拉菜单，支持「编辑资料」（跳转设置-账号）和「退出登录」；管理员账号额外在导航中显示「用户管理」入口。
- 部署后端用户管理并提升管理员：将 `sync-server` 最新代码同步到云服务器 `/home/taskchron/taskchron-server/`，通过 `systemctl restart taskchron-sync.service` 重启服务；数据库中将「吴金豪」账号的 `role` 更新为 `admin`、`is_admin` 更新为 `TRUE`。
- 修复侧栏用户头像下拉菜单影响布局的问题：`src/components/layout/Sidebar.tsx` 将菜单改为 `absolute` 定位浮层，脱离文档流，不再撑开导航列表。
- 在设置面板中新增「用户管理」Tab：`src/components/views/SettingsView.tsx` 中仅管理员可见「用户管理」Tab，点击后直接渲染 `UsersManagementView`；同时侧栏「用户管理」入口继续保留。
- 修复本地用户角色未持久化导致管理员入口不显示的问题：启动时若存在 `session_token`，`src/stores/authStore.ts` 调用 `getCurrentUser` 从服务端刷新用户信息（含 `role`）并设置到内存状态，无需重新登录即可同步管理员权限。
- 角色权限改为仅通过在线接口获取，不在本地 SQLite 中保存：`src/stores/authStore.ts` 的 `loadUserById`、`saveUser` 不再读写 `role` 字段；`src/lib/migrations.ts` 移除 `028_add_users_role` 迁移，避免本地 `users` 表出现 `role` 列；离线模式下本地缓存的用户对象不含 `role`，不会展示管理员入口，防止本地 SQLite 被篡改后获得管理员权限。
- 改造用户管理页面：`src/components/views/UsersManagementView.tsx` 表格仅展示「用户」「联系方式（电话）」「邮箱」「状态」「最后活跃时间」及「操作」列；移除原有的角色/状态下拉直接编辑，改为每行「编辑」「删除」按钮；点击编辑弹出表单，可修改电话、邮箱、状态、角色；点击删除需二次确认，且禁止删除当前登录账号；删除确认改用 `@tauri-apps/plugin-dialog` 的 `confirm` API，修复 Tauri 桌面端 `window.confirm` 报 `dialog.confirm not allowed` 错误的问题。
- 后端新增管理员编辑/删除用户接口：`sync-server/src/routes/admin.ts` 增加 `PATCH /api/v1/admin/users/:id`（支持修改 phone/email/status/role）和 `DELETE /api/v1/admin/users/:id`（禁止删除自己）；`src/lib/syncClient.ts` 同步增加 `adminUpdateUser`、`adminDeleteUser`。
- 部署更新后的用户管理后端到云服务器，重启 `taskchron-sync.service` 后服务正常运行。
- 新增项目风格自定义弹窗组件：`src/components/ui/GlobalDialog.tsx` 提供圆角卡片、主题色按钮、深色/浅色适配的提示/确认弹窗；`src/stores/dialogStore.ts` 管理弹窗状态并支持 Promise 式调用；`src/App.tsx` 全局挂载 `GlobalDialog`。
- 重写 `src/lib/dialog.ts`：所有 `showConfirm` / `showMessage` 统一渲染项目风格自定义弹窗，不再调用操作系统原生弹窗；文件选择（open/save）仍使用 `@tauri-apps/plugin-dialog` 原生能力。
- 将前端所有 `alert(...)`、`window.confirm(...)`、`confirm(...)` 调用替换为 `showMessage`/`showConfirm`；涉及 `AppLayout.tsx`、`AdvancedSearch.tsx`、`AboutSettings.tsx`、`AccountSettings.tsx`、`DataSettings.tsx`、`ExportSettings.tsx`、`GeneralSettings.tsx`、`PushSettings.tsx`、`SettingsFloatingToolbar.tsx`、`VoiceHistory.tsx`、`BulkActionBar.tsx`、`TaskCard.tsx`、`TaskDetailDialog.tsx`、`WeekView.tsx`、`taskStore.ts` 等文件。
- 调整主窗体高度为 800px：`src-tauri/tauri.conf.json` 将主窗口 `height` 从 `540` 改为 `800`；`src/components/layout/AppLayout.tsx` 与 `src/stores/appStore.ts` 中恢复主窗口大小的逻辑同步调整为 `1050×800`，保持与配置文件一致。
- 修复用户管理「最后活跃时间」显示 `NaN`：`sync-server/src/routes/admin.ts` 在返回用户列表前将 PostgreSQL 的 `bigint` 字段（`created_at`/`updated_at`/`last_login_at`/`last_active_at`）统一转换为数字；`src/components/views/UsersManagementView.tsx` 的 `formatTime` 同时兼容字符串与数字时间戳并增加有效性校验；`src/lib/syncClient.ts` 的 `AdminUser` 类型允许时间戳字段为 `number | string`。
- 修复同步引擎缺少 `user_id` 过滤的问题：`src/lib/syncEngine.ts` 的 `collectChangesForTable` 在收集本地变更时按当前 `user_id` 过滤，避免多账号本地数据被跨账号推送到云端。
- 修复非 `tasks` 表删除无法同步的问题：`projects`/`contacts`/`nodes`/`task_types`/`task_templates`/`voice_records`/`task_attachments` 的本地删除改为软删除（`deleted = 1`），查询统一增加 `deleted = 0` 过滤；同步服务端表结构已包含 `deleted` 列，删除操作可正常同步。
- 修复报告同步表 mismatch 的问题：新增迁移 `029_merge_reports_to_single_table`，将本地 `daily_reports`/`weekly_reports`/`monthly_reports`/`yearly_reports` 合并为统一 `reports` 表；`src/lib/reportMeta.ts` 改为读写 `reports` 表，与服务端 `reports` 表保持一致。
- 修复附件文件不同步的问题：`src/lib/attachments.ts` 新增 `syncPendingAttachments` 与 `downloadMissingAttachments`，在线创建附件时立即上传，每次同步完成后双向补齐；同步服务端附件上传接口不再覆盖 `storage_path`。
- 优化 `last_sync_at` 重置逻辑：`src/stores/authStore.ts` 的 `loginOffline` 与 `switchUser` 不再重置 `last_sync_at`，退出登录后仍重置，避免离线恢复在线后触发全量重推。
- 新增自动同步机制：`src/stores/authStore.ts` 在 `loadAuthState` 完成且在线时自动同步一次；`src/App.tsx` 监听主窗口聚焦事件，30 秒节流自动触发同步。


### v0.4.0 - 2026-06-20

- 初始化 Capacitor 移动端工程：新增 `mobile/` 目录与 Android/iOS 平台，配置 `mobile/capacitor.config.ts`、权限与启动屏，支持 `npm run build:mobile` 构建移动端产物到 `dist/mobile`。
- 新增移动端专属入口与组件：`src/main.mobile.tsx`、`src/App.mobile.tsx` 及 `src/components/mobile/` 下的今日/收件箱/周视图/我的/任务详情/快速新建/登录等组件，实现底部 Tab 导航与触控交互。
- 抽象跨平台数据层：新增 `src/lib/dbAdapter.ts` 与 `src/lib/attachmentsAdapter.ts`，将桌面端 Tauri SQLite/FS 与移动端 Capacitor 实现隔离；改造 `src/lib/db.ts`、`src/lib/attachments.ts`、`src/lib/boot.ts` 支持适配器注入，桌面端默认行为保持不变。
- 移动端复用桌面端业务逻辑：通过 `src/lib/mobileBoot.ts` 注入 Capacitor 适配器，复用 `bootApp()`、迁移、Zustand stores 与同步引擎；`src/stores/authStore.ts` 的 `getDeviceInfo()` 改为异步并识别 Capacitor 平台。
- 新增迁移 `030_mobile_settings_defaults`，为移动端写入默认同步/通知设置项。
- 更新 `vite.config.ts` 支持多入口构建，新增 `index.mobile.html`；更新 `tsconfig.node.json` 包含 `mobile/capacitor.config.ts`；将 `mobile/` 原生工程产物加入 `.prettierignore`。
- 前端版本号与 Tauri 应用版本号同步升级至 `v0.4.0`。
- 修复同步引擎缺少 `user_id` 过滤的问题：`src/lib/syncEngine.ts` 的 `collectChangesForTable` 在收集本地变更时按当前 `user_id` 过滤，避免多账号本地数据被跨账号推送到云端。
- 修复非 `tasks` 表删除无法同步的问题：`projects`/`contacts`/`nodes`/`task_types`/`task_templates`/`voice_records`/`task_attachments` 的本地删除改为软删除（`deleted = 1`），查询统一增加 `deleted = 0` 过滤；同步服务端表结构已包含 `deleted` 列，删除操作可正常同步。
- 修复报告同步表 mismatch 的问题：新增迁移 `029_merge_reports_to_single_table`，将本地 `daily_reports`/`weekly_reports`/`monthly_reports`/`yearly_reports` 合并为统一 `reports` 表；`src/lib/reportMeta.ts` 改为读写 `reports` 表，与服务端 `reports` 表保持一致。
- 修复附件文件不同步的问题：`src/lib/attachments.ts` 新增 `syncPendingAttachments` 与 `downloadMissingAttachments`，在线创建附件时立即上传，每次同步完成后双向补齐；同步服务端附件上传接口不再覆盖 `storage_path`。
- 优化 `last_sync_at` 重置逻辑：`src/stores/authStore.ts` 的 `loginOffline` 与 `switchUser` 不再重置 `last_sync_at`，退出登录后仍重置，避免离线恢复在线后触发全量重推。
- 新增自动同步机制：`src/stores/authStore.ts` 在 `loadAuthState` 完成且在线时自动同步一次；`src/App.tsx` 监听主窗口聚焦事件，30 秒节流自动触发同步。


### v0.3.0 - 2026-06-18

- 新增桌面端同步客户端（`src/lib/syncClient.ts`）：封装注册、登录、设备注册、增量同步、附件上传/下载、获取当前用户、登出等 API，默认服务端地址为 `https://sync.xiaochengcheng.com.cn:8443`，支持通过 `app_state.server_url` 自定义。
- 新增桌面端同步引擎（`src/lib/syncEngine.ts`）：实现 `performSync`、`getLastSyncAt`、`setLastSyncAt`，按 `updated_at`/`created_at` 收集本地变更，调用服务端同步接口，将服务端变更以 upsert 方式写回本地 SQLite，并处理 contacts 的 `owner_user_id` 字段映射与复合主键表（`user_settings`、`task_tags`）。
- 调整 `src/stores/authStore.ts` 以适配新的 `syncClient`/`syncEngine` API，注册/登录时自动写入 `server_url` 并构造设备信息。
- 新增账号设置页面（`src/components/settings/AccountSettings.tsx`）：展示当前登录用户信息、修改密码表单、退出登录按钮及已注册设备列表，支持注销设备。
- 新增同步设置页面（`src/components/settings/SyncSettings.tsx`）：展示并修改同步服务器地址、登录状态、上次同步时间，提供手动同步按钮与同步状态（idle/syncing/success/error）显示。
- 在设置面板（`src/components/views/SettingsView.tsx`）中新增「账号」与「同步」Tab，并导出对应组件。
- 前端版本号与 Tauri 应用版本号同步升级至 `v0.3.0`。
- 改造 `src/stores/taskStore.ts` 实现多账号数据隔离：所有业务表（projects、contacts、tasks、nodes、task_templates、activity_logs、voice_records、task_attachments、task_types、reports）查询与写入均按当前 `user_id` 过滤/填充；同步更新 `src/lib/activityLog.ts` 与 `src/lib/attachments.ts` 以支持 `user_id` 作用域；补充并调整 `src/stores/__tests__/taskStore.test.ts` 单元测试。

### v0.2.0 - 2026-06-18

- 新增账号状态管理 Zustand store（`src/stores/authStore.ts`），支持登录、注册、退出、切换用户、持久化到 `app_state` 表及同步状态管理。
- 新增登录/注册页面组件（`src/components/auth/LoginPage.tsx`），包含用户名、密码、邮箱（注册模式）、同步服务器地址输入与登录/注册切换。
- 在 `src/lib/types.ts` 中补充 `User` 用户类型，为多账号同步提供类型基础。
- 新增 TaskChron 自托管同步服务端（`sync-server/`），支持设备注册、基于 `updated_at` 的增量同步、附件上传/下载。
- 完成云服务器基础安全加固：禁用 root 密码登录、启用 SSH 密钥登录、配置 UFW 防火墙、Fail2ban、Docker、Node.js 运行时环境。
- 完成同步服务生产部署：使用 systemd 托管，绑定域名 `sync.xiaochengcheng.com.cn:8443`，通过 Let's Encrypt 正式证书提供 HTTPS。
- 验证同步服务健康检查、设备注册、任务同步 API 可正常访问。
- 新增并完善多账号同步系统改造方案（`design/multi-account-sync-design.md`），包含完整数据模型、双 Token 认证体系、服务端/桌面端/移动端分阶段实施路线图、配置说明、部署运维和测试清单。

### v0.1.1 - 2026-06-18

- 新增移动端互通设计方案文档（`design/mobile-sync-proposal.md`），规划 Capacitor 移动伴侣应用与分阶段同步演进路线。

### v0.1.0 - 2026-06-18

- 优化 AI 设置中的模型列表：默认折叠为一行，仅显示模型名称、启用开关和删除按钮；点击编辑按钮展开后显示全部参数，新增模型默认展开。
- 调整今日视图任务范围：从仅显示当天创建的任务，改为显示截止到当天还未完成的任务（含历史未完成），并保留当天已完成的任务显示。
- 修复设置中打开数据同步目录报 `forbidden path` 的问题：扩展 Tauri `fs` 权限 scope 至 `**`，允许访问 OneDrive、WPS 云盘等任意本地同步路径，并同步更新 `AGENTS.md` 权限说明。
- 修复悬浮球显示为圆角矩形的问题：移除悬浮球窗口 `#root` 的默认圆角与背景色，并将内部图标尺寸调整为与窗口一致的 64×64 像素，恢复为圆形。
- 初始化项目 README 与更新日志机制。
- 新增开发规则：后续每次代码修改自动记录更新日志，并同步维护 `AGENTS.md`。
- 新增版本号更新说明章节，明确版本号维护位置。

---

## 版本号更新说明

本项目版本号遵循 SemVer 格式 `MAJOR.MINOR.PATCH`（如 `0.4.1`），同时维护在以下文件中：

1. `package.json` —— 前端 npm 包版本号（`version` 字段）。
2. `src-tauri/tauri.conf.json` —— Tauri 桌面应用版本号（`version` 字段）。
3. `mobile/android/app/build.gradle` —— Android 应用版本号（`versionName` 字段）。

### 版本号变更规则

- **`MAJOR` 和 `MINOR` 由项目维护者手动控制**：只有在进行大版本重构或中版本功能发布时，才由维护者决定是否升级 `MAJOR` 或 `MINOR`。
- **`PATCH` 由 Agent 自动递增**：每次完成一组涉及功能修改（新增功能、Bug 修复、交互优化、UI 调整、配置变更、开发规范更新等）的改动后，Agent 会自动将 `PATCH` 加 1。例如从 `0.4.0` 升级到 `0.4.1`。
- 三个文件中的版本号应始终保持一致，Agent 在自动递增 `PATCH` 时会同步修改所有相关文件。

> 提示：更新日志会根据上述文件中的版本号自动生成，建议在修改版本号后再记录本次发布对应的更新内容。

---

## 开源协议

MIT（占位）
