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

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.
Files changed (143) hide show
  1. package/README.md +1 -2
  2. package/dist/index.js +209 -163
  3. package/dist/skill/AGENTS.md +16 -16
  4. package/dist/skill/_meta.json +2 -2
  5. package/dist/skill/assets/campaign-create-template.md +46 -46
  6. package/dist/skill/assets/market-analysis-rules.md +4 -4
  7. package/dist/skill/assets/pmax-create-template.md +17 -17
  8. package/dist/skill/assets/pmax-lead-form-template.md +12 -12
  9. package/dist/skill/assets/scripts/assemble-campaign-from-plan.mjs +3 -1
  10. package/dist/skill/references/README.md +31 -31
  11. package/dist/skill/references/accounts/accounts-balance-stats.md +38 -36
  12. package/dist/skill/references/accounts/accounts-list.md +21 -21
  13. package/dist/skill/references/accounts/accounts-permissions.md +29 -29
  14. package/dist/skill/references/accounts/accounts.md +9 -9
  15. package/dist/skill/references/accounts/finance.md +1 -2
  16. package/dist/skill/references/accounts/open-account-by-media.md +58 -59
  17. package/dist/skill/references/accounts/open-account-google-ui.md +19 -19
  18. package/dist/skill/references/analytics/account-analytics.md +33 -33
  19. package/dist/skill/references/analytics/google-analysis-batch.md +0 -1
  20. package/dist/skill/references/analytics/keyword-planner-workflows.md +15 -13
  21. package/dist/skill/references/analytics/market-analysis-guide.md +4 -1
  22. package/dist/skill/references/analytics/rag.md +8 -8
  23. package/dist/skill/references/analytics/reporting.md +5 -5
  24. package/dist/skill/references/analytics/website-diagnosis-guide.md +6 -6
  25. package/dist/skill/references/core/agent-conventions.md +54 -54
  26. package/dist/skill/references/core/intent-routing.md +107 -108
  27. package/dist/skill/references/core/setup.md +6 -5
  28. package/dist/skill/references/core/tips.md +0 -1
  29. package/dist/skill/references/core/workflows.md +15 -16
  30. package/dist/skill/references/google-ads/google-ads-campaign-plan.md +55 -55
  31. package/dist/skill/references/google-ads/google-ads-read.md +30 -12
  32. package/dist/skill/references/google-ads/google-ads-write.md +35 -18
  33. package/dist/skill/references/google-ads/google-ads.md +13 -14
  34. package/dist/skill/references/google-ads/rules/README.md +17 -17
  35. package/dist/skill/references/google-ads/rules/google-ads-account-audit.md +6 -8
  36. package/dist/skill/references/google-ads/rules/google-ads-compliance.md +5 -7
  37. package/dist/skill/references/google-ads/rules/google-ads-keyword-strategy.md +9 -9
  38. package/dist/skill/references/google-ads/rules/google-ads-launch-plan-template.md +16 -15
  39. package/dist/skill/references/google-ads/rules/google-ads-plan-source-fidelity.md +27 -27
  40. package/dist/skill/references/google-ads/rules/google-ads-pmax-launch-plan-template.md +41 -41
  41. package/dist/skill/references/misc/tso-home.md +2 -2
  42. package/dist/skill/references/operations/guard.md +24 -24
  43. package/dist/skill/references/operations/hosted-automation-self-control.md +15 -16
  44. package/dist/skill/references/operations/hosted-automation-user-catalog.md +18 -18
  45. package/dist/skill/references/report-templates/README.md +1 -1
  46. package/dist/skill/references/report-templates/bing-period-report.md +16 -16
  47. package/dist/skill/references/report-templates/google-ads-diagnosis.md +26 -23
  48. package/dist/skill/references/report-templates/google-inquiry-analysis.md +1 -1
  49. package/dist/skill/references/report-templates/google-period-report.md +5 -5
  50. package/dist/skill/references/report-templates/meta-account-diagnosis-report.md +2 -2
  51. package/dist/skill/references/report-templates/okki-weekly-google-client.md +0 -1
  52. package/dist/skill/references/report-templates/tiktok-period-report.md +6 -6
  53. package/dist/skill/report-templates/GoogleAdsDiagnosisReport.html +42 -13
  54. package/dist/skill/report-templates/README.md +1 -1
  55. package/dist/skill/report-templates/bing-period-report.html +10 -7
  56. package/dist/skill/report-templates/bing-period-report.md +16 -16
  57. package/dist/skill/report-templates/google-ads-diagnosis.md +26 -23
  58. package/dist/skill/report-templates/google-inquiry-analysis.md +1 -1
  59. package/dist/skill/report-templates/google-period-report.md +5 -5
  60. package/dist/skill/report-templates/meta-account-diagnosis-report.md +2 -2
  61. package/dist/skill/report-templates/okki-weekly-google-client.md +0 -1
  62. package/dist/skill/report-templates/tiktok-period-report.md +6 -6
  63. package/dist/skill/scripts/install.ps1 +3 -3
  64. package/dist/skill/scripts/install.sh +3 -3
  65. package/eval/cases/accounts-entityid-vs-mediaccustomerid.scenario.json +2 -14
  66. package/eval/cases/accounts-mcc-bind-inquiry.scenario.json +1 -3
  67. package/eval/cases/accounts-single-balance-not-bulk.scenario.json +3 -14
  68. package/eval/cases/budget-display-not-raw-micros.scenario.json +1 -8
  69. package/eval/cases/clue-meta-leads-json.scenario.json +2 -14
  70. package/eval/cases/clue-tiktok-leads-json.scenario.json +2 -11
  71. package/eval/cases/destructive-account-delink-needs-confirm.scenario.json +3 -9
  72. package/eval/cases/destructive-forewarning-delete-needs-confirm.scenario.json +3 -9
  73. package/eval/cases/destructive-invoice-apply-needs-confirm.scenario.json +3 -9
  74. package/eval/cases/facebook-analysis-google-section-aliases.scenario.json +2 -11
  75. package/eval/cases/facebook-analysis-not-google-keywords.scenario.json +3 -10
  76. package/eval/cases/facebook-analysis-period-default.scenario.json +2 -14
  77. package/eval/cases/finance-invoice-info-list.scenario.json +3 -11
  78. package/eval/cases/forewarning-list-google.scenario.json +3 -14
  79. package/eval/cases/google-ads-no-structural-without-confirm.scenario.json +2 -6
  80. package/eval/cases/google-analysis-keywords-route.scenario.json +2 -14
  81. package/eval/cases/guard-budget-circuit-all-google.scenario.json +2 -12
  82. package/eval/cases/guard-zero-conv-empty-spend.scenario.json +2 -12
  83. package/eval/cases/human-p1-multiturn.scenario.json +1 -5
  84. package/eval/cases/ir-p1-vs-p8-account-vs-url.scenario.json +5 -17
  85. package/eval/cases/ir-p3-cpa-monitor-not-p7.scenario.json +2 -19
  86. package/eval/cases/ir-p3-zero-inquiry-not-p7.scenario.json +3 -16
  87. package/eval/cases/ir-p4-period-not-diagnosis.scenario.json +3 -16
  88. package/eval/cases/ir-p8-meets-google-ads-requirements-with-url.scenario.json +3 -28
  89. package/eval/cases/ir-p8-network-diagnosis-with-url.scenario.json +3 -25
  90. package/eval/cases/ir-p8-website-monitor-report-with-url.scenario.json +3 -28
  91. package/eval/cases/ir-p8-website-test-report-no-url.scenario.json +3 -14
  92. package/eval/cases/ir-p9-industry-not-p8.scenario.json +3 -19
  93. package/eval/cases/ir-vague-report-clarify.scenario.json +3 -14
  94. package/eval/cases/ir-w3-vs-p8-from-website.scenario.json +2 -8
  95. package/eval/cases/ir-w5-keyword-planner-url-core-terms.scenario.json +2 -22
  96. package/eval/cases/meta-single-balance-not-bulk.scenario.json +3 -17
  97. package/eval/cases/no-legacy-json-flag.scenario.json +2 -6
  98. package/eval/cases/open-account-google-noninteractive.scenario.json +1 -3
  99. package/eval/cases/open-account-tiktok-license-file.scenario.json +1 -3
  100. package/eval/cases/optimize-list-by-account.scenario.json +3 -11
  101. package/eval/cases/p1-single-account-profile.scenario.json +1 -11
  102. package/eval/cases/p2-balance-scan-bulk.scenario.json +2 -9
  103. package/eval/cases/p3-accounts-digest.scenario.json +1 -5
  104. package/eval/cases/p3-cpa-scan-max-cpa.scenario.json +2 -14
  105. package/eval/cases/p4-fb-meta-period-report.scenario.json +2 -12
  106. package/eval/cases/p4-period-report-window.scenario.json +1 -8
  107. package/eval/cases/pmax-asset-group-create-with-bg.scenario.json +2 -13
  108. package/eval/cases/pmax-brand-edit-routing.scenario.json +3 -16
  109. package/eval/cases/pmax-edit-not-campaign-edit.scenario.json +2 -12
  110. package/eval/cases/pmax-enable-brand-guidelines.scenario.json +2 -12
  111. package/eval/cases/pmax-no-assets-update-brand-fields.scenario.json +3 -14
  112. package/eval/cases/rag-before-keyword-expand.scenario.json +1 -11
  113. package/eval/cases/rag-list-then-query.scenario.json +2 -14
  114. package/eval/cases/report-list-google.scenario.json +2 -11
  115. package/eval/cases/report-push-list-google.scenario.json +2 -11
  116. package/eval/cases/setup-login-or-env.scenario.json +1 -3
  117. package/eval/cases/setup-siluzan-data-permission-env.scenario.json +1 -3
  118. package/eval/cases/tiktok-bc-bind-inquiry.scenario.json +2 -6
  119. package/eval/cases/time-range-user-delegates-default.scenario.json +1 -8
  120. package/eval/cases/tips-json-out-filtering.scenario.json +1 -3
  121. package/eval/cases/tips-large-json-pagination.scenario.json +1 -3
  122. package/eval/cases/uj-ad-campaign-validate-before-create-stub.scenario.json +2 -11
  123. package/eval/cases/uj-ad-outdoor-campgear-search-plan.scenario.json +1 -3
  124. package/eval/cases/uj-ad-website-search-plan-table-format.scenario.json +1 -3
  125. package/eval/cases/uj-analytics-30d-pdf-campaign-device-geo.scenario.json +6 -18
  126. package/eval/cases/uj-analytics-compare-google-tiktok-last-month-roi.scenario.json +1 -8
  127. package/eval/cases/uj-analytics-ecommerce-industry-report.scenario.json +2 -14
  128. package/eval/cases/uj-analytics-google-weekly-trends-campaigns-keywords.scenario.json +2 -11
  129. package/eval/cases/uj-analytics-report-push-weekly-email.scenario.json +1 -3
  130. package/eval/cases/uj-finance-invoice-records-this-month.scenario.json +2 -11
  131. package/eval/cases/uj-life-newbie-siluzan-google-end-to-end.scenario.json +1 -4
  132. package/eval/cases/uj-ops-google-accounts-list-normal.scenario.json +2 -17
  133. package/eval/cases/uj-ops-google-yesterday-spend-conversions.scenario.json +2 -14
  134. package/eval/cases/uj-ops-pause-worst-adgroup-confirm.scenario.json +2 -6
  135. package/eval/cases/uj-ops-tiktok-leads-last-week.scenario.json +3 -17
  136. package/eval/cases/uj-patrol-cpc-spike-adgroups-over-15.scenario.json +1 -5
  137. package/eval/cases/uj-patrol-forewarning-create-daily-cap-3000.scenario.json +1 -3
  138. package/eval/cases/uj-patrol-forewarning-trigger-records.scenario.json +3 -17
  139. package/eval/cases/uj-patrol-google-balances-low.scenario.json +2 -11
  140. package/eval/cases/uj-roi-optimize-records-then-execute-cautiously.scenario.json +3 -14
  141. package/eval/cases/uj-roi-search-terms-add-negative-keywords.scenario.json +2 -14
  142. package/eval/cases/yandex-stats-use-porg-mediaccustomerid.scenario.json +3 -21
  143. package/package.json +1 -1
