agentsclimarketplace

Feishu doc editing

Skill qiaoxuelin/mobile-game-research-toolkit/skills/feishu-doc-editing

飞书云文档(lark-cli)编辑操作 skill。覆盖文档增删改查的核心循环:fetch(with-ids) -> 定位 block_id -> block_insert_after/block_replace/str_replace -> fetch 验证;含 whiteboard SVG 图表插入/更新、评论读取、classifier 阻塞时的 fallback。汇总实际踩坑(fragment 泄漏、@file 仅 --content、block_replace 触发 ol seq 重编号、ok:true≠生效、半角!)。触发词:编辑飞书文档 / 飞书文档插入 / block_insert_after / block_replace / str_replace / 飞书图表 / whiteboard / 飞书评论 / lark-cli。From its SKILL.md

Install
npx -y skills add qiaoxuelin/mobile-game-research-toolkit --skill feishu-doc-editing

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

7.1 KB, ~2.5k tokens by cl100k_base, as published. Nobody here has run it

飞书云文档编辑(lark-cli)

本 skill 封装飞书云文档的编辑操作流程与踩坑。飞书是研究交付面(专题报告/选题跟踪等交付物在飞书维护),本地只存过程与快照。需要编辑飞书文档时按本 skill 操作。

前置:安装 @larksuite/clinpm i -g @larksuite/cli,提供 lark-cli 命令;⚠ 不是 npm i -g lark-cli,那是另一个不相关的 0.1.0 包)+ lark-cli auth 完成飞书 OAuth 授权。

lark-cli 1.0.66+:docs +update 操作名走 --command <op> flag(非 positional)。以 lark-cli docs +update --help 为准。

1. 核心编辑循环(必遵)

凡写操作后必须 fetch 验证--lark-cli 对 block_id 不存在/str_replace 0 命中 都返回 "ok": true(API 调用成功≠实际生效)。

1. fetch:  lark-cli docs +fetch --doc <token> --doc-format xml --detail with-ids
2. 定位:   从返回 XML 正则提 block_id(<h2|p|table|li ... id="doxcn...">)
3. 写:     lark-cli docs +update --doc <token> --command <op> --block-id <id> --content @file.xml
4. 验证:   再 fetch,核对实际文本/块结构(repr() 看精确字符、数 <tr>/<b> 行数)
  • --doc 接文档 URL 或 token;wiki 页 token = obj_token/docx token(如 doxcnABcdEFghIJklMNopQRst,用 docs +fetch 时传此 token)。
  • 写脚本统一 os.chdir 到脚本目录,--content @file.xml 用相对路径(绝对路径报 unsafe file path)。
  • --detail with-ids 必带,否则拿不到 block_id。

2. 四种写操作选型

指令用途关键点
block_insert_after在锚点 block 后插新内容多块 XML 不包 <fragment>(见踩坑①);@file 读多块
block_replace整块替换替换后旧 block_id 失效,继续 block 操作前重新 fetch;替换 <li> 触发 ol seq 重编号(rev 大跳,结构完好)
str_replace行内文本替换--pattern inline 字符串,不支持 @file(见踩坑②);不能跨 block/段落;XML 模式只行内
block_delete删块leaf 块(p/h/li)可删;逗号分隔批量;ol 内删 li 会塌缩

选型原则:外科式 1-2 处文本修补用 str_replace(带 --block-id 限块内);整段/整表重写用 block_replace;新增章节用 block_insert_after

3. 多块 XML 插入格式

block_insert_after --content @file.xml,文件内裸多块、不包 fragment

<h2>章节标题</h2>
<p>正文,<b>粗体</b>内联。</p>
<p><b>表1 标题</b></p>
<table><colgroup><col/><col/></colgroup>
  <thead><tr><th vertical-align="top"><p>列头</p></th>...</tr></thead>
  <tbody><tr><td vertical-align="top"><p>单元格</p></td>...</tr></tbody>
