Install
openclaw skills install skill-h-meeting-sync【会议状态同步后台守护任务】每25分钟由 OpenClaw cron 触发一次。负责同步腾讯会议与各 Gitea 仓库之间的会议状态一致性,处理会议取消、改期、新增三种场景,并定期归档过期会议目录。不处理会议创建(用 skill-a)、会前简报(用 skill-b)、会后纪要(用 skill-c)等场景。
openclaw skills install skill-h-meeting-sync本技能是 cron 每 25 分钟触发的后台守护任务。
职责分工:
OpenClaw(本次对话/cron 任务)
Skill-H(本技能)
scan:汇总所有 Gitea 活跃会议(status ∈ {scheduled, brief-sent}),返回供对比的数据cancel:将“尚未开始但腾讯会议中已不存在”的会议标记为已取消,写日志,返回取消通知邮件参数reschedule:更新旧目录状态为 rescheduled,创建新时间目录,写日志,返回改期通知邮件参数create-pending:在 aifusion-meta 创建 repo:pending 的会议占位记录archive:将 cancelled/rescheduled 状态超过 30 天的目录移入 meetings/archive/tencent-meeting-skill
get_user_meetings)get_user_ended_meetings),用于辅助排除“其实已经开完”的情况imap-smtp-email
配置文件:~/.config/skill-h-meeting-sync/.env
首次使用前运行:
bash setup.sh
node main.js scan
返回 JSON,gitea_meetings 字段包含所有 status ∈ {scheduled, brief-sent} 的会议,每条包含:
repo:仓库全名meeting_dir:会议目录名meeting_id:腾讯会议内部 ID(用于对比)meeting_code:9 位会议号topic:会议主题scheduled_time:会议时间(ISO8601)status:当前状态organizer:组织者用户名attendees:参会人用户名列表attendee_emails:参会人邮箱列表category:single | cross-project调用 get_user_meetings 获取即将开始及进行中的会议,同时调用 get_user_ended_meetings 补充当天已结束会议。
将结果整理为两个字典:
future_meetings_by_id
meeting_idscheduled_time)ended_meetings_by_id
meeting_idscheduled_time 或结束标记)判断"未来 7 天内":只保留 scheduled_time 在 now ~ now+7d 范围内的腾讯会议记录用于“未来会议”对比。
get_user_ended_meetings只用于排除“会议其实已经结束”的误判,不用于触发 cancel。
以 meeting_id 作为唯一标识,对 Gitea 列表、腾讯未来会议列表、腾讯已结束会议列表进行对比,产生以下五种情况:
| 情况 | 判断条件 | 处理方式 |
|---|---|---|
| 无变化 | Gitea 有,腾讯未来会议也有,且时间差 < 1 分钟 | 跳过 |
| 已改期 | Gitea 有,腾讯未来会议也有,但时间差 ≥ 1 分钟 | → reschedule |
| 已结束或已过期 | Gitea 有,腾讯未来会议无,且(腾讯已结束列表中有该 meeting_id,或 Gitea scheduled_time <= now) | 跳过,不调用 cancel |
| 已取消 | Gitea 有,腾讯未来会议无,腾讯已结束列表也无,且 Gitea scheduled_time > now | → cancel |
| 新增 | 腾讯未来会议有,Gitea 无对应 meeting_id | → create-pending |
关键修正:
- “腾讯会议中没有这场会” 不等于 “已取消”
- 它也可能表示:会议已正常结束,或者会议时间已经过去
- 因此只有“尚未开始 + 腾讯未来列表中不存在 + 腾讯已结束列表中也不存在”时,才允许判定为取消
时间对比说明:
- 腾讯会议返回的是秒级时间戳,需先转为北京时间再与 Gitea 的
scheduled_time对比- 时间差 小于 1 分钟 视为无变化(仅用于避免秒级精度误差)
- 时间差 大于等于 1 分钟 视为改期,应触发
reschedule
node main.js cancel \
--repo "HKU-AIFusion/dexterous-hand" \
--meeting-dir "2026-04-22-1500" \
--attendee-emails "email1@163.com,email2@163.com" \
[--cancel-reason "腾讯会议中已不存在,且会议时间尚未到达"]
返回 JSON,可能有两种结果:
success: truenew_status: "cancelled"cancel_email.to / .subject / .html此时 OpenClaw 调用 imap-smtp-email 发送取消通知给全体参会人。
success: trueskipped: trueskip_reason: "meeting_time_passed"表示:
node main.js reschedule \
--repo "HKU-AIFusion/dexterous-hand" \
--old-meeting-dir "2026-04-22-1500" \
--new-time "2026-04-23T15:00:00+08:00" \
--new-meeting-id "yyy" \
--new-meeting-code "987654321" \
--new-join-url "https://meeting.tencent.com/..." \
--attendee-emails "email1@163.com,email2@163.com"
本命令会:
meta.yaml status → rescheduled,写入 rescheduled_to 字段meetings/YYYY-MM-DD-HHMM/,继承旧会议的 topic / attendees / organizer / category,写入 rescheduled_from 字段,status = scheduledagenda.md(注明"本次会议由 YYYY-MM-DD-HHMM 改期而来")返回 JSON,关键字段:
successnew_meeting_dir:新目录名reschedule_email.to / .subject / .html:改期通知邮件参数收到返回后,OpenClaw 调用 imap-smtp-email 发送改期通知给全体参会人。
node main.js create-pending \
--meeting-id "zzz" \
--meeting-code "111222333" \
--topic "未知主题" \
--time "2026-04-24T10:00:00+08:00" \
--join-url "https://meeting.tencent.com/..." \
[--duration 60]
本命令会:
aifusion-meta/meetings/YYYY-MM-DD-HHMM/ 创建占位目录meta.yaml(status=scheduled,repo=pending)返回 JSON,关键字段:
successmeeting_dir:创建的目录名notify_email.to / .subject / .html:发给组织者(ADVISOR)的待确认通知邮件参数收到返回后,OpenClaw 调用 imap-smtp-email 向组织者发送待确认通知。
通知内容应说明:"腾讯会议中发现一场新会议,尚未关联到 Gitea 仓库,请在 aifusion-meta 中修改 repo 字段或在 OpenClaw 中说明归属仓库。"
node main.js archive
本命令会:
meetings/archive/YYYY-MM-DD-HHMM/| 错误场景 | 处理方式 |
|---|---|
| scan 失败 | 打印错误,本次 cron 中止 |
| tencent-meeting-skill 调用失败 | 跳过本次同步,不修改任何 Gitea 状态 |
| cancel / reschedule 写 Gitea 失败 | 记录错误,下次 cron 重试 |
| create-pending 失败 | 记录错误,下次 cron 检测到同一会议时重试 |
| 邮件发送失败 | 记录错误,不影响 Gitea 状态更新 |
| archive 单个文件迁移失败 | 跳过该文件,继续处理其他文件,日志记录警告 |
skipped=true,不会误写为 cancelled