--- name: "birthday-reminder" description: "管理家人/朋友生日提醒。农历或阳历生日,每年换算公历,生日前7天、前3天、当天通过钉钉+飞书双通道提醒杨轩。" --- # 生日提醒 skill 统一管理杨轩的家人/朋友生日提醒。支持农历或阳历生日,每年换算公历日期,在生日**前7天、前3天、当天**通过**钉钉 + 飞书两个通道**提醒杨轩。 ## 触发场景 - 杨轩提供新的生日信息(农历或阳历) - 需要查询/修改/删除某个人的生日提醒 - 需要为下一年设置生日提醒 ## 成员生日库(记录于 MEMORY.md) | 人物 | 生日类型 | 出生日期 | 说明 | |------|---------|---------|------| | 汪礼平 | 农历 | 1968年六月二十日 | 三次提醒 | | 杨安顺 | 农历 | 1968年八月十八日 | 三次提醒 | | 王芳 | 农历 | 1993年十月初七日 | 三次提醒 | | 杨锦书 | 阳历 | 2021年11月10日 | 卷儿,阳历固定 | ## 换算规则 - **农历生日**:每年农历日期对应的公历日期都不同,需要用 lunar_python 逐年换算 - **阳历生日**:日期固定,不换算(如杨锦书每年都是11月10日) 农历换算命令(需要 lunar_python 已安装): ```bash python3 -c " from lunar_python import Lunar for year in range(2026, 2031): lunar = Lunar.fromYmd(year, 8, 18) # 月, 日(农历) solar = lunar.getSolar() print(f'{year}年农历8月18日 = 公历 {solar.getYear()}-{solar.getMonth():02d}-{solar.getDay():02d}') " ``` ## 提醒时间点计算 每年按公历生日计算三个提醒日,**当天 0 点(UTC)触发**: - 前7天 = 生日 - 7天 - 前3天 = 生日 - 3天 - 当天 = 生日当天 ## 创建 cron 任务(核心流程) 每个生日建**3 对一次性 cron 任务**(前7天/前3天/当天),每对含**钉钉 + 飞书各一条**。单条 cron 只能投一个渠道,双通道靠「孪生任务」实现。 投递目标(**必须显式设置,否则不会推送**): - 钉钉:`--announce --channel dingtalk-connector --to 0464031658857345` - 飞书:`--announce --channel feishu --to oc_8eecfa0e1cc185c1cb19b4f3950cbc52` (**必须用私聊 chat_id**;用用户 open_id 会被拒:`Sending messages to users is temporarily unavailable`) - 两条都加:`--session isolated --agent main --wake now --delete-after-run` - 飞书任务 `--name` 加后缀「(飞书)」,文案与钉钉版完全一致 命令模板(钉钉版;飞书版把 `--channel`/`--to` 换成上面飞书值,`--name` 加「(飞书)」): ```bash cd /home/yangxuan/.openclaw && openclaw cron create "" \ --name "<姓名>生日提前7天" \ --message "🎂 提醒:<姓名>生日快到了!7天后
就是生日。" \ --agent main \ --session isolated --announce --channel dingtalk-connector \ --to "0464031658857345" --wake now --delete-after-run ``` 一次建多条时写 python/shell 脚本循环调用(2026-09-17 用脚本一次建了 20 条飞书孪生任务),比逐条手敲快得多。 注意:`--at` 时间不带时区按 UTC 处理。北京时间 = UTC+8。 ## 步骤 1. 记录/更新生日信息到 MEMORY.md 的"🎂 生日提醒"区域 2. 若农历生日,用 lunar_python 换算当年及下一年的公历日期;若阳历则固定 3. 计算三个提醒日(前7天/前3天/当天) 4. 为每年分别创建 3 对(共 6 条)一次性 cron 任务:**钉钉 + 飞书各一条**,isolated session,**必须带 `--agent main`**(多 agent 环境下无 owner 任务会让调度器卡死,阻塞所有提醒);投递只交给 delivery,**禁止在 `--message`/command 里手动调 `openclaw message send`**(CLI 不认识 dingtalk-connector,会失败) 5. 验证:用 `openclaw cron list` 过滤「生日」,确认每个提醒日都有**钉钉 + 飞书**两条、effectiveAgentId=main、delivery.to 正确;"message send" 在整库应无残留 6. 更新 MEMORY.md 记录已完成设置的年份 ## 验证 创建后必须确认 delivery 已按渠道正确配置,否则提醒不会推送: - 钉钉任务 → `dingtalk-connector:0464031658857345` - 飞书任务 → `feishu:oc_8eecfa0e1cc185c1cb19b4f3950cbc52`(chat_id,非 open_id) (main session 的 system-event 默认不投递,必须显式走 announce。) ## 注意事项 - **当年提醒时效**:若当年提醒日已过,从下一年开始设置 - 任务为一次性,运行后自动删除;下一年需重新换算农历并新建 - 农历生日每年代入 lunar_python 换算公历日期(lunar_python 已通过 `pip install --break-system-packages --user lunar_python` 安装)