feishu-docs-cli 0.1.0-beta.9 → 1.0.0
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 +25 -9
- package/README.zh.md +8 -9
- package/dist/auth.js +31 -17
- package/dist/auth.js.map +1 -1
- package/dist/cli.js +5 -4
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +4 -2
- package/dist/client.js +177 -61
- package/dist/client.js.map +1 -1
- package/dist/commands/authorize.d.ts +3 -0
- package/dist/commands/authorize.js +16 -34
- package/dist/commands/authorize.js.map +1 -1
- package/dist/commands/cp.js +44 -30
- package/dist/commands/cp.js.map +1 -1
- package/dist/commands/create.js +21 -7
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/delete.js +53 -54
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/login.js +6 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/ls.js +38 -38
- package/dist/commands/ls.js.map +1 -1
- package/dist/commands/mkdir.js +25 -25
- package/dist/commands/mkdir.js.map +1 -1
- package/dist/commands/mv.d.ts +2 -2
- package/dist/commands/mv.js +45 -40
- package/dist/commands/mv.js.map +1 -1
- package/dist/commands/read.d.ts +1 -1
- package/dist/commands/read.js +17 -354
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/search.js +57 -55
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/share.js +135 -133
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/update.js +43 -60
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/wiki.js +8 -20
- package/dist/commands/wiki.js.map +1 -1
- package/dist/parser/block-types.d.ts +0 -1
- package/dist/parser/block-types.js +0 -22
- package/dist/parser/block-types.js.map +1 -1
- package/dist/parser/blocks-to-md.d.ts +10 -18
- package/dist/parser/blocks-to-md.js +341 -450
- package/dist/parser/blocks-to-md.js.map +1 -1
- package/dist/scopes.d.ts +5 -47
- package/dist/scopes.js +9 -54
- package/dist/scopes.js.map +1 -1
- package/dist/services/block-writer.d.ts +3 -2
- package/dist/services/block-writer.js +29 -13
- package/dist/services/block-writer.js.map +1 -1
- package/dist/services/doc-blocks.d.ts +1 -1
- package/dist/services/doc-blocks.js +1 -1
- package/dist/services/doc-blocks.js.map +1 -1
- package/dist/services/doc-enrichment.d.ts +64 -0
- package/dist/services/doc-enrichment.js +397 -0
- package/dist/services/doc-enrichment.js.map +1 -0
- package/dist/services/image-download.d.ts +31 -0
- package/dist/services/image-download.js +127 -0
- package/dist/services/image-download.js.map +1 -0
- package/dist/services/markdown-convert.d.ts +20 -0
- package/dist/services/markdown-convert.js +55 -1
- package/dist/services/markdown-convert.js.map +1 -1
- package/dist/services/wiki-nodes.d.ts +1 -1
- package/dist/services/wiki-nodes.js +2 -3
- package/dist/services/wiki-nodes.js.map +1 -1
- package/dist/types/api-responses.d.ts +34 -0
- package/dist/types/api-responses.js +8 -0
- package/dist/types/api-responses.js.map +1 -0
- package/dist/types/index.d.ts +9 -17
- package/dist/utils/concurrency.d.ts +12 -0
- package/dist/utils/concurrency.js +37 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/errors.d.ts +3 -1
- package/dist/utils/errors.js +11 -7
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/retry.d.ts +49 -0
- package/dist/utils/retry.js +70 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/scope-prompt.d.ts +23 -18
- package/dist/utils/scope-prompt.js +62 -51
- package/dist/utils/scope-prompt.js.map +1 -1
- package/package.json +3 -1
- package/skills/feishu-docs/SKILL.md +22 -2
package/dist/client.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { resolveAuth, refreshUserToken, acquireRefreshLock } from "./auth.js";
|
|
5
5
|
import { CliError, mapApiError } from "./utils/errors.js";
|
|
6
|
+
import { DEFAULT_RETRY, calculateDelay, parseRetryAfter, isRetryable, sleep, } from "./utils/retry.js";
|
|
6
7
|
const FEISHU_BASE = "https://open.feishu.cn";
|
|
7
8
|
const LARK_BASE = "https://open.larksuite.com";
|
|
8
9
|
/**
|
|
@@ -54,25 +55,16 @@ export async function createClient(options = {}, _refreshAttempt = 0) {
|
|
|
54
55
|
}
|
|
55
56
|
catch (refreshErr) {
|
|
56
57
|
const refreshError = refreshErr;
|
|
57
|
-
|
|
58
|
-
if (authMode === "auto" && appId && appSecret) {
|
|
59
|
-
process.stderr.write(`feishu-docs: info: 自动刷新失败 (${refreshError.message}),回退到 tenant 模式\n`);
|
|
60
|
-
const tenantAuthInfo = {
|
|
61
|
-
...authInfo,
|
|
62
|
-
mode: "tenant",
|
|
63
|
-
userToken: undefined,
|
|
64
|
-
};
|
|
65
|
-
return { authInfo: tenantAuthInfo };
|
|
66
|
-
}
|
|
67
|
-
throw new CliError("TOKEN_EXPIRED", "自动刷新 token 失败,请重新运行 feishu-docs login", {
|
|
58
|
+
throw new CliError("TOKEN_EXPIRED", `自动刷新 token 失败: ${refreshError.message}。请重新运行 feishu-docs login`, {
|
|
68
59
|
recovery: "运行 feishu-docs login 重新认证",
|
|
69
60
|
});
|
|
70
61
|
}
|
|
71
62
|
}
|
|
72
63
|
else {
|
|
73
|
-
//
|
|
64
|
+
// No refresh_token — fall back to tenant if credentials available,
|
|
65
|
+
// but warn the user so they know they're not in user mode.
|
|
74
66
|
if (authMode === "auto" && appId && appSecret) {
|
|
75
|
-
process.stderr.write("feishu-docs:
|
|
67
|
+
process.stderr.write("feishu-docs: warning: user token 已过期且无法刷新,回退到 tenant 模式(部分操作可能需要 user 权限)\n");
|
|
76
68
|
const tenantAuthInfo = {
|
|
77
69
|
...authInfo,
|
|
78
70
|
mode: "tenant",
|
|
@@ -80,7 +72,7 @@ export async function createClient(options = {}, _refreshAttempt = 0) {
|
|
|
80
72
|
};
|
|
81
73
|
return { authInfo: tenantAuthInfo };
|
|
82
74
|
}
|
|
83
|
-
throw new CliError("TOKEN_EXPIRED", "token
|
|
75
|
+
throw new CliError("TOKEN_EXPIRED", "token 已过期且无 refresh_token,请重新运行 feishu-docs login", {
|
|
84
76
|
recovery: "运行 feishu-docs login 重新认证",
|
|
85
77
|
});
|
|
86
78
|
}
|
|
@@ -162,65 +154,189 @@ export async function fetchWithAuth(authInfo, path, options = {}) {
|
|
|
162
154
|
if (options.body) {
|
|
163
155
|
fetchOpts.body = JSON.stringify(options.body);
|
|
164
156
|
}
|
|
165
|
-
const
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
157
|
+
const retryEnabled = options.retry !== false;
|
|
158
|
+
const retryOpts = retryEnabled
|
|
159
|
+
? {
|
|
160
|
+
...DEFAULT_RETRY,
|
|
161
|
+
...(typeof options.retry === "object" ? options.retry : {}),
|
|
162
|
+
}
|
|
163
|
+
: { maxRetries: 0, initialDelay: 0, maxDelay: 0 };
|
|
164
|
+
const maxAttempts = retryOpts.maxRetries + 1;
|
|
165
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
166
|
+
const controller = new AbortController();
|
|
167
|
+
const timeoutId = setTimeout(() => controller.abort(), 30_000);
|
|
168
|
+
let res;
|
|
169
|
+
try {
|
|
170
|
+
res = await fetch(url.toString(), {
|
|
171
|
+
...fetchOpts,
|
|
172
|
+
signal: controller.signal,
|
|
179
173
|
});
|
|
180
174
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
175
|
+
catch (err) {
|
|
176
|
+
const error = err;
|
|
177
|
+
clearTimeout(timeoutId);
|
|
178
|
+
if (error.name === "AbortError") {
|
|
179
|
+
if (retryEnabled && attempt < retryOpts.maxRetries) {
|
|
180
|
+
process.stderr.write(`feishu-docs: info: API 请求失败(超时),第 ${attempt + 1} 次重试...\n`);
|
|
181
|
+
const delay = calculateDelay(attempt, retryOpts.initialDelay, retryOpts.maxDelay);
|
|
182
|
+
await sleep(delay);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
throw new CliError("API_ERROR", "API 请求超时(30秒)", {
|
|
186
|
+
retryable: true,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
throw err;
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
clearTimeout(timeoutId);
|
|
193
|
+
}
|
|
194
|
+
// Check for retryable HTTP status (only when retry is enabled)
|
|
195
|
+
if (retryEnabled && isRetryable(res.status)) {
|
|
196
|
+
if (attempt < retryOpts.maxRetries) {
|
|
197
|
+
process.stderr.write(`feishu-docs: info: API 请求失败(${res.status}),第 ${attempt + 1} 次重试...\n`);
|
|
198
|
+
const retryAfterDelay = res.status === 429
|
|
199
|
+
? parseRetryAfter(res.headers.get("Retry-After"))
|
|
200
|
+
: null;
|
|
201
|
+
const delay = retryAfterDelay ??
|
|
202
|
+
calculateDelay(attempt, retryOpts.initialDelay, retryOpts.maxDelay);
|
|
203
|
+
await sleep(delay);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
throw new CliError("API_ERROR", `API 请求失败: HTTP ${res.status} ${res.statusText}`, { retryable: true });
|
|
207
|
+
}
|
|
208
|
+
const body = (await res.json());
|
|
209
|
+
if (body.code !== undefined && body.code !== 0) {
|
|
210
|
+
// Scope errors: extract missing scopes from permission_violations
|
|
211
|
+
if (body.code === 99991672 || body.code === 99991679) {
|
|
212
|
+
const scopes = extractScopesFromError(body);
|
|
213
|
+
const scopeStr = scopes.length > 0 ? scopes.join(" ") : "";
|
|
214
|
+
const hint = scopes.length > 0
|
|
215
|
+
? `缺少以下权限: ${scopes.join(", ")}。运行: feishu-docs authorize --scope "${scopeStr}"`
|
|
216
|
+
: body.msg || "权限不足";
|
|
217
|
+
throw new CliError("SCOPE_MISSING", hint, {
|
|
218
|
+
apiCode: body.code,
|
|
219
|
+
missingScopes: scopes,
|
|
220
|
+
recovery: scopes.length > 0
|
|
221
|
+
? `feishu-docs authorize --scope "${scopeStr}"`
|
|
222
|
+
: "检查飞书开发者后台的应用权限配置",
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
throw mapApiError({ code: body.code, msg: body.msg });
|
|
226
|
+
}
|
|
227
|
+
return body;
|
|
189
228
|
}
|
|
190
|
-
|
|
229
|
+
// Unreachable — loop always returns or throws
|
|
230
|
+
throw new CliError("API_ERROR", "API 请求异常:重试逻辑未正常退出");
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Extract scope names from Feishu API error response.
|
|
234
|
+
*
|
|
235
|
+
* Newer APIs include `error.permission_violations[].subject` with exact scope names.
|
|
236
|
+
* Older APIs may omit this field entirely — returns empty array in that case.
|
|
237
|
+
*/
|
|
238
|
+
function extractScopesFromError(body) {
|
|
239
|
+
const error = body.error;
|
|
240
|
+
const violations = error?.permission_violations;
|
|
241
|
+
if (!Array.isArray(violations))
|
|
242
|
+
return [];
|
|
243
|
+
return violations
|
|
244
|
+
.map((v) => v.subject)
|
|
245
|
+
.filter((s) => typeof s === "string" && s.length > 0);
|
|
191
246
|
}
|
|
192
247
|
/**
|
|
193
248
|
* Fetch binary data with auth (for APIs that return file streams).
|
|
194
249
|
*/
|
|
195
|
-
export async function fetchBinaryWithAuth(authInfo, path) {
|
|
250
|
+
export async function fetchBinaryWithAuth(authInfo, path, options = {}) {
|
|
196
251
|
const base = getApiBase(authInfo);
|
|
197
252
|
const bearer = await resolveBearer(authInfo);
|
|
198
253
|
const url = new URL(path, base);
|
|
199
|
-
const
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
254
|
+
const retryEnabled = options.retry !== false;
|
|
255
|
+
const retryOpts = retryEnabled
|
|
256
|
+
? {
|
|
257
|
+
...DEFAULT_RETRY,
|
|
258
|
+
...(typeof options.retry === "object" ? options.retry : {}),
|
|
259
|
+
}
|
|
260
|
+
: { maxRetries: 0, initialDelay: 0, maxDelay: 0 };
|
|
261
|
+
const maxAttempts = retryOpts.maxRetries + 1;
|
|
262
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
263
|
+
const controller = new AbortController();
|
|
264
|
+
const timeoutId = setTimeout(() => controller.abort(), 60_000);
|
|
265
|
+
let res;
|
|
266
|
+
try {
|
|
267
|
+
res = await fetch(url.toString(), {
|
|
268
|
+
method: "GET",
|
|
269
|
+
headers: { Authorization: bearer },
|
|
270
|
+
signal: controller.signal,
|
|
214
271
|
});
|
|
215
272
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
273
|
+
catch (err) {
|
|
274
|
+
const error = err;
|
|
275
|
+
clearTimeout(timeoutId);
|
|
276
|
+
if (error.name === "AbortError") {
|
|
277
|
+
if (retryEnabled && attempt < retryOpts.maxRetries) {
|
|
278
|
+
process.stderr.write(`feishu-docs: info: API 请求失败(超时),第 ${attempt + 1} 次重试...\n`);
|
|
279
|
+
const delay = calculateDelay(attempt, retryOpts.initialDelay, retryOpts.maxDelay);
|
|
280
|
+
await sleep(delay);
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
throw new CliError("API_ERROR", "API 请求超时(60秒)", {
|
|
284
|
+
retryable: true,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
throw err;
|
|
288
|
+
}
|
|
289
|
+
finally {
|
|
290
|
+
clearTimeout(timeoutId);
|
|
291
|
+
}
|
|
292
|
+
// Check for retryable HTTP status before processing body
|
|
293
|
+
if (isRetryable(res.status)) {
|
|
294
|
+
if (retryEnabled && attempt < retryOpts.maxRetries) {
|
|
295
|
+
process.stderr.write(`feishu-docs: info: API 请求失败(${res.status}),第 ${attempt + 1} 次重试...\n`);
|
|
296
|
+
const retryAfterDelay = res.status === 429
|
|
297
|
+
? parseRetryAfter(res.headers.get("Retry-After"))
|
|
298
|
+
: null;
|
|
299
|
+
const delay = retryAfterDelay ??
|
|
300
|
+
calculateDelay(attempt, retryOpts.initialDelay, retryOpts.maxDelay);
|
|
301
|
+
await sleep(delay);
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
throw new CliError("API_ERROR", `下载失败: HTTP ${res.status} ${res.statusText}`, { retryable: true });
|
|
305
|
+
}
|
|
306
|
+
if (!res.ok) {
|
|
307
|
+
const contentType = res.headers.get("content-type") || "";
|
|
308
|
+
if (contentType.includes("application/json")) {
|
|
309
|
+
let body;
|
|
310
|
+
try {
|
|
311
|
+
body = await res.json();
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
throw new CliError("API_ERROR", `下载失败: HTTP ${res.status} ${res.statusText}`);
|
|
315
|
+
}
|
|
316
|
+
if (body.code === 99991672 || body.code === 99991679) {
|
|
317
|
+
const scopes = extractScopesFromError(body);
|
|
318
|
+
const scopeStr = scopes.length > 0 ? scopes.join(" ") : "";
|
|
319
|
+
const hint = scopes.length > 0
|
|
320
|
+
? `缺少以下权限: ${scopes.join(", ")}。运行: feishu-docs authorize --scope "${scopeStr}"`
|
|
321
|
+
: body.msg || "权限不足";
|
|
322
|
+
throw new CliError("SCOPE_MISSING", hint, {
|
|
323
|
+
apiCode: body.code,
|
|
324
|
+
missingScopes: scopes,
|
|
325
|
+
recovery: scopes.length > 0
|
|
326
|
+
? `feishu-docs authorize --scope "${scopeStr}"`
|
|
327
|
+
: "检查飞书开发者后台的应用权限配置",
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
throw mapApiError({
|
|
331
|
+
code: body.code,
|
|
332
|
+
msg: body.msg,
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
throw new CliError("API_ERROR", `下载失败: HTTP ${res.status} ${res.statusText}`);
|
|
336
|
+
}
|
|
337
|
+
return res.arrayBuffer();
|
|
223
338
|
}
|
|
224
|
-
|
|
339
|
+
// Unreachable — loop always returns or throws
|
|
340
|
+
throw new CliError("API_ERROR", "API 请求异常:重试逻辑未正常退出");
|
|
225
341
|
}
|
|
226
342
|
//# 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":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Reads currently stored scopes, merges with the requested ones, and
|
|
5
5
|
* re-runs the OAuth flow so the user grants only what is needed.
|
|
6
|
+
*
|
|
7
|
+
* Scopes to request typically come from API error messages — when a command
|
|
8
|
+
* fails with SCOPE_MISSING, the error includes the exact scope names needed.
|
|
6
9
|
*/
|
|
7
10
|
import { CommandMeta, CommandArgs, GlobalOpts } from "../types/index.js";
|
|
8
11
|
export declare const meta: CommandMeta;
|
|
@@ -3,16 +3,18 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Reads currently stored scopes, merges with the requested ones, and
|
|
5
5
|
* re-runs the OAuth flow so the user grants only what is needed.
|
|
6
|
+
*
|
|
7
|
+
* Scopes to request typically come from API error messages — when a command
|
|
8
|
+
* fails with SCOPE_MISSING, the error includes the exact scope names needed.
|
|
6
9
|
*/
|
|
7
10
|
import { oauthLogin, loadTokens } from "../auth.js";
|
|
8
11
|
import { CliError } from "../utils/errors.js";
|
|
9
|
-
import {
|
|
12
|
+
import { BASE_SCOPES, mergeScopes } from "../scopes.js";
|
|
10
13
|
/** Feishu scope tokens follow the pattern: word:word or word:word:word */
|
|
11
14
|
const SCOPE_TOKEN_RE = /^\w[\w-]*:[\w.:/-]+$/;
|
|
12
15
|
export const meta = {
|
|
13
16
|
options: {
|
|
14
17
|
scope: { type: "string" },
|
|
15
|
-
feature: { type: "string" },
|
|
16
18
|
port: { type: "string" },
|
|
17
19
|
"redirect-uri": { type: "string" },
|
|
18
20
|
},
|
|
@@ -25,46 +27,26 @@ export async function authorize(args, globalOpts) {
|
|
|
25
27
|
if (!appId || !appSecret) {
|
|
26
28
|
throw new CliError("AUTH_REQUIRED", "请先设置 FEISHU_APP_ID 和 FEISHU_APP_SECRET 环境变量");
|
|
27
29
|
}
|
|
28
|
-
if (!args.scope
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
throw new CliError("INVALID_ARGS", `请指定 --scope 或 --feature。\n\n可用功能权限:\n${featureList}\n\n示例:\n feishu-docs authorize --feature drive\n feishu-docs authorize --feature drive,contact\n feishu-docs authorize --scope "drive:drive"`);
|
|
30
|
+
if (!args.scope) {
|
|
31
|
+
throw new CliError("INVALID_ARGS", `请指定 --scope 参数。\n\n` +
|
|
32
|
+
`示例:\n` +
|
|
33
|
+
` feishu-docs authorize --scope "drive:drive"\n` +
|
|
34
|
+
` feishu-docs authorize --scope "drive:drive contact:contact.base:readonly"\n\n` +
|
|
35
|
+
`提示: 当命令因权限不足失败时,错误信息中会包含所需的 scope 名称。`);
|
|
35
36
|
}
|
|
36
|
-
//
|
|
37
|
+
// Parse and validate scopes
|
|
38
|
+
const rawScopes = args.scope.split(/\s+/).filter(Boolean);
|
|
37
39
|
const extraScopes = [];
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
.map((s) => s.trim())
|
|
42
|
-
.filter(Boolean);
|
|
43
|
-
for (const name of featureNames) {
|
|
44
|
-
if (!FEATURE_NAMES.includes(name)) {
|
|
45
|
-
throw new CliError("INVALID_ARGS", `未知功能: ${name}。可用值: ${FEATURE_NAMES.join(", ")}`);
|
|
46
|
-
}
|
|
47
|
-
extraScopes.push(...FEATURE_SCOPE_GROUPS[name].scopes);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
if (args.scope) {
|
|
51
|
-
const rawScopes = args.scope.split(/\s+/).filter(Boolean);
|
|
52
|
-
for (const s of rawScopes) {
|
|
53
|
-
if (!SCOPE_TOKEN_RE.test(s)) {
|
|
54
|
-
throw new CliError("INVALID_ARGS", `无效的 scope 格式: "${s}"。scope 应为 "namespace:resource" 或 "namespace:resource:action" 格式`);
|
|
55
|
-
}
|
|
56
|
-
if (!ALL_KNOWN_SCOPES.has(s)) {
|
|
57
|
-
process.stderr.write(`feishu-docs: warning: 未知的 scope "${s}",将原样传给飞书,请确认拼写正确。\n`);
|
|
58
|
-
}
|
|
40
|
+
for (const s of rawScopes) {
|
|
41
|
+
if (!SCOPE_TOKEN_RE.test(s)) {
|
|
42
|
+
throw new CliError("INVALID_ARGS", `无效的 scope 格式: "${s}"。scope 应为 "namespace:resource" 或 "namespace:resource:action" 格式`);
|
|
59
43
|
}
|
|
60
|
-
extraScopes.push(
|
|
44
|
+
extraScopes.push(s);
|
|
61
45
|
}
|
|
62
46
|
if (extraScopes.length === 0) {
|
|
63
47
|
throw new CliError("INVALID_ARGS", "未指定任何有效的 scope,操作已取消");
|
|
64
48
|
}
|
|
65
49
|
// Merge with currently stored scopes (so we don't lose existing grants).
|
|
66
|
-
// loadTokens() is called after createClient() would have finished any pending
|
|
67
|
-
// refresh, so the stored scope reflects the latest saved token.
|
|
68
50
|
const stored = await loadTokens();
|
|
69
51
|
const currentScopes = stored?.tokens?.scope
|
|
70
52
|
? stored.tokens.scope.split(/\s+/).filter(Boolean)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authorize.js","sourceRoot":"","sources":["../../src/commands/authorize.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"authorize.js","sourceRoot":"","sources":["../../src/commands/authorize.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/cp.js
CHANGED
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { createClient, fetchWithAuth } from "../client.js";
|
|
8
8
|
import { CliError } from "../utils/errors.js";
|
|
9
|
-
import {
|
|
10
|
-
import { ensureScopes } from "../utils/scope-prompt.js";
|
|
9
|
+
import { withScopeRecovery } from "../utils/scope-prompt.js";
|
|
11
10
|
import { resolveDocument } from "../utils/document-resolver.js";
|
|
12
11
|
import { validateToken } from "../utils/validate.js";
|
|
13
12
|
export const meta = {
|
|
@@ -24,33 +23,48 @@ export async function cp(args, globalOpts) {
|
|
|
24
23
|
throw new CliError("INVALID_ARGS", '用法: feishu-docs cp <url|token> <target_folder_token> [--name "副本名称"]');
|
|
25
24
|
}
|
|
26
25
|
validateToken(targetFolder, "target_folder_token");
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
26
|
+
return withScopeRecovery(async () => {
|
|
27
|
+
const { authInfo } = await createClient(globalOpts);
|
|
28
|
+
const doc = await resolveDocument(authInfo, input);
|
|
29
|
+
const fileToken = doc.objToken;
|
|
30
|
+
const type = doc.objType;
|
|
31
|
+
// Determine copy name: use --name if provided, otherwise fetch original title
|
|
32
|
+
let copyName = args.name;
|
|
33
|
+
if (!copyName) {
|
|
34
|
+
let title = doc.title;
|
|
35
|
+
if (!title) {
|
|
36
|
+
// Fetch title via document API for non-wiki documents
|
|
37
|
+
try {
|
|
38
|
+
const docRes = await fetchWithAuth(authInfo, `/open-apis/docx/v1/documents/${encodeURIComponent(fileToken)}`);
|
|
39
|
+
title = docRes?.data?.document
|
|
40
|
+
? docRes.data.document
|
|
41
|
+
.title
|
|
42
|
+
: undefined;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Non-critical: fall back to token-based name
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
copyName = title ? `${title} - 副本` : `${fileToken} - 副本`;
|
|
49
|
+
}
|
|
50
|
+
const res = await fetchWithAuth(authInfo, `/open-apis/drive/v1/files/${encodeURIComponent(fileToken)}/copy`, {
|
|
51
|
+
method: "POST",
|
|
52
|
+
body: { type, name: copyName, folder_token: targetFolder },
|
|
53
|
+
});
|
|
54
|
+
const resData = res?.data;
|
|
55
|
+
const newFile = resData?.file;
|
|
56
|
+
const newToken = newFile?.token || "";
|
|
57
|
+
if (globalOpts.json) {
|
|
58
|
+
process.stdout.write(JSON.stringify({
|
|
59
|
+
success: true,
|
|
60
|
+
file_token: newToken,
|
|
61
|
+
name: copyName,
|
|
62
|
+
folder_token: targetFolder,
|
|
63
|
+
}) + "\n");
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
process.stdout.write(`已复制为 "${copyName}" (${newToken}) 到文件夹 ${targetFolder}\n`);
|
|
67
|
+
}
|
|
68
|
+
}, globalOpts);
|
|
55
69
|
}
|
|
56
70
|
//# sourceMappingURL=cp.js.map
|
package/dist/commands/cp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cp.js","sourceRoot":"","sources":["../../src/commands/cp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cp.js","sourceRoot":"","sources":["../../src/commands/cp.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/create.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { createClient, fetchWithAuth } from "../client.js";
|
|
5
5
|
import { CliError } from "../utils/errors.js";
|
|
6
|
-
import { convertAndWrite } from "../services/markdown-convert.js";
|
|
6
|
+
import { convertAndWrite, extractMarkdownTitle, } from "../services/markdown-convert.js";
|
|
7
7
|
import { readBody, getDocumentInfo } from "../services/block-writer.js";
|
|
8
8
|
import { validateToken } from "../utils/validate.js";
|
|
9
9
|
export const meta = {
|
|
@@ -17,17 +17,31 @@ export const meta = {
|
|
|
17
17
|
handler: create,
|
|
18
18
|
};
|
|
19
19
|
export async function create(args, globalOpts) {
|
|
20
|
-
|
|
21
|
-
if (!title) {
|
|
22
|
-
throw new CliError("INVALID_ARGS", "缺少文档标题。用法: feishu-docs create <title> [--wiki <space_id>] [--body <file>]");
|
|
23
|
-
}
|
|
20
|
+
let title = args.positionals[0];
|
|
24
21
|
const { authInfo } = await createClient(globalOpts);
|
|
25
22
|
let bodyContent;
|
|
26
23
|
if (args.body) {
|
|
27
|
-
|
|
28
|
-
if (!
|
|
24
|
+
const rawBody = await readBody(args.body);
|
|
25
|
+
if (!rawBody.trim()) {
|
|
29
26
|
throw new CliError("INVALID_ARGS", "文档内容为空,至少需要一行内容");
|
|
30
27
|
}
|
|
28
|
+
// Only extract H1 when no title argument — avoid stripping content headings
|
|
29
|
+
if (!title) {
|
|
30
|
+
const { title: extractedTitle, body: strippedBody } = extractMarkdownTitle(rawBody);
|
|
31
|
+
if (extractedTitle) {
|
|
32
|
+
title = extractedTitle;
|
|
33
|
+
bodyContent = strippedBody.trim() ? strippedBody : undefined;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
bodyContent = rawBody;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
bodyContent = rawBody;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!title) {
|
|
44
|
+
throw new CliError("INVALID_ARGS", "缺少文档标题。用法: feishu-docs create <title> [--body <file>] 或在 Markdown 文件中使用 # 标题");
|
|
31
45
|
}
|
|
32
46
|
if (args.wiki) {
|
|
33
47
|
validateToken(args.wiki, "space_id");
|
|
@@ -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,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|