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.
Files changed (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +403 -0
  3. package/README.zh.md +402 -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 +197 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client.d.ts +28 -0
  12. package/dist/client.js +256 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/commands/authorize.d.ts +12 -0
  15. package/dist/commands/authorize.js +73 -0
  16. package/dist/commands/authorize.js.map +1 -0
  17. package/dist/commands/cat.d.ts +6 -0
  18. package/dist/commands/cat.js +159 -0
  19. package/dist/commands/cat.js.map +1 -0
  20. package/dist/commands/cp.d.ts +9 -0
  21. package/dist/commands/cp.js +70 -0
  22. package/dist/commands/cp.js.map +1 -0
  23. package/dist/commands/create.d.ts +6 -0
  24. package/dist/commands/create.js +120 -0
  25. package/dist/commands/create.js.map +1 -0
  26. package/dist/commands/delete.d.ts +6 -0
  27. package/dist/commands/delete.js +91 -0
  28. package/dist/commands/delete.js.map +1 -0
  29. package/dist/commands/info.d.ts +6 -0
  30. package/dist/commands/info.js +69 -0
  31. package/dist/commands/info.js.map +1 -0
  32. package/dist/commands/install-skill.d.ts +5 -0
  33. package/dist/commands/install-skill.js +28 -0
  34. package/dist/commands/install-skill.js.map +1 -0
  35. package/dist/commands/login.d.ts +10 -0
  36. package/dist/commands/login.js +93 -0
  37. package/dist/commands/login.js.map +1 -0
  38. package/dist/commands/ls.d.ts +6 -0
  39. package/dist/commands/ls.js +79 -0
  40. package/dist/commands/ls.js.map +1 -0
  41. package/dist/commands/mkdir.d.ts +6 -0
  42. package/dist/commands/mkdir.js +49 -0
  43. package/dist/commands/mkdir.js.map +1 -0
  44. package/dist/commands/mv.d.ts +9 -0
  45. package/dist/commands/mv.js +72 -0
  46. package/dist/commands/mv.js.map +1 -0
  47. package/dist/commands/read.d.ts +6 -0
  48. package/dist/commands/read.js +439 -0
  49. package/dist/commands/read.js.map +1 -0
  50. package/dist/commands/search.d.ts +7 -0
  51. package/dist/commands/search.js +92 -0
  52. package/dist/commands/search.js.map +1 -0
  53. package/dist/commands/share.d.ts +13 -0
  54. package/dist/commands/share.js +266 -0
  55. package/dist/commands/share.js.map +1 -0
  56. package/dist/commands/spaces.d.ts +6 -0
  57. package/dist/commands/spaces.js +43 -0
  58. package/dist/commands/spaces.js.map +1 -0
  59. package/dist/commands/tree.d.ts +6 -0
  60. package/dist/commands/tree.js +101 -0
  61. package/dist/commands/tree.js.map +1 -0
  62. package/dist/commands/update.d.ts +9 -0
  63. package/dist/commands/update.js +217 -0
  64. package/dist/commands/update.js.map +1 -0
  65. package/dist/commands/wiki.d.ts +6 -0
  66. package/dist/commands/wiki.js +286 -0
  67. package/dist/commands/wiki.js.map +1 -0
  68. package/dist/parser/block-types.d.ts +141 -0
  69. package/dist/parser/block-types.js +167 -0
  70. package/dist/parser/block-types.js.map +1 -0
  71. package/dist/parser/blocks-to-md.d.ts +26 -0
  72. package/dist/parser/blocks-to-md.js +666 -0
  73. package/dist/parser/blocks-to-md.js.map +1 -0
  74. package/dist/parser/text-elements.d.ts +13 -0
  75. package/dist/parser/text-elements.js +91 -0
  76. package/dist/parser/text-elements.js.map +1 -0
  77. package/dist/scopes.d.ts +21 -0
  78. package/dist/scopes.js +48 -0
  79. package/dist/scopes.js.map +1 -0
  80. package/dist/services/block-writer.d.ts +29 -0
  81. package/dist/services/block-writer.js +131 -0
  82. package/dist/services/block-writer.js.map +1 -0
  83. package/dist/services/doc-blocks.d.ts +8 -0
  84. package/dist/services/doc-blocks.js +26 -0
  85. package/dist/services/doc-blocks.js.map +1 -0
  86. package/dist/services/markdown-convert.d.ts +68 -0
  87. package/dist/services/markdown-convert.js +217 -0
  88. package/dist/services/markdown-convert.js.map +1 -0
  89. package/dist/services/wiki-nodes.d.ts +20 -0
  90. package/dist/services/wiki-nodes.js +46 -0
  91. package/dist/services/wiki-nodes.js.map +1 -0
  92. package/dist/types/index.d.ts +236 -0
  93. package/dist/types/index.js +5 -0
  94. package/dist/types/index.js.map +1 -0
  95. package/dist/utils/document-resolver.d.ts +26 -0
  96. package/dist/utils/document-resolver.js +46 -0
  97. package/dist/utils/document-resolver.js.map +1 -0
  98. package/dist/utils/drive-types.d.ts +4 -0
  99. package/dist/utils/drive-types.js +16 -0
  100. package/dist/utils/drive-types.js.map +1 -0
  101. package/dist/utils/errors.d.ts +23 -0
  102. package/dist/utils/errors.js +114 -0
  103. package/dist/utils/errors.js.map +1 -0
  104. package/dist/utils/member.d.ts +11 -0
  105. package/dist/utils/member.js +30 -0
  106. package/dist/utils/member.js.map +1 -0
  107. package/dist/utils/scope-prompt.d.ts +39 -0
  108. package/dist/utils/scope-prompt.js +134 -0
  109. package/dist/utils/scope-prompt.js.map +1 -0
  110. package/dist/utils/url-parser.d.ts +5 -0
  111. package/dist/utils/url-parser.js +55 -0
  112. package/dist/utils/url-parser.js.map +1 -0
  113. package/dist/utils/validate.d.ts +8 -0
  114. package/dist/utils/validate.js +15 -0
  115. package/dist/utils/validate.js.map +1 -0
  116. package/dist/utils/version.d.ts +12 -0
  117. package/dist/utils/version.js +128 -0
  118. package/dist/utils/version.js.map +1 -0
  119. package/package.json +53 -0
  120. package/skills/feishu-docs/SKILL.md +194 -0
@@ -0,0 +1,217 @@
1
+ /**
2
+ * update command: Update existing documents (append, overwrite, restore).
3
+ *
4
+ * Uses Convert + Descendant API for writing new content.
5
+ * Restore uses the old children API (backup data is raw blocks, not markdown).
6
+ */
7
+ import { readFile, unlink } from "node:fs/promises";
8
+ import { existsSync } from "node:fs";
9
+ import { resolve, normalize, sep } from "node:path";
10
+ import { randomUUID } from "node:crypto";
11
+ import { createClient, fetchWithAuth } from "../client.js";
12
+ import { CliError } from "../utils/errors.js";
13
+ import { convertAndWrite } from "../services/markdown-convert.js";
14
+ import { resolveDocument } from "../utils/document-resolver.js";
15
+ import { readBody, getDocumentInfo, clearDocument, backupDocument, sleep, BATCH_SIZE, QPS_DELAY, BACKUPS_DIR, } from "../services/block-writer.js";
16
+ export const meta = {
17
+ options: {
18
+ body: { type: "string" },
19
+ append: { type: "boolean", default: false },
20
+ restore: { type: "string" },
21
+ },
22
+ positionals: true,
23
+ handler: update,
24
+ };
25
+ export async function update(args, globalOpts) {
26
+ const input = args.positionals[0];
27
+ if (!input) {
28
+ throw new CliError("INVALID_ARGS", "缺少文档 URL 或 token。用法: feishu-docs update <url|token> --body <file>");
29
+ }
30
+ const { authInfo } = await createClient(globalOpts);
31
+ const doc = await resolveDocument(authInfo, input);
32
+ const documentId = doc.objToken;
33
+ if (doc.objType !== "docx") {
34
+ throw new CliError("INVALID_ARGS", `该文档类型 (${doc.objType}) 不支持更新`);
35
+ }
36
+ if (args.restore) {
37
+ return restoreFromBackup(authInfo, documentId, args.restore, globalOpts);
38
+ }
39
+ if (!args.body) {
40
+ throw new CliError("INVALID_ARGS", "缺少 --body 参数。用法: feishu-docs update <url|token> --body <file>");
41
+ }
42
+ const bodyContent = await readBody(args.body);
43
+ if (!bodyContent.trim()) {
44
+ throw new CliError("INVALID_ARGS", "文档内容为空,至少需要一行内容");
45
+ }
46
+ if (args.append) {
47
+ return appendToDocument(authInfo, documentId, bodyContent, globalOpts);
48
+ }
49
+ return overwriteDocument(authInfo, documentId, bodyContent, globalOpts);
50
+ }
51
+ async function appendToDocument(authInfo, documentId, bodyContent, globalOpts) {
52
+ const docInfo = await getDocumentInfo(authInfo, documentId);
53
+ await convertAndWrite(authInfo, documentId, bodyContent, docInfo.revisionId, -1);
54
+ if (globalOpts.json) {
55
+ process.stdout.write(JSON.stringify({
56
+ success: true,
57
+ document_id: documentId,
58
+ mode: "append",
59
+ }) + "\n");
60
+ }
61
+ else {
62
+ process.stdout.write(`已追加内容到文档 ${documentId}\n`);
63
+ }
64
+ }
65
+ async function overwriteDocument(authInfo, documentId, bodyContent, globalOpts) {
66
+ let backupPath;
67
+ try {
68
+ const backup = await backupDocument(authInfo, documentId);
69
+ backupPath = backup.filepath;
70
+ }
71
+ catch (err) {
72
+ throw new CliError("API_ERROR", `备份失败,操作中止: ${err.message}`);
73
+ }
74
+ const docInfo = await getDocumentInfo(authInfo, documentId);
75
+ let rev;
76
+ try {
77
+ rev = await clearDocument(authInfo, documentId, docInfo.revisionId);
78
+ }
79
+ catch (err) {
80
+ process.stderr.write(`feishu-docs: error: 清空文档失败: ${err.message}\n`);
81
+ process.stderr.write(`feishu-docs: info: 备份文件: ${backupPath}\n`);
82
+ throw err;
83
+ }
84
+ try {
85
+ await convertAndWrite(authInfo, documentId, bodyContent, rev);
86
+ }
87
+ catch (err) {
88
+ process.stderr.write(`feishu-docs: error: 写入新内容失败,尝试从备份恢复...\n`);
89
+ try {
90
+ await restoreFromBackup(authInfo, documentId, backupPath, globalOpts);
91
+ process.stderr.write("feishu-docs: info: 已从备份自动恢复\n");
92
+ }
93
+ catch (restoreErr) {
94
+ process.stderr.write(`feishu-docs: error: 自动恢复也失败: ${restoreErr.message}\n`);
95
+ process.stderr.write(`feishu-docs: info: 请手动恢复,备份文件: ${backupPath}\n`);
96
+ process.stderr.write("feishu-docs: info: 也可在飞书客户端中使用版本历史回退\n");
97
+ }
98
+ throw err;
99
+ }
100
+ // Write succeeded — clean up backup file
101
+ try {
102
+ await unlink(backupPath);
103
+ }
104
+ catch {
105
+ // Non-critical: backup file cleanup failure is silent
106
+ }
107
+ if (globalOpts.json) {
108
+ process.stdout.write(JSON.stringify({
109
+ success: true,
110
+ document_id: documentId,
111
+ mode: "overwrite",
112
+ }) + "\n");
113
+ }
114
+ else {
115
+ process.stdout.write(`已覆盖更新文档 ${documentId}\n`);
116
+ }
117
+ }
118
+ /**
119
+ * Recursively restore blocks and their descendants from a backup block map.
120
+ * Uses the old children API (backup data is raw blocks, not markdown).
121
+ */
122
+ const MAX_RESTORE_DEPTH = 20;
123
+ async function restoreChildren(authInfo, documentId, parentBlockId, childIds, blockMap, revisionId, depth = 0) {
124
+ let rev = revisionId;
125
+ if (!childIds || childIds.length === 0)
126
+ return rev;
127
+ if (depth >= MAX_RESTORE_DEPTH) {
128
+ process.stderr.write(`feishu-docs: warning: 恢复深度超过 ${MAX_RESTORE_DEPTH} 层,跳过更深层级\n`);
129
+ return rev;
130
+ }
131
+ for (let i = 0; i < childIds.length; i += BATCH_SIZE) {
132
+ const batchIds = childIds.slice(i, i + BATCH_SIZE);
133
+ const batch = batchIds
134
+ .map((id) => blockMap.get(id))
135
+ .filter(Boolean)
136
+ .map((b) => {
137
+ const { block_id, parent_id, children, ...rest } = b;
138
+ return rest;
139
+ });
140
+ if (batch.length === 0)
141
+ continue;
142
+ if (i > 0)
143
+ await sleep(QPS_DELAY);
144
+ const res = await fetchWithAuth(authInfo, `/open-apis/docx/v1/documents/${encodeURIComponent(documentId)}/blocks/${encodeURIComponent(parentBlockId)}/children`, {
145
+ method: "POST",
146
+ body: { children: batch, index: i },
147
+ params: { document_revision_id: rev, client_token: randomUUID() },
148
+ });
149
+ const resData = res?.data;
150
+ rev = resData?.document_revision_id ?? rev;
151
+ const createdIds = (resData?.children ?? []).map((c) => c.block_id);
152
+ for (let j = 0; j < createdIds.length && j < batchIds.length; j++) {
153
+ const original = blockMap.get(batchIds[j]);
154
+ if (original?.children?.length && original.children.length > 0) {
155
+ await sleep(QPS_DELAY);
156
+ rev = await restoreChildren(authInfo, documentId, createdIds[j], original.children, blockMap, rev, depth + 1);
157
+ }
158
+ }
159
+ }
160
+ return rev;
161
+ }
162
+ async function restoreFromBackup(authInfo, documentId, backupPath, globalOpts) {
163
+ const resolvedPath = resolve(normalize(backupPath));
164
+ const resolvedBackups = resolve(BACKUPS_DIR);
165
+ if (!resolvedPath.startsWith(resolvedBackups + sep)) {
166
+ throw new CliError("INVALID_ARGS", `备份文件必须位于 ${resolvedBackups} 目录下`, { recovery: `请使用 ${resolvedBackups} 下的备份文件路径` });
167
+ }
168
+ if (!existsSync(resolvedPath)) {
169
+ throw new CliError("FILE_NOT_FOUND", `备份文件不存在: ${resolvedPath}`);
170
+ }
171
+ if (!resolvedPath.endsWith(".json")) {
172
+ throw new CliError("INVALID_ARGS", "备份文件必须是 .json 格式");
173
+ }
174
+ const raw = await readFile(resolvedPath, "utf8");
175
+ let blocks;
176
+ try {
177
+ blocks = JSON.parse(raw);
178
+ }
179
+ catch {
180
+ throw new CliError("INVALID_ARGS", `备份文件 JSON 格式无效: ${resolvedPath}`);
181
+ }
182
+ if (!Array.isArray(blocks)) {
183
+ throw new CliError("INVALID_ARGS", "备份文件格式无效:期望 JSON 数组");
184
+ }
185
+ const rootBlock = blocks.find((b) => b.block_type === 1);
186
+ if (!rootBlock) {
187
+ throw new CliError("INVALID_ARGS", "备份文件格式无效:未找到根 block");
188
+ }
189
+ const topLevelIds = rootBlock.children || [];
190
+ if (topLevelIds.length === 0) {
191
+ process.stderr.write("feishu-docs: warning: 备份文件中没有可恢复的内容\n");
192
+ return;
193
+ }
194
+ const blockMap = new Map(blocks.map((b) => [b.block_id, b]));
195
+ const docInfo = await getDocumentInfo(authInfo, documentId);
196
+ let rev = await clearDocument(authInfo, documentId, docInfo.revisionId);
197
+ try {
198
+ rev = await restoreChildren(authInfo, documentId, documentId, topLevelIds, blockMap, rev);
199
+ }
200
+ catch (restoreErr) {
201
+ process.stderr.write(`feishu-docs: error: 恢复过程中出错: ${restoreErr.message}\n` +
202
+ ` 文档可能处于不完整状态。备份文件路径: ${resolvedPath}\n` +
203
+ ` 你可以在飞书客户端中使用版本历史恢复文档。\n`);
204
+ throw restoreErr;
205
+ }
206
+ if (globalOpts.json) {
207
+ process.stdout.write(JSON.stringify({
208
+ success: true,
209
+ document_id: documentId,
210
+ mode: "restore",
211
+ }) + "\n");
212
+ }
213
+ else {
214
+ process.stdout.write(`已从备份恢复文档 ${documentId}\n`);
215
+ }
216
+ }
217
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * wiki command: Wiki space and node management.
3
+ * Subcommands: create-space, add-member, remove-member, rename, move, copy.
4
+ */
5
+ import { SubcommandMeta } from "../types/index.js";
6
+ export declare const meta: SubcommandMeta;
@@ -0,0 +1,286 @@
1
+ /**
2
+ * wiki command: Wiki space and node management.
3
+ * Subcommands: create-space, add-member, remove-member, rename, move, copy.
4
+ */
5
+ import { createClient, fetchWithAuth } from "../client.js";
6
+ import { CliError } from "../utils/errors.js";
7
+ import { resolveDocument } from "../utils/document-resolver.js";
8
+ import { validateMemberId, detectMemberType } from "../utils/member.js";
9
+ import { validateToken } from "../utils/validate.js";
10
+ /**
11
+ * Resolve a wiki node URL/token to { spaceId, nodeToken }.
12
+ */
13
+ async function resolveWikiNode(authInfo, input) {
14
+ const doc = await resolveDocument(authInfo, input);
15
+ if (!doc.spaceId || !doc.nodeToken) {
16
+ throw new CliError("INVALID_ARGS", "该输入不是知识库节点,请使用知识库文档的 URL 或 wiki token");
17
+ }
18
+ return doc;
19
+ }
20
+ // wiki:wiki is a BASE_SCOPE (免审核), granted during login.
21
+ // Scope errors are handled reactively by fetchWithAuth if they occur.
22
+ // --- Subcommand: create-space ---
23
+ async function createSpace(args, globalOpts) {
24
+ const name = args.positionals[0];
25
+ if (!name) {
26
+ throw new CliError("INVALID_ARGS", "缺少知识库名称。用法: feishu-docs wiki create-space <name> [--desc <description>]");
27
+ }
28
+ const { authInfo } = await createClient(globalOpts);
29
+ const descStr = args.desc;
30
+ const body = {
31
+ name,
32
+ ...(descStr && { description: descStr }),
33
+ };
34
+ const res = await fetchWithAuth(authInfo, "/open-apis/wiki/v2/spaces", {
35
+ method: "POST",
36
+ body,
37
+ });
38
+ const resData = res?.data;
39
+ const space = resData?.space;
40
+ if (!space) {
41
+ throw new CliError("API_ERROR", "创建知识库成功但未返回 space 信息");
42
+ }
43
+ if (globalOpts.json) {
44
+ process.stdout.write(JSON.stringify({ success: true, ...space }, null, 2) + "\n");
45
+ }
46
+ else {
47
+ process.stdout.write(`已创建知识库: ${space.name}\n`);
48
+ process.stdout.write(`space_id: ${space.space_id}\n`);
49
+ }
50
+ }
51
+ // --- Subcommand: add-member ---
52
+ async function addMember(args, globalOpts) {
53
+ const spaceId = args.positionals[0];
54
+ const memberId = args.positionals[1];
55
+ if (!spaceId || !memberId) {
56
+ throw new CliError("INVALID_ARGS", "用法: feishu-docs wiki add-member <space_id> <member> [--role admin|member]");
57
+ }
58
+ validateToken(spaceId, "space_id");
59
+ validateMemberId(memberId);
60
+ const memberType = detectMemberType(memberId);
61
+ const memberRole = args.role || "member";
62
+ if (memberRole !== "admin" && memberRole !== "member") {
63
+ throw new CliError("INVALID_ARGS", `无效的角色: ${memberRole}。可选值: admin, member`);
64
+ }
65
+ const { authInfo } = await createClient(globalOpts);
66
+ let alreadyExist = false;
67
+ try {
68
+ await fetchWithAuth(authInfo, `/open-apis/wiki/v2/spaces/${encodeURIComponent(spaceId)}/members`, {
69
+ method: "POST",
70
+ body: {
71
+ member_type: memberType,
72
+ member_id: memberId,
73
+ member_role: memberRole,
74
+ },
75
+ });
76
+ }
77
+ catch (err) {
78
+ if (err.apiCode === 131008) {
79
+ alreadyExist = true;
80
+ }
81
+ else {
82
+ throw err;
83
+ }
84
+ }
85
+ if (globalOpts.json) {
86
+ process.stdout.write(JSON.stringify({
87
+ success: true,
88
+ space_id: spaceId,
89
+ member_id: memberId,
90
+ member_type: memberType,
91
+ member_role: memberRole,
92
+ already_exist: alreadyExist,
93
+ }) + "\n");
94
+ }
95
+ else {
96
+ if (alreadyExist) {
97
+ process.stdout.write(`${memberId} 已是知识库 ${spaceId} 的成员\n`);
98
+ }
99
+ else {
100
+ process.stdout.write(`已添加 ${memberId} 为知识库 ${spaceId} 的${memberRole === "admin" ? "管理员" : "成员"}\n`);
101
+ }
102
+ }
103
+ }
104
+ // --- Subcommand: remove-member ---
105
+ async function removeMember(args, globalOpts) {
106
+ const spaceId = args.positionals[0];
107
+ const memberId = args.positionals[1];
108
+ if (!spaceId || !memberId) {
109
+ throw new CliError("INVALID_ARGS", "用法: feishu-docs wiki remove-member <space_id> <member> [--role admin|member]");
110
+ }
111
+ validateToken(spaceId, "space_id");
112
+ validateMemberId(memberId);
113
+ const memberType = detectMemberType(memberId);
114
+ const memberRole = args.role || "member";
115
+ const { authInfo } = await createClient(globalOpts);
116
+ await fetchWithAuth(authInfo, `/open-apis/wiki/v2/spaces/${encodeURIComponent(spaceId)}/members/${encodeURIComponent(memberId)}`, {
117
+ method: "DELETE",
118
+ body: {
119
+ member_type: memberType,
120
+ member_role: memberRole,
121
+ },
122
+ });
123
+ if (globalOpts.json) {
124
+ process.stdout.write(JSON.stringify({
125
+ success: true,
126
+ space_id: spaceId,
127
+ removed: memberId,
128
+ }) + "\n");
129
+ }
130
+ else {
131
+ process.stdout.write(`已移除 ${memberId} 从知识库 ${spaceId}\n`);
132
+ }
133
+ }
134
+ // --- Subcommand: rename ---
135
+ async function rename(args, globalOpts) {
136
+ const input = args.positionals[0];
137
+ if (!input || !args.title) {
138
+ throw new CliError("INVALID_ARGS", "用法: feishu-docs wiki rename <url|token> --title <new_title>");
139
+ }
140
+ const { authInfo } = await createClient(globalOpts);
141
+ const doc = await resolveWikiNode(authInfo, input);
142
+ await fetchWithAuth(authInfo, `/open-apis/wiki/v2/spaces/${encodeURIComponent(doc.spaceId)}/nodes/${encodeURIComponent(doc.nodeToken)}/update_title`, {
143
+ method: "POST",
144
+ body: { title: args.title },
145
+ });
146
+ if (globalOpts.json) {
147
+ process.stdout.write(JSON.stringify({
148
+ success: true,
149
+ space_id: doc.spaceId,
150
+ node_token: doc.nodeToken,
151
+ title: args.title,
152
+ }) + "\n");
153
+ }
154
+ else {
155
+ process.stdout.write(`已重命名为: ${args.title}\n`);
156
+ }
157
+ }
158
+ // --- Subcommand: move ---
159
+ async function move(args, globalOpts) {
160
+ const input = args.positionals[0];
161
+ if (!input) {
162
+ throw new CliError("INVALID_ARGS", "用法: feishu-docs wiki move <url|token> --to <space_id> [--parent <node_token>]");
163
+ }
164
+ if (!args.to && !args.parent) {
165
+ throw new CliError("INVALID_ARGS", "至少需要 --to <space_id> 或 --parent <node_token>");
166
+ }
167
+ const { authInfo } = await createClient(globalOpts);
168
+ const doc = await resolveWikiNode(authInfo, input);
169
+ const toStr = args.to;
170
+ const parentStr = args.parent;
171
+ const body = {
172
+ ...(toStr && { target_space_id: toStr }),
173
+ ...(parentStr && { target_parent_token: parentStr }),
174
+ };
175
+ await fetchWithAuth(authInfo, `/open-apis/wiki/v2/spaces/${encodeURIComponent(doc.spaceId)}/nodes/${encodeURIComponent(doc.nodeToken)}/move`, {
176
+ method: "POST",
177
+ body,
178
+ });
179
+ if (globalOpts.json) {
180
+ process.stdout.write(JSON.stringify({
181
+ success: true,
182
+ node_token: doc.nodeToken,
183
+ from_space: doc.spaceId,
184
+ ...(toStr && { to_space: toStr }),
185
+ ...(parentStr && { to_parent: parentStr }),
186
+ }) + "\n");
187
+ }
188
+ else {
189
+ const dest = args.to ? `知识库 ${args.to}` : `节点 ${args.parent} 下`;
190
+ process.stdout.write(`已移动节点 ${doc.nodeToken} 到${dest}\n`);
191
+ }
192
+ }
193
+ // --- Subcommand: copy ---
194
+ async function copy(args, globalOpts) {
195
+ const input = args.positionals[0];
196
+ if (!input) {
197
+ throw new CliError("INVALID_ARGS", "用法: feishu-docs wiki copy <url|token> --to <space_id> [--parent <node_token>] [--title <new_title>]");
198
+ }
199
+ if (!args.to && !args.parent) {
200
+ throw new CliError("INVALID_ARGS", "至少需要 --to <space_id> 或 --parent <node_token>");
201
+ }
202
+ const { authInfo } = await createClient(globalOpts);
203
+ const doc = await resolveWikiNode(authInfo, input);
204
+ const copyToStr = args.to;
205
+ const copyParentStr = args.parent;
206
+ const copyTitleStr = args.title;
207
+ const body = {
208
+ ...(copyToStr && { target_space_id: copyToStr }),
209
+ ...(copyParentStr && { target_parent_token: copyParentStr }),
210
+ ...(copyTitleStr && { title: copyTitleStr }),
211
+ };
212
+ const res = await fetchWithAuth(authInfo, `/open-apis/wiki/v2/spaces/${encodeURIComponent(doc.spaceId)}/nodes/${encodeURIComponent(doc.nodeToken)}/copy`, {
213
+ method: "POST",
214
+ body,
215
+ });
216
+ const copyResData = res?.data;
217
+ const newNode = copyResData?.node;
218
+ if (globalOpts.json) {
219
+ process.stdout.write(JSON.stringify({
220
+ success: true,
221
+ source_node: doc.nodeToken,
222
+ ...(newNode && {
223
+ new_node_token: newNode.node_token,
224
+ new_space_id: newNode.space_id,
225
+ }),
226
+ }) + "\n");
227
+ }
228
+ else {
229
+ const dest = args.to ? `知识库 ${args.to}` : `节点 ${args.parent} 下`;
230
+ process.stdout.write(`已复制节点到${dest}\n`);
231
+ if (newNode?.node_token) {
232
+ process.stdout.write(`新节点: ${newNode.node_token}\n`);
233
+ }
234
+ }
235
+ }
236
+ // --- Meta: subcommand registry ---
237
+ export const meta = {
238
+ subcommands: {
239
+ "create-space": {
240
+ options: {
241
+ desc: { type: "string" },
242
+ },
243
+ positionals: true,
244
+ handler: createSpace,
245
+ },
246
+ "add-member": {
247
+ options: {
248
+ role: { type: "string", default: "member" },
249
+ },
250
+ positionals: true,
251
+ handler: addMember,
252
+ },
253
+ "remove-member": {
254
+ options: {
255
+ role: { type: "string", default: "member" },
256
+ },
257
+ positionals: true,
258
+ handler: removeMember,
259
+ },
260
+ rename: {
261
+ options: {
262
+ title: { type: "string" },
263
+ },
264
+ positionals: true,
265
+ handler: rename,
266
+ },
267
+ move: {
268
+ options: {
269
+ to: { type: "string" },
270
+ parent: { type: "string" },
271
+ },
272
+ positionals: true,
273
+ handler: move,
274
+ },
275
+ copy: {
276
+ options: {
277
+ to: { type: "string" },
278
+ parent: { type: "string" },
279
+ title: { type: "string" },
280
+ },
281
+ positionals: true,
282
+ handler: copy,
283
+ },
284
+ },
285
+ };
286
+ //# sourceMappingURL=wiki.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki.js","sourceRoot":"","sources":["../../src/commands/wiki.ts"],"names":[],"mappings":"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"}