siluzan-tso-cli 1.1.45-beta.1 → 1.1.45-beta.2

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.45-beta.1),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
54
+ > **注意**:当前为测试版(1.1.45-beta.2),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
55
 
56
56
  | 助手 | 建议 `--ai` |
57
57
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -106988,6 +106988,63 @@ function assessBalanceScanDataHealth(input) {
106988
106988
  return null;
106989
106989
  }
106990
106990
 
106991
+ // src/commands/balance-scan/evaluate.ts
106992
+ function evaluateBalanceScanAccounts(params) {
106993
+ const {
106994
+ items: items2,
106995
+ balanceMap,
106996
+ overviewMap,
106997
+ spendDays,
106998
+ thresholdDays,
106999
+ minBalance,
107000
+ minDailySpend,
107001
+ targetDays,
107002
+ includeInvalidOAuth
107003
+ } = params;
107004
+ const evaluated = [];
107005
+ for (const item of items2) {
107006
+ const ma = item.ma;
107007
+ const id = ma?.mediaCustomerId ? String(ma.mediaCustomerId) : "";
107008
+ if (!id) continue;
107009
+ if (!includeInvalidOAuth && ma.invalidOAuthToken) continue;
107010
+ const bal = balanceMap.get(id);
107011
+ const ov = overviewMap.get(id);
107012
+ const balance = bal?.remainingAccountBudget ?? null;
107013
+ const windowSpend = Number(ov?.spend ?? 0);
107014
+ const dailySpend = windowSpend > 0 ? windowSpend / spendDays : 0;
107015
+ let remainingDays = null;
107016
+ let recommendedTopup = null;
107017
+ if (dailySpend >= minDailySpend && balance !== null) {
107018
+ remainingDays = +(balance / dailySpend).toFixed(1);
107019
+ const needed = dailySpend * targetDays - balance;
107020
+ recommendedTopup = needed > 0 ? +needed.toFixed(2) : 0;
107021
+ }
107022
+ const lowDays = remainingDays !== null && remainingDays <= thresholdDays;
107023
+ const lowBalance = minBalance !== null && balance !== null && balance <= minBalance;
107024
+ const hitReason = lowDays && lowBalance ? "both" : lowDays ? "low-days" : lowBalance ? "low-balance" : "none";
107025
+ evaluated.push({
107026
+ mediaCustomerId: id,
107027
+ name: ma.mediaCustomerName ?? bal?.name ?? ov?.mediaCustomerName ?? null,
107028
+ advertiserName: item.mag?.advertiserName ?? null,
107029
+ currencyCode: bal?.currencyCode ?? ma.currencyCode ?? ov?.currencyCode ?? null,
107030
+ balance,
107031
+ dailySpend: dailySpend > 0 ? +dailySpend.toFixed(2) : null,
107032
+ remainingDays,
107033
+ recommendedTopup,
107034
+ invalidOAuthToken: !!ma.invalidOAuthToken,
107035
+ status: bal?.status ?? bal?.accountStatus ?? ov?.status ?? null,
107036
+ hitReason
107037
+ });
107038
+ }
107039
+ evaluated.sort((a, b) => {
107040
+ const ad = a.remainingDays ?? Number.POSITIVE_INFINITY;
107041
+ const bd = b.remainingDays ?? Number.POSITIVE_INFINITY;
107042
+ return ad - bd;
107043
+ });
107044
+ const hitCount = evaluated.filter((x) => x.hitReason !== "none").length;
107045
+ return { items: evaluated, hitCount };
107046
+ }
107047
+
106991
107048
  // src/commands/balance-scan/run.ts
