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.
- package/LICENSE +21 -0
- package/README.md +333 -0
- package/README.zh.md +332 -0
- package/bin/feishu-docs.js +8 -0
- package/dist/auth.d.ts +76 -0
- package/dist/auth.js +512 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +166 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +42 -0
- package/dist/client.js +269 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/cat.d.ts +6 -0
- package/dist/commands/cat.js +151 -0
- package/dist/commands/cat.js.map +1 -0
- package/dist/commands/create.d.ts +6 -0
- package/dist/commands/create.js +120 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +6 -0
- package/dist/commands/delete.js +89 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/info.d.ts +6 -0
- package/dist/commands/info.js +69 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/login.d.ts +10 -0
- package/dist/commands/login.js +90 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/ls.d.ts +6 -0
- package/dist/commands/ls.js +76 -0
- package/dist/commands/ls.js.map +1 -0
- package/dist/commands/read.d.ts +6 -0
- package/dist/commands/read.js +404 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/search.d.ts +7 -0
- package/dist/commands/search.js +87 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/share.d.ts +13 -0
- package/dist/commands/share.js +210 -0
- package/dist/commands/share.js.map +1 -0
- package/dist/commands/spaces.d.ts +6 -0
- package/dist/commands/spaces.js +43 -0
- package/dist/commands/spaces.js.map +1 -0
- package/dist/commands/tree.d.ts +6 -0
- package/dist/commands/tree.js +101 -0
- package/dist/commands/tree.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.js +211 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/wiki.d.ts +6 -0
- package/dist/commands/wiki.js +284 -0
- package/dist/commands/wiki.js.map +1 -0
- package/dist/parser/block-types.d.ts +141 -0
- package/dist/parser/block-types.js +167 -0
- package/dist/parser/block-types.js.map +1 -0
- package/dist/parser/blocks-to-md.d.ts +26 -0
- package/dist/parser/blocks-to-md.js +576 -0
- package/dist/parser/blocks-to-md.js.map +1 -0
- package/dist/parser/text-elements.d.ts +13 -0
- package/dist/parser/text-elements.js +91 -0
- package/dist/parser/text-elements.js.map +1 -0
- package/dist/services/block-writer.d.ts +30 -0
- package/dist/services/block-writer.js +131 -0
- package/dist/services/block-writer.js.map +1 -0
- package/dist/services/doc-blocks.d.ts +9 -0
- package/dist/services/doc-blocks.js +30 -0
- package/dist/services/doc-blocks.js.map +1 -0
- package/dist/services/markdown-convert.d.ts +51 -0
- package/dist/services/markdown-convert.js +109 -0
- package/dist/services/markdown-convert.js.map +1 -0
- package/dist/services/wiki-nodes.d.ts +21 -0
- package/dist/services/wiki-nodes.js +47 -0
- package/dist/services/wiki-nodes.js.map +1 -0
- package/dist/types/index.d.ts +234 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/document-resolver.d.ts +28 -0
- package/dist/utils/document-resolver.js +47 -0
- package/dist/utils/document-resolver.js.map +1 -0
- package/dist/utils/drive-types.d.ts +4 -0
- package/dist/utils/drive-types.js +16 -0
- package/dist/utils/drive-types.js.map +1 -0
- package/dist/utils/errors.d.ts +21 -0
- package/dist/utils/errors.js +110 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/member.d.ts +11 -0
- package/dist/utils/member.js +30 -0
- package/dist/utils/member.js.map +1 -0
- package/dist/utils/url-parser.d.ts +5 -0
- package/dist/utils/url-parser.js +55 -0
- package/dist/utils/url-parser.js.map +1 -0
- package/dist/utils/validate.d.ts +8 -0
- package/dist/utils/validate.js +15 -0
- package/dist/utils/validate.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* read command: Read a Feishu document and output as Markdown.
|
|
3
|
+
*/
|
|
4
|
+
import { createClient, withAuth, apiCall, fetchWithAuth, getTenantToken, } from "../client.js";
|
|
5
|
+
import { blocksToMarkdown } from "../parser/blocks-to-md.js";
|
|
6
|
+
import { BlockType } from "../parser/block-types.js";
|
|
7
|
+
import { CliError } from "../utils/errors.js";
|
|
8
|
+
import { fetchAllBlocks } from "../services/doc-blocks.js";
|
|
9
|
+
import { getDocumentInfo } from "../services/block-writer.js";
|
|
10
|
+
import { resolveDocument } from "../utils/document-resolver.js";
|
|
11
|
+
/**
|
|
12
|
+
* Fetch raw text content of a document.
|
|
13
|
+
*/
|
|
14
|
+
async function fetchRawContent(client, authInfo, documentId) {
|
|
15
|
+
const res = await apiCall(() => client.docx.v1.document.rawContent({
|
|
16
|
+
path: { document_id: documentId },
|
|
17
|
+
}, withAuth(authInfo)));
|
|
18
|
+
return res?.data?.content || "";
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Batch get temporary download URLs for file tokens (images, files).
|
|
22
|
+
*/
|
|
23
|
+
async function batchGetTmpUrls(client, authInfo, fileTokens) {
|
|
24
|
+
if (fileTokens.length === 0)
|
|
25
|
+
return new Map();
|
|
26
|
+
const res = await apiCall(() => client.drive.v1.media.batchGetTmpDownloadUrl({
|
|
27
|
+
params: { file_tokens: fileTokens },
|
|
28
|
+
}, withAuth(authInfo)));
|
|
29
|
+
const urlMap = new Map();
|
|
30
|
+
const items = res?.data?.tmp_download_urls || [];
|
|
31
|
+
for (const item of items) {
|
|
32
|
+
urlMap.set(item.file_token, item.tmp_download_url);
|
|
33
|
+
}
|
|
34
|
+
return urlMap;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extract file tokens from blocks (images, files).
|
|
38
|
+
*/
|
|
39
|
+
function extractFileTokens(blocks) {
|
|
40
|
+
const tokens = [];
|
|
41
|
+
for (const block of blocks) {
|
|
42
|
+
if (block.block_type === BlockType.IMAGE && block.image?.token) {
|
|
43
|
+
tokens.push(block.image.token);
|
|
44
|
+
}
|
|
45
|
+
if (block.block_type === BlockType.FILE && block.file?.token) {
|
|
46
|
+
tokens.push(block.file.token);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return tokens;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Extract bitable tokens from blocks.
|
|
53
|
+
*/
|
|
54
|
+
function extractBitableTokens(blocks) {
|
|
55
|
+
const tokens = [];
|
|
56
|
+
for (const block of blocks) {
|
|
57
|
+
if (block.block_type === BlockType.BITABLE && block.bitable?.token) {
|
|
58
|
+
tokens.push(block.bitable.token);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return tokens;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Extract sheet tokens from blocks.
|
|
65
|
+
*/
|
|
66
|
+
function extractSheetTokens(blocks) {
|
|
67
|
+
const tokens = [];
|
|
68
|
+
for (const block of blocks) {
|
|
69
|
+
if (block.block_type === BlockType.SHEET && block.sheet?.token) {
|
|
70
|
+
tokens.push(block.sheet.token);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return tokens;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Extract board tokens from blocks.
|
|
77
|
+
*/
|
|
78
|
+
function extractBoardTokens(blocks) {
|
|
79
|
+
const tokens = [];
|
|
80
|
+
for (const block of blocks) {
|
|
81
|
+
if (block.block_type === BlockType.BOARD &&
|
|
82
|
+
block.board?.token) {
|
|
83
|
+
tokens.push(block.board.token);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return tokens;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Fetch bitable fields and records, return as renderable data.
|
|
90
|
+
*/
|
|
91
|
+
async function fetchBitableData(authInfo, fullToken) {
|
|
92
|
+
const idx = fullToken.lastIndexOf("_tbl");
|
|
93
|
+
if (idx === -1) {
|
|
94
|
+
process.stderr.write(`feishu-docs: warning: 多维表格 token 格式无法解析: ${fullToken}\n`);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
const appToken = fullToken.slice(0, idx);
|
|
98
|
+
const tableId = fullToken.slice(idx + 1);
|
|
99
|
+
const [fieldsRes, recordsRes] = await Promise.all([
|
|
100
|
+
fetchWithAuth(authInfo, `/open-apis/bitable/v1/apps/${encodeURIComponent(appToken)}/tables/${encodeURIComponent(tableId)}/fields`, {}),
|
|
101
|
+
fetchWithAuth(authInfo, `/open-apis/bitable/v1/apps/${encodeURIComponent(appToken)}/tables/${encodeURIComponent(tableId)}/records`, { params: { page_size: 100 } }),
|
|
102
|
+
]);
|
|
103
|
+
const fieldsData = fieldsRes.data;
|
|
104
|
+
const recordsData = recordsRes.data;
|
|
105
|
+
const fields = (fieldsData?.items || []).map((f) => f.field_name);
|
|
106
|
+
const records = (recordsData?.items || []).map((r) => {
|
|
107
|
+
return fields.map((name) => {
|
|
108
|
+
const val = r.fields?.[name];
|
|
109
|
+
if (val === undefined || val === null)
|
|
110
|
+
return "";
|
|
111
|
+
if (typeof val === "object")
|
|
112
|
+
return JSON.stringify(val);
|
|
113
|
+
return String(val);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
return { fields, records };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Fetch sheet metadata and cell values, return as renderable data.
|
|
120
|
+
*/
|
|
121
|
+
async function fetchSheetData(authInfo, sheetToken) {
|
|
122
|
+
const metaRes = await fetchWithAuth(authInfo, `/open-apis/sheets/v2/spreadsheets/${encodeURIComponent(sheetToken)}/metainfo`, {});
|
|
123
|
+
const metaData = metaRes.data;
|
|
124
|
+
const sheets = (metaData?.sheets || []);
|
|
125
|
+
if (sheets.length === 0)
|
|
126
|
+
return null;
|
|
127
|
+
const firstSheet = sheets[0];
|
|
128
|
+
const sheetId = firstSheet.sheet_id;
|
|
129
|
+
const title = firstSheet.title || "";
|
|
130
|
+
const valuesRes = await fetchWithAuth(authInfo, `/open-apis/sheets/v2/spreadsheets/${encodeURIComponent(sheetToken)}/values/${encodeURIComponent(sheetId)}`, { params: { valueRenderOption: "ToString" } });
|
|
131
|
+
const valuesData = valuesRes.data;
|
|
132
|
+
const rows = (valuesData?.valueRange?.values ||
|
|
133
|
+
[]);
|
|
134
|
+
if (rows.length === 0)
|
|
135
|
+
return null;
|
|
136
|
+
const maxRows = 101; // first row = header + 100 data rows
|
|
137
|
+
const limitedRows = rows.length > maxRows ? rows.slice(0, maxRows) : rows;
|
|
138
|
+
const fields = limitedRows[0].map((cell) => String(cell ?? ""));
|
|
139
|
+
const records = limitedRows
|
|
140
|
+
.slice(1)
|
|
141
|
+
.map((row) => fields.map((_, i) => String(row[i] ?? "")));
|
|
142
|
+
return { fields, records, title, truncated: rows.length > maxRows };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Fetch board node data and extract text content.
|
|
146
|
+
*/
|
|
147
|
+
async function fetchBoardData(authInfo, boardToken) {
|
|
148
|
+
const res = await fetchWithAuth(authInfo, `/open-apis/board/v1/whiteboards/${encodeURIComponent(boardToken)}/nodes`, {});
|
|
149
|
+
const boardResData = res.data;
|
|
150
|
+
const nodes = (boardResData?.nodes || []);
|
|
151
|
+
// Extract text from shape nodes and connectors
|
|
152
|
+
const textItems = [];
|
|
153
|
+
for (const node of nodes) {
|
|
154
|
+
if (node.type === "shape") {
|
|
155
|
+
const shapeText = node.shape?.text;
|
|
156
|
+
if (shapeText?.data) {
|
|
157
|
+
const texts = shapeText.data
|
|
158
|
+
.map((d) => d.text || "")
|
|
159
|
+
.filter(Boolean);
|
|
160
|
+
if (texts.length > 0)
|
|
161
|
+
textItems.push(texts.join(""));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (node.type === "connector") {
|
|
165
|
+
const connCaptions = node.connector
|
|
166
|
+
?.captions;
|
|
167
|
+
if (connCaptions?.data) {
|
|
168
|
+
const texts = connCaptions.data
|
|
169
|
+
.map((d) => d.text || "")
|
|
170
|
+
.filter(Boolean);
|
|
171
|
+
if (texts.length > 0)
|
|
172
|
+
textItems.push(texts.join(""));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return textItems;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Extract unique mention_user user_ids from blocks.
|
|
180
|
+
*/
|
|
181
|
+
function extractMentionUserIds(blocks) {
|
|
182
|
+
const ids = new Set();
|
|
183
|
+
for (const block of blocks) {
|
|
184
|
+
const elementSources = [
|
|
185
|
+
block.text?.elements,
|
|
186
|
+
block.heading1?.elements,
|
|
187
|
+
block.heading2?.elements,
|
|
188
|
+
block.heading3?.elements,
|
|
189
|
+
block.heading4?.elements,
|
|
190
|
+
block.heading5?.elements,
|
|
191
|
+
block.heading6?.elements,
|
|
192
|
+
block.heading7?.elements,
|
|
193
|
+
block.heading8?.elements,
|
|
194
|
+
block.heading9?.elements,
|
|
195
|
+
block.bullet?.elements,
|
|
196
|
+
block.ordered?.elements,
|
|
197
|
+
block.todo?.elements,
|
|
198
|
+
block.quote?.elements,
|
|
199
|
+
];
|
|
200
|
+
for (const elements of elementSources) {
|
|
201
|
+
if (!elements)
|
|
202
|
+
continue;
|
|
203
|
+
for (const el of elements) {
|
|
204
|
+
if (el.mention_user?.user_id) {
|
|
205
|
+
ids.add(el.mention_user.user_id);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return [...ids];
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Batch resolve user IDs to display names.
|
|
214
|
+
* Uses tenant_access_token + contact:user.base:readonly to get name fields.
|
|
215
|
+
*/
|
|
216
|
+
async function resolveUserNames(authInfo, userIds) {
|
|
217
|
+
const nameMap = new Map();
|
|
218
|
+
// Use tenant token for contact API (contact:user.base:readonly is app-identity permission)
|
|
219
|
+
let tenantToken;
|
|
220
|
+
try {
|
|
221
|
+
tenantToken = await getTenantToken(authInfo);
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
// Fallback: try authen API with user token for current user
|
|
225
|
+
try {
|
|
226
|
+
const self = await fetchWithAuth(authInfo, "/open-apis/authen/v1/user_info", {});
|
|
227
|
+
const selfData = self?.data;
|
|
228
|
+
if (selfData?.open_id && selfData?.name) {
|
|
229
|
+
nameMap.set(selfData.open_id, selfData.name);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// no way to resolve
|
|
234
|
+
}
|
|
235
|
+
return nameMap;
|
|
236
|
+
}
|
|
237
|
+
// Batch query users (up to 50 per request)
|
|
238
|
+
const BATCH = 50;
|
|
239
|
+
for (let i = 0; i < userIds.length; i += BATCH) {
|
|
240
|
+
const batch = userIds.slice(i, i + BATCH);
|
|
241
|
+
try {
|
|
242
|
+
const params = {
|
|
243
|
+
user_id_type: "open_id",
|
|
244
|
+
user_ids: batch,
|
|
245
|
+
};
|
|
246
|
+
const tenantAuthInfo = {
|
|
247
|
+
...authInfo,
|
|
248
|
+
mode: "tenant",
|
|
249
|
+
tenantToken,
|
|
250
|
+
};
|
|
251
|
+
const res = await fetchWithAuth(tenantAuthInfo, "/open-apis/contact/v3/users/batch", { params });
|
|
252
|
+
const items = (res?.data?.user_list ||
|
|
253
|
+
[]);
|
|
254
|
+
for (const user of items) {
|
|
255
|
+
if (user.open_id && user.name) {
|
|
256
|
+
nameMap.set(user.open_id, user.name);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// skip batch errors
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return nameMap;
|
|
265
|
+
}
|
|
266
|
+
export const meta = {
|
|
267
|
+
options: {
|
|
268
|
+
raw: { type: "boolean", default: false },
|
|
269
|
+
blocks: { type: "boolean", default: false },
|
|
270
|
+
"with-meta": { type: "boolean", default: false },
|
|
271
|
+
},
|
|
272
|
+
positionals: true,
|
|
273
|
+
handler: read,
|
|
274
|
+
};
|
|
275
|
+
export async function read(args, globalOpts) {
|
|
276
|
+
const input = args.positionals[0];
|
|
277
|
+
if (!input) {
|
|
278
|
+
throw new CliError("INVALID_ARGS", "缺少文档 URL 或 token。用法: feishu-docs read <url|token>");
|
|
279
|
+
}
|
|
280
|
+
const { client, authInfo } = await createClient(globalOpts);
|
|
281
|
+
const doc = await resolveDocument(client, authInfo, input);
|
|
282
|
+
let documentId = doc.objToken;
|
|
283
|
+
let docType = doc.objType;
|
|
284
|
+
let docTitle = doc.title;
|
|
285
|
+
if ((doc.parsed.type === "wiki" || doc.parsed.type === "unknown") &&
|
|
286
|
+
docType !== "docx" &&
|
|
287
|
+
doc.title !== undefined) {
|
|
288
|
+
const msg = docTitle
|
|
289
|
+
? `[${docType}: ${docTitle} (${documentId})]`
|
|
290
|
+
: `[${docType}: ${documentId}]`;
|
|
291
|
+
process.stdout.write(msg + "\n");
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (docType === "doc") {
|
|
295
|
+
throw new CliError("INVALID_ARGS", "不支持旧版 doc 格式,请在飞书中升级为 docx");
|
|
296
|
+
}
|
|
297
|
+
// Non-docx types (sheet, bitable, board, etc.) — output placeholder
|
|
298
|
+
if (docType !== "docx") {
|
|
299
|
+
process.stdout.write(`[${docType}: ${documentId}]\n`);
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
// --raw mode: fetch raw text only
|
|
303
|
+
if (args.raw) {
|
|
304
|
+
const content = await fetchRawContent(client, authInfo, documentId);
|
|
305
|
+
process.stdout.write(content + "\n");
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
// Fetch all blocks
|
|
309
|
+
const blocks = await fetchAllBlocks(client, authInfo, documentId);
|
|
310
|
+
// --blocks mode: output raw JSON
|
|
311
|
+
if (args.blocks) {
|
|
312
|
+
process.stdout.write(JSON.stringify(blocks, null, 2) + "\n");
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
// Default: convert to Markdown
|
|
316
|
+
// Batch resolve image/file URLs
|
|
317
|
+
const fileTokens = extractFileTokens(blocks);
|
|
318
|
+
let imageUrlMap = new Map();
|
|
319
|
+
if (fileTokens.length > 0) {
|
|
320
|
+
try {
|
|
321
|
+
imageUrlMap = await batchGetTmpUrls(client, authInfo, fileTokens);
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
process.stderr.write("feishu-docs: warning: 获取图片/文件链接失败,链接将为空\n");
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// Batch resolve @mention user names
|
|
328
|
+
let userNameMap = new Map();
|
|
329
|
+
const mentionUserIds = extractMentionUserIds(blocks);
|
|
330
|
+
if (mentionUserIds.length > 0) {
|
|
331
|
+
try {
|
|
332
|
+
userNameMap = await resolveUserNames(authInfo, mentionUserIds);
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
process.stderr.write("feishu-docs: warning: 解析 @用户 名称失败\n");
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// Batch resolve bitable data
|
|
339
|
+
const bitableTokens = extractBitableTokens(blocks);
|
|
340
|
+
const bitableDataMap = new Map();
|
|
341
|
+
for (const token of bitableTokens) {
|
|
342
|
+
try {
|
|
343
|
+
const data = await fetchBitableData(authInfo, token);
|
|
344
|
+
if (data)
|
|
345
|
+
bitableDataMap.set(token, data);
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
process.stderr.write(`feishu-docs: warning: 获取多维表格数据失败: ${token}\n`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Batch resolve board data
|
|
352
|
+
const boardTokens = extractBoardTokens(blocks);
|
|
353
|
+
const boardDataMap = new Map();
|
|
354
|
+
for (const token of boardTokens) {
|
|
355
|
+
try {
|
|
356
|
+
const data = await fetchBoardData(authInfo, token);
|
|
357
|
+
if (data)
|
|
358
|
+
boardDataMap.set(token, data);
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
process.stderr.write(`feishu-docs: warning: 获取画板数据失败: ${token}\n`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Batch resolve sheet data
|
|
365
|
+
const sheetTokens = extractSheetTokens(blocks);
|
|
366
|
+
const sheetDataMap = new Map();
|
|
367
|
+
for (const token of sheetTokens) {
|
|
368
|
+
try {
|
|
369
|
+
const data = await fetchSheetData(authInfo, token);
|
|
370
|
+
if (data)
|
|
371
|
+
sheetDataMap.set(token, data);
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
process.stderr.write(`feishu-docs: warning: 获取电子表格数据失败: ${token}\n`);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
// Add metadata header if requested
|
|
378
|
+
let output = "";
|
|
379
|
+
if (args.withMeta) {
|
|
380
|
+
let meta = {};
|
|
381
|
+
try {
|
|
382
|
+
meta = await getDocumentInfo(client, authInfo, documentId);
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
// ignore metadata fetch errors
|
|
386
|
+
}
|
|
387
|
+
output += "---\n";
|
|
388
|
+
if (docTitle || meta.title)
|
|
389
|
+
output += `title: ${docTitle || meta.title}\n`;
|
|
390
|
+
if (meta.revisionId)
|
|
391
|
+
output += `revision: ${meta.revisionId}\n`;
|
|
392
|
+
output += `token: ${documentId}\n`;
|
|
393
|
+
output += "---\n\n";
|
|
394
|
+
}
|
|
395
|
+
output += blocksToMarkdown(blocks, {
|
|
396
|
+
imageUrlMap,
|
|
397
|
+
userNameMap,
|
|
398
|
+
bitableDataMap,
|
|
399
|
+
boardDataMap,
|
|
400
|
+
sheetDataMap,
|
|
401
|
+
});
|
|
402
|
+
process.stdout.write(output);
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search command: Search knowledge base documents.
|
|
3
|
+
* Uses /open-apis/suite/docs-api/search/object which requires user_access_token.
|
|
4
|
+
*/
|
|
5
|
+
import { CommandMeta, CommandArgs, GlobalOpts } from "../types/index.js";
|
|
6
|
+
export declare const meta: CommandMeta;
|
|
7
|
+
export declare function search(args: CommandArgs, globalOpts: GlobalOpts): Promise<void>;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search command: Search knowledge base documents.
|
|
3
|
+
* Uses /open-apis/suite/docs-api/search/object which requires user_access_token.
|
|
4
|
+
*/
|
|
5
|
+
import { createClient, fetchWithAuth } from "../client.js";
|
|
6
|
+
import { CliError } from "../utils/errors.js";
|
|
7
|
+
const DOC_TYPE_MAP = {
|
|
8
|
+
doc: "文档",
|
|
9
|
+
docx: "新文档",
|
|
10
|
+
sheet: "表格",
|
|
11
|
+
bitable: "多维表格",
|
|
12
|
+
mindnote: "思维导图",
|
|
13
|
+
file: "文件",
|
|
14
|
+
slides: "幻灯片",
|
|
15
|
+
wiki: "知识库页面",
|
|
16
|
+
};
|
|
17
|
+
export const meta = {
|
|
18
|
+
options: {
|
|
19
|
+
type: { type: "string" },
|
|
20
|
+
limit: { type: "string" },
|
|
21
|
+
},
|
|
22
|
+
positionals: true,
|
|
23
|
+
handler: search,
|
|
24
|
+
};
|
|
25
|
+
export async function search(args, globalOpts) {
|
|
26
|
+
const query = args.positionals[0];
|
|
27
|
+
if (!query) {
|
|
28
|
+
throw new CliError("INVALID_ARGS", "缺少搜索关键词。用法: feishu-docs search <query> [--type <type>] [--limit <n>]");
|
|
29
|
+
}
|
|
30
|
+
const { authInfo } = await createClient(globalOpts);
|
|
31
|
+
if (authInfo.mode === "tenant") {
|
|
32
|
+
throw new CliError("AUTH_REQUIRED", "search 命令需要 user 身份。tenant 模式下无搜索能力", {
|
|
33
|
+
recovery: "运行 feishu-docs login 切换到 user 身份,或设置 FEISHU_USER_TOKEN 环境变量",
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const limit = args.limit ? Number(args.limit) : 20;
|
|
37
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 200) {
|
|
38
|
+
throw new CliError("INVALID_ARGS", "--limit 必须是 1-200 之间的整数");
|
|
39
|
+
}
|
|
40
|
+
const docType = args.type || undefined;
|
|
41
|
+
const results = [];
|
|
42
|
+
let offset = 0;
|
|
43
|
+
const pageSize = Math.min(limit, 50);
|
|
44
|
+
while (results.length < limit) {
|
|
45
|
+
const body = {
|
|
46
|
+
search_key: query,
|
|
47
|
+
count: pageSize,
|
|
48
|
+
offset,
|
|
49
|
+
};
|
|
50
|
+
if (docType)
|
|
51
|
+
body.docs_types = [docType];
|
|
52
|
+
const res = await fetchWithAuth(authInfo, "/open-apis/suite/docs-api/search/object", { method: "POST", body });
|
|
53
|
+
const resData = res?.data;
|
|
54
|
+
const items = (resData?.docs_entities || []);
|
|
55
|
+
results.push(...items);
|
|
56
|
+
if (!resData?.has_more || items.length === 0)
|
|
57
|
+
break;
|
|
58
|
+
offset += items.length;
|
|
59
|
+
}
|
|
60
|
+
const trimmed = results.slice(0, limit);
|
|
61
|
+
if (globalOpts.json) {
|
|
62
|
+
process.stdout.write(JSON.stringify({
|
|
63
|
+
success: true,
|
|
64
|
+
query,
|
|
65
|
+
count: trimmed.length,
|
|
66
|
+
items: trimmed.map((item) => ({
|
|
67
|
+
title: item.title,
|
|
68
|
+
token: item.docs_token,
|
|
69
|
+
obj_type: item.docs_type,
|
|
70
|
+
owner_id: item.owner_id,
|
|
71
|
+
})),
|
|
72
|
+
}, null, 2) + "\n");
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (trimmed.length === 0) {
|
|
76
|
+
process.stdout.write(`没有找到与 "${query}" 相关的文档\n`);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
process.stdout.write(`搜索 "${query}" — 找到 ${trimmed.length} 条结果\n\n`);
|
|
80
|
+
for (const item of trimmed) {
|
|
81
|
+
const title = item.title || "(无标题)";
|
|
82
|
+
const type = DOC_TYPE_MAP[item.docs_type] || item.docs_type || "unknown";
|
|
83
|
+
const token = item.docs_token || "";
|
|
84
|
+
process.stdout.write(` ${title} [${type}] ${token}\n`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* share command: Manage document permissions (list/add/set).
|
|
3
|
+
*/
|
|
4
|
+
import { SubcommandMeta } from "../types/index.js";
|
|
5
|
+
export declare const meta: SubcommandMeta;
|
|
6
|
+
/**
|
|
7
|
+
* Map user-friendly role name to API perm value.
|
|
8
|
+
*/
|
|
9
|
+
export declare function mapRole(role: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Map public mode string to link_share_entity value.
|
|
12
|
+
*/
|
|
13
|
+
export declare function mapPublicMode(mode: string, role?: string): string;
|