feishu-docs-cli 0.1.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +403 -0
- package/README.zh.md +402 -0
- package/bin/feishu-docs.js +8 -0
- package/dist/auth.d.ts +76 -0
- package/dist/auth.js +512 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +197 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +28 -0
- package/dist/client.js +256 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/authorize.d.ts +12 -0
- package/dist/commands/authorize.js +73 -0
- package/dist/commands/authorize.js.map +1 -0
- package/dist/commands/cat.d.ts +6 -0
- package/dist/commands/cat.js +159 -0
- package/dist/commands/cat.js.map +1 -0
- package/dist/commands/cp.d.ts +9 -0
- package/dist/commands/cp.js +70 -0
- package/dist/commands/cp.js.map +1 -0
- package/dist/commands/create.d.ts +6 -0
- package/dist/commands/create.js +120 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +6 -0
- package/dist/commands/delete.js +91 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/info.d.ts +6 -0
- package/dist/commands/info.js +69 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/install-skill.d.ts +5 -0
- package/dist/commands/install-skill.js +28 -0
- package/dist/commands/install-skill.js.map +1 -0
- package/dist/commands/login.d.ts +10 -0
- package/dist/commands/login.js +93 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/ls.d.ts +6 -0
- package/dist/commands/ls.js +79 -0
- package/dist/commands/ls.js.map +1 -0
- package/dist/commands/mkdir.d.ts +6 -0
- package/dist/commands/mkdir.js +49 -0
- package/dist/commands/mkdir.js.map +1 -0
- package/dist/commands/mv.d.ts +9 -0
- package/dist/commands/mv.js +72 -0
- package/dist/commands/mv.js.map +1 -0
- package/dist/commands/read.d.ts +6 -0
- package/dist/commands/read.js +439 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/search.d.ts +7 -0
- package/dist/commands/search.js +92 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/share.d.ts +13 -0
- package/dist/commands/share.js +266 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/spaces.d.ts +6 -0
- package/dist/commands/spaces.js +43 -0
- package/dist/commands/spaces.js.map +1 -0
- package/dist/commands/tree.d.ts +6 -0
- package/dist/commands/tree.js +101 -0
- package/dist/commands/tree.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.js +217 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/wiki.d.ts +6 -0
- package/dist/commands/wiki.js +286 -0
- package/dist/commands/wiki.js.map +1 -0
- package/dist/parser/block-types.d.ts +141 -0
- package/dist/parser/block-types.js +167 -0
- package/dist/parser/block-types.js.map +1 -0
- package/dist/parser/blocks-to-md.d.ts +26 -0
- package/dist/parser/blocks-to-md.js +666 -0
- package/dist/parser/blocks-to-md.js.map +1 -0
- package/dist/parser/text-elements.d.ts +13 -0
- package/dist/parser/text-elements.js +91 -0
- package/dist/parser/text-elements.js.map +1 -0
- package/dist/scopes.d.ts +21 -0
- package/dist/scopes.js +48 -0
- package/dist/scopes.js.map +1 -0
- package/dist/services/block-writer.d.ts +29 -0
- package/dist/services/block-writer.js +131 -0
- package/dist/services/block-writer.js.map +1 -0
- package/dist/services/doc-blocks.d.ts +8 -0
- package/dist/services/doc-blocks.js +26 -0
- package/dist/services/doc-blocks.js.map +1 -0
- package/dist/services/markdown-convert.d.ts +68 -0
- package/dist/services/markdown-convert.js +217 -0
- package/dist/services/markdown-convert.js.map +1 -0
- package/dist/services/wiki-nodes.d.ts +20 -0
- package/dist/services/wiki-nodes.js +46 -0
- package/dist/services/wiki-nodes.js.map +1 -0
- package/dist/types/index.d.ts +236 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/document-resolver.d.ts +26 -0
- package/dist/utils/document-resolver.js +46 -0
- package/dist/utils/document-resolver.js.map +1 -0
- package/dist/utils/drive-types.d.ts +4 -0
- package/dist/utils/drive-types.js +16 -0
- package/dist/utils/drive-types.js.map +1 -0
- package/dist/utils/errors.d.ts +23 -0
- package/dist/utils/errors.js +114 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/member.d.ts +11 -0
- package/dist/utils/member.js +30 -0
- package/dist/utils/member.js.map +1 -0
- package/dist/utils/scope-prompt.d.ts +39 -0
- package/dist/utils/scope-prompt.js +134 -0
- package/dist/utils/scope-prompt.js.map +1 -0
- package/dist/utils/url-parser.d.ts +5 -0
- package/dist/utils/url-parser.js +55 -0
- package/dist/utils/url-parser.js.map +1 -0
- package/dist/utils/validate.d.ts +8 -0
- package/dist/utils/validate.js +15 -0
- package/dist/utils/validate.js.map +1 -0
- package/dist/utils/version.d.ts +12 -0
- package/dist/utils/version.js +128 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +53 -0
- package/skills/feishu-docs/SKILL.md +194 -0
package/README.zh.md
ADDED
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
# feishu-docs-cli
|
|
2
|
+
|
|
3
|
+
[English](./README.md)
|
|
4
|
+
|
|
5
|
+
让 AI Agent(Claude Code、Codex、Trae 等)通过 shell 命令读写飞书云文档和知识库。
|
|
6
|
+
|
|
7
|
+
## 为什么选 feishu-docs-cli?
|
|
8
|
+
|
|
9
|
+
飞书官方已有 [lark-mcp](https://github.com/larksuite/lark-openapi-mcp) MCP 服务。以下是本项目的差异化能力:
|
|
10
|
+
|
|
11
|
+
| 能力 | feishu-docs-cli | lark-mcp |
|
|
12
|
+
|------|:-:|:-:|
|
|
13
|
+
| 读取文档输出 Markdown | **支持** — 30+ 种 block 类型渲染 | 不支持 — 返回原始 Block JSON |
|
|
14
|
+
| 从 Markdown 写入文档 | **支持** — 自动转换、大文档自动分批(>1000 blocks) | 不支持 |
|
|
15
|
+
| 知识库目录树浏览 | **支持** — `spaces` → `tree` → `cat` 完整工作流 | 仅搜索/获取单个节点 |
|
|
16
|
+
| 批量读取知识库子树 | **支持** — `cat` 递归导出为 Markdown | 不支持 |
|
|
17
|
+
| 写入安全(备份/恢复) | **支持** — 覆盖前自动备份,失败自动恢复 | 不支持 |
|
|
18
|
+
| OAuth 用户登录 | **支持** — 完整 OAuth v2 + token 自动刷新 + 分级权限管理 + 交互式权限恢复 | 支持 — 基础 OAuth 登录 |
|
|
19
|
+
| 兼容任意 AI Agent | **支持** — 标准 CLI,支持管道和脚本 | 仅 MCP 协议 |
|
|
20
|
+
| 即时消息 | 不支持 | 支持 |
|
|
21
|
+
| 多维表格 CRUD | 只读(渲染为表格) | 支持 |
|
|
22
|
+
| 通讯录查询 | 仅 `share add` 时使用 | 支持 |
|
|
23
|
+
|
|
24
|
+
**一句话总结**:lark-mcp 是飞书 API 的薄封装,覆盖面广但每个功能都是原始 API 级别。feishu-docs-cli 专注于**文档工作流**,让 AI Agent 能以 Markdown 为媒介真正读懂和编写飞书文档,并提供原始 API 没有的安全保障。
|
|
25
|
+
|
|
26
|
+
## 功能
|
|
27
|
+
|
|
28
|
+
- **读取** 文档,输出 Markdown、纯文本或原始 Block JSON
|
|
29
|
+
- **创建** 文档到知识库或云空间文件夹
|
|
30
|
+
- **更新** 文档,支持覆盖写入或追加模式(大文档自动分批)
|
|
31
|
+
- **删除** 文档(移至回收站)
|
|
32
|
+
- **详情** — 查看文档元信息(标题、类型、URL、版本号)
|
|
33
|
+
- **浏览** 知识库结构(空间列表、目录树、批量读取)
|
|
34
|
+
- **搜索** 按关键词搜索文档
|
|
35
|
+
- **分享** — 管理协作者(列表、添加、设置公开权限)
|
|
36
|
+
- **文件列表** — 浏览云空间文件夹
|
|
37
|
+
- 使用 TypeScript 编写,严格模式
|
|
38
|
+
- 零运行时依赖 — 使用原生 `fetch` 调用所有 API
|
|
39
|
+
- Agent 友好输出 — 纯文本或 JSON,无交互式 UI
|
|
40
|
+
|
|
41
|
+
## 安装
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm install -g feishu-docs-cli
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
或通过 npx 直接运行:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
npx feishu-docs-cli read <url>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
也可以从 GitHub 安装:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm install -g github:cliff-byte/feishu-docs-cli
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
需要 Node.js >= 18.3。
|
|
60
|
+
|
|
61
|
+
## 配置
|
|
62
|
+
|
|
63
|
+
### 1. 创建飞书应用
|
|
64
|
+
|
|
65
|
+
1. 前往[飞书开放平台](https://open.feishu.cn/app),点击 **创建企业自建应用**,填写应用名称和描述
|
|
66
|
+
2. 创建完成后,进入应用的 **凭证与基础信息** 页面,复制 **App ID**(`cli_xxx`)和 **App Secret** — 后续配置环境变量需要用到
|
|
67
|
+
3. 进入 **权限管理**,搜索并添加以下权限:
|
|
68
|
+
|
|
69
|
+
**基础权限**(免审核 — 执行 `feishu-docs login` 时自动申请):
|
|
70
|
+
|
|
71
|
+
| 权限 | 说明 |
|
|
72
|
+
|------|------|
|
|
73
|
+
| `wiki:wiki` | 知识库读写 |
|
|
74
|
+
| `docx:document` | 文档读写 |
|
|
75
|
+
| `docx:document.block:convert` | Markdown 转 Block(创建/更新需要) |
|
|
76
|
+
| `sheets:spreadsheet:readonly` | 嵌入式电子表格只读(read 命令) |
|
|
77
|
+
| `board:whiteboard:node:read` | 画板导出为图片(read 命令) |
|
|
78
|
+
| `bitable:app:readonly` | 嵌入式多维表格只读(read 命令) |
|
|
79
|
+
|
|
80
|
+
**额外权限**会按需自动提示 — 当 API 调用需要你未授权的权限时,CLI 会从 API 错误响应中检测并提示你授权。常见权限:
|
|
81
|
+
|
|
82
|
+
| 权限 | 说明 |
|
|
83
|
+
|------|------|
|
|
84
|
+
| `drive:drive` | 云空间文件管理(ls、delete、share、mv、cp、mkdir) |
|
|
85
|
+
| `contact:contact.base:readonly` | 通过邮件/手机号查找用户 |
|
|
86
|
+
| `drive:drive.search:readonly` | 搜索云文档 |
|
|
87
|
+
|
|
88
|
+
4. 进入 **安全设置**,在 **重定向 URL** 白名单中添加 OAuth 回调地址:
|
|
89
|
+
- 默认值:`http://127.0.0.1:3456/callback`
|
|
90
|
+
- 该地址必须与 `feishu-docs login` 使用的值完全一致
|
|
91
|
+
|
|
92
|
+
5. **发布应用版本**:进入 **应用发布** → **创建版本** → 提交审核 → 审核通过(企业自建应用通常自动通过)
|
|
93
|
+
|
|
94
|
+
> **提示**:使用 tenant(应用)身份访问文档时(如 CI/CD 场景),需要将应用添加为文档或知识库的协作者,或通过管理后台授权文档范围。
|
|
95
|
+
|
|
96
|
+
### 2. 设置环境变量
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
export FEISHU_APP_ID="cli_xxx" # 上面第 2 步获取的 App ID
|
|
100
|
+
export FEISHU_APP_SECRET="xxx" # 上面第 2 步获取的 App Secret
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 3. 登录(获取用户级别访问权限)
|
|
104
|
+
|
|
105
|
+
用户级别访问支持个人文档、搜索和协作等功能。
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
feishu-docs login
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
执行后会打开浏览器进行 OAuth 授权,token 加密保存到 `~/.feishu-docs/auth.json`。
|
|
112
|
+
|
|
113
|
+
如果应用注册的重定向 URL 与默认值(`http://127.0.0.1:3456/callback`)不同,需要传入完全一致的值:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# 使用与飞书开放平台注册的完全一致的重定向 URI
|
|
117
|
+
feishu-docs login --redirect-uri http://127.0.0.1:3456/callback
|
|
118
|
+
|
|
119
|
+
# 或仅更改端口,保持默认的 localhost 路径
|
|
120
|
+
feishu-docs login --port 4567
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 使用
|
|
124
|
+
|
|
125
|
+
### 读取
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
# 读取文档,输出 Markdown
|
|
129
|
+
feishu-docs read https://xxx.feishu.cn/wiki/wikcnXXX
|
|
130
|
+
|
|
131
|
+
# 通过 token 读取
|
|
132
|
+
feishu-docs read wikcnXXX
|
|
133
|
+
|
|
134
|
+
# 原始 Block JSON(无损)
|
|
135
|
+
feishu-docs read <url> --blocks
|
|
136
|
+
|
|
137
|
+
# 纯文本
|
|
138
|
+
feishu-docs read <url> --raw
|
|
139
|
+
|
|
140
|
+
# 带元信息头
|
|
141
|
+
feishu-docs read <url> --with-meta
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### 知识库
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
# 列出所有知识库
|
|
148
|
+
feishu-docs spaces
|
|
149
|
+
|
|
150
|
+
# 查看目录树
|
|
151
|
+
feishu-docs tree <space_id>
|
|
152
|
+
feishu-docs tree <space_id> --depth 2
|
|
153
|
+
|
|
154
|
+
# 递归读取所有文档
|
|
155
|
+
feishu-docs cat <space_id> --max-docs 20
|
|
156
|
+
feishu-docs cat <space_id> --node <token> --title-only
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 搜索
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
feishu-docs search "API 设计" --type docx --limit 10
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
需要用户级别 token,请先执行 `feishu-docs login`。
|
|
166
|
+
|
|
167
|
+
### 创建
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# 在知识库中创建
|
|
171
|
+
feishu-docs create "API 文档" --wiki <space_id> --body ./api.md
|
|
172
|
+
|
|
173
|
+
# 在云空间文件夹中创建
|
|
174
|
+
feishu-docs create "API 文档" --folder <folder_token> --body ./api.md
|
|
175
|
+
|
|
176
|
+
# 创建空文档
|
|
177
|
+
feishu-docs create "API 文档"
|
|
178
|
+
|
|
179
|
+
# 从标准输入读取
|
|
180
|
+
cat design.md | feishu-docs create "设计文档" --wiki <space_id> --body -
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### 更新
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
# 覆盖写入(自动备份)
|
|
187
|
+
feishu-docs update <url> --body ./updated.md
|
|
188
|
+
|
|
189
|
+
# 追加内容
|
|
190
|
+
feishu-docs update <url> --body ./extra.md --append
|
|
191
|
+
|
|
192
|
+
# 从标准输入读取
|
|
193
|
+
echo "## 新章节" | feishu-docs update <url> --body - --append
|
|
194
|
+
|
|
195
|
+
# 从备份恢复
|
|
196
|
+
feishu-docs update <url> --restore ~/.feishu-docs/backups/xxx.json
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 删除
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
feishu-docs delete <url> --confirm
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
将文档移至回收站(30 天内可恢复)。
|
|
206
|
+
|
|
207
|
+
### 详情
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
feishu-docs info <url|token>
|
|
211
|
+
feishu-docs info <url> --json
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### 文件列表
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
# 列出根目录
|
|
218
|
+
feishu-docs ls
|
|
219
|
+
|
|
220
|
+
# 列出指定文件夹
|
|
221
|
+
feishu-docs ls <folder_token>
|
|
222
|
+
|
|
223
|
+
# 按类型筛选
|
|
224
|
+
feishu-docs ls --type docx --limit 20
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 文件操作
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
# 移动文件到指定文件夹
|
|
231
|
+
feishu-docs mv <url|token> <target_folder_token>
|
|
232
|
+
|
|
233
|
+
# 复制文件(自动命名为"标题 - 副本")
|
|
234
|
+
feishu-docs cp <url|token> <target_folder_token>
|
|
235
|
+
|
|
236
|
+
# 指定副本名称
|
|
237
|
+
feishu-docs cp <url|token> <target_folder_token> --name "我的副本"
|
|
238
|
+
|
|
239
|
+
# 创建文件夹
|
|
240
|
+
feishu-docs mkdir "新文件夹" --parent <parent_folder_token>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### 分享
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
# 查看协作者
|
|
247
|
+
feishu-docs share list <url>
|
|
248
|
+
|
|
249
|
+
# 添加协作者
|
|
250
|
+
feishu-docs share add <url> user@example.com --role view
|
|
251
|
+
feishu-docs share add <url> ou_xxx --role edit
|
|
252
|
+
|
|
253
|
+
# 移除协作者
|
|
254
|
+
feishu-docs share remove <url> user@example.com
|
|
255
|
+
|
|
256
|
+
# 修改协作者权限
|
|
257
|
+
feishu-docs share update <url> ou_xxx --role manage
|
|
258
|
+
|
|
259
|
+
# 设置公开分享模式
|
|
260
|
+
feishu-docs share set <url> --public tenant # 组织内可读
|
|
261
|
+
feishu-docs share set <url> --public tenant:edit # 组织内可编辑
|
|
262
|
+
feishu-docs share set <url> --public open # 互联网可读
|
|
263
|
+
feishu-docs share set <url> --public closed # 关闭链接分享
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
角色:`view`(查看)、`edit`(编辑)、`manage`(管理)。成员类型自动识别(邮箱、openid、unionid、openchat、userid)。
|
|
267
|
+
|
|
268
|
+
### 认证
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
feishu-docs login # OAuth 登录(默认回调:http://127.0.0.1:3456/callback)
|
|
272
|
+
feishu-docs logout # 清除保存的凭证
|
|
273
|
+
feishu-docs whoami # 查看当前认证状态
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## 全局选项
|
|
277
|
+
|
|
278
|
+
| 选项 | 说明 |
|
|
279
|
+
|------|------|
|
|
280
|
+
| `--auth <user\|tenant\|auto>` | 认证模式(默认:auto) |
|
|
281
|
+
| `--json` | JSON 格式输出 |
|
|
282
|
+
| `--lark` | 使用 Lark(国际版)域名 |
|
|
283
|
+
| `--help` | 显示帮助 |
|
|
284
|
+
| `-v, --version` | 显示版本号 |
|
|
285
|
+
|
|
286
|
+
## 认证模式
|
|
287
|
+
|
|
288
|
+
| 模式 | Token 类型 | 适用场景 |
|
|
289
|
+
|------|-----------|----------|
|
|
290
|
+
| `user` | user_access_token | 个人文档、协作、搜索 |
|
|
291
|
+
| `tenant` | tenant_access_token | 应用管理的文档、CI/CD |
|
|
292
|
+
| `auto` | 自动选择最佳 | 默认 — 优先用户 token,回退到租户 token |
|
|
293
|
+
|
|
294
|
+
## AI Agent 集成
|
|
295
|
+
|
|
296
|
+
### Claude Code
|
|
297
|
+
|
|
298
|
+
通过 [skills.sh](https://skills.sh) 安装 Skill(支持 Claude Code、Cursor、Codex 等 40+ Agent):
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
npx skills add cliff-byte/feishu-docs-cli
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
或通过 CLI 直接安装:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
feishu-docs install-skill
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
安装后在 Claude Code 中使用 `/feishu-docs` 即可激活。
|
|
311
|
+
|
|
312
|
+
### 其他 Agent
|
|
313
|
+
|
|
314
|
+
将以下指令添加到 Agent 的系统提示词或配置中:
|
|
315
|
+
|
|
316
|
+
```
|
|
317
|
+
读取文档: feishu-docs read <url>
|
|
318
|
+
搜索文档: feishu-docs search <关键词>
|
|
319
|
+
浏览知识库: feishu-docs tree <space_id>
|
|
320
|
+
批量读取: feishu-docs cat <space_id> --max-docs 10
|
|
321
|
+
创建文档: feishu-docs create <标题> --wiki <space_id> --body <文件>
|
|
322
|
+
更新文档: feishu-docs update <url> --body <文件>
|
|
323
|
+
使用 --json 获取结构化输出。运行 feishu-docs --help 查看所有命令。
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### 程序化调用
|
|
327
|
+
|
|
328
|
+
所有命令输出到 stdout(结果)和 stderr(错误/警告)。退出码:
|
|
329
|
+
|
|
330
|
+
| 退出码 | 含义 |
|
|
331
|
+
|--------|------|
|
|
332
|
+
| 0 | 成功 |
|
|
333
|
+
| 1 | 参数错误 |
|
|
334
|
+
| 2 | 认证失败 |
|
|
335
|
+
| 3 | API 错误 |
|
|
336
|
+
|
|
337
|
+
使用 `--json` 获取结构化输出,便于 Agent 解析。
|
|
338
|
+
|
|
339
|
+
## 写入安全
|
|
340
|
+
|
|
341
|
+
覆盖写入(`update` 不带 `--append`)自动执行:
|
|
342
|
+
|
|
343
|
+
1. **备份** 当前文档到 `~/.feishu-docs/backups/`
|
|
344
|
+
2. **清空** 后 **重写** 文档
|
|
345
|
+
3. 写入失败时 **自动恢复** 备份
|
|
346
|
+
4. **轮转** 备份文件(保留最近 10 份)
|
|
347
|
+
|
|
348
|
+
飞书本身也维护版本历史 — 你随时可以在飞书客户端中回滚。
|
|
349
|
+
|
|
350
|
+
## 开发
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
git clone https://github.com/cliff-byte/feishu-docs-cli.git
|
|
354
|
+
cd feishu-docs-cli
|
|
355
|
+
npm install
|
|
356
|
+
|
|
357
|
+
# 类型检查
|
|
358
|
+
npm run build:check
|
|
359
|
+
|
|
360
|
+
# 构建(输出到 dist/)
|
|
361
|
+
npm run build
|
|
362
|
+
|
|
363
|
+
# 运行测试
|
|
364
|
+
npm test
|
|
365
|
+
|
|
366
|
+
# 从源码运行
|
|
367
|
+
npm run build && node bin/feishu-docs.js --help
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### 项目结构
|
|
371
|
+
|
|
372
|
+
```
|
|
373
|
+
src/
|
|
374
|
+
types/ # 共享 TypeScript 类型定义
|
|
375
|
+
commands/ # CLI 命令处理器
|
|
376
|
+
services/ # API 服务层
|
|
377
|
+
parser/ # Block 转 Markdown 解析器
|
|
378
|
+
utils/ # 校验、错误处理、URL 解析
|
|
379
|
+
test/ # 单元测试(node:test)
|
|
380
|
+
bin/ # CLI 入口(JS shim → dist/)
|
|
381
|
+
dist/ # 编译输出(不提交到 git)
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## 路线图
|
|
385
|
+
|
|
386
|
+
- [x] 飞书云文档操作(读取、创建、更新、删除、详情)
|
|
387
|
+
- [x] 知识库操作(空间列表、目录树、批量读取、Wiki 管理、分享、搜索)
|
|
388
|
+
- [ ] 飞书多维表格操作
|
|
389
|
+
- [ ] 飞书电子表格操作
|
|
390
|
+
|
|
391
|
+
## 限制
|
|
392
|
+
|
|
393
|
+
- **支持**:docx(新版文档)
|
|
394
|
+
- **嵌入内容**:电子表格(渲染为表格)、多维表格(渲染为表格)、画板/白板(导出为图片)
|
|
395
|
+
- **仅链接**:思维笔记(mindnote)
|
|
396
|
+
- **不支持**:doc(旧版格式)
|
|
397
|
+
- Markdown 转换有损(颜色、合并单元格、布局会丢失)。使用 `--blocks` 获取无损 JSON。
|
|
398
|
+
- 不支持图片写入(读取返回约 24 小时有效的临时 URL)
|
|
399
|
+
|
|
400
|
+
## 许可证
|
|
401
|
+
|
|
402
|
+
MIT
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication module: OAuth login, token persistence, auto-refresh.
|
|
3
|
+
*/
|
|
4
|
+
import type { AuthMode, AuthInfo, TokenData } from "./types/index.js";
|
|
5
|
+
interface StoredTokens {
|
|
6
|
+
appId: string;
|
|
7
|
+
tokens: TokenData & {
|
|
8
|
+
scope?: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
interface OauthLoginOptions {
|
|
12
|
+
appSecret?: string;
|
|
13
|
+
scope?: string;
|
|
14
|
+
port?: number | string;
|
|
15
|
+
redirectUri?: string;
|
|
16
|
+
useLark?: boolean;
|
|
17
|
+
}
|
|
18
|
+
interface OAuthCallbackConfig {
|
|
19
|
+
redirectUri: string;
|
|
20
|
+
callbackHost: string;
|
|
21
|
+
callbackPath: string;
|
|
22
|
+
callbackPort: number;
|
|
23
|
+
}
|
|
24
|
+
interface BuildAuthorizationUrlOptions {
|
|
25
|
+
appId: string;
|
|
26
|
+
redirectUri: string;
|
|
27
|
+
state: string;
|
|
28
|
+
scope?: string;
|
|
29
|
+
useLark?: boolean;
|
|
30
|
+
codeChallenge?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Save auth tokens to encrypted config file.
|
|
34
|
+
*/
|
|
35
|
+
export declare function saveTokens(appId: string, tokenData: TokenData & {
|
|
36
|
+
scope?: string;
|
|
37
|
+
}): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Load auth tokens from encrypted config file.
|
|
40
|
+
* Returns null if not found.
|
|
41
|
+
*/
|
|
42
|
+
export declare function loadTokens(): Promise<StoredTokens | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Clear saved auth tokens.
|
|
45
|
+
*/
|
|
46
|
+
export declare function clearTokens(): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Resolve credentials based on auth mode.
|
|
49
|
+
* Returns { mode, appId, appSecret, userToken }
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveAuth(authMode?: AuthMode | string): Promise<AuthInfo>;
|
|
52
|
+
export declare function resolveOAuthCallbackConfig(options?: OauthLoginOptions): OAuthCallbackConfig;
|
|
53
|
+
/**
|
|
54
|
+
* Generate PKCE code_verifier and code_challenge (S256).
|
|
55
|
+
*/
|
|
56
|
+
export declare function generatePkce(): {
|
|
57
|
+
codeVerifier: string;
|
|
58
|
+
codeChallenge: string;
|
|
59
|
+
};
|
|
60
|
+
export declare function buildAuthorizationUrl({ appId, redirectUri, state, scope, useLark, codeChallenge, }: BuildAuthorizationUrlOptions): string;
|
|
61
|
+
/**
|
|
62
|
+
* Run OAuth login flow (v2 OAuth with PKCE S256).
|
|
63
|
+
*/
|
|
64
|
+
export declare function oauthLogin(appId: string, options?: OauthLoginOptions): Promise<TokenData>;
|
|
65
|
+
/**
|
|
66
|
+
* Acquire an exclusive file lock for token refresh.
|
|
67
|
+
* Returns a release function, or null if lock is held by another process.
|
|
68
|
+
*/
|
|
69
|
+
export declare function acquireRefreshLock(): Promise<(() => Promise<void>) | null>;
|
|
70
|
+
/**
|
|
71
|
+
* Refresh user_access_token using refresh_token (v2 OAuth).
|
|
72
|
+
*/
|
|
73
|
+
export declare function refreshUserToken(appId: string, appSecret: string, refreshToken: string, { useLark }?: {
|
|
74
|
+
useLark?: boolean;
|
|
75
|
+
}): Promise<TokenData>;
|
|
76
|
+
export {};
|