介绍
# gog-calendar
使用 `gog` (gogcli) 操作 Google Calendar:日程(事件列表)以及跨日历的关键字搜索。
## 输出规则(令牌 vs 可靠性)
gogcli stdout 应保持可解析;优先使用 `--plain` / `--json` 并将提示信息输出到 stderr。[oai_citation:0‡GitHub](https://github.com/steipete/gogcli/blob/main/AGENTS.md?utm_source=chatgpt.com)
- 默认对仅用于汇总的只读列表使用 **`--plain`**(更省令牌): - 日程列表(今天 / 未来几天 / 范围) - 日历列表 - 仅当需要结构化数据时才使用 **`--json`**: - 聚合多个日历的结果(跨日历关键字搜索) - 去重 / 排序 / 提取 ID 以供后续调用 - 任何需要精确字段的写入工作流 - 在自动化运行中,添加 **`--no-input`**(直接失败而不是提示)。[oai_citation:1‡GitHub](https://github.com/steipete/gogcli/blob/main/README.md?utm_source=chatgpt.com)
## 日历排除(后处理)
用户可能明确指定要从搜索/日程中排除某些日历(例如“国家法定节假日”)。 在回答时,你必须: 1) 广泛查询(例如 `events --all` 或遍历所有日历进行搜索), 2) 然后**在后处理中过滤掉已排除的日历**。
如何确定排除的日历: - 首先,检查用户的偏好/记忆中是否有明确的“排除日历”列表。 - 如果未提供,则对明显的“噪音日历”应用保守的默认过滤器: - 名称/摘要包含:`holiday`、`holidays`、`national holidays`(以及本地化等效词)的日历 - 除非明确排除,否则不要过滤用户拥有的日历。
过滤规则: - 如果你拥有日历元数据(来自 `gog calendar calendars`),则按**日历名称/摘要**过滤。 - 如果你只有事件输出,则通过将事件的 calendarId 与从日历列表中解析出的已排除 calendarIds 进行匹配来过滤。
如果过滤实质性改变了答案,请务必简要说明: - “(已过滤:国家法定节假日)”
## 日程(始终跨日历,然后过滤)
针对“我今天 / 明天 / 本周 / X 和 Y 之间有什么安排”: - 必须查询所有日历: - `gog calendar events --all --from <date_or_iso> --to <date_or_iso> --plain` - 然后应用日历排除规则(见上文)。 - 除非你在正确的时间窗口运行了命令并应用了过滤,否则不要回答“没有安排”。
示例: - 今天:`gog calendar events --all --from 2026-02-04 --to 2026-02-05 --plain` - 未来 7 天:`gog calendar events --all --from 2026-02-04 --to 2026-02-11 --plain`
输出格式: - 按开始时间排序 - 按天分组 - 显示:时间范围、摘要、地点(仅在有帮助时显示日历名称)
## 跨日历关键字搜索(尽力而为,聚合,然后过滤)
日历事件查询范围限定于 `calendarId`(API 为 `/calendars/{calendarId}/events`),因此关键字搜索必须遍历日历并聚合结果。[oai_citation:2‡Google for Developers](https://developers.google.com/workspace/calendar/api/v3/reference/events/list?utm_source=chatgpt.com)
默认窗口: - 如果用户未指定范围:**从今天起未来 6 个月**(含) - 如果用户指定了日期/范围:使用该指定范围
工作流(切勿跳过): 1) 列出日历(需要 ID + 名称用于过滤): - `gog calendar calendars --json` 2) 根据排除规则构建排除的 calendarIds 集合。 3) 对每一个未排除的 `calendarId`,执行搜索(JSON 是合并/去重所必需的): - `gog calendar search "<query>" --calendar <calendarId> --from <from> --to <to> --max 50 --json --no-input` 4) 聚合所有日历中的匹配项(除非用户要求,否则不要在找到第一个匹配时停止)。 5) 按 `(calendarId, eventId)` 去重,并按开始时间排序。 6) 报告结果并明确说明搜索窗口(以及应用的任何过滤器)。
如果在默认窗口中未找到任何内容: - 请说:“在未来 6 个月内 (<from> → <to>) 未找到任何事件。需要我搜索更长的时间范围(例如 12 个月)或在特定日期内搜索吗?”
如果用户确定存在的备选方案: - 询问/推断一个大致日期并列出其前后的内容(然后过滤): - `gog calendar events --all --from <date-7d> --to <date+7d> --plain` - 然后在本地按标题标记进行匹配(casefold + 标记重叠)
## 写入操作(创建/更新/删除/回复)
在任何写入操作之前: - 汇总确切的意图(日历、标题、开始/结束时间、时区、与会者、地点) - 要求明确回复“yes” - 然后运行命令