AI AGENT SKILLS

Todo List Promax

一个面向 Other 场景的 Agent 技能。原始说明:个人待办事项永久存储、智能分类与定时提醒系统。 自动从聊天消息中捕获待办(文字/图片/附件),解析时间与优先级,每日晚上9点推送未完成提醒。 当用户消息包含以下触发词时激活: 【录入】"TODO:"、"帮我记录一下"、"记录:"、"待办:"、"加个待办"、"记一...

SKILL.md

SKILL.md


name: todo-list-promax
version: "2.1.0"
description: >
个人待办事项永久存储、智能分类与定时提醒系统。
自动从聊天消息中捕获待办(文字/图片/附件),解析时间与优先级,每日晚上9点推送未完成提醒。
当用户消息包含以下触发词时激活:
【录入】"TODO:"、"帮我记录一下"、"记录:"、"待办:"、"加个待办"、"记一下"、"别忘了"、"记得提醒我"、"回头要做"、"备忘"、"提醒我"、"add todo"、"remind me to"、"don't forget"、"note this"
【查询】"TODOLIST"、"待办列表"、"查看待办"、"看看待办"、"我有哪些待办"、"今天还有哪些未完成"、"还有什么没做"、"今天还要干嘛"、"今天的事做完了没"、"我的清单"、"my todos"、"todo list"、"what's pending"、"show todos"
NOT for: 项目管理、日历集成、多人协作、自动执行任务。


todo-list — 个人待办事项系统

语言规则

检测用户使用的语言,全程使用同一语言输出。 中文用户 → 读下方中文部分,全中文输出;English users → read the English section below, output in English only. 技术术语(JSON、ID 等)保留原文即可。


中文版

目标

为用户提供一个永久不丢失的待办事项管理系统。自动从聊天消息中捕获待办,智能解析时间和优先级,每日主动提醒未完成任务。

核心原则

  1. 零摩擦录入 — 用户随意发一句话或一张图,系统自动识别并存储
  2. 永久不丢 — 完成 = 标记 done,不等于删除。已删除 = 真正移除
  3. 智能解析 — 从自然语言自动提取时间、优先级、任务内容
  4. 主动提醒 — 有截止时间的未完成任务,每天 21:00 主动推送
  5. 按需响应 — 用户不问不回复,避免打扰

主要职责

1. 待办录入

触发词: TODO:帮我记录一下记录:待办:加个待办记一下别忘了记得提醒我回头要做备忘提醒我add todoremind me todon't forgetnote this

模糊输入判定规则: 消息必须包含动宾结构明确动作词才能触发录入。判断标准:

  • ✅ 触发:含动词+宾语("提交周报"、"买充电线"、"看完论文")
  • ✅ 触发:含明确动作+目标("TODO: 部署测试环境")
  • ❌ 不触发:纯状态/意向陈述("我打算吃饭"、"最近好累"、"想学 Rust")
  • ❓ 模糊时:追问而非静默录入。如"TODO: 搞一下那个东西" → 回复"你想记录什么待办?请具体说明一下任务内容"

操作优先级:如果同一条消息同时匹配录入和操作指令(如"删除这个 TODO: xxx"),优先执行操作指令(完成 > 删除 > 修改 > 录入),不创建重复待办。

矛盾请求处理:当用户消息包含矛盾指令时(如"完成了 #1 删除 #1"或"TODO: 删除所有待办"):

  • 操作间矛盾:按优先级执行第一个操作,忽略矛盾的第二个,并告知用户
  • 批量操作("删除所有"/"完成全部"):列出受影响的项目,逐条确认,不可批量静默执行
  • 越界请求("帮我把待办同步到飞书项目"):拒绝并提示"todo-list 仅管理本地待办,不支持外部同步"

