Install
openclaw skills install @elle-yu/knowledge-review学习知识管理系统。支持知识点录入、分类存储、每日早间学习建议推送、晚间知识回顾推送、专项备考管理(含大纲和DDL追踪)、知识点查询与维护。触发方式:学了/学习了/知识点/记录一下/知识:/K:/学到了/第N条/展开/查一下/搜索/开启专项/进度/大纲等。适用于备考/持续学习场景。
openclaw skills install @elle-yu/knowledge-review/home/ubuntu/.openclaw/workspace/skills/knowledge-review//home/ubuntu/.openclaw/workspace/data/所有数据以 JSON 文件存储,路径相对于 /home/ubuntu/.openclaw/workspace/:
| 文件 | 路径 | 用途 |
|---|---|---|
| 知识点 | data/knowledge-items.json | 所有学习知识点的存储 |
| 专项数据 | data/special-projects.json | 专项备考项目(含大纲) |
| 回顾统计 | data/review-stats.json | 最后推送时间、寄语去重、回顾会话历史 |
| 兜底寄语 | data/fallback-greetings.json | 30 条学习鼓励寄语(web_fetch 失败时降级) |
详见 Plan 文档第 4 节「数据模型」。
本 skill 通过关键词匹配识别用户意图。
重要规则:Agent(主模型)本身不过滤任何输入。无论用户说什么,只要包含以下触发词,即进入本 skill 的处理逻辑。由 skill 决定是否匹配或回退到普通对话。
| 意图 | 触发词 | 示例 |
|---|---|---|
| 知识录入 | 学了, 学习了, 知识点, 记录一下, 知识:, K:, 学到了, 刚学了, 今天学了, 学了一个新知识图片OCR:发送图片时 | "学了 BGP 选路原则" 发送 PPT/截图/笔记图片 → 自动 OCR 提取知识点 |
| 删除 | 删除 #, 删除第, 删除第 | "删除 #23" |
| 修改 | 修改 #, 修改第, 修改第 | "修改 #15 BGP 选路:LP 越大越优先" |
| 展开/查看 | 第N条, 展开 #, 展开第, 看第, 详情 | "第3条"、"展开 #8" |
| 专项创建 | 开启, 创建 + 专项, 开一个 + 专项, 启动 + 专项 | "开启HCIE专项" |
| 专项关闭 | 关闭 + 专项, 结束 + 专项 | "关闭HCIE专项" |
| 专项进度 | 进度, 进展 | "HCIE进度"、"专项进度" |
| 主副专项 | 设.*为主, 设.*为副, 设.*为主.*副, 切换主专项 | "设HCIE为主专项,AI为副专项" |
| DDL 修改 | 延期, DDL改为, 截止改为, DDL改成 | "HCIE延期到9月1号" |
| 目标修改 | 目标改为, 目标改成 | "HCIE目标改为100点" |
| 大纲查看 | 大纲 (不含补充、不含查看大纲时的专项名) | "HCIE大纲" |
| 大纲补充 | 大纲补充: | "HCIE大纲补充: BGP进阶, MPLS TE" |
| 查询 | 查一下, 搜索, 查找, 查找一下, 搜一下, 查询 | "查一下 BGP" |
| 没有/没学 | 没有, 没学 (在追问的上下文中) | — |
| 快问快答答案 | 答案, 答对, 错了, 第X题错了 | 查看答案或反馈结果 |
当用户发送图片(飞书消息中带有图片附件)时,按以下流程处理:
exec 命令 curl -o /tmp/ocr_input.png "<图片URL>" 下载convert /tmp/ocr_input.png -colorspace Gray -deskew 40% -threshold 55% /tmp/ocr_prepped.png
tesseract /tmp/ocr_prepped.png /tmp/ocr_output -l chi_sim+eng --psm 6 2>&1 && cat /tmp/ocr_output.txt
-l chi_sim+eng:中文简体 + 英文混合识别--psm 6:假设文字为均匀排列的块(适合 PPT 截屏/笔记)从图片中识别到 N 个知识点: + 列表全部录入 一键存储,也可 去掉第X条 排除识别结果可能不够准确,请检查: + 文本rm -f /tmp/ocr_input.png /tmp/ocr_prepped.png /tmp/ocr_output.txt
边界条件:
"学了 BGP 选路原则:AS-Path 越短越优先" → 正文为 "BGP 选路原则:AS-Path 越短越优先""知识: 等保2.0的五个等级" → 正文为 "等保2.0的五个等级"| 场景 | 处理 |
|---|---|
| 正文长度 < 10 字符 | 提示"知识点太短了(少于10个字),是否补充更多内容?" |
| 正文长度 > 500 字符 | 截断到 500 字符,并提示"知识点较长,已截断到 500 字" |
| 内容仅包含触发词无后续内容 | 提示"请告诉我具体学了什么" |
references/classify-rules.md 中的分类映射表匹配方法:对正文逐个测试分类关键词的包含关系。关键词大小写不敏感(英文关键词统一小写匹配)。
匹配示例:
正文: "BGP 选路原则:AS-Path 越短越优先"
→ 匹配 "BGP"(网络-路由协议)→ 分类: 网络, 子分类: 路由协议
→ 不匹配其他分类更高优先级的关键词 → 结果: 网络/路由协议
正文: "防火墙配置了拒绝所有入站流量"
→ 匹配 "防火墙"(网络安全)→ 分类: 网络安全
→ 虽然"防火墙"不能与网络直接竞争(网络安全优先级更高)
正文: "Docker 的网络模式包括 bridge、host、none"
→ 匹配 "Docker"(云计算-容器技术)→ 分类: 云计算, 子分类: 容器技术
→ 匹配 "网络"(网络)→ 但云计算优先级高于网络 → 结果: 云计算/容器技术
special-projects.json 获取所有活跃专项(status=active)special_project 设为该专项的 IDtotal_learned +1learned +1outline 中对应模块的计数关联示例:
知识点: "MPLS VPN 跨域方案 Option A/B/C"
活跃专项: HCIE(大纲含 "MPLS VPN" 模块)
→ 关联到 HCIE 专项
→ HCIE.total_learned +1
→ MPLS VPN 模块.learned +1
knowledge-items.json,取所有条目中的最大 id 值简化重复检测方法:提取正文中的前 2-3 个关键名词,查找是否有包含相同关键词组的知识点即可(不需复杂 NLP)。
数据结构(追加到 knowledge-items.json):
{
"id": 23,
"content": "BGP 选路原则:AS-Path 越短越优先",
"category": "网络",
"sub_category": "路由协议",
"tags": ["BGP", "HCIE"],
"special_project": "hcie",
"created_at": "2026-05-30T09:00:00+08:00",
"last_reviewed_at": null,
"review_count": 0,
"deleted": false,
"edit_history": []
}
确认输出格式:
✅ 已记录 #23
📂 网络 - 路由协议
🏷️ BGP, HCIE
📅 2026-05-30
要点:
created_at 取当前北京时间(UTC+8),格式 ISO 8601last_reviewed_at 初始为 nullreview_count 初始为 0deleted 初始为 falseedit_history 初始为空数组tags 初始空数组,但从内容和关联专项中提取关键词作为 tag删除 #N 或 删除第N条 → 提取 Nknowledge-items.json,查找 id=N 且 deleted=false 的条目❌ 找不到 #N,请确认编号是否正确确认要删除 #N 吗?
🔹 #N 内容: BGP 选路原则:AS-Path 越短越优先
回复"确认"或"是"继续,回复其他取消
deleted 设为 true,保留 created_at 等元数据total_learned -1 和大纲模块 learned -1(不低于 0)✅ 已删除 #N修改 #N 新内容 → ID=N, 新内容=之后全部修改第N条 新内容 → 同上knowledge-items.json,查找 id=N 且 deleted=false 的条目❌ 找不到 #Ncontent 推入 edit_history 数组content 为新值category, sub_category, tagslast_reviewed_at 为当前时间✅ #N 已更新
📂 网络 - 路由协议(原: 其他)
📝 旧: xxx
📝 新: xxx
第N条 或 展开 #N 或 看第N条deleted=false 的条目❌ 找不到 #N输出:
🔹 #N 知识标题
完整内容: ...
📂 分类: 网络 - 路由协议
🏷️ 标签: BGP, HCIE
📅 录入时间: 2026-05-30
👀 回顾次数: 2
🕐 最近回顾: 3天前
🔗 相关知识点(同分类):
- #12 网络边界防护策略
- #31 BGP 路由反射器
- #45 OSPF LSA 类型
last_reviewed_at 最久优先排序(越久越需要复习)"暂无相关知识点" 如果没有任何关联触发:cron 定时任务(周一至周五 9:00 北京时间)
流程:
review-stats.json,更新 last_morning_review 为当前时间special-projects.json 获取活跃专项knowledge-items.json 获取近期学习统计输出模板 A — 有专项时:
🌅 早安!今日学习建议 · 2026-05-30
🏁 专项: <name>(<role>)
├── 已学: <total_learned>/<total_target> (<percent>%)
├── 剩余: <remaining> 点
├── DDL: <ddl>(剩 <days_left> 天)
├── 日需: ~<daily_needed> 个/天
└── <urgency_emoji> <urgency_text>
📖 今日建议学习方向:
1. <module1>(大纲第 x 章)
2. <module2>(大纲第 x 章)
(大纲推荐:优先推荐未开始的模块,其次是学习中未完成的模块)
如有紧迫提醒(DDL<30天且进度<60%):
🔴 紧迫提醒:<name> DDL 仅剩 <days_left> 天,还有 <remaining> 个知识点未学!
⚠️ 每日需学 <daily_needed> 个知识点,建议翻倍!
放入输出最顶部(紧迫 > 问题 > 大纲推荐 > 寄语)。
紧迫判断(详见 special-project-spec.md 第 2 节):
多个活跃专项:取主专项输出,副专项仅展示一行:
🏁 主专项: HCIE 备考 — 23/80 (29%) 🟢
🎯 副专项: AI 深度学习 — 5/50 (10%) 🟢
输出模板 B — 无专项时:
🌅 早安!· 2026-05-30
📊 最近 7 天学习了 <count_7d> 个知识点,保持节奏!
📖 今天想学什么方向?网络 / 安全 / 云计算 / AI 任你挑。
最近 7 天学习统计:统计 knowledge-items.json 中 created_at 在最近 7 天内的条目数(非删除)。
寄语 置于末尾:💬 <寄语内容>
大纲为空时的降级:如果专项有 outline 但为空数组或所有模块已完成,则推荐句子改为:
📖 今日建议:复习已学知识点,巩固记忆!
触发:cron 定时任务(周一至周五 17:30 北京时间)
流程:
review-stats.json,更新 last_afternoon_review 为当前时间knowledge-items.json 获取所有 deleted=false 的知识点last_reviewed_at 和 review_countreview_sessions抽样策略(详见 special-project-spec.md 第 1.3 节):
知识点总数 < 5 时:有多少推多少,不执行权重抽样
有主+副专项:
55% 主专项 → 3 条(从 special_project=主专项ID 中抽样)
15% 副专项 → 1 条(从 special_project=副专项ID 中抽样)
30% 常规 → 1 条(从无专项关联或关联已关闭的知识点中抽样)
仅主专项(无副):
70% 主专项 → 4 条
30% 常规 → 1 条
无专项:
100% 常规 → 5 条(从全部知识点按 last_reviewed_at 最久优先)
抽样内部方法:
last_reviewed_at 升序排序(越久未回顾越优先)全部回顾过处理(专项池或全库知识点在 48 小时内全部被回顾过):
输出:
📚 知识回顾 · 2026-05-30 傍晚
🔹 #12 BGP 选路:AS-Path 越短越优先
📂 网络 · 🏷️ HCIE · 5天前
🔹 #8 等保 2.0 基本要求
📂 网络安全 · 12天前
...
❓ 今天学了哪些新知识点?
📝 回复新知识点即可记录;回复「第X条」展开复习
每条显示格式:
🔹 #<id> <content_前40字...>
📂 <category> · 🏷️ <tags_逗号> · <距离上次回顾的天数>天前
last_reviewed_at 为 null → 显示"新"寄语 置于追问之后:💬 <寄语内容>
追问应答规则:
| 用户回复 | 处理 |
|---|---|
| 知识点内容 | 调用知识录入(A. 知识录入),录入后确认 |
| "没有" / "没学" | 回复"明天加油!" |
| "第X条" / 数字 | 调用展开复习(B.3) |
| 其他内容 | 正常对话 |
| 不回复 | 不追问,下次正常推送 |
每次推送后追加一条回话记录到 review-stats.json 的 review_sessions 数组:
{
"time": "2026-05-30T17:30:00+08:00",
"type": "afternoon",
"item_ids": [12, 8, 5, 23, 15],
"greeting": "学习从来无捷径,循序渐进登高峰。"
}
定时触发:通过 cron 每隔一天的 9:00 触发(与早间学习建议错开,隔日轮换)。
编排方式:早间学习建议每天 9:00 触发,快问快答与学习建议交替执行——
实现判断:
review-stats.json 中的 last_quiz_date 字段last_quiz_date 为 null(从未答过)→ 当前推送快问快答,设置 last_quiz_date 为今天last_quiz_date 不是昨天(距今天 >= 2 天)→ 推送快问快答,更新 last_quiz_datelast_quiz_date 是昨天 → 推送学习建议,不更新 last_quiz_dateCron 配置:统一用每天 9:00 的 cron,由 skill 逻辑判断当天是学习建议还是快问快答。
总题数 = 5
专项相关 = ceil(5 * 0.7) = 4 题(若无活跃专项则全部均摊)
其他分类 = 5 - 专项数
题型混合:填空 2 题 + 选择 2 题 + 判断 1 题
基于 knowledge-items.json 中的知识点自动生成题目:
A. 填空题(2 题)
____示例:
知识点: "BGP 选路原则:AS-Path 越短越优先"
→ 填空: "BGP 选路中,AS-Path 越____越优先"
答案: 短
知识点: "CAPWAP 协议在 AP 与 AC 之间建立隧道,实现对 AP 的控制和业务配置"
→ 填空: "____ 协议在 AP 与 AC 之间建立隧道"
答案: CAPWAP
B. 选择题(2 题)
示例:
知识点: "FAT AP 独立配置管理,无需 AC;FIT AP 依赖 AC 进行配置管理"
Q: 关于 FAT AP 和 FIT AP,正确的是?
A. FAT AP 需要 AC 才能工作
B. FIT AP 独立配置无需 AC
C. FAT AP 独立配置,无需 AC ← 正确答案
D. FAT AP 和 FIT AP 都需要 AC
C. 判断题(1 题)
示例:
知识点: "VAP 是单个物理 AP 虚拟出的多个虚拟 AP"
→ 判断题: "VAP 是单个物理 AP 虚拟出的多个虚拟 AP" → ✅ 正确
反转后: "VAP 是多个物理 AP 合并为一个虚拟 AP" → ❌ 错误
命题原则:
⚡ 快问快答 · 2026-06-01
📝 填空题
1. AP 与 AC 之间通过____协议建立隧道
2. WLAN 中,ESS 由多个使用相同____的 BSS 构成
📋 选择题
3. AP 获取 AC 地址的方式不包括?
A. DHCP option 43
B. 广播方式
C. DNS 解析
D. 静态配置
4. 关于 VLAN POOL,正确的是?
A. VLAN POOL 不支持 Hash 分配
B. 同一 SSID 下用户只能获取同一 VLAN
C. VLAN POOL 关联到 VAP-Profile
D. VLAN POOL 只能包含一个 VLAN
✅❌ 判断题
5. FIT AP 不需要 AC 即可独立完成配置管理
---
📝 回复「答案」查看正确答案
🏷️ 专项: HCIE(4题) | 常规(1题)
💬 <寄语>
用户回复「答案」时,推送:
⚡ 快问快答 · 答案
1. CAPWAP — 答对了吗?
2. SSID — 答对了吗?
3. C — DNS 解析(AP 获取 AC 地址的方式包括 DHCP option 43、广播、静态配置,不包括 DNS)
4. C — VLAN POOL 关联到 VAP-Profile
5. ❌ 错误 — FIT AP(瘦 AP)依赖 AC 进行配置管理,FAT AP 才可独立工作
---
📊 你答对了几题?
💪 答错的知识点已标记,明天早间回顾会优先复习~
标记机制:
答对3题 或 第1题错了 等反馈,系统将对应知识点 last_reviewed_at 置为更早的日期(提高回顾优先级)| 场景 | 处理 |
|---|---|
| 知识点 < 5 条时 | 有多少出多少题,提示「知识库还在成长,题目较少」 |
| 零知识点 | 推送「知识库还是空的,先记录一些知识点吧!」 |
| 专项知识不足 4 条 | 从常规知识补充 |
| 用户不回复答案 | 不追问,下次正常推送 |
| 题目生成失败(内容太短) | 跳过该知识点,从备选池取下一个 |
开发时需确认以下事项并移除本标记:
review-stats.json 中添加 last_quiz_date 字段last_quiz_date 决定推送类型开启<名称>专项 或 开启<名称>,取开启后、专项前的字符串DDL, 截止, 到, 后接日期格式(8月15号, 2026-08-15, 8月15日)目标, 点, 个 等关键词提取数字大纲:, 模块:, 后接逗号分隔的模块列表名称处理:
专项 ID 生成规则(转小写英文或拼音首字母):
冲突处理:
| 场景 | 处理 |
|---|---|
| 已有同名活跃专项 | 提示已存在,询问是否要重新激活 |
| 已有主专项,新专项也设为主 | 询问:替换旧主专项为新主(旧降为副),或设新专项为副 |
| 已有副专项,新专项也设为副 | 提示最多1个副专项,询问是否替换 |
创建确认输出:
🏁 已创建专项: <name>(<role>)
📋 目标: <target> 点
⏰ DDL: <ddl>
📝 是否要补充学习大纲?(如:BGP/MPLS/IPv6/安全等模块)
回复「大纲: xxx, xxx」即可添加
切换主专项:
切换主专项为<名称> 或 设<名称>为主专项secondary(若有副专项,旧副改为 secondary 然后新主替代)primary未找到<名称>专项设副专项:
设<名称>为副专项active(无角色,仍活跃但不参与权重),新设的改为 secondary权重更新:角色变更后,自动按 special-project-spec.md 1.3 节更新抽取权重。
单项进度:
用户: HCIE进度
→ 匹配提取专项名称 "HCIE"
🏁 HCIE 备考 · 主专项
📊 进度: 23/80 (29%)
📅 DDL: 2026-08-15(剩 77 天)
⚡ 日需: ~1 个/天
<urgency_emoji> <urgency_text>
📋 大纲: 4 个模块,3 个进行中
1. ✅ BGP(3/10)
2. 🕐 MPLS VPN(2/8)
3. 🕐 IPv6(0/5)
4. ⬜ SDN(0/0)
全局进度:
用户: 专项进度
🏁 主专项: HCIE 备考 — 23/80 (29%) 🟢
🎯 副专项: AI 深度学习 — 5/50 (10%) 🟢
(若某个不存在则不展示该行)
补充大纲:
HCIE大纲补充: BGP进阶, MPLS TEoutline(target=0, learned=0)✅ 已补充 HCIE 大纲,新增 2 个模块:
- BGP进阶
- MPLS TE
查看大纲:
HCIE大纲(不含"补充"关键词)HCIE延期到9月1号 或 HCIEDDL改为9月1号YYYY-MM-DD关闭HCIE专项 或 HCIE专项结束status=closed, closed_at=当前时间✅ HCIE 备考 已关闭。
(若有升级)🎯 AI 深度学习 已自动升级为主专项。
HCIE目标改为100点 或 HCIE目标改成100total_target,不重置 total_learned查一下 <关键词>、搜索 <关键词>、查找 <关键词>knowledge-items.json 中搜索 deleted=false 的条目,匹配以下字段:
content 包含关键词category 包含关键词tags 中任一 tag 包含关键词🔍 未找到包含 "<关键词>" 的知识点📋 "<关键词>" 相关知识点 (共 N 条)
#12 BGP 选路:AS-Path 越短越优先 📂 网络 · 🏷️ HCIE
#23 MPLS LDP 📂 网络
#31 BGP 路由反射器 📂 网络 · 🏷️ HCIE
...
#<id> <content前20字...> 📂 <category> · 🏷️ <tags>调用时机:每次早间/晚间推送前调用。
获取流程:
使用 web_fetch 搜索学习名言:
https://www.baidu.com/s?wd=学习励志名言https://www.google.com/search?q=学习励志名言<blockquote>, 引号内的句子也可尝试其他 API:
web_fetch https://v1.hitokoto.cn/?c=d # 一言 API(可能返回励志句子)
与 review-stats.json 中 used_greeting_keywords 数组去重:
降级策略(web_fetch 失败/超时/无结果时):
fallback-greetings.json 中的所有寄语去重维护:
used_greeting_keywords超时处理:web_fetch 等待不超过 3 秒,超时直接降级到本地兜底。
最后一步:将寄语文本返回给推送模块,嵌入推送消息中。
用户: 学了 BGP 选路原则:AS-Path 越短越优先
Agent(技能处理):
→ 提取正文: "BGP 选路原则:AS-Path 越短越优先"
→ 分类匹配: 网络-路由协议(匹配"BGP""路由")
→ 专项关联: 检查活跃专项 → 关联到 HCIE(大纲含 BGP 模块)
→ 存储(ID=23, category=网络, sub_category=路由协议, special_project=hcie)
→ 输出:
✅ 已记录 #23
📂 网络 - 路由协议
🏷️ BGP, HCIE
📅 2026-05-30
用户: 修改 #15 OSPF 的 LSA 类型有 1/2/3/4/5/7
Agent:
→ 提取 ID=15, 新内容="OSPF 的 LSA 类型有 1/2/3/4/5/7"
→ 查找 #15 → 找到
→ 更新 content,旧内容入 edit_history
→ 重新分类:匹配"OSPF" → 网络-路由协议
→ 确认输出
✅ #15 已更新
📂 网络 - 路由协议(原: 网络)
📝 旧: OSPF 介绍
📝 新: OSPF 的 LSA 类型有 1/2/3/4/5/7
用户: 开启HCIE专项,DDL 8月15号,目标80点,大纲: BGP, MPLS VPN, IPv6, SDN
Agent:
→ 提取: name="HCIE 备考", ddl="2026-08-15", target=80, outline=[BGP, MPLS VPN, IPv6, SDN]
→ 专项 ID = "hcie"
→ 设为 primary role
→ 创建确认
🏁 已创建专项: HCIE 备考(主专项)
📋 目标: 80 点
⏰ DDL: 2026-08-15
📋 大纲模块: 4 个
- BGP, MPLS VPN, IPv6, SDN
用户: HCIE进度
Agent:
→ 查找 HCIE 专项
→ 计算进度: 23/80=28.75%
→ DDL 剩余: 77 天
→ 紧迫判断: 🟢 节奏正常
→ 输出:
🏁 HCIE 备考 · 主专项
📊 进度: 23/80 (29%)
📅 DDL: 2026-08-15(剩 77 天)
⚡ 日需: ~1 个/天
🟢 节奏正常
📋 大纲: 4 个模块,3 个进行中
1. ✅ BGP(3/10)
2. 🕐 MPLS VPN(2/8)
3. 🕐 IPv6(0/5)
4. ⬜ SDN(0/0)
用户: 查一下 BGP
Agent:
→ 搜索 content/tags 包含 BGP 的知识点
→ 找到 3 条(#12, #23, #31)
→ 输出:
📋 "BGP" 相关知识点 (共 3 条)
#12 BGP 选路:AS-Path 越短 📂 网络 · 🏷️ BGP, HCIE
#23 MPLS LDP 标签分发 📂 网络 · 🏷️ MPLS, HCIE
#31 BGP 路由反射器规则 📂 网络 · 🏷️ BGP, HCIE
🌅 早安!今日学习建议 · 2026-05-30
🏁 专项: HCIE 备考(主)
├── 已学: 23/80 (29%)
├── 剩余: 57 点
├── DDL: 2026-08-15(剩 77 天)
├── 日需: ~1 个/天
└── 🟢 节奏正常
📖 今日建议学习方向:
1. BGP 路由策略与正则表达式(大纲第 1 章)
2. MPLS VPN 跨域方案(大纲第 2 章)
💬 不积跬步,无以至千里;不积小流,无以成江海。
📚 知识回顾 · 2026-05-30 傍晚
🔹 #12 BGP 选路:AS-Path 越短越优先
📂 网络 · 🏷️ HCIE · 5天前
🔹 #8 等保 2.0 基本要求
📂 网络安全 · 12天前
🔹 #5 Docker 网络模式
📂 云计算 · 8天前
🔹 #23 MPLS LDP 标签分发
📂 网络 · 🏷️ HCIE · 3天前
🔹 #15 Prompt Engineering 技巧
📂 AI · 15天前
❓ 今天学了哪些新知识点?
📝 回复新知识点即可记录;回复「第X条」展开复习
💬 学习从来无捷径,循序渐进登高峰。
| # | 场景 | 处理方式 |
|---|---|---|
| 1 | 零知识点时推送 | 推送鼓励消息,展示"暂无知识点,快开始学习吧!" |
| 2 | 知识点总数 < 5 条 | 晚间回顾有多少推多少,不做严格权重抽样 |
| 3 | 专项大纲为空 | 早间推送降级为"复习已学知识点" |
| 4 | 知识点正文 < 10 字 | 提示太短,询问是否补充 |
| 5 | 知识点正文 > 500 字 | 截断到 500 字符并提示 |
| 6 | 无法分类 | 归为"其他"并提示可手动修改 |
| 7 | 疑似重复知识点 | 提醒但允许用户确认后存储 |
| 8 | web_fetch 获取寄语失败 | 降级使用 fallback-greetings.json |
| 9 | cron 重启丢失 | 读取持久化的 review-stats.json 恢复状态 |
| 10 | 修改不存在的 ID | 提示"找不到 #N" |
| 11 | 删除后不在回顾中展示 | 除法和查询时过滤 deleted=true |
| 12 | 专项知识点不足权重所需 | 差额补其他类别 |
| 13 | 所有寄语已用一遍 | 清空去重池重新轮转 |
| 14 | 单个用户消息含多个知识点 | 只取第一个触发词后的内容,提醒"一次记一个知识点更高效" |
在 OpenClaw 中配置两条 cron job:
调度:每天 9:00 触发
逻辑:skill 读取 review-stats.json 中 last_quiz_date 字段,自动判断:
last_quiz_date 为 null 或 last_quiz_date 不是昨天 → 触发 E. 快问快答,并更新 last_quiz_date 为今天last_quiz_date 是昨天 → 触发 C.1 早间学习建议# schedule: "30 17 * * 1-5"
# timezone: "Asia/Shanghai"
# command: 发送此消息到技能频道或飞书用户
# "知识回顾:晚间回顾"
触发后,Agent 应当:
如果 cron 重启导致错过推送时间:
review-stats.json 的 last_morning_review 和 last_afternoon_review