106992
107049
  async function runBalanceScan(opts) {
106993
107050
  let config = loadConfig(opts.token);
@@ -107093,48 +107150,19 @@ async function runBalanceScan(opts) {
107093
107150
  balanceMap = fetched.balanceMap;
107094
107151
  overviewMap = fetched.overviewMap;
107095
107152
  batchChunkSize = fetched.chunkSize;
107096
- process.stderr.write(`\u23F3 [balance-scan] \u4F59\u989D\u4E0E\u6D88\u8017\u5DF2\u9F50\uFF0C\u6B63\u5728\u6309\u9608\u503C\u7B5B\u9009\u2026
107153
+ process.stderr.write(`\u23F3 [balance-scan] \u4F59\u989D\u4E0E\u6D88\u8017\u5DF2\u9F50\uFF0C\u6B63\u5728\u6C47\u603B\u5168\u90E8\u5DF2\u68C0\u67E5\u8D26\u6237\u2026
107097
107154
  `);
107098
107155
  }
107099
- const evaluated = [];
107100
- for (const item of allItems) {
107101
- const ma = item.ma;
107102
- const id = ma?.mediaCustomerId ? String(ma.mediaCustomerId) : "";
107103
- if (!id) continue;
107104
- const bal = balanceMap.get(id);
107105
- const ov = overviewMap.get(id);
107106
- const balance = bal?.remainingAccountBudget ?? null;
107107
- const windowSpend = Number(ov?.spend ?? 0);
107108
- const dailySpend = windowSpend > 0 ? windowSpend / spendDays : 0;
107109
- let remainingDays = null;
107110
- let recommendedTopup = null;
107111
- if (dailySpend >= minDailySpend && balance !== null) {
107112
- remainingDays = +(balance / dailySpend).toFixed(1);
107113
- const needed = dailySpend * targetDays - balance;
107114
- recommendedTopup = needed > 0 ? +needed.toFixed(2) : 0;
107115
- }
107116
- const lowDays = remainingDays !== null && remainingDays <= thresholdDays;
107117
- const lowBalance = minBalance !== null && balance !== null && balance <= minBalance;
107118
- if (!lowDays && !lowBalance && !isSubset) continue;
107119
- const hitReason = lowDays && lowBalance ? "both" : lowDays ? "low-days" : lowBalance ? "low-balance" : "none";
107120
- evaluated.push({
107121
- mediaCustomerId: id,
107122
- name: ma.mediaCustomerName ?? bal?.name ?? ov?.mediaCustomerName ?? null,
107123
- advertiserName: item.mag?.advertiserName ?? null,
107124
- currencyCode: bal?.currencyCode ?? ma.currencyCode ?? ov?.currencyCode ?? null,
107125
- balance,
107126
- dailySpend: dailySpend > 0 ? +dailySpend.toFixed(2) : null,
107127
- remainingDays,
107128
- recommendedTopup,
107129
- invalidOAuthToken: !!ma.invalidOAuthToken,
107130
- status: bal?.status ?? bal?.accountStatus ?? ov?.status ?? null,
107131
- hitReason
107132
- });
107133
- }
107134
- evaluated.sort((a, b) => {
107135
- const ad = a.remainingDays ?? Number.POSITIVE_INFINITY;
107136
- const bd = b.remainingDays ?? Number.POSITIVE_INFINITY;
107137
- return ad - bd;
107156
+ const { items: evaluated, hitCount } = evaluateBalanceScanAccounts({
107157
+ items: allItems,
107158
+ balanceMap,
107159
+ overviewMap,
107160
+ spendDays,
107161
+ thresholdDays,
107162
+ minBalance,
107163
+ minDailySpend,
107164
+ targetDays,
107165
+ includeInvalidOAuth: isSubset
107138
107166
  });
107139
107167
  const balancesForHealth = validIds.map((id) => balanceMap.get(id)?.remainingAccountBudget);
107140
107168
  const dataIssue = assessBalanceScanDataHealth({
@@ -107148,7 +107176,7 @@ async function runBalanceScan(opts) {
107148
107176
  scannedAccounts: allItems.length,
107149
107177
  validAccounts: validIds.length,
107150
107178
  skippedInvalidOAuth: allItems.length - validIds.length,
107151
- hitCount: evaluated.length,
107179
+ hitCount,
107152
107180
  nullBalanceCount: balancesForHealth.filter((b) => b == null).length,
107153
107181
  dataIssue: dataIssue?.code ?? null,
107154
107182
  dataIssueMessage: dataIssue?.message ?? null,
@@ -107188,22 +107216,23 @@ async function runBalanceScan(opts) {
107188
107216
  if (wroteJson) {
107189
107217
  return;
107190
107218
  }
107219
+ const thresholdHint = `\u9608\u503C\uFF1A\u7EED\u822A \u2264 ${thresholdDays} \u5929` + (minBalance !== null ? ` \u6216 \u4F59\u989D \u2264 ${minBalance}` : "");
107191
107220
  if (isSubset) {
107192
107221
  console.log(
107193
107222
  `
107194
107223
  ${media} \u8D26\u6237\u4F59\u989D\u753B\u50CF\uFF08\u5B50\u96C6\u6A21\u5F0F\uFF0C-a \u6307\u5B9A ${filterIds.length} \u4E2A\u8D26\u6237\uFF0C\u5168\u90E8\u5C55\u793A\uFF09
107195
- \u9608\u503C\u53C2\u8003\uFF1A\u7EED\u822A \u2264 ${thresholdDays} \u5929` + (minBalance !== null ? ` \u6216 \u4F59\u989D \u2264 ${minBalance}` : "") + `
107224
+ \u5DF2\u68C0\u67E5 ${evaluated.length} \u6237\uFF0C\u5176\u4E2D\u9884\u8B66\u547D\u4E2D ${hitCount} \u4E2A\uFF08${thresholdHint}\uFF09
107196
107225
  `
107197
107226
  );
107198
107227
  } else {
107199
107228
  console.log(
107200
107229
  `
107201
- ${media} \u8D26\u6237\u4F59\u989D\u626B\u63CF\u5B8C\u6210\uFF1A\u5171\u626B\u63CF ${meta.scannedAccounts} \u4E2A\u8D26\u6237\uFF08\u6709\u6548 ${meta.validAccounts}\uFF09\uFF0C\u547D\u4E2D ${meta.hitCount} \u4E2A\uFF08\u9608\u503C\uFF1A\u7EED\u822A \u2264 ${thresholdDays} \u5929` + (minBalance !== null ? ` \u6216 \u4F59\u989D \u2264 ${minBalance}` : "") + `\uFF09
107230
+ ${media} \u8D26\u6237\u4F59\u989D\u626B\u63CF\u5B8C\u6210\uFF1A\u5171\u626B\u63CF ${meta.scannedAccounts} \u4E2A\u8D26\u6237\uFF08\u6709\u6548 ${meta.validAccounts}\uFF09\uFF0C\u8FD4\u56DE\u5DF2\u68C0\u67E5 ${evaluated.length} \u6237\uFF0C\u5176\u4E2D\u9884\u8B66\u547D\u4E2D ${hitCount} \u4E2A\uFF08${thresholdHint}\uFF09
107202
107231
  `
107203
107232
  );
107204
107233
  }
107205
107234
  if (evaluated.length === 0) {
107206
- console.log(" \u2705 \u65E0\u547D\u4E2D\u8D26\u6237\uFF08\u9608\u503C\u5185\u65E0\u9884\u8B66\uFF1B\u6570\u636E\u5DF2\u6B63\u5E38\u8FD4\u56DE\uFF09\u3002\n");
107235
+ console.log(" \u2705 \u6CA1\u6709\u53EF\u5C55\u793A\u7684\u5DF2\u68C0\u67E5\u8D26\u6237\uFF08\u6570\u636E\u5DF2\u6B63\u5E38\u8FD4\u56DE\uFF09\u3002\n");
107207
107236
  return;
107208
107237
  }
107209
107238
  const cols = [
@@ -107217,7 +107246,7 @@ ${media} \u8D26\u6237\u4F59\u989D\u626B\u63CF\u5B8C\u6210\uFF1A\u5171\u626B\u63C
107217
107246
  { key: "reason", header: "\u547D\u4E2D\u539F\u56E0" }
107218
107247
  ];
107219
107248
  const reasonText = {
107220
- none: "\u2014\uFF08\u5B50\u96C6\u5C55\u793A\uFF0C\u672A\u89E6\u9608\u503C\uFF09",
107249
+ none: "\u2014\uFF08\u672A\u89E6\u9608\u503C\uFF09",
107221
107250
  "low-days": `\u7EED\u822A \u2264 ${thresholdDays} \u5929`,
107222
107251
  "low-balance": `\u4F59\u989D \u2264 ${minBalance ?? 0}`,
107223
107252
  both: `\u7EED\u822A + \u4F59\u989D\u53CC\u4F4E`
@@ -107235,7 +107264,7 @@ ${media} \u8D26\u6237\u4F59\u989D\u626B\u63CF\u5B8C\u6210\uFF1A\u5171\u626B\u63C
107235
107264
  printCliTable(rows, cols);
107236
107265
  console.log(
107237
107266
  `
107238
- \u63D0\u793A\uFF1A\u4E0A\u8868\u5DF2\u6309\u5269\u4F59\u5929\u6570\u5347\u5E8F\u6392\u5E8F\u3002
107267
+ \u63D0\u793A\uFF1A\u4E0A\u8868\u4E3A\u5168\u90E8\u5DF2\u68C0\u67E5\u8D26\u6237\uFF0C\u6309\u5269\u4F59\u5929\u6570\u5347\u5E8F\uFF1B\u9884\u8B66\u770B\u300C\u547D\u4E2D\u539F\u56E0\u300D\u5217\uFF08JSON \u7528 hitReason !== "none"\uFF09\u3002
107239
107268
  - \u5982\u9700\u8C03\u6574\u9608\u503C\uFF1A--threshold-days 14 / --min-balance 500
107240
107269
  - \u5982\u9700\u8C03\u6574\u65E5\u5747\u56DE\u770B\u5929\u6570\uFF1A--spend-days 3
107241
107270
  - \u5982\u9700\u8C03\u6574\u5EFA\u8BAE\u5145\u503C\u76EE\u6807\u7EED\u822A\uFF1A--target-days 60
@@ -107247,13 +107276,13 @@ ${media} \u8D26\u6237\u4F59\u989D\u626B\u63CF\u5B8C\u6210\uFF1A\u5171\u626B\u63C
107247
107276
  // src/commands/balance-scan/_register.ts
107248
107277
  function register9(program2) {
107249
107278
  program2.command("balance-scan").description(
107250
- "\u4E00\u952E\u626B\u63CF\u67D0\u5A92\u4F53\u4E0B\u6240\u6709\u8D26\u6237\u7684\u4F59\u989D\uFF0C\u7B5B\u51FA\u7EED\u822A\u5929\u6570\u4E0D\u8DB3\u7684\u8D26\u6237\u3002\u66FF\u4EE3\u5FAA\u73AF\u8C03\u7528 balance \u7684\u4F20\u7EDF\u505A\u6CD5\uFF0C\u5178\u578B\u573A\u666F\uFF1A\u300C\u5E2E\u6211\u627E\u51FA 117 \u4E2A Bing \u8D26\u6237\u91CC\u4F59\u989D\u4E0D\u8DB3 7 \u5929\u7684\u300D\u3002"
107279
+ "\u4E00\u952E\u626B\u63CF\u67D0\u5A92\u4F53\u4E0B\u6709\u6548\u8D26\u6237\u7684\u4F59\u989D\u4E0E\u65E5\u5747\u6D88\u8017\uFF0C\u8FD4\u56DE\u5168\u90E8\u5DF2\u68C0\u67E5\u8D26\u6237\uFF1B\u7528 hitReason \u6807\u8BB0\u7EED\u822A/\u4F59\u989D\u4E0D\u8DB3\u7684\u9884\u8B66\u884C\u3002\u66FF\u4EE3\u5FAA\u73AF\u8C03\u7528 balance \u7684\u4F20\u7EDF\u505A\u6CD5\u3002"
107251
107280
  ).requiredOption(
107252
107281
  "-m, --media <type>",
107253
107282
  "\u5A92\u4F53\u7C7B\u578B\uFF1AGoogle | TikTok | Yandex | MetaAd | BingV2 | Kwai"
107254
107283
  ).option(
107255
107284
  "-a, --accounts <ids>",
107256
- "\u6307\u5B9A mediaCustomerId\uFF08\u9017\u53F7\u5206\u9694\uFF09\uFF1B\u8DF3\u8FC7\u6E05\u5355\u7FFB\u9875\uFF0C\u62C9\u53D6\u540E\u5168\u90E8\u8F93\u51FA\uFF08\u4E0D\u6309\u9608\u503C\u8FC7\u6EE4\uFF09"
107285
+ "\u6307\u5B9A mediaCustomerId\uFF08\u9017\u53F7\u5206\u9694\uFF09\uFF1B\u8DF3\u8FC7\u6E05\u5355\u7FFB\u9875\uFF0C\u5BF9\u8FD9\u4E9B ID \u62C9\u4F59\u989D+\u6D88\u8017\u540E\u5168\u90E8\u8F93\u51FA"
107257
107286
  ).option("--threshold-days <n>", "\u5269\u4F59\u7EED\u822A\u5929\u6570\u9608\u503C\uFF08\u9ED8\u8BA4 7\uFF09", (v) => parseFloat(v)).option(
107258
107287
  "--spend-days <n>",
107259
107288
  "\u65E5\u5747\u6D88\u8017\u56DE\u770B\u81EA\u7136\u65E5\u6570\uFF08\u622A\u81F3\u6628\u5929\u4E0D\u542B\u4ECA\u5929\uFF1B\u9ED8\u8BA4 7\uFF1B\u65E5\u5747=\u7A97\u53E3\u5408\u8BA1/\u5929\u6570\uFF09",
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.45-beta.1",
4
- "publishedAt": 1786589434004
3
+ "version": "1.1.45-beta.2",
4
+ "publishedAt": 1786612533558
5
5
  }
@@ -11,7 +11,7 @@
11
11
 
12
12
  ## balance-scan — 多账户余额续航扫描
13
13
 
14
- 一键扫描某媒体下账户余额,筛出续航天数不足的账户。**P2 必用**;**禁止**外层循环逐户 `balance`。
14
+ 一键扫描某媒体下**全部有效账户**的余额与日均消耗。`data.items` 返回**所有已检查账户**(不只预警行);用 `hitReason` 标记续航/余额不足。**P2 必用**;**禁止**外层循环逐户 `balance`。
15
15
 
16
16
  > **数据异常(exit 2)**:无账户 / 全部 OAuth 失效 / **余额全为 null** 时 CLI 退出码 **2**,`--json-out` 的 `ok=false` 且 `meta.dataIssue` 为 `no_accounts` | `all_oauth_invalid` | `all_balances_null`。须向用户说明原因,**禁止**当成「无预警命中」。可试 `--refresh-dp` / `login` / `--verbose`。
17
17
 
@@ -22,7 +22,7 @@ siluzan-tso balance-scan -m <媒体类型> [选项]
22
22
  | 选项 | 说明 | 默认 |
23
23
  | ------------------------------------- | ------------------------------------------------------------------------------------ | ------------ |
24
24
  | `-m, --media <type>` | 必填:`Google \| TikTok \| Yandex \| MetaAd \| BingV2 \| Kwai` | — |
25
- | `-a, --accounts <ids>` | 指定 `mediaCustomerId`(逗号分隔);**跳过清单翻页**,拉取后全部输出(不按阈值过滤) | — |
25
+ | `-a, --accounts <ids>` | 指定 `mediaCustomerId`(逗号分隔);**跳过清单翻页**,对这些 ID 拉数后全部输出 | — |
26
26
  | `--threshold-days <n>` | 剩余续航天数阈值 | `7` |
27
27
  | `--spend-days <n>` | 日均消耗回看自然日数(截至昨天不含今天;日均 = 窗口合计 / N) | `7` |
28
28
  | `--min-balance <n>` | 绝对余额阈值(与 threshold 取并集) | — |
@@ -47,7 +47,7 @@ siluzan-tso balance-scan -m BingV2 -a id1,id2,id3 --json-out ./snap-p2-subset
47
47
  siluzan-tso balance-scan -m MetaAd --json-out ./snap-p2-meta
48
48
  ```
49
49
 
50
- **读盘要点**:先看 `meta.dataIssue`(非空则失败);再按 `remainingDays` 升序交付;`hitReason="none"` 表示未触阈值;用 **`dailySpend`** 做日均(口径见 `meta.spendDays` / `meta.spendWindow`),勿把 `stats` 区间合计 `spend` 当「每天消耗」。与 `balance` / `accounts-digest` 分工见 `references/core/agent-conventions.md` §八。
50
+ **读盘要点**:先看 `meta.dataIssue`(非空则失败)。`data.items` = **全部已检查账户**(OAuth 失效户不在 items,见 `meta.skippedInvalidOAuth`);`meta.hitCount` = 触阈值条数。预警筛 `hitReason !== "none"`;`hitReason="none"` 表示已检查但未触阈值。按 `remainingDays` 升序交付。用 **`dailySpend`** 做日均(口径见 `meta.spendDays` / `meta.spendWindow`),勿把 `stats` 区间合计 `spend` 当「每天消耗」。与 `balance` / `accounts-digest` 分工见 `references/core/agent-conventions.md` §八。
51
51
 
52
52
  ---
53
53
 
@@ -43,7 +43,7 @@
43
43
  - **步骤**:
44
44
  1. 全量巡检:`balance-scan -m <媒体> --threshold-days 7 --json-out ./snap-p2`(可选 `--min-balance 100` / `--target-days 60`)。
45
45
  2. 已知子集:`balance-scan -m <媒体> -a id1,id2,id3 --json-out ./snap-p2-subset`(跳过翻页)。
46
- - **产物**:按 `remainingDays` 升序;`hitReason="none"` 表示未触阈值;消耗过低的僵尸账户不纳入预警。**禁止**逐账户 `balance`。
46
+ - **产物**:`data.items` 为全部已检查账户(按 `remainingDays` 升序);预警筛 `hitReason !== "none"`;`hitReason="none"` 表示未触阈值;消耗过低的僵尸账户 `remainingDays` 为 null、不纳入预警。**禁止**逐账户 `balance`。
47
47
 
48
48
  ---
49
49
 
@@ -25,7 +25,7 @@ siluzan-tso balance-scan -m Google [--threshold-days <n>] [--min-balance <n>] [-
25
25
  | 近 7 日估算日均消耗 | **`data.items[].dailySpend`** = 近 7 日总消耗 / 7(窗口为 **[T-7, T-1]**,即截至昨天的 7 个自然日,**不含当天**,避免拉到当天未结算数据) |
26
26
  | 按余额÷日均估算的续航天数 | **`data.items[].remainingDays`** = `balance / dailySpend`(消耗过低 < `minDailySpend` 时为 `null`) |
27
27
  | 建议充值额(按 `meta.thresholds.targetDaysForTopup` 目标) | **`data.items[].recommendedTopup`** |
28
- | 命中原因(阈值逻辑) | **`data.items[].hitReason`**:`low-days` \| `low-balance` \| `both` |
28
+ | 命中原因(阈值逻辑) | **`data.items[].hitReason`**:`low-days` \| `low-balance` \| `both` \| `none`(已检查但未触阈值)。`data.items` 含全部已检查账户;预警筛 `hitReason !== "none"`。`meta.hitCount` 为触阈值条数 |
29
29
  | 币种 / 状态 / OAuth | `data.items[].currencyCode`、`data.items[].status`、`data.items[].invalidOAuthToken` |
30
30
  | 本轮扫描元数据 | **`meta`**:`scannedAccounts`、`validAccounts`、`hitCount`、`thresholds`(含 `days`、`minBalance`、`minDailySpend`、`targetDaysForTopup`)、`generatedAt` 等 |
31
31
 
@@ -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.45-beta.1'
12
+ $PKG_VERSION = '1.1.45-beta.2'
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.45-beta.1"
12
+ readonly PKG_VERSION="1.1.45-beta.2"
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.45-beta.1",
3
+ "version": "1.1.45-beta.2",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",