@@ -11,12 +11,12 @@
11
11
 
12
12
  ## 标准四步流程(默认 · 交付 HTML)
13
13
 
14
- | 步骤 | 执行者 | 动作 |
15
- | ---------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
16
- | **1. 拉数** | Agent 调 CLI | `google-analysis -a <id> --start <s> --end <e> --json-out ./snap-google --sections <见下方默认维度对应 CLI>` |
17
- | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),完成筛选、聚合、排序与洞察 |
14
+ | 步骤 | 执行者 | 动作 |
15
+ | ---------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
16
+ | **1. 拉数** | Agent 调 CLI | `google-analysis -a <id> --start <s> --end <e> --json-out ./snap-google --sections <见下方默认维度对应 CLI>` |
17
+ | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),完成筛选、聚合、排序与洞察 |
18
18
  | **3. 写 JSON** | Agent | 按 `assets/google-period-report.schema.json` 撰写 `google-period-report.json`:只写 `meta` + `narrative`(8 维度叙事);`kpis`/`charts`/`tables` 留给步骤 4 的 `--snapshot-dir` 合并(合并后缺 KPI 会拒绝出 HTML) |
19
- | **4. 渲染 HTML** | CLI | `google-analysis render` — **校验 narrative 8 维度必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
19
+ | **4. 渲染 HTML** | CLI | `google-analysis render` — **校验 narrative 8 维度必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
20
20
 
