siluzan-tso-cli 1.1.47-beta.3 → 1.1.47

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
@@ -43,7 +43,7 @@ HTML 报告模板外部资源:**ECharts** 统一使用 `https://staticpn.siluz
43
43
  在**用户的目标项目根目录**执行(根据用户使用的助手选择 `--ai`):
44
44
 
45
45
  ```bash
46
- npm install -g siluzan-tso-cli@beta
46
+ npm install -g siluzan-tso-cli
47
47
  siluzan-tso init --ai cursor # 写入 Cursor(默认)
48
48
  siluzan-tso init --ai cursor,claude # 同时写入多个平台
49
49
  siluzan-tso init --ai all # 写入所有支持的平台
@@ -51,7 +51,6 @@ siluzan-tso init -d /path/to/skills # 写入自定义目录
51
51
  siluzan-tso init --force # 强制覆盖已存在文件
52
52
  ```
53
53
 
54
- > **注意**:当前为测试版(1.1.47-beta.3),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
54
 
56
55
  | 助手 | 建议 `--ai` |
57
56
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -4026,7 +4026,7 @@ var DEFAULT_API_BASE;
4026
4026
  var init_defaults = __esm({
4027
4027
  "src/config/defaults.ts"() {
4028
4028
  "use strict";
4029
- DEFAULT_API_BASE = "https://tso-api-ci.siluzan.com";
4029
+ DEFAULT_API_BASE = "https://tso-api.siluzan.com";
4030
4030
  }
4031
4031
  });
4032
4032
 
@@ -5964,6 +5964,23 @@ var init_strip_legacy_google_fields = __esm({
5964
5964
  }
5965
5965
  });
5966
5966
 
5967
+ // src/utils/bid-modifier-display.ts
5968
+ function formatBidModifierPercent(multiplier, specified) {
5969
+ if (multiplier === 0 && specified !== true) {
5970
+ return GOOGLE_ADS_UNSET_BID_DISPLAY;
5971
+ }
5972
+ const pct2 = Math.round((multiplier - 1) * 1e3) / 10;
5973
+ if (pct2 === 0) return "0%";
5974
+ return pct2 > 0 ? `+${pct2}%` : `${pct2}%`;
5975
+ }
5976
+ var GOOGLE_ADS_UNSET_BID_DISPLAY;
5977
+ var init_bid_modifier_display = __esm({
5978
+ "src/utils/bid-modifier-display.ts"() {
5979
+ "use strict";
5980
+ GOOGLE_ADS_UNSET_BID_DISPLAY = "\u2014";
5981
+ }
5982
+ });
5983
+
5967
5984
  // src/utils/google-analysis-snapshot.ts
5968
5985
  var init_google_analysis_snapshot = __esm({
5969
5986
  "src/utils/google-analysis-snapshot.ts"() {
@@ -102027,18 +102044,22 @@ function deviceBidModifierLookupKey(campaignId, adGroupId, deviceType) {
102027
102044
  function mergeDeviceBidModifiersIntoReport(report, modifiers) {
102028
102045
  const rows = report.devices;
102029
102046
  if (!Array.isArray(rows) || rows.length === 0) return report;
102030
- if (!Array.isArray(modifiers) || modifiers.length === 0) return report;
102031
102047
  const byKey = /* @__PURE__ */ new Map();
102032
- for (const m of modifiers) {
102033
- byKey.set(deviceBidModifierLookupKey(m.campaignId, m.adGroupId, m.deviceType), m);
102048
+ if (Array.isArray(modifiers)) {
102049
+ for (const m of modifiers) {
102050
+ byKey.set(deviceBidModifierLookupKey(m.campaignId, m.adGroupId, m.deviceType), m);
102051
+ }
102034
102052
  }
102035
102053
  const devices = rows.map((row) => {
102036
102054
  const hit = byKey.get(deviceBidModifierLookupKey(row.campaignId, row.adGroupId, row.deviceType)) ?? (row.adGroupId ? void 0 : byKey.get(deviceBidModifierLookupKey(row.campaignId, null, row.deviceType)));
102037
- if (!hit || hit.bidModifier === void 0) return row;
102055
+ if (!hit || hit.bidModifier === void 0) {
102056
+ return { ...row, bidModifierDisplay: GOOGLE_ADS_UNSET_BID_DISPLAY };
102057
+ }
102038
102058
  return {
102039
102059
  ...row,
102040
102060
  bidModifier: hit.bidModifier,
102041
- bidModifierSpecified: hit.bidModifierSpecified
102061
+ bidModifierSpecified: hit.bidModifierSpecified,
102062
+ bidModifierDisplay: formatBidModifierPercent(hit.bidModifier, hit.bidModifierSpecified)
102042
102063
  };
102043
102064
  });
102044
102065
  return { ...report, devices };
@@ -102285,6 +102306,7 @@ var init_fetch = __esm({
102285
102306
  "src/commands/google-analysis/fetch.ts"() {
102286
102307
  "use strict";
102287
102308
  init_auth();
102309
+ init_bid_modifier_display();
102288
102310
  init_strip_legacy_google_fields();
102289
102311
  init_http_retry();
102290
102312
  init_sections();
@@ -115315,11 +115337,8 @@ init_strip_legacy_google_fields();
115315
115337
  // src/commands/ad/device-bid.ts
115316
115338
  init_auth();
115317
115339
  init_cli_json_snapshot();
115318
- function formatBidModifierPercent(multiplier) {
115319
- const pct2 = Math.round((multiplier - 1) * 1e3) / 10;
115320
- if (pct2 === 0) return "0%";
115321
- return pct2 > 0 ? `+${pct2}%` : `${pct2}%`;
115322
- }
115340
+ init_bid_modifier_display();
115341
+ init_bid_modifier_display();
115323
115342
  function multiplierToAdGroupBidPercent(multiplier) {
115324
115343
  return Math.round((multiplier - 1) * 100 * 100) / 100;
115325
115344
  }
@@ -115418,7 +115437,7 @@ async function runAdDeviceBidList(opts) {
115418
115437
  campaignName: row.campaignName,
115419
115438
  deviceType: row.deviceType,
115420
115439
  bidModifier: row.bidModifier,
115421
- bidModifierDisplay: row.bidModifier != null ? formatBidModifierPercent(row.bidModifier) : void 0,
115440
+ bidModifierDisplay: row.bidModifier != null ? formatBidModifierPercent(row.bidModifier, row.bidModifierSpecified) : GOOGLE_ADS_UNSET_BID_DISPLAY,
115422
115441
  bidModifierSpecified: row.bidModifierSpecified
115423
115442
  }));
115424
115443
  levelLabel = opts.campaignId ? `\u7CFB\u5217 ${opts.campaignId}` : "\u8D26\u6237\u4E0B\u5168\u90E8\u7CFB\u5217";
@@ -115516,7 +115535,7 @@ async function runAdDeviceBidSet(opts) {
115516
115535
  }
115517
115536
  console.log(
115518
115537
  `
