@optima-chat/tiktok-cli 0.9.0 → 0.10.1

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 (2) hide show
  1. package/dist/index.js +153 -0
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -202,6 +202,18 @@ function mergeSkus(existing, add) {
202
202
  });
203
203
  return [...existing, ...filledAdd];
204
204
  }
205
+ function fillEmptyList(data, listKey) {
206
+ if (!listKey) return;
207
+ if (!data || typeof data !== "object" || Array.isArray(data)) return;
208
+ const d = data;
209
+ if (!(listKey in d)) d[listKey] = [];
210
+ }
211
+ function commandUsage(cmd) {
212
+ return `tiktok ${cmd.name} --shop <shopId> [--flags]
213
+
214
+ ${cmd.summary}
215
+ `;
216
+ }
205
217
  var today = () => (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
206
218
  var daysAgo = (n) => new Date(Date.now() - n * 864e5).toISOString().slice(0, 10);
207
219
  var toEpoch = (v) => /^\d+$/.test(v) ? Number(v) : Math.floor(Date.parse(v) / 1e3);
@@ -209,6 +221,7 @@ var COMMANDS = [
209
221
  {
210
222
  name: "orders list",
211
223
  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",
224
+ listKey: "orders",
212
225
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/order/202309/orders/search", {
213
226
  query: {
214
227
  page_size: args2["page-size"] ?? "20",
@@ -235,6 +248,7 @@ var COMMANDS = [
235
248
  {
236
249
  name: "orders cancellations",
237
250
  summary: "\u53D6\u6D88\u5355\u5217\u8868\uFF08--status \u53EF\u9009\uFF0C--page-size\uFF09",
251
+ listKey: "cancellations",
238
252
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/return_refund/202309/cancellations/search", {
239
253
  query: { page_size: String(args2["page-size"] ?? 20) },
240
254
  body: args2.status ? { cancel_status: args2.status } : {}
@@ -243,6 +257,7 @@ var COMMANDS = [
243
257
  {
244
258
  name: "orders returns",
245
259
  summary: "\u9000\u8D27\u5355\u5217\u8868\uFF08--status \u53EF\u9009\uFF0C--page-size\uFF09",
260
+ listKey: "return_orders",
246
261
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/return_refund/202309/returns/search", {
247
262
  query: { page_size: String(args2["page-size"] ?? 20) },
248
263
  body: args2.status ? { return_status: args2.status } : {}
@@ -261,6 +276,7 @@ var COMMANDS = [
261
276
  {
262
277
  name: "orders reject-reasons",
263
278
  summary: "\u9A73\u56DE\u53D6\u6D88/\u9000\u8D27\u7684\u5408\u6CD5\u7406\u7531\uFF08--id return_or_cancel_id\uFF09",
279
+ listKey: "reasons",
264
280
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/return_refund/202309/reject_reasons", {
265
281
  query: { return_or_cancel_id: args2.id }
266
282
  })
@@ -288,6 +304,7 @@ var COMMANDS = [
288
304
  {
289
305
  name: "packages search",
290
306
  summary: "\u5305\u88F9\u5217\u8868\uFF08--page-size\uFF09",
307
+ listKey: "packages",
291
308
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/fulfillment/202309/packages/search", {
292
309
  query: { page_size: String(args2["page-size"] ?? 20) },
293
310
  body: {}
@@ -445,9 +462,122 @@ var COMMANDS = [
445
462
  }
446
463
  })
447
464
  },
465
+ {
466
+ name: "analytics videos",
467
+ 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",
468
+ run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_videos/performance", {
469
+ query: {
470
+ start_date_ge: args2.from ?? daysAgo(30),
471
+ end_date_lt: args2.to ?? today(),
472
+ sort_field: args2["sort-field"] ?? "gmv",
473
+ sort_order: args2["sort-order"] ?? "DESC",
474
+ page_size: args2["page-size"] ?? "20",
475
+ ...args2["page-token"] ? { page_token: args2["page-token"] } : {}
476
+ }
477
+ })
478
+ },
479
+ {
480
+ name: "analytics videos-overview",
481
+ summary: "\u5185\u5BB9\u89C6\u9891\u6574\u4F53\u6982\u89C8\uFF08shop_videos overview\uFF1B--from --to --granularity\uFF09",
482
+ run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_videos/overview_performance", {
483
+ query: {
484
+ start_date_ge: args2.from ?? daysAgo(30),
485
+ end_date_lt: args2.to ?? today(),
486
+ granularity: args2.granularity ?? "ALL"
487
+ }
488
+ })
489
+ },
490
+ {
491
+ name: "analytics video",
492
+ summary: "\u5355\u6761\u89C6\u9891\u7ECF\u8425\u660E\u7EC6\uFF08--video video_id \u5FC5\u586B\uFF1B--from --to\uFF09",
493
+ run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202509/shop_videos/${args2.video}/performance`, {
494
+ query: {
495
+ start_date_ge: args2.from ?? daysAgo(30),
496
+ end_date_lt: args2.to ?? today()
497
+ }
498
+ })
499
+ },
500
+ {
501
+ name: "analytics video-products",
502
+ summary: "\u5355\u6761\u89C6\u9891\u5E26\u8D27\u5546\u54C1\u8868\u73B0\uFF08--video video_id \u5FC5\u586B\uFF1B--from --to --page-size\uFF09",
503
+ run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202509/shop_videos/${args2.video}/products/performance`, {
504
+ query: {
505
+ start_date_ge: args2.from ?? daysAgo(30),
506
+ end_date_lt: args2.to ?? today(),
507
+ page_size: args2["page-size"] ?? "20"
508
+ }
509
+ })
510
+ },
511
+ {
512
+ name: "analytics lives",
513
+ 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",
514
+ run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_lives/performance", {
515
+ query: {
516
+ start_date_ge: args2.from ?? daysAgo(30),
517
+ end_date_lt: args2.to ?? today(),
518
+ sort_field: args2["sort-field"] ?? "gmv",
519
+ sort_order: args2["sort-order"] ?? "DESC",
520
+ page_size: args2["page-size"] ?? "20",
521
+ ...args2["page-token"] ? { page_token: args2["page-token"] } : {}
522
+ }
523
+ })
524
+ },
525
+ {
526
+ name: "analytics lives-overview",
527
+ summary: "\u76F4\u64AD\u6574\u4F53\u6982\u89C8\uFF08shop_lives overview\uFF1B--from --to --granularity\uFF09",
528
+ run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_lives/overview_performance", {
529
+ query: {
530
+ start_date_ge: args2.from ?? daysAgo(30),
531
+ end_date_lt: args2.to ?? today(),
532
+ granularity: args2.granularity ?? "ALL"
533
+ }
534
+ })
535
+ },
536
+ {
537
+ name: "analytics skus",
538
+ 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",
539
+ run: ({ shop, args: args2 }) => proxy("GET", shop, "/analytics/202509/shop_skus/performance", {
540
+ query: {
541
+ start_date_ge: args2.from ?? daysAgo(30),
542
+ end_date_lt: args2.to ?? today(),
543
+ sort_field: args2["sort-field"] ?? "gmv",
544
+ sort_order: args2["sort-order"] ?? "DESC",
545
+ page_size: args2["page-size"] ?? "20",
546
+ ...args2["page-token"] ? { page_token: args2["page-token"] } : {}
547
+ }
548
+ })
549
+ },
550
+ {
551
+ name: "analytics sku",
552
+ summary: "\u5355\u4E2A SKU \u7ECF\u8425\u660E\u7EC6\uFF08--sku sku_id \u5FC5\u586B\uFF1B--from --to --granularity\uFF09",
553
+ run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202509/shop_skus/${args2.sku}/performance`, {
554
+ query: {
555
+ start_date_ge: args2.from ?? daysAgo(30),
556
+ end_date_lt: args2.to ?? today(),
557
+ granularity: args2.granularity ?? "ALL"
558
+ }
559
+ })
560
+ },
561
+ {
562
+ name: "analytics product",
563
+ summary: "\u5355\u4E2A\u5546\u54C1\u7ECF\u8425\u660E\u7EC6\uFF08--product product_id \u5FC5\u586B\uFF1B--from --to --granularity\uFF09",
564
+ run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202509/shop_products/${args2.product}/performance`, {
565
+ query: {
566
+ start_date_ge: args2.from ?? daysAgo(30),
567
+ end_date_lt: args2.to ?? today(),
568
+ granularity: args2.granularity ?? "ALL"
569
+ }
570
+ })
571
+ },
572
+ {
573
+ name: "analytics shop-hourly",
574
+ 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",
575
+ run: ({ shop, args: args2 }) => proxy("GET", shop, `/analytics/202510/shop/performance/${args2.date ?? daysAgo(1)}/performance_per_hour`, {})
576
+ },
448
577
  {
449
578
  name: "products list",
450
579
  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",
580
+ listKey: "products",
451
581
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/product/202309/products/search", {
452
582
  query: { page_size: args2["page-size"] ?? "20" },
453
583
  body: args2.status ? { status: args2.status } : {}
@@ -461,6 +591,7 @@ var COMMANDS = [
461
591
  {
462
592
  name: "products diagnose",
463
593
  summary: "\u5546\u54C1\u5B98\u65B9\u95EE\u9898\u8BCA\u65AD\uFF08--product \u9017\u53F7\u5206\u9694\u672C\u5E97\u81EA\u6709\u5546\u54C1 id\uFF09",
594
+ listKey: "products",
464
595
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/product/202405/products/diagnoses", {
465
596
  query: { product_ids: String(args2.product ?? "") }
466
597
  })
@@ -468,6 +599,7 @@ var COMMANDS = [
468
599
  {
469
600
  name: "promotions list",
470
601
  summary: "\u4FC3\u9500\u6D3B\u52A8\u5217\u8868\uFF08--status ONGOING/NOT_START/EXPIRED\uFF09",
602
+ listKey: "activities",
471
603
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/promotion/202309/activities/search", {
472
604
  body: { status: args2.status ?? "ONGOING", page_size: Number(args2["page-size"] ?? 20) }
473
605
  })
@@ -475,6 +607,7 @@ var COMMANDS = [
475
607
  {
476
608
  name: "finance statements",
477
609
  summary: "\u7ED3\u7B97\u5355\u5217\u8868",
610
+ listKey: "statements",
478
611
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/finance/202309/statements", {
479
612
  query: {
480
613
  page_size: args2["page-size"] ?? "20",
@@ -503,6 +636,7 @@ var COMMANDS = [
503
636
  {
504
637
  name: "categories recommend",
505
638
  summary: "\u7C7B\u76EE\u63A8\u8350\uFF08--title [--desc]\uFF09",
639
+ listKey: "categories",
506
640
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/product/202309/categories/recommend", {
507
641
  body: {
508
642
  product_title: args2.title,
@@ -513,6 +647,7 @@ var COMMANDS = [
513
647
  {
514
648
  name: "categories tree",
515
649
  summary: "\u7C7B\u76EE\u6811\uFF08--version v2\uFF09",
650
+ listKey: "categories",
516
651
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/product/202309/categories", {
517
652
  query: { category_version: args2.version ?? "v2" }
518
653
  })
@@ -534,6 +669,7 @@ var COMMANDS = [
534
669
  {
535
670
  name: "brands list",
536
671
  summary: "\u54C1\u724C\u5217\u8868\uFF08[--category] [--name]\uFF09",
672
+ listKey: "brands",
537
673
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/product/202309/brands", {
538
674
  query: {
539
675
  page_size: args2["page-size"] ?? "50",
@@ -552,11 +688,13 @@ var COMMANDS = [
552
688
  {
553
689
  name: "warehouses list",
554
690
  summary: "\u4ED3\u5E93\u5217\u8868\uFF08\u8DE8\u5883\u8BA4 sub_type CB_*\uFF09",
691
+ listKey: "warehouses",
555
692
  run: ({ shop }) => proxy("GET", shop, "/logistics/202309/warehouses", {})
556
693
  },
557
694
  {
558
695
  name: "shipping-templates list",
559
696
  summary: "\u8FD0\u8D39\u6A21\u677F\u5217\u8868",
697
+ listKey: "templates",
560
698
  run: ({ shop }) => proxy("GET", shop, "/logistics/202510/seller_templates", {})
561
699
  },
562
700
  {
@@ -671,6 +809,7 @@ var COMMANDS = [
671
809
  {
672
810
  name: "affiliate creators search",
673
811
  summary: "\u8054\u76DF\u5E7F\u573A\u627E\u8FBE\u4EBA\uFF08--keyword\uFF0C--page-size 12|20\uFF0C\u9ED8\u8BA4 12\uFF09",
812
+ listKey: "creators",
674
813
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202508/marketplace_creators/search", {
675
814
  query: { page_size: String(args2["page-size"] ?? 12) },
676
815
  body: args2.keyword ? { keyword: args2.keyword } : {}
@@ -684,6 +823,7 @@ var COMMANDS = [
684
823
  {
685
824
  name: "affiliate target-collab search",
686
825
  summary: "\u5B9A\u5411\u9080\u7EA6\u5217\u8868\uFF08--status collaboration_status\uFF0C\u5982 ONGOING/EXPIRING/VALID/CANCELING/COMPLETED\uFF1B--page-size\uFF09",
826
+ listKey: "target_collaborations",
687
827
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202508/target_collaborations/search", {
688
828
  query: { page_size: String(args2["page-size"] ?? 20) },
689
829
  body: args2.status ? { collaboration_status: args2.status } : {}
@@ -697,6 +837,7 @@ var COMMANDS = [
697
837
  {
698
838
  name: "affiliate samples search",
699
839
  summary: "\u6837\u54C1\u7533\u8BF7\u5217\u8868\uFF08--page-size\uFF09",
840
+ listKey: "sample_applications",
700
841
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202508/sample_applications/search", {
701
842
  query: { page_size: String(args2["page-size"] ?? 20) },
702
843
  body: {}
@@ -705,6 +846,7 @@ var COMMANDS = [
705
846
  {
706
847
  name: "affiliate dm list",
707
848
  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",
849
+ listKey: "conversations",
708
850
  run: ({ shop, args: args2 }) => proxy("GET", shop, "/affiliate_seller/202412/conversations", {
709
851
  query: {
710
852
  page_size: String(args2["page-size"] ?? 20),
@@ -720,6 +862,7 @@ var COMMANDS = [
720
862
  {
721
863
  name: "affiliate orders search",
722
864
  summary: "\u8054\u76DF\u8BA2\u5355\u5217\u8868\uFF08\u4F63\u91D1\u660E\u7EC6\uFF0C--page-size\uFF09",
865
+ listKey: "orders",
723
866
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202410/orders/search", {
724
867
  query: { page_size: String(args2["page-size"] ?? 20) },
725
868
  body: {}
@@ -728,6 +871,7 @@ var COMMANDS = [
728
871
  {
729
872
  name: "affiliate open-collab products-search",
730
873
  summary: "\u516C\u5F00\u5408\u4F5C\u53EF\u8BBE\u4F63\u54C1\u5217\u8868\uFF08--page-size\uFF09",
874
+ listKey: "products",
731
875
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202405/open_collaborations/products/search", {
732
876
  query: { page_size: String(args2["page-size"] ?? 20) },
733
877
  body: {}
@@ -736,6 +880,7 @@ var COMMANDS = [
736
880
  {
737
881
  name: "affiliate open-collab search",
738
882
  summary: "\u516C\u5F00\u5408\u4F5C\u751F\u6548\u5217\u8868\uFF08\u542B current_commission\uFF0C--page-size\uFF09",
883
+ listKey: "open_collaborations",
739
884
  run: ({ shop, args: args2 }) => proxy("POST", shop, "/affiliate_seller/202412/open_collaborations/search", {
740
885
  query: { page_size: String(args2["page-size"] ?? 20) },
741
886
  body: {}
@@ -835,6 +980,7 @@ var COMMANDS = [
835
980
  {
836
981
  name: "affiliate samples review",
837
982
  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",
983
+ listKey: "sample_applications",
838
984
  write: true,
839
985
  preview: ({ args: args2 }) => [{
840
986
  step: "\u5BA1\u6279\u6837\u54C1\u7533\u8BF7",
@@ -1068,7 +1214,13 @@ if (positional[0] === "images" && positional[1] === "upload") {
1068
1214
  out(r);
1069
1215
  process.exit(0);
1070
1216
  }
1217
+ var wantsHelp = argv.includes("--help") || argv.includes("-h");
1071
1218
  var match = findCommand(positional);
1219
+ if (wantsHelp) {
1220
+ if (match) process.stderr.write(commandUsage(match.cmd));
1221
+ else usage();
1222
+ process.exit(0);
1223
+ }
1072
1224
  if (!match) {
1073
1225
  out({ ok: false, error: { code: "VALIDATION", message: `\u672A\u77E5\u547D\u4EE4: ${positional.join(" ")}`, retryable: false } });
1074
1226
  usage();
@@ -1100,6 +1252,7 @@ if (match.cmd.write && !("apply" in args)) {
1100
1252
  process.exit(0);
1101
1253
  }
1102
1254
  var env = await match.cmd.run(ctx);
1255
+ fillEmptyList(env.data, match.cmd.listKey);
1103
1256
  if (match.cmd.write && env.ok) {
1104
1257
  const result = { ...env, applied: true };
1105
1258
  if (env.data?.warnings?.length) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/tiktok-cli",
3
- "version": "0.9.0",
3
+ "version": "0.10.1",
4
4
  "description": "TikTok Shop CLI for Optima agents — 经 tiktok-backend 操作店铺",
5
5
  "type": "module",
6
6
  "bin": {