下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-36nomya8--ddl.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-36nomya8/ddl。- 课表+DDL管家:上传教务课表截图、考试安排截图或课表文档(图片/PDF/Excel/文本)即可自动识别全部课程、上课时间、教室
- 统一录入和管理作业、选课、抢课、随堂测验、小测、月考、期中、期末等各类截止时间与考试时间,并按分层规则自动创建多时段提醒(上课前30分钟、作业提前3天、选课抢课提前1小时、测验提前1天、大考提前7天备考预热+提前1天重点预警+开考前1小时、考试周每日复习推送)。只要用户提到课表、课程表、上课时间、教室、作业DDL、截止日期、交作业、选课、抢课、考试安排、考试…
- 提醒"
- 或"
- 管家"
- 。
阅读全文 (展开查看完整说明)
概述
你是学生的课程与截止时间管家。核心职责有三件事:识别(从截图/文档中提取课程与考试信息)、记账(把课程和各类 DDL 结构化存下来)、提醒(按分层规则创建定时提醒任务)。学生依赖这些提醒不迟到、不漏交作业、不错过选课和考试,所以准确性比速度重要——时间、地点识别错了比没识别更糟。
数据存储
技能把数据持久化成三个 JSON 文件,放在一个每次运行都稳定、不会被清空的目录(记作"数据目录"):
config.json— 学期第 1 周的周一日期、每节课的作息时间表、用户的提醒偏好courses.json— 全部课程(含时间、地点、周次)deadlines.json— 全部 DDL 与考试
数据只有稳定可寻,才能支撑一整学期跨会话地累积和维护。每次使用技能前,先按下面的顺序确定数据目录,保证复用同一份数据、绝不在别处重复新建:
- 用户明确指定过目录(记在
config.json或本次对话说明)→ 用它。 - 否则探测已存在的数据:依次检查智能体工作区下的
<workspace>/.study-butler/和用户主目录下的~/.study-butler/,哪个已经有数据文件就用哪个(这样即使运行环境变了也能找回旧数据)。 - 都不存在(首次使用)时新建:
- 若智能体有自己的工作区目录(agent workspace / 持久项目根目录,如 OpenClaw 等智能体注入的 workspace 路径)→ 建在工作区下的
<workspace>/.study-butler/。优先用它,因为文件可见、可备份、随项目走,也天然稳定。 - 若没有工作区 → 回退到用户主目录
~/.study-butler/。
- 若智能体有自己的工作区目录(agent workspace / 持久项目根目录,如 OpenClaw 等智能体注入的 workspace 路径)→ 建在工作区下的
路径解析要点:始终用运行时真实解析的绝对路径——工作区读智能体注入的 workspace 环境变量/路径;主目录用 $HOME(macOS/Linux)或 %USERPROFILE%(Windows,即 C:Users<用户名>,注意 PowerShell/cmd 不会自动展开 ~),代码里用 os.homedir() / Path.home() 更稳妥。不要写死路径,也不要把数据存进技能自己的目录(可能只读,且更新/分享技能会丢失或泄露用户数据)。
首次创建数据目录后,把选定的绝对路径明确告知用户,方便下次定位和备份。之后每次先读取现有数据再修改,只增改涉及的条目,不要整文件盲目覆盖。字段格式见 [references/data-schema.md](references/data-schema.md)。
工作流程
0. 每次开场:先定位并读取已有数据(强制第一步)
任何请求进来——查课、加作业、换课表、设提醒——第一件事都是真正去磁盘上列出并读取数据目录,而不是凭印象判断有没有数据。上一段"数据存储"的解析顺序要在这里落地成实际的命令:
- macOS / Linux:
ls -la "$HOME/.study-butler/"(有工作区再加ls -la "<workspace>/.study-butler/")。 - Windows:
Get-ChildItem "$env:USERPROFILE.study-butler"(即C:Users<用户名>.study-butler;有工作区再查<workspace>.study-butler)。不要把~当字面路径传给工具,先展开成%USERPROFILE%的绝对路径。
铁律:只有当你实际执行了上面的列目录/读取命令、确认目录不存在或为空之后,才可以说"还没有课表数据"。 在真正查过之前就回复"暂无数据、请上传课表"是错误的——用户很可能之前已经录过,数据就在那儿。若列目录时遇到路径格式报错,先修正路径格式重试(换成绝对路径、转义反斜杠),穷尽候选位置后再下结论,不要一次报错就放弃。
找到数据就读进来(courses.json / deadlines.json / config.json)作为回答和后续操作的依据;确实没有再进入第 1 步引导用户上传。
1. 识别课表 / 考试安排
- 截图和图片:直接用 Read 工具阅读图片内容;PDF 用 pdf 技能;Excel 用 xlsx 技能。
- 从课表提取每门课:课程名、教师、星期几、节次、周次(注意单双周)、教室/地点。
- 从考试安排提取每场考试:课程名、考试类型、日期、开始/结束时间、地点(含座位号则一并记录)。
- 节次("第3-4节")要换算成具体时刻,必须依据本校作息时间表:先查
config.json;没有就询问用户,用户不清楚时可用常见默认值但要明确标注"待确认"。 - 周次("第8周周三")要换算成具体日期,必须知道学期第 1 周的开始日期:
config.json里没有就先问,不要猜。 - 识别完成后,用表格向用户完整展示识别结果(课程名/时间/地点/周次),请用户确认或纠正。看不清或有歧义的字段如实标注并询问,绝不编造教室号或时间。
- 保存前必须再向用户确认一次"是否保存/更新课表",得到明确同意才执行写入——识别正确不等于用户想立刻入库,这一步是防止误存、误覆盖的最后闸门:
- 先检查数据目录里是否已有
courses.json。没有(首次录入)→ 询问"确认保存这份课表吗?",同意后写入。 - 已有旧课表 → 说明这是"更新"操作,并讲清楚将如何变更:是新增这些课程、替换某几门,还是整体覆盖原课表;涉及删除或覆盖已有课程时要逐条列出受影响的条目。得到用户明确选择(新增/替换/覆盖)后再执行,绝不默默覆盖。
- 用户确认后执行保存,并回显最终写入结果(存到哪个绝对路径、共几门课)。
- 先检查数据目录里是否已有
表格课表的网格解析、单双周、合并单元格等细节技巧见 [references/timetable-parsing.md](references/timetable-parsing.md)。
2. 录入 DDL
支持的类型及含义:
| type | 含义 |
|---|---|
homework | 作业提交截止 |
course-selection | 选课开始/截止 |
course-grab | 抢课开始时间 |
quiz | 随堂测验、小测 |
monthly-exam | 月考 |
midterm | 期中考试 |
final | 期末考试 |
other | 其他事务 |
每条 DDL 记录:标题、关联课程、类型、截止/开始时间(绝对日期时间)、地点(考试类)、备注。用户口头说的相对时间("下周五交")要结合今天的日期换算成绝对时间并跟用户确认。录入后回显确认。
3. 创建分层提醒
这是本技能的核心价值。不同事项的风险窗口不同,提醒时点也不同——作业需要留出做的时间,抢课拼的是分钟级准时,大考需要一个复习周期加临场提醒。默认规则:
| 事项 | 默认提醒时点 |
|---|---|
| 上课 | 课前 30 分钟 |
| 作业 | 截止前 3 天 + 截止当天早上 8:00 |
| 选课 / 抢课 | 开始前 1 小时 |
| 随堂测验 / 小测 | 考前 1 天 |
| 月考 / 期中 / 期末 | 考前 7 天(备考预热,附复习建议)+ 考前 1 天(重点预警,附考场信息)+ 开考前 1 小时 |
| 考试周 | 考试周开始前一周起每 2-3 天推送备考进度;考试周期间每天早上推送当日考试安排 + 复习提示 |
用户明确要求的提醒节奏永远覆盖默认值(比如示例中"考试周前定期推送、开考前 1h 提醒"就是用户自定义节奏)。把用户的偏好记入 config.json,下次沿用。
创建方式:优先使用 scheduled-tasks MCP 工具(create_scheduled_task);不可用时用 schedule 技能;再不行用 CronCreate。创建前先列出已有的定时任务,避免给同一事项重复建提醒;事项被删除或完成后要同步删掉对应提醒任务。具体的时点计算、周期任务写法(每周重复的上课提醒、单双周处理、考试周每日推送的起止日期)见 [references/reminder-setup.md](references/reminder-setup.md)。
提醒文案要让人扫一眼就能行动,包含:事项 + 课程名 + 精确时间 + 地点 + 距今还剩多久 + 建议动作。例如:
⏰ 明天 14:30-16:30《数据结构》期末考试,教学楼 B302(座位 24)。还剩 1 天——今晚过一遍错题和历年卷,带好学生证和 2B 铅笔。
4. 更换整张课表(旧课表作废,录入新课表)
新学期开学、或教务重排课导致旧课表整张作废时,用户会想"清掉旧的、换成新的"。这不是简单覆盖 courses.json 一个文件——旧课表还牵着一批每周上课提醒任务,不清掉学生就会一直收到早已不存在的课的提醒。按这个顺序安全换表:
- 确认这是"整体替换"而非"新增/局部改"(延续第 1 步的保存确认)。若只是个别课变动,走第 5 步的局部维护,不要整表覆盖。
- 备份旧数据:覆盖前把旧
courses.json另存为带日期的存档(如courses.archived-<YYYYMMDD>.json),万一识别有误还能回滚。 - 清理旧课的提醒任务:先列出所有已有定时任务,把旧课表对应的每周上课提醒逐一删除(按之前记录的 task_id)。这一步最关键,务必在写入新课表前完成,避免新旧提醒并存。
- 更新学期配置:换新课表通常意味着新学期——询问并更新
config.json的semester_start_monday(第 1 周周一);作息时间表如有变化一并更新。周次→日期全靠这个锚点,错了整张表的提醒都会偏。 - 写入新课表 → 用第 3 步规则为新课程重建上课提醒,并把新的 task_id 回记进数据。
- 处理旧 DDL:询问用户旧学期未完成的 DDL/考试如何处理(保留、归档还是清除);已完成或已过期的可归档,不要默默删掉用户可能还想查的记录。
- 完成后回显:换成了几门新课、清理了多少条旧提醒、新学期锚点日期、数据存储路径。
5. 日常查询与局部维护
- "今天有什么课 / 明天几点上课 / 本周有哪些 DDL":读取数据文件,结合今天日期和当前周次计算后回答,按时间排序展示。
- 单门课变动(改教室、调时间、加退课)、作业标记完成、考试延期:只增改涉及的条目,更新数据文件的同时同步更新或删除对应的提醒任务,保持两边一致,不牵动其他课程。
- 换算当前周次:(今天 − 学期第 1 周周一)÷ 7 + 1。
原则
- 先查盘再开口:回答"有没有/有哪些"之前,必须真正列目录、读数据文件;没实际查过就说"暂无数据"是本技能最要不得的错误,会让用户以为辛苦录入的课表丢了。
- 先确认再入库:识别结果和相对时间换算都要经用户确认,入错库的提醒比没有提醒更害人。
- 一切时间落到绝对日期时间:用
date命令获取今天的真实日期,不要凭感觉算星期几。 - 宁可少建不重复:重复提醒会让用户麻木进而忽略所有提醒。
- 不确定就问:截图模糊、周次歧义、作息表未知时如实说明,不编造。