115519
- \u2705 \u5DF2\u66F4\u65B0\u5E7F\u544A\u7EC4\u8BBE\u5907\u51FA\u4EF7\uFF08\u7CFB\u5217 ${opts.campaignId} / \u7EC4 ${opts.adGroupId} / id ${criterionId2} / ${deviceType ?? "?"} \u2192 ${formatBidModifierPercent(opts.bidModifier)}\uFF09
115538
+ \u2705 \u5DF2\u66F4\u65B0\u5E7F\u544A\u7EC4\u8BBE\u5907\u51FA\u4EF7\uFF08\u7CFB\u5217 ${opts.campaignId} / \u7EC4 ${opts.adGroupId} / id ${criterionId2} / ${deviceType ?? "?"} \u2192 ${formatBidModifierPercent(opts.bidModifier, true)}\uFF09
115520
115539
  `
115521
115540
  );
115522
115541
  return;
@@ -115552,7 +115571,7 @@ async function runAdDeviceBidSet(opts) {
115552
115571
  const deviceLabel = opts.deviceType ? normalizeDeviceType(opts.deviceType) : "\u8BBE\u5907";
115553
115572
  console.log(
115554
115573
  `
115555
- \u2705 \u5DF2\u66F4\u65B0\u7CFB\u5217\u8BBE\u5907\u51FA\u4EF7\uFF08\u7CFB\u5217 ${opts.campaignId} / ${deviceLabel} / id ${criterionId} \u2192 \u500D\u7387 ${opts.bidModifier}\uFF0C${formatBidModifierPercent(opts.bidModifier)}\uFF09
115574
+ \u2705 \u5DF2\u66F4\u65B0\u7CFB\u5217\u8BBE\u5907\u51FA\u4EF7\uFF08\u7CFB\u5217 ${opts.campaignId} / ${deviceLabel} / id ${criterionId} \u2192 \u500D\u7387 ${opts.bidModifier}\uFF0C${formatBidModifierPercent(opts.bidModifier, true)}\uFF09
115556
115575
  `
115557
115576
  );
115558
115577
  }
@@ -115867,7 +115886,7 @@ async function runAdGeoList(opts) {
115867
115886
  item["name"] ?? item["countryOrRegion"] ?? item["country"] ?? item["location"] ?? item["canonicalName"] ?? ""
115868
115887
  );
115869
115888
  const campaign = item["campaignName"] ? ` campaign:${item["campaignName"]}` : "";
115870
- const bid = item["bidModifier"] != null && typeof item["bidModifier"] === "number" ? ` \u51FA\u4EF7\u8C03\u6574:${formatBidModifierPercent(item["bidModifier"])}` : item["bidModifier"] != null ? ` \u51FA\u4EF7\u8C03\u6574:${item["bidModifier"]}` : "";
115889
+ const bid = item["bidModifier"] != null && typeof item["bidModifier"] === "number" ? ` \u51FA\u4EF7\u8C03\u6574:${formatBidModifierPercent(item["bidModifier"], item["bidModifierSpecified"])}` : item["bidModifier"] != null ? ` \u51FA\u4EF7\u8C03\u6574:${item["bidModifier"]}` : "";
115871
115890
  const spend = item["spend"] != null ? ` \u6D88\u8017:${item["spend"]}` : "";
115872
115891
  const clicks = item["clicks"] != null ? ` \u70B9\u51FB:${item["clicks"]}` : "";
115873
115892
  console.log(` id:${id} ${name2}${campaign}${bid}${spend}${clicks}`);
@@ -115997,7 +116016,7 @@ async function runAdGeoSetBid(opts) {
115997
116016
  );
115998
116017
  console.log(
115999
116018
  `
