feishu-docs-cli 0.1.0-beta.8 → 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 +70 -13
- package/README.zh.md +53 -13
- package/dist/auth.js +31 -17
- package/dist/auth.js.map +1 -1
- package/dist/cli.js +16 -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.d.ts +9 -0
- package/dist/commands/cp.js +70 -0
- package/dist/commands/cp.js.map +1 -0
- 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.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 +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.d.ts +1 -1
- package/dist/commands/share.js +164 -91
- 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 +37 -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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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cp command: Copy a file to a different folder in cloud drive.
|
|
3
|
+
*
|
|
4
|
+
* The copy API requires a name. If --name is not provided,
|
|
5
|
+
* the original document title is fetched and " - 副本" is appended.
|
|
6
|
+
*/
|
|
7
|
+
import { CommandMeta, CommandArgs, GlobalOpts } from "../types/index.js";
|
|
8
|
+
export declare const meta: CommandMeta;
|
|
9
|
+
export declare function cp(args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cp command: Copy a file to a different folder in cloud drive.
|
|
3
|
+
*
|
|
4
|
+
* The copy API requires a name. If --name is not provided,
|
|
5
|
+
* the original document title is fetched and " - 副本" is appended.
|
|
6
|
+
*/
|
|
7
|
+
import { createClient, fetchWithAuth } from "../client.js";
|
|
8
|
+
import { CliError } from "../utils/errors.js";
|
|
9
|
+
import { withScopeRecovery } from "../utils/scope-prompt.js";
|
|
10
|
+
import { resolveDocument } from "../utils/document-resolver.js";
|
|
11
|
+
import { validateToken } from "../utils/validate.js";
|
|
12
|
+
export const meta = {
|
|
13
|
+
options: {
|
|
14
|
+
name: { type: "string" },
|
|
15
|
+
},
|
|
16
|
+
positionals: true,
|
|
17
|
+
handler: cp,
|
|
18
|
+
};
|
|
19
|
+
export async function cp(args, globalOpts) {
|
|
20
|
+
const input = args.positionals[0];
|
|
21
|
+
const targetFolder = args.positionals[1];
|
|
22
|
+
if (!input || !targetFolder) {
|
|
23
|
+
throw new CliError("INVALID_ARGS", '用法: feishu-docs cp <url|token> <target_folder_token> [--name "副本名称"]');
|
|
24
|
+
}
|
|
25
|
+
validateToken(targetFolder, "target_folder_token");
|
|
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);
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=cp.js.map
|
|
@@ -0,0 +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,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,CAAC,MAAM,IAAI,GAAgB;IAC/B,OAAO,EAAE;QACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACzB;IACD,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,EAAE,CACtB,IAAiB,EACjB,UAAsB;IAEtB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAY,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAY,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAChB,cAAc,EACd,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;IAEnD,OAAO,iBAAiB,CAAC,KAAK,IAAI,EAAE;QAClC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC;QAEzB,8EAA8E;QAC9E,IAAI,QAAQ,GAAG,IAAI,CAAC,IAA0B,CAAC;QAC/C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,sDAAsD;gBACtD,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,QAAQ,EACR,gCAAgC,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAChE,CAAC;oBACF,KAAK,GAAI,MAAM,EAAE,IAAgC,EAAE,QAAQ;wBACzD,CAAC,CAAG,MAAM,CAAC,IAA+C,CAAC,QAAQ;6BAC9D,KAAgB;wBACrB,CAAC,CAAC,SAAS,CAAC;gBAChB,CAAC;gBAAC,MAAM,CAAC;oBACP,8CAA8C;gBAChD,CAAC;YACH,CAAC;YACD,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,OAAO,CAAC;QAC3D,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,aAAa,CAC7B,QAAQ,EACR,6BAA6B,kBAAkB,CAAC,SAAS,CAAC,OAAO,EACjE;YACE,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE;SAC3D,CACF,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE,IAA2C,CAAC;QACjE,MAAM,OAAO,GAAG,OAAO,EAAE,IAA0C,CAAC;QACpE,MAAM,QAAQ,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QAEtC,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;gBACb,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,QAAQ;gBACpB,IAAI,EAAE,QAAQ;gBACd,YAAY,EAAE,YAAY;aAC3B,CAAC,GAAG,IAAI,CACV,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,SAAS,QAAQ,MAAM,QAAQ,UAAU,YAAY,IAAI,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAC;AACjB,CAAC"}
|
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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"}
|