feishu-docs-cli 0.1.0-beta.2 → 0.1.0-beta.3
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/README.md +33 -15
- package/README.zh.md +33 -15
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +3 -21
- package/dist/client.js +12 -89
- package/dist/client.js.map +1 -1
- package/dist/commands/cat.js +16 -8
- package/dist/commands/cat.js.map +1 -1
- package/dist/commands/create.js +7 -7
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/delete.js +4 -4
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/info.js +3 -3
- package/dist/commands/info.js.map +1 -1
- 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/read.js +13 -16
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/share.js +8 -8
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/update.js +15 -15
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/wiki.js +8 -8
- package/dist/commands/wiki.js.map +1 -1
- package/dist/services/block-writer.d.ts +4 -5
- package/dist/services/block-writer.js +8 -8
- package/dist/services/block-writer.js.map +1 -1
- package/dist/services/doc-blocks.d.ts +1 -2
- package/dist/services/doc-blocks.js +7 -11
- package/dist/services/doc-blocks.js.map +1 -1
- package/dist/services/wiki-nodes.d.ts +1 -2
- package/dist/services/wiki-nodes.js +5 -6
- package/dist/services/wiki-nodes.js.map +1 -1
- package/dist/utils/document-resolver.d.ts +1 -3
- package/dist/utils/document-resolver.js +2 -3
- package/dist/utils/document-resolver.js.map +1 -1
- package/package.json +3 -4
- package/skills/feishu-docs/SKILL.md +179 -0
package/README.md
CHANGED
|
@@ -16,19 +16,25 @@ CLI tool for AI Agents to read/write Feishu (Lark) docs via shell commands.
|
|
|
16
16
|
- **Share** — manage collaborators (list, add, set public mode)
|
|
17
17
|
- **List** files in cloud folders
|
|
18
18
|
- Written in TypeScript with strict mode
|
|
19
|
-
- Zero
|
|
19
|
+
- Zero runtime dependencies — uses native `fetch` for all API calls
|
|
20
20
|
- Agent-friendly output — pure text or JSON, no interactive UI
|
|
21
21
|
|
|
22
22
|
## Install
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
npm install -g
|
|
25
|
+
npm install -g feishu-docs-cli
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
Or use directly with npx:
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
npx
|
|
31
|
+
npx feishu-docs-cli read <url>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
You can also install from GitHub:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install -g github:cliff-byte/feishu-docs-cli
|
|
32
38
|
```
|
|
33
39
|
|
|
34
40
|
Requires Node.js >= 18.3.
|
|
@@ -237,22 +243,34 @@ feishu-docs whoami # Show current auth status
|
|
|
237
243
|
|
|
238
244
|
## AI Agent Integration
|
|
239
245
|
|
|
240
|
-
### Claude Code
|
|
246
|
+
### Claude Code
|
|
241
247
|
|
|
242
|
-
|
|
243
|
-
## Feishu Docs
|
|
248
|
+
Install the skill via [skills.sh](https://skills.sh) (works with Claude Code, Cursor, Codex, and 37+ agents):
|
|
244
249
|
|
|
245
|
-
|
|
250
|
+
```bash
|
|
251
|
+
npx skills add cliff-byte/feishu-docs-cli
|
|
252
|
+
```
|
|
246
253
|
|
|
247
|
-
|
|
248
|
-
Search: feishu-docs search <keyword>
|
|
249
|
-
Tree: feishu-docs tree <space_id>
|
|
250
|
-
Batch: feishu-docs cat <space_id> --max-docs 10
|
|
251
|
-
Create: feishu-docs create <title> --wiki <space_id> --body <file>
|
|
252
|
-
Update: feishu-docs update <url> --body <file>
|
|
254
|
+
Or install directly via the CLI:
|
|
253
255
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
+
```bash
|
|
257
|
+
feishu-docs install-skill
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
After installation, use `/feishu-docs` in Claude Code to activate the skill.
|
|
261
|
+
|
|
262
|
+
### Other Agents
|
|
263
|
+
|
|
264
|
+
Add these instructions to your agent's system prompt or configuration:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
Read Feishu docs: feishu-docs read <url>
|
|
268
|
+
Search docs: feishu-docs search <keyword>
|
|
269
|
+
Browse wiki: feishu-docs tree <space_id>
|
|
270
|
+
Batch read: feishu-docs cat <space_id> --max-docs 10
|
|
271
|
+
Create doc: feishu-docs create <title> --wiki <space_id> --body <file>
|
|
272
|
+
Update doc: feishu-docs update <url> --body <file>
|
|
273
|
+
Use --json for structured output. Run feishu-docs --help for all commands.
|
|
256
274
|
```
|
|
257
275
|
|
|
258
276
|
### Programmatic Usage
|
package/README.zh.md
CHANGED
|
@@ -16,19 +16,25 @@
|
|
|
16
16
|
- **分享** — 管理协作者(列表、添加、设置公开权限)
|
|
17
17
|
- **文件列表** — 浏览云空间文件夹
|
|
18
18
|
- 使用 TypeScript 编写,严格模式
|
|
19
|
-
-
|
|
19
|
+
- 零运行时依赖 — 使用原生 `fetch` 调用所有 API
|
|
20
20
|
- Agent 友好输出 — 纯文本或 JSON,无交互式 UI
|
|
21
21
|
|
|
22
22
|
## 安装
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
npm install -g
|
|
25
|
+
npm install -g feishu-docs-cli
|
|
26
26
|
```
|
|
27
27
|
|
|
28
28
|
或通过 npx 直接运行:
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
npx
|
|
31
|
+
npx feishu-docs-cli read <url>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
也可以从 GitHub 安装:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install -g github:cliff-byte/feishu-docs-cli
|
|
32
38
|
```
|
|
33
39
|
|
|
34
40
|
需要 Node.js >= 18.3。
|
|
@@ -236,22 +242,34 @@ feishu-docs whoami # 查看当前认证状态
|
|
|
236
242
|
|
|
237
243
|
## AI Agent 集成
|
|
238
244
|
|
|
239
|
-
### Claude Code
|
|
245
|
+
### Claude Code
|
|
240
246
|
|
|
241
|
-
|
|
242
|
-
## 飞书文档
|
|
247
|
+
通过 [skills.sh](https://skills.sh) 安装 Skill(支持 Claude Code、Cursor、Codex 等 40+ Agent):
|
|
243
248
|
|
|
244
|
-
|
|
249
|
+
```bash
|
|
250
|
+
npx skills add cliff-byte/feishu-docs-cli
|
|
251
|
+
```
|
|
245
252
|
|
|
246
|
-
|
|
247
|
-
搜索: feishu-docs search <关键词>
|
|
248
|
-
目录树: feishu-docs tree <space_id>
|
|
249
|
-
批量读取: feishu-docs cat <space_id> --max-docs 10
|
|
250
|
-
创建: feishu-docs create <标题> --wiki <space_id> --body <文件>
|
|
251
|
-
更新: feishu-docs update <url> --body <文件>
|
|
253
|
+
或通过 CLI 直接安装:
|
|
252
254
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
+
```bash
|
|
256
|
+
feishu-docs install-skill
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
安装后在 Claude Code 中使用 `/feishu-docs` 即可激活。
|
|
260
|
+
|
|
261
|
+
### 其他 Agent
|
|
262
|
+
|
|
263
|
+
将以下指令添加到 Agent 的系统提示词或配置中:
|
|
264
|
+
|
|
265
|
+
```
|
|
266
|
+
读取文档: feishu-docs read <url>
|
|
267
|
+
搜索文档: feishu-docs search <关键词>
|
|
268
|
+
浏览知识库: feishu-docs tree <space_id>
|
|
269
|
+
批量读取: feishu-docs cat <space_id> --max-docs 10
|
|
270
|
+
创建文档: feishu-docs create <标题> --wiki <space_id> --body <文件>
|
|
271
|
+
更新文档: feishu-docs update <url> --body <文件>
|
|
272
|
+
使用 --json 获取结构化输出。运行 feishu-docs --help 查看所有命令。
|
|
255
273
|
```
|
|
256
274
|
|
|
257
275
|
### 程序化调用
|
package/dist/cli.js
CHANGED
|
@@ -16,6 +16,7 @@ import { meta as shareMeta } from "./commands/share.js";
|
|
|
16
16
|
import { meta as infoMeta } from "./commands/info.js";
|
|
17
17
|
import { meta as lsMeta } from "./commands/ls.js";
|
|
18
18
|
import { meta as wikiMeta } from "./commands/wiki.js";
|
|
19
|
+
import { meta as installSkillMeta } from "./commands/install-skill.js";
|
|
19
20
|
import { handleError, CliError } from "./utils/errors.js";
|
|
20
21
|
const HELP_TEXT = `feishu-docs - AI Agent 飞书云文档 CLI 工具
|
|
21
22
|
|
|
@@ -56,6 +57,9 @@ const HELP_TEXT = `feishu-docs - AI Agent 飞书云文档 CLI 工具
|
|
|
56
57
|
share add <url> <member> --role <role> 添加协作者
|
|
57
58
|
share set <url> --public <mode> 修改分享设置
|
|
58
59
|
|
|
60
|
+
Agent:
|
|
61
|
+
install-skill 安装 Claude Code Skill
|
|
62
|
+
|
|
59
63
|
全局选项:
|
|
60
64
|
--auth <user|tenant|auto> 认证模式(默认 auto)
|
|
61
65
|
--json 输出 JSON 格式
|
|
@@ -88,6 +92,7 @@ const COMMANDS = {
|
|
|
88
92
|
info: infoMeta,
|
|
89
93
|
ls: lsMeta,
|
|
90
94
|
wiki: wikiMeta,
|
|
95
|
+
"install-skill": installSkillMeta,
|
|
91
96
|
};
|
|
92
97
|
function extractGlobalOpts(values) {
|
|
93
98
|
return {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAQ1D,MAAM,SAAS,GAAG
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,25 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Auth client factory and API utilities.
|
|
3
3
|
*/
|
|
4
|
-
import * as lark from "@larksuiteoapi/node-sdk";
|
|
5
4
|
import type { AuthInfo, GlobalOpts, FetchOptions, ApiResponse } from "./types/index.js";
|
|
6
5
|
/**
|
|
7
|
-
* Create
|
|
6
|
+
* Create auth context for API calls.
|
|
8
7
|
* @param {object} options - { auth: 'user'|'tenant'|'auto', lark: boolean }
|
|
9
|
-
* @returns {{
|
|
8
|
+
* @returns {{ authInfo: AuthInfo }}
|
|
10
9
|
*/
|
|
11
10
|
export declare function createClient(options?: Partial<GlobalOpts>, _refreshAttempt?: number): Promise<{
|
|
12
|
-
client: lark.Client;
|
|
13
11
|
authInfo: AuthInfo;
|
|
14
12
|
}>;
|
|
15
|
-
/**
|
|
16
|
-
* Build request options with appropriate auth header.
|
|
17
|
-
*/
|
|
18
|
-
export declare function withAuth(authInfo: AuthInfo): {
|
|
19
|
-
headers?: {
|
|
20
|
-
Authorization: string;
|
|
21
|
-
};
|
|
22
|
-
};
|
|
23
13
|
/**
|
|
24
14
|
* Resolve the API base URL based on whether we're using Lark or Feishu.
|
|
25
15
|
*/
|
|
@@ -30,13 +20,5 @@ export declare function getApiBase(authInfo: AuthInfo): string;
|
|
|
30
20
|
export declare function getTenantToken(authInfo: AuthInfo): Promise<string>;
|
|
31
21
|
/**
|
|
32
22
|
* Direct fetch wrapper that correctly passes user/tenant token.
|
|
33
|
-
* Use this instead of SDK methods for APIs where the SDK overrides the token.
|
|
34
23
|
*/
|
|
35
24
|
export declare function fetchWithAuth(authInfo: AuthInfo, path: string, options?: FetchOptions): Promise<ApiResponse>;
|
|
36
|
-
/**
|
|
37
|
-
* Execute an API call with retry for idempotent operations.
|
|
38
|
-
*/
|
|
39
|
-
export declare function apiCall<T>(fn: () => Promise<T>, { retries, idempotent, }?: {
|
|
40
|
-
retries?: number;
|
|
41
|
-
idempotent?: boolean;
|
|
42
|
-
}): Promise<T>;
|
package/dist/client.js
CHANGED
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Auth client factory and API utilities.
|
|
3
3
|
*/
|
|
4
|
-
import * as lark from "@larksuiteoapi/node-sdk";
|
|
5
4
|
import { resolveAuth, refreshUserToken, acquireRefreshLock } from "./auth.js";
|
|
6
5
|
import { CliError, mapApiError } from "./utils/errors.js";
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
error: () => { },
|
|
10
|
-
warn: () => { },
|
|
11
|
-
info: () => { },
|
|
12
|
-
debug: () => { },
|
|
13
|
-
trace: () => { },
|
|
14
|
-
};
|
|
6
|
+
const FEISHU_BASE = "https://open.feishu.cn";
|
|
7
|
+
const LARK_BASE = "https://open.larksuite.com";
|
|
15
8
|
/**
|
|
16
|
-
* Create
|
|
9
|
+
* Create auth context for API calls.
|
|
17
10
|
* @param {object} options - { auth: 'user'|'tenant'|'auto', lark: boolean }
|
|
18
|
-
* @returns {{
|
|
11
|
+
* @returns {{ authInfo: AuthInfo }}
|
|
19
12
|
*/
|
|
20
13
|
export async function createClient(options = {}, _refreshAttempt = 0) {
|
|
21
14
|
const authMode = options.auth || "auto";
|
|
@@ -26,23 +19,10 @@ export async function createClient(options = {}, _refreshAttempt = 0) {
|
|
|
26
19
|
if (!appId || !appSecret) {
|
|
27
20
|
if (authInfo.mode === "user" && authInfo.userToken) {
|
|
28
21
|
// User token from env, no app credentials needed for some APIs
|
|
29
|
-
|
|
30
|
-
const client = new lark.Client({
|
|
31
|
-
appId: "placeholder",
|
|
32
|
-
appSecret: "placeholder",
|
|
33
|
-
domain: useLark ? lark.Domain.Lark : lark.Domain.Feishu,
|
|
34
|
-
logger: silentLogger,
|
|
35
|
-
});
|
|
36
|
-
return { client, authInfo };
|
|
22
|
+
return { authInfo };
|
|
37
23
|
}
|
|
38
24
|
throw new CliError("AUTH_REQUIRED", "缺少 FEISHU_APP_ID 或 FEISHU_APP_SECRET");
|
|
39
25
|
}
|
|
40
|
-
const client = new lark.Client({
|
|
41
|
-
appId,
|
|
42
|
-
appSecret,
|
|
43
|
-
domain: useLark ? lark.Domain.Lark : lark.Domain.Feishu,
|
|
44
|
-
logger: silentLogger,
|
|
45
|
-
});
|
|
46
26
|
// Auto-refresh user token if expired
|
|
47
27
|
if (authInfo.mode === "user" && authInfo.expiresAt) {
|
|
48
28
|
if (Date.now() >= authInfo.expiresAt) {
|
|
@@ -66,7 +46,7 @@ export async function createClient(options = {}, _refreshAttempt = 0) {
|
|
|
66
46
|
expiresAt: newTokens.expires_at,
|
|
67
47
|
refreshToken: newTokens.refresh_token,
|
|
68
48
|
};
|
|
69
|
-
return {
|
|
49
|
+
return { authInfo: refreshedAuthInfo };
|
|
70
50
|
}
|
|
71
51
|
finally {
|
|
72
52
|
await releaseLock();
|
|
@@ -82,7 +62,7 @@ export async function createClient(options = {}, _refreshAttempt = 0) {
|
|
|
82
62
|
mode: "tenant",
|
|
83
63
|
userToken: undefined,
|
|
84
64
|
};
|
|
85
|
-
return {
|
|
65
|
+
return { authInfo: tenantAuthInfo };
|
|
86
66
|
}
|
|
87
67
|
throw new CliError("TOKEN_EXPIRED", "自动刷新 token 失败,请重新运行 feishu-docs login", {
|
|
88
68
|
recovery: "运行 feishu-docs login 重新认证",
|
|
@@ -98,7 +78,7 @@ export async function createClient(options = {}, _refreshAttempt = 0) {
|
|
|
98
78
|
mode: "tenant",
|
|
99
79
|
userToken: undefined,
|
|
100
80
|
};
|
|
101
|
-
return {
|
|
81
|
+
return { authInfo: tenantAuthInfo };
|
|
102
82
|
}
|
|
103
83
|
throw new CliError("TOKEN_EXPIRED", "token 已过期,请重新运行 feishu-docs login", {
|
|
104
84
|
recovery: "运行 feishu-docs login 重新认证",
|
|
@@ -106,27 +86,13 @@ export async function createClient(options = {}, _refreshAttempt = 0) {
|
|
|
106
86
|
}
|
|
107
87
|
}
|
|
108
88
|
}
|
|
109
|
-
return {
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Build request options with appropriate auth header.
|
|
113
|
-
*/
|
|
114
|
-
export function withAuth(authInfo) {
|
|
115
|
-
if (authInfo.mode === "user" && authInfo.userToken) {
|
|
116
|
-
return {
|
|
117
|
-
headers: { Authorization: `Bearer ${authInfo.userToken}` },
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
// tenant mode uses SDK's built-in tenant_access_token
|
|
121
|
-
return {};
|
|
89
|
+
return { authInfo };
|
|
122
90
|
}
|
|
123
91
|
/**
|
|
124
92
|
* Resolve the API base URL based on whether we're using Lark or Feishu.
|
|
125
93
|
*/
|
|
126
94
|
export function getApiBase(authInfo) {
|
|
127
|
-
return authInfo.useLark
|
|
128
|
-
? "https://open.larksuite.com"
|
|
129
|
-
: "https://open.feishu.cn";
|
|
95
|
+
return authInfo.useLark ? LARK_BASE : FEISHU_BASE;
|
|
130
96
|
}
|
|
131
97
|
/**
|
|
132
98
|
* Get tenant_access_token for tenant mode API calls.
|
|
@@ -166,7 +132,6 @@ async function resolveBearer(authInfo) {
|
|
|
166
132
|
}
|
|
167
133
|
/**
|
|
168
134
|
* Direct fetch wrapper that correctly passes user/tenant token.
|
|
169
|
-
* Use this instead of SDK methods for APIs where the SDK overrides the token.
|
|
170
135
|
*/
|
|
171
136
|
export async function fetchWithAuth(authInfo, path, options = {}) {
|
|
172
137
|
const base = getApiBase(authInfo);
|
|
@@ -189,9 +154,9 @@ export async function fetchWithAuth(authInfo, path, options = {}) {
|
|
|
189
154
|
const fetchOpts = {
|
|
190
155
|
method: options.method || "GET",
|
|
191
156
|
headers: {
|
|
192
|
-
Authorization: bearer,
|
|
193
157
|
"Content-Type": "application/json",
|
|
194
158
|
...options.headers,
|
|
159
|
+
Authorization: bearer,
|
|
195
160
|
},
|
|
196
161
|
};
|
|
197
162
|
if (options.body) {
|
|
@@ -224,46 +189,4 @@ export async function fetchWithAuth(authInfo, path, options = {}) {
|
|
|
224
189
|
}
|
|
225
190
|
return body;
|
|
226
191
|
}
|
|
227
|
-
/**
|
|
228
|
-
* Extract Feishu API error code from various error shapes.
|
|
229
|
-
*/
|
|
230
|
-
function extractErrorCode(err) {
|
|
231
|
-
const e = err;
|
|
232
|
-
return e?.code ?? e?.response?.data?.code ?? e?.response?.code;
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Execute an API call with retry for idempotent operations.
|
|
236
|
-
*/
|
|
237
|
-
export async function apiCall(fn, { retries = 3, idempotent = true, } = {}) {
|
|
238
|
-
let lastError;
|
|
239
|
-
for (let attempt = 0; attempt <= (idempotent ? retries : 0); attempt++) {
|
|
240
|
-
try {
|
|
241
|
-
const res = await fn();
|
|
242
|
-
// Check SDK response code
|
|
243
|
-
const resWithCode = res;
|
|
244
|
-
if (resWithCode?.code && resWithCode.code !== 0) {
|
|
245
|
-
throw mapApiError({ code: resWithCode.code, msg: resWithCode.msg });
|
|
246
|
-
}
|
|
247
|
-
return res;
|
|
248
|
-
}
|
|
249
|
-
catch (err) {
|
|
250
|
-
lastError = err;
|
|
251
|
-
const code = extractErrorCode(err);
|
|
252
|
-
// Don't retry client errors (permission, not found, auth errors)
|
|
253
|
-
const NON_RETRYABLE = new Set([
|
|
254
|
-
131001, 131002, 131006, 131008, 99991400, 99991663,
|
|
255
|
-
]);
|
|
256
|
-
if (code && NON_RETRYABLE.has(code)) {
|
|
257
|
-
throw mapApiError(err);
|
|
258
|
-
}
|
|
259
|
-
// Retry on network/server errors
|
|
260
|
-
if (attempt < retries && idempotent) {
|
|
261
|
-
const delay = 1000 * Math.pow(2, attempt);
|
|
262
|
-
await new Promise((r) => setTimeout(r, delay));
|
|
263
|
-
continue;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
throw mapApiError(lastError);
|
|
268
|
-
}
|
|
269
192
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/cat.js
CHANGED
|
@@ -27,7 +27,7 @@ function parseSize(sizeStr) {
|
|
|
27
27
|
/**
|
|
28
28
|
* Recursively collect and output documents.
|
|
29
29
|
*/
|
|
30
|
-
async function walkNodes(
|
|
30
|
+
async function walkNodes(authInfo, spaceId, parentNodeToken, path, ctx) {
|
|
31
31
|
if (ctx.stopped)
|
|
32
32
|
return;
|
|
33
33
|
if (ctx.maxDepth !== undefined && ctx.currentDepth >= ctx.maxDepth)
|
|
@@ -45,8 +45,12 @@ async function walkNodes(client, authInfo, spaceId, parentNodeToken, path, ctx)
|
|
|
45
45
|
// Still recurse into non-matching nodes that have children
|
|
46
46
|
if (node.has_child) {
|
|
47
47
|
ctx.currentDepth++;
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
try {
|
|
49
|
+
await walkNodes(authInfo, spaceId, node.node_token, nodePath, ctx);
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
ctx.currentDepth--;
|
|
53
|
+
}
|
|
50
54
|
}
|
|
51
55
|
continue;
|
|
52
56
|
}
|
|
@@ -72,7 +76,7 @@ async function walkNodes(client, authInfo, spaceId, parentNodeToken, path, ctx)
|
|
|
72
76
|
}
|
|
73
77
|
else if (objType === "docx") {
|
|
74
78
|
try {
|
|
75
|
-
const blocks = await fetchAllBlocks(
|
|
79
|
+
const blocks = await fetchAllBlocks(authInfo, node.obj_token);
|
|
76
80
|
const md = blocksToMarkdown(blocks);
|
|
77
81
|
const output = header + md + "\n";
|
|
78
82
|
// Check byte limit before writing
|
|
@@ -102,8 +106,12 @@ async function walkNodes(client, authInfo, spaceId, parentNodeToken, path, ctx)
|
|
|
102
106
|
// Recurse into children
|
|
103
107
|
if (node.has_child) {
|
|
104
108
|
ctx.currentDepth++;
|
|
105
|
-
|
|
106
|
-
|
|
109
|
+
try {
|
|
110
|
+
await walkNodes(authInfo, spaceId, node.node_token, nodePath, ctx);
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
ctx.currentDepth--;
|
|
114
|
+
}
|
|
107
115
|
}
|
|
108
116
|
}
|
|
109
117
|
}
|
|
@@ -125,7 +133,7 @@ export async function cat(args, globalOpts) {
|
|
|
125
133
|
throw new CliError("INVALID_ARGS", "缺少知识库 ID。用法: feishu-docs cat <space_id> [--node <token>]");
|
|
126
134
|
}
|
|
127
135
|
validateToken(spaceId, "space_id");
|
|
128
|
-
const {
|
|
136
|
+
const { authInfo } = await createClient(globalOpts);
|
|
129
137
|
const parentNode = args.node || undefined;
|
|
130
138
|
if (parentNode)
|
|
131
139
|
validateToken(parentNode, "node_token");
|
|
@@ -143,7 +151,7 @@ export async function cat(args, globalOpts) {
|
|
|
143
151
|
stopped: false,
|
|
144
152
|
currentDepth: 0,
|
|
145
153
|
};
|
|
146
|
-
await walkNodes(
|
|
154
|
+
await walkNodes(authInfo, spaceId, parentNode, "", ctx);
|
|
147
155
|
if (ctx.docsRead === 0) {
|
|
148
156
|
process.stderr.write("feishu-docs: info: 未找到任何文档\n");
|
|
149
157
|
}
|
package/dist/commands/cat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cat.js","sourceRoot":"","sources":["../../src/commands/cat.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"cat.js","sourceRoot":"","sources":["../../src/commands/cat.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/create.js
CHANGED
|
@@ -21,7 +21,7 @@ export async function create(args, globalOpts) {
|
|
|
21
21
|
if (!title) {
|
|
22
22
|
throw new CliError("INVALID_ARGS", "缺少文档标题。用法: feishu-docs create <title> [--wiki <space_id>] [--body <file>]");
|
|
23
23
|
}
|
|
24
|
-
const {
|
|
24
|
+
const { authInfo } = await createClient(globalOpts);
|
|
25
25
|
let bodyContent;
|
|
26
26
|
if (args.body) {
|
|
27
27
|
bodyContent = await readBody(args.body);
|
|
@@ -33,14 +33,14 @@ export async function create(args, globalOpts) {
|
|
|
33
33
|
validateToken(args.wiki, "space_id");
|
|
34
34
|
if (args.parent)
|
|
35
35
|
validateToken(args.parent, "parent_node_token");
|
|
36
|
-
return createInWiki(
|
|
36
|
+
return createInWiki(authInfo, title, args.wiki, args.parent, bodyContent, globalOpts);
|
|
37
37
|
}
|
|
38
38
|
if (args.folder) {
|
|
39
39
|
validateToken(args.folder, "folder_token");
|
|
40
40
|
}
|
|
41
|
-
return createDoc(
|
|
41
|
+
return createDoc(authInfo, title, args.folder, bodyContent, globalOpts);
|
|
42
42
|
}
|
|
43
|
-
async function createInWiki(
|
|
43
|
+
async function createInWiki(authInfo, title, spaceId, parentNodeToken, bodyContent, globalOpts) {
|
|
44
44
|
const nodeRes = await fetchWithAuth(authInfo, `/open-apis/wiki/v2/spaces/${encodeURIComponent(spaceId)}/nodes`, {
|
|
45
45
|
method: "POST",
|
|
46
46
|
body: {
|
|
@@ -58,7 +58,7 @@ async function createInWiki(client, authInfo, title, spaceId, parentNodeToken, b
|
|
|
58
58
|
throw new CliError("API_ERROR", "创建知识库节点成功但未返回 obj_token");
|
|
59
59
|
}
|
|
60
60
|
if (bodyContent) {
|
|
61
|
-
const docInfo = await getDocumentInfo(
|
|
61
|
+
const docInfo = await getDocumentInfo(authInfo, objToken);
|
|
62
62
|
await convertAndWrite(authInfo, objToken, bodyContent, docInfo.revisionId);
|
|
63
63
|
}
|
|
64
64
|
const domain = globalOpts.lark ? "larksuite.com" : "feishu.cn";
|
|
@@ -85,7 +85,7 @@ async function createInWiki(client, authInfo, title, spaceId, parentNodeToken, b
|
|
|
85
85
|
process.stdout.write(` URL: ${wikiUrl}\n`);
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
-
async function createDoc(
|
|
88
|
+
async function createDoc(authInfo, title, folderToken, bodyContent, globalOpts) {
|
|
89
89
|
const body = {
|
|
90
90
|
title,
|
|
91
91
|
...(folderToken && { folder_token: folderToken }),
|
|
@@ -101,7 +101,7 @@ async function createDoc(client, authInfo, title, folderToken, bodyContent, glob
|
|
|
101
101
|
throw new CliError("API_ERROR", "创建文档成功但未返回 document_id");
|
|
102
102
|
}
|
|
103
103
|
if (bodyContent) {
|
|
104
|
-
const docInfo = await getDocumentInfo(
|
|
104
|
+
const docInfo = await getDocumentInfo(authInfo, documentId);
|
|
105
105
|
await convertAndWrite(authInfo, documentId, bodyContent, docInfo.revisionId);
|
|
106
106
|
}
|
|
107
107
|
const domain = globalOpts.lark ? "larksuite.com" : "feishu.cn";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/delete.js
CHANGED
|
@@ -8,7 +8,7 @@ import { mapToDriveType } from "../utils/drive-types.js";
|
|
|
8
8
|
/**
|
|
9
9
|
* Check if a node has children in the knowledge base.
|
|
10
10
|
*/
|
|
11
|
-
async function checkChildren(
|
|
11
|
+
async function checkChildren(authInfo, spaceId, nodeToken) {
|
|
12
12
|
try {
|
|
13
13
|
const res = await fetchWithAuth(authInfo, `/open-apis/wiki/v2/spaces/${encodeURIComponent(spaceId)}/nodes`, { params: { parent_node_token: nodeToken, page_size: 1 } });
|
|
14
14
|
const data = res?.data;
|
|
@@ -31,14 +31,14 @@ export async function del(args, globalOpts) {
|
|
|
31
31
|
if (!input) {
|
|
32
32
|
throw new CliError("INVALID_ARGS", "缺少文档 URL 或 token。用法: feishu-docs delete <url|token>");
|
|
33
33
|
}
|
|
34
|
-
const {
|
|
35
|
-
const doc = await resolveDocument(
|
|
34
|
+
const { authInfo } = await createClient(globalOpts);
|
|
35
|
+
const doc = await resolveDocument(authInfo, input);
|
|
36
36
|
if (doc.objType === "doc") {
|
|
37
37
|
throw new CliError("NOT_SUPPORTED", "旧版 doc 类型不支持此操作,请在飞书客户端中将文档升级为 docx 格式");
|
|
38
38
|
}
|
|
39
39
|
// Check for children — refuse unless --recursive
|
|
40
40
|
if (doc.hasChild && doc.spaceId && doc.nodeToken) {
|
|
41
|
-
const hasChildren = await checkChildren(
|
|
41
|
+
const hasChildren = await checkChildren(authInfo, doc.spaceId, doc.nodeToken);
|
|
42
42
|
if (hasChildren && !args.recursive) {
|
|
43
43
|
throw new CliError("INVALID_ARGS", "该节点下有子文档,删除将同时删除所有子节点。如需继续,请添加 --recursive 参数");
|
|
44
44
|
}
|