116000
- \u2705 \u5DF2\u66F4\u65B0\u5730\u7406\u4F4D\u7F6E\u51FA\u4EF7\uFF08\u7CFB\u5217 ${opts.campaignId} / ${name2} / id ${criterionId} \u2192 \u500D\u7387 ${opts.bidModifier}\uFF0C${formatBidModifierPercent(opts.bidModifier)}\uFF09
116019
+ \u2705 \u5DF2\u66F4\u65B0\u5730\u7406\u4F4D\u7F6E\u51FA\u4EF7\uFF08\u7CFB\u5217 ${opts.campaignId} / ${name2} / id ${criterionId} \u2192 \u500D\u7387 ${opts.bidModifier}\uFF0C${formatBidModifierPercent(opts.bidModifier, true)}\uFF09
116001
116020
  `
116002
116021
  );
116003
116022
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.47-beta.3",
4
- "publishedAt": 1787282369500
3
+ "version": "1.1.47",
4
+ "publishedAt": 1787306827872
5
5
  }
@@ -167,7 +167,7 @@ siluzan-tso account-history --start 2026-03-01 --end 2026-03-31 --json-out ./sna
167
167
  | 状态 | 含义 | 下一步操作 |
168
168
  | ---------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
169
169
  | `Pending` | 审核中 | 等待,可反复运行此命令轮询;审核周期因媒体而异 |
170
- | `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google`;Kwai、Yandex 当前没有对应充值界面) |
170
+ | `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google`;Kwai、Yandex 当前没有对应充值界面) |
171
171
  | `Rejected` | 被拒 | 查看 `--json-out` 落盘中的 `reason` 字段了解拒绝原因;修改资料后重新提交;若原因不明,引导用户联系丝路赞客服 |
172
172
 
173
173
  ---
@@ -490,7 +490,7 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
490
490
 
491
491
  | 功能 | 媒体 | 网页路径 |
492
492
  | --------------------------------------- | ------ | ------------------------------------------------- |
493
- | **账户激活**(邀请他人激活 / 充值激活) | Google | `https://www-ci.siluzan.com/v3/foreign_trade/tso/manageAccounts` |
493
+ | **账户激活**(邀请他人激活 / 充值激活) | Google | `https://www.siluzan.com/v3/foreign_trade/tso/manageAccounts` |
494
494
 
