siluzan-tso-cli 1.1.40-beta.4 → 1.1.40-beta.6

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.40-beta.4),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
54
+ > **注意**:当前为测试版(1.1.40-beta.6),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
55
 
56
56
  | 助手 | 建议 `--ai` |
57
57
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -2296,16 +2296,13 @@ function buildSiluzanClientIdentityHeaders() {
2296
2296
  const client = getSiluzanClientProduct();
2297
2297
  const runtime = resolveSiluzanClientRuntime();
2298
2298
  const version = getSiluzanSkillVersion();
2299
- const headers = {
2299
+ return {
2300
2300
  "X-Siluzan-Client": client,
2301
2301
  "X-Siluzan-Runtime": runtime,
2302
2302
  "X-Siluzan-Skill-Version": version,
2303
+ "X-Company-Source-Type": SILUZAN_AGENT_COMPANY_SOURCE_TYPE,
2303
2304
  "User-Agent": `${client}/${version}`
2304
2305
  };
2305
- if (runtime === "siluzan_agent") {
2306
- headers["X-Company-Source-Type"] = SILUZAN_AGENT_COMPANY_SOURCE_TYPE;
2307
- }
2308
- return headers;
2309
2306
  }
2310
2307
  function isPerfEnabled() {
2311
2308
  const v = process.env.SILUZAN_HTTP_PERF;
@@ -2332,6 +2329,19 @@ function rawRequest(url, options) {
2332
2329
  ...buildSiluzanClientIdentityHeaders(),
2333
2330
  ...options.headers
2334
2331
  };
2332
+ if (process.env.SILUZAN_DEBUG_HEADERS === "1" || process.env.SILUZAN_DEBUG_HEADERS === "true") {
2333
+ try {
2334
+ process.stderr.write(
2335
+ `[SILUZAN_DEBUG_HEADERS] ${method} ${url}
2336
+ X-Company-Source-Type=${headers["X-Company-Source-Type"] ?? "(missing)"}
2337
+ X-Siluzan-Runtime=${headers["X-Siluzan-Runtime"] ?? "(missing)"}
2338
+ X-Siluzan-Client=${headers["X-Siluzan-Client"] ?? "(missing)"}
2339
+ X-Siluzan-Skill-Version=${headers["X-Siluzan-Skill-Version"] ?? "(missing)"}
2340
+ `
2341
+ );
2342
+ } catch {
2343
+ }
2344
+ }
2335
2345
  const reqOpts = {
2336
2346
  hostname: parsed.hostname,
2337
2347
  port: parsed.port || (isHttps ? 443 : 80),
@@ -4474,56 +4484,6 @@ var init_currency_display = __esm({
4474
4484
  }
4475
4485
  });
4476
4486
 
4477
- // src/utils/media-customer-id.ts
4478
- function stripMediaCustomerIdDecorators(raw) {
4479
- return raw.trim().replace(/[\s-]+/g, "");
4480
- }
4481
- function looksLikeNumericMediaCustomerId(raw) {
4482
- return /^\d+$/.test(stripMediaCustomerIdDecorators(raw));
4483
- }
4484
- function normalizeNumericMediaCustomerId(raw) {
4485
- if (!looksLikeNumericMediaCustomerId(raw)) return null;
4486
- return stripMediaCustomerIdDecorators(raw);
4487
- }
4488
- function looksLikeEntityIdUuid(raw) {
4489
- return ENTITY_ID_UUID_RE.test(raw.trim());
4490
- }
4491
- function warnIfAccountIdsLookLikeEntityId(ids, command) {
4492
- const bad = ids.map((id) => id.trim()).filter((id) => id && looksLikeEntityIdUuid(id));
4493
- if (bad.length === 0) return;
4494
- console.error(
4495
- `
4496
- \u26A0\uFE0F ${command} \u7684 -a/--accounts \u6536\u5230\u7591\u4F3C entityId/UUID\uFF1A${bad.join(", ")}
4497
- \u672C\u547D\u4EE4\u9700\u8981 mediaCustomerId\uFF08list-accounts \u7684 ma.mediaCustomerId\uFF1BYandex \u5F62\u5982 porg-\u2026\uFF09\u3002
4498
- \u8BF7\u5148 list-accounts -m <\u5A92\u4F53> -k <\u5A92\u4F53\u8D26\u6237\u53F7> \u6838\u5BF9\u540E\u518D\u91CD\u8BD5\uFF1B\u52FF\u636E\u6B64\u76F4\u63A5 reauth\u3002
4499
- `
4500
- );
4501
- }
4502
- function parseNumericMediaCustomerIds(input) {
4503
- if (!input || !input.trim()) return [];
4504
- const seen = /* @__PURE__ */ new Set();
4505
- const out = [];
4506
- for (const raw of input.split(",")) {
4507
- const piece = raw.trim();
4508
- if (!piece) continue;
4509
- const id = normalizeNumericMediaCustomerId(piece);
4510
- if (!id) {
4511
- throw new Error(`mediaCustomerId \u5FC5\u987B\u4E3A\u7EAF\u6570\u5B57\uFF08\u53EF\u542B\u8FDE\u5B57\u7B26\uFF09\uFF1A${piece}`);
4512
- }
4513
- if (seen.has(id)) continue;
4514
- seen.add(id);
4515
- out.push(id);
4516
- }
4517
- return out;
4518
- }
4519
- var ENTITY_ID_UUID_RE;
4520
- var init_media_customer_id = __esm({
4521
- "src/utils/media-customer-id.ts"() {
4522
- "use strict";
4523
- ENTITY_ID_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4524
- }
4525
- });
4526
-
4527
4487
  // src/utils/balance.ts
4528
4488
  function fmt(d) {
4529
4489
  return d.toISOString().slice(0, 10);
@@ -4830,6 +4790,56 @@ var init_balance = __esm({
4830
4790
  }
4831
4791
  });
4832
4792
 
4793
+ // src/utils/media-customer-id.ts
4794
+ function stripMediaCustomerIdDecorators(raw) {
4795
+ return raw.trim().replace(/[\s-]+/g, "");
4796
+ }
4797
+ function looksLikeNumericMediaCustomerId(raw) {
4798
+ return /^\d+$/.test(stripMediaCustomerIdDecorators(raw));
4799
+ }
4800
+ function normalizeNumericMediaCustomerId(raw) {
4801
+ if (!looksLikeNumericMediaCustomerId(raw)) return null;
4802
+ return stripMediaCustomerIdDecorators(raw);
4803
+ }
4804
+ function looksLikeEntityIdUuid(raw) {
4805
+ return ENTITY_ID_UUID_RE.test(raw.trim());
4806
+ }
4807
+ function warnIfAccountIdsLookLikeEntityId(ids, command) {
4808
+ const bad = ids.map((id) => id.trim()).filter((id) => id && looksLikeEntityIdUuid(id));
4809
+ if (bad.length === 0) return;
4810
+ console.error(
4811
+ `
4812
+ \u26A0\uFE0F ${command} \u7684 -a/--accounts \u6536\u5230\u7591\u4F3C entityId/UUID\uFF1A${bad.join(", ")}
4813
+ \u672C\u547D\u4EE4\u9700\u8981 mediaCustomerId\uFF08list-accounts \u7684 ma.mediaCustomerId\uFF1BYandex \u5F62\u5982 porg-\u2026\uFF09\u3002
4814
+ \u8BF7\u5148 list-accounts -m <\u5A92\u4F53> -k <\u5A92\u4F53\u8D26\u6237\u53F7> \u6838\u5BF9\u540E\u518D\u91CD\u8BD5\uFF1B\u52FF\u636E\u6B64\u76F4\u63A5 reauth\u3002
4815
+ `
4816
+ );
4817
+ }
4818
+ function parseNumericMediaCustomerIds(input) {
4819
+ if (!input || !input.trim()) return [];
4820
+ const seen = /* @__PURE__ */ new Set();
4821
+ const out = [];
4822
+ for (const raw of input.split(",")) {
4823
+ const piece = raw.trim();
4824
+ if (!piece) continue;
4825
+ const id = normalizeNumericMediaCustomerId(piece);
4826
+ if (!id) {
4827
+ throw new Error(`mediaCustomerId \u5FC5\u987B\u4E3A\u7EAF\u6570\u5B57\uFF08\u53EF\u542B\u8FDE\u5B57\u7B26\uFF09\uFF1A${piece}`);
4828
+ }
4829
+ if (seen.has(id)) continue;
4830
+ seen.add(id);
4831
+ out.push(id);
4832
+ }
4833
+ return out;
4834
+ }
4835
+ var ENTITY_ID_UUID_RE;
4836
+ var init_media_customer_id = __esm({
4837
+ "src/utils/media-customer-id.ts"() {
4838
+ "use strict";
4839
+ ENTITY_ID_UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4840
+ }
4841
+ });
4842
+
4833
4843
  // src/utils/media-account-batch.ts
4834
4844
  function mediaAccountDataBatchSize(media) {
4835
4845
  switch (media) {
@@ -5508,12 +5518,14 @@ function resolveDailyMetricsQueryTimes(startDate, endDate, now = /* @__PURE__ */
5508
5518
  const endInstant = endOfDay.getTime() > now.getTime() ? formatChinaOffsetDateTime(now) : formatChinaOffsetDateTime(endOfDay);
5509
5519
  return { startInstant, endInstant };
5510
5520
  }
5511
- var CHINA_OFFSET_MS, resolveChinaQueryTimes;
5521
+ function resolveChinaQueryTimes(startDate, endDate, _now = /* @__PURE__ */ new Date()) {
5522
+ return { startInstant: startDate, endInstant: endDate };
5523
+ }
5524
+ var CHINA_OFFSET_MS;
5512
5525
  var init_daily_metrics_range = __esm({
5513
5526
  "src/commands/google-analysis/daily-metrics-range.ts"() {
5514
5527
  "use strict";
5515
5528
  CHINA_OFFSET_MS = 8 * 36e5;
5516
- resolveChinaQueryTimes = resolveDailyMetricsQueryTimes;
5517
5529
  }
5518
5530
  });
5519
5531
 
@@ -6025,7 +6037,7 @@ var init_sections = __esm({
6025
6037
  name: "daily-metrics",
6026
6038
  description: "\u6309\u65E5\u6307\u6807\uFF08\u4E3B\u5E73\u53F0 /report/media-account/google/account-daily-reports\uFF0C\u542B\u641C\u7D22\u4EFD\u989D\u7B49\uFF09",
6027
6039
  dateMode: "range",
6028
- /** 仅用于 manifest endpointHint;实际请求走 fetchSectionPayload 专用分支(apiBaseUrl + 东八区起止时刻) */
6040
+ /** 仅用于 manifest endpointHint;实际请求走 fetchSectionPayload 专用分支(apiBaseUrl + YYYY-MM-DD) */
6029
6041
  path: () => "/report/media-account/google/account-daily-reports"
6030
6042
  },
6031
6043
  {
@@ -102120,7 +102132,7 @@ async function fetchSectionPayload(def, opts, config, id, http2) {
102120
102132
  }
102121
102133
  if (def.name === "daily-metrics") {
102122
102134
  const { startDate, endDate } = resolveDateRange(opts.start, opts.end);
102123
- const { startInstant, endInstant } = resolveDailyMetricsQueryTimes(startDate, endDate);
102135
+ const { startInstant, endInstant } = resolveChinaQueryTimes(startDate, endDate);
102124
102136
  const params = new URLSearchParams({
102125
102137
  mediaCustomerIds: id,
102126
102138
  startDate: startInstant,
@@ -104078,10 +104090,10 @@ function registerRunCommand() {
104078
104090
  "\u7ED3\u679C\u843D\u76D8\u76EE\u5F55\uFF1B\u6BCF\u7EF4\u5EA6\u4E00\u4E2A <section>-<accountId>.json\uFF0C\u4E0E manifest-<accountId>.json \u540C\u7EA7"
104079
104091
  ).option("-t, --token <token>", "Auth Token").option(
104080
104092
  "--start <date>",
104081
- "\u5F00\u59CB\u65E5\u671F YYYY-MM-DD\uFF08\u6309 UTC+8 \u65E5\u5386\u65E5\uFF1Brange \u7C7B\u7EF4\u5EA6\u4F1A\u8F6C\u6210 \u2026T00:00:00+08:00 \u518D\u8BF7\u6C42\uFF1B\u7701\u7565=\u8FD1 7 \u5929\u622A\u81F3\u6628\u5929\uFF1B\u4E0E --end \u540C\u4F20\u6216\u540C\u7701\uFF09"
104093
+ "\u5F00\u59CB\u65E5\u671F YYYY-MM-DD\uFF08google-analysis \u53EA\u4F20\u5E74\u6708\u65E5\uFF1B\u7701\u7565=\u8FD1 7 \u5929\u622A\u81F3\u6628\u5929\uFF0C\u9ED8\u8BA4\u6309 UTC+8 \u65E5\u5386\uFF1B\u4E0E --end \u540C\u4F20\u6216\u540C\u7701\uFF09"
104082
104094
  ).option(
104083
104095
  "--end <date>",
104084
- "\u7ED3\u675F\u65E5\u671F YYYY-MM-DD\uFF08\u6309 UTC+8\uFF1B\u8F6C\u6210 \u2026T23:59:59+08:00\uFF0C\u542B\u4ECA\u5929\u65F6\u622A\u5230\u5F53\u524D\u65F6\u523B\uFF09"
104096
+ "\u7ED3\u675F\u65E5\u671F YYYY-MM-DD\uFF08\u53EA\u4F20\u5E74\u6708\u65E5\uFF1B\u7701\u7565=\u6628\u5929\uFF09"
104085
104097
  ).option("--start-date <date>", "\u540C --start\uFF08\u6587\u6863/Playbook \u517C\u5BB9\u522B\u540D\uFF09").option("--end-date <date>", "\u540C --end\uFF08\u6587\u6863/Playbook \u517C\u5BB9\u522B\u540D\uFF09").option(
104086
104098
  "--sections <list>",
104087
104099
  "\u4EC5\u6267\u884C\u6307\u5B9A\u7EF4\u5EA6\uFF08\u9017\u53F7\u5206\u9694\uFF09\uFF0C\u5982 overview,keywords,ads\uFF1B\u7701\u7565=\u5168\u90E8 25 \u4E2A"
@@ -105703,6 +105715,12 @@ var VALID_MEDIA_TYPES = [
105703
105715
  "BingV2",
105704
105716
  "Kwai"
105705
105717
  ];
105718
+ function applyListAccountsSearchKeyword(params, keyword) {
105719
+ const kw = (keyword ?? "").trim();
105720
+ if (kw) {
105721
+ params.set("keyword", kw);
105722
+ }
105723
+ }
105706
105724
  var PLATFORM_CONFIG = {
105707
105725
  Google: {
105708
105726
  path: "/query/media-account/",
@@ -106161,7 +106179,6 @@ function wrapListJson(params) {
106161
106179
  }
106162
106180
 
106163
106181
  // src/commands/list-accounts/main.ts
106164
- init_media_customer_id();
106165
106182
  async function runListAccounts(opts) {
106166
106183
  let config = loadConfig(opts.token);
106167
106184
  if (opts.refreshDp) {
@@ -106191,14 +106208,7 @@ async function runListAccounts(opts) {
106191
106208
  if (platformCfg.responseType === "array" && opts.status && opts.status !== "all") {
106192
106209
  params.set("status", opts.status);
106193
106210
  }
106194
- if (opts.keyword) {
106195
- const numericId = normalizeNumericMediaCustomerId(opts.keyword);
106196
- if (numericId) {
106197
- params.set(platformCfg.idSearchParam, numericId);
106198
- } else {
106199
- params.set("mediaCustomerName", opts.keyword.trim());
106200
- }
106201
- }
106211
+ applyListAccountsSearchKeyword(params, opts.keyword);
106202
106212
  const url = `${config.apiBaseUrl}${platformCfg.path}?${params}`;
106203
106213
  if (platformCfg.responseType === "array") {
106204
106214
  try {
@@ -106232,9 +106242,7 @@ async function runListAccounts(opts) {
106232
106242
  }
106233
106243
  } else {
106234
106244
  const params = new URLSearchParams();
106235
- if (opts.keyword) {
106236
- params.set("keyword", normalizeNumericMediaCustomerId(opts.keyword) ?? opts.keyword.trim());
106237
- }
106245
+ applyListAccountsSearchKeyword(params, opts.keyword);
106238
106246
  if (opts.status && opts.status !== "all") params.set("status", opts.status);
106239
106247
  params.set("pageNo", String(page));
106240
106248
  params.set("pageSize", String(pageSize));
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.40-beta.4",
4
- "publishedAt": 1785321077403
3
+ "version": "1.1.40-beta.6",
4
+ "publishedAt": 1785491315308
5
5
  }
@@ -152,7 +152,7 @@ siluzan-tso accounts-digest -m Google --start 2026-07-20 --end 2026-07-20 \
152
152
  ## stats — 查询投放消耗数据
153
153
 
154
154
  > **数据时效性**:
155
- > - **Google**:走 `account-spend-overview`;`--start` / `--end` 日历日按 **UTC+8** 转为 `YYYY-MM-DDTHH:mm:ss+08:00` 再请求(起 00:00:00、止 23:59:59,含今天时 end 截到当前时刻)。勿传裸 `YYYY-MM-DD`(易被当成 UTC 切窗)。
155
+ > - **Google**:走 `account-spend-overview`;`--start` / `--end` 日历日按 **UTC+8** 转为 `YYYY-MM-DDTHH:mm:ss+08:00` 再请求(起 00:00:00、止 23:59:59,含今天时 end 截到当前时刻)。与 `google-analysis`(只传年月日)口径不同。
156
156
  > - 窗口完全在历史 → `database` 模式;窗口含今天 → `googleCombined` 模式(仅实时消耗,无余额/状态/币种/账户名)。
157
157
  > - **TikTok / Yandex / BingV2 / Kwai**:走旧版 `accountsoverview`,每日凌晨同步昨天数据,**不能查今天**。判断这几家的「今天/当天/今日消耗」仍需走 `google-analysis(-batch) --sections overview`(仅 Google)。
158
158
  > - 完整时效性表见 `references/analytics/account-analytics.md` 顶部。
@@ -17,7 +17,7 @@ siluzan-tso list-accounts [选项]
17
17
  | 选项 | 说明 |
18
18
  | ----------------------- | -------------------------------------------------------------------------------- | ---------------------- |
19
19
  | `-m, --media <type>` | 媒体类型(留空查全部):`Google \| TikTok \| Yandex \| MetaAd \| BingV2 \| Kwai` |
20
- | `-k, --keyword <text>` | 按账户名称或 ID 搜索 |
20
+ | `-k, --keyword <text>` | 统一模糊搜索:账户名称 **或** ID(含 Google CID 带横杠);透传 Sammamish `keyword` |
21
21
  | `-s, --status <status>` | 账户状态:`normal \| invalid \| all`(默认 all) |
22
22
  | `-p, --page <n>` | 页码(默认 1) |
23
23
  | `--page-size <n>` | 每页数量(默认 20) |
@@ -23,9 +23,9 @@
23
23
 
24
24
  | 命令 / 接口 | 时效性 | 能否查"今天" | 典型用途 |
25
25
  | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | ------------------------------------------------------ |
26
- | `google-analysis --sections overview`(Google 网关 `OverviewSectionData`) | **实时**;请求起止按 **UTC+8** 墙钟 | ✅ 可查当天 | 当天/今日消耗、当天高消耗账号排行 |
26
+ | `google-analysis --sections overview`(Google 网关 `OverviewSectionData`) | **实时**;请求起止为 **YYYY-MM-DD**(不附加时区) | ✅ 可查当天 | 当天/今日消耗、当天高消耗账号排行 |
27
27
  | `google-analysis --sections campaign-types`(`types-summary`) | **实时** | ✅ 可查当天 | 当天系列类型分布 |
28
- | `google-analysis` 其他 range 维度(`campaigns` / `keywords` / `devices` / `geographic` / `daily-metrics` / …) | 实时(受 Google Ads API 同步延迟影响);**一律东八区起止时刻**(与 `stats` 同) | 可查当天,但当天可能尚未结算 | 周期分析、报告 |
28
+ | `google-analysis` 其他 range 维度(`campaigns` / `keywords` / `devices` / `geographic` / `daily-metrics` / …) | 实时(受 Google Ads API 同步延迟影响);**一律 YYYY-MM-DD**(不附加时区;与 `stats` 的 UTC+8 不同) | 可查当天,但当天可能尚未结算 | 周期分析、报告 |
29
29
  | `stats -m Google` / `balance-scan -m Google` / `accounts-digest -m Google` / `list-accounts -m Google` 合并消耗(TSO `account-spend-overview`,2026-05 起) | **后端自动分流**:窗口完全在历史 → `database`;含今天 → `googleCombined`。**`stats` 请求起止按 UTC+8 墙钟**(`…T00:00:00+08:00` ~ `…T23:59:59+08:00`) | ✅ 可查当天(含今天时切实时聚合) | 历史回溯、巡检、周报 KPI、余额续航估算 |
30
30
  | `stats` / `balance-scan` / `accounts-digest` / `list-accounts` 的 **TikTok / Yandex / BingV2 / Kwai / MetaAd** 合并消耗(TSO `accountsoverview`;MetaAd OAuth 户走 `FacebookAds` 段) | **每日同步昨天** | ❌ 查今天会全为 0 | 历史回溯、巡检、余额续航估算(口径为"截至昨天") |
31
31
  | `balance`(`GetMediaAccountInfo`) | 实时 | — | 仅当前余额,不反映消耗 |
@@ -102,7 +102,7 @@ siluzan-tso google-analysis -a <id> --exclude materials,gold-account --json-out
102
102
  | `--json-out <dir>` | 必填;每维一个 `<section>-<accountId>.json` + `manifest-<accountId>.json` |
103
103
  | `--sections <list>` | 仅执行指定维度(逗号分隔);省略=全部 25 个 |
104
104
  | `--exclude <list>` | 排除指定维度;与 `--sections` 可叠加 |
105
- | `--start` / `--end` | 统计区间(YYYY-MM-DD,按 **UTC+8** 日历日);CLI 转成 `…T00:00:00+08:00` ~ `…T23:59:59+08:00` 再请求;省略=近 7 天截至昨天;`final-urls`/`campaign-types` 自动忽略 |
105
+ | `--start` / `--end` | 统计区间(YYYY-MM-DD,**只传年月日**;默认区间按 UTC+8 日历)。与 `stats -m Google`(会加成 `+08:00`)不同;省略=近 7 天截至昨天;`final-urls`/`campaign-types` 自动忽略 |
106
106
  | `--concurrency <n>` | 并发数,默认 5,上限 16 |
107
107
  | `--limit <n>` | 透传给 `keywords`/`search-terms`(默认 **0**=不封顶;`orderByCost=true`) |
108
108
  | `--level <lvl>` | 透传给 `extensions`(Account/Campaign/Ad Group) |
@@ -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.40-beta.4'
12
+ $PKG_VERSION = '1.1.40-beta.6'
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.40-beta.4"
12
+ readonly PKG_VERSION="1.1.40-beta.6"
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.40-beta.4",
3
+ "version": "1.1.40-beta.6",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",