Skip to content

Commit 051dcaa

Browse files
riba2534claude
andcommitted
feat: add OAuth auth, search, board skills and enhance user token support
- Add non-interactive OAuth login (--print-url + auth callback) for AI agents - Add auth status with JSON output support - Add document/message/app search with User Access Token pre-check flow - Add board create-notes commands to README/CLAUDE.md documentation - Unify User Access Token resolution across search/calendar/task/msg commands - Add 3 new skills: feishu-cli-auth, feishu-cli-search, feishu-cli-board - Update existing skills for image upload pipeline and TextDrawing export - Fix callout import to reuse API-generated empty child block - Update permission scope mappings for accuracy Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 6b68427 commit 051dcaa

27 files changed

Lines changed: 1406 additions & 200 deletions

File tree

CLAUDE.md

Lines changed: 35 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -117,16 +117,19 @@ app_secret: "xxx"
117117

118118
**前置条件**:在飞书开放平台 → 应用详情 → 安全设置 → 重定向 URL 中添加 `http://127.0.0.1:9768/callback`
119119

120-
**两种模式**
120+
**三种模式**
121121
- 本地桌面环境(默认):自动启动本地 HTTP 服务器,打开浏览器完成授权回调
122122
- 远程 SSH 环境(`--manual` 或自动检测):打印授权 URL,用户在本机浏览器打开后粘贴回调 URL
123+
- **非交互模式(AI Agent 推荐)**`auth login --print-url` 输出 JSON → 用户浏览器授权 → `auth callback "<回调URL>" --state "<state>"` 完成换 token,全程无 stdin 阻塞
124+
125+
**重要**:登录时需包含 `offline_access` scope 才会返回 Refresh Token(有效期 30 天),否则仅有 Access Token(2 小时)
123126

124127
### Markdown ↔ 飞书文档双向转换
125128

126129
**导入**`feishu-cli doc import doc.md --title "文档" --verbose`
127130
**导出**`feishu-cli doc export <doc_id> -o output.md`
128131

129-
支持的语法:标题、段落、列表(无限深度嵌套)、任务列表、代码块、引用(QuoteContainer)、Callout(6 种类型)、表格、分割线、图片(占位块,Open API 暂不支持插入实际图片)、链接、公式(块级/行内)、粗体/斜体/删除线/下划线/行内代码/高亮
132+
支持的语法:标题、段落、列表(无限深度嵌套)、任务列表、代码块、引用(QuoteContainer)、Callout(6 种类型)、表格、分割线、图片(默认通过 `--upload-images` 上传本地和网络图片)、链接、公式(块级/行内)、粗体/斜体/删除线/下划线/行内代码/高亮
130133

131134
### Mermaid / PlantUML 图表转画板
132135

@@ -166,7 +169,7 @@ PlantUML 支持:时序图、活动图、类图、用例图、组件图、ER
166169
2. **阶段二(并发)**:图表 worker 池 + 表格 worker 池并发处理
167170
3. **阶段三(逆序)**:处理失败图表,降级为代码块
168171

169-
CLI flags:`--diagram-workers`(默认 5)、`--table-workers`(默认 3)、`--diagram-retries`(默认 10)
172+
CLI flags:`--diagram-workers`(默认 5)、`--table-workers`(默认 3)、`--diagram-retries`(默认 10)`--upload-images`(默认开启)、`--image-workers`(默认 2,API 限制 5 QPS)
170173

171174
## 常用命令
172175

@@ -175,16 +178,19 @@ CLI flags:`--diagram-workers`(默认 5)、`--table-workers`(默认 3)
175178
feishu-cli auth login # OAuth 登录(自动打开浏览器)
176179
feishu-cli auth login --manual # 手动模式(SSH 远程环境)
177180
feishu-cli auth login --port 8080 # 指定回调端口
178-
feishu-cli auth login --scopes "search:docs:read" # 指定 OAuth scope
181+
feishu-cli auth login --scopes "search:docs:read search:message offline_access" # 指定 OAuth scope(建议带 offline_access)
182+
feishu-cli auth login --print-url # 非交互模式步骤 1:输出授权 URL 和 state(AI Agent 推荐)
183+
feishu-cli auth callback "<回调URL>" --state "<state>" # 非交互模式步骤 2:用回调 URL 换 token
179184
feishu-cli auth status # 查看授权状态
185+
feishu-cli auth status -o json # JSON 格式输出授权状态
180186
feishu-cli auth logout # 退出登录
181187