495
495
  **Agent 建议话术**:
496
496
 
@@ -499,5 +499,5 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
499
499
  siluzan-tso config show # 查看 webUrl 字段
500
500
 
501
501
  # 账户激活(Google)→ 引导至账户管理页
502
- # https://www-ci.siluzan.com/v3/foreign_trade/tso/manageAccounts
502
+ # https://www.siluzan.com/v3/foreign_trade/tso/manageAccounts
503
503
  ```
@@ -126,7 +126,7 @@ siluzan-tso config show
126
126
 
127
127
  ### 充值页链接(按媒体 × 类型)
128
128
 
129
- 链接模式:`https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/<page>?mediaType=<mediaType>`;丝路赞钱包:`https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/siluzanWallet`(无媒体参数)。
129
+ 链接模式:`https://www.siluzan.com/v3/foreign_trade/tso/recharge/<page>?mediaType=<mediaType>`;丝路赞钱包:`https://www.siluzan.com/v3/foreign_trade/tso/recharge/siluzanWallet`(无媒体参数)。
130
130
 
131
131
  | 充值类型 | `<page>` | 支持媒体(`mediaType` 参数) |
132
132
  | ------------------------- | --------------------- | ------------------------------------------- |
@@ -1,6 +1,6 @@
1
1
  # 各媒体开户
2
2
 
3
- > 网页链接:`https://www-ci.siluzan.com/v3/foreign_trade/tso/accountOpeningHistory?tso=%2Fv3umijs%2Ftso%2FaccountOpeningHistory`
3
+ > 网页链接:`https://www.siluzan.com/v3/foreign_trade/tso/accountOpeningHistory?tso=%2Fv3umijs%2Ftso%2FaccountOpeningHistory`
4
4
  > 多命令串联见 `references/core/workflows.md` § 流程一。
5
5
 
6
6
  ## Contents
@@ -65,7 +65,7 @@ siluzan-tso open-account google-wizard
65
65
 
66
66
  ```bash
67
67
  siluzan-tso account-history -m Google
68
- # 审核通过后:config show → https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
68
+ # 审核通过后:config show → https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
69
69
  ```
70
70
 
71
71
  ---
@@ -130,7 +130,7 @@ siluzan-tso google-analysis -a <id> --exclude materials,gold-account --json-out
130
130
  | `geo-matched` | 相符地理位置(Matched locations,`user_location_view`)账户级按国家/地区汇总 |
131
131
  | `campaign-geo` | 广告系列维度地理(可选 `--cost-greater` / `--click-greater` / `--conversions-greater` 与网关一致) |
132
132
  | `campaign-geo-matched` | 相符地理位置(Matched locations)系列级明细(可选同上阈值参数) |
