dingtalk-calendarlisted
Install: claude install-skill breath57/dingtalk-skills
# 钉钉日程技能
负责钉钉日历(Calendar)API 的操作。本文件为**策略指南**;完整请求格式见 `references/api.md`。
> `dt_helper.sh` 位于本 `SKILL.md` 同级目录的 `scripts/dt_helper.sh`。
## 核心概念
- **路径中的 `userId`**:日程 API 路径 `/v1.0/calendar/users/{userId}/...` 中的 `{userId}` 为 **unionId**(与待办、文档一致),不是 staffId。
- **主日历**:个人默认日历的 `calendarId` 固定使用字符串 **`primary`**(小写)。创建/查询/列表/更新/删除均针对 `.../calendars/primary/events...`。
- **时间格式**:`start` / `end`、闲忙的 `startTime`/`endTime`、列表的 `timeMin`/`timeMax` 须使用 **UTC ISO8601 且含毫秒**,例如 `2026-03-24T07:02:48.000Z`。省略毫秒易触发 `ParsedISO8601TimestampError`。
- **修改日程**:HTTP 方法为 **PUT**(与「部分更新」语义对应的路径相同),请求体需包含日程 `id` 及要改的字段(如 `summary`)。
- **视频会议**:创建日程时在请求体中加 `"onlineMeetingInfo":{"type":"dingtalk"}`,响应含 `onlineMeetingInfo.url` 等。
- **会议室**:先通过 **会议室忙闲** 接口按 `roomIds` + 时间窗查询;再在已有日程上 **添加会议室**(需企业内会议室 `roomId`,管理后台或开放平台可查)。集成测试可用环境变量 `TEST_MEETING_ROOM_IDS`(逗号分隔)。
- **签到/签退**:日程创建后,可 **GET 签到/签退链接** 分发参会人;组织者/参与者 **POST 签到**;详情用 **GET signin / signOut** 列表接口(见 api.md)。是否与线下会议、审批流联动以钉钉侧能力为准。
## 场景路由(先分类再调 API)
| 用户意图 | 优先接口方向 |
|---|---|
| 订会议室、查会议室有没有空 | `POST .../meetingRooms/schedules/query` |
| 给已有日程加会议室 | `POST .../events/{eventId}/meetingRooms` |
| 要签到码、签退链接 | `GET .../signInLinks`、`GET .../signOutLinks` |
| 每周重复、每天重复 | 创建日程时带 `recurrence`(见 api.md) |
| 只看人忙闲(不针对会议室) | `POST .../querySchedule` |
## 工作流程(每次执行前)
1. **识别任务** → 按上表归类后,再选具体 API(见 `references/api.md`)。
2. **校验配置** → `bash scripts/dt_helper.sh --get` 读取 `DINGTALK_APP_KEY`、`DINGTALK_APP_SECRET`、`DINGTALK_MY_USER_ID`、`DINGTALK