$npx -y skills add op7418/CodePilot --skill feishu-update-doc更新飞书云文档。支持 7 种更新模式:追加、覆盖、定位替换、全文替换、前/后插入、删除。
| 1 | # feishu__update_doc |
| 2 | |
| 3 | 更新飞书云文档内容,支持 7 种更新模式。优先使用局部更新(replace_range/append/insert_before/insert_after),慎用 overwrite(会清空文档重写,可能丢失图片、评论等)。 |
| 4 | |
| 5 | # 定位方式 |
| 6 | |
| 7 | 定位模式(replace_range/replace_all/insert_before/insert_after/delete_range)支持两种定位方式,二选一: |
| 8 | |
| 9 | ## selection_with_ellipsis - 内容定位 |
| 10 | |
| 11 | 支持两种格式: |
| 12 | |
| 13 | 1. **范围匹配**:`开头内容...结尾内容` |
| 14 | - 匹配从开头到结尾的所有内容(包含中间内容) |
| 15 | - 建议 10-20 字符确保唯一性 |
| 16 | |
| 17 | 2. **精确匹配**:`完整内容`(不含 `...`) |
| 18 | - 匹配完整的文本内容 |
| 19 | - 适合替换短文本、关键词等 |
| 20 | |
| 21 | **转义说明**:如果要匹配的内容本身包含 `...`,使用 `\.\.\.` 表示字面量的三个点。 |
| 22 | |
| 23 | 示例: |
| 24 | - `你好...世界` → 匹配从"你好"到"世界"之间的任意内容 |
| 25 | - `你好\.\.\.世界` → 匹配字面量 "你好...世界" |
| 26 | |
| 27 | **建议**:如果文档中有多个 `...`,建议使用更长的上下文来精确定位,避免歧义。 |
| 28 | |
| 29 | ## selection_by_title - 标题定位 |
| 30 | |
| 31 | 格式:`## 章节标题`(可带或不带 # 前缀) |
| 32 | |
| 33 | 自动定位整个章节(从该标题到下一个同级或更高级标题之前)。 |
| 34 | |
| 35 | **示例**: |
| 36 | - `## 功能说明` → 定位二级标题"功能说明"及其下所有内容 |
| 37 | - `功能说明` → 定位任意级别的"功能说明"标题及其内容 |
| 38 | |
| 39 | # 可选参数 |
| 40 | |
| 41 | ## new_title |
| 42 | |
| 43 | 更新文档标题。如果提供此参数,将在更新文档内容后同步更新文档标题。 |
| 44 | |
| 45 | **特性**: |
| 46 | - 仅支持纯文本,不支持富文本格式 |
| 47 | - 长度限制:1-800 字符 |
| 48 | - 可以与任何 mode 配合使用 |
| 49 | - 标题更新在内容更新之后执行 |
| 50 | |
| 51 | |
| 52 | # 返回值 |
| 53 | |
| 54 | ## 成功 |
| 55 | |
| 56 | ```json |
| 57 | { |
| 58 | "success": true, |
| 59 | "doc_id": "文档ID", |
| 60 | "mode": "使用的模式", |
| 61 | "message": "文档更新成功(xxx模式)", |
| 62 | "warnings": ["可选警告列表"], |
| 63 | "log_id": "请求日志ID" |
| 64 | } |
| 65 | ``` |
| 66 | |
| 67 | ## 异步模式(大文档超时) |
| 68 | |
| 69 | ```json |
| 70 | { |
| 71 | "task_id": "async_task_xxxx", |
| 72 | "message": "文档更新已提交异步处理,请使用 task_id 查询状态", |
| 73 | "log_id": "请求日志ID" |
| 74 | } |
| 75 | ``` |
| 76 | |
| 77 | 使用返回的 `task_id` 再次调用 update-doc(仅传 task_id 参数)查询状态。 |
| 78 | |
| 79 | ## 错误 |
| 80 | |
| 81 | ```json |
| 82 | { |
| 83 | "error": "[错误码] 错误消息\n💡 Suggestion: 修复建议\n📍 Context: 上下文信息", |
| 84 | "log_id": "请求日志ID" |
| 85 | } |
| 86 | ``` |
| 87 | |
| 88 | --- |
| 89 | |
| 90 | # 使用示例 |
| 91 | |
| 92 | ## append - 追加到末尾 |
| 93 | |
| 94 | ```json |
| 95 | { |
| 96 | "doc_id": "文档ID或URL", |
| 97 | "mode": "append", |
| 98 | "markdown": "## 新章节\n\n追加的内容..." |
| 99 | } |
| 100 | ``` |
| 101 | |
| 102 | ## replace_range - 定位替换 |
| 103 | |
| 104 | 使用 `selection_with_ellipsis`: |
| 105 | ```json |
| 106 | { |
| 107 | "doc_id": "文档ID或URL", |
| 108 | "mode": "replace_range", |
| 109 | "selection_with_ellipsis": "## 旧章节标题...旧章节结尾。", |
| 110 | "markdown": "## 新章节标题\n\n新的内容..." |
| 111 | } |
| 112 | ``` |
| 113 | |
| 114 | 使用 `selection_by_title`(替换整个章节): |
| 115 | ```json |
| 116 | { |
| 117 | "doc_id": "文档ID或URL", |
| 118 | "mode": "replace_range", |
| 119 | "selection_by_title": "## 功能说明", |
| 120 | "markdown": "## 功能说明\n\n更新后的功能说明内容..." |
| 121 | } |
| 122 | ``` |
| 123 | |
| 124 | ## replace_all - 全文替换 |
| 125 | |
| 126 | 与 replace_range 类似,但支持多处同时替换(replace_range 要求匹配唯一): |
| 127 | ```json |
| 128 | { |
| 129 | "doc_id": "文档ID或URL", |
| 130 | "mode": "replace_all", |
| 131 | "selection_with_ellipsis": "张三", |
| 132 | "markdown": "李四" |
| 133 | } |
| 134 | ``` |
| 135 | |
| 136 | **返回值**包含 `replace_count` 字段,表示替换的次数: |
| 137 | ```json |
| 138 | { |
| 139 | "success": true, |
| 140 | "replace_count": 4, |
| 141 | "message": "文档更新成功(replace_all模式,替换4处)" |
| 142 | } |
| 143 | ``` |
| 144 | |
| 145 | **注意**: |
| 146 | - 与 `replace_range` 不同,`replace_all` 允许多个匹配 |
| 147 | - 如果没有找到匹配内容,会返回错误 |
| 148 | - `markdown` 可以为空字符串,表示删除所有匹配内容 |
| 149 | |
| 150 | ## insert_before - 前插入 |
| 151 | |
| 152 | ```json |
| 153 | { |
| 154 | "doc_id": "文档ID或URL", |
| 155 | "mode": "insert_before", |
| 156 | "selection_with_ellipsis": "## 危险操作...数据丢失风险。", |
| 157 | "markdown": "> **警告**:以下操作需谨慎!" |
| 158 | } |
| 159 | ``` |
| 160 | |
| 161 | ## insert_after - 后插入 |
| 162 | |
| 163 | ```json |
| 164 | { |
| 165 | "doc_id": "文档ID或URL", |
| 166 | "mode": "insert_after", |
| 167 | "selection_with_ellipsis": "```python...```", |
| 168 | "markdown": "**输出示例**:\n```\nresult = 42\n```" |
| 169 | } |
| 170 | ``` |
| 171 | |
| 172 | ## delete_range - 删除内容 |
| 173 | |
| 174 | 使用 `selection_with_ellipsis`: |
| 175 | ```json |
| 176 | { |
| 177 | "doc_id": "文档ID或URL", |
| 178 | "mode": "delete_range", |
| 179 | "selection_with_ellipsis": "## 废弃章节...不再需要的内容。" |
| 180 | } |
| 181 | ``` |
| 182 | |
| 183 | 使用 `selection_by_title`(删除整个章节): |
| 184 | ```json |
| 185 | { |
| 186 | "doc_id": "文档ID或URL", |
| 187 | "mode": "delete_range", |
| 188 | "selection_by_title": "## 废弃章节" |
| 189 | } |
| 190 | ``` |
| 191 | |
| 192 | 注意:delete_range 模式不需要 markdown 参数。 |
| 193 | |
| 194 | ## 同时更新标题和内容 |
| 195 | |
| 196 | 可以在任何更新模式中添加 `new_title` 参数来同时更新文档标题: |
| 197 | |
| 198 | ```json |
| 199 | { |
| 200 | "doc_id": "文档ID或URL", |
| 201 | "mode": "overwrite", |
| 202 | "markdown": "# 项目文档 v2.0\n\n全新的内容...", |
| 203 | "new_title": "项目文档 v2.0" |
| 204 | } |
| 205 | ``` |
| 206 | |
| 207 | ```json |
| 208 | { |
| 209 | "doc_id": "文档ID或URL", |
| 210 | "mode": "append", |
| 211 | "markdown": "## 更新日志\n\n2025-12-18: 新增功能...", |
| 212 | "new_title": "项目文档(已更新)" |
| 213 | } |
| 214 | ``` |
| 215 | |
| 216 | ## overwrite - 完全覆盖 |
| 217 | |
| 218 | ⚠️ 会清空文档后重写,可能丢失图片、评论等,仅在需要完全重建文档时使用。 |
| 219 | |
| 220 | ```json |
| 221 | { |
| 222 | "doc_id": "文档ID或URL", |
| 223 | "mode": "overwrite", |
| 224 | "markdown": "# 新文档\n\n全新的内容..." |
| 225 | } |
| 226 | ``` |
| 227 | |
| 228 | --- |
| 229 | |
| 230 | # 最佳实践 |
| 231 | |
| 232 | ## 小粒度精确替换 |
| 233 | |
| 234 | 修改文档内容时,**定位范围越小越安全**。尤其是表格、分栏等嵌套块,应精确定位到需要修改的文本,避免影响其他内容。 |
| 235 | |
| 236 | **示例**:表格单元格中有图片和文字,只需修改文字 |
| 237 | - ❌ 替换整个表格或整行 → 可能破坏图片引用 |
| 238 | - ✅ 只定位需要修改的文本 → 图片等其他内容不受影响 |
| 239 | |
| 240 | |
| 241 | ## 保护不可重建的内容 |
| 242 | |
| 243 | 图片、画板、电子表格、多维表格、任务等内容以 token 形式存储,**无法读出后原样写入**。 |
| 244 | |
| 245 | **保护策略**: |
| 246 | - 替换时避开包含这些内容的区域 |
| 247 | - 精确定位到纯文本部分进行修改 |
| 248 | |
| 249 | ## 分步更新优于整体覆盖 |
| 250 | |
| 251 | 修改多处内容时: |
| 252 | - ✅ 多次小范围替换,逐步修改 |
| 253 | - ⚠️ 谨慎使用 `overwrite` 重写整个文档, 除非你认为风险完全可控 |
| 254 | |
| 255 | **原因**:局部更新保留原有媒体、评论、协作历史,更安全可靠。 |
| 256 | |
| 257 | ## insert 模式扩大定位范围时注意插入位置 |
| 258 | |
| 259 | 使用 `insert_before` 或 `insert_after` 时,如果目标内容重复出现,需要扩大 `selection_with_ellipsis` 范围来唯一定位。 |
| 260 | |
| 261 | **关键**:插入位置基于匹配范围的**边界**: |
| 262 | - `insert_after` → 插入在匹配范围的**结尾**之后 |
| 263 | - `insert_before` → 插入在匹配范围的**开头**之前 |
| 264 | |
| 265 | 扩大范围时,确保边界仍然是期望的插入点。 |
| 266 | |
| 267 | ## 修复画板语法错误 |
| 268 | |
| 269 | 当 create-doc 或 update-doc 返回画板写入失败的 warning 时: |
| 270 | 1. warning 中包含 whiteboard 标签(如 `<whiteboard token="xxx"/>`) |
| 271 | 2. 分析错误信息,修正 Mermaid/PlantUML 语法 |
| 272 | 3. 用 `replace_range` 替换:`selection_with_ellipsis` 使用 warning 中的 whiteboard 标签,`markdown` 提供修正后的代码块 |
| 273 | 4. 重新提交验证 |
| 274 | |
| 275 | --- |
| 276 | |
| 277 | # 注意事项 |
| 278 | |
| 279 | - **Markdown 语法**:支持飞书扩展语法,详见 create-doc 工具文档 |