feishu-docs-cli 0.1.0-beta.2 → 0.1.0-beta.4
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 +33 -15
- package/README.zh.md +33 -15
- package/dist/auth.js +2 -2
- package/dist/auth.js.map +1 -1
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +3 -21
- package/dist/client.js +12 -89
- package/dist/client.js.map +1 -1
- package/dist/commands/authorize.d.ts +9 -0
- package/dist/commands/authorize.js +91 -0
- package/dist/commands/authorize.js.map +1 -0
- package/dist/commands/cat.js +16 -8
- package/dist/commands/cat.js.map +1 -1
- package/dist/commands/create.js +7 -7
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/delete.js +4 -4
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/info.js +3 -3
- package/dist/commands/info.js.map +1 -1
- 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.js +6 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/ls.js +15 -0
- package/dist/commands/ls.js.map +1 -1
- package/dist/commands/read.js +13 -16
- package/dist/commands/read.js.map +1 -1
- package/dist/commands/share.js +12 -11
- package/dist/commands/share.js.map +1 -1
- package/dist/commands/update.js +15 -15
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/wiki.js +8 -8
- package/dist/commands/wiki.js.map +1 -1
- package/dist/scopes.d.ts +52 -0
- package/dist/scopes.js +79 -0
- package/dist/scopes.js.map +1 -0
- package/dist/services/block-writer.d.ts +4 -5
- package/dist/services/block-writer.js +8 -8
- package/dist/services/block-writer.js.map +1 -1
- package/dist/services/doc-blocks.d.ts +1 -2
- package/dist/services/doc-blocks.js +7 -11
- package/dist/services/doc-blocks.js.map +1 -1
- package/dist/services/wiki-nodes.d.ts +1 -2
- package/dist/services/wiki-nodes.js +5 -6
- package/dist/services/wiki-nodes.js.map +1 -1
- package/dist/utils/document-resolver.d.ts +1 -3
- package/dist/utils/document-resolver.js +2 -3
- package/dist/utils/document-resolver.js.map +1 -1
- package/package.json +3 -4
- package/skills/feishu-docs/SKILL.md +179 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"block-writer.js","sourceRoot":"","sources":["../../src/services/block-writer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"block-writer.js","sourceRoot":"","sources":["../../src/services/block-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared document block fetching.
|
|
3
3
|
*/
|
|
4
|
-
import * as lark from "@larksuiteoapi/node-sdk";
|
|
5
4
|
import { AuthInfo, Block } from "../types/index.js";
|
|
6
5
|
/**
|
|
7
6
|
* Fetch all blocks for a document.
|
|
8
7
|
*/
|
|
9
|
-
export declare function fetchAllBlocks(
|
|
8
|
+
export declare function fetchAllBlocks(authInfo: AuthInfo, documentId: string): Promise<Block[]>;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared document block fetching.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { fetchWithAuth } from "../client.js";
|
|
5
5
|
/**
|
|
6
6
|
* Fetch all blocks for a document.
|
|
7
7
|
*/
|
|
8
|
-
export async function fetchAllBlocks(
|
|
8
|
+
export async function fetchAllBlocks(authInfo, documentId) {
|
|
9
9
|
const blocks = [];
|
|
10
10
|
let pageToken;
|
|
11
11
|
do {
|
|
@@ -14,16 +14,12 @@ export async function fetchAllBlocks(client, authInfo, documentId) {
|
|
|
14
14
|
page_size: 500,
|
|
15
15
|
...(pageToken && { page_token: pageToken }),
|
|
16
16
|
};
|
|
17
|
-
const res = await
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (res?.data?.items) {
|
|
22
|
-
blocks.push(...res.data.items);
|
|
17
|
+
const res = await fetchWithAuth(authInfo, `/open-apis/docx/v1/documents/${encodeURIComponent(documentId)}/blocks`, { params });
|
|
18
|
+
const data = res?.data;
|
|
19
|
+
if (data?.items) {
|
|
20
|
+
blocks.push(...data.items);
|
|
23
21
|
}
|
|
24
|
-
pageToken =
|
|
25
|
-
? res.data.page_token
|
|
26
|
-
: undefined;
|
|
22
|
+
pageToken = data?.has_more ? data.page_token : undefined;
|
|
27
23
|
} while (pageToken);
|
|
28
24
|
return blocks;
|
|
29
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-blocks.js","sourceRoot":"","sources":["../../src/services/doc-blocks.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"doc-blocks.js","sourceRoot":"","sources":["../../src/services/doc-blocks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAkB,EAClB,UAAkB;IAElB,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,SAA6B,CAAC;IAElC,GAAG,CAAC;QACF,MAAM,MAAM,GAAgD;YAC1D,oBAAoB,EAAE,CAAC,CAAC;YACxB,SAAS,EAAE,GAAG;YACd,GAAG,CAAC,SAAS,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;SAC5C,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,aAAa,CAC7B,QAAQ,EACR,gCAAgC,kBAAkB,CAAC,UAAU,CAAC,SAAS,EACvE,EAAE,MAAM,EAAE,CACX,CAAC;QAEF,MAAM,IAAI,GAAG,GAAG,EAAE,IAA2C,CAAC;QAC9D,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,KAAiB,CAAC,CAAC;QAC1C,CAAC;QACD,SAAS,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,UAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC,QAAQ,SAAS,EAAE;IAEpB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared wiki node helpers.
|
|
3
3
|
*/
|
|
4
|
-
import * as lark from "@larksuiteoapi/node-sdk";
|
|
5
4
|
import { AuthInfo, WikiNode } from "../types/index.js";
|
|
6
5
|
export interface ResolvedWikiNode {
|
|
7
6
|
objToken: string;
|
|
@@ -18,4 +17,4 @@ export declare function fetchChildren(authInfo: AuthInfo, spaceId: string, paren
|
|
|
18
17
|
/**
|
|
19
18
|
* Resolve wiki token to actual document token + type.
|
|
20
19
|
*/
|
|
21
|
-
export declare function resolveWikiToken(
|
|
20
|
+
export declare function resolveWikiToken(authInfo: AuthInfo, wikiToken: string): Promise<ResolvedWikiNode>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Shared wiki node helpers.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { fetchWithAuth } from "../client.js";
|
|
5
5
|
import { CliError } from "../utils/errors.js";
|
|
6
6
|
/**
|
|
7
7
|
* Fetch child nodes of a parent node (or space root).
|
|
@@ -27,11 +27,10 @@ export async function fetchChildren(authInfo, spaceId, parentNodeToken) {
|
|
|
27
27
|
/**
|
|
28
28
|
* Resolve wiki token to actual document token + type.
|
|
29
29
|
*/
|
|
30
|
-
export async function resolveWikiToken(
|
|
31
|
-
const res = await
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const node = res?.data?.node;
|
|
30
|
+
export async function resolveWikiToken(authInfo, wikiToken) {
|
|
31
|
+
const res = await fetchWithAuth(authInfo, "/open-apis/wiki/v2/spaces/get_node", { params: { token: wikiToken, obj_type: "wiki" } });
|
|
32
|
+
const data = res?.data;
|
|
33
|
+
const node = data?.node;
|
|
35
34
|
if (!node) {
|
|
36
35
|
throw new CliError("NOT_FOUND", `知识库节点不存在: ${wikiToken}`);
|
|
37
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-nodes.js","sourceRoot":"","sources":["../../src/services/wiki-nodes.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"wiki-nodes.js","sourceRoot":"","sources":["../../src/services/wiki-nodes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAY9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAkB,EAClB,OAAe,EACf,eAAwB;IAExB,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,IAAI,SAA6B,CAAC;IAElC,GAAG,CAAC;QACF,MAAM,MAAM,GAAgD;YAC1D,SAAS,EAAE,EAAE;YACb,GAAG,CAAC,SAAS,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YAC3C,GAAG,CAAC,eAAe,IAAI,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC;SAC/D,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,aAAa,CAC7B,QAAQ,EACR,6BAA6B,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAChE,EAAE,MAAM,EAAE,CACX,CAAC;QAEF,MAAM,IAAI,GAAG,GAAG,EAAE,IAA2C,CAAC;QAC9D,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,KAAoB,CAAC,CAAC;QAC5C,CAAC;QACD,SAAS,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,UAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC,QAAQ,SAAS,EAAE;IAEpB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkB,EAClB,SAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,aAAa,CAC7B,QAAQ,EACR,oCAAoC,EACpC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CACnD,CAAC;IAEF,MAAM,IAAI,GAAG,GAAG,EAAE,IAA2C,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI,EAAE,IAA2C,CAAC;IAC/D,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,aAAa,SAAS,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,QAAQ,EAAG,IAAI,CAAC,SAAoB,IAAI,EAAE;QAC1C,OAAO,EAAG,IAAI,CAAC,QAAmB,IAAI,EAAE;QACxC,KAAK,EAAG,IAAI,CAAC,KAAgB,IAAI,EAAE;QACnC,SAAS,EAAG,IAAI,CAAC,UAAqB,IAAI,EAAE;QAC5C,OAAO,EAAG,IAAI,CAAC,QAAmB,IAAI,EAAE;QACxC,QAAQ,EAAG,IAAI,CAAC,SAAqB,IAAI,KAAK;KAC/C,CAAC;AACJ,CAAC"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
* Unified URL/token → document resolution.
|
|
3
3
|
* Extracts the repeated resolve logic from read.js, write.js, delete.js.
|
|
4
4
|
*/
|
|
5
|
-
import * as lark from "@larksuiteoapi/node-sdk";
|
|
6
5
|
import { AuthInfo, ParsedDoc } from "../types/index.js";
|
|
7
6
|
export interface ResolvedDocument {
|
|
8
7
|
objToken: string;
|
|
@@ -16,13 +15,12 @@ export interface ResolvedDocument {
|
|
|
16
15
|
/**
|
|
17
16
|
* Resolve a URL or raw token to a fully-qualified document descriptor.
|
|
18
17
|
*
|
|
19
|
-
* @param {object} client - Lark SDK client
|
|
20
18
|
* @param {object} authInfo - Auth credentials
|
|
21
19
|
* @param {string} input - URL or raw token
|
|
22
20
|
* @param {object} options
|
|
23
21
|
* @param {boolean} options.allowFallback - If true, unknown types silently fall back to docx (default: true)
|
|
24
22
|
* @returns {{ objToken, objType, title, nodeToken, spaceId, hasChild, parsed }}
|
|
25
23
|
*/
|
|
26
|
-
export declare function resolveDocument(
|
|
24
|
+
export declare function resolveDocument(authInfo: AuthInfo, input: string, options?: {
|
|
27
25
|
allowFallback?: boolean;
|
|
28
26
|
}): Promise<ResolvedDocument>;
|
|
@@ -7,14 +7,13 @@ import { resolveWikiToken } from "../services/wiki-nodes.js";
|
|
|
7
7
|
/**
|
|
8
8
|
* Resolve a URL or raw token to a fully-qualified document descriptor.
|
|
9
9
|
*
|
|
10
|
-
* @param {object} client - Lark SDK client
|
|
11
10
|
* @param {object} authInfo - Auth credentials
|
|
12
11
|
* @param {string} input - URL or raw token
|
|
13
12
|
* @param {object} options
|
|
14
13
|
* @param {boolean} options.allowFallback - If true, unknown types silently fall back to docx (default: true)
|
|
15
14
|
* @returns {{ objToken, objType, title, nodeToken, spaceId, hasChild, parsed }}
|
|
16
15
|
*/
|
|
17
|
-
export async function resolveDocument(
|
|
16
|
+
export async function resolveDocument(authInfo, input, options = {}) {
|
|
18
17
|
const { allowFallback = true } = options;
|
|
19
18
|
const parsed = parseDocUrl(input);
|
|
20
19
|
let objToken = parsed.token;
|
|
@@ -25,7 +24,7 @@ export async function resolveDocument(client, authInfo, input, options = {}) {
|
|
|
25
24
|
let hasChild = false;
|
|
26
25
|
if (parsed.type === "wiki" || parsed.type === "unknown") {
|
|
27
26
|
try {
|
|
28
|
-
const wiki = await resolveWikiToken(
|
|
27
|
+
const wiki = await resolveWikiToken(authInfo, parsed.token);
|
|
29
28
|
objToken = wiki.objToken;
|
|
30
29
|
objType = wiki.objType;
|
|
31
30
|
title = wiki.title;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-resolver.js","sourceRoot":"","sources":["../../src/utils/document-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"document-resolver.js","sourceRoot":"","sources":["../../src/utils/document-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAa7D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAkB,EAClB,KAAa,EACb,UAAuC,EAAE;IAEzC,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;IAC5B,IAAI,OAAO,GAAW,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IACvE,IAAI,KAAyB,CAAC;IAC9B,IAAI,SAA6B,CAAC;IAClC,IAAI,OAA2B,CAAC;IAChC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5D,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YACzB,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACnB,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,aAAa,EAAE,CAAC;gBAC/C,OAAO,GAAG,MAAM,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC5E,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "feishu-docs-cli",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.4",
|
|
4
4
|
"description": "CLI tool for AI Agents to read/write Feishu docs via shell commands",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"files": [
|
|
12
12
|
"bin/",
|
|
13
13
|
"dist/",
|
|
14
|
+
"skills/",
|
|
14
15
|
"README.md",
|
|
15
16
|
"README.zh.md",
|
|
16
17
|
"LICENSE"
|
|
@@ -44,10 +45,8 @@
|
|
|
44
45
|
"engines": {
|
|
45
46
|
"node": ">=18.3.0"
|
|
46
47
|
},
|
|
47
|
-
"dependencies": {
|
|
48
|
-
"@larksuiteoapi/node-sdk": "^1.59.0"
|
|
49
|
-
},
|
|
50
48
|
"devDependencies": {
|
|
49
|
+
"@types/node": "^25.5.0",
|
|
51
50
|
"tsx": "^4.21.0",
|
|
52
51
|
"typescript": "^5.9.3"
|
|
53
52
|
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: feishu-docs
|
|
3
|
+
description: Read, write, search, and manage Feishu (Lark) cloud documents and knowledge bases via the feishu-docs CLI. Use this skill whenever the user mentions Feishu docs, Lark docs, knowledge bases (wiki spaces), or wants to interact with Feishu cloud documents in any way — reading, creating, updating, deleting, searching, sharing, or browsing wiki structure. Also trigger when the user pastes a Feishu or Lark URL, or mentions feishu-docs-cli. This skill covers both Chinese (飞书) and international (Lark) platforms.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Feishu Docs CLI
|
|
7
|
+
|
|
8
|
+
`feishu-docs` is a CLI tool that lets you read and write Feishu (Lark) cloud documents directly from the terminal. All output goes to stdout as plain text or JSON — designed for agent consumption.
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
Before using any command, verify the environment is ready:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
feishu-docs whoami
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
If this fails with an auth error:
|
|
19
|
+
- Ensure `FEISHU_APP_ID` and `FEISHU_APP_SECRET` environment variables are set
|
|
20
|
+
- For user-level features (search, personal docs), the user needs to run `feishu-docs login` interactively in their terminal — you cannot do this for them
|
|
21
|
+
- Tenant (app) mode works without login but only accesses docs the app has been granted permission to
|
|
22
|
+
|
|
23
|
+
## Reading Documents
|
|
24
|
+
|
|
25
|
+
Read a document by URL or token. Output is Markdown by default.
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
feishu-docs read <url|token>
|
|
29
|
+
feishu-docs read <url> --blocks # Lossless Block JSON
|
|
30
|
+
feishu-docs read <url> --raw # Plain text
|
|
31
|
+
feishu-docs read <url> --with-meta # Prepend title/URL/revision metadata
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Accepts full Feishu/Lark URLs or raw tokens (e.g., `wikcnXXX`, `doxcnXXX`). The URL format is automatically detected — wiki pages, docx, sheets, and bitable links all work.
|
|
35
|
+
|
|
36
|
+
Markdown conversion is lossy (colors, merged cells, complex layouts are dropped). When fidelity matters, use `--blocks` to get the raw Block JSON.
|
|
37
|
+
|
|
38
|
+
## Browsing Knowledge Bases
|
|
39
|
+
|
|
40
|
+
Discover what's available before reading:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
feishu-docs spaces # List all accessible wiki spaces
|
|
44
|
+
feishu-docs tree <space_id> --depth 3 # Show document tree structure
|
|
45
|
+
feishu-docs cat <space_id> --max-docs 20 # Read all docs recursively
|
|
46
|
+
feishu-docs cat <space_id> --title-only # Just list titles
|
|
47
|
+
feishu-docs cat <space_id> --node <token> # Start from a specific node
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`spaces` returns space IDs and names. Use a space_id with `tree` to understand the structure, then `read` individual documents or `cat` to batch-read.
|
|
51
|
+
|
|
52
|
+
## Searching
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
feishu-docs search "keyword" --type docx --limit 10
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Search requires a user access token (`feishu-docs login`). It will not work with tenant-only auth.
|
|
59
|
+
|
|
60
|
+
## Creating Documents
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Create in a wiki space
|
|
64
|
+
feishu-docs create "Title" --wiki <space_id> --body ./content.md
|
|
65
|
+
|
|
66
|
+
# Create in a cloud folder
|
|
67
|
+
feishu-docs create "Title" --folder <folder_token> --body ./content.md
|
|
68
|
+
|
|
69
|
+
# Create empty document (returns URL)
|
|
70
|
+
feishu-docs create "Title"
|
|
71
|
+
|
|
72
|
+
# Pipe content from stdin
|
|
73
|
+
echo "# Hello" | feishu-docs create "Title" --wiki <space_id> --body -
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The `--body` flag accepts a file path or `-` for stdin. Content is Markdown — the API converts it to Feishu blocks server-side.
|
|
77
|
+
|
|
78
|
+
When creating under a wiki node, use `--wiki <space_id> --parent <node_token>` to place it under a specific parent.
|
|
79
|
+
|
|
80
|
+
## Updating Documents
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# Overwrite entire document (auto-backs up first)
|
|
84
|
+
feishu-docs update <url> --body ./updated.md
|
|
85
|
+
|
|
86
|
+
# Append to end of document
|
|
87
|
+
feishu-docs update <url> --body ./extra.md --append
|
|
88
|
+
|
|
89
|
+
# Pipe from stdin
|
|
90
|
+
echo "## New Section" | feishu-docs update <url> --body - --append
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Overwrite mode automatically backs up the current document to `~/.feishu-docs/backups/` before writing. If the write fails, it auto-recovers from the backup.
|
|
94
|
+
|
|
95
|
+
To restore a previous version:
|
|
96
|
+
```bash
|
|
97
|
+
feishu-docs update <url> --restore ~/.feishu-docs/backups/<backup-file>.json
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Deleting Documents
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
feishu-docs delete <url> --confirm
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Moves to recycle bin (recoverable for 30 days). The `--confirm` flag is required.
|
|
107
|
+
|
|
108
|
+
## Document Info
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
feishu-docs info <url|token> # Human-readable metadata
|
|
112
|
+
feishu-docs info <url> --json # Structured JSON output
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Returns title, document type, URL, owner, creation time, and revision number.
|
|
116
|
+
|
|
117
|
+
## Listing Cloud Files
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
feishu-docs ls # Root folder
|
|
121
|
+
feishu-docs ls <folder_token> # Specific folder
|
|
122
|
+
feishu-docs ls --type docx --limit 20 # Filter by type
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Sharing & Permissions
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
feishu-docs share list <url> # View collaborators
|
|
129
|
+
feishu-docs share add <url> user@example.com --role view
|
|
130
|
+
feishu-docs share add <url> ou_xxx --role edit
|
|
131
|
+
feishu-docs share set <url> --public tenant # Org-wide readable
|
|
132
|
+
feishu-docs share set <url> --public tenant:edit # Org-wide editable
|
|
133
|
+
feishu-docs share set <url> --public open # Internet-accessible
|
|
134
|
+
feishu-docs share set <url> --public closed # Disable link sharing
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Roles: `view`, `edit`, `manage`. Member types (email, openid, unionid, userid) are auto-detected.
|
|
138
|
+
|
|
139
|
+
## Wiki Management
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
feishu-docs wiki create-space <name>
|
|
143
|
+
feishu-docs wiki add-member <space_id> <member>
|
|
144
|
+
feishu-docs wiki remove-member <space_id> <member>
|
|
145
|
+
feishu-docs wiki rename <url> --title <new_title>
|
|
146
|
+
feishu-docs wiki move <url> --to <space_id>
|
|
147
|
+
feishu-docs wiki copy <url> --to <space_id>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Global Options
|
|
151
|
+
|
|
152
|
+
Every command accepts these flags:
|
|
153
|
+
|
|
154
|
+
| Flag | Effect |
|
|
155
|
+
|------|--------|
|
|
156
|
+
| `--auth user` | Force user token (personal docs, search) |
|
|
157
|
+
| `--auth tenant` | Force app token (CI/CD, shared docs) |
|
|
158
|
+
| `--json` | Output structured JSON instead of text |
|
|
159
|
+
| `--lark` | Use Lark (international) domain |
|
|
160
|
+
|
|
161
|
+
Default auth mode is `auto` — tries user token first, falls back to tenant.
|
|
162
|
+
|
|
163
|
+
## Common Workflows
|
|
164
|
+
|
|
165
|
+
**Research a wiki space**: `spaces` → pick a space_id → `tree <space_id>` → `read` specific docs
|
|
166
|
+
|
|
167
|
+
**Write a report to wiki**: Write markdown locally → `create "Title" --wiki <space_id> --body ./report.md`
|
|
168
|
+
|
|
169
|
+
**Update existing doc**: `read <url>` to see current content → edit locally → `update <url> --body ./updated.md`
|
|
170
|
+
|
|
171
|
+
**Batch extract**: `cat <space_id> --max-docs 50` to dump all docs as markdown for analysis
|
|
172
|
+
|
|
173
|
+
## Limitations
|
|
174
|
+
|
|
175
|
+
- Only `docx` (new document format) is fully supported for read/write
|
|
176
|
+
- Legacy `doc` format is not supported
|
|
177
|
+
- Images cannot be written; read returns temporary URLs valid ~24 hours
|
|
178
|
+
- Markdown conversion is lossy — use `--blocks` for lossless JSON when precision matters
|
|
179
|
+
- Search requires user-level auth (run `feishu-docs login` first)
|