siluzan-tso-cli 1.1.53-beta.3 → 1.1.53-beta.4

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
@@ -51,7 +51,7 @@ siluzan-tso init -d /path/to/skills # 写入自定义目录
51
51
  siluzan-tso init --force # 强制覆盖已存在文件
52
52
  ```
53
53
 
54
- > **注意**:当前为测试版(1.1.53-beta.3),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
54
+ > **注意**:当前为测试版(1.1.53-beta.4),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
55
 
56
56
  | 助手 | 建议 `--ai` |
57
57
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -2467,7 +2467,13 @@ function rawRequest(url, options) {
2467
2467
  }
2468
2468
  reject(err);
2469
2469
  });
2470
- if (options.body) req.write(options.body);
2470
+ if (options.body !== void 0) {
2471
+ const payload = typeof options.body === "string" ? Buffer.from(options.body) : options.body;
2472
+ if (!headers["Content-Length"] && !headers["content-length"]) {
2473
+ req.setHeader("Content-Length", payload.length);
2474
+ }
2475
+ req.write(payload);
2476
+ }
2471
2477
  req.end();
2472
2478
  });
2473
2479
  }
@@ -2562,6 +2568,20 @@ function formatHttpError(status, rawBody, opts) {
2562
2568
  function buildAuthHeaders(config) {
2563
2569
  return buildSiluzanAuthHeaders(config);
2564
2570
  }
2571
+ async function parseApiResponse(status, text2, verbose) {
2572
+ if (status < 200 || status >= 300) {
2573
+ throw new Error(formatHttpError(status, text2, { verbose }));
2574
+ }
2575
+ if (!text2.trim()) return null;
2576
+ try {
2577
+ return parseJsonWithStringIds(text2);
2578
+ } catch {
2579
+ if (verbose) {
2580
+ console.error(` \u26A0\uFE0F \u54CD\u5E94\u975E JSON\uFF0C\u539F\u59CB\u5185\u5BB9\uFF1A${redactSensitive(text2).slice(0, 200)}`);
2581
+ }
2582
+ return text2;
2583
+ }
2584
+ }
2565
2585
  async function apiFetch(url, config, options = {}, verbose = false) {
2566
2586
  const method = options.method ?? "GET";
2567
2587
  const reqHeaders = {
@@ -2580,19 +2600,7 @@ async function apiFetch(url, config, options = {}, verbose = false) {
2580
2600
  headers: reqHeaders,
2581
2601
  body
2582
2602
  });
2583
- const text2 = res.text;
2584
- if (res.status < 200 || res.status >= 300) {
2585
- throw new Error(formatHttpError(res.status, text2, { verbose }));
2586
- }
2587
- if (!text2.trim()) return null;
2588
- try {
2589
- return parseJsonWithStringIds(text2);
2590
- } catch {
2591
- if (verbose) {
2592
- console.error(` \u26A0\uFE0F \u54CD\u5E94\u975E JSON\uFF0C\u539F\u59CB\u5185\u5BB9\uFF1A${redactSensitive(text2).slice(0, 200)}`);
2593
- }
2594
- return text2;
2595
- }
2603
+ return parseApiResponse(res.status, res.text, verbose);
2596
2604
  }
2597
2605
  async function apiFetchWithHeaders(url, config, options = {}, verbose = false) {
2598
2606
  const method = options.method ?? "GET";
@@ -134432,16 +134440,23 @@ function parseInquiryRecords(raw) {
134432
134440
  for (const item of list) {
134433
134441
  if (!item || typeof item !== "object") continue;
134434
134442
  const row = item;
134435
- const countryZh = pick(row, ["countryZh", "country", "\u56FD\u5BB6", "\u56FD\u5BB6(\u4E2D\u6587)"]);
134436
- const date = pick(row, ["date", "\u65F6\u95F4", "time"]);
134443
+ const countryZh = pick(row, [
134444
+ "\u76EE\u6807\u56FD\u5BB6/\u5730\u533A",
134445
+ "countryZh",
134446
+ "country",
134447
+ "\u56FD\u5BB6",
134448
+ "\u56FD\u5BB6(\u4E2D\u6587)"
134449
+ ]);
134450
+ const date = pick(row, ["\u8BE2\u76D8\u65E5\u671F", "date", "\u65F6\u95F4", "time"]);
134437
134451
  const month = normalizeMonth(pick(row, ["month", "\u6708\u4EFD", "ym"]), date || void 0);
134438
134452
  if (!countryZh && !month) continue;
134439
134453
  out.push({
134440
134454
  month,
134441
134455
  countryZh,
134442
134456
  date: date || void 0,
134443
- product: pick(row, ["product", "\u4EA7\u54C1"]) || void 0,
134444
- source: pick(row, ["source", "\u5BA2\u6237\u6765\u6E90", "\u6765\u6E90"]) || void 0
134457
+ product: pick(row, ["\u4EA7\u54C1/\u54C1\u7C7B", "product", "\u4EA7\u54C1"]) || void 0,
134458
+ source: pick(row, ["\u8BE2\u76D8\u6765\u6E90\u5173\u952E\u8BCD", "source", "\u5BA2\u6237\u6765\u6E90", "\u6765\u6E90"]) || void 0,
134459
+ quality: pick(row, ["\u8BE2\u76D8\u8D28\u91CF\u5206\u7EA7", "qualityGrade", "quality"]) || void 0
134445
134460
  });
134446
134461
  }
134447
134462
  return out;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.53-beta.3",
4
- "publishedAt": 1789698851730
3
+ "version": "1.1.53-beta.4",
4
+ "publishedAt": 1789721782096
5
5
  }
@@ -323,9 +323,9 @@
323
323
  | P1 / P4 / P10 | 账户 ID | 「请提供 Google 广告账户 ID(mediaCustomerId)。」 |
324
324
  | P1 / P4 | 时间 | 按 `agent-conventions.md` §五 反问区间 |
325
325
  | P10 | 时间 | 季度话术可省略(上一完整季);月度报告 / 下月规划用上一完整月或用户指定月 |
326
- | P10 | 询盘附件 | **未带表先问「有没有本期询盘表」并等待**;有则转 `inquiries.json` `--inquiries`;用户说没有再 collect。**禁止**不问就出报告;**禁止**把 xlsx/csv 原文件传给 collect |
326
+ | P10 | 询盘附件 | **未带表先问「有没有本期询盘表」并等待**;有则先看一眼表头再转 `inquiries.json` `--inquiries`;用户说没有再 collect。**禁止**不问就出报告;**禁止**把 xlsx/csv 原文件传给 collect |
327
327
  | P6 | 非 OKKI 话术 | 若用户实际要普通周期报告 → 改 P4 并说明 |
328
- | P7 | 无询盘文件 | 贴字段清单,**禁止编造询盘**;若用户只要账户级零转化 → 改 **P3** |
328
+ | P7 | 无询盘文件 | 贴字段清单,**禁止编造询盘**;用表前先看一眼表头;若用户只要账户级零转化 → 改 **P3** |
329
329
  | P3(§零·D) | 时间区间 | 按 `agent-conventions.md` §五 反问;巡检默认近 7 天须写明区间 |
330
330
  | W3 | 预算/地域 | 先列待确认项,再进入 campaign-plan 流水线 |
331
331
 
@@ -154,7 +154,7 @@
154
154
  - **时间窗口强约束**:**严格 3 个月** = 分析月份 + 向前 2 个完整自然月,**禁止**扩展到 7 个月。
155
155
  - **步骤**:
156
156
  1. (可选)Read `subagent-orchestration.md` § P7。
157
- 2. 询盘资料入场:用户附文件 → 解析落盘 `./snap-inquiry/inquiries.json`;仅给账户 ID → 反问账户 + 分析月份并贴字段清单,**禁止编造询盘数据**。
157
+ 2. 询盘资料入场:用户附文件 → 先看一眼表头再落盘 `./snap-inquiry/inquiries.json`(列名接近即可);仅给账户 ID → 反问账户 + 分析月份并贴字段清单,**禁止编造询盘数据**。
158
158
  3. CLI 拉数(同一目录):`list-accounts`、`google-analysis --sections campaigns,keywords,search-terms,campaign-geo`,并按月拉 `m1/m2/m3` 的 `campaigns,geographic`。
159
159
  4. 脚本聚合计算 8 Sheet 数据;国家→大洲映射读 `geo-continents.json`,**禁止**硬编码国家名。
160
160
  - **产物**:必产 8 Sheet xlsx(版式见模板),**只能**由 Agent 脚本生成,**禁止**假设 `… excel` 子命令存在。
@@ -44,9 +44,9 @@
44
44
  2. 同时贴出**询盘字段清单 + 1 行示例**,让用户用任意方式补齐再回传:
45
45
 
46
46
  ```
