@optima-chat/tiktok-cli 0.11.0 → 0.12.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.
package/README.md CHANGED
@@ -25,7 +25,7 @@ tiktok <domain> <verb> --shop <shopId> [--flags]
25
25
  | `analytics shop` | 店铺经营数据(`--from --to`,默认近30天) |
26
26
  | `analytics products` | 商品维度数据(GMV 降序) |
27
27
  | `products list` | 商品列表 |
28
- | `promotions list` | 促销活动(`--status`) |
28
+ | `promotions list` | 促销活动。`--status` **省略 = 全部状态**(`ONGOING`/`NOT_START`/`EXPIRED`/`DEACTIVATED`;⚠️ 值写错平台**静默忽略并返回全部**,故 CLI **本地硬拒未知值**;平台将来新增值可用 `--force-status` 越过);`--page-size`(默认 20);`--page-token` 翻页,**末页无 `next_page_token`** |
29
29
  | `finance statements` | 结算单 |
30
30
 
31
31
  ### 建品前置只读辅助(拼商品体用)
package/dist/index.js CHANGED
@@ -217,6 +217,7 @@ ${cmd.summary}
217
217
  var today = () => (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
218
218
  var daysAgo = (n) => new Date(Date.now() - n * 864e5).toISOString().slice(0, 10);
219
219
  var toEpoch = (v) => /^\d+$/.test(v) ? Number(v) : Math.floor(Date.parse(v) / 1e3);
220
+ var PROMOTION_STATUSES = /* @__PURE__ */ new Set(["ONGOING", "NOT_START", "EXPIRED", "DEACTIVATED"]);
220
221
  var COMMANDS = [
221
222
  {
222
223
  name: "orders list",
@@ -598,11 +599,34 @@ var COMMANDS = [
598
599
  },
599
600
  {
600
601
  name: "promotions list",
601
- summary: "\u4FC3\u9500\u6D3B\u52A8\u5217\u8868\uFF08--status ONGOING/NOT_START/EXPIRED\uFF09",
602
+ 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",
602
603
  listKey: "activities",
603
- run: ({ shop, args: args2 }) => proxy("POST", shop, "/promotion/202309/activities/search", {
604
- body: { status: args2.status ?? "ONGOING", page_size: Number(args2["page-size"] ?? 20) }
605
- })
604
+ run: ({ shop, args: args2 }) => {
605
+ const st = args2.status ? String(args2.status) : "";
606
+ if (st && !PROMOTION_STATUSES.has(st) && !args2["force-status"]) {
607
+ return Promise.resolve({
608
+ ok: false,
609
+ error: {
610
+ code: "VALIDATION",
611
+ message: `\u672A\u77E5\u7684 --status ${JSON.stringify(st)}\uFF1B\u5DF2\u77E5\u53D6\u503C\uFF1A${[...PROMOTION_STATUSES].join(" / ")}\u3002\u26A0\uFE0F \u5E73\u53F0\u5BF9\u8BA4\u4E0D\u51FA\u7684\u503C**\u4E0D\u62A5\u9519\uFF0C\u800C\u662F\u8FD4\u56DE\u5168\u90E8\u72B6\u6001** \u2014\u2014 \u6240\u4EE5\u8FD9\u91CC\u672C\u5730\u62D2\u6389\uFF0C\u26D4 \u4E0D\u53D1\u8BF7\u6C42\u3002`,
612
+ retryable: false
613
+ }
614
+ });
615
+ }
616
+ return proxy("POST", shop, "/promotion/202309/activities/search", {
617
+ body: {
618
+ // 🔴 省略 --status ⇒ body **不带 status 字段**(⛔ 不是传空串)⇒ 平台回全部状态。
619
+ // 实测(2026-09-19 cn-prod,YOHO Finds):{page_size:100} 无 status → 51 条,
620
+ // 分布 {DEACTIVATED:38, ONGOING:13};显式 DEACTIVATED → 38 条。
621
+ // ⚠️ 原先硬默认 "ONGOING" 使「查全部」无法表达;已知调用点都显式传 --status,不破坏。
622
+ ...args2.status ? { status: String(args2.status) } : {},
623
+ page_size: Number(args2["page-size"] ?? 20),
624
+ // 照同文件 orders 的写法(有值才带)。实测 next_page_token="2"→"4" 可翻页、两页无重叠;
625
+ // **末页该键缺席**(不是空串)⇒ 下游可据此判「读全了」。
626
+ ...args2["page-token"] ? { page_token: String(args2["page-token"]) } : {}
627
+ }
628
+ });
629
+ }
606
630
  },
607
631
  {
608
632
  name: "finance statements",
@@ -1182,7 +1206,7 @@ function parseFlags(tokens) {
1182
1206
  }
1183
1207
  return { args: args2, positional: positional2 };
1184
1208
  }
1185
- var BOOLEAN_FLAGS = /* @__PURE__ */ new Set(["apply", "default", "unprocessed", "enable"]);
1209
+ var BOOLEAN_FLAGS = /* @__PURE__ */ new Set(["apply", "default", "unprocessed", "enable", "force-status"]);
1186
1210
  var FLAG_TRUE = /* @__PURE__ */ new Set(["true", "1", "yes", "on"]);
1187
1211
  var FLAG_FALSE = /* @__PURE__ */ new Set(["false", "0", "no", "off", ""]);
1188
1212
  function normalizeBooleanFlags(args2) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/tiktok-cli",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "TikTok Shop CLI for Optima agents — 经 tiktok-backend 操作店铺",
5
5
  "type": "module",
6
6
  "bin": {