133
- | `campaign-device` | 广告系列维度设备(行可含系列/组) |
133
+ | `campaign-device` | 广告系列维度设备(行可含系列/组)。出价调整展示用 `bidModifierDisplay`(对齐 Google 后台:未设置=`—`,`0.6`=`-40%`);`bidModifier` 仍是倍率,禁止自行换成正百分比 |
134
134
  | `audience` | 受众;可选 `--audience-type` |
135
135
  | `asset-images` | 图片素材 |
136
136
  | `videos` | 视频 |
@@ -1,6 +1,6 @@
1
1
  # rag:知识库检索(TSO 广告投放辅助)
2
2
 
3
- 知识库管理页面在 https://www-ci.siluzan.com/knowledge-base/
3
+ 知识库管理页面在 https://www.siluzan.com/knowledge-base/
4
4
 
5
5
  为 **广告投放、账户分析、拓词、诊断报告** 等 TSO 业务提供**企业已入库**的产品、行业、客户背景事实依据。
6
6
 
@@ -190,9 +190,9 @@ siluzan-tso report push receive-emails -m Google [--json-out ./snap]
190
190
 
191
191
  | 媒体 | 报告类型 | URL 模板 |
192
192
  | ------ | ---------------- | ----------------------------------------------------------- |
193
- | Google | 日报(Daily) | `https://www-ci.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
194
- | Google | 小时报(Hourly) | `https://www-ci.siluzan.com/media-report/hour/{entityId}?culture=zh-CN` |
195
- | TikTok | 日报 | `https://www-ci.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
193
+ | Google | 日报(Daily) | `https://www.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
194
+ | Google | 小时报(Hourly) | `https://www.siluzan.com/media-report/hour/{entityId}?culture=zh-CN` |
195
+ | TikTok | 日报 | `https://www.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
196
196
 
197
197
  `entityId` 来自 `siluzan-tso report list --json-out ./snap` 中每条记录的 `entityId` 字段。
198
198
 
@@ -205,8 +205,8 @@ siluzan-tso report list -m Google --json-out ./snap
205
205
 
206
206
  # 第二步:查看 webUrl
207
207
  siluzan-tso config show
208
- # webUrl: https://www-ci.siluzan.com
208
+ # webUrl: https://www.siluzan.com
209
209
 
210
210
  # 第三步:拼接链接(Google 日报)
211
- # https://www-ci.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
211
+ # https://www.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
212
212
  ```
@@ -10,7 +10,7 @@
10
10
  ## 安装 CLI
11
11
 
12
12
  ```bash
13
- npm install -g siluzan-tso-cli@beta
13
+ npm install -g siluzan-tso-cli
14
14
  ```
15
15
 
16
16
  ---
@@ -64,7 +64,7 @@ siluzan-tso config set --api-key <Key> # 或 config 直接写入
64
64
  siluzan-tso config set --token <Token> # 备用:设置 JWT Token
65
65
  ```
66
66
 
67
- API Key 获取入口:`https://www-ci.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
67
+ API Key 获取入口:`https://www.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
68
68
 
69
69
  ```bash
70
70
  # 第 1 步:让用户报出手机号后,立刻发码(命令立即返回,不会等待输入)
@@ -127,9 +127,9 @@ siluzan-tso config show
127
127
 
128
128
  ```
129
129
  构建环境 : production
130
- apiBaseUrl : https://tso-api-ci.siluzan.com
131
- googleApiUrl : https://googleapi-ci.mysiluzan.com
132
- webUrl : https://www-ci.siluzan.com
130
+ apiBaseUrl : https://tso-api.siluzan.com
131
+ googleApiUrl : https://googleapi.mysiluzan.com
132
+ webUrl : https://www.siluzan.com
133
133
  apiKey : abcd****1234
134
134
  ```
135
135
 
@@ -301,6 +301,6 @@ siluzan-tso ad geo remove -a <accountId> --campaign-id <id> --location-id <id>
301
301
 
302
302
  - `add`:写入 `PUT …/criterion/{account}` 时 CLI 会换算为后端百分比。
303
303
  - `set-bid`:直接设置出价系数;与 `ad device-bid set`(系列级)同口径。