47
- 请把近 3 个月({S} ~ {E})的询盘记录回贴或上传(Excel / CSV / 截图 / 文本表格均可),字段如下:
48
- 月份 | 序号(可空) | 国家(中文) | 时间(YYYY-MM-DD Excel 序列) | 产品 | 客户来源 | IP(可空)
49
- 示例:4月份 | 1 | 印度 | 2026-04-12 | 滴灌带 | WhatsApp(www.extruder.cn)
47
+ 请把近 3 个月({S} ~ {E})的询盘记录回贴或上传(Excel / CSV / 截图 / 文本表格均可),字段如下(* 为必填):
48
+ 序号 | 询盘日期* | 询盘来源关键词 | 目标国家/地区* | 产品/品类* | 客户名称/公司 | 联系方式 | 询盘内容摘要 | 询盘质量分级* | 跟进状态 | 是否成交 | 成交金额(USD)
49
+ 示例:1 | 2026-04-12 | WhatsApp | 印度 | 滴灌带 | | | | 合格 | | |
50
50
  ```
51
51
 
52
52
  3. 拿到资料后由宿主 Agent 解析、落盘 `inquiries.json`,再进入「拉数与写 Excel」节。
@@ -58,8 +58,8 @@
58
58
  1. **账户**:`mediaCustomerId` 来自 `list-accounts -m Google -k <id>`,**禁止猜 ID**。
59
59
  2. **分析月份**:默认**上一个完整自然月**(例:今天 5/13 → 默认 4 月)。用户未明确时**反问**(A) 上月 B) 本月 1 号到昨天 C) 自定义 YYYY-MM)。
60
60
  3. **时间窗口(硬约束)**:**严格 3 个月** = 分析月份 + 向前 2 个完整自然月。例:分析月 = 2026-04 → `--start 2026-02-01 --end 2026-04-30`。**所有月度表只展示 3 行**(不延伸到 7 个月)。
61
- 4. **询盘字段最小集**:`月份 / 国家(中文) / 时间 / 产品 / 客户来源`;可选 `序号 / IP`。
62
- 5. **日期规范化**:`2026.4.1` / `2026/4/1` 等先规范成 `YYYY-MM-DD` 再传 CLI
61
+ 4. **用询盘数据前先看一眼表头**。常见列见上;* 表示通常要有对应含义的列(`询盘日期`≈时间/date,`目标国家/地区`≈国家,`产品/品类`≈产品,`询盘质量分级`有则用)。列名接近即可,不必逐格校验。
62
+ 5. **日期规范化**:`2026.4.1` / `2026/4/1` 等先规范成 `YYYY-MM-DD` 再传 CLI。`月份` 可由询盘日期推导。
63
63
 
64
64
  ---
65
65
 
@@ -155,23 +155,30 @@ Sheet 5 整段系列明细读:`./snap-inquiry/campaigns-<accountId>_<S>-<E>.js
155
155
  ```json
156
156
  [
157
157
  {
158
- "month": "4月份",
159
158
  "seq": 1,
159
+ "date": "2026-04-12",
160
+ "sourceKeyword": "WhatsApp",
160
161
  "country": "印度",
161
- "time": "2026-04-12",
162
162
  "product": "滴灌带",
163
- "source": "WhatsApp(www.extruder.cn)",
164
- "ip": null
163
+ "company": null,
164
+ "contact": null,
165
+ "summary": null,
166
+ "quality": "合格",
167
+ "followUp": null,
168
+ "won": null,
169
+ "amountUsd": null
165
170
  }
166
171
  ]
167
172
  ```