</table>
<ol><li>有序项</li></ol>
  • 块无需 id(自动生成);<li> 无需 seq(ol 管理)。
  • <b> 是真粗体元素;<col/> 可空(self-closing)。
  • <a href="...">链接</a> 内联可用。

4. whiteboard SVG 图表

图表 = Python 生成 SVG -> lark-cli whiteboard 插入/更新飞书画板 -> 文档里 <whiteboard token="..."/> 内嵌。

# 新建画板(插文档):block_insert_after --content '<whiteboard type="svg">SVG内容</whiteboard>'
# 更新已有画板(保 token):
lark-cli whiteboard +update --whiteboard-token <token> --input_format svg --source @chart.svg --overwrite
# 验证渲染:
lark-cli whiteboard +query --whiteboard-token <token> --output_as raw   # 数 data.nodes(非 SVG 标签)

踩坑③ 图表渲染

  • 插 SVG 用<whiteboard>,勿包 <fragment>(会泄漏开闭标签成 2 垃圾段)。
  • 折线图用逐段 <line>,避顶点 r=8 圆弧扭曲(多点 <path>/<polyline> 都中招)。
  • 验证渲染看 data.nodes 数组按 type 统计(text_shape/connector/composite_shape),10+柱折线图约 40-80 节点=完整;<10 节点=空白/失败。别数 <rect>/<line> 标签(query 返 JSON 非 SVG)。

5. 评论读取

lark-cli drive file.comments list --file-token <docx_token> --file-type docx --page-all
  • 返回 data.items[],每条含 comment_id/quote(引用的文档原文)/reply_list.replies[]/user_id(open_id)/is_solved
  • 回复正文在 reply.content.elements[].text_run.text(可能是 string 或 {content:...},两种都要处理)。
  • 评论者 open_id 经 lark-cli contact +get-user --user-id <open_id> --user-id-type open_id 解析姓名。

6. classifier 阻塞 fallback

Claude Code 的 classifier 间歇阻塞 Bash/PowerShell 写操作(报 "auto mode cannot determine safety",只读命令仍可用),可持续 15+ 分钟。

  • Fallback:用 Write 工具写 python 脚本完成全部 lark-cli 操作,让用户用 半角 ! 前缀在 session 跑--! 命令不经工具审批、绕过 classifier。
  • 踩坑④! 必须半角 ASCII !(U+0021);用户打全角中文 (U+FF01) 不识别,消息走纯文本、命令不执行。指导用户时明确强调"半角!"。
  • python 调 lark-cli:Windows 上 lark-cli 是 .cmd shim,subprocessshutil.which("lark-cli") + shell=True,否则 WinError 2
  • 也可直接重试 lark-cli 命令(classifier 会恢复),简单单条命令比重试不透明的批量脚本更易通过。

7. 踩坑速查

#正确做法
<fragment> 包裹多块 XML三宗罪:开闭标签泄漏成2段 + 内联<table>压成空1×1壳 + 内联<b>字面化成&lt;b&gt;裸多块不包裹
str_replace --pattern @file@file 被当字面量字符串匹配、0命中但 ok:true。只有 --content 支持 @file--pattern 用 inline 双引号字符串(中文///./空格在 cmd.exe 双引号内安全,避开!
②bstr_replace 跨 <b> 边界pattern 须落在单个 run 内,跨粗体边界易失败。跨段/跨块改用 block_replace
whiteboard 折线扭曲/fragment泄漏逐段<line>;纯<whiteboard>不包fragment;验证数 nodes 非 SVG 标签
全角不执行强调半角!
block_replace <li> 后 rev 大跳触发 ol seq 重编号,结构完好,继续操作前重新 fetch(旧 id 失效)
ok:true ≠ 生效凡写后必 fetch 核对实际文本/<tr>行数/<b>真假(&lt;b&gt;=字面坏,<b>=真好)

8. 不做的事

  • 不在不 fetch 的情况下假设写操作生效(ok:true 骗人)。
  • 不用 <fragment> 包多块。
  • 不用 --pattern @file
  • 不重试不透明的批量脚本等 classifier(改用单条命令或 ! fallback)。

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.