304
- - `list` 返回的 `bidModifier` 为 Google **倍率**(如 `1.2` = +20%),不是百分比整数。
304
+ - `list` 返回的 `bidModifier` 为 Google **倍率**(如 `1.2` = +20%),不是百分比整数。未设置的 `0` 展示为 `—`(与 Google 后台一致),不要写成 `-100%`。
305
305
 
306
306
  ---
@@ -443,7 +443,17 @@ siluzan-tso ad extension delete -a <accountId> --id <extensionId>
443
443
  | `1.0` | 不调整 |
444
444
  | `0.8` | 降低 20% |
445
445
  | `1.2` | 提高 20% |
446
- | `0` | 排除该设备(-100%) |
446
+ | `0` | **写入**时排除该设备(-100%)。**列表**里网关常把「未设置」也填成 `0`,此时 Google 后台显示 `—`,不是 -100% |
447
+
448
+ **展示口径(与 Google Ads 后台「出价调整」列一致)**:`list` / `google-analysis --sections campaign-device` 已输出 `bidModifierDisplay`。写表格必须用这个字段,禁止把倍率当正百分比(不要把 `0.6` 写成 `40%`)。
449
+
450
+ | `bidModifier` | `bidModifierSpecified` | `bidModifierDisplay` |
451
+ | ------------- | ---------------------- | -------------------- |
452
+ | `0`(未设置) | 空 / `false` | `—` |
453
+ | `0`(明确排除) | `true` | `-100%` |
454
+ | `1.0` | — | `0%` |
455
+ | `0.6` | — | `-40%` |
456
+ | `1.1` | — | `+10%` |
447
457
 
448
458
  广告组级会在 CLI 内将倍率转为后端百分比:`(倍率 - 1) × 100`。
449
459
 
@@ -6,7 +6,7 @@
6
6
  siluzan-tso config show # 取 webUrl
7
7
  ```
8
8
 
9
- 首页地址:`https://www-ci.siluzan.com/v3/foreign_trade/tso/home`
9
+ 首页地址:`https://www.siluzan.com/v3/foreign_trade/tso/home`
10
10
 
11
11
  ---
12
12
 
@@ -25,7 +25,7 @@ siluzan-tso config show # 取 webUrl
25
25
 
26
26
  ## 推荐话术
27
27
 
28
- 1. **「和首页一样的总览」** → 打开 `https://www-ci.siluzan.com/v3/foreign_trade/tso/home`。
28
+ 1. **「和首页一样的总览」** → 打开 `https://www.siluzan.com/v3/foreign_trade/tso/home`。
29
29
  2. **「某个 Google 账户昨天花了多少」** → `list-accounts -m Google` + `stats -m Google -a <id>`。
30
30
  3. **「有待充值账户」** → 说明聚合数据在首页;CLI 可 `list-accounts` + `balance` 逐户排查,或引导充值页。
31
31
 
@@ -182,7 +182,7 @@ siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-ou
182
182
  | R1 | `设备报告` |
183
183
  | R2 | 统计区间 |
184
184
  | R3(A→M,13 列) | `设备` \| `级别` \| `广告系列` \| `出价调整` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `所有转化次数` \| `转化次数` \| `每次转化费用` \| `转化率` |
185
- | R4… | `campaign-device-*.json`(`devices[]`):`deviceType`→设备;`campaignName` / `adGroupName`→「广告系列」等;`allConversions`→「所有转化次数」;`conversions`→「转化次数」;`ctr` / `conversionRate` 直接写入;**出价调整**:bidModifier(0.5 表示降低 50%,1.1 表示提高 10%,在表格中分别为 -50%、+10%);**级别**列按运营约定(如填 `广告系列` 或 `账户`,全文一致) |
185
+ | R4… | `campaign-device-*.json`(`items[]`):`deviceType`→设备;`campaignName` / `adGroupName`→「广告系列」等;`allConversions`→「所有转化次数」;`conversions`→「转化次数」;`ctr` / `conversionRate` 直接写入;**出价调整**:写 `bidModifierDisplay`(与 Google 后台一致:未设置=`—`,`0.6`=`-40%`)。禁止把倍率当正百分比,禁止把未设置的 `0` 写成 `-100%`;**级别**列按运营约定(如填 `广告系列` 或 `账户`,全文一致) |
186
186
  | 表末「分析」 | **总结**:各设备(Mobile/Desktop/Tablet 等)消耗与转化占比、系列×设备高消耗组合、移动端 vs 桌面 CPA/CPC 差异。**建议**:设备出价系数调整或系列预算倾斜(须引用设备类型与表中费用/转化),1~3 条 |