168
173
 
169
- - `month`:保留运营原文(`1月份` / `4月份` …)。
170
- - `country`:**中文名**,与 `countryOrRegionZh` 字典对齐(脚本会自动 lookup 大洲)。Agent 解析时遇到英文/缩写应先翻译为中文,未知国家保留原文并在脚本里标 `未知大洲`。
171
- - `time`:`YYYY-MM-DD`;Excel 日期序列号也接受,由解析方转换。
172
- - `product`:自由文本(`滴灌带` / `打包带` / `片材` / `滴头` / `模具` / `贴条` / `涂布水带` …),脚本以此作 Sheet 3 产品维度透视分桶 key。
173
- - `source`:自由文本(`WhatsApp` / `tawk.to` / `info邮箱` / `网站留言` / `微信(xxxx)` / `阿里巴巴` / `made-in-china` / `Youtube` / `TikTok` …),脚本以此作 Sheet 3 客户来源透视分桶 key。
174
- - `ip`:可空。
174
+ 落盘前先看一眼表头,按含义对上即可(`时间`=`询盘日期`,`国家(中文)`=`目标国家/地区`,`产品`=`产品/品类`)。
175
+
176
+ - `date`:询盘日期,`YYYY-MM-DD`。
177
+ - `country`:目标国家/地区,中文名,与 `countryOrRegionZh` 字典对齐。
178
+ - `product`:产品/品类,Sheet 3 产品分桶。
179
+ - `sourceKeyword` / `source`:来源,Sheet 3 来源分桶(可空)。
180
+ - `quality` / 其余可选列:有则写入,没有就空着。
181
+ - `month`:可由 `date` 推导。**禁止编造**缺失值。
175
182
 