21
21
  ```bash
22
22
  # 步骤 1
@@ -20,8 +20,8 @@ siluzan-tso facebook-analysis -a <id> --start <s> --end <e> --json-out ./snap-fb
20
20
  | 步骤 | 执行者 | 动作 |
21
21
  | ---------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
22
22
  | **1. 拉数** | Agent 调 CLI | `facebook-analysis -a <id> --start <s> --end <e> --json-out ./snap-fb-diagnosis`(全 7 维或默认 6 维 + 按需 `material`) |
23
- | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),做洞察与叙事;表格数字可由 `--snapshot-dir` 按 guide 根字段自动映射 |
24
- | **3. 写 JSON** | Agent | 撰写 `meta-account-diagnosis-report.json`:仅 `meta.accountId` + `narrative` 为必填;`kpis`/`tables` 可省略,由 `--snapshot-dir` 自动合并 |
23
+ | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),做洞察与叙事;表格数字可由 `--snapshot-dir` 按 guide 根字段自动映射 |
24
+ | **3. 写 JSON** | Agent | 撰写 `meta-account-diagnosis-report.json`:仅 `meta.accountId` + `narrative` 为必填;`kpis`/`tables` 可省略,由 `--snapshot-dir` 自动合并 |
25
25
  | **4. 渲染 HTML** | CLI | `facebook-analysis diagnosis-render` — **校验 narrative 11 个分析小节必含字段**(4 个媒体未覆盖小节可标 `notAvailable`),缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
26
26
 
27
27
  > `--snapshot-dir` 自动补全 `meta` / `kpis`(仅 overview;**禁止**用 ad-sets/creative 行 results 加总对比 overview)与 `tables.*`(按 `facebook-analysis-guide.md`:`adGroups`/`networks`/`countries`/`audiences`/`creatives`/`materials`)。**数值一律以 CLI 快照覆盖**(`meta` 仅补空)。
@@ -6,7 +6,6 @@
6
6
  > **媒体**:当前模板仅规范 **Google**(`mediaCustomerId`)。其他媒体用各自 `*-period-report.md`。
7
7
  > **Excel 版式基准**:与运营样表《**数据复盘分析**》类 xlsx 对齐(如 `2025.12数据复盘分析.xlsx`);工作簿 5 个 Sheet、顺序与表头以下文规范为准。
8
8
 
9
-
10
9
  ## Contents
11
10
 
12
11
  - 须先确认
@@ -11,12 +11,12 @@
11
11
 
12
12
  ## 标准四步流程(默认 · 交付 HTML)
13
13
 
14
- | 步骤 | 执行者 | 动作 |
15
- | ---------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
16
- | **1. 拉数** | Agent 调 CLI | `tiktok-analysis -a <id> --start <s> --end <e> --json-out ./snap-tiktok`(见下方「日期规则」,全 12 维或 `--sections` 指定子集) |
17
- | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),做洞察与叙事;表格数字可由 `--snapshot-dir` 按类型自动映射 |
18
- | **3. 写 JSON** | Agent | 撰写 `tiktok-period-report.json`:仅 `meta.accountId` + `narrative` 为必填;`kpis`/`tables` 可省略,由 `--snapshot-dir` 按网关类型自动合并 |
19
- | **4. 渲染 HTML** | CLI | `tiktok-analysis render` — **校验 narrative 6 个分析小节必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
14
+ | 步骤 | 执行者 | 动作 |
15
+ | ---------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
16
+ | **1. 拉数** | Agent 调 CLI | `tiktok-analysis -a <id> --start <s> --end <e> --json-out ./snap-tiktok`(见下方「日期规则」,全 12 维或 `--sections` 指定子集) |
17
+ | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),做洞察与叙事;表格数字可由 `--snapshot-dir` 按类型自动映射 |
18
+ | **3. 写 JSON** | Agent | 撰写 `tiktok-period-report.json`:仅 `meta.accountId` + `narrative` 为必填;`kpis`/`tables` 可省略,由 `--snapshot-dir` 按网关类型自动合并 |
19
+ | **4. 渲染 HTML** | CLI | `tiktok-analysis render` — **校验 narrative 6 个分析小节必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
20
20
 
21
21
  > `--snapshot-dir` 自动补全 `meta` / `kpis` / `tables.*`。网关形状见 `src/types/tiktok-analysis-api.ts`(对齐前端 `periodReport/tiktok.js`):`campaigns` 为 `{ campaigns:[] }`;ad-groups/videos/audience 为 `{ data.list[].metrics }`(snake_case);ads 为根数组。**本期 KPI 优先 campaigns 累加**。**数值一律以 CLI 快照覆盖**(`meta` 仅补空);Agent 只写 `narrative`。
22
22
 
@@ -2062,7 +2062,6 @@
2062
2062
  }
2063
2063
  </style>
2064
2064
  <script src="https://staticpn.siluzan.com/assets/slz/homeCDN/echarts.min.js"></script>
2065
-
2066
2065
  </head>
2067
2066
  <body>
2068
2067
  <div id="report-root">
@@ -2269,11 +2268,16 @@
2269
2268
  }
2270
2269
 
2271
2270
  const { desktop = {}, mobile = {} } = rawData;
2272
- const source = String(rawData.source || (rawData.lighthouseOk === false ? "none" : "api"));
2271
+ const source = String(
2272
+ rawData.source || (rawData.lighthouseOk === false ? "none" : "api"),
2273
+ );
2273
2274
  const simple = rawData.simpleDiagnosis || null;
2274
2275
 
2275
2276
  // TSO Lighthouse 失败后的 CLI 简易诊断:不展示假 0 分,改为说明降级
2276
- if (source === "simple" || (source !== "api" && !(Number(desktop.score) > 0 || Number(mobile.score) > 0))) {
2277
+ if (
2278
+ source === "simple" ||
2279
+ (source !== "api" && !(Number(desktop.score) > 0 || Number(mobile.score) > 0))
2280
+ ) {
2277
2281
  if (source === "simple" || simple) {
2278
2282
  const fetchMs = simple && simple.fetchMs != null ? `${simple.fetchMs} ms` : "—";
2279
2283
  const https = simple ? (simple.https ? "是" : "否") : "—";
@@ -2307,7 +2311,8 @@
2307
2311
  metric: "手机性能指数 (Mobile Performance Index)",
2308
2312
  reportValue: "未测到",
2309
2313
  benchmark: "≥ 75",
2310
- action: "P2:稍后重试 Lighthouse;当前勿据此调整出价。(Retry Lighthouse later.)",
2314
+ action:
2315
+ "P2:稍后重试 Lighthouse;当前勿据此调整出价。(Retry Lighthouse later.)",
2311
2316
  },
2312
2317
  ];
2313
2318
  }
@@ -2323,9 +2328,7 @@
2323
2328
  const mobileFirstContentfulPaint = Number(mobile.firstContentfulPaint) || 0;
2324
2329
  const mobileScore = Number(mobile.score) || 0;
2325
2330
  const hasMeasuredMetrics =
2326
- desktopFirstContentfulPaint > 0 ||
2327
- mobileFirstContentfulPaint > 0 ||
2328
- mobileScore > 0;
2331
+ desktopFirstContentfulPaint > 0 || mobileFirstContentfulPaint > 0 || mobileScore > 0;
2329
2332
 
2330
2333
  // 全 0 = 未测到,禁止当成「0.00s / 0 分 → P1 立即修复」
2331
2334
  if (!hasMeasuredMetrics) {
@@ -2353,7 +2356,8 @@
2353
2356
  metric: "手机性能指数 (Mobile Performance Index)",
2354
2357
  reportValue: "未测到",
2355
2358
  benchmark: `≥ ${healthStandards.score}`,
2356
- action: "数据未获取,禁止按 0 分给 P1;可稍后重试 Lighthouse。(Unavailable — retry later.)",
2359
+ action:
2360
+ "数据未获取,禁止按 0 分给 P1;可稍后重试 Lighthouse。(Unavailable — retry later.)",
2357
2361
  },
2358
2362
  ];
2359
2363
  }
@@ -3022,11 +3026,21 @@
3022
3026
  tooltip: { trigger: "axis", axisPointer: { type: "shadow" } },
3023
3027
  legend: {},
3024
3028
  grid: { left: "8%", right: "5%", bottom: 30, containLabel: true },
3025
- xAxis: { type: "category", data: labels, axisLine: { show: false }, axisTick: { show: false } },
3029
+ xAxis: {
3030
+ type: "category",
3031
+ data: labels,
3032
+ axisLine: { show: false },
3033
+ axisTick: { show: false },
3034
+ },
3026
3035
  yAxis: { type: "value", splitLine: { lineStyle: { color: "#f0f0f0" } } },
3027
3036
  series: [
3028
3037
  { name: "消费", type: "bar", data: costData, itemStyle: { color: "#3b68f9" } },
3029
- { name: "转化次数", type: "bar", data: conversionData, itemStyle: { color: "#5b8fff" } },
3038
+ {
3039
+ name: "转化次数",
3040
+ type: "bar",
3041
+ data: conversionData,
3042
+ itemStyle: { color: "#5b8fff" },
3043
+ },
3030
3044
  ],
3031
3045
  },
3032
3046
  { hasHtmlTitle: true },
@@ -3086,15 +3100,30 @@
3086
3100
  },
3087
3101
  legend: {},
3088
3102
  grid: { left: "8%", right: "5%", bottom: 30, containLabel: true },
3089
- xAxis: { type: "category", data: labels, axisLine: { show: false }, axisTick: { show: false } },
3103
+ xAxis: {
3104
+ type: "category",
3105
+ data: labels,
3106
+ axisLine: { show: false },
3107
+ axisTick: { show: false },
3108
+ },
3090
3109
  yAxis: {
3091
3110
  type: "value",
3092
3111
  axisLabel: { formatter: "{value}%" },
3093
3112
  splitLine: { lineStyle: { color: "#f0f0f0" } },
3094
3113
  },
3095
3114
  series: [
3096
- { name: "花费占比 (%)", type: "bar", data: costPercent, itemStyle: { color: "#3b68f9" } },
3097
- { name: "转化占比 (%)", type: "bar", data: conversionPercent, itemStyle: { color: "#5b8fff" } },
3115
+ {
3116
+ name: "花费占比 (%)",
3117
+ type: "bar",
3118
+ data: costPercent,
3119
+ itemStyle: { color: "#3b68f9" },
3120
+ },
3121
+ {
3122
+ name: "转化占比 (%)",
3123
+ type: "bar",
3124
+ data: conversionPercent,
3125
+ itemStyle: { color: "#5b8fff" },
3126
+ },
3098
3127
  ],
3099
3128
  },
3100
3129
  { hasHtmlTitle: true },
@@ -21,7 +21,7 @@
21
21
  | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
22
22
  | `google-period-report.md` | **Google 周期分析报告(默认)**:终稿=HTML,四步流程 → `google-analysis render` 出 HTML |
23
23
  | `google-period-report-excel.md` | **仅用户要 Excel 时**(P4 定制 Sheet):先 `*.outline.txt` 后脚本写 xlsx;账户须 `-k` 核验,无 CLI excel 子命令 |
24
- | `stats-daily-excel.md` | **P4-DAILY**:账户级按日 Excel(`stats --by-day`) |
24
+ | `stats-daily-excel.md` | **P4-DAILY**:账户级按日 Excel(`stats --by-day`) |
25
25
  | `google-account-diagnosis-report.md` | Google 账户深度诊断(健康度/转化/结构等) |
26
26
  | `google-ads-diagnosis.md` | Google **广告诊断**完整纲要(HTML 区块、**每日趋势 2 位小数**、**每模块必填分析/建议**) |
27
27
  | `meta-period-report.md` / `.html` | **Meta(Facebook)周期报告(默认)**:四步流程 → `facebook-analysis render` 出 HTML,见 P4-FB |
@@ -757,11 +757,7 @@
757
757
  .map((def, i) => {
758
758
  const v = kpiVal(kpis, def.key);
759
759
  const p =
760
- def.key === "spend"
761
- ? prev.spend != null
762
- ? prev.spend
763
- : prev.cost
764
- : prev[def.key];
760
+ def.key === "spend" ? (prev.spend != null ? prev.spend : prev.cost) : prev[def.key];
765
761
  const color = PALETTE[i % PALETTE.length];
766
762
  const delta = deltaKeys.has(def.key) ? deltaLabel(v, p) : "";
767
763
  return `<div class="kpi" style="--kpi-color:${color}">