182188
# === 文档操作 ===
183189
feishu-cli doc create --title "测试"
184190
feishu-cli doc get <doc_id>
185191
feishu-cli doc blocks <doc_id> --all
186192
feishu-cli doc export <doc_id> -o output.md
187-
feishu-cli doc import input.md --title "文档" --diagram-workers 5 --table-workers 3 --verbose
193+
feishu-cli doc import input.md --title "文档" --upload-images --diagram-workers 5 --table-workers 3 --verbose
188194
feishu-cli doc add <doc_id> -c '<JSON>' # JSON 格式添加块
189195
feishu-cli doc add <doc_id> README.md --content-type markdown # Markdown 格式
190196
feishu-cli doc add-callout <doc_id> "内容" --callout-type info
@@ -290,7 +296,10 @@ feishu-cli user search --email user@example.com
290296
feishu-cli user list --department-id DEPT_ID
291297
feishu-cli dept get <department_id>
292298
feishu-cli dept children <department_id>
293-
feishu-cli board image <whiteboard_id> output.png
299+
feishu-cli board create-notes <whiteboard_id> nodes.json -o json # 精排绘图(JSON 控制坐标/颜色/连线)
300+
feishu-cli board import <whiteboard_id> --source-type content -c "graph TD; A-->B" --syntax mermaid
301+
feishu-cli board nodes <whiteboard_id> # 获取画板所有节点
302+
feishu-cli board image <whiteboard_id> output.png # 下载画板截图
294303
feishu-cli media upload image.png --parent-type docx_image --parent-node <doc_id>
295304
feishu-cli comment list <file_token> --type docx
296305
feishu-cli comment resolve <file_token> <comment_id> --type docx
@@ -385,12 +394,12 @@ feishu-cli search docs "产品需求" --user-access-token <token>
385394
| Mermaid 复杂度 | 10+ participant + 2+ alt + 30+ 长标签 | 重试后降级为代码块 |
386395
| sheet filter | 需要完整 col+condition 参数 | API 限制 |
387396
| sheet protect | V2 API 返回 "invalid operation" | 待修复 |
388-
| 图片插入 | DocX Open API 不支持通过 API 插入图片 | 创建空 Image 占位块,导入报告显示跳过数 |
397+
| 图片插入 | 通过素材上传 API + Image 块引用实现 | 默认 `--upload-images` 上传,失败时创建占位块 |
389398
| shell 转义 | zsh 中 `!` 被转义为 `\!` | 已在代码中处理 |
390399

391400
## Claude Code 技能
392401

393-
本项目提供以下 Claude Code 技能,位于 `skills/` 目录(8 个技能):
402+
本项目提供以下 Claude Code 技能,位于 `skills/` 目录(11 个技能):
394403