176
183
  ---
177
184
 
@@ -24,21 +24,22 @@ CLI **不读** xlsx / csv / 截图。
24
24
 
25
25
  **禁止**把原始 `.xlsx` / `.csv` 传给 `--inquiries`(会 `JSON.parse` 失败)。用户说没有:可 `--inquiry-conversion <转化动作名>`(须用户点名);再没有则询盘位留空并脚注。**禁止编造询盘行。**
26
26
 
27
- 落盘 JSON:根为数组或 `{ "items": [...] }`。每行至少有国家 +(月份或日期):
27
+ 落盘 JSON:根为数组或 `{ "items": [...] }`。**用之前先看一眼表头**,有日期/国家/产品这类列即可(列名接近即可,如 `时间`=`询盘日期`)。**禁止编造**。
28
28
 
29
- | 用途 | 接受的键 | 归一 |
29
+ | 用途 | 常见键 | 归一 |
30
30
  | ---- | -------- | ---- |
31
- | 国家 | `国家` / `国家(中文)` / `country` / `countryZh` | 英文/缩写先译中文,与 geographic `countryNameZh` 对齐 |
32
- | 月份 | `月份` / `month` / `ym` | `2026-04` `4月份`(有日期则用日期年) |
33
- | 日期 | `时间` / `date` / `time` | `YYYY-MM-DD`;Excel 序列号由 Agent 转好 |
34
- | 产品 | `产品` / `product` | 可选 |
35
- | 来源 | `客户来源` / `来源` / `source` | 可选 |
31
+ | 询盘日期 | `询盘日期` / `date` / `时间` / `time` | `YYYY-MM-DD`;Excel 序列号由 Agent 转好 |
32
+ | 目标国家/地区 | `目标国家/地区` / `国家(中文)` / `国家` / `country` / `countryZh` | 英文/缩写先译中文,与 geographic `countryNameZh` 对齐 |
33
+ | 产品/品类 | `产品/品类` / `产品` / `product` | 自由文本 |
34
+ | 询盘来源关键词 | `询盘来源关键词` / `客户来源` / `来源` / `source` | 可选 |
35
+ | 询盘质量分级 | `询盘质量分级` / `quality` / `qualityGrade` | 有则用 |
36
+ | 月份 | `月份` / `month` / `ym` | 可由询盘日期推导 |
36
37
 
37
- 样例(字段名任选上表别名):
38
+ 样例:
38
39
 
39
40
  ```json
40
41
  [
41
- { "月份": "4月份", "国家(中文)": "印度", "时间": "2026-04-12", "产品": "协作机器人", "客户来源": "WhatsApp" }
42
+ { "询盘日期": "2026-04-12", "目标国家/地区": "印度", "产品/品类": "协作机器人", "询盘来源关键词": "WhatsApp" }
42
43
  ]
43
44
  ```
44
45
 
@@ -44,9 +44,9 @@
44
44
  2. 同时贴出**询盘字段清单 + 1 行示例**,让用户用任意方式补齐再回传:
45
45
 
46
46
  ```
47
- 请把近 3 个月({S} ~ {E})的询盘记录回贴或上传(Excel / CSV / 截图 / 文本表格均可),字段如下:
48
- 月份 | 序号(可空) | 国家(中文) | 时间(YYYY-MM-DD Excel 序列) | 产品 | 客户来源 | IP(可空)
49
- 示例:4月份 | 1 | 印度 | 2026-04-12 | 滴灌带 | WhatsApp(www.extruder.cn)
47
+ 请把近 3 个月({S} ~ {E})的询盘记录回贴或上传(Excel / CSV / 截图 / 文本表格均可),字段如下(* 为必填):
48
+ 序号 | 询盘日期* | 询盘来源关键词 | 目标国家/地区* | 产品/品类* | 客户名称/公司 | 联系方式 | 询盘内容摘要 | 询盘质量分级* | 跟进状态 | 是否成交 | 成交金额(USD)
49
+ 示例:1 | 2026-04-12 | WhatsApp | 印度 | 滴灌带 | | | | 合格 | | |
50
50
  ```