@@ -1144,7 +1140,8 @@
1144
1140
  return `<div class="rec-card">${num}<div class="rec-body">${title}<div class="rec-content">${escapeHtml(r?.content || "")}</div></div></div>`;
1145
1141
  })
1146
1142
  .join("");
1147
- const body = recs.length > 0 ? `<div class="recommendation-list">${cards}</div>` : emptyNoteHtml();
1143
+ const body =
1144
+ recs.length > 0 ? `<div class="recommendation-list">${cards}</div>` : emptyNoteHtml();
1148
1145
  return `
1149
1146
  <section id="sec-recommendations">
1150
1147
  ${sectionHead("10", "优化建议汇总", "跨维度归纳优先级,须与各 section 分析一致")}
@@ -1276,7 +1273,13 @@
1276
1273
  echarts
1277
1274
  .init(campaignsEl)
1278
1275
  .setOption(
1279
- hBarOption(campaigns, "campaignName", currency, "rgba(99,102,241,0.55)", PALETTE[1]),
1276
+ hBarOption(
1277
+ campaigns,
1278
+ "campaignName",
1279
+ currency,
1280
+ "rgba(99,102,241,0.55)",
1281
+ PALETTE[1],
1282
+ ),
1280
1283
  );
1281
1284
  }
1282
1285
 
@@ -8,17 +8,17 @@
8
8
 
9
9
  数据块(Bing 实际支持的 9 类业务维度 + 总览):总览、设备、地域、受众(年龄/性别)、系列、广告组、广告、关键词、搜索字词。
10
10
 
11
- | CLI `--sections` | 落盘形状(生产实测) | 报告 `tables.*` / KPI |
12
- | --- | --- | --- |
13
- | `overview` | 对象:`currentPeriod` / `previousPeriod` / `balance` / `averageDailyCost` … | → `meta` + `kpis`(环比、余额、日均) |
14
- | `device` | `{ devices: Row[] }` | → `tables.devices[]` |
15
- | `geographic` | `{ countries: Row[] }` | → `tables.geographic[]` |
16
- | `audience-merged`(或 `age-audience`/`gender-audience`) | `{ data: { ageAudience.audience[], genderAudience.audience[] } }` | → `tables.audienceAge[]` / `audienceGender[]` |
17
- | `campaigns` | **根节点数组** | → `tables.campaigns[]`;**本期 KPI 优先由此累加** |
18
- | `ad-groups` | **根节点数组** | → `tables.adGroups[]`(含 `qualityScore`) |
19
- | `ads` | **根节点数组** | → `tables.ads[]` |
20
- | `keywords` | **根节点数组**(默认 limit=100) | → `tables.keywords[]` |
21
- | `search-terms` | **根节点数组**(默认 limit=100) | → `tables.searchTerms[]` |
11
+ | CLI `--sections` | 落盘形状(生产实测) | 报告 `tables.*` / KPI |
12
+ | -------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------- |
13
+ | `overview` | 对象:`currentPeriod` / `previousPeriod` / `balance` / `averageDailyCost` … | → `meta` + `kpis`(环比、余额、日均) |
14
+ | `device` | `{ devices: Row[] }` | → `tables.devices[]` |
15
+ | `geographic` | `{ countries: Row[] }` | → `tables.geographic[]` |
16
+ | `audience-merged`(或 `age-audience`/`gender-audience`) | `{ data: { ageAudience.audience[], genderAudience.audience[] } }` | → `tables.audienceAge[]` / `audienceGender[]` |
17
+ | `campaigns` | **根节点数组** | → `tables.campaigns[]`;**本期 KPI 优先由此累加** |
18
+ | `ad-groups` | **根节点数组** | → `tables.adGroups[]`(含 `qualityScore`) |
19
+ | `ads` | **根节点数组** | → `tables.ads[]` |
20
+ | `keywords` | **根节点数组**(默认 limit=100) | → `tables.keywords[]` |
21
+ | `search-terms` | **根节点数组**(默认 limit=100) | → `tables.searchTerms[]` |
22
22
 
23
23
  > Bing **没有** Google 的 `daily-metrics` / `dimension-summary`;报告模板也不渲染这两章。
24
24
 
@@ -26,12 +26,12 @@
26
26
 
27
27
  ## 标准四步流程(默认 · 交付 HTML)
28
28
 
29
- | 步骤 | 执行者 | 动作 |
30
- | ---------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
31
- | **1. 拉数** | Agent 调 CLI | `bing-analysis -a <id> --start <s> --end <e> --json-out ./snap-bing`(见下方「日期规则」,全 11 维或 `--sections` 指定子集) |
32
- | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),把网关原始字段映射为下方 `tables.*` 契约,完成聚合与洞察 |
29
+ | 步骤 | 执行者 | 动作 |
30
+ | ---------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
31
+ | **1. 拉数** | Agent 调 CLI | `bing-analysis -a <id> --start <s> --end <e> --json-out ./snap-bing`(见下方「日期规则」,全 11 维或 `--sections` 指定子集) |
32
+ | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),把网关原始字段映射为下方 `tables.*` 契约,完成聚合与洞察 |
33
33
  | **3. 写 JSON** | Agent | 撰写 `bing-period-report.json`:仅 `meta.accountId` + `narrative`(9 个分析小节)为必填;`kpis`/`tables` 可省略由 `--snapshot-dir` 自动合并 |
34
- | **4. 渲染 HTML** | CLI | `bing-analysis render` — **校验 narrative 9 个分析小节必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
34
+ | **4. 渲染 HTML** | CLI | `bing-analysis render` — **校验 narrative 9 个分析小节必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
35
35
 
36
36
  ```bash
