todo-list — 个人待办事项系统
语言规则
默认跟随用户使用的语言输出;用户可随时指定其他语言(如"用英文回复"),以用户指定为准。中文用户 → 读下方中文部分;English users → read the English section below. 技术术语(JSON、ID 等)保留原文即可。
中文版
目标
为用户提供一个永久不丢失的待办事项管理系统。自动从聊天消息中捕获待办,智能解析时间和优先级,每日主动提醒未完成任务。
核心原则
- 零摩擦录入 — 用户随意发一句话或一张图,系统自动识别并存储
- 永久不丢 — 完成 = 标记 done,不等于删除。已删除 = 真正移除
- 智能解析 — 从自然语言自动提取时间、优先级、任务内容
- 主动提醒 — 有截止时间的未完成任务,每天 21:00 主动推送
- 按需响应 — 用户不问不回复,避免打扰
主要职责
1. 待办录入
触发词: TODO:、帮我记录一下、记录:、待办:、加个待办、记一下、别忘了、记得提醒我、回头要做、备忘、提醒我、add todo、remind me to、don't forget、note this
模糊输入判定规则: 消息必须包含动宾结构或明确动作词才能触发录入。判断标准:
- ✅ 触发:含动词+宾语("完成课程作业"、"买充电线"、"看完论文")
- ✅ 触发:含明确动作+目标("TODO: 复习期末考试")
- ❌ 不触发:纯状态/意向陈述("我打算吃饭"、"最近好累"、"想学 Rust")
- ❓ 模糊时:追问而非静默录入。如"TODO: 搞一下那个东西" → 回复"你想记录什么待办?请具体说明一下任务内容"
操作优先级:如果同一条消息同时匹配录入和操作指令(如"删除这个 TODO: xxx"),优先执行操作指令(完成 > 删除 > 修改 > 录入),不创建重复待办。
矛盾请求处理:当用户消息包含矛盾指令时(如"完成了 #1 删除 #1"或"TODO: 删除所有待办"):
- 操作间矛盾:按优先级执行第一个操作,忽略矛盾的第二个,并告知用户
- 批量操作("删除所有"/"完成全部"):列出受影响的项目,逐条确认,不可批量静默执行
- 越界请求("帮我把待办同步到飞书项目"):拒绝并提示"todo-list 仅管理本地待办,不支持外部同步"
流程:
- 从用户消息中提取任务内容
- 如果消息包含图片/附件,下载并保存到
${workspace}/todo-list/attachments/ - 解析时间要求(如有)
- 解析优先级(如有)
- 提取对接人(contact)(见下方对接人提取规则)
- 提取备注(notes)(见下方备注提取规则)
- 提取标签(tags)(见下方标签提取规则)
- 生成唯一 ID,写入
${workspace}/todo-list/todos.json - 回复用户确认(完整一行:ID + 摘要 + 优先级 + 截止时间 + 对接人 + 标签 + 备注摘要)
时间解析:
- 相对时间:今天、明天、后天、下周一、本周五、今晚、月底 等
- 绝对时间:5月20日、5-20、2026/5/20 等
- 模糊时间:尽快、ASAP、有空时 → 不设截止时间
- 精确到"天",不支持具体小时
- 无法解析时 → 不设截止时间,不追问
优先级解析:
| 级别 | 标记方式 | 自然语言线索 |
|---|---|---|
| P0 | [P0]、⚠️ |
"很紧急"、"立刻"、"马上"、"必须今天" |
| P1 | [P1] 或不标 |
"重要"、"要做"(默认) |
| P2 | [P2]、⚡ |
"急但不重要"、"顺手做" |
| P3 | [P3]、📌 |
"有空再说"、"随手记一下"、"不急" |
无法判断时默认 P1。
对接人(contact)提取规则:
从用户消息中识别对接人/负责人信息,提取到 contact 字段:
| 模式 | 示例 | 提取结果 |
|---|---|---|
| "XX:" 前缀 | "小李:输入框跟后台配置联动" | contact: "小李" |
| "@XXX" | "@小王 翻译完了发过来" | contact: "小王" |
| "对接人:XX" | "适配 autoclaw,对接人小陈" | contact: "小陈" |
| "找XX" / "跟XX对接" | "找小陈对接多语言" | contact: "小陈" |
| "XX给XX后" | "小王给翻译文本后加到项目" | contact: "小王" |
提取原则:
- 如果消息中提及多处人名,提取最直接负责该任务的人
- 无法确定时
contact为空,不追问 - 查询输出时:有 contact → 显示
👤 对接:XXX;无 contact → 不显示
备注(notes)提取规则:
- 仅当用户明确提供备注信息时才记录,如"备注:XX"、"注意:XX"
- 禁止自动脑补备注:不要从 content 中推断、不要自行总结、不要把原文复述一遍
- 飞书文档链接等用户主动发送的参考资料可归入 notes
notes为空时不显示
标签(tags)提取规则:
默认标签集:工作、学习、购物、生活、健康、其他
提取方式:
- 手动指定:用户使用
#标签名语法,如TODO: 完成报告 #工作→ tags: ["工作"] - 关键词映射:从消息内容中识别名词类别关键词,自动映射到默认标签:
| 关键词示例 | 映射标签 |
|---|---|
| 作业、报告、会议、邮件、项目、汇报、答辩、上线 | 工作 |
| 论文、看书、课程、考试、练习、学习、培训、作业 | 学习 |
| 买、购物、下单、充值、充电线、耳机 | 购物 |
| 打扫、做饭、取快递、缴费、搬家、洗衣服 | 生活 |
| 体检、运动、吃药、跑步、挂号、看医生 | 健康 |
- 无匹配:当消息中没有可识别的类别关键词且用户未手动指定标签时,tags 为空数组
[] - 多标签:一条待办可以有多个标签,如
TODO: 买体检套餐 #健康 #购物→ tags: ["健康", "购物"] - 自定义标签:用户可以使用
#标签名指定不在默认集中的标签,如TODO: 修复 bug #前端→ tags: ["前端"]
附件处理:
- 图片/文件:下载到
${workspace}/todo-list/attachments/{todoId}_{原文件名} - json 中记录
attachments: [{path, type}],type 枚举:image(图片)、file(其他文件) - 同时有文字和图片时,两者都存储
附件清理机制:
- 每次操作
todos.json时(录入、完成、删除、修改等),检查attachments/目录中是否存在已删除 todo 的附件 - 如果该附件关联的 todo 已被删除超过 7 天(根据 todo 的删除时间戳判断),则自动清理该附件文件
- 清理日志追加到
${workspace}/todo-list/cleanup.log
2. 待办查询
触发词: TODOLIST、待办列表、查看待办、看看待办、我有哪些待办、今天还有哪些未完成、还有什么没做、今天还要干嘛、今天的事做完了没、我的清单、my todos、todo list、what's pending、show todos
查询模式:
- 无条件 → 所有未完成待办,按截止时间升序(无截止排最后),同截止时间再按优先级排序(P0 > P1 > P2 > P3)
- 按日期 → "周一的 todo"、"5月18日的待办"、"今天的" → 筛选
due_time匹配该日期的未完成项 - 按时间范围 → "本周"、"本月" → 筛选
due_time在范围内 - 按优先级 → "有哪些紧急的" → 筛选特定级别
- 按标签 → "工作相关的待办" → 筛选
tags包含对应标签
输出格式: 表格,内容列在最前,无 emoji,备注仅用户明确提供时显示。
| 内容 | # | P | 截止 | 对接人 | 备注 |
|---|:---:|:---:|:---:|---|---|
| 完成课程作业(附实验报告) | 1 | P0 | 今天 | 小李 | |
| 看完那篇论文 | 3 | P1 | 下周一 | | |
| 取快递 | 5 | P1 | | | |
格式说明:
- 内容列置首,最重要信息优先
- 不使用 emoji(不要 🔴🟡🟠🟢),用 P 列直显优先级
- 备注/对接人为空时不显示(留空即可)
- 截止时间简洁显示:今天/明天/5/25,已过期标红
- 不显示 source_message(内容列已涵盖)
3. 待办操作
完成: "完成了 #1" 或 "TODO 完成 1" 或 "done #1" → 标记 status: done,记录 completed_at
删除: "删除 #1" 或 "TODO 删除 1" 或 "delete #1" → 回复待删除的 todo 内容摘要(ID + 内容 + 优先级),等用户确认后再移除。用户说"确认"或"删"时才执行
修改: "#1 改成明天" 或 "#1 change to tomorrow" → 更新对应字段,回复确认
可修改字段: content(内容)、due_time(截止时间)、priority(优先级)、contact(对接人)、notes(备注)、tags(标签)
修改语法:
- 字段名语法:
#N due_time:明天、#N priority:P0、#N content:新的任务描述、#N contact:小李、#N notes:补充信息、#N tags:学习,生活 - 自然语言语法(同样支持):
#1 截止:明天、#1 优先级:P0、#1 内容:新的任务描述、#1 对接人:小李、#1 备注:补充信息 - 两种写法等价,系统都能识别
撤销机制:
- 用户说"撤销"或"undo"时,恢复到
todos.json.bak中的上一版本 - 仅支持单步 undo:连续两次 undo 时,第二次 undo 恢复到 bak 之前的版本(即 bak 文件中存储的状态,不会继续回退到更早版本)
- undo 后的新操作:undo 之后再执行任何新操作(录入/完成/删除/修改),新操作会覆盖
todos.json.bak,之前的 undo 状态不可再恢复 - 简言之:永远只能撤销最近一次操作,undo 不是无限回退栈
4. 每日提醒
-
时间: 每天 21:00
-
启用需用户同意: 创建 cron 提醒任务前,先向用户说明"将每天 21:00 自动推送未完成任务提醒,可随时说「关闭提醒」停止",获得用户确认后再创建任务;用户说"关闭提醒/暂停提醒"时,立即删除或禁用对应 cron 任务
-
内容最小化: 提醒消息默认只展示任务摘要(ID + 内容 + 截止时间);不展开
source_message原文,避免在共享屏幕或他人可见场景泄露敏感信息 -
配置方式(具体步骤):
使用 OpenClaw cron 创建每日提醒任务,最小步骤如下:
- 创建 cron 任务,调度规则为
0 21 * * *(每天 21:00) - cron 任务触发时执行以下流程:
a. 读取
${workspace}/todo-list/todos.jsonb. 筛选条件:status != "done"且due_time != nullc. 按截止时间升序排序(无截止排最后),同截止时间再按优先级排序(P0 > P1 > P2 > P3) d. 如有匹配项,生成紧凑列表消息并推送到用户聊天 e. 如无匹配项,不推送 f. 更新last_reminder_at为当前时间 - 推送消息末尾附操作指引:
回复"完成 #N"标记完成 · 回复"TODOLIST"查看全部 · 回复"#N due_time:X"修改 · 回复"撤销"恢复最近操作 - cron 命令示例:
openclaw cron add --schedule "0 21 * * *" --task "Read todos.json, filter pending items with due_time, push reminder if any"
- 创建 cron 任务,调度规则为
-
降级策略: cron 不可用或执行失败时,在下次用户交互时补充推送未提醒项(检查
last_reminder_at,若超过 24 小时则补推);用户已关闭提醒时不补推
数据结构
存储文件:${workspace}/todo-list/todos.json(workspace 为当前 OpenClaw 工作目录)
{
"version": 2,
"todos": [
{
"id": 1,
"content": "完成课程作业",
"status": "pending",
"priority": "P0",
"due_time": "2026-05-16",
"contact": "小李",
"notes": "需要附上实验报告",
"tags": ["学习"],
"created_at": "2026-05-16T09:30:00+08:00",
"completed_at": null,
"deleted_at": null,
"attachments": [],
"source_message": "TODO:今天下班前完成课程作业,对接人小李,需要附上实验报告"
}
],
"last_reminder_at": "2026-05-16T21:00:00+08:00"
}
字段说明:
id: 自增整数,不重复使用content: 任务内容(纯文本摘要)status:pending|donepriority:P0|P1|P2|P3due_time: 截止日期 YYYY-MM-DD,可为 nullcontact: 对接人/负责人姓名(可选,无则为空字符串"")notes: 备注信息,含补充说明、参考链接等(可选,无则为空字符串"")tags: 标签数组,用于分类和筛选(如["工作", "bug"]),可为空数组created_at: 创建时间 ISO 8601completed_at: 完成时间 ISO 8601,完成时填入deleted_at: 删除时间 ISO 8601,删除时填入(用于附件 7 天清理判断)attachments:[{path, type}]附件列表source_message: 原始消息内容(完整保留,永不修改,用于溯源与恢复);展示范围:用户本人的直接查询中可展示摘要级原文;提醒推送、群聊及共享场景一律不展示last_reminder_at: 上次提醒时间 ISO 8601(用于降级补推)
数据与隐私
- 本地存储:所有数据(todos.json、备份、附件)仅存储在本地
${workspace}/todo-list/,不上传任何外部服务 - 提醒推送:由本地 cron 触发,仅推送到用户自己的会话;不包含原始消息全文
- 原始消息保留:
source_message完整保留用于溯源;用户可随时要求裁剪或清除某条记录 - 附件保留:删除待办后附件保留 7 天后自动清理(见「约束」)
- 用户控制:用户可随时要求导出或删除全部数据(删除目录即清除)
并发安全
写入 todos.json 时采用原子写模式:先写入临时文件 todos.json.tmp,写入成功后 mv(rename)替换原文件。避免两个 session 同时写导致数据丢失。
约束
- 存储路径:
${workspace}/todo-list/(相对于当前工作目录) - 附件路径:
${workspace}/todo-list/attachments/ - ID 自增,已删除的 ID 不重复使用
- 不修改用户消息原文
- 提醒与推送仅发给用户本人;敏感原文(source_message)不在提醒中展开
- 删除操作必须二次确认
- 时间解析精确到天
todos.json或目录不存在时自动创建- 写入 json 前自动备份上一版本到
todos.json.bak - 读取 json 解析失败时,尝试使用
todos.json.bak恢复 - 删除 todo 后,记录
deleted_at时间戳,attachments 目录中的文件保留 7 天后自动清理(避免误删后无法恢复) - 每次操作 todos.json 时检查是否有超过 7 天的已删除 todo 附件,有则清理
- Schema 升级:读取时检查
version字段,若不匹配当前版本,执行迁移(如新增字段填默认值)并写回
English Version
Bilingual skill — full spec is in Chinese above; this English reference covers the operational essentials, and the AI fully supports English interaction (see Language Rule at top).
Summary
todo-list-promax — Personal todo management system with permanent storage, smart categorization, and daily reminders.
Core Principles
- Zero-friction input — Auto-capture from casual messages or images
- Permanent storage — Done ≠ delete; deleted = actually removed
- Smart parsing — Auto-extract time, priority, tags from natural language
- Daily reminders — Push unfinished tasks at 21:00 via cron
- On-demand — Don't disturb unless asked
Key Features
| Feature | Details |
|---|---|
| Capture | Triggers: TODO:, add todo, remind me to, etc. Fuzzy input → ask, don't silently capture |
| Query | Triggers: TODOLIST, my todos, etc. Filter by date/range/priority/tags. Shows 👤contact, 📝notes and 💬source_message excerpt (owner direct queries only; never in reminders or shared contexts) |
| Operations | Complete, delete (with confirmation), modify, undo (single-step only) |
| Tags | Auto-extract via keyword mapping (工作/学习/购物/生活/健康/其他) or manual #tag syntax. Default: empty array |
| Daily reminder | Cron at 21:00 (user opt-in required before creating the cron task; reminders contain task summaries only — no raw source_message). Fallback: push on next interaction if >24h since last reminder |
| Attachments | Saved to attachments/, auto-cleaned 7 days after todo deletion |
Modify Syntax
- Field name syntax:
#1 due_time:明天,#1 priority:P0,#1 content:新内容,#1 contact:小李,#1 notes:补充说明,#1 tags:学习,生活 - Natural language also supported:
#1 截止:明天,#1 优先级:P0,#1 内容:新内容,#1 对接人:小李 - Both are equivalent
Undo Specification
- Single-step only: second consecutive undo restores to the bak version (no further rollback)
- After undo, any new operation overwrites bak — previous undo state is lost
- In short: always only the most recent operation can be undone
Data Schema
{
"id": 1, "content": "...", "status": "pending|done",
"priority": "P0|P1|P2|P3", "due_time": "YYYY-MM-DD|null",
"contact": "string (optional)", "notes": "string (optional)",
"tags": [], "created_at": "ISO8601", "completed_at": null,
"deleted_at": null, "attachments": [{"path":"","type":"image|file"}],
"source_message": "..."
}
Cron Setup (Minimal Steps)
- Create cron:
0 21 * * * - On trigger: read
todos.json→ filterstatus != "done"ANDdue_time != null→ sort by due_time ascending, then by priority → push if any → updatelast_reminder_at - Append action guide to push message
Constraints
- Owner consent required before enabling cron reminders; users can disable anytime
- Reminders show task summaries only; raw
source_messageshown only in owner direct queries, never in reminders or shared contexts - All data stays local under
${workspace}/todo-list/; no external upload - Atomic writes (write to
.tmpthenmv) - Auto-backup to
todos.json.bakbefore writes - Auto-recover from
.bakon parse failure - Deleted todo attachments retained 7 days then auto-cleaned
- Schema migration on version mismatch