51
51
 
52
52
  3. 拿到资料后由宿主 Agent 解析、落盘 `inquiries.json`,再进入「拉数与写 Excel」节。
@@ -58,8 +58,8 @@
58
58
  1. **账户**:`mediaCustomerId` 来自 `list-accounts -m Google -k <id>`,**禁止猜 ID**。
59
59
  2. **分析月份**:默认**上一个完整自然月**(例:今天 5/13 → 默认 4 月)。用户未明确时**反问**(A) 上月 B) 本月 1 号到昨天 C) 自定义 YYYY-MM)。
60
60
  3. **时间窗口(硬约束)**:**严格 3 个月** = 分析月份 + 向前 2 个完整自然月。例:分析月 = 2026-04 → `--start 2026-02-01 --end 2026-04-30`。**所有月度表只展示 3 行**(不延伸到 7 个月)。
61
- 4. **询盘字段最小集**:`月份 / 国家(中文) / 时间 / 产品 / 客户来源`;可选 `序号 / IP`。
62
- 5. **日期规范化**:`2026.4.1` / `2026/4/1` 等先规范成 `YYYY-MM-DD` 再传 CLI
61
+ 4. **用询盘数据前先看一眼表头**。常见列见上;* 表示通常要有对应含义的列(`询盘日期`≈时间/date,`目标国家/地区`≈国家,`产品/品类`≈产品,`询盘质量分级`有则用)。列名接近即可,不必逐格校验。
62
+ 5. **日期规范化**:`2026.4.1` / `2026/4/1` 等先规范成 `YYYY-MM-DD` 再传 CLI。`月份` 可由询盘日期推导。
63
63
 
64
64
  ---
65
65
 
@@ -155,23 +155,30 @@ Sheet 5 整段系列明细读:`./snap-inquiry/campaigns-<accountId>_<S>-<E>.js
155
155
  ```json
156
156
  [
157
157
  {
158
- "month": "4月份",
159
158
  "seq": 1,
159
+ "date": "2026-04-12",
160
+ "sourceKeyword": "WhatsApp",
160
161
  "country": "印度",
161
- "time": "2026-04-12",
162
162
  "product": "滴灌带",
163
- "source": "WhatsApp(www.extruder.cn)",
164
- "ip": null
163
+ "company": null,
164
+ "contact": null,
165
+ "summary": null,
166
+ "quality": "合格",
167
+ "followUp": null,
168
+ "won": null,
169
+ "amountUsd": null
165
170
  }
166
171
  ]