37
37
  # 步骤 1
@@ -1,4 +1,5 @@
1
1
  # Go
2
+
2
3
  ## Contents
3
4
 
4
5
  - CLI 工作流(collect → Agent → render)
@@ -19,6 +20,7 @@
19
20
  - 附录:与 CLI 拉数对照(可选)
20
21
 
21
22
  ---
23
+
22
24
  ogle Ads 账户诊断报告
23
25
 
24
26
  > 账户诊断报告纲要:配合 `google-analysis` CLI 拉数后填充。
@@ -49,17 +51,17 @@ siluzan-tso google-ads-diagnosis render \
49
51
  --out ./snap-p1/google-ads-diagnosis-report.html
50
52
  ```
51
53
 
52
- | 子命令 | 说明 |
53
- | -------- | -------------------------------------------------------------------- |
54
+ | 子命令 | 说明 |
55
+ | --------- | -------------------------------------------------------------------------------------------------------------------------- |
54
56
  | `collect` | 拉 google-analysis + 对比周期 + 着陆页(先 TSO Lighthouse,失败则 CLI 简易诊断);输出 `google-ads-diagnosis-collect.json` |
55
- | `render` | 读取 Agent 产出的 `google-ads-diagnosis.json`,注入 `GoogleAdsDiagnosisReport.html` |
57
+ | `render` | 读取 Agent 产出的 `google-ads-diagnosis.json`,注入 `GoogleAdsDiagnosisReport.html` |
56
58
 
57
59
  **collect 选项**:
58
60
 
59
- | 选项 | 说明 |
60
- | ---- | ---- |
61
+ | 选项 | 说明 |
62
+ | ---------------------------- | ------------------------------------------------------------------- |
61
63
  | `--no-fetch-previous-period` | 不拉上一周期 campaigns/geographic/keywords 对比数据(环比列将为空) |
62
- | `--skip-landing-page` | 不拉取着陆页(跳过 TSO Lighthouse + CLI 简易诊断) |
64
+ | `--skip-landing-page` | 不拉取着陆页(跳过 TSO Lighthouse + CLI 简易诊断) |
63
65
 
64
66
  **collect 行为约束**:
65
67
 
@@ -349,19 +351,19 @@ siluzan-tso google-ads-diagnosis render \
349
351
 
350
352
  ### 竞争力表
351
353
 
352
- | 指标 (Metric) | 报告值 (Report Value) | 健康标准 (Health Benchmark) | 优化策略 (Optimization Strategy) |
353
- | ------------- | --------------------- | --------------------------- | -------------------------------- |
354
+ | 指标 (Metric) | 报告值 (Report Value) | 健康标准 (Health Benchmark) | 优化策略 (Optimization Strategy) |
355
+ | ------------- | --------------------- | --------------------------- | --------------------------------------- |
354
356
  | | | | **按行填写 `strategy`,禁止整列同一句** |
355
357
 
356
358
  示例差异化方向(须代入本账户数字,勿照抄):
357
359
 
358
- | metric | 策略侧重点 |
359
- | ------ | ---------- |
360
- | `budgetUtilizationRate` | 日预算是否打满、是否需调日预算/排期 |
361
- | `searchImpressionShare` | 份额偏低时优先查预算丢失 vs 排名丢失占比 |
362
- | `searchBudgetLostImpressionShare` | 预算丢失高 → 加预算/拆核心系列预算 |
363
- | `searchRankLostImpressionShare` | 排名丢失高 → 出价/质量分/落地页,而非只加预算 |
364
- | 核心系列 IS 目标 | 对照公式与目标差距,列可执行的系列级动作 |
360
+ | metric | 策略侧重点 |
361
+ | --------------------------------- | --------------------------------------------- |
362
+ | `budgetUtilizationRate` | 日预算是否打满、是否需调日预算/排期 |
363
+ | `searchImpressionShare` | 份额偏低时优先查预算丢失 vs 排名丢失占比 |
364
+ | `searchBudgetLostImpressionShare` | 预算丢失高 → 加预算/拆核心系列预算 |
365
+ | `searchRankLostImpressionShare` | 排名丢失高 → 出价/质量分/落地页,而非只加预算 |
366
+ | 核心系列 IS 目标 | 对照公式与目标差距,列可执行的系列级动作 |
365
367
 
366
368
  ---
367
369
 
@@ -465,8 +467,8 @@ siluzan-tso google-ads-diagnosis render \
465
467
 
466
468
  ### 创意表
467
469
 
468
- | 广告 | Headlines | Descriptions | 优化建议 |
469
- | ---- | --------- | ------------ | -------- |
470
+ | 广告 | Headlines | Descriptions | 优化建议 |
471
+ | ----------------- | ------------------------------------ | ------------------------------------------ | --------------------------------------------------------- |
470
472
  | `items[].adTitle` | `headlinesCount` / `headlinesStatus` | `descriptionsCount` / `descriptionsStatus` | **`items[].suggestion`**(逐条,HTML 表格「优化建议」列) |
471
473
 
472
474
  - **模块级**分析 / 建议:`adCreativeOptimization.analysis`、`adCreativeOptimization.suggestions`(区块下方段落)
@@ -480,6 +482,7 @@ siluzan-tso google-ads-diagnosis render \
480
482
  **数据**:`newFeatures.items`(collect 来自 campaign-types;过滤 `strategy === "AiMax"` 的行)
481
483
 
482
484
  **items 行字段**:
485
+
483
486
  - collect 事实(勿改):`strategy`(如 `PerformanceMax`)、`strategyName`(如 `效果最大化`)、`accountStatus`(**boolean**,`true`=已启用)
484
487
  - Agent 只填:`optimizerRecommendation`
485
488
  - **禁止**用 `feature` 替代 `strategyName`(render 模板会兜底读 `feature`,但 collect 合并校验会告警)
@@ -517,12 +520,12 @@ siluzan-tso google-ads-diagnosis render \
517
520
  }
518
521
  ```