187
187
 
188
188
  ---
@@ -182,7 +182,7 @@ siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-ou
182
182
  | R1 | `设备报告` |
183
183
  | R2 | 统计区间 |
184
184
  | R3(A→M,13 列) | `设备` \| `级别` \| `广告系列` \| `出价调整` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `所有转化次数` \| `转化次数` \| `每次转化费用` \| `转化率` |
185
- | R4… | `campaign-device-*.json`(`devices[]`):`deviceType`→设备;`campaignName` / `adGroupName`→「广告系列」等;`allConversions`→「所有转化次数」;`conversions`→「转化次数」;`ctr` / `conversionRate` 直接写入;**出价调整**:bidModifier(0.5 表示降低 50%,1.1 表示提高 10%,在表格中分别为 -50%、+10%);**级别**列按运营约定(如填 `广告系列` 或 `账户`,全文一致) |
185
+ | R4… | `campaign-device-*.json`(`items[]`):`deviceType`→设备;`campaignName` / `adGroupName`→「广告系列」等;`allConversions`→「所有转化次数」;`conversions`→「转化次数」;`ctr` / `conversionRate` 直接写入;**出价调整**:写 `bidModifierDisplay`(与 Google 后台一致:未设置=`—`,`0.6`=`-40%`)。禁止把倍率当正百分比,禁止把未设置的 `0` 写成 `-100%`;**级别**列按运营约定(如填 `广告系列` 或 `账户`,全文一致) |
186
186
  | 表末「分析」 | **总结**:各设备(Mobile/Desktop/Tablet 等)消耗与转化占比、系列×设备高消耗组合、移动端 vs 桌面 CPA/CPC 差异。**建议**:设备出价系数调整或系列预算倾斜(须引用设备类型与表中费用/转化),1~3 条 |
187
187
 
188
188
  ---
@@ -9,11 +9,11 @@ $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.47-beta.3'
12
+ $PKG_VERSION = '1.1.47'
13
13
  $CLI_BIN = 'siluzan-tso'
14
14
  $SKILL_LABEL = 'Siluzan TSO'
15
- $INSTALL_CMD = 'npm install -g siluzan-tso-cli@beta'
16
- $WEB_BASE = 'https://www-ci.siluzan.com'
15
+ $INSTALL_CMD = 'npm install -g siluzan-tso-cli'
16
+ $WEB_BASE = 'https://www.siluzan.com'
17
17
 
18
18
  # -- Constants ----------------------------------------------------------------
19
19
  $NODE_MAJOR_MIN = 18
@@ -9,11 +9,11 @@ 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.47-beta.3"
12
+ readonly PKG_VERSION="1.1.47"
13
13
  readonly CLI_BIN="siluzan-tso"
14
14
  readonly SKILL_LABEL="Siluzan TSO"
15
- readonly INSTALL_CMD="npm install -g siluzan-tso-cli@beta"
16
- readonly WEB_BASE="https://www-ci.siluzan.com"
15
+ readonly INSTALL_CMD="npm install -g siluzan-tso-cli"
16
+ readonly WEB_BASE="https://www.siluzan.com"
17
17
 
18
18
  # -- Constants ----------------------------------------------------------------
19
19
  readonly NODE_MAJOR_MIN=18
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-tso-cli",
3
- "version": "1.1.47-beta.3",
3
+ "version": "1.1.47",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",