167
172
  ```
168
173
 
169
- - `month`:保留运营原文(`1月份` / `4月份` …)。
170
- - `country`:**中文名**,与 `countryOrRegionZh` 字典对齐(脚本会自动 lookup 大洲)。Agent 解析时遇到英文/缩写应先翻译为中文,未知国家保留原文并在脚本里标 `未知大洲`。
171
- - `time`:`YYYY-MM-DD`;Excel 日期序列号也接受,由解析方转换。
172
- - `product`:自由文本(`滴灌带` / `打包带` / `片材` / `滴头` / `模具` / `贴条` / `涂布水带` …),脚本以此作 Sheet 3 产品维度透视分桶 key。
173
- - `source`:自由文本(`WhatsApp` / `tawk.to` / `info邮箱` / `网站留言` / `微信(xxxx)` / `阿里巴巴` / `made-in-china` / `Youtube` / `TikTok` …),脚本以此作 Sheet 3 客户来源透视分桶 key。
174
- - `ip`:可空。
174
+ 落盘前先看一眼表头,按含义对上即可(`时间`=`询盘日期`,`国家(中文)`=`目标国家/地区`,`产品`=`产品/品类`)。
175
+
176
+ - `date`:询盘日期,`YYYY-MM-DD`。
177
+ - `country`:目标国家/地区,中文名,与 `countryOrRegionZh` 字典对齐。
178
+ - `product`:产品/品类,Sheet 3 产品分桶。
179
+ - `sourceKeyword` / `source`:来源,Sheet 3 来源分桶(可空)。
180
+ - `quality` / 其余可选列:有则写入,没有就空着。
181
+ - `month`:可由 `date` 推导。**禁止编造**缺失值。
175
182
 
176
183
  ---
177
184
 
@@ -24,21 +24,22 @@ CLI **不读** xlsx / csv / 截图。
24
24
 
25
25
  **禁止**把原始 `.xlsx` / `.csv` 传给 `--inquiries`(会 `JSON.parse` 失败)。用户说没有:可 `--inquiry-conversion <转化动作名>`(须用户点名);再没有则询盘位留空并脚注。**禁止编造询盘行。**
26
26
 
27
- 落盘 JSON:根为数组或 `{ "items": [...] }`。每行至少有国家 +(月份或日期):
27
+ 落盘 JSON:根为数组或 `{ "items": [...] }`。**用之前先看一眼表头**,有日期/国家/产品这类列即可(列名接近即可,如 `时间`=`询盘日期`)。**禁止编造**。
28
28
 
29
- | 用途 | 接受的键 | 归一 |
29
+ | 用途 | 常见键 | 归一 |
30
30
  | ---- | -------- | ---- |
31
- | 国家 | `国家` / `国家(中文)` / `country` / `countryZh` | 英文/缩写先译中文,与 geographic `countryNameZh` 对齐 |
32
- | 月份 | `月份` / `month` / `ym` | `2026-04` `4月份`(有日期则用日期年) |
33
- | 日期 | `时间` / `date` / `time` | `YYYY-MM-DD`;Excel 序列号由 Agent 转好 |
34
- | 产品 | `产品` / `product` | 可选 |
35
- | 来源 | `客户来源` / `来源` / `source` | 可选 |
31
+ | 询盘日期 | `询盘日期` / `date` / `时间` / `time` | `YYYY-MM-DD`;Excel 序列号由 Agent 转好 |
32
+ | 目标国家/地区 | `目标国家/地区` / `国家(中文)` / `国家` / `country` / `countryZh` | 英文/缩写先译中文,与 geographic `countryNameZh` 对齐 |
33
+ | 产品/品类 | `产品/品类` / `产品` / `product` | 自由文本 |
34
+ | 询盘来源关键词 | `询盘来源关键词` / `客户来源` / `来源` / `source` | 可选 |
35
+ | 询盘质量分级 | `询盘质量分级` / `quality` / `qualityGrade` | 有则用 |
36
+ | 月份 | `月份` / `month` / `ym` | 可由询盘日期推导 |
36
37
 
37
- 样例(字段名任选上表别名):
38
+ 样例:
38
39
 
39
40
  ```json
40
41
  [
41
- { "月份": "4月份", "国家(中文)": "印度", "时间": "2026-04-12", "产品": "协作机器人", "客户来源": "WhatsApp" }
42
+ { "询盘日期": "2026-04-12", "目标国家/地区": "印度", "产品/品类": "协作机器人", "询盘来源关键词": "WhatsApp" }
42
43
  ]
43
44
  ```
44
45
 
@@ -9,7 +9,7 @@ $ErrorActionPreference = 'Stop'
9
9
  # -- Package info (injected at build time) ------------------------------------
10
10
  $PKG_NAME = 'siluzan-tso-cli'
11
11
  # PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
12
- $PKG_VERSION = '1.1.53-beta.3'
12
+ $PKG_VERSION = '1.1.53-beta.4'
13
13
  $CLI_BIN = 'siluzan-tso'
14
14
  $SKILL_LABEL = 'Siluzan TSO'
15
15
  $INSTALL_CMD = 'npm install -g siluzan-tso-cli@beta'
@@ -9,7 +9,7 @@ set -euo pipefail
9
9
  # -- Package info (injected at build time) ------------------------------------
10
10
  readonly PKG_NAME="siluzan-tso-cli"
11
11
  # PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
12
- readonly PKG_VERSION="1.1.53-beta.3"
12
+ readonly PKG_VERSION="1.1.53-beta.4"
13
13
  readonly CLI_BIN="siluzan-tso"
14
14
  readonly SKILL_LABEL="Siluzan TSO"
15
15
  readonly INSTALL_CMD="npm install -g siluzan-tso-cli@beta"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-tso-cli",
3
- "version": "1.1.53-beta.3",
3
+ "version": "1.1.53-beta.4",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",