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