519
522
 
520
- | 字段 | 说明 |
521
- | ---- | ---- |
522
- | `priority` | P0/P1/P2… 或「P0(立即)」等可读标签 |
523
- | `focusArea` | 优化重点(表格「优化重点」列) |
524
- | `actionItems` | 字符串数组,关键行动列表 |
525
- | `expectedOutcome` | 预期效果 |
523
+ | 字段 | 说明 |
524
+ | ----------------- | ------------------------------------ |
525
+ | `priority` | P0/P1/P2… 或「P0(立即)」等可读标签 |
526
+ | `focusArea` | 优化重点(表格「优化重点」列) |
527
+ | `actionItems` | 字符串数组,关键行动列表 |
528
+ | `expectedOutcome` | 预期效果 |
526
529
 
527
530
  > 若 Agent 暂写 `"第 1 周:…"` 字符串,render 会尽力拆成 focusArea + actionItems,但**仍须补全 `expectedOutcome` 对象格式**以获得完整表格。
528
531
 
@@ -1,12 +1,12 @@
1
1
  # Google 账户询盘分析(运营固定触发模板)
2
2
 
3
3
  > **触发话术**(等价即可,命中即走本模板)
4
+ >
4
5
  > - `Goog账户询盘分析` / `Google 账户询盘分析`