395404
| 技能 | 说明 | 用法 |
396405
|------|------|------|
@@ -400,7 +409,10 @@ feishu-cli search docs "产品需求" --user-access-token <token>
400409
| `/feishu-cli-export` | 导出为 Markdown/PDF/Word,或从 DOCX 导入 | `/feishu-cli-export <doc_id> [path]` |
401410
| `/feishu-cli-perm` | 权限管理 | `/feishu-cli-perm <doc_token>` |
402411
| `/feishu-cli-msg` | 消息全功能管理(发送/回复/转发/Reaction/Pin) | `/feishu-cli-msg <receive_id>` |
403-
| `/feishu-cli-toolkit` | 综合工具箱(表格/日历/任务/群聊/画板/文件/素材/评论/知识库/搜索/通讯录/**附件下载**| `/feishu-cli-toolkit` |
412+
| `/feishu-cli-toolkit` | 综合工具箱(表格/日历/任务/群聊/文件/素材/评论/知识库/搜索/通讯录/**附件下载**| `/feishu-cli-toolkit` |
413+
| `/feishu-cli-board` | 画板操作(精排绘图/Mermaid 导入/截图/节点管理) | `/feishu-cli-board` |
414+
| `/feishu-cli-auth` | OAuth 认证、Token 管理、scope 配置、搜索权限排错 | `/feishu-cli-auth` |
415+
| `/feishu-cli-search` | 搜索飞书文档/消息/应用(含 Token 前置检查流程) | `/feishu-cli-search` |
404416
| `feishu-cli-doc-guide` | 飞书文档创建规范(内部参考,不可直接调用) ||
405417

406418
### 支持的 URL 格式
@@ -416,22 +428,22 @@ feishu-cli search docs "产品需求" --user-access-token <token>
416428
|---------|---------|------|
417429
| 文档操作 | `docx:document` | 文档读写 |
418430
| 知识库 | `wiki:wiki:readonly` | 知识库读取 |
419-
| 知识库成员 | `wiki:wiki` | 空间成员管理 |
431+
| 知识库成员 | `wiki:member` | 空间成员管理 |
420432
| 云空间文件 | `drive:drive`, `drive:drive:readonly` | 文件管理 |
421-
| 素材管理 | `drive:drive` | 上传下载 |
422-
| 评论 | `drive:drive.comment:write` | 评论读写 |
423-
| 权限管理 | `drive:permission:member:create` | 添加协作者 |
433+
| 素材管理 | `subscriptions:image` | 上传下载,需单独申请 |
434+
| 评论 | `docs:document.comment` | 评论读写 |
435+
| 权限管理 | `docs:permission.member:create` | 添加协作者 |
424436
| 消息 | `im:message`, `im:message:send_as_bot` | 发送消息 |
425-
| 消息增强 | `im:message`, `im:message:send_as_bot` | Pin/Reaction/转发 |
426-
| 群聊搜索 | `im:chat:readonly` | 搜索群聊 |
427-
| 群聊管理 | `im:chat`, `im:chat:readonly` | 群聊 CRUD |
428-
| 群成员管理 | `im:chat:member` | 群成员操作 |
437+
| 消息增强 | `im:message.pins`, `im:message.reactions` | Pin/Reaction/转发 |
438+
| 群聊管理 | `im:chat` | 群聊 CRUD |
439+
| 群成员管理 | `im:chat.members` | 群成员操作 |
429440
| 会话历史 | `im:message:readonly` | 获取历史消息 |
430-
| 用户信息 | `contact:user.base:readonly` | 获取用户信息 |
431-
| 通讯录 | `contact:user.base:readonly`, `contact:department.base:readonly` | 用户搜索/部门查询 |
432-
| 画板操作 | `board:board` | 画板读写 |
441+
| 用户信息 | `contact:user.base:readonly` | 获取用户信息,需单独申请 |
442+
| 通讯录 | `contact:contact.base:readonly` | 需单独申请 |
443+
| 部分搜索 | `directory:department:search` | 需单独申请 |
444+
| 画板操作 | `board:whiteboard` | 画板读写 |
433445
| 电子表格 | `sheets:spreadsheet` | 电子表格读写 |
434-
| 日历 | `calendar:calendar:readonly`, `calendar:calendar` | 需单独申请 |
446+
| 日历 | `calendar:calendar` | 需单独申请 |
435447
| 任务 | `task:task:read`, `task:task:write` | 需单独申请 |
436448
| 任务列表 | `task:tasklist:read`, `task:tasklist:write` | 任务列表管理 |
437449
| 搜索消息/应用 | 需要 User Access Token | 通过 `auth login` 或手动获取 |
@@ -561,7 +573,7 @@ feishu-cli perm add <DOC_ID> --doc-type docx --member-type email --member-id use
561573
- Mermaid 图表:禁止花括号 `{}`(flowchart 标签)、禁止 `par...and...end`、方括号冒号加双引号、sequenceDiagram 参与者 ≤ 8
562574
- PlantUML 图表:无行首缩进、无 `skinparam`、类图无可见性标记(`+ - # ~`
563575
- 表格:超过 9 行会自动拆分,无需手动处理
564-
- 图片:Open API 不支持插入,仅创建占位块
576+
- 图片:默认通过 `--upload-images` 上传本地和网络图片,关闭时创建占位块
565577
- 公式:行内 `$...$`、块级 `$$...$$`(块级降级为行内)
566578
- Callout:仅 6 种类型(NOTE/WARNING/TIP/CAUTION/IMPORTANT/SUCCESS)
567579

@@ -595,4 +607,5 @@ feishu-cli perm add <DOC_ID> --doc-type docx --member-type email --member-id use
595607
✅ Mermaid 图表导入(8 种类型全部验证,88 个图表 93.2% 成功率)
596608
✅ PlantUML 图表导入(时序图、活动图已验证)
597609
✅ 大规模导入:10,000+ 行 / 127 个图表 / 170+ 个表格
610+
✅ doc import --upload-images(本地图片 + HTTP 图片上传)
598611
```

README.md

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525

2626
feishu-cli 是一个功能完整的飞书开放平台命令行工具。它将飞书文档、知识库、电子表格、消息、日历、任务等操作封装为简洁的命令行接口,**核心能力是 Markdown ↔ 飞书文档双向无损转换**
2727

28-
除了传统的 CLI 用法,feishu-cli 还为 [Claude Code](https://claude.ai/claude-code) 等 AI 编程助手提供了 **8 个开箱即用的技能文件**,让 AI Agent 能够直接创建文档、发送消息、管理权限 — 无需任何额外配置。
28+
除了传统的 CLI 用法,feishu-cli 还为 [Claude Code](https://claude.ai/claude-code) 等 AI 编程助手提供了 **11 个开箱即用的技能文件**,让 AI Agent 能够直接创建文档、发送消息、管理权限 — 无需任何额外配置。
2929

3030
### 为什么选择 feishu-cli
3131

3232
- **双向转换零损耗** — 支持 40+ 种块类型,Markdown 导入飞书后再导出,内容完整保留
3333
- **图表原生渲染** — Mermaid(8 种图表类型)和 PlantUML 自动转换为飞书画板,不是截图,是可编辑的矢量图
3434
- **大规模文档处理** — 三阶段并发管道架构,实测 10,000+ 行 / 127 个图表 / 170+ 个表格一次导入
35-
- **AI Agent 原生**8 个技能文件覆盖飞书全功能,AI 助手即装即用
35+
- **AI Agent 原生**11 个技能文件覆盖飞书全功能,AI 助手即装即用
3636
- **一个工具覆盖全平台** — 文档、知识库、表格、消息、日历、任务、权限、画板、评论、搜索
3737

3838
## 核心能力
@@ -95,7 +95,7 @@ PlantUML 同样支持:时序图、活动图、类图、用例图、组件图
9595

9696
```bash
9797
feishu-cli doc import large-doc.md --title "大文档" \
98-
--diagram-workers 5 --table-workers 3 --diagram-retries 10 --verbose
98+
--upload-images --diagram-workers 5 --table-workers 3 --image-workers 2 --verbose
9999
```
100100

101101
### 全功能 API 覆盖
@@ -112,7 +112,7 @@ feishu-cli doc import large-doc.md --title "大文档" \
112112
| **权限** | 添加 / 更新 / 删除协作者、批量添加、公开权限管理、分享密码、权限检查、转移所有权 |
113113
| **文件** | 云空间文件列表、创建、移动、复制、删除、上传、下载、版本管理、元数据、统计 |
114114
| **素材** | 上传 / 下载(图片、文件、音视频) |
115-
| **画板** | 下载图片、导入 Mermaid / PlantUML |
115+
| **画板** | 精排绘图(create-notes)、Mermaid / PlantUML 导入、截图下载、节点管理 |
116116
| **评论** | 列出、添加、解决/恢复评论、回复管理 |
117117
| **搜索** | 消息搜索、应用搜索、文档搜索(需 User Access Token) |
118118
| **用户** | 获取用户信息、用户搜索、部门用户列表 |
@@ -234,8 +234,8 @@ Commands:
234234
# 创建文档
235235
feishu-cli doc create --title "新文档"
236236

237-
# 导入 Markdown(核心功能)
238-
feishu-cli doc import doc.md --title "文档标题" --verbose
237+
# 导入 Markdown(核心功能,默认上传图片
238+
feishu-cli doc import doc.md --title "文档标题" --upload-images --verbose
239239

240240
# 导出为 Markdown
241241
feishu-cli doc export <doc_id> -o output.md --download-images
@@ -472,11 +472,16 @@ feishu-cli auth login --manual
472472
# 指定端口(默认 9768)
473473
feishu-cli auth login --port 8080
474474

475-
# 指定 OAuth scope
475+
# 指定 OAuth scope(建议加 offline_access 以获取 Refresh Token)
476476
feishu-cli auth login --scopes "search:docs:read search:message offline_access"
477477

478+
# 非交互模式(AI Agent 推荐,不阻塞 stdin)
479+
feishu-cli auth login --print-url # 步骤 1:输出授权 URL 和 state
480+
feishu-cli auth callback "<回调URL>" --state "<state>" # 步骤 2:用回调 URL 换 token
481+
478482
# 查看当前授权状态
479483
feishu-cli auth status
484+
feishu-cli auth status -o json # JSON 格式输出
480485

481486
# 退出登录(清除本地 token)
482487
feishu-cli auth logout
@@ -485,6 +490,7 @@ feishu-cli auth logout
485490
**Token 管理**
486491
- Token 保存在 `~/.feishu-cli/token.json`,Access Token 有效期约 2 小时
487492
- Access Token 过期时自动使用 Refresh Token 刷新(Refresh Token 有效期 30 天)
493+
- **重要**:登录时需包含 `offline_access` scope 才会返回 Refresh Token,否则 2 小时后需重新登录
488494
- Token 优先级:`--user-access-token` 参数 > `FEISHU_USER_ACCESS_TOKEN` 环境变量 > `token.json` > `config.yaml`
489495

490496
</details>
@@ -528,7 +534,11 @@ feishu-cli tasklist get <tasklist_guid>
528534
feishu-cli tasklist delete <tasklist_guid>
529535

530536
# 画板
531-
feishu-cli board image <whiteboard_id> output.png
537+
feishu-cli board create-notes <whiteboard_id> nodes.json -o json # 精排绘图(JSON 控制坐标、颜色、连线)
538+
feishu-cli board import <whiteboard_id> --source-type content -c "graph TD; A-->B" --syntax mermaid # 导入 Mermaid
539+
feishu-cli board import <whiteboard_id> diagram.puml --syntax plantuml # 导入 PlantUML
540+
feishu-cli board nodes <whiteboard_id> # 获取画板所有节点
541+
feishu-cli board image <whiteboard_id> output.png # 下载画板截图
532542

533543
# 评论
534544
feishu-cli comment list <file_token> --type docx
@@ -553,7 +563,7 @@ feishu-cli dept children <department_id>
553563

554564
## AI 技能集成
555565

556-
`skills/` 目录包含 **8**[Claude Code](https://claude.ai/claude-code) 设计的技能文件,让 AI Agent 能够直接操作飞书 — 创建文档、发送消息、管理权限,全部通过自然语言驱动。
566+
`skills/` 目录包含 **11**[Claude Code](https://claude.ai/claude-code) 设计的技能文件,让 AI Agent 能够直接操作飞书 — 创建文档、发送消息、管理权限,全部通过自然语言驱动。
557567

558568
| 技能 | 功能 | 触发示例 |
559569
|------|------|---------|
@@ -563,7 +573,10 @@ feishu-cli dept children <department_id>
563573
| `feishu-cli-export` | 导出为 Markdown / PDF / Word | "把飞书文档导出来" |
564574
| `feishu-cli-perm` | 权限管理 | "给文档添加权限" |
565575
| `feishu-cli-msg` | 消息全功能管理 | "发消息给 xxx" |
566-
| `feishu-cli-toolkit` | 综合工具箱(表格/日历/任务/群聊/画板/文件/评论/知识库/搜索/通讯录) | "读取飞书表格数据" |
576+
| `feishu-cli-toolkit` | 综合工具箱(表格/日历/任务/群聊/文件/评论/知识库/通讯录) | "读取飞书表格数据" |
577+
| `feishu-cli-board` | 画板操作(精排绘图/Mermaid 导入/截图/节点管理) | "画个架构图"、"在飞书里画图" |
578+
| `feishu-cli-auth` | OAuth 认证、Token 管理、scope 配置 | "登录飞书"、"获取 Token" |
579+
| `feishu-cli-search` | 搜索飞书文档 / 消息 / 应用 | "搜索飞书文档" |
567580
| `feishu-cli-doc-guide` | 飞书文档创建规范 | 其他技能内部引用 |
568581

569582
**使用方法**:将 `skills/` 目录复制到你的 Claude Code 项目中(或放在 `~/.claude/skills/`),AI 助手即可通过自然语言操作飞书。

cmd/add_callout.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
larkdocx "github.com/larksuite/oapi-sdk-go/v3/service/docx/v1"
77
"github.com/riba2534/feishu-cli/internal/client"
88
"github.com/riba2534/feishu-cli/internal/config"
9+
"github.com/riba2534/feishu-cli/internal/converter"
910
"github.com/spf13/cobra"
1011
)
1112

@@ -129,7 +130,7 @@ var addCalloutCmd = &cobra.Command{
129130
}
130131
} else {
131132
// 兜底:如果没有自动生成子块,手动创建
132-
textBlockType := 2 // Text
133+
textBlockType := int(converter.BlockTypeText)
133134
textBlock := &larkdocx.Block{
134135
BlockType: &textBlockType,
135136
Text: &larkdocx.Text{

0 commit comments

Comments
 (0)