$npx -y skills add op7418/CodePilot --skill feishu-task飞书任务管理工具,用于创建、查询、更新任务和清单。 当以下情况时使用此 Skill: (1) 需要创建、查询、更新、删除任务 (2) 需要创建、管理任务清单 (3) 需要查看任务列表或清单内的任务 (4) 用户提到"任务"、"待办"、"to-do"、"清单"、"task" (5) 需要设置任务负责人、关注人、截止时间
| 1 | # 飞书任务管理 |
| 2 | |
| 3 | ## 🚨 执行前必读 |
| 4 | |
| 5 | - ✅ **时间格式**:ISO 8601 / RFC 3339(带时区),例如 `2026-02-28T17:00:00+08:00` |
| 6 | - ✅ **current_user_id 强烈建议**:从消息上下文的 SenderId 获取(ou_...),工具会自动添加为 follower(如不在 members 中),确保创建者可以编辑任务 |
| 7 | - ✅ **patch/get 必须**:task_guid |
| 8 | - ✅ **tasklist.tasks 必须**:tasklist_guid |
| 9 | - ✅ **完成任务**:completed_at = "2026-02-26 15:00:00" |
| 10 | - ✅ **反完成(恢复未完成)**:completed_at = "0" |
| 11 | |
| 12 | --- |
| 13 | |
| 14 | ## 📋 快速索引:意图 → 工具 → 必填参数 |
| 15 | |
| 16 | | 用户意图 | 工具 | action | 必填参数 | 强烈建议 | 常用可选 | |
| 17 | |---------|------|--------|---------|---------|---------| |
| 18 | | 新建待办 | feishu_task_task | create | summary | current_user_id(SenderId) | members, due, description | |
| 19 | | 查未完成任务 | feishu_task_task | list | - | completed=false | page_size | |
| 20 | | 获取任务详情 | feishu_task_task | get | task_guid | - | - | |
| 21 | | 完成任务 | feishu_task_task | patch | task_guid, completed_at | - | - | |
| 22 | | 反完成任务 | feishu_task_task | patch | task_guid, completed_at="0" | - | - | |
| 23 | | 改截止时间 | feishu_task_task | patch | task_guid, due | - | - | |
| 24 | | 创建清单 | feishu_task_tasklist | create | name | - | members | |
| 25 | | 查看清单任务 | feishu_task_tasklist | tasks | tasklist_guid | - | completed | |
| 26 | | 添加清单成员 | feishu_task_tasklist | add_members | tasklist_guid, members[] | - | - | |
| 27 | |
| 28 | --- |
| 29 | |
| 30 | ## 🎯 核心约束(Schema 未透露的知识) |
| 31 | |
| 32 | ### 1. 当前工具使用用户身份(已内置保护) |
| 33 | |
| 34 | **工具使用 `user_access_token`(用户身份)** |
| 35 | |
| 36 | 这意味着: |
| 37 | - ✅ 创建任务时可以指定任意成员(包括只分配给别人) |
| 38 | - ⚠️ 只能查看和编辑**自己是成员的任务** |
| 39 | - ⚠️ **如果创建时没把自己加入成员,后续无法编辑该任务** |
| 40 | |
| 41 | **自动保护机制**: |
| 42 | - 传入 `current_user_id` 参数(从 SenderId 获取) |
| 43 | - 如果 `members` 中不包含 `current_user_id`,工具会**自动添加为 follower** |
| 44 | - 确保创建者始终可以编辑任务 |
| 45 | |
| 46 | **推荐用法**:创建任务时始终传 `current_user_id`,工具会自动处理成员关系。 |
| 47 | |
| 48 | ### 2. 任务成员的角色说明 |
| 49 | |
| 50 | - **assignee(负责人)**:负责完成任务,可以编辑任务 |
| 51 | - **follower(关注人)**:关注任务进展,接收通知 |
| 52 | |
| 53 | **添加成员示例**: |
| 54 | ```json |
| 55 | { |
| 56 | "members": [ |
| 57 | {"id": "ou_xxx", "role": "assignee"}, // 负责人 |
| 58 | {"id": "ou_yyy", "role": "follower"} // 关注人 |
| 59 | ] |
| 60 | } |
| 61 | ``` |
| 62 | |
| 63 | **说明**:`id` 使用用户的 `open_id`(从消息上下文的 SenderId 获取) |
| 64 | |
| 65 | ### 3. 任务清单角色冲突 |
| 66 | |
| 67 | **现象**:创建清单(`tasklist.create`)时传了 `members`,但返回的 `tasklist.members` 为空或缺少成员 |
| 68 | |
| 69 | **原因**:创建人自动成为清单 **owner**(所有者),如果 `members` 中包含创建人,该用户最终成为 owner 并从 `members` 中移除(同一用户只能有一个角色) |
| 70 | |
| 71 | **建议**:不要在 `members` 中包含创建人,只添加其他协作成员 |
| 72 | |
| 73 | ### 4. completed_at 的三种用法 |
| 74 | |
| 75 | **1) 完成任务(设置完成时间)**: |
| 76 | ```json |
| 77 | { |
| 78 | "action": "patch", |
| 79 | "task_guid": "xxx", |
| 80 | "completed_at": "2026-02-26 15:30:00" // 北京时间字符串 |
| 81 | } |
| 82 | ``` |
| 83 | |
| 84 | **2) 反完成(恢复未完成状态)**: |
| 85 | ```json |
| 86 | { |
| 87 | "action": "patch", |
| 88 | "task_guid": "xxx", |
| 89 | "completed_at": "0" // 特殊值 "0" 表示反完成 |
| 90 | } |
| 91 | ``` |
| 92 | |
| 93 | **3) 毫秒时间戳**(不推荐,除非上层已严格生成): |
| 94 | ```json |
| 95 | { |
| 96 | "completed_at": "1740545400000" // 毫秒时间戳字符串 |
| 97 | } |
| 98 | ``` |
| 99 | |
| 100 | ### 5. 清单成员的角色 |
| 101 | |
| 102 | | 成员类型 | 角色 | 说明 | |
| 103 | |---------|------|------| |
| 104 | | user(用户) | owner | 所有者,可转让所有权 | |
| 105 | | user(用户) | editor | 可编辑,可修改清单和任务 | |
| 106 | | user(用户) | viewer | 可查看,只读权限 | |
| 107 | | chat(群组) | editor/viewer | 整个群组获得权限 | |
| 108 | |
| 109 | **说明**:创建清单时,创建者自动成为 owner,无需在 members 中指定。 |
| 110 | |
| 111 | --- |
| 112 | |
| 113 | ## 📌 使用场景示例 |
| 114 | |
| 115 | ### 场景 1: 创建任务并分配负责人 |
| 116 | |
| 117 | ```json |
| 118 | { |
| 119 | "action": "create", |
| 120 | "summary": "准备周会材料", |
| 121 | "description": "整理本周工作进展和下周计划", |
| 122 | "current_user_id": "ou_发送者的open_id", |
| 123 | "due": { |
| 124 | "timestamp": "2026-02-28 17:00:00", |
| 125 | "is_all_day": false |
| 126 | }, |
| 127 | "members": [ |
| 128 | {"id": "ou_协作者的open_id", "role": "assignee"} |
| 129 | ] |
| 130 | } |
| 131 | ``` |
| 132 | |
| 133 | **说明**: |
| 134 | - `summary` 是必填字段 |
| 135 | - `current_user_id` 强烈建议传入(从 SenderId 获取),工具会自动添加为 follower |
| 136 | - `members` 可以只包含其他协作者,当前用户会被自动添加 |
| 137 | - 时间使用北京时间字符串格式 |
| 138 | |
| 139 | ### 场景 2: 查询我负责的未完成任务 |
| 140 | |
| 141 | ```json |
| 142 | { |
| 143 | "action": "list", |
| 144 | "completed": false, |
| 145 | "page_size": 20 |
| 146 | } |
| 147 | ``` |
| 148 | |
| 149 | ### 场景 3: 完成任务 |
| 150 | |
| 151 | ```json |
| 152 | { |
| 153 | "action": "patch", |
| 154 | "task_guid": "任务的guid", |
| 155 | "completed_at": "2026-02-26 15:30:00" |
| 156 | } |
| 157 | ``` |
| 158 | |
| 159 | ### 场景 4: 反完成任务(恢复未完成状态) |
| 160 | |
| 161 | ```json |
| 162 | { |
| 163 | "action": "patch", |
| 164 | "task_guid": "任务的guid", |
| 165 | "completed_at": "0" |
| 166 | } |
| 167 | ``` |
| 168 | |
| 169 | ### 场景 5: 创建清单并添加协作者 |
| 170 | |
| 171 | ```json |
| 172 | { |
| 173 | "action": "create", |
| 174 | "name": "产品迭代 v2.0", |
| 175 | "members": [ |
| 176 | {"id": "ou_xxx", "role": "editor"}, |
| 177 | {"id": "ou_yyy", "role": "viewer"} |
| 178 | ] |
| 179 | } |
| 180 | ``` |
| 181 | |
| 182 | ### 场景 6: 查看清单内的未完成任务 |
| 183 | |
| 184 | ```json |
| 185 | { |
| 186 | "action": "tasks", |
| 187 | "tasklist_guid": "清单的guid", |
| 188 | "completed": false |
| 189 | } |
| 190 | ``` |
| 191 | |
| 192 | ### 场景 7: 全天任务 |
| 193 | |
| 194 | ```json |
| 195 | { |
| 196 | "action": "create", |
| 197 | "summary": "年度总结", |
| 198 | "due": { |
| 199 | "timestamp": "2026-03-01 00:00:00", |
| 200 | "is_all_day": true |
| 201 | } |
| 202 | } |
| 203 | ``` |
| 204 | |
| 205 | --- |
| 206 | |
| 207 | ## 🔍 常见错误与排查 |
| 208 | |
| 209 | | 错误现象 | 根本原因 | 解决方案 | |
| 210 | |---------|---------|---------| |
| 211 | | **创建后无法编辑任务** | 创建时未将自己加入 members | 创建时至少将当前用户(SenderId)加为 assignee 或 follower | |
| 212 | | **patch 失败提示 task_guid 缺失** | 未传 task_guid 参数 | patch/get 必须传 task_guid | |
| 213 | | **tasks 失败提示 tasklist_guid 缺失** | 未传 tasklist_guid 参数 | tasklist.tasks action 必须传 tasklist_guid | |
| 214 | | **反完成失败** | completed_at 格式错误 | 使用 `"0"` 字符串,不是数字 0 | |
| 215 | | **时间不对** | 使用了 Unix 时间戳 | 改用 ISO 8601 格式(带时区):`2024-01-01T00:00:00+08:00` | |
| 216 | |
| 217 | --- |
| 218 | |
| 219 | ## 📚 附录:背景知识 |
| 220 | |
| 221 | ### A. 资源关系 |
| 222 | |
| 223 | ``` |
| 224 | 任务清单(Tasklist) |
| 225 | └─ 自定义分组(Section,可选) |
| 226 | └─ 任务(Task) |
| 227 | ├─ 成员:负责人(assignee)、关注人(follower) |
| 228 | ├─ 子任务(Subtask) |
| 229 | ├─ 截止时间(due)、开始时间(start) |
| 230 | └─ 附件、评论 |
| 231 | ``` |
| 232 | |
| 233 | **核心概念**: |
| 234 | - **任务(Task)**:独立的待办事项,有唯一的 `task_guid` |
| 235 | - **清单(Tasklist)**:组织多个任务的容器,有唯一的 `tasklist_guid` |
| 236 | - **负责人(assignee)**:可以编辑任务并标记完成 |
| 237 | - **关注人(follower)**:接收任务更新通知 |
| 238 | - **我负责的(MyTasks)**:所有负责人为自己的任务集合 |
| 239 | |
| 240 | # |