NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Go modules · #1380 by repository stars
Last release 16 days ago
22 Sep 2026
Ships on a steady schedule
a new release about every 2 weeks
Some releases are documented
notes for 19 of 57 stable releases
Nothing withdrawn
no release was ever pulled
8 months old
82 releases · first in 2026
One column per month.
新增原生单元格图片批量写入,并修复 9 个领域 Skill 的命令说明、身份选择和脚本成功判定。
新增原生单元格图片批量写入,并修复 9 个领域 Skill 的命令说明、身份选择和脚本成功判定。
sheet image write-batch 支持文件、stdin 和行内 manifest,并发下载、串行写入、自动回读验证;单图支持 HTTPS URL。BMP/TIFF/WebP 自动转 PNG,无后缀图片自动补齐扩展名。make check-skills 增加 YAML、命令示例、脚本回归和编译后二进制契约检查。验证:Go 测试与 vet、81 项脚本回归、9 项二进制离线契约通过;真实飞书图片写入与独立回读通过,浏览器和 SVG 工具实跑通过。五个平台均已编译并校验打包;实际执行验证在 Linux amd64 上完成。
HEIC/BPG 保留识别与原样提交能力,是否接受由服务端决定;本次 HEIC 服务端拒绝场景已验证会明确返回失败。
sheet image write-batch:新增原生单元格图片批量写入命令,支持通过 manifest(文件、stdin - 或行内 JSON)并发下载、串行写入并经由 V3 read-rich 回读校验,内置连接池复用与全抖动限流重试。sheet image write-image:升级单格图片写入命令,支持直接传入 HTTPS 网络图片 URL 与 -o json 输出,写入后自动通过 V3 read-rich 回读验证原生 image_token。强化范围校验,若传入的范围前缀与目标 sheet_id 不一致时实行 fail-fast 拦截报错(原先为静默尊重前缀但会导致回读验证失配)。skills/feishu-cli-data:更新技能说明与表格工作流规范,明确单元格原生图片写入规则,严禁使用 =IMAGE(...) 公式或 Markdown 图片语法替代。make check-skills 增加真实 YAML 解析、当前编译二进制的示例参数校验、领域脚本回归及本地 API 契约测试,区分静态校验、模拟请求与线上验证。本轮以「深度 review + 实物验证」为主线,系统校准了 CLI 与飞书官方 API 的契约。 命令面几乎无变化(36 个命令组零增减,新增 3 个子命令),但修掉了一批 静默出错 的问题。
本轮以「深度 review + 实物验证」为主线,系统校准了 CLI 与飞书官方 API 的契约。
命令面几乎无变化(36 个命令组零增减,新增 3 个子命令),但修掉了一批静默出错的问题。
| 功能 | 此前 | 现在 |
|---|---|---|
mail triage |
100% 失败(page_size 必填未发送) |
正常返回邮件列表 |
sheet write 写布尔值 |
整批失败(API 拒绝 JSON Boolean) | 正常写入并识别为布尔单元格 |
sheet protect / unprotect |
被误判「官方已废弃」而禁用 | 恢复可用(实测端点返回 code=0) |
calendar agenda 查 >40 天 |
直接报错 193103 | 自动切分,90 天窗口返回 334 个日程 |
schema / api 元数据 |
overlay 完全不生效,停在 12 服务 / 152 方法 | 15 服务 / 250 方法 |
calendar event-search --start 传毫秒 |
解析成公元 56971 年 | 13 位自动识别为毫秒 |
doc content-update --mode replace_all:不带 # 的模糊标题选择器同时命中父标题与子标题时,drive pull --delete-local / push --delete-remote:身份静默降级 Bot 后远端视图更小、差集更大,event last-consumer 注销:会抹掉窗口期内新 consumer 刚建立的订阅(新 consumer 已 ready 却收不到事件)。calendar agenda:午夜发生 DST 跳变的时区区间倒挂,静默返回空结果。wiki delete:确认提示未提级联范围(--include-children 默认 true)。现按实际范围提示。http.Post,绕过重定向/凭证策略层——app_secret 可随 3xx 重放且无超时。wiki delete 的 loopback 豁免曾用前缀匹配,127.0.0.evil.com 可绕过 HTTPS 约束。改用 net.ParseIP。block_size 守卫在 64 位平台永久失效,畸形值会导致 panic。加合理上限。markdown patch — 对云盘原生 .md 做局部补丁schema status — 查元数据来源与版本(embedded / cache / runtime)slides get — 获取演示文稿信息命令名、子命令、flag 零删除零改名;api 输出结构未变;stderr 新增的告警不污染 stdout(-o json 管道安全)。
有 4 处「以前静默通过、现在报错」,其中 3 处以前本就拿不到正确结果。唯一需要改脚本的是:
doc content-update --mode replace_all --selection-by-title "模糊词"若同时命中父子标题,现在报错。
改法:加标题级别("## 子标题")或改用--mode replace_range。
若 token.json 是旧版本(无 app_id),执行一次 feishu-cli auth token --bind-legacy-app --as user。
完整变更见 CHANGELOG.md。
对分支全量改动做分域深审并逐条用编译二进制真实调用飞书 API 验证。以下缺陷均无法被
gofmt/go vet/go test/-race 捕获(基线本来全绿),属"代码自洽但与服务端契约不符"。
数据破坏(原实现 exit 0 静默发生)
doc content-update --mode replace_all:无 # 的模糊标题选择器同时命中父标题与其子标题时,
外层范围会吞掉内层与其后未匹配的兄弟章节(实测 7 块文档替换后只剩 2 块,无关章节被销毁,
却报告"成功替换 2 处")。现 fail-closed 要求用带级别选择器或 replace_range。drive pull --delete-local / push --delete-remote:身份静默降级 Bot 后远端视图更小、差集更大,
会把本地文件当作"远端已不存在"删除。改用 resolveOptionalUserTokenForDestructive fail-closed。event last-consumer 注销:unsubscription 在文件锁外执行,会抹掉窗口期内新 consumer 刚建立的
订阅(新 consumer 已 ready 却静默收不到事件)。注销后复检存活 consumer 数并幂等补订阅。calendar agenda:午夜发生 DST 跳变的时区(如 America/Sao_Paulo 2018-11-04)区间倒挂
(实测 dur=-1s),静默返回空结果。start/end 改用日历日期分量计算。wiki delete:确认提示未提级联范围(--include-children 默认 true),用户以为删单节点实际销毁整棵子树。
现按实际范围提示;JSON 的 ready/failed 改用任务终态判定(不再恒为 ready=true)。功能完全失效
mail triage:page_size 是该端点必填参数,条件发送导致命令 100% 失败(99992402)。
现始终发送并按端点上限截断(list 20 / search 15,对齐官方 shortcuts/mail)。schema / api catalog overlay:此前完全不生效(source 恒为 embedded、cache 目录为空)。
三重原因:① 版本门禁要求严格更新,而官方顶层 version 恒为 1.0.0;② 短命 CLI 进程中后台刷新
goroutine 被杀;③ 传 data_version 触发条件请求返回 data:{}。修复后 12 service/152 method →
15 service/250 method,首启约 190ms 后走 cache,新增 FEISHU_CLI_META_FIRST_SYNC_MS 可调预算。sheet write/append/prepend/batch:删除 bool→"TRUE"/"FALSE" 转换后,v2 API 拒绝 JSON Boolean
(实测 code=90204 invalid cell type, type is bool),含布尔值的写入全部失败。已恢复转换(官方
stringifyCellValue 同样如此),4 条写入路径统一处理。sheet protect / unprotect:被误判「官方已废弃且无替代」而整体禁用并隐藏,实测两端点均返回
code=0 可用。恢复实现,并修正 protectId 解析层级(在 addProtectedDimension[i] 顶层,非嵌套 dimension 内)。calendar agenda 长区间:193103/193104 随 HTTP 400 下发,而 StatusCode != 200 提前返回短路了
自动切分恢复逻辑。修复后 90 天窗口从直接失败变为返回 334 个日程。安全
markdown 取 tenant token 用裸 http.Post(http.DefaultClient),绕过本分支新增的重定向/凭证
策略层——app_secret 可随 3xx 重放到任意 host 且无超时。改走 auth.FetchTenantAccessTokenResult。
同类问题统一修 4 处(markdown preview_download、drive download、message resource、event subscribe),
全部改用 config.NewHTTPClient(host 校验 + 重定向剥离 Authorization)。wiki delete 的 HTTP loopback 豁免用 strings.HasPrefix(hostname, "127.0.0."),会把攻击者可注册的
127.0.0.evil.com 当本地地址放行。改用 net.ParseIP 精确判定。multipart_session:block_size 守卫以 maxNativeInt64() 为上限,在 64 位平台等于钳制值而永久
失效,服务端返回 1<<62 会让 make([]byte) panic。加 64MB 合理上限;原测试因 t.Skip 在 64 位
平台从不执行,改为全平台有效。静默失败 / 契约不符
internal/client/timeparse:13 位毫秒时间戳被当秒解析(得到公元 56971 年)。现按数量级识别。api_code:正则从 code=N 放宽后会命中 status code: 500,使永久 4xx 被 IsRetryableError
判成可重试。收紧匹配并对 4xx 前置判定(保留 task.go 的 (code: N) 形态)。api --page-all:has_more 类型严格断言致静默截断(现容忍 bool/数字/字符串);page_token 为空
时不再中止翻页而回落 next_page_token。api --params:流式 decoder 静默丢弃尾部残留('{"a":1} {"b":2}' 只取前半)。现显式报错。doc content-update:<!-- feishu-colwidth: ... --> 指令被静默丢弃(此前只拦 flag)。两条入口都 fail-closed。markdown overwrite:取不到远端名时回落 <token>.md、--content-file 时用本地文件名,两条路径
都会静默重命名远端文件。现缺省一律读远端现有名,读不到则报错。resolveOptionalUserTokenWithFallback 把所有错误静默吞掉(含新增的 app_id 绑定
守卫),与 --as 类命令 fail-closed 的行为自相矛盾。现在 stderr 明确告警(stdout 不受影响)。approval task query --topic started:topic=3 已被官方下线(服务端仅接受 1/2/17/18),
前置报错并指向 approval instance initiated。approval:approval:read(approval get 实测必需)不在官方 scope 快照中,--recommend 会少授权,
在 scope_overrides.json 显式放行。drive export 原子写入补齐 Chmod / 目录 fsync / Windows 覆盖兜底(与 internal/auth 版本对齐)。internal/registry 生产文件曾 import "testing" 并按 testing.Testing() 分支,改为注入式 seam。文档同步:CLAUDE.md(Token 策略五 helper、列宽适用范围、审批 topic、catalog 数字)、
11 处 skill 工作流文档、attendance user-stats query --user-ids 必填示例。
GET /open-apis/drive/v1/medias/{token}/preview_download?preview_type=16,支持 --version。markdown patch;create 支持 --wiki-token;create/overwrite/patch 在 20MB+1 走 files/upload_prepare/part/finish,覆盖保留 file_token。--as bot|user|auto(默认 auto;已配置 User 但刷新失败 fail-closed;--dry-run 不解析 token)。依赖已验收的 fix(api): generic api 业务错误码校验与 auto 身份 fail-closed。medias/upload_all 省略 parent_node;>20MB prepare 显式 parent_node="";import_tasks 始终带 point.mount_type=1;官方扩展名/大小矩阵(含 slides/base);拒绝 wiki --folder-token。POST /docs_ai/v1/documents/{token}/fetch(缺少 data.document.content fail-closed);补齐类型/格式矩阵(slides/pptx、bitable/base、wiki 解析)。markdown 落盘走 output-dir 内路径校验 + 同目录 temp/fsync/rename,失败不截断已有 --overwrite 目标。--folder-token 时先 GET /drive/explorer/v2/root_folder/meta 取真实根目录 token;task_check 的 task_id 走 url.Values 编码。block_size 在转 int / 分配前做 max-int 校验;分片数用除法计算,避免 (size+blockSize-1) 溢出。markdown diff:每侧 10MB Stat + LimitReader 预检;--format/--jq 在下载前解析。meta_data.json 永远是离线 baseline;运行时可从官方 public api_definition?protocol=meta 拉 overlay。~/.feishu-cli/cache/remote_meta.json + metadata);损坏 cache fail-closed 回退 embedded。version 完全一致、并新于 embedded;残缺 pair 不信任。FEISHU_CLI_META_URL 仅允许 loopback;正式请求/重定向仅当前品牌官方 HTTPS host,拒绝跨 origin 与 HTTPS→HTTP。profile root 失败时禁用 cache,不回退共享 /tmp。FEISHU_CLI_REMOTE_META=off;测试注入:FEISHU_CLI_META_URL(loopback)/ FEISHU_CLI_CONFIG_DIR。schema status、doctor --only catalog、auth status 报告 source(embedded/cache/runtime)、版本、service/method 数。api --page-all/--page-limitdata.has_more + page_token/next_page_token;空/重复 cursor 停止并报错,不静默重复。--page-limit 截断时保留续翻 cursor,并输出 truncated/page_count;耗尽才删除 cursor。page_token 计入 seen。--page-limit>=0、--page-delay>=0、--timeout>0 在 token/网络前校验。json.Number 大整数。业务 code != 0 非零退出。api URL fragment / 官方 hostopen.feishu.cn / open.larksuite.com / open.larkoffice.com;短 path 仍兼容。--params 用 UseNumber 解析,大整数 ID 不四舍五入。auth token --as bot 改为官方 Accounts OAuth v3 POST /oauth/v3/token(grant_type=client_credentials,form 编码),带超时、响应体大小限制、HTTP 与业务错误校验。官方 Open API 上 SDK 的旧 tenant_access_token/internal 换票由传输桥接到同一 v3 端点,业务请求不再把 App Secret 发到旧 Open host;doctor 的 bot_identity 复用 v3 fetcher。auth token --as auto 仅在「自然未配置 User Token」时回退 Bot;App mismatch / 文件损坏 / 刷新失败 fail closed。--user-access-token 与 --as bot 同时出现时直接报错,不再静默忽略其中一方。token.json 改为 0600 临时文件 + fsync + rename 原子写入;刷新在跨进程文件锁下执行 reload → check → refresh → commit,写失败保留旧文件。token.json 增加 app_id 绑定:与当前选中 App 不一致,或旧文件未绑定,一律 fail closed(即使 access 仍有效)。显式迁移:feishu-cli auth token --bind-legacy-app --as user(不可与 --as bot / --user-access-token 同时使用)或重新 auth login。base_url 默认只允许官方 HTTPS(open.feishu.cn / open.larksuite.com);loopback HTTP 仅用于本机开发/测试。自定义远端 host、非 loopback HTTP、HTTPS→HTTP 或带 body 的跨源重定向必须分别设置 FEISHU_ALLOW_CUSTOM_BASE_URL / FEISHU_ALLOW_INSECURE_HTTP / FEISHU_ALLOW_CROSS_ORIGIN_REDIRECT(或对应配置项)。跨源重定向会剥离 Authorization,避免 App Secret 被外送。全部 Approval 专用命令不再走旧 uat_* path,也不再把 instance create / approval get 当作 Tenant 应用态能力:
approval get → GET /open-apis/approval/v4/approvals/{approval_code}/detail(User Token,approval:approval:read)approval instance get → GET .../instances/detailapproval instance initiated(新增)→ GET .../instances/initiatedapproval instance create → POST .../instances/initiate(发起人取当前 User Token,不再传 --user-id)approval instance cancel → POST .../instances/recallapproval instance cc → POST .../instances/add_ccapproval task query → GET .../tasks(删除不存在的 user_id query;count 为整数;任务含 instance_code / instance_status / initiator / initiator_name / summaries / support_api_operate)approval task approve/reject/transfer → POST .../tasks/pass|refuse|forward--output raw-json 在 HTTP 200 且飞书业务 code != 0 时非零退出,不再把失败 envelope 当成功输出。定义搜索、加签、退回、催办仍不在本命令面。
calendar event-search 迁移到 POST /calendars/{id}/events/search_event,时间过滤写入 filter.time_range;--calendar-id 默认 primary、--query 可空;RFC3339/YYYY-MM-DD 单边补同一天边界;page-size 1–30 越界报错;--as bot|user|auto fail-closed;JSON 保留 events/next_page_token 并输出精确 has_more。calendar agenda 正确处理小于 40 天窗口、超 40 天预切分、193104 再切分去重;去掉 instance_view 伪分页;全天结束日按排他日期转为含当日;结束时刻用次日当地午夜减 1 秒(DST 安全);--as bot|user|auto fail-closed。search messages 迁移到 POST /im/v1/messages/search;--as bot|user|auto(auto fail-closed);query 可省略;补 exclude_from_types / is_at_me / link;page-size 1–50 越界报错;--page-all 最多 40 页、负数 --page-limit 拒绝;非法 --format/--jq 在身份解析前失败。msg search-chats 迁移到 POST /im/v2/chats/search,解析 next_page_token;--as bot|user|auto;page-size 1–100 越界报错;--page-all 最多 40 页。msg mget / --enrich 改用 GET /im/v1/messages/mget,每批最多 50,禁止 N+1。msg history 线程展开与 with_sender_name 保持不变。apps html-publish 迁移到官方三段协议退役单次 multipart POST /apps/{id}/upload_and_release_html_code。现按官方协议:
/apps/{id} 校验 app_type 为 html / modern_html/apps/{id}/pre_release 解析 upload_url / tos_path/apps/{id}/releases,body {"tos_path":...},白名单返回 release_id(jq .release_id,不再返回 .url)--dry-run 只展示三段计划与打包清单,不获取 token、不访问网络。HTTP/业务错误非零退出并带恢复建议;任一步失败中止后续调用。敏感文件扫描、index.html、尺寸上限保持不变。
doc content-update 全面迁移至官方单操作原子更新协议,overwrite 采用原子 overwrite,replace_range 采用原子 block_replace,delete_range 采用原子 block_delete,replace_all 倒序逐个原子替换且部分失败时非零并报告已完成项,彻底杜绝先删后写的数据破坏窗口。--revision-id flag,透传版本号进行服务端乐观锁并发冲突保护。# 前缀支持匹配任意级别标题并精准截断章节范围,自动映射为实际 start_block_id 与 end_block_id。doc delete --all 改用 GetAllBlockChildren 全分页拉取父块下全部子块,彻底避免仅拉取第一页导致的漏删和谎报全删。DELETE /open-apis/wiki/v2/spaces/{space_id}/nodes/{node_token} 端点,请求体正确携带 obj_type 与 include_children。obj_type 白名单(wiki, doc, docx, sheet, bitable, mindnote, slides, file),并对 space/node/task path segment 进行 URL 转义。task_id 与继续查询命令。wiki create 在 --node-type=shortcut 时强制校验并下发 --origin-node-token。drive inspect 在展开 Wiki 节点时移除错误的 obj_type=wiki 查询参数。把「用哪个目录 / User Token」和「用哪套 App 凭证」拆成两条正交解析链,新增三个全局 flag:
把「用哪个目录 / User Token」和「用哪套 App 凭证」拆成两条正交解析链,新增三个全局 flag:
feishu-cli profile list --json # 先看能操作哪些 Bot
feishu-cli --profile alert msg send ... # 单次指定,不改默认指针
feishu-cli --bot-app-id cli_xxx --bot-app-secret xxx auth status -o json # 单次覆盖 App 凭证,不写盘--profile > FEISHU_PROFILE > active-profile 指针 > 旧布局--bot-app-id/--bot-app-secret > FEISHU_APP_ID/SECRET > 选中目录的 config.yamlprofile list / profile current 升级为 Bot 清单——即使没执行过 profile add,也会输出环境变量/旧布局正在用的那套(effective),不会让人误判「一个 Bot 都没有」。
此前只要设置了 FEISHU_APP_ID 就对每条命令打印警告,而这正是文档推荐的单应用用法。现在只在真错配时出声:覆盖来的 app_id 与所选目录 config.yaml 不是同一个应用,或两半凭证落在不同层且无法确认同属一个应用。单应用配置完全静默。
身份字段只陈述可离线证明的事实(user_token_override / has_config_user_token / token_from_profile)。CLI 不再断言「本次实际用了哪个 token」——本项目按命令分四类 token helper,--as bot、默认 Bot 身份的写命令、只认 flag 的 vc bot meeting-join、固定读本地文件的 auth status 各有各的解析路径。
auth status / auth logout 在 config.yaml 损坏时降级继续(业务命令保持 fail-fast)commandOverride 改用独立 mutex,不再复用保护文件写入的锁JSON 契约完全向后兼容:profile list --json 的 name/path/active/has_config/has_token 与 auth status -o json 的全部既有字段,取值与 v1.38.4 逐一相同,只新增字段;所有命令退出码不变。
两处行为变更:
profile list 表格列改为 ACTIVE/NAME/APP_ID/TOKEN/USER/SELECT,profile current 扩展为多行,auth status 新增 Profile/App ID 行。解析输出的脚本请改用 --json / -o json。active-profile 指针失效且旧布局仍在时,改为优先旧布局(原为回退到字典序第一个 profile)。指针缺失时优先旧布局本就是既定行为,此改动让两种等价情况保持一致,不会把仍在用 ~/.feishu-cli/ 的用户静默切到另一套 Bot。curl -fsSL https://raw.githubusercontent.com/riba2534/feishu-cli/main/install.sh | bashNothing published for this version
本版修复飞书文档导出时,跨文档引用同步块(ReferenceSynced)被静默导出为空的问题,并同步完成九个领域 Skill 的源码级校正。
本版修复飞书文档导出时,跨文档引用同步块(ReferenceSynced)被静默导出为空的问题,并同步完成九个领域 Skill 的源码级校正。
source_document_id / source_block_id 调用源块 children API,并设置 with_descendants=true,导出源同步块及全部后代内容WARNING 占位,stderr 输出明确诊断calendar rsvp 帮助文案为 User Token 必需block_type=50 并指向源 block_type=49with_descendants 分页及 CommonMark round-tripgofmt -l cmd internal、go test -count=1 ./...、go vet ./...、make check-skills 全部通过curl -fsSL https://raw.githubusercontent.com/riba2534/feishu-cli/main/install.sh | bashFull Changelog: v1.38.3...v1.38.4
Nothing published for this version
在 v1.38.2 之后对「docx 图片块显式宽高绑定」(e76f4c8)做了完整 review,本版一次性修复评审发现的全部问题:
在 v1.38.2 之后对「docx 图片块显式宽高绑定」(e76f4c8)做了完整 review,本版一次性修复评审发现的全部问题:
golang.org/x/image 注册 webp / bmp / tiff 解码器。网络下载图片最常见的 webp 此前无法本地解码、仍会落回服务端推断(1600px 缩略图 bug 的根因路径),现已显式绑定真实像素replace_image 请求被服务端以非临时错误拒绝时,自动降级为 token-only 重绑一次(等价旧行为),避免整个绑定/导入失败--verbose 输出(doc add / doc content-update 等静默路径不再刷屏);表格单元格图片的消息前缀修正为「单元格图片 N」,不再与顶层图片编号混淆ReplaceImage 兼容包装,收敛为唯一入口 ReplaceImage(doc, block, token, ReplaceImageOptions{Width, Height, Align, Caption});doc media-insert 不再手工构造 replace_image 请求体board upload-image 复用共享的头部解码 helper(原先整图解码只为读尺寸),顺带获得 webp/bmp/tiff 支持doc import:png 640x360 / webp 550x368 / 表格单元格 png 300x200 均显式落块(API 回读确认);EXIF Orientation=6 JPEG 正确回退服务端推断doc media-insert:webp + --align + --caption 全部经新选项正确落块board upload-image --dry-run:webp 正常识别,EXIF 旋转图明确提示改用 --width/--heightcurl -fsSL https://raw.githubusercontent.com/riba2534/feishu-cli/main/install.sh | bashFull Changelog: v1.38.2...v1.38.3
仅存在的普通本地文件优先于 img_ / file_ 资源 key 前缀。
img_ / file_ 资源 key 前缀。v1.38.1 对 img_logo.png、file_report.pdf 等真实本地媒体文件的自动上传修复。对应修复:PR #175。
修复 img_logo.png 、 file_report.pdf 等本地相对文件因 img_ / file_ 前缀被误判为飞书资源 key 的问题。
img_logo.png、file_report.pdf 等本地相对文件因 img_ / file_ 前缀被误判为飞书资源 key 的问题。msg send、msg reply 与 --upload-images,包括图片、文件、Opus、MP4 和视频封面。feishu-cli-messaging Skill,并补充完整回归测试。对应修复:PR #174。
msg send / msg reply 统一支持文本、Markdown、post/card、图片、文件、Opus 音频与 MP4 视频内容模型。
msg send / msg reply 统一支持文本、Markdown、post/card、图片、文件、Opus 音频与 MP4 视频内容模型。msg reply 新增本地媒体上传、--upload-images、--idempotency-key 和 JSON 输出。msg send 不再错误接受 thread_id;回复既有话题使用 msg reply <om_xxx>。feishu-cli-messaging Skill。原 msg send --thread-id 会在本地返回明确错误;请改用 msg reply <话题根消息 om_xxx> ...。
doc content-update / doc add 表格填充接入 batch_update 批量加速 ( #172 ):此前这两条路径的单元格填充全部走逐 cell 慢路径(每 cell 1 读 + 1 写、写受单文档 3 QPS 节流),批量填充优化仅在 doc import 生效。现在填充
doc content-update / doc add 表格填充接入 batch_update 批量加速(#172):此前这两条路径的单元格填充全部走逐 cell 慢路径(每 cell 1 读 + 1 写、写受单文档 3 QPS 节流),批量填充优化仅在 doc import 生效。现在填充函数内部按表格局部补建 cellID→textBlockID 映射,content-update 全部 6 种加内容 mode 与 doc add 均走 batch_update(每批 ≤30 cell)。
--mode overwrite 从 62.3s → 6.1sdoc import 追加行(>9 行表格 insert_table_row 产生的新 cell)此前不走批量的遗留问题安装 / 升级
curl -fsSL https://raw.githubusercontent.com/riba2534/feishu-cli/main/install.sh | bashboard image 画板缩略图扩展名 : download_as_image 端点实际返回 JPEG,此前硬编码 .png 落盘导致下游按 PNG 解析报错。现按响应 Content-Type(缺失时按文件头嗅探)决定扩展名:目录与无扩展名路径自动补 .jpg / .png (推荐传无扩展名路径
download_as_image 端点实际返回 JPEG,此前硬编码 .png 落盘导致下游按 PNG 解析报错。现按响应 Content-Type(缺失时按文件头嗅探)决定扩展名:目录与无扩展名路径自动补 .jpg/.png(推荐传无扩展名路径);doc export 画板资产与 Markdown 引用、doc media-download 输出路径同步修正。
.png 而服务端实际返回 JPEG 时现在会报错(此前会静默写出内容与扩展名不符的文件),请改用 .jpg 或省略扩展名。record list / search / batch-get 新增可重复 --field-id(字段名或字段 ID),只返回指定字段,读大表时控制输出体积。上限 list/batch-get 100 个、search 50 个。data.error.hint/path——如 select 写入未知选项时会直接列出可用选项与出错字段路径。create_records 行式;select 未知选项行为按端点分化(单条端点自动创建、批量端点拒绝);auto_number 改规则语义(存量记录不重排、新记录用新格式);修正 field create 示例的 v3 形状安装 / 升级
curl -fsSL https://raw.githubusercontent.com/riba2534/feishu-cli/main/install.sh | bashNothing published for this version
本版为一次全域能力补齐:29 项新能力 + 深度修复,全部经真实 API 验证。
本版为一次全域能力补齐:29 项新能力 + 深度修复,全部经真实 API 验证。
msg history/get/mget 读消息时 Bot 与外部租户用户的名字直接解析(此前 Bot 恒为空),内部群解析率实测 ~100%bitable record list --filter-json/--sort-json(tuple DSL,操作符与各字段类型值写法完整文档化,无需关键词)sheet table-get,数字/日期/布尔 dtype 自动推断,与 table-put 对称支持 get→改→put round-tripdoc read --outline/--heading/--keyword,先看结构再取所需章节,不必整篇导出card.action.trigger 卡片回调与审批 v4 事件(自动注册服务端订阅,fail-closed)--as 身份切换doc read、sheet table-get、chat list、task search、vc detail、vc note detail/transcript、minutes search/apply-permission、mail message-modify/message-trash/draft-send、wiki move-to-drive、drive secure-label list/set、file version revert、okr cycle detail、okr progress get/update/delete、okr upload-image
msg send --idempotency-key(幂等防重发)、calendar create-event/update-event --rrule(重复日程)、drive upload --file-token(原地覆盖)、chat member list --page-all(截断告警)、minutes get --wait-ready、task search --enrich=false、bitable record batch-update 逐记录差异化形态、doctor 身份就绪诊断、auth logout 服务端吊销、install.sh sha256 校验
completed_at="0" 误显示为 1970 年drive push 命中 1062507(目录子节点超 1500)按父目录隔离,不再放弃未满目录--due-before 纯日期对齐当天 23:59:59;幂等键按字符(50)而非字节校验完整变更见 CHANGELOG。
curl -fsSL https://raw.githubusercontent.com/riba2534/feishu-cli/main/install.sh | bash本版为一次全域能力补齐:消息读取发送者名字服务端回填、CLI 交互健壮性守卫、OKR 全量接线、多维表格结构化过滤 DSL、电子表格类型保真读取闭环、大文档选择性读取、卡片交互回调与审批 v4 事件订阅,以及邮件/会议/纪要/云盘/任务/日历多域新命令。
msg history/get/mget/thread-messages、merge_forward 展开、线程展开)统一带 with_sender_name=true,服务端直接回填发送者显示名——Bot 与外部租户用户也能解析(此前 Bot 恒为空、外部用户约 42% 覆盖,实测内部群解析率 ~100%)。ResolveSenderNames 升级三步解析:服务端回填(权威)→ mentions 免费映射 → contact basic_batch 兜底;进程级注册表旁路采集(internal/client/sender_names.go)。--contaner-id → 你是不是想用: --container-id)。--as 身份okr cycle detail(周期下全部目标+关键结果)、okr progress get/update/delete、okr upload-image。--as bot|user|auto(默认 bot 保持既有行为);实测身份墙按端点分化:cycle list 仅收 Tenant Token,其余端点同时支持 user/tenant。bitable record list 新增 --filter-json / --sort-json:无需关键词的纯结构化筛选(GET 端点 query 参数下发)。record search 的 filter 与 keyword 做交集的语义同步澄清。record batch-update 文档化两种 body 形态:统一 patch 与逐记录差异化(update_records map,实测均可用)。sheet table-put 闭环sheet table-get:按列类型保真读取整表(数字/日期/布尔自动推断 dtype,日期归一 ISO),输出与 table-put 输入完全对称,支持 get → 修改 → put 的 round-trip(已实测闭环)。doc read--outline 标题大纲(层级 + block_id)、--heading 按标题取节(止于同级/更高级标题,代码围栏防误判)、--keyword 正则定位(--context 控制上下文),避免大文档整篇导出撑爆上下文。card.action.trigger:卡片按钮/表单回调(独立回调帧通道),交互式 Bot 闭环补齐;application.bot.menu_v6 Bot 菜单事件。approval.instance/task.status_changed_v4),consume 启动时自动以 User 身份注册服务端订阅关系(INVOLVED/MANAGED,此前旧 key 缺订阅注册收不到事件)。vc notevc note detail <note_id> 纪要详情、vc note transcript <note_id> 统一逐字稿导出(自动翻页,--format markdown|text,--output 落文件)。vc detail <meeting_id|会议号>:一条命令聚合会议基础信息 + note_id(智能纪要)+ minute_token(妙记),进行中会议不报错(部分产物缺失在 hint 标注);会议号路径自动 90 天窗口反查。minutes search:按关键词/owner/时间搜索妙记;minutes apply-permission --perm view|edit:申请妙记权限;minutes get --wait-ready:轮询等待妙记转写就绪(--wait-timeout/--wait-interval)。chat list:列出当前身份加入的全部群(User 身份实测 5677 群完整翻页),支持 --sort-type/--page-all。chat member list --page-all:自动翻页拉全量成员;命中服务端安全设置截断(返回条数 < member_total)时 stderr 中文告警,避免静默漏数据。mail message-modify:批量加/删 label、移动文件夹(≤20 封,实测端点 batch_modify);mail message-trash:批量软删进废纸篓(--yes 跳过确认,可用 message-modify 移回);mail draft-send:发送已有草稿(沿用 --confirm-send 保护)。wiki move-to-drive:把 wiki 节点移出知识库到云盘文件夹(异步轮询),补齐与 wiki move-docs 相反方向的闭环。drive secure-label list/set:密级标签查询与设置(User 身份)。file version revert:文件回滚到历史版本。drive upload --file-token:原地覆盖上传新版本(不改变权限设置)。drive push 命中 1062507(父目录子节点超 1500)按父目录隔离处理:已满目录及其子树内的条目标记失败跳过,其余目录继续镜像,收尾汇总列出已满目录与中文清理建议(此前对剩余文件盲目 continue 反复撞墙)。task search:走服务端搜索端点,按创建者/执行者/关注者/完成态/截止时间/关键词过滤,支持 --page-all;已适配服务端硬限(page_size ≤30 自动收敛、翻页 offset 上限 150 优雅截断提示),5 并发补全任务详情。calendar create-event/update-event --rrule:RFC5545 重复日程(实测建→读回 recurrence 一致→改→删全链路)。completed_at 哨兵值 "0" 此前被格式化成 1970 年时间,task my / task get / task search 现正确显示为未完成。msg send --idempotency-key:发消息幂等键(≤50 字符,实测同 key 两次返回同一 message_id)。doctor 新增 user_identity / bot_identity 身份就绪诊断项。auth logout 默认先吊销服务端 token 再清理本地文件(--no-revoke 跳过;吊销失败不阻断本地清理)。install.sh 支持 checksums.txt sha256 校验(缺失时告警但兼容旧 release)。references/workflows/,降低路由歧义和常驻上下文占用。skills/manifest.yaml 作为能力归属清单,并新增 scripts/check_skills.py 校验目录结构、工作流引用、Go 源码中的 Skill 路径和 CLI 命令覆盖;make check-skills 会先重新构建,当前 405 个可执行命令(含隐藏命令)均有唯一归属。Nothing published for this version
v1.35.0 新增统一可视化设计系统、HTMLBox 编排动画生成器和多维表格记录搜索便捷模式,并修复 Wiki 导出、评论回复身份和安装脚本的已知问题。
v1.35.0 新增统一可视化设计系统、HTMLBox 编排动画生成器和多维表格记录搜索便捷模式,并修复 Wiki 导出、评论回复身份和安装脚本的已知问题。
feishu-cli-dataviz:提供图表形式选择、明暗主题色板、反模式清单和多载体配色规范。新的校验器覆盖 9 组定稿色板、重复色、环形首尾区分度和 3/4/6/8 位 CSS hex 文档门禁。animate_diagram.py 将结构化 JSON 转为自包含 SVG 动画 HTML,支持播放、暂停、步骤导航和 prefers-reduced-motion。bitable record search 便捷参数:新增 --keyword、可重复 --search-field、--filter-json、--sort-json、--view-id、--offset 和 --limit;保留 --config / --config-file 完整请求体逃生舱。comment reply add/delete 默认统一使用当前 App/Bot;显式提供 User Token 时才切换为用户身份。comment delete 改为返回飞书 API 真实支持的替代操作。go test -count=1 ./...、go vet ./...、gofmt、Dataviz 九组色板门禁和 HTMLBox 5 个 Python 回归测试全部通过。v1.35.0。curl -fsSL https://raw.githubusercontent.com/riba2534/feishu-cli/main/install.sh | bashFull Changelog: v1.34.0...v1.35.0
本版新增统一可视化设计系统、HTMLBox 编排动画生成器和多维表格记录搜索便捷模式,并修复 Wiki 导出、评论回复身份和安装脚本的已知问题。
feishu-cli-dataviz)validate_palette.js 新增 categorical、circular、all-pairs、HTMLBox 深色画布和 ordinal 共 9 组定稿门禁;重复色、首尾区分度和色盲安全性均可自动检查。check_docs.js 扫描技能文档中的 3/4/6/8 位 CSS hex,未登记的非 canonical 色值会直接阻断发布。animate_diagram.py 将结构化 JSON 转为自包含 SVG 动画 HTML,支持自动播放、暂停、上一步、下一步和进度定位。prefers-reduced-motion、安全字幕渲染、Bezier/store 几何裁切和短时间线回归测试。bitable record search 新增 --keyword、可重复 --search-field、--filter-json、--sort-json、--view-id、--offset 和 --limit。--config / --config-file 保留完整请求体逃生舱,与便捷参数严格互斥;字段名中的逗号不再被错误拆分。wiki export-tree --download-images 为每篇文档使用独立素材目录,并将媒体引用改写为相对 Markdown 文件的路径。comment delete 不再伪装成可用的整条评论删除接口,改为返回删除自己回复或将评论标记为已解决的可执行指引。comment reply add/delete 默认统一使用当前 App/Bot 身份;只有显式提供 User Token 时才切换为用户身份,避免默认添加后无法默认删除。install.sh 将过程日志统一写入 stderr,防止 GitHub API fallback 日志污染版本号和下载 URL。go test -count=1 ./...、go vet ./...、gofmt、Dataviz 九组色板门禁和 HTMLBox 5 个 Python 回归测试全部通过。Nothing published for this version
Nothing published for this version
Nothing published for this version
新增 5 项能力 + 1 项修复,全部经真实飞书 API round-trip 验证。
新增 5 项能力 + 1 项修复,全部经真实飞书 API round-trip 验证。
sheet table-put)把 pandas DataFrame 形状的 JSON(to_json(orient="split"))按列 dtype 写入电子表格,让数字/日期/文本列不被误判类型。
yyyy/MM/dd),飞书识别为「真日期」(可排序/可透视/ISNUMBER=TRUE),而非文本@ formatter 防止 ID/邮编等数字串被识别为数字(前导零保真,如 007)int*/uint*/float*/complex*→number(interval* 除外,按文本)、bool/boolean→bool、datetime*→date、其他→stringsheet add-rows 预扩容);仅支持单 sheet;读侧 round-trip(table-get)与 auto-grow 待后续board svg-export)POST /board/v1/whiteboards/{id}/export(export_type=svg),由服务端整板渲染为 SVG(base64 解码)。
board export-code 的区别:export-code 仅拼接 svg 节点的 svg_code,对 mermaid/plantuml/原生节点无效;svg-export 对任意画板有效,产出可二次编辑的完整 SVGboard import / svg_to_board.py 实现「导出 → 编辑 → 回写」闭环approval instance create)--node-approver / --node-approver-file、--node-cc / --node-cc-file:发起审批时按节点指定审批人/抄送人,格式 [{"node_id":"n1","value":["ou_xxx"]}]skills/feishu-cli-approval/references/form-control-values.md:14 类表单控件 value 结构速查 + 不支持清单 + 取值来源schema pretty 输出渲染枚举值schema <service>.<resource>.<method> 的 pretty 模式现在渲染字段的枚举取值(来自飞书归一化端点的 options/enum,含枚举描述),此前白白丢弃。数字型枚举值也正确渲染。
apps html-publish 单 .html 文件 10MB 上限对齐妙搭服务端「单个 .html 文件 ≤ 10MB」硬约束,客户端提前拦截并点名超限文件。
--dry-run 回填 oversize_html 详情,并新增统一的 would_block / block_reasons 字段,便于脚本/Agent 单字段判断是否可发布UploadSheetImageMedia 的 parent_type 此前固定 sheet_image,对从 .xlsx 等导入的 office 表格(token 以 fake_office_ 开头)会上传失败。现按 token 前缀自动选择 office_sheet_file / sheet_image。
新增 apps 命令组,把妙搭(Miaoda)低代码应用平台的「一份 HTML 秒级发布成可分享的飞书应用」能力搬进 feishu-cli。全部走 User 身份(user_access_token),需要 spark scope。
apps)新增 apps 命令组,把妙搭(Miaoda)低代码应用平台的「一份 HTML 秒级发布成可分享的飞书应用」能力搬进 feishu-cli。全部走 User 身份(user_access_token),需要 spark scope。
apps create —— 创建 HTML 妙搭应用(POST /open-apis/spark/v1/apps),返回 app.app_id(CLI 已剥掉飞书响应的 data 外层,jq 用 .app.app_id)apps html-publish —— 把 --path(单 HTML 文件或整目录)打包成 tar.gz,单次 multipart POST 上传并发布(/apps/{id}/upload_and_release_html_code),返回 url(jq 用 .url,一键部署)。客户端侧:要求根目录有 index.html、未压缩 ≤ 200MB / 打包后 tar.gz ≤ 20MB、默认拦截凭证文件(.env / .npmrc / .netrc / .git-credentials / .aws/credentials / .docker/config.json / .kube/config,--allow-sensitive 放行)apps update —— 部分更新名称/描述(PATCH /apps/{id})apps access-scope-get / apps access-scope-set —— 查看/设置访问范围(specific / public / tenant,映射后端 Range / All / Tenant)apps list —— 列出当前用户的应用(隐藏命令,游标分页)--format json|pretty|table|ndjson|csv + --jq;写命令支持 --dry-runspark:app:write(create/update/html-publish/access-scope-set)、spark:app:read(list/access-scope-get)。⚠️ feishu-cli 的 auth login --scope 是「替换」不是「合并」,请把 spark scope 并入完整 scope 串一起登录,避免丢失已有权限Markdown 表格单元格内的本地/网络图片此前在转换阶段被静默丢弃(带 alt 只剩 alt 文本、无 alt 整格变空)。现在 doc import 会在表格填充完成后(阶段 2.5)真正嵌入为单元格内的 Image 子块。
ConvertOptions.EmbedTableImages 开关,仅 doc import 启用真嵌入;非导入场景(doc add/content-update)单元格图片降级为 [图片: 说明] 占位文本,杜绝任何路径的静默丢失。cell_image_total/success/failed 统计字段。),alt 文本不再经填充兜底路径泄漏成单元格里多余的标题;嵌入阶段改用 GetTableCellIDs(block.Table.Cells,与填充/导出同源)定位单元格,不再依赖 list-blocks 是否为表格块填充 children;单元格数与图片索引不一致或获取失败时,被跳过的图片计入失败统计而非静默丢弃;单元格图片上传失败时删除孤儿空 Image 块并补占位文本apps dry-run:--dry-run 预览现在同样尊重 --format/--jq(此前固定 JSON,与 help 列出的 flag 不符)apps html-publish 凭证扫描:目录形态下不再因根的「父目录」恰好叫 .aws/.docker/.kube 而把根下普通 credentials/config 文件误判为凭证apps 输出 jq 路径勘误(data.app.app_id → .app.app_id、data.url → .url,CLI 已剥掉 data 外层)[Image: 且直出原始路径);apps html-publish 打包错误信息改为中文bitable 命令组此前在 CLI 侧硬性强制 User Token(未登录直接报错),但底层飞书 base/v3 与 bitable/v1 API 本身一直同时支持 User / Tenant(App) 两种身份(client 早已声明 SupportedAccessTokenTypes:[Us
--as bot|user|auto 身份切换bitable 命令组此前在 CLI 侧硬性强制 User Token(未登录直接报错),但底层飞书 base/v3 与 bitable/v1 API 本身一直同时支持 User / Tenant(App) 两种身份(client 早已声明 SupportedAccessTokenTypes:[User, Tenant],瓶颈纯在命令封装层)。本版按 --as bot|user|auto 身份模式放开:
--as bot|user|auto(默认 auto),所有 bitable 子命令通用:
auto(默认):User 优先、Tenant 兜底——已登录用 User Token,未登录/过期自动回落 App Tokenbot(= tenant/app):强制 App Token,无需 auth login、永不过期,适合 cron / 无人值守 / 脚本自动抓取多维表格user:强制 User Token(缺失报错,提示可改用 --as bot)resolveIdentityToken(cmd/utils.go)统一身份解析,替换 9 处咽喉点的 resolveRequiredUserToken/requireUserToken(bitable_base/field/form_crud/output/record_attachment)。客户端层零改动cmd/bitable_identity_test.go:覆盖 bot/tenant/app 三别名(含大小写/空白)、显式 user token、非法 --as 报错、persistent flag 注册与子命令继承feishu-cli-bitable 技能 SKILL.md 补「身份选择 --as」表格 + cron 示例 + 91403 协作者排错;description 补 cron / App Token 触发词CLAUDE.md Token 策略由「三类」扩为「四类」,新增 resolveIdentityToken 身份可选类目Nothing published for this version
飞书文档里唯一能跑动画、可交互内容的载体落地为正式命令。妙笔BOX 是 AddOns HTML 小组件块(block_type=40),把一整页 HTML 存进 add_ons.record,飞书在 iframe 沙箱里真实执行 CSS/JS——CSS 动画、ECharts、Three.js、Can
飞书文档里唯一能跑动画、可交互内容的载体落地为正式命令。妙笔BOX 是 AddOns HTML 小组件块(block_type=40),把一整页 HTML 存进 add_ons.record,飞书在 iframe 沙箱里真实执行 CSS/JS——CSS 动画、ECharts、Three.js、Canvas、真实地图、3D 图表都能动(区别于画板的 SVG 节点会被服务端栅格化成静态图)。
新增命令 feishu-cli doc htmlbox {create|update|get|delete}:
create:往文档插入妙笔BOX 块(--html / --html-file / stdin 三选一,--index / --parent-id 控制位置)update:更新块 HTML。飞书 API 不支持原地改 add_ons(PATCH 返回 1770001),改走「先建后删、同位置重建」——新块在原位置创建成功后才删旧块,中途失败不丢数据,返回 new_block_idget:读回块 HTML(--raw 逐字节输出便于存文件/再编辑,默认输出含 html 字段的结构)delete:删除妙笔BOX 块(仅限 block_type=40,防误删其他块)--format / --jq / --dry-run;默认 Bot 身份(操作自建文档无需登录)配套 feishu-cli-htmlbox 技能:SKILL.md + 3 个 references——mechanism.md(块机制 / iframe 沙箱边界 / 与画板的 trade-off)、html-recipes.md(CSS 动画 / ECharts / Canvas / Dashboard 自包含范例)、pitfalls.md(真实创建大批量图沉淀的 9 类实战踩坑:JS 报错白屏不报错、CDN 加载时序、真实地图 registerMap、record 双重编码、批量追加限流等)。
loadHTMLInput(含「不 TrimSpace 保原文」这一 get --raw 还原保证)、<script> / HTML 注释 / U+2028 payload roundtrip、unicode/emoji roundtripclient.StringVal,update 补 len==0 防御,get --raw 空内容时 stderr 告警① 表格填充 batch_update 优化(issue #159)
① 表格填充 batch_update 优化(issue #159)
doc import / doc add / doc content-update 三个入口的 Markdown 表格填充重写:
GetAllBlocks 替代 N 次 GetBlockChildren)batch_update API,每批 ≤30 个一次写入;多块 cell(含 <br/>)保留原 update-first-empty 路径作为兜底docWriteLimiter),下沉到 CreateBlock/UpdateBlock/DeleteBlocks/BatchUpdateBlocks 4 个底层写函数,所有间接调用者(InsertTableRow/AppendTableRows/ReplaceImage 等)自动受限,避免触发 99991400典型场景:4 张 6×8 表(共 ~120 cells)从 ~70s 降到 ~3s(25-30x),与 issue #159 实测数据吻合。BatchUpdateBlocks 改为返回 (*BatchUpdateBlocksResult, http.Header, error),让 retry 层拿到 x-ogw-ratelimit-reset 做精确退避。
② 表格列宽自定义(issue #156)
之前列宽完全由内容启发式计算(中文 14px / 英文 8px),用户无法干预。现在两种方式可覆盖:
紧邻表格上方注释(推荐,单表精控):
<!-- feishu-colwidth: 80,200,120,* -->
| 列1 | 列2 | 列3 | 列4 |
|-----|-----|-----|-----|
单位支持 px 整数、30% 百分比(按 700px 文档宽度换算)、* 或空(该列走 auto)。注释独占一行才生效;中间夹任何块(heading/段落/列表/代码块/link-ref-def)会清空注释,避免悬浮注释污染下游表格。
CLI flag 全局覆盖:--table-column-width=auto|fixed|N1,N2,...
auto(默认):保留启发式fixed:所有列等分文档宽度80,200,*,120):显式声明每列宽度,* 表示该列走 auto优先级:注释 > CLI flag explicit > flag fixed > auto。所有路径最终都会过 [80, 400] 像素 clamp。注释/flag 列宽数量与表实际列数不一致时,stderr 打印警告(多写截断、少写补 auto)。
补齐三类此前未覆盖的场景。
① 消息搜索 enrich(search messages)
新增 --enrich opt-in 富化:在消息 ID 基础上补全 内容 / 发送者 / 群名 / 时间(对齐 lark +messages-search)。默认行为保持原 ID 输出,完全向后兼容:
--enrich):仅返回消息 ID,-o json / --format json 返回旧 schema {MessageIDs,HasMore,PageToken},与升级前一致--enrich:search → 消息 ID → BatchGetMessages 取详情 → 解析发送者名/群名 → 人类可读视图;-o json / --format json 返回 []{message_id,msg_type,chat_id,chat_name,sender_id,sender_name,create_time,time,text} 数组--format json|pretty|table|ndjson|csv + --jq 结构化输出对两种模式均生效;--page-all/--page-limit 自动翻页② 多维表格补全(bitable)
补齐 base/v3 + bitable/v1 公开 API 支持、此前缺失的命令:
bitable dashboard list|copy(仪表盘)bitable form get|patch + bitable form field list|patch(表单及表单问题)bitable role member list|create|delete|batch-create|batch-delete(角色协作者)bitable workflow enable|disable(工作流启停)bitable update(多维表格本体重命名 / 高级权限开关)bitable record batch-get(批量获取记录)internal/client/bitable_v1.go:dashboard copy / role member / app update / workflow 启停 base/v3 无对应端点,走 bitable/v1(无需 X-App-Id header)。新命令经统一执行器 bitableRun + 请求描述符 bitableReq 路由 base/v3 与 bitable/v1,写命令支持 --dry-run 预览注:dashboard block / form submit 已在后续一轮补齐(见下方「④ 多维表格 / 表格 / vc / mail / markdown 再补全」)。lark-base 的 view 独立 filter-sort 端点走飞书私有扩展 API(
base-api.feishu.cn),公开 OpenAPI 无对应,未做专用命令——可用feishu-cli api裸调兜底。
③ 输出工程化(internal/output)
新增统一输出包,并接入 api 与新命令:
--format json|pretty|table|ndjson|csv(api / search messages / bitable 新增命令)--jq <expr>(内置 gojq v0.12.17,纯 Go,无需外部 jq;保持 go 1.21 兼容)api 命令新增 --format/--jq(显式指定时走内置渲染,否则保持原 pretty/raw 行为)json.Number(飞书 19 位 message_id/chat_id 不被 float64 截断)新增依赖:github.com/itchyny/gojq v0.12.17(pin 该版本保持 go 1.21 兼容,未抬升 go directive)。
补齐上一轮仍缺的仪表盘 / 表单 / 工作流 / 附件 / 浮图 / 筛选视图 / 下拉 / 会议机器人 / 邮箱签名 / Markdown diff。
多维表格(bitable)
bitable dashboard create|get|update|delete|arrange(仪表盘 CRUD + 服务端智能排版,原有 list|copy);create|update 支持便捷字段 --name/--theme-style 或 --config/--config-file 完整请求体二选一bitable dashboard block create|get|list|update|delete(仪表盘块 CRUD);create 支持 --type(column/bar/line/pie/ring/area/combo/scatter/funnel/wordCloud/radar/statistics/text)+ --data-config 便捷字段bitable form create|delete|detail|submit(表单 CRUD + 按分享 token 取详情/提交,原有 get|patch);detail/submit 走 share-token(shr 前缀)无需 base_token;submit 不处理附件上传bitable form field create|delete(表单问题批量增删,单次 ≤ 10,别名 questions,原有 list|patch);create 用 --questions 数组,delete 用 --question-idsbitable workflow create|get|update(工作流 CRUD,update 为整体替换 PUT,原有 enable|disable|list)bitable record upload-attachment|download-attachment|remove-attachment(记录附件上传 / 下载 / 移除;upload/download 为 2 步编排,单次 ≤ 50 附件)表格(sheet)
sheet image get|update|media-upload|write-image(浮图获取 / 更新锚点尺寸偏移 / 上传素材取 file_token / 本地图片写入单元格,原有 add|list|delete)sheet filter-view get|update(筛选视图获取 / 更新名称范围,原有 create|list|delete)sheet filter-view condition create|get|update|delete|list(筛选条件 CRUD,按列字母定位)sheet dropdown get|update|delete(下拉菜单数据验证获取 / 更新 / 删除,原有 set);update 支持多范围 / 多选 --multiple / 高亮 --colorssheet batch-set-style(批量为多范围设置单元格样式,--data 传 {ranges,style} 数组)会议(vc)
vc bot meeting-join|meeting-leave|meeting-events(会议机器人按会议号入会 / 离会 / 查会议事件,对应 /open-apis/vc/v1/bots/{join,leave,events})邮件(mail)
mail signature(列出 / 查看邮箱签名,--detail <签名ID> 取单个详情)Markdown(markdown)
markdown diff(下载远端 Markdown 在本地算 unified diff,不改远端;三模式:远端最新 vs 本地 / 远端某版本 vs 最新 / 版本 A vs 版本 B);输出支持 --format/--jq(-o json 作兼容别名),默认仍打印 unified diff 文本云盘下载(drive / file / msg)
drive download / file download 支持 User Token 直连下载 + 大文件自动 HTTP Range 分片兜底(突破单次下载大小限制;Bot/Tenant 路径仍保留 100MB 客户端上限)msg resource-download 支持 --user-access-token 用户身份下载消息图片/文件(可取 Bot 不可见的历史资源),大文件同样自动分片Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
新增 feishu-cli event 命令族(list / schema / consume / status / stop), 通过飞书 WebSocket 长连接接收应用事件并以 NDJSON 输出到 stdout。
event 模块(WebSocket 实时事件订阅 + daemon 进程管理)新增 feishu-cli event 命令族(list / schema / consume / status / stop),
通过飞书 WebSocket 长连接接收应用事件并以 NDJSON 输出到 stdout。
背景:feishu-cli 之前完全没有事件订阅能力,AI Agent 想做 bot 实时响应只能自写 WebSocket 客户端。本 PR 在 feishu-cli 代码风格下重新实现,让单工具栈即可完成消息接收、群成员变更监听、审批 事件订阅等长连接场景。
新增子命令:
event list [--json] — 列出所有支持的 EventKey(按 domain 分组:im / contact / calendar / drive / approval / vc 共 22+ 个)event schema <key> [--json] — 查看某个 EventKey 的 EventType / scope / payload schema 示例event consume <key> — 启动 WebSocket 长连接订阅(阻塞,事件流→stdout NDJSON)event status [--json] — 查看本机所有 consume 进程(PID/EventKey/启动时间/uptime)event stop {--pid N | --event-key K | --all} [--force] [--json] — 停止 consume 进程Consume 关键 flag:
--max-events N — 接收 N 条事件后退出(0=不限制)--timeout 30s — 运行时长上限(0=不限制)--jq .event.message — 极简点路径过滤(只接受 .a.b.c,不支持完整 jq 语法,用 pipe 接外部 jq)--output-dir ./events — 每条事件 dump 为 <event_id>.json 落盘(只接受安全相对路径)--quiet — 抑制 stderr 诊断(不影响 stdout 事件流;ready marker 仍会输出,便于父进程判断就绪)Daemon / 进程模型:
event consume 进程 = 一个独立 OS 进程 + 一个 WebSocket 长连接(一个 EventKey)~/.feishu-cli/events/<app_id>/bus.json(每个 AppID 一个目录):consume 启动写入 PID/EventKey/启动时间,退出时移除~/.feishu-cli/events/<app_id>/bus.lock(flock 文件锁,fd 关闭自动释放)ws.Client.WithAutoReconnect(true),断线无限重试(间隔 2 分钟 + 首次随机抖动)Subprocess 协议(兼容 AI Agent 子进程调度):
[event] ready event_key=<key>,父进程应阻塞 stderr 等该行出现后再读 stdout< /dev/null / nohup 等场景)Scope 要求:默认 App Token;具体 scope 因 EventKey 而异(event schema <key> 查看)。已加入
--domain event --recommend 推荐列表,覆盖 IM/联系人/日历/云盘/审批/VC 常用 scope 并集。
代码影响范围:
cmd/event.go(顶层命令)+ cmd/event_{list,schema,consume,status,stop}.go(5 个子命令)internal/event/{keys,bus,runtime}.go(EventKey 注册表 + bus.json 状态管理 + WebSocket runtime)cmd/event_test.go + internal/event/{keys,bus,runtime}_test.go(mock 单测)cmd/event_smoke_test.go(//go:build smoke 本地真实 WebSocket 端到端测试)internal/registry/domain_alias.go:新增 event domain scope 推荐列表go.sum:补全 larksuite/oapi-sdk-go/v3/ws 子包的传递依赖(gorilla/websocket、gogo/protobuf;均为 indirect,无新顶层依赖)attendance 考勤查询模块新增 attendance 顶层命令组(别名 att),覆盖飞书考勤 OpenAPI 两类查询:
feishu-cli attendance user-task query —— 按日期范围查询用户上下班打卡记录
(POST /open-apis/attendance/v1/user_tasks/query,单次最多 50 用户)feishu-cli attendance user-stats query —— 查询日度 / 月度考勤统计
(POST /open-apis/attendance/v1/user_stats_datas/query,单次最多 200 用户,
起止跨度 ≤ 31 天)特性:
YYYY-MM-DD 与 YYYYMMDD,自动转换为 API 所需的 yyyyMMdd 整数text 人类可读(打卡时间 / 结果 / 加班标记 / 统计字段标题),
-o json 直出归一化结构体,便于 AI Agent 与脚本消费invalid_user_ids / unauthorized_user_ids,提示无效或无权限用户Attendance.UserTask.Query / Attendance.UserStatsData.Query 的
SupportedAccessTokenTypes 仅含 Tenant,传入 user token 会被 SDK 拒绝权限要求:应用需在飞书开放平台「应用权限管理」页面获得
attendance:task:readonly 权限(tenant 级),无需 auth login。
msg flag:消息书签(收藏 / 列表 / 取消)新增 feishu-cli msg flag {create,list,cancel} 三个子命令,对应飞书 OpenAPI /im/v1/flags,
覆盖消息书签的完整生命周期。
支持的两层书签模型:
| item_type | flag_type | 场景 |
|---|---|---|
| default | message | 消息层书签(最常见,默认值) |
| thread | feed | topic-style 话题群 feed 层(侧边栏) |
| msg_thread | feed | 普通群消息线程 feed 层 |
其余组合服务端会拒绝,CLI 默认值为 default + message 即可覆盖 90% 用例。
实现说明:飞书 Open SDK v3 当前未封装 flag 接口,使用通用 HTTP client(client.Post /
client.Get)直接调用,与 comment reply add 同套路。
权限要求:User Token;list 需要 im:feed.flag:read,create/cancel 需要 im:feed.flag:write
okr 模块:OKR 周期和进展记录新增 feishu-cli okr 命令组,覆盖 OKR 最高频的 3 个操作:
okr cycle list — 获取当前租户的所有 OKR 周期(/open-apis/okr/v1/periods,租户级全局列表,自动分页)okr progress list --objective-id 7xxx | --key-result-id 7xxx — 列出某个目标 / 关键结果下的所有进展记录okr progress create --objective-id 7xxx | --key-result-id 7xxx --content "..." — 创建一条进展记录,
支持纯文本(--content,自动包装为 ContentBlock)或原始富文本(--content-json);
可附带 --progress-percent + --progress-status 标记进度;
--source-url 飞书侧必填,CLI 默认填 https://www.feishu.cn/okr/progress placeholder,可显式覆盖实现要点:
progress create 走飞书 Open SDK v3.5.3 的 Okr.ProgressRecord.Create;
cycle list 走通用 HTTP client 直调 /open-apis/okr/v1/periods(v1/periods 是租户级,不按用户过滤);
progress list 走通用 HTTP client 直调 /open-apis/okr/v2/...~/.feishu-cli/token.json;
也可以通过 --user-access-token 或 FEISHU_USER_ACCESS_TOKEN 显式覆盖YYYY-MM-DD HH:MM:SS,方便人眼阅读权限要求(User Token scope):
| 命令 | scope |
|---|---|
cycle list |
okr:okr:readonly 或 okr:okr.period:readonly |
progress list |
okr:okr:readonly 或 okr:okr.progress:readonly |
progress create |
okr:okr 或 okr:okr.progress:writeonly |
使用示例:
feishu-cli auth login --domain event --recommend
# 列出所有 EventKey
feishu-cli event list
# 查看 IM 接收消息事件的字段
feishu-cli event schema im.message.receive_v1
# 订阅(Ctrl-C 退出)
feishu-cli event consume im.message.receive_v1
# 调试:抓 5 条事件后自动退出
feishu-cli event consume im.message.receive_v1 --max-events 5 --timeout 60s
# 并发订阅多个 EventKey(每个进程一个 EventKey)
feishu-cli event consume im.message.receive_v1 > receive.ndjson 2> receive.log &
feishu-cli event consume im.chat.member.user.added_v1 > member.ndjson 2> member.log &
feishu-cli event status # 查看活跃进程
feishu-cli event stop --all # 一键停止
doctor 命令(健康检查 / 配置 / 认证 / 网络 / 依赖一把验)新增 feishu-cli doctor 命令,跑一组本地诊断快速验证 CLI 状态。
6 项检查:
config_file — app_id / app_secret 是否就位user_token — token.json 状态(valid / needs_refresh / expired)endpoint_open — open.feishu.cn HTTPS 可达性 + RTTendpoint_larksuite — open.larksuite.com HTTPS 可达性 + RTTproxy — HTTPS_PROXY 与 NO_PROXY 配置(缺飞书域 warn)dependencies — Go 版本 + larksuite/oapi-sdk-go 版本flag:--json 机器可读输出 / --offline 跳过网络检查 / --only user_token,proxy 仅运行指定项。
退出码:0 = 全 pass / 1 = 任一 fail。
使用示例:
feishu-cli doctor # pretty 输出全检查
feishu-cli doctor --json # JSON 输出(AI agent 自检友好)
feishu-cli doctor --offline # 跳过网络
feishu-cli doctor --only user_token,proxy # 仅跑指定项
代码影响范围:新增 cmd/doctor.go(6 项检查 + pretty/JSON 输出)和 cmd/doctor_test.go(parseOnly / shouldRun / proxy / dependencies 单测);不引入新依赖。
slides 模块:Slides 演示文稿创建与媒体上传新增 feishu-cli slides 顶层命令,提供两个子命令支撑 Slides 演示文稿的最小可用工作流:
slides create [--title <name>] [--width <px>] [--height <px>] [--output json]
调用 POST /open-apis/slides_ai/v1/xml_presentations 创建空白演示文稿,返回 xml_presentation_id /
revision_id / title。默认尺寸 960x540。slides media-upload --file <path> --presentation-token <xml_presentation_id> [--output json]
本地图片走 /open-apis/drive/v1/medias/upload_all 上传到指定演示文稿,返回 file_token
可直接作为 slide XML 中 <img src="..."> 引用。关键实现细节:
parent_type 固定为 slide_file(实测:slide_image / slides_image /
slides_file 都会被拒);parent_node 必须为目标 xml_presentation_idupload_prepare 不接受 parent_type=slide_file)internal/client/drive.go::UploadMediaWithExtra 上传链路权限要求:
slides:presentation:create 或 slides:presentation:write_onlydocs:document.media:uploadmail 高级能力:CID 内联图片 + 邮件模板(MVP)为 mail 模块补齐两块进阶能力:直接发送与邮件模板。
1. mail send --inline-images-auto-scan(CID 内联图片)
HTML body 中所有 <img src="本地相对/绝对路径"> 会被自动扫描:
cid: / http(s): / data: / // scheme 的引用drive/v1/medias/upload_all(parent_type=email,parent_node = 当前登录用户 open_id)multipart/related:HTML 段 + 每张图一个 Content-ID: <cid>、Content-Disposition: inline 的 partsrc 为 cid:<cid> 后回写到 body依赖 ~/.feishu-cli/user_profile.json 中缓存的 open_id(auth login 后自动写入)。
2. mail template create / mail template list(邮件模板 MVP)
mail template create --name xxx --subject xxx --body xxx [--to ... --cc ... --bcc ... --plain-text]
调用 POST /open-apis/mail/v1/user_mailboxes/{id}/templatesmail template list [--mailbox me]
调用 GET /open-apis/mail/v1/user_mailboxes/{id}/templates(接口不分页,一次返回所有 id+name)底层 client 也实现了 GetMailTemplate / UpdateMailTemplate / DeleteMailTemplate,但 CLI 层目前只暴露 create/list(MVP)。
权限要求:
mail:user_mailbox:readonly / mail:user_mailbox.message:modify / mail:user_mailbox.message:sendmail:user_mailbox:readonly、mail:user_mailbox.message:modify⚠️ 模板接口依赖邮箱读写相关权限 —— 命令本身实现完整、参数校验完整、EML/JSON payload 正确;如果调用模板 API 时返回 scope 校验失败(401/permission denied),请补开邮箱读写权限后重试。 CID 内联图片功能不依赖此 scope,已可正常使用。
profile:多配置(profile)管理新增 feishu-cli profile 顶层命令,让一台机器在多个飞书账号 / 应用之间快速切换。
解决长期痛点:原 ~/.feishu-cli/{config.yaml,token.json} 单实例布局,切账号必须手动备份/恢复
或者来回 mv,对同时需要 work / personal、或者 feishu.cn / larksuite.com 双端的用户极不友好。
子命令:
profile add <name> [--app-id ... --app-secret ... --base-url ... --use] 新建 profileprofile list (alias ls) 列出所有 profile,标注 active 列;--json 适合脚本/AI Agentprofile use <name> (alias switch/checkout) 切换 active;use - 切回上一个profile current 显示当前 active profile 名 + 目录profile rename <old> <new> (alias mv) 重命名,自动同步指针profile remove <name> (alias rm/delete) 删除 profile;--force 跳过二次确认profile migrate [--name default] [--force] 把旧布局 ~/.feishu-cli/{config,token}.json 拷到 profiles/<name>/(原文件保留,让用户确认无误后手动清理)目录布局:
~/.feishu-cli/
config.yaml # 旧布局,profile 系统未启用时仍读这里(无感升级)
token.json
active-profile # 一行文本:当前 profile 名
previous-profile # 一行文本:上一个 profile 名(支持 use -)
profiles/
work/
config.yaml
token.json
user_profile.json
personal/
...
向后兼容设计:
internal/config 和 internal/auth 仍走旧路径,老用户零感知升级profile add 不会 自动迁移旧文件——避免静默丢数据;要迁就显式 profile migrateFEISHU_PROFILE=<name> 环境变量临时覆盖(不写指针文件),适合 CI / 一次性切换安全:
[A-Za-z0-9_-]{1,64},禁止 ./../路径分隔符等注入字符profiles / cache 不可作为 profile 名.tmp + rename)0700 权限,含 token.json 等敏感文件测试:internal/profile/store_test.go 21 个测试,全部用 t.TempDir() 隔离,覆盖
ValidateName / List 字典序 / Create / Remove / Rename / Use 含 - 切换 / MigrateLegacy
含 --force 覆盖 / FEISHU_PROFILE 环境变量优先级 / ActiveDir 新旧布局切换。
示例:
# 创建一个标题为 "Q2 OKR" 的演示文稿
feishu-cli slides create --title "Q2 OKR" --output json
# 把封面图上传到该演示文稿
feishu-cli slides media-upload --file ./cover.png \
--presentation-token <xml_presentation_id>
schema 命令:本地浏览飞书 OpenAPI 方法(path / 参数 / scope)新增 feishu-cli schema [service.resource.method] 子命令,无需 token、纯本地查询飞书
开放平台 OpenAPI 方法的 HTTP path / 动词 / 参数 / 请求体 / 响应体 / scope / 文档链接。
便于 AI Agent 和脚本作者快速查找参数。
用法:
feishu-cli schema # 列出所有可用 service(12 个)
feishu-cli schema im # 列出 im 域下所有 resource.method
feishu-cli schema im.messages # 列出 messages 资源下所有 method
feishu-cli schema im.messages.delete # 查看具体 method 详情
feishu-cli schema im.messages.delete --format json # JSON 输出(AI Agent 推荐)
feishu-cli schema list --service drive # 等价于 schema drive,支持 --format json
数据源:internal/registry/meta_data.json(编译期 embed),与认证模块复用同一份元数据。
当前覆盖 12 个 service:approval / attendance / calendar / drive / im / mail / minutes /
sheets / slides / task / vc / wiki。
输出含:HTTP verb + 完整 path、parameters(含 path / query / required 标记)、 requestBody(嵌套字段)、responseBody、accessTokens(user / tenant)、scopes、docUrl。
feishu-cli attendance user-task query
--employee-type open_id
--user-ids ou_xxxxxxxxx
--start 2026-05-01 --end 2026-05-18
feishu-cli attendance user-stats query
--employee-type open_id
--user-ids ou_xxxxxxxxx --current-user-id ou_xxxxxxxxx
--stats-type daily --start 2026-05-01 --end 2026-05-31 -o json
feishu-cli msg flag create om_xxx
feishu-cli msg flag create om_xxx --flag-type feed
feishu-cli msg flag list --page-size 50
feishu-cli msg flag cancel om_xxx
feishu-cli msg flag create om_xxx --item-type msg_thread --flag-type feed
feishu-cli auth login --scope "okr:okr"
feishu-cli okr cycle list
feishu-cli okr progress list --objective-id 7xxx
feishu-cli okr progress create --key-result-id 7xxx --content "本周完成核心模块联调"
MVP 范围说明:本次只覆盖最常用的 3 个动词,progress update / delete / get 和图片上传暂不暴露 为命令行(client 层已有实现,后续按需补 CLI)。
approval 流程:实例详情 / 发起 / 撤回 / 抄送 / 通过 / 拒绝 / 转交补齐审批模块的核心能力,原本只有 approval get(定义查询)和 approval task query(任务列表查询)两条只读命令,现在可以覆盖官方当前可执行的实例/任务主路径:
feishu-cli approval instance get — 获取单个审批实例详情,对齐官方 instances/uat_getfeishu-cli approval instance create — 发起一条审批实例,--form 或 --form-file 传表单 JSONfeishu-cli approval instance cancel — 撤回(取消)已发起的审批实例feishu-cli approval instance cc — 把审批实例抄送给一个或多个用户(--cc-user-ids ou_a,ou_b)feishu-cli approval task approve — 通过指定审批任务,可附 --commentfeishu-cli approval task reject — 拒绝指定审批任务,建议在 --comment 中填写原因feishu-cli approval task transfer — 转交审批任务给其他用户,对齐官方 tasks/uat_transfer权限要求:instance get、task query、instance cancel/cc、task approve/reject/transfer 使用 User Token,分别需要 approval:instance:read、approval:task:read、approval:instance:write、approval:task:write;instance create 是本项目额外应用态能力,使用 tenant_access_token,需要 approval:approval。
底层 API:
GET /open-apis/approval/v4/instances/uat_getPOST /open-apis/approval/v4/instancesPOST /open-apis/approval/v4/instances/uat_cancelPOST /open-apis/approval/v4/instances/uat_ccPOST /open-apis/approval/v4/tasks/uat_approvalPOST /open-apis/approval/v4/tasks/uat_rejectPOST /open-apis/approval/v4/tasks/uat_transfer官方 skill 文案中提到但当前官方可执行 schema 未开放的能力仍不在本次范围:tasks/rollback(退回)、tasks/add_sign(加签)、tasks/remind(催办)。
代码影响范围:
internal/client/approval.go:新增审批实例详情、实例写、任务写/转交 client 函数 + 对应 Options 结构 + 共享请求 helpercmd/approval_instance.go:新增 approval instance 父命令cmd/approval_instance_{get,create,cancel,cc}.go:4 条实例侧子命令cmd/approval_task_{approve,reject,transfer}.go:3 条任务侧子命令sheet filter-view + sheet dropdown:筛选视图与下拉菜单补齐两块电子表格高级能力:
SpreadsheetSheetFilterView 实现
feishu-cli sheet filter-view create --token <t> --sheet-id <s> --range "<sheetId>!A1:H14" [--name 视图名 --filter-view-id 自定义ID]feishu-cli sheet filter-view list --token <t> --sheet-id <s>feishu-cli sheet filter-view delete --token <t> --sheet-id <s> --filter-view-id <fv>--range 不带 sheetId 前缀时自动补全为 <sheet-id>!<range>feishu-cli sheet dropdown set --token <t> --range "<sheetId>!A1:A100" --options "待办,处理中,已完成" [--multiple --colors "#FF4D4F,#FAAD14,#52C41A"]--options-json '["a, b","c"]':选项内含逗号时绕过 CSV 解析--colors 自动开启 highlightValidData,颜色数量需与选项一致权限:sheets:spreadsheet(User Token 或 App Token 均可),命令默认 resolveOptionalUserTokenWithFallback 自动读取登录态。
代码影响范围:
internal/client/sheets.go:新增 CreateFilterView / ListFilterViews / DeleteFilterView / SetDropdowncmd/sheet_filter_view.go、cmd/sheet_dropdown.go:CLI 入口markdown {create,fetch,overwrite}:Drive 原生 .md 文件 CRUD新增 feishu-cli markdown 顶层命令,把 Drive 上的 .md 当作普通文件整体读写,
保留原始 Markdown 格式(不做 Markdown ↔ 飞书 docx 块的转换)。
与 doc import / doc export 的区别:
| 命令 | 行为 | 创建出的文档类型 |
|---|---|---|
doc import/export |
Markdown ↔ 飞书 docx 块(标题/列表/表格/Callout…) | docx |
markdown create/... |
把 .md 整体上传/下载,不做转换 |
file(普通 Drive 文件) |
适合 AI agent 把生成的 Markdown 直接落盘到飞书 Drive、下次读回时仍是原汁原味 Markdown 源码的场景。
子命令:
markdown create --name xxx.md --content "..." | --content-file path.md | --file path.md [--folder-token fldxxx]
从字符串或本地文件创建 .md;强制 .md 后缀;空内容报错;底层走
client.UploadFileWithToken(≤ 20MB 单次上传,> 20MB 复用现成分片管线)。
markdown fetch --file-token boxcnxxx [--output-path path] [-o json]
缺省 --output-path 时直接打印到 stdout;
指定路径则落盘,目录会拼 fileToken.md,--overwrite 防误覆。
markdown overwrite --file-token boxcnxxx --name existing.md --content "..." | --content-file path.md | --file path.md [--name renamed.md]
覆盖现有 .md 的内容,file_token 保持不变;--content 时 --name 必填,--content-file 缺省使用本地 basename。
实现细节:飞书 Go SDK v3.5.3 的 UploadAllFileReqBody 没有暴露 file_token
字段,因此本命令用 client.Post + *larkcore.Formdata 自己拼 multipart,
endpoint 仍是官方的 POST /open-apis/drive/v1/files/upload_all,
shortcuts/markdown/helpers.go 的写法。
权限:User Access Token + drive:file:upload / drive:file:download
(或 drive:drive)。
feishu-cli mail send --to user@example.com --subject "周报"
--body '<p>看附图</p><img src="./screenshot.png">'
--inline-images-auto-scan --confirm-send
feishu-cli mail template create --name "周报" --subject "本周进度" --body "<p>模板</p>" feishu-cli mail template list
calendar 智能化三件套(suggestion / room-find / rsvp)针对 AI Agent 自动排会场景,补齐三条飞书日历开放能力,使整条「选时段 → 选会议室 → 答复邀请」 流水线全部可在 CLI 完成。
calendar suggestion:智能时段建议。直调 POST /open-apis/calendar/v4/freebusy/suggestion,
按 --attendee-ids ou_xxx,oc_yyy + --duration 30m/1h30m/90 推荐可用时段;支持
--start/--end 搜索窗口(默认当天)、--exclude start~end,... 排除午休/已占用时段、
--event-rrule 周期性规则、--timezone。返回带「推荐理由」+「AI 行动指引」。calendar room-find:会议室查找。直调 POST /open-apis/calendar/v4/freebusy/room_find,
支持多个 --slot start~end 并发查询(worker=10),可按 --city/--building/--floor/
--room-name(逗号分隔多个)/--min-capacity/--max-capacity 多维度过滤;可选
--attendee-ids 让服务端结合参与者位置筛选。calendar rsvp:答复日程邀请。走 SDK Reply 接口,--calendar-id(可省略,默认主日历)+
--event-id + --action accept|decline|tentative。与既有的 calendar event-reply
位置参数风格互为补充——rsvp 全 flag 风格、calendar-id 可省,更适合 AI Agent 调度。SDK 现状:v3.5.3 暴露 Reply 但未暴露 freebusy/suggestion 和 freebusy/room_find,
故 suggestion / room-find 走 client.Post 通用 HTTP 直调 OpenAPI;新增 client 函数集中在
internal/client/calendar_smart.go,包括 SuggestFreebusy、FindMeetingRoom、
FindMeetingRoomBatch(并发+排序)、SplitAttendeeIDs(按 ou_/oc_ 前缀分流)。
权限要求:
calendar:calendar.free_busy:read(User Token 或 App Token 均可)calendar:calendar.event:reply(推荐 User Token,以本人身份答复)典型用法:
# 1. 先让飞书推荐可用时段
feishu-cli calendar suggestion --attendee-ids ou_aaa,ou_bbb --duration 30m
# 2. 锁定时段后查会议室
feishu-cli calendar room-find \
--slot 2024-01-22T09:00:00+08:00~2024-01-22T09:30:00+08:00 \
--building "飞书大厦" --min-capacity 6
# 3. 收到邀请后答复
feishu-cli calendar rsvp --event-id EVENT_xxx --action accept
# 从旧布局开始(已有 config.yaml 和 token.json)
feishu-cli profile migrate # → profiles/default/,指针指 default
feishu-cli profile add personal --use --app-id cli_yyy # 新建 personal 并切过去
feishu-cli profile list # 看哪个 active
feishu-cli profile use - # 切回 default
FEISHU_PROFILE=personal feishu-cli msg send ... # 一次性临时切换
comment reply add:为已有评论添加回复新增命令 feishu-cli comment reply add <file_token> <comment_id> --text "...",补齐评论回复
生命周期的最后一块拼图(此前只有 list / delete)。
背景:飞书 Open SDK v3.5.3 的 fileCommentReply 只暴露 List/Delete/Update,没有
Create 方法,而 Open API 本身是支持的(POST /drive/v1/files/:token/comments/:comment_id/replies)。
此 PR 不依赖 SDK 升级,用通用 HTTP client(client.Post)直接调用 API 实现。
同时改进:
comment reply add / delete / list 全部加上 --user-access-token 参数支持,并走
resolveOptionalUserTokenWithFallback 自动读取登录态,和 msg/chat/doc export 等模块保持一致comment reply delete 在 App Token(Bot 身份)下调用飞书侧会返回 1069303 forbidden——飞书只允许回复作者本人删除。现在命令默认优先使用 User Token(如果已登录),
行为才符合用户预期。命令帮助中也显式说明了这个权限模型comment reply add 默认也走 User Token fallback,回复会以用户身份发布(而非显示为 Bot),
且该回复能被后续 reply delete 正常删除权限要求:docs:document.comment:create(User Token)
使用示例:
feishu-cli auth login # 确保有 User Token
feishu-cli comment reply add <file_token> <comment_id> --text "已处理"
feishu-cli comment reply delete <file_token> <comment_id> <reply_id> # 自动用 User Token
代码影响范围:
internal/client/comment.go:新增 CreateCommentReply(HTTP client 直调),
ListCommentReplies / DeleteCommentReply 签名增加 userAccessToken 参数cmd/comment_reply.go:新增 addReplyCmd,三个子命令统一加 --user-access-token flagcmd/comment.go:Long help 中补充 reply add 示例wiki move-docs 命令(移动云空间文档至知识空间)新增 feishu-cli wiki move-docs <obj_token> --space-id <id> 命令,对应飞书 OpenAPI POST /open-apis/wiki/v2/spaces/{space_id}/nodes/move_docs_to_wiki。
解决的问题:之前要把"我的空间 / 共享空间"里已存在的 docx / sheet / mindnote / bitable / file 挂到知识库下,只有两条路——(1) 飞书客户端手动点"添加到知识库";(2) 走 wiki create 新建空文档再重写内容。前者不能自动化,后者丢原文档权限和历史。新命令一步到位。
用法:
# 把 drive docx 移入知识空间根目录
feishu-cli wiki move-docs doccnXXXXXX --space-id 7012345678901234567
# 移入指定父节点
feishu-cli wiki move-docs doccnXXXXXX --space-id 7012345678901234567 --parent-node wikcnYYYYYY
# 移动电子表格
feishu-cli wiki move-docs shtcnXXXXXX --space-id 7012345678901234567 --obj-type sheet
# 无 move 权限时提交迁入申请
feishu-cli wiki move-docs doccnXXXXXX --space-id 7012345678901234567 --apply
# 用用户身份调用(企业版 wiki 空间不接受 app 成员,必须 user token)
feishu-cli wiki move-docs doccnXXXXXX --space-id 7012345678901234567 --user-access-token u-xxx
返回三种情况:wiki_token(立即完成)/ task_id(异步任务)/ applied=true(权限不足已提交申请)。
Scope 要求:wiki:node:move 或 wiki:wiki,已加入 --domain wiki --recommend 推荐列表。
代码影响范围:
cmd/move_docs_to_wiki.go(命令)和 internal/client/wiki.go 的 MoveDocsToWiki 函数internal/registry/domain_alias.go 的 wiki domain 补上 wiki:node:moveconfig add-scopes 命令feishu-cli config add-scopes 子命令及其 --domain / --scopes / --print-only flag 全部删除。
删除理由:
scopeDomains 字典里多数 scope 名已过时(docx:document / sheets:spreadsheet / bitable:app / im:chat:readonly / drive:export:readonly / vc:room:readonly 等都是飞书不支持的粗粒度名称),生成的申请链接里多数 scope 会被后台拒绝迁移指引:
旧:
feishu-cli config add-scopes --domain all
新:
代码影响范围:
cmd/config_add_scopes.go 整个文件cmd/auth_check.go 的 suggestion 文案改为引导用户去开放平台开通(不再推荐 config add-scopes)config add-scopes 引用全部更新为"去开放平台开通"config create-app --save(Device Flow 创建应用)不变base/v3 API旧实现:bitable 模块全部调用 /open-apis/bitable/v1/apps/{app_token}/... 老 API,覆盖 ~30 个基础 CRUD 命令。
新实现:全面切换到 /open-apis/base/v3/bases/{base_token}/... 新 API,覆盖 48 个命令,支持深度能力(视图完整配置读写、记录 upsert、修改历史、角色 CRUD、高级权限、数据聚合、工作流查询)。
| 旧命令 | 新命令 |
|---|---|
bitable tables <app> |
bitable table list --base-token <t> |
bitable create-table <app> |
bitable table create --base-token <t> --name x |
bitable rename-table <app> <tbl> |
bitable table update --base-token <t> --table-id <tbl> --name x |
bitable delete-table <app> <tbl> |
bitable table delete --base-token <t> --table-id <tbl> |
bitable fields <app> <tbl> |
bitable field list --base-token <t> --table-id <tbl> |
bitable create-field |
bitable field create |
bitable update-field |
bitable field update(method 改为 PUT) |
bitable delete-field |
bitable field delete |
bitable records <app> <tbl> |
bitable record list --base-token <t> --table-id <tbl> |
bitable get-record |
bitable record get |
bitable add-record |
bitable record upsert --base-token <t> --table-id <tbl> --config '...' |
bitable add-records --data-file |
bitable record batch-create --config-file ... |
bitable update-record |
bitable record upsert --record-id ...(根据是否传 id 自动 PATCH/POST) |
bitable delete-records |
bitable record delete --record-id ... |
bitable views |
bitable view list |
bitable create-view |
bitable view create |
bitable delete-view |
bitable view delete |
bitable view-filter get/set |
bitable view view-filter-get / view-filter-set |
bitable dashboard list(v1) |
暂不支持(v3 dashboard CRUD 留待下次迭代) |
bitable form list |
暂不支持 |
bitable role list |
bitable role list(新增 get/create/update/delete) |
bitable workflow list/enable |
bitable workflow list(改为 POST /workflows/list) |
bitable advperm enable/disable |
同名但底层改为 PUT .../advperm/enable?enable=true/false |
bitable data-query |
同名但路径从 table 级改为 base 级:POST .../bases/{t}/data/query |
view-sort-set / view-group-set / view-visible-fields-set / view-timebar-set / view-card-set(老 v1 只能写 filter)bitable record history-list --record-id xxxbitable role create/update/delete(老 v1 只有 list)bitable field search-options--time-zone Asia/Shanghai--app-token 别名:只保留 --base-token(与 base/v3 API 命名一致,不再做兼容别名)bitable create 的 --description 被删除(base/v3 不支持),新增 --time-zonebitable data-query 的 --table-id 被删除(v3 端点挂在 base 下)internal/client/bitable.go / bitable_test.go(v1 实现)cmd/bitable_create.go / bitable_get.go / bitable_copy.go / bitable_advperm.go / bitable_dashboard.go / bitable_data_query.go / bitable_form.go / bitable_record_upload_attachment.go / bitable_role.go / bitable_view_config.go / bitable_workflow.gointernal/client/base.go(BaseV3Call + BaseV3Path helper + X-App-Id header 自动注入)cmd/bitable_base.go / bitable_misc.go(所有 base/v3 命令的注册)cmd/bitable_table.go / bitable_field.go / bitable_record.go / bitable_view.go 全部重写vc search:底层 API 从 GET /meeting_list 切换到 POST /meetings/search。
--query / --organizer-ids / --participant-ids / --room-ids--meeting-no / --meeting-statusvc notes:
--meeting-id / --minute-token(单数)改为 --meeting-ids / --minute-tokens(复数,支持 CSV 批量最多 50)--calendar-event-ids:从日历事件自动反查会议 / 妙记--with-artifacts(获取 AI 产物)/ --download-transcript --output-dir(下载逐字稿)feishu-cli auth loginvc recording --meeting-ids/-calendar-event-ids:查询会议录制并自动提取 minute_tokenminutes download --minute-tokens x,y,z --output ./dir:批量下载妙记音视频媒体(SSRF 防护 / 重定向校验 / Content-Disposition 解析 / 文件名去重 / 5 req/s 速率限制 / --url-only 预览链接)minutes get <token> --with-artifacts:新增 AI 产物合并输出drive 云盘命令组(8 个命令)新增独立的 drive 子命令组,与现有 file / media / doc media-* 命令并存,提供增强能力:
| 命令 | 相比老命令的增强 |
|---|---|
drive upload |
大文件自动分块(>20MB 走 upload_prepare/part/finish 三步式,每片独立重试 3 次;支持 User Token) |
drive download |
流式下载 + 路径校验 + --overwrite / --timeout |
drive export |
新增 markdown 快捷路径:docx → markdown 走 /docs/v1/content 直接拉取,不跑异步 export task;支持 sheet / bitable 按 --sub-id 导出 CSV;有界轮询(10×5s)+ 超时返回 resume 命令 |
drive export-download |
通过 file_token 直接下载已完成的导出任务产物,配合 drive export 超时后接力完成 |
drive import |
切换到 /medias/upload_* 端点 + parent_type=ccm_import_open + extra 字段(不再在用户云盘留下中间文件);格式特定大小限制(docx 20MB / sheet 20MB / bitable 100MB);有界轮询 + resume |
drive move |
文件夹移动自动轮询 task_check(30×2s),文件移动同步返回 |
drive add-comment |
支持富文本 reply_elements(text / mention_user / link)+ --block-id 局部评论(docx)+ wiki URL 自动解析成 docx token |
drive task-result |
通用异步任务查询(--scenario import/export/task_check),配合 drive export / import / move 的超时 resume |
保留不动:file list / delete / mkdir / copy / shortcut / quota / meta / stats / version + media upload / download + doc media-download / media-insert + comment list / resolve / delete / reply
mail 飞书邮箱模块(10 个命令,从零新建)全新命令组。首期不支持附件和 CID 内联图片,仅支持纯文本和 HTML body。所有命令默认 User Access Token。
| 命令 | 功能 |
|---|---|
mail message --message-id x |
获取单封邮件(--format full/plain_text_full/raw) |
mail messages --message-ids a,b,c |
批量获取多封邮件 |
mail thread --thread-id x |
获取邮件线程 |
mail triage |
列出 / 搜索邮件(--folder INBOX --label x --query xxx --unread-only --list-folders --list-labels),--query 走专用 POST /search 端点 |
mail send |
发送邮件(默认保存为草稿,加 --confirm-send 立即发送,安全兜底) |
mail draft-create |
仅创建草稿 |
mail draft-edit --draft-id x |
编辑已有草稿(全量覆盖) |
mail reply --message-id x --body "..." |
回复邮件(自动 Re: 前缀 + 引用块 + In-Reply-To / References header 继承) |
mail reply-all |
全部回复(包含 To 和 CC,自动排除自己) |
mail forward --message-id x --to y |
转发(自动 Fwd: 前缀 + 原文正文引用) |
关键技术点:
POST /drafts body {"raw":"..."}<html>/<div>/<b>/<br> 等标签),可用 --plain-text / --html 强制/user_mailboxes/{mailbox}/profile 读取"Name <email>" 和 "email"reply 自动避免 Re: Re:,forward 自动避免 Fwd: Fwd:mail reply 引用块缺日期占位符:之前的 quote header 模板第一个 %s 传空字符串,会输出 "在 ,xxx 写道:",已修正为 "{email} 写道:"uploadFileMultipart 之前每片每次重试都 os.Open + Seek,现改为外层打开一次 + io.NewSectionReader,大文件不稳定网络下重试时节省 N×syscallmail reply 重复 GetMailboxProfile 调用:之前在 runMailReply 里调用 2 次(一次取 selfEmail 一次取 from/fromName),现合并为 1 次,省 1 个 API RTTdrive import 上传端点错误:之前走 /files/upload_all 会在用户云盘留下中间文件,现改为官方的 /medias/upload_all + parent_type=ccm_import_open + extramail triage --query 静默失效:之前把 query 当 list 端点的查询参数,飞书会忽略;现改走专用的 POST /search 端点requireUserToken(cmd, cmdName) helper,统一所有新命令的 "需要 User Access Token" 错误信息格式GetWikiNodeByToken(58 行),改用已有的 GetWikiNodeinternal/client/mail.go 的 joinPath,用 strings.JoindedupStrings 从 vc_recording.go 移到 vc_common.gorunBaseV3WithJSON 重构,抽出 runBaseV3WithBody 让命令层直接传已构造的 bodybitable view create/rename 去掉 cmd.Flags().Set("config", ...) + MarkHidden 的 hack 模式runBaseV3Simple / addBaseTokenFlag / exactlyOneNonEmpty 三处死参数/死变量gofmtNothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
彻底删除 Authorization Code Flow,只保留 Device Flow(RFC 8628)。本地桌面、SSH 远程、容器、CI 全环境统一使用同一条命令,无需任何重定向 URL 白名单配置。
彻底删除 Authorization Code Flow,只保留 Device Flow(RFC 8628)。本地桌面、SSH 远程、容器、CI 全环境统一使用同一条命令,无需任何重定向 URL 白名单配置。
auth login 命令删除以下 flag:
--manual — SSH 远程手动粘贴回调模式(Device Flow 下 SSH 和本地一视同仁)--no-manual — 强制本地回调模式(本地回调 HTTP server 已移除)--port — 本地回调端口(不再需要)--print-url — 非交互两步式第一步(改用 --no-wait + --device-code)--method — 授权方式选择(Device Flow 是唯一方式)--scopes — 请求 OAuth scope(飞书 token v2 端点实际忽略此参数,返回应用预配置的全部 scope)auth callback <url> --state <state> — Authorization Code Flow 换 token 专用,整体删除internal/auth/oauth.go:Login / loginLocal / loginManual / buildAuthURL / GenerateAuthURL / ParseCallbackURL / ExchangeToken 等函数internal/auth/browser.go:isLocalEnvironment() 函数(曾在 macOS 上无条件返回 true 导致 SSH 远程 Darwin bug)cmd/auth_callback.go:整个文件http://127.0.0.1:9768/callback 白名单,Device Flow 直接绕过此要求isLocalEnvironment() 在 macOS 上无条件返回 true,SSH 到 Mac 服务器时错误走本地回调模式会 2 分钟超时失败。已通过删除该函数消除auth login 的 JSON 事件流模式auth login --json:阻塞轮询 + JSON 事件流输出到 stdout。AI Agent 推荐配合 Claude Code 的 run_in_background=true 使用
{"event":"device_authorization","verification_uri":"...","verification_uri_complete":"...","user_code":"...","device_code":"...","expires_in":240,"interval":5}{"event":"authorization_success","expires_at":"...","refresh_expires_at":"...","scope":"..."}auth login --no-wait --json:两步模式第一步。只请求 device_code 并立即输出 JSON,不启动轮询。适合 AI Agent 希望把"请求"和"轮询"拆到两次独立 Bash 调用的场景
auth login --device-code <code> --json:两步模式第二步。用已有的 device_code 继续轮询直到授权完成
auth check 子命令预检当前 Token 是否包含指定 scope,专为 AI Agent 在执行业务命令前做前置判断而设计:
feishu-cli auth check --scope "search:docs:read"
feishu-cli auth check --scope "search:docs:read im:message:readonly"
输出 JSON:
{
"ok": true,
"granted": ["search:docs:read"],
"missing": null
}
或失败情况:
{
"ok": false,
"error": "not_logged_in",
"missing": ["search:docs:read"],
"suggestion": "feishu-cli auth login"
}
退出码 0 = 满足,非 0 = 缺少或未登录,AI Agent 可直接分支。
~/.feishu-cli/token.json 仍是明文 JSON,数据结构完全兼容。升级后不需要重新登录ResolveUserAccessToken() 路径和 RefreshAccessToken() 逻辑保持不动,access_token 过期时用 refresh_token 自动刷新config create-app 命令完全不变(它本来就用 Device Flow)auth status / auth logout 行为不变无需任何迁移。一条命令通吃所有场景:
feishu-cli auth login
本地桌面会自动开浏览器,SSH 远程需要手动复制 stderr 里的链接在本机浏览器打开,一模一样的命令。
旧的两步式:
feishu-cli auth login --print-url --scopes "..."
feishu-cli auth callback "<回调URL>" --state "<state>"
迁移为以下任一方案:
方案 A(推荐):阻塞 + 后台运行:
# run_in_background=true
feishu-cli auth login --json
# 读 stdout 第一行拿 verification_uri_complete,展示给用户
# 等后台进程退出,读第二行 stdout 拿 authorization_success
方案 B:两步模式:
# 第一步
feishu-cli auth login --no-wait --json # → device_code JSON
# 把链接展示给用户等待授权
# 第二步
feishu-cli auth login --device-code <code> --json # → authorization_success
Authorization Code Flow 本来就无法无头完成(需要浏览器授权),Device Flow 同样需要人类介入一次。如果 CI 需要 User Token,应该预先在本地通过 auth login 拿到 token.json 然后把它作为 secret 部署到 CI 环境,不需要任何迁移。
| 方面 | v1.17.0 及以前 | v1.18.0 |
|---|---|---|
| OAuth Flow | Authorization Code Flow(默认)+ Device Flow(--method device) |
仅 Device Flow |
| 子命令 | login / callback / status / logout |
login / check / status / logout |
auth login 的 flag |
--port / --manual / --no-manual / --print-url / --scopes / --method |
--json / --no-wait / --device-code |
| 重定向 URL 白名单 | 必须(Authorization Code Flow 前置条件) | 不需要 |
| SSH 远程支持 | 要么手动粘贴(--manual)要么非交互两步(--print-url) |
一条命令通吃 |
| AI Agent 非交互方案 | --print-url + auth callback |
--json + run_in_background 或 --no-wait / --device-code |
offline_access 注入 |
用户手动通过 --scopes 传 |
CLI 强制注入,用户无需操心 |
| scope 预检 | 手动解析 auth status JSON 的 scope 字段 |
auth check --scope "..." |
更早的版本请参考 GitHub Releases。
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →