@optima-chat/tiktok-cli 0.13.0 → 0.14.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.
Files changed (3) hide show
  1. package/README.md +14 -0
  2. package/dist/index.js +228 -5
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -55,6 +55,20 @@ tiktok promotions create-flashsale --shop=<id> --price=11.9 # 等号式
55
55
 
56
56
  (0.10.2 之前只认空格式,等号式会让那一格参数**静默消失**而命令照报成功,见 #11。)
57
57
 
58
+ **每条命令只认它自己的参数**(`tiktok <命令> --help` 列出来),外加全局 `--shop` / `--apply`。
59
+ 不认的参数、多余的位置参数、`-f` 这类短参数一律**当场报 `VALIDATION`、不发请求**,并尽量给出最接近的写法:
60
+
61
+ ```bash
62
+ tiktok orders list --shop <id> --days 14
63
+ # ⇒ VALIDATION:orders list:不认 --days(这条命令没有 --days;近 N 天用起点表示,如 --from 2026-09-06 …)。…
64
+ tiktok products get --shop <id> --product-id 1737…
65
+ # ⇒ VALIDATION:products get:不认 --product-id(你是想用 --product 吗?)。…
66
+ ```
67
+
68
+ 报错体里另有 `unknown_flags` / `extra_positional` / `allowed_flags` 三个机读字段。
69
+ (此前不认的参数被**静默丢掉**、按默认值跑出一份看起来正常的结果:`--days 14` 实际查的是 30 天,
70
+ `--product-id` 请求的是 `/products/undefined`,见 #25。)
71
+
58
72
  **开关型 flag**(`--apply` / `--enable` / `--default` / `--unprocessed`)除了裸传,也能带值:
59
73
  `true`/`1`/`yes`/`on` 为真,`false`/`0`/`no`/`off`/空串为假(大小写不敏感),
60
74
  给它别的值**当场报错**而不是猜。同一个 flag 写两次以后者为准(`--apply=false --apply` 会真发)。
package/dist/index.js CHANGED
@@ -3,6 +3,103 @@
3
3
  // src/commands.ts
4
4
  import { readFileSync as readFileSync2 } from "fs";
5
5
 
6
+ // src/flags.ts
7
+ var GLOBAL_FLAGS = ["shop", "actor", "apply", "help"];
8
+ var ENTITY_FLAGS = ["product", "order", "package", "video", "sku", "creator", "conversation", "category", "warehouse", "shop"];
9
+ var SYNONYMS = {
10
+ "limit": "page-size",
11
+ "size": "page-size",
12
+ "pagesize": "page-size",
13
+ "per-page": "page-size",
14
+ "start": "from",
15
+ "start-date": "from",
16
+ "begin": "from",
17
+ "since-date": "from",
18
+ "end": "to",
19
+ "end-date": "to",
20
+ "until": "to",
21
+ "qty": "quantity",
22
+ "shop-id": "shop",
23
+ "shopid": "shop",
24
+ "shop_id": "shop"
25
+ };
26
+ var DAY_MS = 864e5;
27
+ function editDistance(a, b) {
28
+ const dp = Array.from({ length: a.length + 1 }, (_, i) => [i, ...Array(b.length).fill(0)]);
29
+ for (let j = 1; j <= b.length; j++) dp[0][j] = j;
30
+ for (let i = 1; i <= a.length; i++) {
31
+ for (let j = 1; j <= b.length; j++) {
32
+ dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
33
+ if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) dp[i][j] = Math.min(dp[i][j], dp[i - 2][j - 2] + 1);
34
+ }
35
+ }
36
+ return dp[a.length][b.length];
37
+ }
38
+ function suggestFlag(unknown, allowed, value, now = Date.now(), cmdName = "") {
39
+ const u = unknown.toLowerCase();
40
+ const dashed = u.replace(/_/g, "-");
41
+ const cands = [...allowed, ...GLOBAL_FLAGS.filter((g) => g !== "help")];
42
+ if (dashed === "days" && allowed.includes("from")) {
43
+ const n = Number(value);
44
+ const eg = Number.isFinite(n) && n > 0 ? new Date(now - n * DAY_MS).toISOString().slice(0, 10) : "<YYYY-MM-DD>";
45
+ const forms = allowed.includes("since") ? "YYYY-MM-DD \u6216 unix \u79D2" : "YYYY-MM-DD";
46
+ return `\u8FD9\u6761\u547D\u4EE4\u6CA1\u6709 --days\uFF1B\u8FD1 N \u5929\u7528\u8D77\u70B9\u8868\u793A\uFF0C\u5982 --from ${eg}\uFF08\u8D77\u6B62\u7528 --from / --to\uFF0C\u53D6 ${forms}\uFF09`;
47
+ }
48
+ if (dashed === "dry-run") {
49
+ return "\u4E0D\u9700\u8981 --dry-run\uFF1A\u5199\u547D\u4EE4\u9ED8\u8BA4\u5C31\u53EA\u9884\u89C8\u3001\u4E0D\u52A0 --apply \u4E0D\u4F1A\u771F\u53D1\uFF1B\u8BFB\u547D\u4EE4\u672C\u6765\u5C31\u4E0D\u5199\u3002\u53BB\u6389\u5B83\u5373\u53EF";
50
+ }
51
+ const syn = SYNONYMS[dashed] ?? SYNONYMS[u];
52
+ if (syn && cands.includes(syn)) return `--${syn}`;
53
+ if (dashed !== unknown && cands.includes(dashed)) return `--${dashed}`;
54
+ const base = dashed.replace(/-?ids?$/, "");
55
+ if (base && base !== dashed && ENTITY_FLAGS.includes(base) && cands.includes(base)) return `--${base}`;
56
+ if (dashed === "id") {
57
+ if (/\b(list|search|recommend)\b/.test(cmdName)) return null;
58
+ const ents = allowed.filter((f) => ENTITY_FLAGS.includes(f));
59
+ if (ents.length === 1) return `--${ents[0]}`;
60
+ return null;
61
+ }
62
+ let best = null;
63
+ let bestD = Infinity;
64
+ for (const f of cands) {
65
+ const d = editDistance(dashed, f);
66
+ if (d < bestD) {
67
+ best = f;
68
+ bestD = d;
69
+ }
70
+ }
71
+ const shortest = Math.min(dashed.length, (best ?? "").length);
72
+ const limit = shortest <= 3 ? 0 : shortest <= 6 ? 1 : 2;
73
+ const NEG = /^(un|dis|non|in)/;
74
+ if (best && best.replace(NEG, "") === dashed.replace(NEG, "") && best !== dashed) return null;
75
+ if (best && bestD <= limit) return `--${best}`;
76
+ return null;
77
+ }
78
+ function checkFlags(cmdName, args2, allowed, rest = [], now = Date.now(), noShop = false) {
79
+ const known = /* @__PURE__ */ new Set([...allowed, ...GLOBAL_FLAGS]);
80
+ const unknown = Object.keys(args2).filter((k) => !known.has(k));
81
+ if (unknown.length === 0 && rest.length === 0) return null;
82
+ const parts = [];
83
+ for (const k of unknown) {
84
+ if (k === "") {
85
+ parts.push(`\u4E0D\u8BA4 --=${args2[k]}\uFF08\u6CA1\u6709\u53C2\u6570\u540D\uFF09`);
86
+ continue;
87
+ }
88
+ const hint = suggestFlag(k, allowed, args2[k], now, cmdName);
89
+ parts.push(!hint ? `\u4E0D\u8BA4 --${k}` : hint.startsWith("--") ? `\u4E0D\u8BA4 --${k}\uFF08\u4F60\u662F\u60F3\u7528 ${hint} \u5417\uFF1F\uFF09` : `\u4E0D\u8BA4 --${k}\uFF08${hint}\uFF09`);
90
+ }
91
+ if (rest.length > 0) {
92
+ parts.push(`\u591A\u4F59\u7684\u4F4D\u7F6E\u53C2\u6570 ${rest.map((r) => JSON.stringify(r)).join(" ")}\uFF08\u672C CLI \u7684\u53C2\u6570\u90FD\u7528 --\u957F\u53C2\u6570 \u4F20\uFF0C\u4E0D\u6536\u4F4D\u7F6E\u53C2\u6570\u548C -x \u77ED\u53C2\u6570\uFF1B\u503C\u91CC\u6709\u7A7A\u683C\u5C31\u7ED9\u6574\u4E2A\u503C\u52A0\u5F15\u53F7\uFF0C\u5982 --title "Flash Sale"\uFF09`);
93
+ }
94
+ const allowedText = allowed.length ? allowed.map((f) => `--${f}`).join(" ") : "\uFF08\u6CA1\u6709\u4E13\u5C5E\u53C2\u6570\uFF09";
95
+ return {
96
+ unknown_flags: unknown,
97
+ extra_positional: [...rest],
98
+ allowed_flags: [...allowed],
99
+ message: `${cmdName}\uFF1A${parts.join("\uFF1B")}\u3002\u8FD9\u6761\u547D\u4EE4\u8BA4\u7684\u53C2\u6570\uFF1A${allowedText}\uFF08\u53E6\u6709\u5168\u5C40 ${noShop ? "--apply" : "--shop / --apply"}\uFF09\u3002\u26D4 \u6CA1\u53D1\u8BF7\u6C42 \u2014\u2014 \u4E0D\u8BA4\u7684\u53C2\u6570\u539F\u6765\u4F1A\u88AB\u9759\u9ED8\u4E22\u6389\u3001\u6309\u9ED8\u8BA4\u503C\u8DD1\u51FA\u4E00\u4EFD\u770B\u8D77\u6765\u6B63\u5E38\u7684\u7ED3\u679C\u3002`
100
+ };
101
+ }
102
+
6
103
  // src/client.ts
7
104
  import { readFileSync } from "fs";
8
105
  import { homedir } from "os";
@@ -209,9 +306,14 @@ function fillEmptyList(data, listKey) {
209
306
  if (!(listKey in d)) d[listKey] = [];
210
307
  }
211
308
  function commandUsage(cmd) {
212
- return `tiktok ${cmd.name} --shop <shopId> [--flags]
309
+ const flags = cmd.flags?.length ? cmd.flags.map((f) => `--${f}`).join(" ") : "\uFF08\u6CA1\u6709\u4E13\u5C5E\u53C2\u6570\uFF09";
310
+ const shop = cmd.noShop ? "" : " --shop <shopId>";
311
+ const globals = cmd.noShop ? "--apply" : "--shop / --apply";
312
+ return `tiktok ${cmd.name}${shop} [--flags]
213
313
 
214
314
  ${cmd.summary}
315
+
316
+ \u8BA4\u7684\u53C2\u6570\uFF1A${flags}\uFF08\u53E6\u6709\u5168\u5C40 ${globals}\uFF09\uFF1B\u4E0D\u8BA4\u7684\u4F1A\u5F53\u573A\u62A5\u9519\u3002
215
317
  `;
216
318
  }
217
319
  var today = () => (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
@@ -222,6 +324,7 @@ var COMMANDS = [
222
324
  {
223
325
  name: "orders list",
224
326
  summary: "\u8BA2\u5355\u5217\u8868\uFF08\u9ED8\u8BA4\u8FD130\u5929\u3001\u6309\u521B\u5EFA\u65F6\u95F4\u5012\u5E8F\uFF1B--from/--to\uFF08unix\u79D2\u6216YYYY-MM-DD\uFF09--status --page-size --sort-order ASC/DESC --sort-field create_time/update_time\uFF09",
327
+ flags: ["from", "page-size", "page-token", "since", "sort-field", "sort-order", "status", "to"],
225
328
  listKey: "orders",
226
329
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/order/202309/orders/search", {
227
330
  query: {
@@ -243,12 +346,14 @@ var COMMANDS = [
243
346
  {
244
347
  name: "orders get",
245
348
  summary: "\u8BA2\u5355\u8BE6\u60C5\uFF08--id \u5FC5\u586B\uFF09",
349
+ flags: ["id"],
246
350
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/order/202309/orders/detail", { query: { ids: args2.id } })
247
351
  },
248
352
  // ── 售后(退货/取消)只读 ──
249
353
  {
250
354
  name: "orders cancellations",
251
355
  summary: "\u53D6\u6D88\u5355\u5217\u8868\uFF08--status \u53EF\u9009\uFF0C--page-size\uFF09",
356
+ flags: ["page-size", "status"],
252
357
  listKey: "cancellations",
253
358
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/return_refund/202309/cancellations/search", {
254
359
  query: { page_size: String(args2["page-size"] ?? 20) },
@@ -258,6 +363,7 @@ var COMMANDS = [
258
363
  {
259
364
  name: "orders returns",
260
365
  summary: "\u9000\u8D27\u5355\u5217\u8868\uFF08--status \u53EF\u9009\uFF0C--page-size\uFF09",
366
+ flags: ["page-size", "status"],
261
367
  listKey: "return_orders",
262
368
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/return_refund/202309/returns/search", {
263
369
  query: { page_size: String(args2["page-size"] ?? 20) },
@@ -267,16 +373,19 @@ var COMMANDS = [
267
373
  {
268
374
  name: "orders return-records",
269
375
  summary: "\u9000\u8D27\u5355\u5904\u7406\u8BB0\u5F55\uFF08--id return_id\uFF09",
376
+ flags: ["id"],
270
377
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/return_refund/202309/returns/${args2.id}/records`, {})
271
378
  },
272
379
  {
273
380
  name: "orders aftersale-eligibility",
274
381
  summary: "\u8BA2\u5355\u552E\u540E\u8D44\u683C\uFF08--order id\uFF09",
382
+ flags: ["order"],
275
383
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/return_refund/202512/orders/${args2.order}/aftersale_eligibility`, {})
276
384
  },
277
385
  {
278
386
  name: "orders reject-reasons",
279
387
  summary: "\u9A73\u56DE\u53D6\u6D88/\u9000\u8D27\u7684\u5408\u6CD5\u7406\u7531\uFF08--id return_or_cancel_id\uFF09",
388
+ flags: ["id"],
280
389
  listKey: "reasons",
281
390
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/return_refund/202309/reject_reasons", {
282
391
  query: { return_or_cancel_id: args2.id }
@@ -285,6 +394,7 @@ var COMMANDS = [
285
394
  {
286
395
  name: "orders refund-calculate",
287
396
  summary: "\u8BA1\u7B97\u9000\u6B3E\u989D\uFF08--body-file calc.json\uFF09",
397
+ flags: ["body-file"],
288
398
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/return_refund/202309/refunds/calculate", {
289
399
  body: readBodyFile(args2["body-file"])
290
400
  })
@@ -293,11 +403,13 @@ var COMMANDS = [
293
403
  {
294
404
  name: "orders tracking",
295
405
  summary: "\u8BA2\u5355\u7269\u6D41\u8DDF\u8E2A\uFF08--order id\uFF09",
406
+ flags: ["order"],
296
407
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/fulfillment/202309/orders/${args2.order}/tracking`, {})
297
408
  },
298
409
  {
299
410
  name: "orders shipping-services",
300
411
  summary: "\u8BA2\u5355\u53EF\u7528\u627F\u8FD0/\u914D\u9001\u670D\u52A1\uFF08--order id\uFF09",
412
+ flags: ["order"],
301
413
  run: ({ shop, args: args2 }) => proxy("POST", shop, `/fulfillment/202309/orders/${args2.order}/shipping_services/query`, {
302
414
  body: {}
303
415
  })
@@ -305,6 +417,7 @@ var COMMANDS = [
305
417
  {
306
418
  name: "packages search",
307
419
  summary: "\u5305\u88F9\u5217\u8868\uFF08--page-size\uFF09",
420
+ flags: ["page-size"],
308
421
  listKey: "packages",
309
422
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/fulfillment/202309/packages/search", {
310
423
  query: { page_size: String(args2["page-size"] ?? 20) },
@@ -314,17 +427,20 @@ var COMMANDS = [
314
427
  {
315
428
  name: "packages get",
316
429
  summary: "\u5305\u88F9\u8BE6\u60C5\uFF08--package id\uFF09",
430
+ flags: ["package"],
317
431
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/fulfillment/202309/packages/${args2.package}`, {})
318
432
  },
319
433
  {
320
434
  name: "packages documents",
321
435
  summary: "\u5305\u88F9\u7269\u6D41\u9762\u5355\uFF08--package id\uFF09",
436
+ flags: ["package"],
322
437
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/fulfillment/202309/packages/${args2.package}/shipping_documents`, {})
323
438
  },
324
439
  // ── 售后审批 / 发货 写(不可逆,默认 dry-run,--apply 才提交)──
325
440
  {
326
441
  name: "orders cancel-approve",
327
442
  summary: "\u6279\u51C6\u53D6\u6D88\u5355\uFF08--id cancel_id\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u6279\u3002\u4E0D\u53EF\u9006",
443
+ flags: ["id"],
328
444
  write: true,
329
445
  preview: ({ args: args2 }) => [{
330
446
  step: "\u6279\u51C6\u53D6\u6D88\u5355",
@@ -337,6 +453,7 @@ var COMMANDS = [
337
453
  {
338
454
  name: "orders cancel-reject",
339
455
  summary: "\u9A73\u56DE\u53D6\u6D88\u5355\uFF08--id --reason\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u9A73\u3002\u4E0D\u53EF\u9006",
456
+ flags: ["id", "reason"],
340
457
  write: true,
341
458
  preview: ({ args: args2 }) => [{
342
459
  step: "\u9A73\u56DE\u53D6\u6D88\u5355",
@@ -354,6 +471,7 @@ var COMMANDS = [
354
471
  {
355
472
  name: "orders return-approve",
356
473
  summary: "\u6279\u51C6\u9000\u8D27\u5355\uFF08--id return_id\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u6279\u3002\u4E0D\u53EF\u9006",
474
+ flags: ["id"],
357
475
  write: true,
358
476
  preview: ({ args: args2 }) => [{
359
477
  step: "\u6279\u51C6\u9000\u8D27\u5355",
@@ -366,6 +484,7 @@ var COMMANDS = [
366
484
  {
367
485
  name: "orders return-reject",
368
486
  summary: "\u9A73\u56DE\u9000\u8D27\u5355\uFF08--id --reason\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u9A73\u3002\u4E0D\u53EF\u9006",
487
+ flags: ["id", "reason"],
369
488
  write: true,
370
489
  preview: ({ args: args2 }) => [{
371
490
  step: "\u9A73\u56DE\u9000\u8D27\u5355",
@@ -383,6 +502,7 @@ var COMMANDS = [
383
502
  {
384
503
  name: "orders create-package",
385
504
  summary: "\u4E3A\u8BA2\u5355\u5EFA\u5305\u88F9\uFF08--order id --body-file pkg.json\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u5EFA\u3002\u4EC5\u76F4\u53D1\u5546\u5BB6\uFF08\u7269\u6D41\u9ED8\u8BA4 ERP \u7BA1\uFF09",
505
+ flags: ["body-file", "order"],
386
506
  write: true,
387
507
  preview: ({ args: args2 }) => [{
388
508
  step: "\u5EFA\u5305\u88F9",
@@ -400,6 +520,7 @@ var COMMANDS = [
400
520
  {
401
521
  name: "packages ship",
402
522
  summary: "\u53D1\u8D27\uFF08--package id --body-file ship.json\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u53D1\u3002\u4E0D\u53EF\u9006\uFF0C\u4EC5\u76F4\u53D1\u5546\u5BB6",
523
+ flags: ["body-file", "package"],
403
524
  write: true,
404
525
  preview: ({ args: args2 }) => [{
405
526
  step: "\u53D1\u8D27",
@@ -418,6 +539,7 @@ var COMMANDS = [
418
539
  {
419
540
  name: "events",
420
541
  summary: "\u67E5\u5E97\u94FA webhook \u4E8B\u4EF6\uFF08--type \u9017\u53F7\u5206\u9694 --since 1d/unix --unprocessed --limit\uFF09",
542
+ flags: ["limit", "since", "type", "unprocessed"],
421
543
  run: ({ shop, args: args2 }) => {
422
544
  const q = {};
423
545
  if (args2.type) q.type = args2.type;
@@ -430,6 +552,7 @@ var COMMANDS = [
430
552
  {
431
553
  name: "events ack",
432
554
  summary: "\u6807\u4E8B\u4EF6\u5DF2\u5904\u7406\uFF08--ids id1,id2 \u6216 --before <ts>\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u6807",
555
+ flags: ["before", "ids"],
433
556
  write: true,
434
557
  preview: ({ args: args2 }) => [{
435
558
  step: "\u6807\u4E8B\u4EF6\u5DF2\u5904\u7406",
@@ -442,6 +565,7 @@ var COMMANDS = [
442
565
  {
443
566
  name: "analytics shop",
444
567
  summary: "\u5E97\u94FA\u7ECF\u8425\u6570\u636E\uFF08--from --to\uFF0C\u9ED8\u8BA4\u8FD130\u5929\uFF09",
568
+ flags: ["from", "granularity", "to"],
445
569
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop/performance", {
446
570
  query: {
447
571
  start_date_ge: args2.from ?? daysAgo(30),
@@ -453,6 +577,7 @@ var COMMANDS = [
453
577
  {
454
578
  name: "analytics products",
455
579
  summary: "\u5546\u54C1\u7EF4\u5EA6\u7ECF\u8425\u6570\u636E\uFF08\u6309 GMV \u964D\u5E8F\uFF09",
580
+ flags: ["from", "page-size", "to"],
456
581
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_products/performance", {
457
582
  query: {
458
583
  start_date_ge: args2.from ?? daysAgo(30),
@@ -466,6 +591,7 @@ var COMMANDS = [
466
591
  {
467
592
  name: "analytics videos",
468
593
  summary: "\u5185\u5BB9\u89C6\u9891\u7EF4\u5EA6\u7ECF\u8425\u6570\u636E\uFF08shop_videos\uFF0C--from --to\uFF0C\u9ED8\u8BA4\u8FD130\u5929\uFF0C\u6309 GMV \u964D\u5E8F\uFF1B--sort-field --sort-order --page-size --page-token\uFF09",
594
+ flags: ["from", "page-size", "page-token", "sort-field", "sort-order", "to"],
469
595
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_videos/performance", {
470
596
  query: {
471
597
  start_date_ge: args2.from ?? daysAgo(30),
@@ -480,6 +606,7 @@ var COMMANDS = [
480
606
  {
481
607
  name: "analytics videos-overview",
482
608
  summary: "\u5185\u5BB9\u89C6\u9891\u6574\u4F53\u6982\u89C8\uFF08shop_videos overview\uFF1B--from --to --granularity\uFF09",
609
+ flags: ["from", "granularity", "to"],
483
610
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_videos/overview_performance", {
484
611
  query: {
485
612
  start_date_ge: args2.from ?? daysAgo(30),
@@ -491,6 +618,7 @@ var COMMANDS = [
491
618
  {
492
619
  name: "analytics video",
493
620
  summary: "\u5355\u6761\u89C6\u9891\u7ECF\u8425\u660E\u7EC6\uFF08--video video_id \u5FC5\u586B\uFF1B--from --to\uFF09",
621
+ flags: ["from", "to", "video"],
494
622
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202509/shop_videos/${args2.video}/performance`, {
495
623
  query: {
496
624
  start_date_ge: args2.from ?? daysAgo(30),
@@ -501,6 +629,7 @@ var COMMANDS = [
501
629
  {
502
630
  name: "analytics video-products",
503
631
  summary: "\u5355\u6761\u89C6\u9891\u5E26\u8D27\u5546\u54C1\u8868\u73B0\uFF08--video video_id \u5FC5\u586B\uFF1B--from --to --page-size\uFF09",
632
+ flags: ["from", "page-size", "to", "video"],
504
633
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202509/shop_videos/${args2.video}/products/performance`, {
505
634
  query: {
506
635
  start_date_ge: args2.from ?? daysAgo(30),
@@ -512,6 +641,7 @@ var COMMANDS = [
512
641
  {
513
642
  name: "analytics lives",
514
643
  summary: "\u76F4\u64AD\u7EF4\u5EA6\u7ECF\u8425\u6570\u636E\uFF08shop_lives\uFF0C--from --to\uFF0C\u9ED8\u8BA4\u8FD130\u5929\uFF0C\u6309 GMV \u964D\u5E8F\uFF1B--sort-field --sort-order --page-size --page-token\uFF09",
644
+ flags: ["from", "page-size", "page-token", "sort-field", "sort-order", "to"],
515
645
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_lives/performance", {
516
646
  query: {
517
647
  start_date_ge: args2.from ?? daysAgo(30),
@@ -526,6 +656,7 @@ var COMMANDS = [
526
656
  {
527
657
  name: "analytics lives-overview",
528
658
  summary: "\u76F4\u64AD\u6574\u4F53\u6982\u89C8\uFF08shop_lives overview\uFF1B--from --to --granularity\uFF09",
659
+ flags: ["from", "granularity", "to"],
529
660
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_lives/overview_performance", {
530
661
  query: {
531
662
  start_date_ge: args2.from ?? daysAgo(30),
@@ -537,6 +668,7 @@ var COMMANDS = [
537
668
  {
538
669
  name: "analytics skus",
539
670
  summary: "SKU \u7EF4\u5EA6\u7ECF\u8425\u6570\u636E\uFF08shop_skus\uFF0C--from --to\uFF0C\u9ED8\u8BA4\u8FD130\u5929\uFF0C\u6309 GMV \u964D\u5E8F\uFF1B--sort-field --sort-order --page-size --page-token\uFF09",
671
+ flags: ["from", "page-size", "page-token", "sort-field", "sort-order", "to"],
540
672
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_skus/performance", {
541
673
  query: {
542
674
  start_date_ge: args2.from ?? daysAgo(30),
@@ -551,6 +683,7 @@ var COMMANDS = [
551
683
  {
552
684
  name: "analytics sku",
553
685
  summary: "\u5355\u4E2A SKU \u7ECF\u8425\u660E\u7EC6\uFF08--sku sku_id \u5FC5\u586B\uFF1B--from --to --granularity\uFF09",
686
+ flags: ["from", "granularity", "sku", "to"],
554
687
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202509/shop_skus/${args2.sku}/performance`, {
555
688
  query: {
556
689
  start_date_ge: args2.from ?? daysAgo(30),
@@ -562,6 +695,7 @@ var COMMANDS = [
562
695
  {
563
696
  name: "analytics product",
564
697
  summary: "\u5355\u4E2A\u5546\u54C1\u7ECF\u8425\u660E\u7EC6\uFF08--product product_id \u5FC5\u586B\uFF1B--from --to --granularity\uFF09",
698
+ flags: ["from", "granularity", "product", "to"],
565
699
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202509/shop_products/${args2.product}/performance`, {
566
700
  query: {
567
701
  start_date_ge: args2.from ?? daysAgo(30),
@@ -573,11 +707,13 @@ var COMMANDS = [
573
707
  {
574
708
  name: "analytics shop-hourly",
575
709
  summary: "\u5E97\u94FA\u67D0\u5929\u5206\u65F6\uFF08\u9010\u5C0F\u65F6\uFF09\u7ECF\u8425\u6570\u636E\uFF08--date YYYY-MM-DD\uFF0C\u9ED8\u8BA4\u6628\u5929\uFF09",
710
+ flags: ["date"],
576
711
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202510/shop/performance/${args2.date ?? daysAgo(1)}/performance_per_hour`, {})
577
712
  },
578
713
  {
579
714
  name: "products list",
580
715
  summary: "\u5546\u54C1\u5217\u8868\uFF08--status ACTIVATE \u53EA\u53D6\u5728\u552E\uFF1B\u4E0D\u4F20\u8FD4\u6240\u6709\u542B DELETED\uFF0C\u5199\u64CD\u4F5C\u524D\u52A1\u5FC5\u7B5B ACTIVATE\uFF09",
716
+ flags: ["page-size", "status"],
581
717
  listKey: "products",
582
718
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/product/202309/products/search", {
583
719
  query: { page_size: args2["page-size"] ?? "20" },
@@ -587,11 +723,13 @@ var COMMANDS = [
587
723
  {
588
724
  name: "products get",
589
725
  summary: "\u5355\u4E2A\u5546\u54C1\u5B8C\u6574\u8BE6\u60C5\uFF08--product id\uFF1B\u9010\u5B57\u6BB5\u56DE\u8BFB\u7528\uFF1A\u6807\u9898/\u63CF\u8FF0/\u56FE/SKU/\u4EF7/\u5E93\u5B58/\u91CD\u91CF/\u5C3A\u5BF8/\u5C5E\u6027\uFF09",
726
+ flags: ["product"],
590
727
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/product/202309/products/${args2.product}`, {})
591
728
  },
592
729
  {
593
730
  name: "products diagnose",
594
731
  summary: "\u5546\u54C1\u5B98\u65B9\u95EE\u9898\u8BCA\u65AD\uFF08--product \u9017\u53F7\u5206\u9694\u672C\u5E97\u81EA\u6709\u5546\u54C1 id\uFF09",
732
+ flags: ["product"],
595
733
  listKey: "products",
596
734
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/product/202405/products/diagnoses", {
597
735
  query: { product_ids: String(args2.product ?? "") }
@@ -600,6 +738,7 @@ var COMMANDS = [
600
738
  {
601
739
  name: "promotions list",
602
740
  summary: "\u4FC3\u9500\u6D3B\u52A8\u5217\u8868\uFF08--status \u7701\u7565=\u5168\u90E8\u72B6\u6001\uFF5CONGOING/NOT_START/EXPIRED/DEACTIVATED\uFF0C\u53D6\u503C\u533A\u5206\u5927\u5C0F\u5199\u4E14\u4E0D trim\uFF0C\u672A\u77E5\u503C\u672C\u5730\u62D2\u3001\u5E73\u53F0\u4F1A\u9759\u9ED8\u8FD4\u56DE\u5168\u90E8\uFF1B--force-status \u8D8A\u8FC7\u672C\u5730\u6821\u9A8C\uFF1B--page-size \u9ED8\u8BA420\uFF1B--page-token \u7FFB\u9875\uFF0C\u672B\u9875\u65E0 next_page_token\uFF09",
741
+ flags: ["force-status", "page-size", "page-token", "status"],
603
742
  listKey: "activities",
604
743
  run: ({ shop, args: args2 }) => {
605
744
  const st = args2.status ? String(args2.status) : "";
@@ -631,6 +770,7 @@ var COMMANDS = [
631
770
  {
632
771
  name: "finance statements",
633
772
  summary: "\u7ED3\u7B97\u5355\u5217\u8868",
773
+ flags: ["page-size", "sort-field", "sort-order"],
634
774
  listKey: "statements",
635
775
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/finance/202309/statements", {
636
776
  query: {
@@ -644,22 +784,26 @@ var COMMANDS = [
644
784
  {
645
785
  name: "seller status",
646
786
  summary: "\u8D26\u53F7/\u5E97\u94FA\u72B6\u6001\uFF08seller_status/shop_statuses/tax_form_status\uFF09",
787
+ flags: [],
647
788
  run: ({ shop }) => proxy("GET", shop, "/seller/202508/status", {})
648
789
  },
649
790
  {
650
791
  name: "seller permissions",
651
792
  summary: "\u5DF2\u6388\u6743\u6743\u9650\u5217\u8868",
793
+ flags: [],
652
794
  run: ({ shop }) => proxy("GET", shop, "/seller/202309/permissions", {})
653
795
  },
654
796
  // ===== 建品前置只读辅助命令 =====
655
797
  {
656
798
  name: "products prerequisites",
657
799
  summary: "\u5EFA\u54C1\u524D\u7F6E\u68C0\u67E5",
800
+ flags: [],
658
801
  run: ({ shop }) => proxy("GET", shop, "/product/202312/prerequisites", {})
659
802
  },
660
803
  {
661
804
  name: "categories recommend",
662
805
  summary: "\u7C7B\u76EE\u63A8\u8350\uFF08--title [--desc]\uFF09",
806
+ flags: ["desc", "title"],
663
807
  listKey: "categories",
664
808
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/product/202309/categories/recommend", {
665
809
  body: {
@@ -671,6 +815,7 @@ var COMMANDS = [
671
815
  {
672
816
  name: "categories tree",
673
817
  summary: "\u7C7B\u76EE\u6811\uFF08--version v2\uFF09",
818
+ flags: ["version"],
674
819
  listKey: "categories",
675
820
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/product/202309/categories", {
676
821
  query: { category_version: args2.version ?? "v2" }
@@ -679,6 +824,7 @@ var COMMANDS = [
679
824
  {
680
825
  name: "categories attributes",
681
826
  summary: "\u7C7B\u76EE\u5C5E\u6027\uFF08--category\uFF09",
827
+ flags: ["category", "version"],
682
828
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/product/202309/categories/${args2.category}/attributes`, {
683
829
  query: { category_version: args2.version ?? "v2" }
684
830
  })
@@ -686,6 +832,7 @@ var COMMANDS = [
686
832
  {
687
833
  name: "categories rules",
688
834
  summary: "\u7C7B\u76EE\u89C4\u5219\uFF08--category\uFF09",
835
+ flags: ["category", "version"],
689
836
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/product/202309/categories/${args2.category}/rules`, {
690
837
  query: { category_version: args2.version ?? "v2" }
691
838
  })
@@ -693,6 +840,7 @@ var COMMANDS = [
693
840
  {
694
841
  name: "brands list",
695
842
  summary: "\u54C1\u724C\u5217\u8868\uFF08[--category] [--name]\uFF09",
843
+ flags: ["category", "name", "page-size"],
696
844
  listKey: "brands",
697
845
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/product/202309/brands", {
698
846
  query: {
@@ -705,6 +853,7 @@ var COMMANDS = [
705
853
  {
706
854
  name: "brands recommend",
707
855
  summary: "\u54C1\u724C\u63A8\u8350\uFF08--title\uFF09",
856
+ flags: ["title"],
708
857
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/product/202309/brands/recommend", {
709
858
  body: { product_title: args2.title }
710
859
  })
@@ -712,18 +861,21 @@ var COMMANDS = [
712
861
  {
713
862
  name: "warehouses list",
714
863
  summary: "\u4ED3\u5E93\u5217\u8868\uFF08\u8DE8\u5883\u8BA4 sub_type CB_*\uFF09",
864
+ flags: [],
715
865
  listKey: "warehouses",
716
866
  run: ({ shop }) => proxy("GET", shop, "/logistics/202309/warehouses", {})
717
867
  },
718
868
  {
719
869
  name: "shipping-templates list",
720
870
  summary: "\u8FD0\u8D39\u6A21\u677F\u5217\u8868",
871
+ flags: [],
721
872
  listKey: "templates",
722
873
  run: ({ shop }) => proxy("GET", shop, "/logistics/202510/seller_templates", {})
723
874
  },
724
875
  {
725
876
  name: "delivery-options",
726
877
  summary: "\u4ED3\u5E93\u4EA4\u4ED8\u65B9\u5F0F\uFF08--warehouse\uFF09",
878
+ flags: ["warehouse"],
727
879
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/logistics/202309/warehouses/${args2.warehouse}/delivery_options`, {
728
880
  query: { scope: "PRODUCT" }
729
881
  })
@@ -732,6 +884,7 @@ var COMMANDS = [
732
884
  {
733
885
  name: "products set-price",
734
886
  summary: "\u6539 SKU \u552E\u4EF7\uFF08--product --sku --price [--currency MYR]\uFF09\u3002\u5199\u64CD\u4F5C,\u9ED8\u8BA4 dry-run",
887
+ flags: ["currency", "price", "product", "sku"],
735
888
  write: true,
736
889
  preview: ({ args: args2 }) => [{
737
890
  step: "\u6539\u4EF7",
@@ -745,6 +898,7 @@ var COMMANDS = [
745
898
  {
746
899
  name: "promotions create-flashsale",
747
900
  summary: "\u5EFA\u79D2\u6740\u6D3B\u52A8\uFF08--title --product --sku --price [--limit] [--hours 48]\uFF09\u3002\u4E24\u6B65:\u5EFA\u58F3+\u52A0\u54C1",
901
+ flags: ["hours", "limit", "per-user", "price", "product", "sku", "start-in-min", "title"],
748
902
  write: true,
749
903
  preview: ({ args: args2 }) => {
750
904
  const { begin, end } = flashWindow(args2);
@@ -769,6 +923,7 @@ var COMMANDS = [
769
923
  {
770
924
  name: "promotions create-discount",
771
925
  summary: "\u5EFA\u5546\u54C1\u6298\u6263\u6D3B\u52A8 FIXED_PRICE\uFF08--title [--product] --price <skuId>:<\u4E00\u53E3\u4EF7>|<productId>/<skuId>:<\u4E00\u53E3\u4EF7>[,...] [--days 180]\uFF09\u3002\u4E24\u6B65:\u5EFA\u58F3+\u52A0\u54C1\uFF0C\u53EF\u591A\u5546\u54C1",
926
+ flags: ["days", "price", "product", "title"],
772
927
  write: true,
773
928
  validate: validateCreateDiscount,
774
929
  preview: ({ args: args2 }) => {
@@ -835,6 +990,7 @@ var COMMANDS = [
835
990
  {
836
991
  name: "promotions deactivate",
837
992
  summary: "\u7EC8\u6B62/\u505C\u7528\u4FC3\u9500\u6D3B\u52A8\uFF08--id \u5FC5\u586B\uFF09\u3002\u4E0D\u53EF\u9006",
993
+ flags: ["id"],
838
994
  write: true,
839
995
  preview: ({ args: args2 }) => [{ step: "\u7EC8\u6B62\u6D3B\u52A8", method: "POST", path: `/promotion/202309/activities/${args2.id}/deactivate`, body: {} }],
840
996
  run: ({ shop, args: args2 }) => proxy("POST", shop, `/promotion/202309/activities/${args2.id}/deactivate`, { body: {} })
@@ -842,6 +998,7 @@ var COMMANDS = [
842
998
  {
843
999
  name: "products set-inventory",
844
1000
  summary: "\u6539 SKU \u5E93\u5B58\uFF08--product --sku --warehouse --quantity\uFF09\u3002\u5199\u64CD\u4F5C,\u9ED8\u8BA4 dry-run",
1001
+ flags: ["product", "quantity", "sku", "warehouse"],
845
1002
  write: true,
846
1003
  preview: ({ args: args2 }) => [{
847
1004
  step: "\u6539\u5E93\u5B58",
@@ -855,6 +1012,7 @@ var COMMANDS = [
855
1012
  {
856
1013
  name: "products create",
857
1014
  summary: "\u5EFA\u54C1\uFF08--body-file [--apply]\uFF09\u3002dry-run \u8DD1 listing_check \u9884\u68C0\uFF1B\u5199\u64CD\u4F5C\u3002\u26A0\uFE0F --apply \u5373\u5EFA\u5B8C\u76F4\u63A5\u4E0A\u67B6\u9001\u5BA1\uFF1B\u7528\u6237\u8981\u5B58\u8349\u7A3F\u5C31\u505C\u624B\u95EE\u7528\u6237\uFF08#1958\uFF09",
1015
+ flags: ["body-file"],
858
1016
  write: true,
859
1017
  preview: () => [{ step: "listing_check \u9884\u68C0 \u2192 \u5EFA\u54C1", method: "POST", path: "/product/202309/products/listing_check", body: void 0 }],
860
1018
  precheck: ({ shop, args: args2 }) => proxy("POST", shop, "/product/202309/products/listing_check", { body: readBodyFile(args2["body-file"]) }),
@@ -869,6 +1027,7 @@ var COMMANDS = [
869
1027
  {
870
1028
  name: "products add-variant",
871
1029
  summary: "\u7ED9\u5546\u54C1\u52A0\u89C4\u683C SKU\uFF08--product --body-file skus-delta.json [--apply]\uFF09\u3002\u26A0\uFE0F --apply \u5373\u9001\u5BA1\u4E0A\u67B6\uFF1B\u7528\u6237\u8981\u5B58\u8349\u7A3F\u5C31\u505C\u624B\u95EE\u7528\u6237\uFF08#1958\uFF09",
1030
+ flags: ["body-file", "product"],
872
1031
  write: true,
873
1032
  preview: () => [{ step: "\u8BFB\u73B0\u6709 skus \u2192 append \u2192 partial_edit\u3002\u26A0\uFE0F \u9ED8\u8BA4 save_mode=LISTING\uFF1A--apply \u5373\u9001\u5BA1\u4E0A\u67B6\uFF08DRAFT \u5546\u54C1\u4F1A\u88AB\u63D0\u4EA4\uFF09\uFF1B\u672C\u547D\u4EE4\u81EA\u6784 body\uFF0Cbody-file \u91CC\u7684 save_mode \u4E0D\u900F\u4F20\u3001\u5199\u4E86\u4E5F\u65E0\u6548\u3002\u82E5\u7528\u6237\u8981\u6C42\u5B58\u8349\u7A3F/\u522B\u63D0\u4EA4 \u2192 \u4E0D\u8981 --apply\uFF0C\u505C\u624B\u95EE\u7528\u6237\uFF08#1958\uFF09", method: "POST", path: "/product/202309/products/{id}/partial_edit" }],
874
1033
  run: async ({ shop, args: args2 }) => {
@@ -882,6 +1041,7 @@ var COMMANDS = [
882
1041
  {
883
1042
  name: "products replace-images",
884
1043
  summary: "\u6574\u7EC4\u6362\u4E3B\u56FE\uFF08--product --body-file images.json [--apply]\uFF09\u3002\u26A0\uFE0F --apply \u5373\u9001\u5BA1\u4E0A\u67B6\uFF1B\u7528\u6237\u8981\u5B58\u8349\u7A3F\u5C31\u505C\u624B\u95EE\u7528\u6237\uFF08#1958\uFF09",
1044
+ flags: ["body-file", "product"],
885
1045
  write: true,
886
1046
  preview: () => [{ step: "main_images \u6574\u7EC4\u66FF\u6362 \u2192 partial_edit\u3002\u26A0\uFE0F \u9ED8\u8BA4 save_mode=LISTING\uFF1A--apply \u5373\u9001\u5BA1\u4E0A\u67B6\uFF08DRAFT \u5546\u54C1\u4F1A\u88AB\u63D0\u4EA4\uFF09\uFF1B\u672C\u547D\u4EE4\u81EA\u6784 body\uFF0Cbody-file \u91CC\u7684 save_mode \u4E0D\u900F\u4F20\u3001\u5199\u4E86\u4E5F\u65E0\u6548\u3002\u82E5\u7528\u6237\u8981\u6C42\u5B58\u8349\u7A3F/\u522B\u63D0\u4EA4 \u2192 \u4E0D\u8981 --apply\uFF0C\u505C\u624B\u95EE\u7528\u6237\uFF08#1958\uFF09", method: "POST", path: "/product/202309/products/{id}/partial_edit" }],
887
1047
  run: ({ shop, args: args2 }) => proxy("POST", shop, `/product/202309/products/${args2.product}/partial_edit`, { body: { main_images: readBodyFile(args2["body-file"]).main_images } }),
@@ -890,6 +1050,7 @@ var COMMANDS = [
890
1050
  {
891
1051
  name: "products partial-edit",
892
1052
  summary: "\u6539\u5546\u54C1\u5B57\u6BB5\uFF08--product --body-file patch.json [--apply]\uFF09\u3002\u26A0\uFE0F --apply \u5373\u9001\u5BA1\u4E0A\u67B6\uFF1B\u7528\u6237\u8981\u5B58\u8349\u7A3F\u5C31\u505C\u624B\u95EE\u7528\u6237\uFF08#1958\uFF09",
1053
+ flags: ["body-file", "product"],
893
1054
  write: true,
894
1055
  preview: ({ args: args2 }) => [{ step: "partial_edit\uFF08\u5D4C\u5957\u5B57\u6BB5\u672A\u5217\u5B50\u9879\u4F1A\u88AB\u6E05\u7A7A\uFF09\u3002\u26A0\uFE0F \u9ED8\u8BA4 save_mode=LISTING\uFF1A--apply \u5373\u9001\u5BA1\u4E0A\u67B6\uFF08DRAFT \u5546\u54C1\u4F1A\u88AB\u63D0\u4EA4\uFF09\u3002\u82E5\u7528\u6237\u8981\u6C42\u5B58\u8349\u7A3F/\u522B\u63D0\u4EA4 \u2192 \u4E0D\u8981 --apply\uFF0C\u505C\u624B\u95EE\u7528\u6237\uFF08#1958\uFF09", method: "POST", path: `/product/202309/products/${args2.product}/partial_edit`, body: readBodyFile(args2["body-file"]) }],
895
1056
  run: ({ shop, args: args2 }) => proxy("POST", shop, `/product/202309/products/${args2.product}/partial_edit`, { body: readBodyFile(args2["body-file"]) }),
@@ -899,6 +1060,7 @@ var COMMANDS = [
899
1060
  {
900
1061
  name: "affiliate creators search",
901
1062
  summary: "\u8054\u76DF\u5E7F\u573A\u627E\u8FBE\u4EBA\uFF08--keyword\uFF0C--page-size 12|20\uFF0C\u9ED8\u8BA4 12\uFF09",
1063
+ flags: ["keyword", "page-size"],
902
1064
  listKey: "creators",
903
1065
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202508/marketplace_creators/search", {
904
1066
  query: { page_size: String(args2["page-size"] ?? 12) },
@@ -908,11 +1070,13 @@ var COMMANDS = [
908
1070
  {
909
1071
  name: "affiliate creators perf",
910
1072
  summary: "\u8FBE\u4EBA\u5E26\u8D27\u8868\u73B0\u8BE6\u60C5\uFF08--creator \u5FC5\u586B\uFF0Ccreator_open_id\uFF09",
1073
+ flags: ["creator"],
911
1074
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/affiliate_seller/202508/marketplace_creators/${args2.creator}`, {})
912
1075
  },
913
1076
  {
914
1077
  name: "affiliate target-collab search",
915
1078
  summary: "\u5B9A\u5411\u9080\u7EA6\u5217\u8868\uFF08--status collaboration_status\uFF0C\u5982 ONGOING/EXPIRING/VALID/CANCELING/COMPLETED\uFF1B--page-size\uFF09",
1079
+ flags: ["page-size", "status"],
916
1080
  listKey: "target_collaborations",
917
1081
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202508/target_collaborations/search", {
918
1082
  query: { page_size: String(args2["page-size"] ?? 20) },
@@ -922,11 +1086,13 @@ var COMMANDS = [
922
1086
  {
923
1087
  name: "affiliate target-collab query",
924
1088
  summary: "\u5B9A\u5411\u9080\u7EA6\u8BE6\u60C5\uFF08--id \u5FC5\u586B\uFF09",
1089
+ flags: ["id"],
925
1090
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/affiliate_seller/202508/target_collaborations/${args2.id}`, {})
926
1091
  },
927
1092
  {
928
1093
  name: "affiliate samples search",
929
1094
  summary: "\u6837\u54C1\u7533\u8BF7\u5217\u8868\uFF08--page-size\uFF09",
1095
+ flags: ["page-size"],
930
1096
  listKey: "sample_applications",
931
1097
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202508/sample_applications/search", {
932
1098
  query: { page_size: String(args2["page-size"] ?? 20) },
@@ -936,6 +1102,7 @@ var COMMANDS = [
936
1102
  {
937
1103
  name: "affiliate dm list",
938
1104
  summary: "\u79C1\u4FE1\u4F1A\u8BDD\u5217\u8868\uFF08--page-size\uFF0C--status conversation_status \u53EF\u9009\uFF09\u3002\u26A0\uFE0F\u7248\u672C\u56FA\u5B9A 202412",
1105
+ flags: ["page-size", "status"],
939
1106
  listKey: "conversations",
940
1107
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/affiliate_seller/202412/conversations", {
941
1108
  query: {
@@ -947,11 +1114,13 @@ var COMMANDS = [
947
1114
  {
948
1115
  name: "affiliate dm messages",
949
1116
  summary: "\u4F1A\u8BDD\u6D88\u606F\u8BB0\u5F55\uFF08--conversation \u5FC5\u586B\uFF0Cconversation_id\uFF09",
1117
+ flags: ["conversation"],
950
1118
  run: ({ shop, args: args2 }) => proxy("GET", shop, `/affiliate_seller/202412/conversation/${args2.conversation}/messages`, {})
951
1119
  },
952
1120
  {
953
1121
  name: "affiliate orders search",
954
1122
  summary: "\u8054\u76DF\u8BA2\u5355\u5217\u8868\uFF08\u4F63\u91D1\u660E\u7EC6\uFF0C--page-size\uFF09",
1123
+ flags: ["page-size"],
955
1124
  listKey: "orders",
956
1125
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202410/orders/search", {
957
1126
  query: { page_size: String(args2["page-size"] ?? 20) },
@@ -961,6 +1130,7 @@ var COMMANDS = [
961
1130
  {
962
1131
  name: "affiliate open-collab products-search",
963
1132
  summary: "\u516C\u5F00\u5408\u4F5C\u53EF\u8BBE\u4F63\u54C1\u5217\u8868\uFF08--page-size\uFF09",
1133
+ flags: ["page-size"],
964
1134
  listKey: "products",
965
1135
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202405/open_collaborations/products/search", {
966
1136
  query: { page_size: String(args2["page-size"] ?? 20) },
@@ -970,6 +1140,7 @@ var COMMANDS = [
970
1140
  {
971
1141
  name: "affiliate open-collab search",
972
1142
  summary: "\u516C\u5F00\u5408\u4F5C\u751F\u6548\u5217\u8868\uFF08\u542B current_commission\uFF0C--page-size\uFF09",
1143
+ flags: ["page-size"],
973
1144
  listKey: "open_collaborations",
974
1145
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202412/open_collaborations/search", {
975
1146
  query: { page_size: String(args2["page-size"] ?? 20) },
@@ -979,12 +1150,14 @@ var COMMANDS = [
979
1150
  {
980
1151
  name: "affiliate open-collab settings get",
981
1152
  summary: "\u516C\u5F00\u5408\u4F5C\u5168\u5C40\u8BBE\u7F6E\uFF08\u81EA\u52A8\u65B0\u589E\u54C1\u9ED8\u8BA4\u4F63\u91D1\uFF09",
1153
+ flags: [],
982
1154
  run: ({ shop }) => proxy("GET", shop, "/affiliate_seller/202409/open_collaboration_settings", {})
983
1155
  },
984
1156
  // ===== 联盟写命令(managing-affiliate-program,三道阀:dry-run 预览 → --apply 提交 → 回读) =====
985
1157
  {
986
1158
  name: "affiliate target-collab create",
987
1159
  summary: "\u53D1\u5B9A\u5411\u9080\u7EA6\uFF08--body-file collab.json\uFF0C\u542B creator_user_open_ids[]/products[]/free_sample_rule\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u53D1",
1160
+ flags: ["body-file"],
988
1161
  write: true,
989
1162
  preview: ({ args: args2 }) => [{
990
1163
  step: "\u53D1\u5B9A\u5411\u9080\u7EA6",
@@ -1003,6 +1176,7 @@ var COMMANDS = [
1003
1176
  {
1004
1177
  name: "affiliate target-collab update",
1005
1178
  summary: "\u6539\u5B9A\u5411\u9080\u7EA6\uFF08--id --body-file collab.json\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u63D0\u4EA4",
1179
+ flags: ["body-file", "id"],
1006
1180
  write: true,
1007
1181
  preview: ({ args: args2 }) => [{
1008
1182
  step: "\u6539\u5B9A\u5411\u9080\u7EA6",
@@ -1018,6 +1192,7 @@ var COMMANDS = [
1018
1192
  {
1019
1193
  name: "affiliate target-collab remove",
1020
1194
  summary: "\u64A4\u56DE\u5B9A\u5411\u9080\u7EA6\uFF08--id \u5FC5\u586B\uFF0C\u64A4\u56DE\u5B89\u5168\u7F51\uFF09\u3002\u4E0D\u53EF\u9006\uFF0C\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u53D1",
1195
+ flags: ["id"],
1021
1196
  write: true,
1022
1197
  preview: ({ args: args2 }) => [{
1023
1198
  step: "\u64A4\u56DE\u5B9A\u5411\u9080\u7EA6",
@@ -1030,6 +1205,7 @@ var COMMANDS = [
1030
1205
  {
1031
1206
  name: "affiliate target-collab link",
1032
1207
  summary: "\u751F\u6210\u5B9A\u5411\u9080\u7EA6\u5206\u4EAB\u94FE\u63A5\uFF08--id \u5FC5\u586B\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u53D1",
1208
+ flags: ["id"],
1033
1209
  write: true,
1034
1210
  preview: ({ args: args2 }) => [{
1035
1211
  step: "\u751F\u6210\u9080\u7EA6\u94FE\u63A5",
@@ -1042,6 +1218,7 @@ var COMMANDS = [
1042
1218
  {
1043
1219
  name: "affiliate dm open",
1044
1220
  summary: "\u5F00\u8FBE\u4EBA\u79C1\u4FE1\u4F1A\u8BDD\uFF08--creator \u5FC5\u586B\uFF0Ccreator_open_id\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u53D1",
1221
+ flags: ["creator"],
1045
1222
  write: true,
1046
1223
  preview: ({ args: args2 }) => [{
1047
1224
  step: "\u5F00\u79C1\u4FE1\u4F1A\u8BDD",
@@ -1056,6 +1233,7 @@ var COMMANDS = [
1056
1233
  {
1057
1234
  name: "affiliate dm send",
1058
1235
  summary: "\u7ED9\u8FBE\u4EBA\u53D1\u79C1\u4FE1\uFF08--conversation --content [--msg-type TEXT]\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u53D1",
1236
+ flags: ["content", "conversation", "msg-type"],
1059
1237
  write: true,
1060
1238
  preview: ({ args: args2 }) => [{
1061
1239
  step: "\u53D1\u79C1\u4FE1",
@@ -1070,6 +1248,7 @@ var COMMANDS = [
1070
1248
  {
1071
1249
  name: "affiliate samples review",
1072
1250
  summary: "\u5BA1\u6279\u6837\u54C1\u7533\u8BF7\uFF08--id application_id --result review_result [--reject-reason]\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u53D1",
1251
+ flags: ["id", "reject-reason", "result"],
1073
1252
  listKey: "sample_applications",
1074
1253
  write: true,
1075
1254
  preview: ({ args: args2 }) => [{
@@ -1090,6 +1269,7 @@ var COMMANDS = [
1090
1269
  {
1091
1270
  name: "affiliate open-collab set-commission",
1092
1271
  summary: "\u6309\u54C1\u8BBE\u516C\u5F00\u5408\u4F5C\u4F63\u91D1\u7387\uFF08--product product_id --rate\uFF0C\u5355\u4F4D=\u767E\u5206\u6BD4\xD7100\uFF0C\u5982 1350=13.5%\uFF0C\u8303\u56F4 800-8000\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u5B58",
1272
+ flags: ["product", "rate"],
1093
1273
  write: true,
1094
1274
  preview: ({ args: args2 }) => [{
1095
1275
  step: "\u8BBE\u6309\u54C1\u516C\u5F00\u5408\u4F5C\u4F63\u91D1",
@@ -1108,6 +1288,7 @@ var COMMANDS = [
1108
1288
  {
1109
1289
  name: "affiliate open-collab remove",
1110
1290
  summary: "\u79FB\u9664\u54C1\u7684\u516C\u5F00\u5408\u4F5C\uFF08--product product_id\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u53D1",
1291
+ flags: ["product"],
1111
1292
  write: true,
1112
1293
  preview: ({ args: args2 }) => [{
1113
1294
  step: "\u79FB\u9664\u516C\u5F00\u5408\u4F5C",
@@ -1120,6 +1301,7 @@ var COMMANDS = [
1120
1301
  {
1121
1302
  name: "affiliate open-collab settings edit",
1122
1303
  summary: "\u6539\u516C\u5F00\u5408\u4F5C\u5168\u5C40\u9ED8\u8BA4\uFF08\u81EA\u52A8\u65B0\u589E\u54C1\u4F63\u91D1\uFF0C--rate --enable true|false\uFF09\u3002\u9ED8\u8BA4 dry-run\uFF0C--apply \u624D\u5B58",
1304
+ flags: ["enable", "rate"],
1123
1305
  write: true,
1124
1306
  preview: ({ args: args2 }) => [{
1125
1307
  step: "\u6539\u5168\u5C40\u9ED8\u8BA4",
@@ -1136,6 +1318,7 @@ var COMMANDS = [
1136
1318
  {
1137
1319
  name: "apps add",
1138
1320
  summary: "\u767B\u8BB0\u4E00\u4E2A TikTok App\uFF08--service-id --app-key --app-secret --type --label\uFF0C[--markets a,b] [--redirect] [--owner-entity] [--default]\uFF09",
1321
+ flags: ["app-key", "app-secret", "default", "label", "markets", "owner-entity", "redirect", "service-id", "type"],
1139
1322
  run: ({ args: args2 }) => adminApps("POST", {
1140
1323
  body: {
1141
1324
  serviceId: args2["service-id"],
@@ -1153,6 +1336,7 @@ var COMMANDS = [
1153
1336
  {
1154
1337
  name: "apps set-shop",
1155
1338
  summary: "\u9884\u7F6E shop\u2192app \u6620\u5C04\uFF08--shop shopId --app serviceId [--note]\uFF09\u2014\u2014auth link \u65F6\u6309\u5E97\u89E3\u6790\u7528\u54EA\u4E2A app",
1339
+ flags: ["app", "note"],
1156
1340
  run: ({ args: args2 }) => {
1157
1341
  if (!args2.shop || !args2.app) return Promise.resolve({ ok: false, error: { code: "VALIDATION", message: "--shop \u548C --app\uFF08serviceId\uFF09\u5FC5\u586B", retryable: false } });
1158
1342
  return setShopApp(args2.shop, args2.app, args2.note);
@@ -1161,16 +1345,19 @@ var COMMANDS = [
1161
1345
  {
1162
1346
  name: "apps list",
1163
1347
  summary: "\u5217\u51FA\u5DF2\u767B\u8BB0\u7684 TikTok App\uFF08admin\uFF0C\u542B appKey/status\uFF09",
1348
+ flags: [],
1164
1349
  run: () => adminApps("GET")
1165
1350
  },
1166
1351
  {
1167
1352
  name: "apps available",
1168
1353
  summary: "\u5217\u51FA\u53EF\u9009 App\uFF08\u7528\u6237\u9274\u6743\uFF0C\u4EC5 active\uFF0C\u65E0 secret\uFF09\u2014\u2014\u9009 serviceId \u4F20\u7ED9 auth link --app",
1354
+ flags: [],
1169
1355
  run: () => availableApps()
1170
1356
  },
1171
1357
  {
1172
1358
  name: "apps disable",
1173
1359
  summary: "\u505C\u7528\u4E00\u4E2A TikTok App\uFF08--id\uFF09",
1360
+ flags: ["id"],
1174
1361
  run: ({ args: args2 }) => adminApps("PATCH", { id: args2.id, body: { status: "disabled" } })
1175
1362
  },
1176
1363
  // ── auth link:skill 只传 --shop,backend 按 shop 解析用哪个 app(custom 映射→默认 public)。
@@ -1178,6 +1365,7 @@ var COMMANDS = [
1178
1365
  {
1179
1366
  name: "auth link",
1180
1367
  summary: "\u751F\u6210\u5E97\u94FA\u7ED1\u5B9A\u6388\u6743\u94FE\u63A5\uFF08--shop shopId\uFF0Cbackend \u6309\u5E97\u5B9A app\uFF1B--app serviceId \u53EF\u9009\u8986\u76D6\uFF09",
1368
+ flags: ["app"],
1181
1369
  run: async ({ args: args2 }) => {
1182
1370
  if (!args2.shop && !args2.app) {
1183
1371
  return { ok: false, error: { code: "VALIDATION", message: "--shop\uFF08shopId\uFF09\u5FC5\u586B\uFF08\u6216 --app \u8986\u76D6\uFF09", retryable: false } };
@@ -1331,7 +1519,10 @@ function validateCreateDiscount(ctx2) {
1331
1519
  if (k === "sku") {
1332
1520
  return { ok: false, message: "\u672C\u547D\u4EE4\u6CA1\u6709 --sku\uFF1AskuId \u5199\u5728 --price \u91CC\uFF0C\u5982 --price 173707:29.90\uFF08\u6CA1\u4F20 --product \u65F6\u6BCF\u9879\u90FD\u8981\u5E26 productId\uFF0C\u5982 --price 1737048/173707:29.90\uFF09" };
1333
1521
  }
1334
- return { ok: false, message: `\u4E0D\u652F\u6301\u7684\u53C2\u6570 --${k}\uFF1B\u672C\u547D\u4EE4\u53EA\u8BA4 ${DISCOUNT_FLAGS.map((f) => "--" + f).join(" ")}` };
1522
+ const own = DISCOUNT_FLAGS.filter((f) => !GLOBAL_FLAGS.includes(f));
1523
+ const hint = suggestFlag(k, own, args2[k], Date.now(), "promotions create-discount");
1524
+ const tip = !hint ? "" : hint.startsWith("--") ? `\uFF08\u4F60\u662F\u60F3\u7528 ${hint} \u5417\uFF1F\uFF09` : `\uFF08${hint}\uFF09`;
1525
+ return { ok: false, message: `\u4E0D\u652F\u6301\u7684\u53C2\u6570 --${k}${tip}\uFF1B\u672C\u547D\u4EE4\u53EA\u8BA4 ${DISCOUNT_FLAGS.map((f) => "--" + f).join(" ")}` };
1335
1526
  }
1336
1527
  if (rest && rest.length > 0) {
1337
1528
  return { ok: false, message: `\u591A\u4F59\u7684\u4F4D\u7F6E\u53C2\u6570\u300C${rest.join(" ")}\u300D\u2014\u2014\u6BCF\u4E2A\u53C2\u6570\u53EA\u80FD\u5E26\u4E00\u4E2A\u503C\u3002\u591A\u4E2A SKU \u8981\u7528\u9017\u53F7\u8FDE\u6210\u4E00\u4E2A --price\uFF0C\u5982 --price A:12,B:15\uFF08\u4E0D\u80FD\u7528\u7A7A\u683C\u5206\u9694\uFF09\uFF1B\u82E5\u662F\u6807\u9898\u7B49\u503C\u91CC\u542B\u7A7A\u683C\uFF0C\u7ED9\u6574\u4E2A\u503C\u52A0\u5F15\u53F7\uFF0C\u5982 --title "Momo Sale"` };
@@ -1490,6 +1681,8 @@ async function dupSelfCheck(shop, title, submitted) {
1490
1681
 
1491
1682
  // src/index.ts
1492
1683
  var NO_SHOP_COMMANDS = /* @__PURE__ */ new Set(["auth link", "apps add", "apps list", "apps disable", "apps available", "apps set-shop"]);
1684
+ var SHOP_OPTIONAL_BUT_READ = /* @__PURE__ */ new Set(["auth link", "apps set-shop"]);
1685
+ var mentionsShop = (name) => !NO_SHOP_COMMANDS.has(name) || SHOP_OPTIONAL_BUT_READ.has(name);
1493
1686
  function parseFlags(tokens) {
1494
1687
  const args2 = {};
1495
1688
  const positional2 = [];
@@ -1547,6 +1740,7 @@ function usage() {
1547
1740
  for (const c of COMMANDS) lines.push(` ${c.name.padEnd(22)} ${c.summary}`);
1548
1741
  lines.push(` ${"shops".padEnd(22)} \u67E5\u5F53\u524D\u767B\u5F55\u7528\u6237\u5DF2\u6388\u6743\u5E97\u94FA`);
1549
1742
  lines.push(` ${"images upload".padEnd(22)} \u4E0A\u4F20\u672C\u5730\u56FE\u7247\uFF08--file --use-case [--out]\uFF09`);
1743
+ lines.push("", "\u6BCF\u6761\u547D\u4EE4\u53EA\u8BA4\u5B83\u81EA\u5DF1\u7684\u53C2\u6570\uFF08`tiktok <\u547D\u4EE4> --help` \u770B\uFF09\uFF0C\u4E0D\u8BA4\u7684\u4F1A\u5F53\u573A\u62A5 VALIDATION \u2014\u2014 \u4E0D\u4F1A\u518D\u88AB\u9759\u9ED8\u4E22\u6389\u3002");
1550
1744
  lines.push("", "\u901A\u7528\uFF1A--shop \u5FC5\u586B\uFF08\u9664 shops / auth link / apps add|list|disable\uFF09\uFF1B\u9ED8\u8BA4 JSON \u8F93\u51FA\uFF1BTIKTOK_BACKEND_URL \u663E\u5F0F\u6307\u5B9A backend\uFF08\u672A\u8BBE\u5219\u6309 OPTIMA_ENV \u6620\u5C04 cn-stage/cn-prod\uFF0C\u5426\u5219 localhost\uFF09\u3002");
1551
1745
  process.stderr.write(lines.join("\n") + "\n");
1552
1746
  }
@@ -1556,11 +1750,40 @@ if (argv.length === 0 || argv[0] === "--help" || argv[0] === "-h") {
1556
1750
  process.exit(argv.length === 0 ? 1 : 0);
1557
1751
  }
1558
1752
  var { args, positional } = parseFlags(argv);
1753
+ var wantsHelp = argv.includes("--help") || argv.includes("-h") || "help" in args;
1754
+ function rejectUnknownFlags(cmdName, allowed, rest, noShop = false) {
1755
+ const v = checkFlags(cmdName, args, allowed, rest, Date.now(), noShop);
1756
+ if (!v) return;
1757
+ out({
1758
+ ok: false,
1759
+ error: {
1760
+ code: "VALIDATION",
1761
+ message: v.message,
1762
+ retryable: false,
1763
+ unknown_flags: v.unknown_flags,
1764
+ extra_positional: v.extra_positional,
1765
+ allowed_flags: v.allowed_flags
1766
+ }
1767
+ });
1768
+ process.exit(1);
1769
+ }
1770
+ var IMAGES_UPLOAD = { name: "images upload", summary: "\u4E0A\u4F20\u672C\u5730\u56FE\u7247\uFF08--file <\u8DEF\u5F84> [--use-case MAIN_IMAGE] [--out <\u8FFD\u52A0\u5199\u5165\u7684 jsonl>]\uFF09", flags: ["file", "use-case", "out"] };
1771
+ var SHOPS = { name: "shops", summary: "\u67E5\u5F53\u524D\u767B\u5F55\u7528\u6237\u5DF2\u6388\u6743\u5E97\u94FA\uFF08\u4E0D\u9700\u8981 --shop\uFF09", flags: [], noShop: true };
1559
1772
  if (positional[0] === "shops") {
1773
+ if (wantsHelp) {
1774
+ process.stderr.write(commandUsage(SHOPS));
1775
+ process.exit(0);
1776
+ }
1777
+ rejectUnknownFlags(SHOPS.name, SHOPS.flags, positional.slice(1), true);
1560
1778
  out(await listShops());
1561
1779
  process.exit(0);
1562
1780
  }
1563
1781
  if (positional[0] === "images" && positional[1] === "upload") {
1782
+ if (wantsHelp) {
1783
+ process.stderr.write(commandUsage(IMAGES_UPLOAD));
1784
+ process.exit(0);
1785
+ }
1786
+ rejectUnknownFlags(IMAGES_UPLOAD.name, IMAGES_UPLOAD.flags, positional.slice(2));
1564
1787
  if (!args.file) {
1565
1788
  out({ ok: false, error: { code: "VALIDATION", message: "\u7F3A\u5C11 --file", retryable: false } });
1566
1789
  process.exit(1);
@@ -1577,14 +1800,12 @@ if (positional[0] === "images" && positional[1] === "upload") {
1577
1800
  out(r);
1578
1801
  process.exit(0);
1579
1802
  }
1580
- var wantsHelp = argv.includes("--help") || argv.includes("-h");
1581
1803
  var match = findCommand(positional);
1582
1804
  if (wantsHelp) {
1583
- if (match) process.stderr.write(commandUsage(match.cmd));
1805
+ if (match) process.stderr.write(commandUsage({ ...match.cmd, noShop: !mentionsShop(match.cmd.name) }));
1584
1806
  else usage();
1585
1807
  process.exit(0);
1586
1808
  }
1587
- normalizeBooleanFlags(args);
1588
1809
  if (!match) {
1589
1810
  out({ ok: false, error: { code: "VALIDATION", message: `\u672A\u77E5\u547D\u4EE4: ${positional.join(" ")}`, retryable: false } });
1590
1811
  usage();
@@ -1596,6 +1817,8 @@ if (verdict && !verdict.ok) {
1596
1817
  out({ ok: false, error: { code: "VALIDATION", message: verdict.message, retryable: false } });
1597
1818
  process.exit(1);
1598
1819
  }
1820
+ rejectUnknownFlags(match.cmd.name, match.cmd.flags, match.rest, !mentionsShop(match.cmd.name));
1821
+ normalizeBooleanFlags(args);
1599
1822
  if (!args.shop && !NO_SHOP_COMMANDS.has(match.cmd.name)) {
1600
1823
  out({ ok: false, error: { code: "VALIDATION", message: "\u7F3A\u5C11 --shop\uFF08\u591A\u5E97\u663E\u5F0F\u8DEF\u7531\uFF09", retryable: false } });
1601
1824
  process.exit(1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/tiktok-cli",
3
- "version": "0.13.0",
3
+ "version": "0.14.0",
4
4
  "description": "TikTok Shop CLI for Optima agents — 经 tiktok-backend 操作店铺",
5
5
  "type": "module",
6
6
  "bin": {