Personal Goals Tracker Pro
四季目标管理系统:设定年目标/月目标 → 自动生成每日任务 → 完成记录 + 月度汇总。
快速上手
本 skill 支持定时任务自动推送,首次使用前请完成以下配置:
1. 配置定时任务
在 Claw 的定时任务管理界面中,添加以下三个定时任务:
| 任务名称 | Cron 表达式 | 触发消息 |
|---|---|---|
| 每日目标提醒 | 0 8 * * * |
调用Skill:personal-goals-pro,触发:查看今日任务 |
| 明日任务生成 | 0 21 * * * |
调用Skill:personal-goals-pro,触发:生成明天任务 |
| 月度目标汇总 | 0 21 L * * |
调用Skill:personal-goals-pro,触发:查看本月汇总 |
> 💡 Cron 表达式说明:
> - 0 8 * * *:每天 08:00 触发
> - 0 21 * * *:每天 21:00 触发
> - 0 21 L * *:每月最后一天 21:00 触发(L 表示月末)
2. 配置 IM 推送渠道(可选)
你可以随时通过发送关键字(如「查看今日任务」「查看目标」)主动查询任务和目标。如需定时自动推送,请在 Claw 环境中配置 IM 平台(微信、钉钉、飞书等)的推送渠道,即可实现每日提醒和月度汇总的自动推送。
配置完成后即可开始使用!
配置
首次使用前,读取 skill 目录下的 config.json 获取数据存储路径:
{
"dataDir": "./data",
"maxBackups": 5
}
dataDir:数据文件的存储目录,默认为./data(相对于 skill 目录,即 config.json 所在目录)。用户可修改为任意绝对路径或相对路径maxBackups:最大备份数量,默认5。超过此数量时自动删除最旧的备份- ⚠️ 每次操作数据文件前,必须先读取
config.json获取dataDir,若为相对路径则基于 config.json 所在目录解析为绝对路径后再使用
数据文件(统一在 config.dataDir 目录下)
按月拆分文件,每月一个文件包含该月的所有数据(月度目标、日任务、完成记录),避免单文件无限膨胀,同时文件数量可控(一年仅12个):
{dataDir}/
├── goals_yearly.json # 年度目标(唯一单文件,按年份分 key)
└── monthly/ # 每月一个文件
├── 2026-05.json
├── 2026-06.json
└── ...
{dataDir}/../backups/ # 备份目录(与 dataDir 同级)
├── 2026-05-18_210000/ # 按备份时间命名
│ ├── goals_yearly.json
│ └── monthly/
│ └── ...
├── 2026-05-17_210000/
└── ... # 最多保留 maxBackups 份
💡 文件路径拼接规则:
- 年度:{dataDir}/goals_yearly.json(单文件)
- 月度/日/完成记录:{dataDir}/monthly/{YYYY-MM}.json(每月一个文件)
- 文件不存在时创建,内容为空模板(见下方格式)
goals_yearly.json 格式(按年份分 key,唯一单文件)
{
"2026": [
{
"id": "uuid",
"content": "目标描述",
"category": "health|learning|work|life|other",
"createdAt": "2026-01-15",
"active": true,
"completed": false,
"progress": 0,
"notes": [
{
"id": "uuid",
"date": "2026-03-15",
"content": "阶段性进度或附属信息"
}
]
}
],
"2027": []
}
monthly/{YYYY-MM}.json 格式(每月一个文件,包含该月全部数据)
{
"goals": [
{
"id": "uuid",
"content": "月度目标描述",
"category": "health|learning|work|life|other",
"createdAt": "2026-05-01",
"active": true,
"completed": false,
"progress": 0,
"notes": [
{
"id": "uuid",
"date": "2026-05-10",
"content": "备注内容"
}
]
}
],
"days": {
"2026-05-01": [
{
"id": "uuid",
"content": "任务描述",
"source": "manual|yearly|monthly",
"sourceGoalId": "uuid(可选,关联来源目标)",
"sourcePeriod": "2026-05(对应月度)或 2026(对应年度)",
"completed": false,
"completedAt": null,
"createdAt": "ISO date"
}
],
"2026-05-02": []
},
"completion_log": [
{
"date": "2026-05-16",
"completed": ["task-id-1", "task-id-2"],
"total": 3,
"rate": 0.67
}
]
}
💡 年目标与月目标是并列的,不存在包含关系:用户独立设定年目标和月目标,日任务由二者共同生成。
💡 跨月目标处理:拆分为两条记录,分别写入对应月份文件,各月标注进度比例。
💡 notes 字段:目标的日志记录,用于记录目标的完整生命周期事件,包括进度更新、阶段性成果、完成记录等。每条记录含 id、date、content,按时间倒序存储(最新的在前)。新建目标时 notes 默认为空数组 []。完成目标、补充备注、删除目标等操作均应自动写入一条 note。
💡 progress 字段:目标当前进度,浮点数 0~1(归一化),0 表示未开始,1 表示已完成。新建目标时默认为 0,目标 completed=true 时为 1。补充备注时根据备注内容智能推断进度并更新此字段;若无法推断则保持原值不变。展示时乘以 100 转为百分比显示。
⚠️ completion_log 按日期倒序存储(最新的在前)。
用户命令(自然语言识别)
修改数据目录
Trigger: "修改数据目录", "换个存储位置", "数据存到XX"
将 config.json 中的 dataDir 更新为用户指定路径,并提示是否迁移已有数据文件到新目录。
添加目标
Trigger: "添加目标", "新增", "加一条", "我要..."
识别层级:
- 含「今年/明年/2026年」→ 年度目标,写入 goals_yearly.json
- 含「X月」→ 月度目标,写入 monthly/{YYYY-MM}.json 的 goals 字段(默认当年)
- 含「每天/每日」→ 日任务,写入 monthly/{YYYY-MM}.json 的 days.{YYYY-MM-DD} 字段
- 默认 → 日任务
跨月目标(如「5月、6月减肥15斤」):
拆分为两条记录,分别写入 monthly/2026-05.json 和 monthly/2026-06.json 的 goals 字段,content 注明归属月份。
添加后自动提示是否需要基于此目标自动生成日任务。
查看目标
Trigger: "查看目标", "我的目标", "看看计划", "列出"
显示指定年/月的目标,注明已完成状态。
- 「看看今年的目标」→ 读取 goals_yearly.json 的 "2026" key
- 「看看5月目标」→ 读取 monthly/2026-05.json 的 goals 字段
- 展示目标时,若该目标有 notes 则一并展示最近的备注内容
补充目标备注
Trigger: "补充备注", "记录进度", "记一下", "已完成XX(非完成目标)"
为目标添加附属备注信息,不改变目标的完成状态。
- 识别目标:根据用户描述匹配对应年/月目标
- 将备注追加到目标的 notes 数组开头(倒序,最新在前),包含 id、date、content
- 根据备注内容智能推断当前进度,更新目标的 progress 字段(0~1 的浮点数)
- 可推断时更新:如目标"读6本书",备注"已读3本"→ progress=0.5
- 无法推断时保持原值:如备注仅为附属信息,无法量化进度
- 若推断进度为 1,提示用户是否将该目标标记为已完成
⚠️ 补充备注 ≠ 完成目标,仅记录进度细节,不自动修改 completed 状态。
查看今日任务
Trigger: "查看今日任务", "今日任务", "今天的任务"
读取 monthly/{YYYY-MM}.json 的 days.{YYYY-MM-DD} 字段(当日),展示当日任务及完成状态。
查看/完成/删除目标
Trigger: "完成了XX", "XX做完了", "删除XX", "完成目标:XX", "删除目标:XX"
- 完成("完成了XX"):
- 日任务:标记 completed=true,记录完成时间,同步更新 monthly/{YYYY-MM}.json 的 completion_log
- 年/月目标:标记 completed=true,progress 更新为 1,同时在 notes 中追加一条完成记录(含完成日期和说明)
- 删除("删除XX"):采用软删除,标记 active=false,不物理移除数据
- 年/月目标:将 active 设为 false,该目标不再出现在日常展示和日任务生成中,同时在 notes 中追加一条删除记录
- 日任务:将 active 设为 false,该任务不再显示
- ⚠️ 已关联的日任务不清理,保留历史记录完整性
查看本月汇总
Trigger: "查看本月汇总", "本月汇总", "月度汇总"
读取 monthly/{YYYY-MM}.json 的 completion_log,输出本月完成率和目标完成情况。
生成/更新日任务
Trigger: "生成明天任务", "更新日任务"
读取月/年目标,智能生成日任务(按来源标注)。
自动生成逻辑(核心)
每日 21:00 日任务生成规则:
年目标与月目标是并列的,日任务由二者共同生成,不存在"年目标拆解为月目标"的逻辑。
- 执行数据备份:将
config.dataDir目录下的全部内容(含goals_yearly.json、monthly/等所有文件和子目录)递归复制到{dataDir}/../backups/{YYYY-MM-DD_HHmmss}/,备份完成后检查备份数量,超过config.maxBackups则按时间倒序删除最旧的备份 - 获取次日日期,提取 YYYY-MM-DD、YYYY-MM 和 YYYY
- 读取 monthly/{YYYY-MM}.json 的 goals 字段,取该月 active 目标
- 读取 goals_yearly.json 中次日所在年份("YYYY")的 active 目标
- 将上述月目标 + 年目标中每个 active 目标各生成一条日任务,内容根据原文长度决定(≤15字直接用原文,>15字概括核心),如"减肥7斤"、"读完8本书"等
- 写入 monthly/{YYYY-MM}.json 的 days.{YYYY-MM-DD} 字段,每条任务标 source、sourceGoalId、sourcePeriod
- 不覆盖已有记录,只追加
⚠️ 关键规则:日任务内容按目标原文长度决定展示方式,绝不自行推测时间/数量!
- 目标原文 ≤ 15 字:直接使用原文作为日任务内容
- "减肥7斤" → 日任务 = 减肥7斤
- "读完8本书" → 日任务 = 读完8本书
- 目标原文 > 15 字:在原文基础上概括核心,保留关键信息
- "5月减肥7斤,因为这个月我要去其他地方玩" → 日任务 = 减肥7斤
- "今年系统学习前端开发,完成React和Vue两个框架的实战项目" → 日任务 = 学习前端开发
- 不自行补充用户未提及的时长、频率、数量等细节
手动日任务:用户随时可添加,source=manual
定时任务
⚠️ 触发机制:skill 本身无法设置系统定时器,以下定时任务由外部调度器(如 cron、云函数定时触发)按时间调用,或由用户发消息时检查当前时间判断是否需要执行。
每日目标提醒(每天 08:00)
读取 monthly/{YYYY-MM}.json 的 days.{YYYY-MM-DD} 字段(当日),重点展示未完成任务,简要提及月/年目标。
明日任务生成(每天 21:00)
执行"自动生成逻辑",生成次日任务。
月度目标汇总(每月最后一天 21:00)
读取 monthly/{YYYY-MM}.json 的 completion_log,取本月记录,输出月度复盘。
推送格式
> 以下为模板定义,{} 内为动态变量,实际推送时替换为真实数据。
每日目标提醒(08:00)
📅 {M}月{D}日 {周X}
⏳ 今日任务:{未完成数}项未完成
{序号}. [ ] {任务内容} {来源标签}
{序号}. [x] {任务内容} {来源标签}
...
—— 🎯 目标进度 ——
{YYYY}年 | {目标内容}
{进度条} {百分比}%
{M}月 | {目标内容}
{进度条} {百分比}%
(仅展示未完成的年/月目标,已完成的不显示)
...
变量说明:
- 标题行:{M}月{D}日 {周X} + 未完成数;全部完成时显示 ⏳ 今日任务:全部完成 ✓
- 任务行:[ ] 未完成,[x] 已完成
- 来源标签:年目标 [年]、月目标 [月]、手动添加不显示
- 目标进度行:仅展示 completed=false 的年/月目标,已完成的不显示(避免消息随完成数增多而变长);年目标用 {YYYY}年 | 标注年份,月目标用 {M}月 | 标注月份;进度百分比由 progress 字段(0~1)乘以 100 取整得到;进度条 10 格,█ 填充 + ░ 空白
明日任务生成推送(21:00)
✅ 明日任务已生成
📆 {次日M}月{次日D}日 | 共{任务数}项
{序号}. {任务内容} {来源标签}
...
晚安,明天也要加油呀 💪
变量说明:
- 来源标签:年目标 [年]、月目标 [月]、手动添加不显示
月度目标汇总推送(月末 21:00)
📊 {M}月目标复盘
━━━━━━━━━━━━━━━━
📈 整体完成率:{百分比}%
📅 达标天数:{达标天数}天 / {有记录天数}天
— 目标完成情况 —
{目标内容} ✅ 已完成
{目标内容} 🔄 进行中({百分比}%)
...
— 任务统计 —
📝 总任务:{总数}项
✅ 已完成:{完成数}项
☐ 未完成:{未完成数}项
{M+1}月继续加油,未来可期 ✨
完成打卡反馈
当用户说"完成了XX":
- 单项完成:{任务内容} ✓ 剩余 {N} 项
- 全部完成:今日任务全部完成 ✓
边界场景
跨月/跨年处理
- 12月31日生成次日任务:次日为1月1日,需写入
monthly/{nextYear}-01.json,读取的月目标也是1月的,年目标取新年份 - 12月完成日任务:completion_log 写入
monthly/2026-12.json,即使当前已进入1月,完成记录仍归属于任务所在月份 - 跨月目标(如"5月、6月减肥15斤"):拆分为两条记录,分别写入各自月份文件
补录历史任务
- 用户补录昨天的任务时,按目标日期(而非当前日期)写入对应
monthly/{YYYY-MM}.json的days.{YYYY-MM-DD}字段 - 若目标日期跨月(如今天是6月1日,补5月31日的任务),写入
monthly/2026-05.json - completion_log 同样写入目标日期所在月份的文件
异常处理
config.json 损坏或缺失
- 若
config.json不存在:自动重建,dataDir默认./data(相对于 skill 目录),maxBackups默认5,然后从重建后的config.json中读取配置,并提示用户「配置文件缺失,已用默认配置重建」 - 若
config.json内容非法(JSON 解析失败):备份原文件为config.json.broken,用默认值重建,提示用户「配置文件损坏,已备份并重建默认配置」
dataDir 目录不存在
- 读写数据文件前检查
dataDir目录是否存在,不存在则自动创建(含monthly/子目录) - 提示用户「数据目录不存在,已自动创建」
数据文件损坏(JSON 解析失败)
- goals_yearly.json 损坏:备份为
goals_yearly.json.broken,重建空模板{},提示用户「年度目标文件损坏,已备份并重建空文件,历史数据需手动恢复」 - monthly/{YYYY-MM}.json 损坏:备份为
{YYYY-MM}.json.broken,重建空模板(goals/days/completion_log),提示用户「X月数据文件损坏,已备份并重建空文件,该月历史数据需手动恢复」 - ⚠️ 绝不静默丢弃数据,损坏文件必须备份后才可重建
数据文件缺失
- 文件不存在时直接创建空模板,无需额外提示(这是正常首次使用场景)
通用原则
- 先备份再修复:任何损坏文件都先
.broken备份,再重建 - 主动告知用户:异常情况必须提示,不可静默处理
- 最小影响:仅重建出问题的文件,不影响其他正常文件
- 可恢复:备份文件保留原始数据,用户有机会手动抢救
Rules
- UUID 生成方式:使用
Date.now() + 随机数拼接生成,不依赖外部 UUID 库。示例:Date.now().toString(36) + Math.random().toString(36).slice(2, 8) - 所有 JSON 数据文件必须格式化:写入时使用 indent=2 缩进,ensure_ascii=False 保留中文,不可压缩成一行
- 读取数据前必须先 load 对应文件
- 写操作后立即验证 JSON 可读
- 完成日任务时同步更新 monthly/{YYYY-MM}.json 的 completion_log
- 生成日任务时注明 sourceGoalId 和 sourcePeriod 便于追溯(月目标和年目标地位平等,不存在谁拆解谁)
- 每月汇总用上个月的时间范围(不是当月)
- 日任务生成不删除同日已有任务,只追加
- completion_log 每文件内按日期倒序存储(最新的在前)
- 年度/月度目标按年份/月份精确匹配,不是模糊匹配
- 每次读写数据文件前,必须先读取 config.json 获取 dataDir,若为相对路径则基于 config.json 所在目录解析为绝对路径,用其拼接完整文件路径,不可硬编码 data/ 目录
- notes 按时间倒序存储(最新的在前),补充备注时追加到数组开头
- notes 是目标日志,完成目标、删除目标等状态变更操作均须自动追加一条 note 记录
- 补充备注(notes)不改变目标 completed 状态,仅记录附属信息
- progress 字段为 0~1 的浮点数(归一化),新建目标默认 0,completed=true 时为 1;补充备注时根据内容智能推断进度并更新,无法推断则保持原值
- 推送格式中目标进度百分比由 progress × 100 取整得到,不另行计算