vps-work 1.0.1 → 1.1.0

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.
@@ -128,7 +128,7 @@
128
128
  },
129
129
  {
130
130
  "name": "vps-documents",
131
- "description": "查询、读取、新建、重命名、复制、导出和共享 Vertu 企业云文档、智能表格与文件夹,读取智能表格工作簿并批量更新单元格,以及将文档卡片发送到当前 VPS IM 会话。用户提到云文档、V盘文档、企业文档、智能表格、创建文档、读取或更新表格单元格、修改标题、复制文档、导出 Markdown、设置文档权限或把文档发到当前会话时使用。入口为 `vps-work docs +…`。",
131
+ "description": "查询、读取、新建、重命名、复制、导出和共享 Vertu 企业云文档、智能表格、多维表与文件夹,读取智能表格工作簿并批量更新单元格,操作多维表记录/字段/视图,以及将文档卡片发送到当前 VPS IM 会话。用户提到云文档、V盘文档、企业文档、智能表格、多维表、创建文档、读取或更新表格单元格、修改标题、复制文档、导出 Markdown、设置文档权限或把文档发到当前会话时使用。入口为 `vps-work docs +…`。",
132
132
  "files": [
133
133
  "skills/vps-documents/SKILL.md",
134
134
  "skills/vps-documents/agents/openai.yaml",
package/USAGE.md CHANGED
@@ -145,7 +145,7 @@ vps-work attendance +schedules --rule-id <rule-id> --from-date 2026-08-26 --to-d
145
145
  vps-work attendance +schedule-preview --rule-id <rule-id> --employee-ids 123,456 --from-date 2026-08-26 --to-date 2026-08-31 --shift-template-id <shift-id>
146
146
  vps-work attendance +schedule-apply --rule-id <rule-id> --items-file ./schedule-plan.json --mode fill_missing --preview-token <token> --client-request-id <uuid>
147
147
  vps-work creative +models --type image
148
- vps-work creative +image --model <id> --prompt "一只金丝猴在雪山上" --aspect-ratio 16:9
148
+ vps-work creative +image --model openai/gpt-image-2.5-sunburst --prompt "一只金丝猴在雪山上" --aspect-ratio 16:9
149
149
  vps-work creative +video --model <id> --prompt "..." --ratio 16:9 --duration 5 --wait
150
150
  vps-work creative +video-status --model <id> --task-id <task_id>
151
151
  vps-work creative +tts --model <id> --text "你好,欢迎使用"
package/dist/vps-work.cjs CHANGED
@@ -61467,7 +61467,7 @@ function attachCreativeShortcuts(parent) {
61467
61467
  printResult5(opts, await vpsServiceGet("/v1/creative/models", query2, baseUrl4, "\u521B\u610F\u5DE5\u574A\u6A21\u578B"));
61468
61468
  });
61469
61469
  attachSharedShortcutOptions(
61470
- parent.command("+image").description("AI \u751F\u56FE / \u6539\u56FE\uFF0C\u8FD4\u56DE image_url \u4E0E\u8BA1\u8D39\uFF08POST /api/aigc/image-edit\uFF09").option("--model <id>", "\u6A21\u578B id \u6216 model_id\uFF08\u5FC5\u586B\uFF09").option("--prompt <text>", "\u753B\u9762\u63D0\u793A\u8BCD\uFF08\u5FC5\u586B\uFF09").option("--source-image-url <url>", "\u53C2\u8003/\u5E95\u56FE URL").option("--reference-images <urls>", "\u53C2\u8003\u56FE URL \u5217\u8868\uFF08\u9017\u53F7\u5206\u9694\uFF09").option("--size <size>", "\u8F93\u51FA\u5C3A\u5BF8\uFF0C\u5982 1024x1024 / auto").option("--quality <q>", "\u8D28\u91CF\uFF1Alow|medium|high|auto").option("--resolution <r>", "\u5206\u8FA8\u7387\u6863\uFF1A512|1K|2K|4K").option("--aspect-ratio <ratio>", "\u5BBD\u9AD8\u6BD4\uFF0C\u5982 1:1 / 16:9").option("--background <text>", "\u80CC\u666F\u63CF\u8FF0").option("--output-compression <n>", "\u8F93\u51FA\u538B\u7F29\u7EA7\u522B\uFF08\u6574\u6570\uFF09").option("--n <n>", "\u751F\u6210\u5F20\u6570\uFF08\u5F53\u524D\u63A5\u53E3\u56FA\u5B9A\u5355\u56FE\uFF09")
61470
+ parent.command("+image").description("AI \u751F\u56FE / \u6539\u56FE\uFF0C\u8FD4\u56DE image_url \u4E0E\u8BA1\u8D39\uFF08POST /api/aigc/image-edit\uFF09").option("--model <id>", "\u6A21\u578B id \u6216 model_id\uFF08\u5FC5\u586B\uFF09").option("--prompt <text>", "\u753B\u9762\u63D0\u793A\u8BCD\uFF08\u5FC5\u586B\uFF09").option("--source-image-url <url>", "\u53C2\u8003/\u5E95\u56FE URL").option("--reference-images <urls>", "\u53C2\u8003\u56FE URL \u5217\u8868\uFF08\u9017\u53F7\u5206\u9694\uFF09").option("--size <size>", "\u8F93\u51FA\u5C3A\u5BF8\uFF0C\u5982 1024x1024 / auto").option("--quality <q>", "\u8D28\u91CF\uFF1Aauto|low|medium|high|xhigh|max\uFF08\u540E\u4E24\u6863\u4EC5 gpt-image-2.5-sunburst\uFF09").option("--resolution <r>", "\u5206\u8FA8\u7387\u6863\uFF1A512|1K|2K|4K").option("--aspect-ratio <ratio>", "\u5BBD\u9AD8\u6BD4\uFF0C\u5982 1:1 / 16:9").option("--background <text>", "\u80CC\u666F\uFF1Aauto|opaque|transparent\uFF08transparent \u4EC5 gpt-image-2.5-sunburst\uFF09").option("--output-compression <n>", "\u8F93\u51FA\u538B\u7F29\u7EA7\u522B\uFF08\u6574\u6570\uFF09").option("--n <n>", "\u751F\u6210\u5F20\u6570\uFF08\u5F53\u524D\u63A5\u53E3\u56FA\u5B9A\u5355\u56FE\uFF09")
61471
61471
  ).action(async (opts, cmd) => {
61472
61472
  if (!opts.model || !opts.prompt) {
61473
61473
  throw new VertuError("\u751F\u56FE\u9700\u8981 --model \u4E0E --prompt");
@@ -61988,10 +61988,10 @@ async function resolveBlockPatch(opts) {
61988
61988
  }
61989
61989
  function parseDocType(value) {
61990
61990
  const normalized = value?.trim() || "block";
61991
- if (normalized === "block" || normalized === "sheet" || normalized === "folder") {
61991
+ if (normalized === "block" || normalized === "sheet" || normalized === "folder" || normalized === "base") {
61992
61992
  return normalized;
61993
61993
  }
61994
- throw new VertuError("--type \u9700\u4E3A block\u3001sheet \u6216 folder\u3002");
61994
+ throw new VertuError("--type \u9700\u4E3A block\u3001sheet\u3001folder \u6216 base\u3002");
61995
61995
  }
61996
61996
  function parseScope(value) {
61997
61997
  const normalized = value?.trim() || "mine";
@@ -62032,7 +62032,7 @@ function text2(recordValue, ...keys) {
62032
62032
  return "";
62033
62033
  }
62034
62034
  function documentType(value) {
62035
- return value === "sheet" || value === "folder" || value === "html" ? value : "block";
62035
+ return value === "sheet" || value === "folder" || value === "html" || value === "base" ? value : "block";
62036
62036
  }
62037
62037
  function documentExcerpt(value) {
62038
62038
  return typeof value === "string" ? value.replace(/\s+/g, " ").trim().slice(0, 800) : "";
@@ -62059,6 +62059,20 @@ async function resolveSheetUpdates(opts) {
62059
62059
  }
62060
62060
  return parsed;
62061
62061
  }
62062
+ async function resolveJsonRecords(opts) {
62063
+ if (opts.records !== void 0 && opts.recordsFile !== void 0) {
62064
+ throw new VertuError("--records \u548C --records-file \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528\u3002");
62065
+ }
62066
+ const raw = await resolveContent({ content: opts.records, contentFile: opts.recordsFile });
62067
+ if (raw === void 0) {
62068
+ throw new VertuError("\u8BF7\u63D0\u4F9B --records \u6216 --records-file\u3002");
62069
+ }
62070
+ const parsed = parseJsonArg(raw, "--records", { fileFlagSuggestion: "--records-file" });
62071
+ if (!Array.isArray(parsed) || parsed.length === 0) {
62072
+ throw new VertuError("\u8BB0\u5F55\u5FC5\u987B\u662F\u975E\u7A7A JSON \u6570\u7EC4\u3002");
62073
+ }
62074
+ return parsed;
62075
+ }
62062
62076
  function positiveIntegerEnv(...keys) {
62063
62077
  for (const key of keys) {
62064
62078
  const raw = process.env[key]?.trim();
@@ -62109,7 +62123,7 @@ function buildDocumentsCommand() {
62109
62123
  printDocumentsResult(opts.json, payload);
62110
62124
  });
62111
62125
  attachBaseOptions(
62112
- documents.command("+create").description("\u65B0\u5EFA\u6587\u6863\u3001\u667A\u80FD\u8868\u683C\u6216\u6587\u4EF6\u5939").requiredOption("--title <title>", "\u6807\u9898").option("--type <type>", "block / sheet / folder", "block").option("--content <text>", "\u65B0\u5EFA\u6587\u6863\u7684 Markdown \u521D\u59CB\u6B63\u6587").option("--content-file <path>", "\u4ECE UTF-8 \u6587\u4EF6\u8BFB\u53D6\u521D\u59CB\u6B63\u6587\uFF1B- \u8868\u793A stdin").option("--parent-id <id>", "\u7236\u6587\u4EF6\u5939 ID")
62126
+ documents.command("+create").description("\u65B0\u5EFA\u6587\u6863\u3001\u667A\u80FD\u8868\u683C\u3001\u591A\u7EF4\u8868\u6216\u6587\u4EF6\u5939").requiredOption("--title <title>", "\u6807\u9898").option("--type <type>", "block / sheet / folder / base", "block").option("--content <text>", "\u65B0\u5EFA\u6587\u6863\u7684 Markdown \u521D\u59CB\u6B63\u6587").option("--content-file <path>", "\u4ECE UTF-8 \u6587\u4EF6\u8BFB\u53D6\u521D\u59CB\u6B63\u6587\uFF1B- \u8868\u793A stdin").option("--parent-id <id>", "\u7236\u6587\u4EF6\u5939 ID")
62113
62127
  ).action(async (opts) => {
62114
62128
  const type = parseDocType(opts.type);
62115
62129
  const content = await resolveContent(opts);
@@ -62231,6 +62245,160 @@ Notes:
62231
62245
  );
62232
62246
  printDocumentsResult(opts.json, payload);
62233
62247
  });
62248
+ attachBaseOptions(
62249
+ documents.command("+base-schema").description("\u8BFB\u53D6\u591A\u7EF4\u8868\u7684\u8868\u3001\u5B57\u6BB5\u548C\u89C6\u56FE").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID")
62250
+ ).action(async (opts) => {
62251
+ printDocumentsResult(
62252
+ opts.json,
62253
+ await documentsRequest("GET", documentPath(required(opts.docId, "--doc-id"), "/base"), {
62254
+ baseUrl: opts.baseUrl
62255
+ })
62256
+ );
62257
+ });
62258
+ attachBaseOptions(
62259
+ documents.command("+base-tables").description("\u5217\u51FA\u591A\u7EF4\u8868\u4E2D\u7684\u6570\u636E\u8868").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID")
62260
+ ).action(async (opts) => {
62261
+ const payload = await documentsRequest(
62262
+ "GET",
62263
+ documentPath(required(opts.docId, "--doc-id"), "/base"),
62264
+ { baseUrl: opts.baseUrl }
62265
+ );
62266
+ printDocumentsResult(opts.json, { tables: payload.base?.tables ?? [] });
62267
+ });
62268
+ attachBaseOptions(
62269
+ documents.command("+base-create-table").description("\u65B0\u5EFA\u4E00\u5F20\u6570\u636E\u8868").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID").requiredOption("--name <name>", "\u6570\u636E\u8868\u540D\u79F0")
62270
+ ).action(async (opts) => {
62271
+ printDocumentsResult(
62272
+ opts.json,
62273
+ await documentsRequest("POST", documentPath(required(opts.docId, "--doc-id"), "/base/tables"), {
62274
+ baseUrl: opts.baseUrl,
62275
+ body: { name: required(opts.name, "--name") }
62276
+ })
62277
+ );
62278
+ });
62279
+ attachBaseOptions(
62280
+ documents.command("+base-records").description("\u8BFB\u53D6\u591A\u7EF4\u8868\u8BB0\u5F55").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID").requiredOption("--table <id>", "\u6570\u636E\u8868 ID").option("--view-id <id>", "\u6309\u89C6\u56FE\u8FC7\u6EE4").option("--query <text>", "\u5173\u952E\u5B57\u641C\u7D22").option("--limit <n>", "\u8FD4\u56DE\u6761\u6570")
62281
+ ).action(async (opts) => {
62282
+ printDocumentsResult(
62283
+ opts.json,
62284
+ await documentsRequest(
62285
+ "GET",
62286
+ documentPath(required(opts.docId, "--doc-id"), `/base/tables/${encodeURIComponent(required(opts.table, "--table"))}/records`),
62287
+ {
62288
+ baseUrl: opts.baseUrl,
62289
+ query: {
62290
+ limit: opts.limit,
62291
+ q: opts.query,
62292
+ viewId: opts.viewId
62293
+ }
62294
+ }
62295
+ )
62296
+ );
62297
+ });
62298
+ attachBaseOptions(
62299
+ documents.command("+base-create-records").description("\u6279\u91CF\u65B0\u589E\u8BB0\u5F55\uFF0Cfields \u4F7F\u7528\u5B57\u6BB5 ID").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID").requiredOption("--table <id>", "\u6570\u636E\u8868 ID").option("--records <json>", "\u8BB0\u5F55 JSON \u6570\u7EC4").option("--records-file <path>", "\u4ECE UTF-8 JSON \u6587\u4EF6\u8BFB\u53D6\u8BB0\u5F55\uFF1B- \u8868\u793A stdin")
62300
+ ).action(async (opts) => {
62301
+ printDocumentsResult(
62302
+ opts.json,
62303
+ await documentsRequest(
62304
+ "POST",
62305
+ documentPath(required(opts.docId, "--doc-id"), `/base/tables/${encodeURIComponent(required(opts.table, "--table"))}/records`),
62306
+ {
62307
+ baseUrl: opts.baseUrl,
62308
+ body: { records: await resolveJsonRecords(opts) }
62309
+ }
62310
+ )
62311
+ );
62312
+ });
62313
+ attachBaseOptions(
62314
+ documents.command("+base-update-records").description("\u6279\u91CF\u66F4\u65B0\u8BB0\u5F55\uFF0C\u6BCF\u9879\u9700\u542B id \u548C fields").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID").requiredOption("--table <id>", "\u6570\u636E\u8868 ID").option("--records <json>", "\u66F4\u65B0 JSON \u6570\u7EC4").option("--records-file <path>", "\u4ECE UTF-8 JSON \u6587\u4EF6\u8BFB\u53D6\u66F4\u65B0\uFF1B- \u8868\u793A stdin")
62315
+ ).action(async (opts) => {
62316
+ printDocumentsResult(
62317
+ opts.json,
62318
+ await documentsRequest(
62319
+ "PATCH",
62320
+ documentPath(required(opts.docId, "--doc-id"), `/base/tables/${encodeURIComponent(required(opts.table, "--table"))}/records`),
62321
+ {
62322
+ baseUrl: opts.baseUrl,
62323
+ body: { records: await resolveJsonRecords(opts) }
62324
+ }
62325
+ )
62326
+ );
62327
+ });
62328
+ attachBaseOptions(
62329
+ documents.command("+base-create-field").description("\u65B0\u589E\u5B57\u6BB5").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID").requiredOption("--table <id>", "\u6570\u636E\u8868 ID").requiredOption("--name <name>", "\u5B57\u6BB5\u540D\u79F0").requiredOption("--type <type>", "singleLineText / longText / number / singleSelect / multipleSelect / checkbox / date / attachment").option("--choices <json>", "\u5355\u9009/\u591A\u9009\u9009\u9879 JSON \u6570\u7EC4")
62330
+ ).action(async (opts) => {
62331
+ printDocumentsResult(
62332
+ opts.json,
62333
+ await documentsRequest(
62334
+ "POST",
62335
+ documentPath(required(opts.docId, "--doc-id"), `/base/tables/${encodeURIComponent(required(opts.table, "--table"))}/fields`),
62336
+ {
62337
+ baseUrl: opts.baseUrl,
62338
+ body: {
62339
+ name: required(opts.name, "--name"),
62340
+ options: opts.choices ? { choices: parseJsonArg(opts.choices, "--choices") } : void 0,
62341
+ type: required(opts.type, "--type")
62342
+ }
62343
+ }
62344
+ )
62345
+ );
62346
+ });
62347
+ attachBaseOptions(
62348
+ documents.command("+base-views").description("\u5217\u51FA\u6570\u636E\u8868\u89C6\u56FE").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID").requiredOption("--table <id>", "\u6570\u636E\u8868 ID")
62349
+ ).action(async (opts) => {
62350
+ printDocumentsResult(
62351
+ opts.json,
62352
+ await documentsRequest(
62353
+ "GET",
62354
+ documentPath(required(opts.docId, "--doc-id"), `/base/tables/${encodeURIComponent(required(opts.table, "--table"))}/views`),
62355
+ { baseUrl: opts.baseUrl }
62356
+ )
62357
+ );
62358
+ });
62359
+ attachBaseOptions(
62360
+ documents.command("+base-create-view").description("\u65B0\u5EFA\u53EA\u8BFB\u89C6\u56FE\u5B9A\u4E49").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID").requiredOption("--table <id>", "\u6570\u636E\u8868 ID").requiredOption("--name <name>", "\u89C6\u56FE\u540D\u79F0").option("--type <type>", "grid / kanban / form", "grid")
62361
+ ).action(async (opts) => {
62362
+ printDocumentsResult(
62363
+ opts.json,
62364
+ await documentsRequest(
62365
+ "POST",
62366
+ documentPath(required(opts.docId, "--doc-id"), `/base/tables/${encodeURIComponent(required(opts.table, "--table"))}/views`),
62367
+ {
62368
+ baseUrl: opts.baseUrl,
62369
+ body: { name: required(opts.name, "--name"), type: opts.type ?? "grid" }
62370
+ }
62371
+ )
62372
+ );
62373
+ });
62374
+ attachBaseOptions(
62375
+ documents.command("+base-import").description("\u4ECE CSV \u5BFC\u5165\u8BB0\u5F55").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID").requiredOption("--table <id>", "\u6570\u636E\u8868 ID").option("--csv <text>", "CSV \u6587\u672C").option("--csv-file <path>", "\u4ECE UTF-8 \u6587\u4EF6\u8BFB\u53D6 CSV\uFF1B- \u8868\u793A stdin")
62376
+ ).action(async (opts) => {
62377
+ const csv = await resolveContent({ content: opts.csv, contentFile: opts.csvFile });
62378
+ if (csv === void 0) {
62379
+ throw new VertuError("\u8BF7\u63D0\u4F9B --csv \u6216 --csv-file\u3002");
62380
+ }
62381
+ printDocumentsResult(
62382
+ opts.json,
62383
+ await documentsRequest(
62384
+ "POST",
62385
+ documentPath(required(opts.docId, "--doc-id"), `/base/tables/${encodeURIComponent(required(opts.table, "--table"))}/import`),
62386
+ { baseUrl: opts.baseUrl, body: { csv, hasHeader: true } }
62387
+ )
62388
+ );
62389
+ });
62390
+ attachBaseOptions(
62391
+ documents.command("+base-export").description("\u5BFC\u51FA\u5F53\u524D\u89C6\u56FE\u6216\u5168\u8868\u4E3A CSV").requiredOption("--doc-id <id>", "\u591A\u7EF4\u8868\u6587\u6863 ID").requiredOption("--table <id>", "\u6570\u636E\u8868 ID").option("--view-id <id>", "\u6309\u89C6\u56FE\u5BFC\u51FA")
62392
+ ).action(async (opts) => {
62393
+ printDocumentsResult(
62394
+ opts.json,
62395
+ await documentsRequest(
62396
+ "GET",
62397
+ documentPath(required(opts.docId, "--doc-id"), `/base/tables/${encodeURIComponent(required(opts.table, "--table"))}/export`),
62398
+ { baseUrl: opts.baseUrl, query: { viewId: opts.viewId } }
62399
+ )
62400
+ );
62401
+ });
62234
62402
  attachBaseOptions(
62235
62403
  documents.command("+share").description("\u8BBE\u7F6E\u94FE\u63A5\u6216\u4F01\u4E1A\u5185\u90E8\u5171\u4EAB\u6743\u9650").requiredOption("--doc-id <id>", "\u6587\u6863 ID").requiredOption("--mode <mode>", "private / public-view / public-edit / login-view / login-edit / team-view / team-edit")
62236
62404
  ).action(async (opts) => {
@@ -63948,7 +64116,7 @@ function buildCliRootHelpAfter() {
63948
64116
  "",
63949
64117
  " # Content creation (AI image / video / audio)",
63950
64118
  ` ${b} creative +models --type image`,
63951
- ` ${b} creative +image --model <id> --prompt "\u4E00\u53EA\u91D1\u4E1D\u7334\u5728\u96EA\u5C71\u4E0A" --aspect-ratio 16:9`,
64119
+ ` ${b} creative +image --model openai/gpt-image-2.5-sunburst --prompt "\u4E00\u53EA\u91D1\u4E1D\u7334\u5728\u96EA\u5C71\u4E0A" --aspect-ratio 16:9`,
63952
64120
  ` ${b} creative +video --model <id> --prompt "..." --ratio 16:9 --duration 5 --wait`,
63953
64121
  ` ${b} creative +video-status --model <id> --task-id <task_id>`,
63954
64122
  ` ${b} creative +tts --model <id> --text "\u4F60\u597D\uFF0C\u6B22\u8FCE\u4F7F\u7528" --voice-id <voice_id>`,
@@ -64041,7 +64209,7 @@ function rewriteLongFlag(tok) {
64041
64209
  }
64042
64210
 
64043
64211
  // src/bin/vps-work.ts
64044
- var PKG_VERSION = "1.0.1" ? "1.0.1" : "0.0.0-dev";
64212
+ var PKG_VERSION = "1.1.0" ? "1.1.0" : "0.0.0-dev";
64045
64213
  function smartFlagSuggest(flag, candidates) {
64046
64214
  if (!flag.startsWith("--") || flag.length < 4) return "";
64047
64215
  const word = flag.slice(2);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vps-work",
3
- "version": "1.0.1",
3
+ "version": "1.1.0",
4
4
  "description": "VPS Work CLI - tenant-aware domain shortcuts and bundled agent skills for Cursor / Claude Code / Trae.",
5
5
  "license": "MIT",
6
6
  "author": "he-linyan",
@@ -27,13 +27,13 @@ description: "内容创作画布(创意工坊)AI 生成:生图/改图、
27
27
  | Shortcut | flags |
28
28
  |----------|-------|
29
29
  | `+models` | `--type`(image / video / audio / tts / text) |
30
- | `+image` | `--model`(必填)`--prompt`(必填)`--source-image-url` `--reference-images`(逗号分隔)`--size` `--quality` `--resolution` `--aspect-ratio` `--background` `--output-compression` `--n` |
30
+ | `+image` | `--model`(必填)`--prompt`(必填)`--source-image-url` `--reference-images`(逗号分隔)`--size` `--quality`(`auto\|low\|medium\|high`,Sunburst 另有 `xhigh\|max`)`--resolution` `--aspect-ratio` `--background`(`auto\|opaque`,Sunburst 另有 `transparent`)`--output-compression` `--n` |
31
31
  | `+video` | `--model`(必填)`--prompt` `--reference-images` `--reference-videos` `--reference-audios` `--reference-audio-durations-sec` `--first-frame-image` `--last-frame-image` `--ratio` `--resolution` `--duration` `--generate-audio` `--watermark` `--wait` `--wait-timeout` `--poll-interval` |
32
32
  | `+video-status` | `--model`(必填)`--task-id`(必填) |
33
33
  | `+tts` | `--model`(必填)`--text`(必填)`--voice-id` `--speed` `--vol` `--pitch` `--emotion` `--format` `--sample-rate` `--bitrate` |
34
34
  | `+music` | `--model`(必填)`--prompt`(必填)`--lyrics` `--instrumental` `--lyrics-optimizer` `--format` `--sample-rate` `--bitrate` |
35
35
 
36
- `model` 可填 `model_id`(如 `gpt-image-1`、`doubao-seedance-2-0-*`、`speech-2.8-hd`、`music-2.6`)或模型行 UUID;不确定时先 `creative +models --type <image|video|tts|audio>` 查。
36
+ `model` 可填 `model_id`(如 `openai/gpt-image-2.5-sunburst`、`openai/gpt-image-2`、`google/gemini-3.1-flash-image`、`doubao-seedance-2-0-*`)或模型行 UUID;不确定时先 `creative +models --type <image|video|tts|audio>` 查。
37
37
 
38
38
  ## 生视频(异步)流程
39
39
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: vps-documents
3
- description: 查询、读取、新建、重命名、复制、导出和共享 Vertu 企业云文档、智能表格与文件夹,读取智能表格工作簿并批量更新单元格,以及将文档卡片发送到当前 VPS IM 会话。用户提到云文档、V盘文档、企业文档、智能表格、创建文档、读取或更新表格单元格、修改标题、复制文档、导出 Markdown、设置文档权限或把文档发到当前会话时使用。入口为 `vps-work docs +…`。
3
+ description: 查询、读取、新建、重命名、复制、导出和共享 Vertu 企业云文档、智能表格、多维表与文件夹,读取智能表格工作簿并批量更新单元格,操作多维表记录/字段/视图,以及将文档卡片发送到当前 VPS IM 会话。用户提到云文档、V盘文档、企业文档、智能表格、多维表、创建文档、读取或更新表格单元格、修改标题、复制文档、导出 Markdown、设置文档权限或把文档发到当前会话时使用。入口为 `vps-work docs +…`。
4
4
  ---
5
5
 
6
6
  # Vertu 企业云文档
@@ -20,6 +20,14 @@ description: 查询、读取、新建、重命名、复制、导出和共享 Ver
20
20
  | 精确修改段落格式 | `vps-work docs +update-block --doc-id <uuid> --block-id <id> --patch <json>` |
21
21
  | 新建文档 | `vps-work docs +create --title <标题> [--content-file <md>]` |
22
22
  | 新建智能表格 | `vps-work docs +create --title <标题> --type sheet` |
23
+ | 新增多维表 | `vps-work docs +create --title <标题> --type base` |
24
+ | 读取多维表结构 | `vps-work docs +base-schema --doc-id <uuid>` |
25
+ | 读取多维表记录 | `vps-work docs +base-records --doc-id <uuid> --table <id>` |
26
+ | 新增多维表记录 | `vps-work docs +base-create-records --doc-id <uuid> --table <id> --records-file <json>` |
27
+ | 更新多维表记录 | `vps-work docs +base-update-records --doc-id <uuid> --table <id> --records-file <json>` |
28
+ | 新增多维表字段 | `vps-work docs +base-create-field --doc-id <uuid> --table <id> --name <名称> --type <类型>` |
29
+ | 导入 CSV | `vps-work docs +base-import --doc-id <uuid> --table <id> --csv-file <csv>` |
30
+ | 导出 CSV | `vps-work docs +base-export --doc-id <uuid> --table <id>` |
23
31
  | 读取智能表格 | `vps-work docs +sheet-get --doc-id <uuid>` |
24
32
  | 更新智能表格单元格 | `vps-work docs +sheet-set-cells --doc-id <uuid> --updates-file <json>` |
25
33
  | 新建文件夹 | `vps-work docs +create --title <标题> --type folder` |
@@ -53,6 +61,7 @@ description: 查询、读取、新建、重命名、复制、导出和共享 Ver
53
61
  - `public-edit` 会允许持链接编辑,风险较高;用户没有明确要求时不得启用。
54
62
  - 复制、创建、重命名和共享是写操作;根据用户意图执行。删除能力目前不向 Agent CLI 开放。
55
63
  - 命令默认输出 JSON,优先读取 `id`、`title`、`type`、`role`、`shareMode`、`content`。
64
+ - 多维表字段 `--type`:`singleLineText`、`longText`、`number`、`singleSelect`、`multipleSelect`、`checkbox`、`date`、`attachment`。附件字段值为 `{ name, url, mimeType?, sizeBytes? }` 数组。
56
65
 
57
66
  ## 示例
58
67
 
@@ -14,6 +14,17 @@ CLI 统一请求 `vps-service`,由服务端校验 Hermes Agent Key、解析当
14
14
  | `docs +update-block` | `PATCH /v1/documents/:id/blocks/:blockId` | 在协作事务内精确修改一个块的白名单格式 |
15
15
  | `docs +sheet-get` | `GET /v1/documents/:id/sheet` | 返回智能表格当前工作簿 JSON |
16
16
  | `docs +sheet-set-cells` | `PUT /v1/documents/:id/sheet` | 通过实时协作工作簿批量更新 A1 单元格 |
17
+ | `docs +base-schema` | `GET /v1/documents/:id/base` | 多维表结构 |
18
+ | `docs +base-tables` | `GET /v1/documents/:id/base` | 从 schema 取出 tables |
19
+ | `docs +base-create-table` | `POST /v1/documents/:id/base/tables` | 新建数据表 |
20
+ | `docs +base-records` | `GET /v1/documents/:id/base/tables/:tableId/records` | 记录列表 |
21
+ | `docs +base-create-records` | `POST /v1/documents/:id/base/tables/:tableId/records` | 批量新增记录 |
22
+ | `docs +base-update-records` | `PATCH /v1/documents/:id/base/tables/:tableId/records` | 批量更新记录 |
23
+ | `docs +base-create-field` | `POST /v1/documents/:id/base/tables/:tableId/fields` | 新增字段 |
24
+ | `docs +base-views` | `GET /v1/documents/:id/base/tables/:tableId/views` | 视图列表 |
25
+ | `docs +base-create-view` | `POST /v1/documents/:id/base/tables/:tableId/views` | 新建视图 |
26
+ | `docs +base-import` | `POST /v1/documents/:id/base/tables/:tableId/import` | CSV 导入 |
27
+ | `docs +base-export` | `GET /v1/documents/:id/base/tables/:tableId/export` | CSV 导出 |
17
28
  | `docs +share` | `POST /v1/documents/:id/share` | 修改共享模式 |
18
29
  | `docs +send` | `GET /v1/documents/:id` + 可选 `POST /share` + IM 消息接口 | 生成 `document_share` 卡片并发送到当前 Hermes/VPS IM 会话 |
19
30
  | `docs +duplicate` | `POST /v1/documents/:id/duplicate` | 复制文档 |
@@ -36,6 +47,7 @@ API 调用方若不是 `vps-work`,也应调用公开的 `/v1/documents` 接口
36
47
 
37
48
  - `block`:块文档,创建时支持 Markdown 初始正文。
38
49
  - `sheet`:智能表格,支持创建、查询、读取工作簿、批量更新单元格、重命名、复制、共享和导出。
50
+ - `base`:多维表,独立服务保存表/字段/记录/视图;权限继承云文档 ACL。
39
51
  - `folder`:文件夹,用 `parentId` 组织层级。
40
52
 
41
53
  ## 共享模式