5
6
  > - `分析XXX Google账号的询盘效果`
6
7
  > - `我给你询盘信息分析Google账号XXX效果`(附询盘资料 + 账户 ID)
7
8
  > - 含「询盘 + 账户 + Google」三要素的近义表述
8
9
 
9
-
10
10
  ## Contents
11
11
 
12
12
  - 用户两种入场流程
@@ -11,12 +11,12 @@
11
11
 
12
12
  ## 标准四步流程(默认 · 交付 HTML)
13
13
 
14
- | 步骤 | 执行者 | 动作 |
15
- | ---------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
16
- | **1. 拉数** | Agent 调 CLI | `google-analysis -a <id> --start <s> --end <e> --json-out ./snap-google --sections <见下方默认维度对应 CLI>` |
17
- | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),完成筛选、聚合、排序与洞察 |
14
+ | 步骤 | 执行者 | 动作 |
15
+ | ---------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
16
+ | **1. 拉数** | Agent 调 CLI | `google-analysis -a <id> --start <s> --end <e> --json-out ./snap-google --sections <见下方默认维度对应 CLI>` |
17
+ | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),完成筛选、聚合、排序与洞察 |
18
18
  | **3. 写 JSON** | Agent | 按 `assets/google-period-report.schema.json` 撰写 `google-period-report.json`:只写 `meta` + `narrative`(8 维度叙事);`kpis`/`charts`/`tables` 留给步骤 4 的 `--snapshot-dir` 合并(合并后缺 KPI 会拒绝出 HTML) |
19
- | **4. 渲染 HTML** | CLI | `google-analysis render` — **校验 narrative 8 维度必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
19
+ | **4. 渲染 HTML** | CLI | `google-analysis render` — **校验 narrative 8 维度必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
20
20
 