流程:

  1. 从用户消息中提取任务内容
  2. 如果消息包含图片/附件,下载并保存到 ${workspace}/todo-list/attachments/
  3. 解析时间要求(如有)
  4. 解析优先级(如有)
  5. 提取对接人(contact)(见下方对接人提取规则)
  6. 提取备注(notes)(见下方备注提取规则)
  7. 提取标签(tags)(见下方标签提取规则)
  8. 生成唯一 ID,写入 ${workspace}/todo-list/todos.json
  9. 回复用户确认(完整一行: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"、"PS:XX"、"注意:XX"),提取到 notes 字段
  • 当用户使用括号补充关键信息(如"预装插件会不会重新安装(什么变了才会重新安装)"),括号内容自动提取为 notes
  • 飞书文档链接等参考资料自动归入 notes
  • notes 为可选字段,无额外信息时为空
  • 查询输出时:有 notes → 显示 📝 备注:XXX;无 notes → 不显示
  • 查询输出时:始终显示 💬 原文: source_message,保留完整原始信息

标签(tags)提取规则:

默认标签集:工作学习购物生活健康其他

提取方式:

  1. 手动指定:用户使用 #标签名 语法,如 TODO: 完成报告 #工作 → tags: ["工作"]
  2. 关键词映射:从消息内容中识别名词类别关键词,自动映射到默认标签:

| 关键词示例 | 映射标签 |
|-----------|---------|
| 周报、报告、会议、邮件、项目、汇报、评审、上线 | 工作 |
| 论文、看书、课程、考试、练习、学习、培训 | 学习 |
| 买、购物、下单、充值、充电线、耳机 | 购物 |
| 打扫、做饭、取快递、缴费、搬家、洗衣服 | 生活 |
| 体检、运动、吃药、跑步、挂号、看医生 | 健康 |

  1. 无匹配:当消息中没有可识别的类别关键词且用户未手动指定标签时,tags 为空数组 []
  2. 多标签:一条待办可以有多个标签,如 TODO: 买体检套餐 #健康 #购物 → tags: ["健康", "购物"]
  3. 自定义标签:用户可以使用 #标签名 指定不在默认集中的标签,如 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 todostodo listwhat's pendingshow todos

查询模式:

  • 无条件 → 所有未完成待办,按截止时间升序(无截止排最后),同截止时间再按优先级排序(P0 > P1 > P2 > P3)
  • 按日期 → "周一的 todo"、"5月18日的待办"、"今天的" → 筛选 due_time 匹配该日期的未完成项
  • 按时间范围 → "本周"、"本月" → 筛选 due_time 在范围内
  • 按优先级 → "有哪些紧急的" → 筛选特定级别
  • 按标签 → "工作相关的待办" → 筛选 tags 包含对应标签

输出格式:

📋 未完成待办(共 X 条)

🔴 P0 重要紧急
  #1 今天下班前提交周报  📅 今天  👤 对接:张三  🏷 工作
  📝 备注:需要附上数据报表
  💬 原文: TODO:今天下班前提交周报,对接人张三,需要附上数据报表

🟡 P1 重要不紧急
  #3 看完那篇论文  📅 下周一  🏷 学习
  💬 原文: TODO:看完那篇论文 #学习

  #5 整理桌面  (无截止时间)  🏷 生活
  💬 原文: 待办:整理桌面

🟠 P2 急但不重要
  #8 回复那个邮件  📅 明天  👤 对接:李四  🏷 工作
  💬 原文: reminder: 回复李四那封邮件明天前

🟢 P3 不急
  #7 买个充电线  📅 有空再说  🏷 购物
  💬 原文: 备忘:买个充电线

格式说明:

  • 每个待办第一行:emoji + #ID + content + 📅(截止时间)+ 👤(对接人,有则显示)+ 🏷(标签,有则显示)
  • 有 notes 时:第二行 📝 备注:内容
  • 始终显示:💬 原文: 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
  • 配置方式(具体步骤):

使用 OpenClaw cron 创建每日提醒任务,最小步骤如下:

  1. 创建 cron 任务,调度规则为 0 21 * * *(每天 21:00)
  2. cron 任务触发时执行以下流程:

a. 读取 ${workspace}/todo-list/todos.json
b. 筛选条件:status != "done"due_time != null
c. 按截止时间升序排序(无截止排最后),同截止时间再按优先级排序(P0 > P1 > P2 > P3)
d. 如有匹配项,生成紧凑列表消息并推送到用户聊天
e. 如无匹配项,不推送
f. 更新 last_reminder_at 为当前时间

  1. 推送消息末尾附操作指引:回复"完成 #N"标记完成 · 回复"TODOLIST"查看全部 · 回复"#N due_time:X"修改 · 回复"撤销"恢复最近操作
  2. cron 命令示例:openclaw cron add --schedule "0 21 * * *" --task "Read todos.json, filter pending items with due_time, push reminder if any"
  • 降级策略: cron 不可用或执行失败时,在下次用户交互时补充推送未提醒项(检查 last_reminder_at,若超过 24 小时则补推)

数据结构

存储文件:${workspace}/todo-list/todos.jsonworkspace 为当前 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 | done
  • priority: P0 | P1 | P2 | P3
  • due_time: 截止日期 YYYY-MM-DD,可为 null
  • contact: 对接人/负责人姓名(可选,无则为空字符串 ""
  • notes: 备注信息,含补充说明、参考链接等(可选,无则为空字符串 ""
  • tags: 标签数组,用于分类和筛选(如 ["工作", "bug"]),可为空数组
  • created_at: 创建时间 ISO 8601
  • completed_at: 完成时间 ISO 8601,完成时填入
  • deleted_at: 删除时间 ISO 8601,删除时填入(用于附件 7 天清理判断)
  • attachments: [{path, type}] 附件列表
  • source_message: 原始消息内容(完整保留,永不修改)
  • last_reminder_at: 上次提醒时间 ISO 8601(用于降级补推)

并发安全

写入 todos.json 时采用原子写模式:先写入临时文件 todos.json.tmp,写入成功后 mv(rename)替换原文件。避免两个 session 同时写导致数据丢失。

约束

  • 存储路径:${workspace}/todo-list/(相对于当前工作目录)
  • 附件路径:${workspace}/todo-list/attachments/
  • ID 自增,已删除的 ID 不重复使用
  • 不修改用户消息原文
  • 删除操作必须二次确认
  • 时间解析精确到天
  • todos.json 或目录不存在时自动创建
  • 写入 json 前自动备份上一版本到 todos.json.bak
  • 读取 json 解析失败时,尝试使用 todos.json.bak 恢复
  • 删除 todo 后,记录 deleted_at 时间戳,attachments 目录中的文件保留 7 天后自动清理(避免误删后无法恢复)
  • 每次操作 todos.json 时检查是否有超过 7 天的已删除 todo 附件,有则清理
  • Schema 升级:读取时检查 version 字段,若不匹配当前版本,执行迁移(如新增字段填默认值)并写回


English Version

This skill is written in Chinese. For full details, please read the Chinese section above.

You can ask AI to translate the Chinese section if needed.

Summary

todo-list-promax — Personal todo management system with permanent storage, smart categorization, and daily reminders.

Core Principles

  1. Zero-friction input — Auto-capture from casual messages or images
  2. Permanent storage — Done ≠ delete; deleted = actually removed
  3. Smart parsing — Auto-extract time, priority, tags from natural language
  4. Daily reminders — Push unfinished tasks at 21:00 via cron
  5. 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, 💬source_message for every item |
| 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: read todos.json → filter pending with due_time → push if any. 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)

  1. Create cron: 0 21 * * *
  2. On trigger: read todos.json → filter status != "done" AND due_time != null → sort by due_time ascending, then by priority → push if any → update last_reminder_at
  3. Append action guide to push message

Constraints

  • Atomic writes (write to .tmp then mv)
  • Auto-backup to todos.json.bak before writes
  • Auto-recover from .bak on parse failure
  • Deleted todo attachments retained 7 days then auto-cleaned
  • Schema migration on version mismatch