feishu-docs-cli 0.1.0-beta.2

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.
Files changed (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +333 -0
  3. package/README.zh.md +332 -0
  4. package/bin/feishu-docs.js +8 -0
  5. package/dist/auth.d.ts +76 -0
  6. package/dist/auth.js +512 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/cli.d.ts +5 -0
  9. package/dist/cli.js +166 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client.d.ts +42 -0
  12. package/dist/client.js +269 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/commands/cat.d.ts +6 -0
  15. package/dist/commands/cat.js +151 -0
  16. package/dist/commands/cat.js.map +1 -0
  17. package/dist/commands/create.d.ts +6 -0
  18. package/dist/commands/create.js +120 -0
  19. package/dist/commands/create.js.map +1 -0
  20. package/dist/commands/delete.d.ts +6 -0
  21. package/dist/commands/delete.js +89 -0
  22. package/dist/commands/delete.js.map +1 -0
  23. package/dist/commands/info.d.ts +6 -0
  24. package/dist/commands/info.js +69 -0
  25. package/dist/commands/info.js.map +1 -0
  26. package/dist/commands/login.d.ts +10 -0
  27. package/dist/commands/login.js +90 -0
  28. package/dist/commands/login.js.map +1 -0
  29. package/dist/commands/ls.d.ts +6 -0
  30. package/dist/commands/ls.js +76 -0
  31. package/dist/commands/ls.js.map +1 -0
  32. package/dist/commands/read.d.ts +6 -0
  33. package/dist/commands/read.js +404 -0
  34. package/dist/commands/read.js.map +1 -0
  35. package/dist/commands/search.d.ts +7 -0
  36. package/dist/commands/search.js +87 -0
  37. package/dist/commands/search.js.map +1 -0
  38. package/dist/commands/share.d.ts +13 -0
  39. package/dist/commands/share.js +210 -0
  40. package/dist/commands/share.js.map +1 -0
  41. package/dist/commands/spaces.d.ts +6 -0
  42. package/dist/commands/spaces.js +43 -0
  43. package/dist/commands/spaces.js.map +1 -0
  44. package/dist/commands/tree.d.ts +6 -0
  45. package/dist/commands/tree.js +101 -0
  46. package/dist/commands/tree.js.map +1 -0
  47. package/dist/commands/update.d.ts +9 -0
  48. package/dist/commands/update.js +211 -0
  49. package/dist/commands/update.js.map +1 -0
  50. package/dist/commands/wiki.d.ts +6 -0
  51. package/dist/commands/wiki.js +284 -0
  52. package/dist/commands/wiki.js.map +1 -0
  53. package/dist/parser/block-types.d.ts +141 -0
  54. package/dist/parser/block-types.js +167 -0
  55. package/dist/parser/block-types.js.map +1 -0
  56. package/dist/parser/blocks-to-md.d.ts +26 -0
  57. package/dist/parser/blocks-to-md.js +576 -0
  58. package/dist/parser/blocks-to-md.js.map +1 -0
  59. package/dist/parser/text-elements.d.ts +13 -0
  60. package/dist/parser/text-elements.js +91 -0
  61. package/dist/parser/text-elements.js.map +1 -0
  62. package/dist/services/block-writer.d.ts +30 -0
  63. package/dist/services/block-writer.js +131 -0
  64. package/dist/services/block-writer.js.map +1 -0
  65. package/dist/services/doc-blocks.d.ts +9 -0
  66. package/dist/services/doc-blocks.js +30 -0
  67. package/dist/services/doc-blocks.js.map +1 -0
  68. package/dist/services/markdown-convert.d.ts +51 -0
  69. package/dist/services/markdown-convert.js +109 -0
  70. package/dist/services/markdown-convert.js.map +1 -0
  71. package/dist/services/wiki-nodes.d.ts +21 -0
  72. package/dist/services/wiki-nodes.js +47 -0
  73. package/dist/services/wiki-nodes.js.map +1 -0
  74. package/dist/types/index.d.ts +234 -0
  75. package/dist/types/index.js +5 -0
  76. package/dist/types/index.js.map +1 -0
  77. package/dist/utils/document-resolver.d.ts +28 -0
  78. package/dist/utils/document-resolver.js +47 -0
  79. package/dist/utils/document-resolver.js.map +1 -0
  80. package/dist/utils/drive-types.d.ts +4 -0
  81. package/dist/utils/drive-types.js +16 -0
  82. package/dist/utils/drive-types.js.map +1 -0
  83. package/dist/utils/errors.d.ts +21 -0
  84. package/dist/utils/errors.js +110 -0
  85. package/dist/utils/errors.js.map +1 -0
  86. package/dist/utils/member.d.ts +11 -0
  87. package/dist/utils/member.js +30 -0
  88. package/dist/utils/member.js.map +1 -0
  89. package/dist/utils/url-parser.d.ts +5 -0
  90. package/dist/utils/url-parser.js +55 -0
  91. package/dist/utils/url-parser.js.map +1 -0
  92. package/dist/utils/validate.d.ts +8 -0
  93. package/dist/utils/validate.js +15 -0
  94. package/dist/utils/validate.js.map +1 -0
  95. package/package.json +54 -0
@@ -0,0 +1,6 @@
1
+ /**
2
+ * create command: Create new documents in wiki or drive.
3
+ */
4
+ import { CommandMeta, CommandArgs, GlobalOpts } from "../types/index.js";
5
+ export declare const meta: CommandMeta;
6
+ export declare function create(args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;
@@ -0,0 +1,120 @@
1
+ /**
2
+ * create command: Create new documents in wiki or drive.
3
+ */
4
+ import { createClient, fetchWithAuth } from "../client.js";
5
+ import { CliError } from "../utils/errors.js";
6
+ import { convertAndWrite } from "../services/markdown-convert.js";
7
+ import { readBody, getDocumentInfo } from "../services/block-writer.js";
8
+ import { validateToken } from "../utils/validate.js";
9
+ export const meta = {
10
+ options: {
11
+ wiki: { type: "string" },
12
+ folder: { type: "string" },
13
+ parent: { type: "string" },
14
+ body: { type: "string" },
15
+ },
16
+ positionals: true,
17
+ handler: create,
18
+ };
19
+ export async function create(args, globalOpts) {
20
+ const title = args.positionals[0];
21
+ if (!title) {
22
+ throw new CliError("INVALID_ARGS", "缺少文档标题。用法: feishu-docs create <title> [--wiki <space_id>] [--body <file>]");
23
+ }
24
+ const { client, authInfo } = await createClient(globalOpts);
25
+ let bodyContent;
26
+ if (args.body) {
27
+ bodyContent = await readBody(args.body);
28
+ if (!bodyContent.trim()) {
29
+ throw new CliError("INVALID_ARGS", "文档内容为空,至少需要一行内容");
30
+ }
31
+ }
32
+ if (args.wiki) {
33
+ validateToken(args.wiki, "space_id");
34
+ if (args.parent)
35
+ validateToken(args.parent, "parent_node_token");
36
+ return createInWiki(client, authInfo, title, args.wiki, args.parent, bodyContent, globalOpts);
37
+ }
38
+ if (args.folder) {
39
+ validateToken(args.folder, "folder_token");
40
+ }
41
+ return createDoc(client, authInfo, title, args.folder, bodyContent, globalOpts);
42
+ }
43
+ async function createInWiki(client, authInfo, title, spaceId, parentNodeToken, bodyContent, globalOpts) {
44
+ const nodeRes = await fetchWithAuth(authInfo, `/open-apis/wiki/v2/spaces/${encodeURIComponent(spaceId)}/nodes`, {
45
+ method: "POST",
46
+ body: {
47
+ obj_type: "docx",
48
+ node_type: "origin",
49
+ title,
50
+ ...(parentNodeToken && { parent_node_token: parentNodeToken }),
51
+ },
52
+ });
53
+ const nodeData = nodeRes?.data;
54
+ const node = (nodeData?.node || {});
55
+ const objToken = node.obj_token;
56
+ const nodeToken = node.node_token;
57
+ if (!objToken) {
58
+ throw new CliError("API_ERROR", "创建知识库节点成功但未返回 obj_token");
59
+ }
60
+ if (bodyContent) {
61
+ const docInfo = await getDocumentInfo(client, authInfo, objToken);
62
+ await convertAndWrite(authInfo, objToken, bodyContent, docInfo.revisionId);
63
+ }
64
+ const domain = globalOpts.lark ? "larksuite.com" : "feishu.cn";
65
+ const wikiUrl = `https://${domain}/wiki/${nodeToken}`;
66
+ const docUrl = `https://${domain}/docx/${objToken}`;
67
+ const output = {
68
+ document_id: objToken,
69
+ ...(nodeToken && { node_token: nodeToken }),
70
+ space_id: spaceId,
71
+ title,
72
+ wiki_url: wikiUrl,
73
+ doc_url: docUrl,
74
+ };
75
+ if (globalOpts.json) {
76
+ process.stdout.write(JSON.stringify({ success: true, ...output }, null, 2) + "\n");
77
+ }
78
+ else {
79
+ process.stdout.write(`文档已创建\n`);
80
+ process.stdout.write(` 标题: ${title}\n`);
81
+ process.stdout.write(` document_id: ${objToken}\n`);
82
+ if (nodeToken) {
83
+ process.stdout.write(` node_token: ${nodeToken}\n`);
84
+ }
85
+ process.stdout.write(` URL: ${wikiUrl}\n`);
86
+ }
87
+ }
88
+ async function createDoc(client, authInfo, title, folderToken, bodyContent, globalOpts) {
89
+ const body = {
90
+ title,
91
+ ...(folderToken && { folder_token: folderToken }),
92
+ };
93
+ const res = await fetchWithAuth(authInfo, `/open-apis/docx/v1/documents`, {
94
+ method: "POST",
95
+ body,
96
+ });
97
+ const resData = res?.data;
98
+ const doc = (resData?.document || {});
99
+ const documentId = doc.document_id;
100
+ if (!documentId) {
101
+ throw new CliError("API_ERROR", "创建文档成功但未返回 document_id");
102
+ }
103
+ if (bodyContent) {
104
+ const docInfo = await getDocumentInfo(client, authInfo, documentId);
105
+ await convertAndWrite(authInfo, documentId, bodyContent, docInfo.revisionId);
106
+ }
107
+ const domain = globalOpts.lark ? "larksuite.com" : "feishu.cn";
108
+ const url = `https://${domain}/docx/${documentId}`;
109
+ const output = { document_id: documentId, title: doc.title, url };
110
+ if (globalOpts.json) {
111
+ process.stdout.write(JSON.stringify({ success: true, ...output }, null, 2) + "\n");
112
+ }
113
+ else {
114
+ process.stdout.write(`文档已创建\n`);
115
+ process.stdout.write(` 标题: ${doc.title}\n`);
116
+ process.stdout.write(` document_id: ${documentId}\n`);
117
+ process.stdout.write(` URL: ${url}\n`);
118
+ }
119
+ }
120
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * delete command: Move document to recycle bin.
3
+ */
4
+ import { CommandMeta, CommandArgs, GlobalOpts } from "../types/index.js";
5
+ export declare const meta: CommandMeta;
6
+ export declare function del(args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;
@@ -0,0 +1,89 @@
1
+ /**
2
+ * delete command: Move document to recycle bin.
3
+ */
4
+ import { createClient, fetchWithAuth } from "../client.js";
5
+ import { CliError } from "../utils/errors.js";
6
+ import { resolveDocument } from "../utils/document-resolver.js";
7
+ import { mapToDriveType } from "../utils/drive-types.js";
8
+ /**
9
+ * Check if a node has children in the knowledge base.
10
+ */
11
+ async function checkChildren(client, authInfo, spaceId, nodeToken) {
12
+ try {
13
+ const res = await fetchWithAuth(authInfo, `/open-apis/wiki/v2/spaces/${encodeURIComponent(spaceId)}/nodes`, { params: { parent_node_token: nodeToken, page_size: 1 } });
14
+ const data = res?.data;
15
+ return (data?.items?.length || 0) > 0;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ export const meta = {
22
+ options: {
23
+ confirm: { type: "boolean", default: false },
24
+ recursive: { type: "boolean", default: false },
25
+ },
26
+ positionals: true,
27
+ handler: del,
28
+ };
29
+ export async function del(args, globalOpts) {
30
+ const input = args.positionals[0];
31
+ if (!input) {
32
+ throw new CliError("INVALID_ARGS", "缺少文档 URL 或 token。用法: feishu-docs delete <url|token>");
33
+ }
34
+ const { client, authInfo } = await createClient(globalOpts);
35
+ const doc = await resolveDocument(client, authInfo, input);
36
+ if (doc.objType === "doc") {
37
+ throw new CliError("NOT_SUPPORTED", "旧版 doc 类型不支持此操作,请在飞书客户端中将文档升级为 docx 格式");
38
+ }
39
+ // Check for children — refuse unless --recursive
40
+ if (doc.hasChild && doc.spaceId && doc.nodeToken) {
41
+ const hasChildren = await checkChildren(client, authInfo, doc.spaceId, doc.nodeToken);
42
+ if (hasChildren && !args.recursive) {
43
+ throw new CliError("INVALID_ARGS", "该节点下有子文档,删除将同时删除所有子节点。如需继续,请添加 --recursive 参数");
44
+ }
45
+ }
46
+ // Confirmation prompt (unless --confirm)
47
+ if (!args.confirm) {
48
+ const titleStr = doc.title || doc.objToken;
49
+ process.stderr.write(`\n即将删除文档:\n`);
50
+ process.stderr.write(` 标题: ${titleStr}\n`);
51
+ process.stderr.write(` 类型: ${doc.objType}\n`);
52
+ process.stderr.write(` token: ${doc.objToken}\n`);
53
+ if (doc.spaceId) {
54
+ process.stderr.write(` 知识库: ${doc.spaceId}\n`);
55
+ }
56
+ process.stderr.write(`\n 文档将移入回收站,30 天后永久删除。\n`);
57
+ process.stderr.write(` 如需跳过此确认,请添加 --confirm 参数。\n\n`);
58
+ // In non-interactive mode (Agent), just output the prompt and exit
59
+ // Agent should use --confirm
60
+ throw new CliError("INVALID_ARGS", "操作已取消。Agent 调用请添加 --confirm 参数");
61
+ }
62
+ // Wiki documents cannot be deleted via Open API — the drive/v1/files DELETE
63
+ // endpoint only works for files in the user's personal Space, not wiki nodes.
64
+ if (doc.spaceId) {
65
+ throw new CliError("NOT_SUPPORTED", `知识库文档不支持通过 API 删除。飞书开放平台未提供删除知识库节点的 API。\n` +
66
+ ` 请在飞书客户端中手动删除: ${doc.title || doc.objToken}\n` +
67
+ ` 知识库: ${doc.spaceId}, 节点: ${doc.nodeToken}`);
68
+ }
69
+ // Map doc type to drive file type (personal space files only)
70
+ const driveType = mapToDriveType(doc.objType);
71
+ // Execute delete (use fetchWithAuth to avoid SDK token override)
72
+ await fetchWithAuth(authInfo, `/open-apis/drive/v1/files/${encodeURIComponent(doc.objToken)}`, {
73
+ method: "DELETE",
74
+ params: { type: driveType },
75
+ });
76
+ if (globalOpts.json) {
77
+ process.stdout.write(JSON.stringify({
78
+ success: true,
79
+ deleted: doc.objToken,
80
+ title: doc.title,
81
+ type: doc.objType,
82
+ }) + "\n");
83
+ }
84
+ else {
85
+ const titleStr = doc.title || doc.objToken;
86
+ process.stdout.write(`已将 "${titleStr}" 移入回收站\n`);
87
+ }
88
+ }
89
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * info command: Display document metadata.
3
+ */
4
+ import { CommandMeta, CommandArgs, GlobalOpts } from "../types/index.js";
5
+ export declare const meta: CommandMeta;
6
+ export declare function info(args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;
@@ -0,0 +1,69 @@
1
+ /**
2
+ * info command: Display document metadata.
3
+ */
4
+ import { createClient } from "../client.js";
5
+ import { CliError } from "../utils/errors.js";
6
+ import { resolveDocument } from "../utils/document-resolver.js";
7
+ import { getDocumentInfo } from "../services/block-writer.js";
8
+ export const meta = {
9
+ options: {},
10
+ positionals: true,
11
+ handler: info,
12
+ };
13
+ export async function info(args, globalOpts) {
14
+ const input = args.positionals[0];
15
+ if (!input) {
16
+ throw new CliError("INVALID_ARGS", "缺少文档 URL 或 token。用法: feishu-docs info <url|token>");
17
+ }
18
+ const { client, authInfo } = await createClient(globalOpts);
19
+ const doc = await resolveDocument(client, authInfo, input);
20
+ if (doc.objType === "doc") {
21
+ throw new CliError("NOT_SUPPORTED", "旧版 doc 类型不支持此操作,请在飞书客户端中将文档升级为 docx 格式");
22
+ }
23
+ // Fetch additional document info for docx type
24
+ let revisionId;
25
+ let docTitle = doc.title;
26
+ if (doc.objType === "docx") {
27
+ try {
28
+ const docInfo = await getDocumentInfo(client, authInfo, doc.objToken);
29
+ docTitle = docTitle || docInfo.title;
30
+ revisionId = docInfo.revisionId;
31
+ }
32
+ catch (err) {
33
+ process.stderr.write(`feishu-docs: warning: 获取文档详情失败: ${err.message}\n`);
34
+ }
35
+ }
36
+ const domain = globalOpts.lark ? "larksuite.com" : "feishu.cn";
37
+ const url = doc.spaceId
38
+ ? `https://${domain}/wiki/${doc.parsed.token}`
39
+ : `https://${domain}/${doc.objType}/${doc.objToken}`;
40
+ const output = {
41
+ title: docTitle,
42
+ type: doc.objType,
43
+ token: doc.objToken,
44
+ url,
45
+ ...(doc.nodeToken && { node_token: doc.nodeToken }),
46
+ ...(doc.spaceId && { space_id: doc.spaceId }),
47
+ ...(revisionId !== undefined && { revision: revisionId }),
48
+ };
49
+ if (globalOpts.json) {
50
+ process.stdout.write(JSON.stringify({ success: true, ...output }, null, 2) + "\n");
51
+ }
52
+ else {
53
+ if (docTitle)
54
+ process.stdout.write(`标题: ${docTitle}\n`);
55
+ process.stdout.write(`类型: ${doc.objType}\n`);
56
+ process.stdout.write(`URL: ${url}\n`);
57
+ process.stdout.write(`token: ${doc.objToken}\n`);
58
+ if (doc.spaceId) {
59
+ process.stdout.write(`知识库: ${doc.spaceId}\n`);
60
+ }
61
+ if (doc.nodeToken) {
62
+ process.stdout.write(`node_token: ${doc.nodeToken}\n`);
63
+ }
64
+ if (revisionId !== undefined) {
65
+ process.stdout.write(`版本: ${revisionId}\n`);
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../src/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * login / logout / whoami commands.
3
+ */
4
+ import { CommandMeta, CommandArgs, GlobalOpts } from "../types/index.js";
5
+ export declare const loginMeta: CommandMeta;
6
+ export declare const logoutMeta: CommandMeta;
7
+ export declare const whoamiMeta: CommandMeta;
8
+ export declare function login(args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;
9
+ export declare function logout(_args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;
10
+ export declare function whoami(_args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * login / logout / whoami commands.
3
+ */
4
+ import { oauthLogin, clearTokens, resolveAuth } from "../auth.js";
5
+ import { CliError } from "../utils/errors.js";
6
+ export const loginMeta = {
7
+ options: {
8
+ scope: { type: "string" },
9
+ port: { type: "string" },
10
+ "redirect-uri": { type: "string" },
11
+ },
12
+ positionals: false,
13
+ handler: login,
14
+ };
15
+ export const logoutMeta = {
16
+ options: {},
17
+ positionals: false,
18
+ handler: logout,
19
+ };
20
+ export const whoamiMeta = {
21
+ options: {},
22
+ positionals: false,
23
+ handler: whoami,
24
+ };
25
+ export async function login(args, globalOpts) {
26
+ const appId = process.env.FEISHU_APP_ID;
27
+ const appSecret = process.env.FEISHU_APP_SECRET;
28
+ if (!appId || !appSecret) {
29
+ throw new CliError("AUTH_REQUIRED", "请先设置 FEISHU_APP_ID 和 FEISHU_APP_SECRET 环境变量");
30
+ }
31
+ const scope = args.scope ||
32
+ "wiki:wiki docx:document docx:document.block:convert drive:drive contact:contact.base:readonly board:whiteboard:node:read bitable:app:readonly";
33
+ const tokens = await oauthLogin(appId, {
34
+ scope,
35
+ appSecret,
36
+ port: args.port,
37
+ redirectUri: args.redirectUri,
38
+ useLark: globalOpts.lark,
39
+ });
40
+ process.stderr.write("feishu-docs: 登录成功!token 已加密保存。\n");
41
+ if (globalOpts.json) {
42
+ process.stdout.write(JSON.stringify({ success: true, expires_at: tokens.expires_at }) + "\n");
43
+ }
44
+ }
45
+ export async function logout(_args, globalOpts) {
46
+ await clearTokens();
47
+ process.stderr.write("feishu-docs: 已清除保存的凭证。\n");
48
+ if (globalOpts.json) {
49
+ process.stdout.write(JSON.stringify({ success: true }) + "\n");
50
+ }
51
+ }
52
+ export async function whoami(_args, globalOpts) {
53
+ try {
54
+ const authInfo = await resolveAuth(globalOpts.auth || "auto");
55
+ if (globalOpts.json) {
56
+ process.stdout.write(JSON.stringify({
57
+ success: true,
58
+ mode: authInfo.mode,
59
+ app_id: authInfo.appId,
60
+ has_user_token: !!authInfo.userToken,
61
+ }) + "\n");
62
+ }
63
+ else {
64
+ process.stdout.write(`认证模式: ${authInfo.mode}\n`);
65
+ if (authInfo.appId) {
66
+ process.stdout.write(`App ID: ${authInfo.appId}\n`);
67
+ }
68
+ if (authInfo.userToken) {
69
+ process.stdout.write(`User Token: ${authInfo.userToken.slice(0, 10)}...\n`);
70
+ if (authInfo.expiresAt) {
71
+ const expires = new Date(authInfo.expiresAt).toLocaleString();
72
+ const expired = Date.now() >= authInfo.expiresAt;
73
+ process.stdout.write(`过期时间: ${expires}${expired ? " (已过期)" : ""}\n`);
74
+ }
75
+ }
76
+ }
77
+ }
78
+ catch (err) {
79
+ if (globalOpts.json) {
80
+ process.stdout.write(JSON.stringify({
81
+ success: false,
82
+ error: err.message,
83
+ }) + "\n");
84
+ }
85
+ else {
86
+ process.stdout.write(`未认证: ${err.message}\n`);
87
+ }
88
+ }
89
+ }
90
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * ls command: List files in a drive folder.
3
+ */
4
+ import { CommandMeta, CommandArgs, GlobalOpts } from "../types/index.js";
5
+ export declare const meta: CommandMeta;
6
+ export declare function ls(args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * ls command: List files in a drive folder.
3
+ */
4
+ import { createClient, fetchWithAuth } from "../client.js";
5
+ import { CliError } from "../utils/errors.js";
6
+ import { validateToken } from "../utils/validate.js";
7
+ export const meta = {
8
+ options: {
9
+ type: { type: "string" },
10
+ limit: { type: "string" },
11
+ },
12
+ positionals: true,
13
+ handler: ls,
14
+ };
15
+ const TYPE_LABELS = {
16
+ doc: "文档",
17
+ docx: "新文档",
18
+ sheet: "表格",
19
+ bitable: "多维表格",
20
+ mindnote: "思维导图",
21
+ file: "文件",
22
+ folder: "文件夹",
23
+ slides: "幻灯片",
24
+ };
25
+ export async function ls(args, globalOpts) {
26
+ const { authInfo } = await createClient(globalOpts);
27
+ const folderToken = args.positionals[0] || undefined;
28
+ if (folderToken)
29
+ validateToken(folderToken, "folder_token");
30
+ const limit = args.limit ? Number(args.limit) : 50;
31
+ if (!Number.isInteger(limit) || limit < 1 || limit > 1000) {
32
+ throw new CliError("INVALID_ARGS", "--limit 必须是 1-1000 之间的整数");
33
+ }
34
+ if (args.type) {
35
+ const ALLOWED_TYPES = new Set(Object.keys(TYPE_LABELS));
36
+ if (!ALLOWED_TYPES.has(args.type)) {
37
+ throw new CliError("INVALID_ARGS", `无效的文件类型: ${args.type}。可选值: ${[...ALLOWED_TYPES].join(", ")}`);
38
+ }
39
+ }
40
+ const typeStr = args.type;
41
+ const params = {
42
+ page_size: Math.min(limit, 50),
43
+ ...(folderToken && { folder_token: folderToken }),
44
+ ...(typeStr && { type: typeStr }),
45
+ };
46
+ const items = [];
47
+ let pageToken;
48
+ do {
49
+ if (pageToken)
50
+ params.page_token = pageToken;
51
+ const res = await fetchWithAuth(authInfo, "/open-apis/drive/v1/files", {
52
+ params,
53
+ });
54
+ const data = res?.data;
55
+ if (data?.files) {
56
+ items.push(...data.files);
57
+ }
58
+ pageToken = data?.has_more ? data.next_page_token : undefined;
59
+ } while (pageToken && items.length < limit);
60
+ const trimmed = items.slice(0, limit);
61
+ if (globalOpts.json) {
62
+ process.stdout.write(JSON.stringify({ success: true, count: trimmed.length, files: trimmed }, null, 2) + "\n");
63
+ return;
64
+ }
65
+ if (trimmed.length === 0) {
66
+ process.stdout.write("文件夹为空\n");
67
+ return;
68
+ }
69
+ for (const f of trimmed) {
70
+ const name = f.name || "(未命名)";
71
+ const type = TYPE_LABELS[f.type] || f.type || "unknown";
72
+ const token = f.token || "";
73
+ process.stdout.write(` ${name} [${type}] ${token}\n`);
74
+ }
75
+ }
76
+ //# sourceMappingURL=ls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ls.js","sourceRoot":"","sources":["../../src/commands/ls.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * read command: Read a Feishu document and output as Markdown.
3
+ */
4
+ import { CommandMeta, CommandArgs, GlobalOpts } from "../types/index.js";
5
+ export declare const meta: CommandMeta;
6
+ export declare function read(args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;