21
21
  ```bash
22
22
  # 步骤 1
@@ -20,8 +20,8 @@ siluzan-tso facebook-analysis -a <id> --start <s> --end <e> --json-out ./snap-fb
20
20
  | 步骤 | 执行者 | 动作 |
21
21
  | ---------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
22
22
  | **1. 拉数** | Agent 调 CLI | `facebook-analysis -a <id> --start <s> --end <e> --json-out ./snap-fb-diagnosis`(全 7 维或默认 6 维 + 按需 `material`) |
23
- | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),做洞察与叙事;表格数字可由 `--snapshot-dir` 按 guide 根字段自动映射 |
24
- | **3. 写 JSON** | Agent | 撰写 `meta-account-diagnosis-report.json`:仅 `meta.accountId` + `narrative` 为必填;`kpis`/`tables` 可省略,由 `--snapshot-dir` 自动合并 |
23
+ | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),做洞察与叙事;表格数字可由 `--snapshot-dir` 按 guide 根字段自动映射 |
24
+ | **3. 写 JSON** | Agent | 撰写 `meta-account-diagnosis-report.json`:仅 `meta.accountId` + `narrative` 为必填;`kpis`/`tables` 可省略,由 `--snapshot-dir` 自动合并 |
25
25
  | **4. 渲染 HTML** | CLI | `facebook-analysis diagnosis-render` — **校验 narrative 11 个分析小节必含字段**(4 个媒体未覆盖小节可标 `notAvailable`),缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
26
26
 
27
27
  > `--snapshot-dir` 自动补全 `meta` / `kpis`(仅 overview;**禁止**用 ad-sets/creative 行 results 加总对比 overview)与 `tables.*`(按 `facebook-analysis-guide.md`:`adGroups`/`networks`/`countries`/`audiences`/`creatives`/`materials`)。**数值一律以 CLI 快照覆盖**(`meta` 仅补空)。
@@ -6,7 +6,6 @@
6
6
  > **媒体**:当前模板仅规范 **Google**(`mediaCustomerId`)。其他媒体用各自 `*-period-report.md`。
7
7
  > **Excel 版式基准**:与运营样表《**数据复盘分析**》类 xlsx 对齐(如 `2025.12数据复盘分析.xlsx`);工作簿 5 个 Sheet、顺序与表头以下文规范为准。
8
8
 
9
-
10
9
  ## Contents
11
10
 
12
11
  - 须先确认
@@ -11,12 +11,12 @@
11
11
 
12
12
  ## 标准四步流程(默认 · 交付 HTML)
13
13
 
14
- | 步骤 | 执行者 | 动作 |
15
- | ---------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
16
- | **1. 拉数** | Agent 调 CLI | `tiktok-analysis -a <id> --start <s> --end <e> --json-out ./snap-tiktok`(见下方「日期规则」,全 12 维或 `--sections` 指定子集) |
17
- | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),做洞察与叙事;表格数字可由 `--snapshot-dir` 按类型自动映射 |
18
- | **3. 写 JSON** | Agent | 撰写 `tiktok-period-report.json`:仅 `meta.accountId` + `narrative` 为必填;`kpis`/`tables` 可省略,由 `--snapshot-dir` 按网关类型自动合并 |
19
- | **4. 渲染 HTML** | CLI | `tiktok-analysis render` — **校验 narrative 6 个分析小节必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
14
+ | 步骤 | 执行者 | 动作 |
15
+ | ---------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
16
+ | **1. 拉数** | Agent 调 CLI | `tiktok-analysis -a <id> --start <s> --end <e> --json-out ./snap-tiktok`(见下方「日期规则」,全 12 维或 `--sections` 指定子集) |
17
+ | **2. 分析** | Agent | 用 **node/python 脚本**读落盘 JSON(勿用 Read 打开业务 `*.json`),做洞察与叙事;表格数字可由 `--snapshot-dir` 按类型自动映射 |
18
+ | **3. 写 JSON** | Agent | 撰写 `tiktok-period-report.json`:仅 `meta.accountId` + `narrative` 为必填;`kpis`/`tables` 可省略,由 `--snapshot-dir` 按网关类型自动合并 |
19
+ | **4. 渲染 HTML** | CLI | `tiktok-analysis render` — **校验 narrative 6 个分析小节必含字段**,缺项报错不生成 HTML;**禁止** Agent 手写/拼接 HTML |
20
20
 
21
21
  > `--snapshot-dir` 自动补全 `meta` / `kpis` / `tables.*`。网关形状见 `src/types/tiktok-analysis-api.ts`(对齐前端 `periodReport/tiktok.js`):`campaigns` 为 `{ campaigns:[] }`;ad-groups/videos/audience 为 `{ data.list[].metrics }`(snake_case);ads 为根数组。**本期 KPI 优先 campaigns 累加**。**数值一律以 CLI 快照覆盖**(`meta` 仅补空);Agent 只写 `narrative`。
22
22
 
@@ -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.44-beta.3'
12
+ $PKG_VERSION = '1.1.44'
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.44-beta.3"
12
+ readonly PKG_VERSION="1.1.44"
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
@@ -6,18 +6,6 @@
6
6
  ],
7
7
  "judgeExpectation": "路径:用户只提供 entityId 时,应先 list-accounts(可加 --json-out)核对 mediaCustomerId,再对 stats 等传媒体账户 ID;不得把 entityId 当作 mediaCustomerId 直接传给 stats。\n输出:说明映射关系;stub 数据即可。",
8
8
  "skillMapping": "SKILL.md「不要猜测账户 ID」;references/accounts/accounts.md",
9
- "judgeReferencePaths": [
10
- "references/accounts/accounts.md"
11
- ],
12
- "commandMustInclude": [
13
- [
14
- "list-accounts"
15
- ],
16
- [
17
- "stats"
18
- ],
19
- [
20
- "--json-out"
21
- ]
22
- ]
9
+ "judgeReferencePaths": ["references/accounts/accounts.md"],
10
+ "commandMustInclude": [["list-accounts"], ["stats"], ["--json-out"]]
23
11
  }
@@ -6,7 +6,5 @@
6
6
  ],
7
7
  "judgeExpectation": "路径:用户问如何把账户绑到 MCC/经理账户时,应先 read_skill_reference 查阅 accounts/accounts.md 中相关命令与注意点,再给出步骤;**未获确认前不应执行解绑/破坏性 CLI**。\n输出:步骤与风险提示;不要求真实绑定。",
8
8
  "skillMapping": "references/accounts/accounts.md · MCC/Google 绑定类",
9
- "judgeReferencePaths": [
10
- "references/accounts/accounts.md"
11
- ]
9
+ "judgeReferencePaths": ["references/accounts/accounts.md"]
12
10
  }
@@ -6,18 +6,7 @@
6
6
  ],
7
7
  "judgeExpectation": "路径:仅查询**单个**账户余额/续航时,应使用单户 `balance`(或文档中的单户形态),不应套用多账户 `balance-scan` 除非用户明确多账户筛查。\n输出:说明意图即可;stub 金额不要求正确。",
8
8
  "skillMapping": "references/accounts/accounts.md;与批量 balance-scan 区分",
9
- "judgeReferencePaths": [
10
- "references/accounts/accounts.md"
11
- ],
12
- "commandMustInclude": [
13
- [
14
- "balance"
15
- ],
16
- [
17
- "--json-out"
18
- ]
19
- ],
20
- "commandMustNotInclude": [
21
- "balance-scan"
22
- ]
9
+ "judgeReferencePaths": ["references/accounts/accounts.md"],
10
+ "commandMustInclude": [["balance"], ["--json-out"]],
11
+ "commandMustNotInclude": ["balance-scan"]
23
12
  }
@@ -6,12 +6,5 @@
6
6
  ],
7
7
  "judgeExpectation": "路径:`ad campaigns --json-out` 中 **`budget` 即用户可见日预算(元)**,与 `--budget` 写入口径一致;同样适用于 `google-analysis campaigns-*.json` 的 `budgetAmountYuan`、`ad groups --json-out` 的 `maxCPCAmountYuan`。CLI 出口的所有金额字段都已是元,**禁止**自己再做 ÷100 / ÷1_000_000 换算。\n输出:若引用 JSON,应体现正确金额尺度;不要求数值与真实一致。",
8
8
  "skillMapping": "SKILL.md「金额与货币单位硬约束」",
9
- "commandMustInclude": [
10
- [
11
- "ad campaigns"
12
- ],
13
- [
14
- "--json-out"
15
- ]
16
- ]
9
+ "commandMustInclude": [["ad campaigns"], ["--json-out"]]
17
10
  }
@@ -6,18 +6,6 @@
6
6
  ],
7
7
  "judgeExpectation": "路径:Meta 线索应使用 `clue -m Meta -a <页面或账户 ID>`,并按文档加日期或 --json-out。\n输出:可说明 field_data;stub 即可。",
8
8
  "skillMapping": "references/operations/clue.md",
9
- "judgeReferencePaths": [
10
- "references/operations/clue.md"
11
- ],
12
- "commandMustInclude": [
13
- [
14
- "clue"
15
- ],
16
- [
17
- "Meta"
18
- ],
19
- [
20
- "--json-out"
21
- ]
22
- ]
9
+ "judgeReferencePaths": ["references/operations/clue.md"],
10
+ "commandMustInclude": [["clue"], ["Meta"], ["--json-out"]]
23
11
  }
@@ -6,15 +6,6 @@
6
6
  ],
7
7
  "judgeExpectation": "路径:拉 TikTok 线索时应使用 `siluzan-tso clue -m TikTok -a <id>`,需要处理数据时加 `--json-out`(文档说明大数据量建议 JSON)。\n输出:可说明字段来源;stub 即可。",
8
8
  "skillMapping": "references/operations/clue.md",
9
- "judgeReferencePaths": [
10
- "references/operations/clue.md"
11
- ],
12
- "commandMustInclude": [
13
- [
14
- "clue"
15
- ],
16
- [
17
- "TikTok"
18
- ]
19
- ]
9
+ "judgeReferencePaths": ["references/operations/clue.md"],
10
+ "commandMustInclude": [["clue"], ["TikTok"]]
20
11
  }