This commit is contained in:
2026-09-12 13:55:57 +08:00
commit 30f1cedd39
95 changed files with 42057 additions and 0 deletions

156
README.md Normal file
View File

@@ -0,0 +1,156 @@
# Todo List
一个简洁的桌面 Todo 应用——**Markdown 文件是真相之源,软件只是友好的外壳。**
任务存在一个普通 `.md` 文件里任何文本编辑器都能打开、编辑、同步、diff。没有数据库没有锁没有私有格式。
## 为什么用它
- **零锁定** —— `todo.md` 永远可读。删掉应用也不丢任何数据。
- **极简模型** —— 任务只有四个字段:文本、勾选、⭐ 重要、▶ 当前。没有标签、优先级、截止日期、子步骤。
- **数据归属明确** —— 勾选 = 移到「已完成」;删除 = 移到「回收站」。一个任务永远只在一个地方。
- **"当前 / 重要"是视图,不是文件段** —— 任务打上 `[▶]` / `[⭐]` 行内标记后由 UI 聚合呈现,文件里不会出现重复镜像。
- **永远不让你"丢东西"** —— 没有"清空回收站"按钮,彻底删除只能手动编辑 Markdown。
## 快速开始
需要 Node.js 18+。
```bash
npm install
npm start
```
> **路径要求**:项目目录必须放在 **ASCII 路径**下(如 `C:\dev\todo-list`)。路径含中文时 Electron 会因 `require('electron')` 返回路径字符串而启动失败、看不到窗口。临时绕过:在 ASCII 位置建符号链接再启动:
>
> ```cmd
> mklink /D C:\dev\todo-list "D:\data\正在工作\Todo List"
> cd C:\dev\todo-list && npm start
> ```
数据文件位置:`~/TodoList/todo.md`(可在设置里改;仅允许用户主目录 / 文档 / 下载 / 桌面 / AppData 下的子目录)。
## 文件长什么样
```markdown
# 全部任务
## 工作
- [ ] 完成 Q3 设计文档
- [ ] [▶] 写季度汇报
- [ ] [⭐] 给客户回邮件
# 已完成任务
# 回收站
```
四个标记,零元数据:
| 写法 | 含义 |
|---|---|
| `- [ ]` | 未完成 |
| `- [✓]` | 已完成 |
| `[▶]` | 当前任务(出现在「当前任务」视图) |
| `[⭐]` | 重要任务(出现在「重要任务」视图) |
| `[原分类xxx]` | 自动归档归属(仅在「已完成」/「回收站」里出现) |
写入器固定输出顺序:`- [✓] [▶] [⭐] [原分类xxx] 任务文本`。完整示例见 [`data/todo.example.md`](data/todo.example.md)。
## 侧边栏
侧边栏顶部是 4 个跨子分类聚合的智能视图,下面是用户用 `## 子分类名` 自由组织的子分类(含不可删的「未分类」兜底):
| 视图 | 说明 |
|---|---|
| **当前任务** | 所有打了 `[▶]` 的未完成任务 |
| **重要任务** | 所有打了 `[⭐]` 的未完成任务 |
| **全部任务** | 聚合显示所有子分类里的未完成任务 |
| **已完成任务** | 跨分类聚合的已完成任务 |
智能视图用 `Alt+1` / `2` / `3` / `4` 切换。
## 快捷键
| 操作 | 快捷键 |
|---|---|
| 添加任务 | `Enter`(在底部输入框) |
| 勾选 | `Space` |
| 编辑 | `F2` |
| 删除(到回收站) | `Delete` |
| 标重要 / 当前 | `Ctrl/Cmd+I` · `Ctrl/Cmd+T` |
| 搜索 | `Ctrl/Cmd+F``/` |
| 过滤菜单 | `F` |
| 命令面板 | `Ctrl/Cmd+K` |
| 新建子分类 | `Ctrl/Cmd+Shift+N` |
| 设置 | `Ctrl/Cmd+,` |
| 切换主题 | `Ctrl/Cmd+Shift+T` |
| 切换智能视图 | `Alt+1` 当前 · `Alt+2` 重要 · `Alt+3` 全部 · `Alt+4` 已完成 |
| 列表内导航 | `↑` / `↓` · `Home` / `End` · `PageUp` / `PageDown` |
| 立即重新加载 | `Ctrl/Cmd+R` |
| 开发者工具 | `F12` |
## 四个操作搞定 80% 场景
| 想做什么 | 怎么做 |
|---|---|
| 添加任务 | 底部输入框打字,回车 |
| 标"今天要做" | 任务前打 `[▶]` 或按 `Ctrl/Cmd+T` |
| 标"重要" | 任务前打 `[⭐]` 或按 `Ctrl/Cmd+I` |
| 完成 / 删除 | 勾选 → 自动到「已完成」;点 × → 自动到「回收站」 |
## 命令
```bash
npm start # 启动(推荐,自动修中文乱码)
npm run start:raw # 直接起 Electron仅排查启动脚本时用
TODO_DEVTOOLS=1 npm start # 启用远程调试端口 9222外部 DevTools / Playwright 接入)
npm run check # 跑 47 项自检、约 1200 条断言
npm run build # 打包当前平台
npm run build:win # WindowsNSIS .exe
npm run build:mac # macOS.dmg
npm run build:linux # Linux.AppImage
```
产物输出到 `dist/`
## 功能一览
- **智能视图**:当前 / 重要 / 全部 / 已完成(按行内标记跨子分类聚合)
- **任务分类**:用 `## 子分类名` 自由组织,含「未分类」兜底
- **过滤 / 排序**:全部 / 当前 / 已完成 / 重要 · 手动 / 字母(全局偏好持久化)
- **拖拽**子分类间、任务间、任务到侧边栏Pointer Events不依赖 HTML5 drag API
- **批量操作**:选择模式多选,一键移动 / 置顶置底 / 标重要当前 / 完成 / 删除
- **导入**:粘贴大段文本按行解析成任务,支持保留 `- [✓]` 状态
- **冲突解决**:任务粒度三栏合并(用文件 / 用本地 / 保留两边 / 都不要),附 LCS 行级 diff 预览
- **搜索**:全局模糊匹配 + `Ctrl/Cmd+K` 命令面板(搜索列表 / 跳转 / 切换主题等)
- **个性化**:字体大小(小 / 标准 / 大)× 配色风格(靛蓝 / 海洋 / 森林 / 日落 / 玫瑰 / 单色,各含深浅两版)
- **主题**:深色 / 浅色 / 跟随系统;与配色风格正交
- **托盘 / 始终置顶 / 单实例锁**:关闭窗口默认隐藏到托盘;同目录同时只允许运行一个实例
- **6 个插入位置偏好**:新增 / 完成 / 取消完成 / 删除 / 恢复 / 移到分类各自选"前面 / 后面"
## 数据安全
- **实时同步** —— 每次操作立即落盘800ms 防抖),状态栏显示「已同步 HH:MM」
- **外部修改检测** —— `fs.watch` + 250ms `statSync(mtime/size)` 轮询兜底(云盘 / 网络盘 / 非标准保存路径的编辑器也能感知)
- **冲突合并** —— 磁盘版本与本地版本不一致时弹任务粒度三栏合并对话框
- **原子写入** —— `tmp + rename` 落盘,永远不会半截
- **`.bak` 三份轮转** —— 每次保存保留最近 3 份回退点
- **带标签快照** —— 用户主动丢弃编辑、退出前 flush、reload 前等关键节点生成带时间戳的快照,永不轮转
- **`.pre-crash.bak` 兜底** —— 退出前 flush 超时5 秒)自动备份当前内容
- **每日快照** —— `backup/todo-YYYY-MM-DD.md`,默认开启
- **数据目录沙箱** —— 所有文件 IO 必须落在数据目录内;自定义目录必须在用户已知根目录下
- **单文件上限 50 MB** —— 防止异常数据把目录撑爆
- **彻底删除只能手动编辑文件** —— 刻意的设计
## 跨设备同步
`todo.md` 放在云盘目录OneDrive / Dropbox / iCloud或在设置里改数据目录。或用 Git 管理每个任务一行diff 干净)。
## 开发者
关济寰 · [guanjihuan.com/about](https://www.guanjihuan.com/about)
## 许可证
MIT