siluzan-tso-cli 1.1.19-beta.10 → 1.1.19-beta.11

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.19-beta.10),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
54
+ > **注意**:当前为测试版(1.1.19-beta.11),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
55
 
56
56
  | 助手 | 建议 `--ai` |
57
57
  | ----------------------- | ------------------------------------ |
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.19-beta.10",
4
- "publishedAt": 1778659782044
3
+ "version": "1.1.19-beta.11",
4
+ "publishedAt": 1778661985143
5
5
  }
@@ -4,9 +4,9 @@
4
4
  > `使用okki周报模板生成<账户名或ID>,<YYYY-MM-DD>--<YYYY-MM-DD>的投放报告`
5
5
  > 同义:`OKKI 周报`、`okki 周报模板`、`运营 OKKI 周报`。
6
6
  > **媒体**:当前模板仅规范 **Google**(`mediaCustomerId`)。其他媒体用各自 `*-period-report.md`。
7
- > **Excel 版式基准**:与运营样表《**数据复盘分析**》类 xlsx 对齐(如 `2025.12数据复盘分析.xlsx`):**工作簿 5 个 Sheet、顺序与表头**以本文「最终 xlsx 版式规范」为准;Agent 生成产物须可与之逐 Sheet 对照验收。
7
+ > **Excel 版式基准**:与运营样表《**数据复盘分析**》类 xlsx 对齐(如 `2025.12数据复盘分析.xlsx`);工作簿 5 个 Sheet、顺序与表头以下文规范为准。
8
8
 
9
- 识别到上述意图时:**不要**再走 `google-period-report.md` 的「默认 8 维 + 追问追加」流程;按本文**固定维度 + 固定客户话术**交付即可(数据仍全部来自 CLI 落盘 JSON,见 `references/account-analytics.md`)。
9
+ 识别到上述意图时:**不要**再走 `google-period-report.md` 的「默认 8 维 + 追问追加」流程;按本文**固定维度 + 固定客户话术**交付(数据全部来自 CLI 落盘 JSON,见 `references/account-analytics.md`)。
10
10
 
11
11
  ---
12
12
 
@@ -14,22 +14,22 @@
14
14
 
15
15
  1. **账户**:`mediaCustomerId` 来自 `list-accounts -m Google -k <id>`,禁止猜 ID。
16
16
  2. **统计区间**:`--start` / `--end`(用户未给齐时按 SKILL 反问;授权默认时可用「上一完整自然周」白名单并写明)。
17
- 3. **询盘口径**:模板正文第 7 条默认使用 **区间内 `conversions`(转化次数)**(来自 `stats` 或 `overview` 汇总)。若运营将「询盘」定义为某一类转化,须在报告首段脚注说明数据来源(必要时补拉 `google-analysis --sections conversion-actions` 仅作说明,不替代统计口径 unless 用户确认)。
18
- 4. **日期写法**:用户可能写 `2026.4.1`、`2026/4/1` 等,Agent 须先规范为 CLI 要求的 **`YYYY-MM-DD`**(如 `2026-04-01`)再传 `--start` / `--end`。
17
+ 3. **询盘口径**:默认使用区间内 `conversions`(转化次数,来自 `stats` 或 `overview`)。若运营定义为某类转化,须在首段脚注说明(必要时补拉 `google-analysis --sections conversion-actions` 仅作说明)。
18
+ 4. **日期写法**:`2026.4.1`、`2026/4/1` 等先规范为 `YYYY-MM-DD`(如 `2026-04-01`)再传 `--start` / `--end`。
19
19
 
20
20
  ---
21
21
 
22
- ## 架构约定(Excel 谁来做)
22
+ ## 架构约定 · Excel 由谁生成
23
23
 
24
- - **`siluzan-tso` 不提供**「一键生成 OKKI Excel」的内置子命令,也**不要**在 CLI 里新增此类能力。
25
- - **需要交付 Excel 时**:由 **Agent(含 WorkBuddy 编排)** 在下列 CLI **`--json-out` 落盘完成后**,自行编写并执行 **Node.js / Python** 脚本(可选用 `exceljs`、`xlsx`、`openpyxl` 等)读取目录内 JSON → 按本文「多 Sheet 版式」写出 `.xlsx`。
26
- - 脚本与依赖可在当前工作区临时添加(如 `package.json` + `npm install` 或 `pip install`),或由宿主环境预装;**数值一律来自落盘 JSON**,禁止在脚本源码里写死业务数字。
24
+ - **`siluzan-tso` 不提供**「一键生成 OKKI Excel」的子命令,**也不要**在 CLI 里新增。
25
+ - 需交付 Excel 时:由 **Agent(含 WorkBuddy 编排)** 在下列 CLI **`--json-out` 落盘后**,自行编写 **Node.js / Python** 脚本(如 `exceljs`、`xlsx`、`openpyxl`)读取 JSON → `.xlsx`。
26
+ - **数值一律来自落盘 JSON,禁止在脚本里写死业务数字。**
27
27
 
28
28
  ---
29
29
 
30
- ## 拉数(现有 CLI,一次目录)
30
+ ## 拉数(一次目录)
31
31
 
32
- 在同一目录落盘(示例 `./snap-okki`),便于一份脚本消费:
32
+ 同一目录落盘(示例 `./snap-okki`):
33
33
 
34
34
  ```bash
35
35
  mkdir -p ./snap-okki
@@ -46,54 +46,53 @@ siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-ou
46
46
 
47
47
  **说明**:
48
48
 
49
- - `stats`:区间消耗、曝光、点击、转化、CTRCPC 等与**账户级周报摘要**对齐;金额用 `*Display` 或文档规定的展示字段。
50
- - `balance`:**当前**账户余额(非历史快照);话术里写清「截至查询时点」。
51
- - `google-analysis`:系列 / 词 / 搜索词;**设备与国家两 Sheet 的数据源**须用 **`campaign-device` / `campaign-geo`**(网关 `…/campaigns/reports/device` 与 `…/campaigns/reports/geo`,**按广告系列(及常见广告组)拆行**),**不要**再用账户级 `devices` / `geographic`。JSON 根结构仍为 `devices[]` / `countries[]`,落盘文件名分别为 `campaign-device-<id>.json`、`campaign-geo-<id>.json`。若运营需对「国家」「设备」做跨系列汇总,在脚本中聚合,**禁止**改回账户级维度冒充系列口径。
52
- - 可选:`campaign-geo` 支持网关阈值过滤,与 CLI 一致时追加 `--cost-greater` / `--click-greater` / `--conversions-greater`(见 `references/account-analytics.md`)。
53
- - TopN、排序、跨系列汇总均在脚本内对 JSON 完成,禁止心算。
54
- - **写脚本前**先读各 `<section>-<id>.outline.txt`(及 stats/balance 的 outline,若有),再读对应 `.json`。
49
+ - `stats`:区间消耗 / 曝光 / 点击 / 转化 / CTR / CPC,与账户级周报摘要对齐;金额用 `*Display` 或文档规定的展示字段。
50
+ - `balance`:**当前**余额(非历史快照),话术写「截至查询时点」。
51
+ - 「设备」「国家」两 Sheet **必须**用 **`campaign-device` / `campaign-geo`**(按系列/组拆行),**不要**用账户级 `devices` / `geographic`。落盘文件名为 `campaign-device-<id>.json`、`campaign-geo-<id>.json`。跨系列汇总在脚本中做。
52
+ - 可选:`campaign-geo` 支持 `--cost-greater` / `--click-greater` / `--conversions-greater`(见 `references/account-analytics.md`)。
53
+ - TopN、排序、汇总均在脚本内对 JSON 完成,禁止心算。
54
+ - 写脚本前先读各 `<section>-<id>.outline.txt` 再读 `.json`。
55
55
 
56
56
  ---
57
57
 
58
58
  ## xlsx 版式规范
59
59
 
60
- 以下按 **工作簿 → Sheet 名(须完全一致)→ 版式** 约定,便于 WorkBuddy / 人工用样表对照验收。**不**再单独建名为「广告系列」的 Sheet(系列表在 **`账户报告`** 内)。**金额等展示列**:脚本与运营约定保留小数位数(常见两位),须与样表一致。
61
- 一些状态的枚举如果是英语需要使用对应中文的字段或转成中文。
60
+ 工作簿 → Sheet 名(须完全一致)→ 版式。**不**单独建「广告系列」Sheet(系列表在 `账户报告` 内)。状态枚举若为英文须转中文。
62
61
 
63
- ### 脚本写表:点击率 / 转化率 / 互动率
62
+ ### 数值格式(强约束)
64
63
 
65
- > **2026-05 CLI 已统一归一**(manifest `schemaVersion: 2`):所有 `<section>-*.json` 中的 `ctr` / `conversionRate` 一律为 **0~1 小数**(如 `0.0964` = 9.64%)。无需再按维度做 ÷100 分支;下表与脚本片段仅作快速参考。详见 `references/account-analytics.md`「指标字段对照」。
64
+ - **所有数值列一律保留 2 位小数**:金额、CPC、每次转化费用、预算、点击率、转化率、互动率等。
65
+ - 客户话术 / 文案中的 `x%`:`(v * 100).toFixed(2) + "%"`。
66
66
 
67
- | 场景 | 处理 |
68
- | --------------------------------------------------- | ------------------------------------------------------------------------------------------ |
69
- | **写入 Excel 0~1 小数列**(点击率/转化率/互动率) | 直接写入 JSON 数值(**禁止**再 ÷100) |
70
- | **写客户话术 / 文案的 `x%`** | `(v * 100).toFixed(2) + "%"`(**禁止**直接打印数值得到 "0.09%") |
71
- | **`interactionRate`(字符串)** | `parseFloat(row.interactionRate)` 后按数值字段使用(同样 0~1 小数) |
72
- | **`interactions === 0` / `null`** | **平均费用**(`spend / interactions`)与 **互动率** 列填 **`—`**,禁止除零 |
67
+ ### 点击率 / 转化率 / 互动率
73
68
 
74
- > **历史快照兼容(`schemaVersion: 1` 旧目录)**:2026-04 及更早落盘 JSON **未归一**——`overview` / `campaigns` / `keywords` / `search-terms` / `ads` / `extensions` / `devices`(账户级)/ `ads-index` 这 8 个维度仍是百分数刻度(如 `ctr: 9.636` = 9.636%),写入前须 ÷100;其余维度原样为 0~1 小数。先看 `manifest-<id>.json` 顶部 `schemaVersion` 判别,**不要**用「值 > 1 才 ÷100」启发式(搜索词旧行 `ctr: 100` 会被误判)。
69
+ > **2026-05 CLI 已统一归一**(manifest `schemaVersion: 2`):所有 `<section>-*.json` 中的 `ctr` / `conversionRate` 一律为 **0~1 小数**(如 `0.10` = 10.00%)。详见 `references/account-analytics.md`「指标字段对照」。
70
+
71
+ | 场景 | 处理 |
72
+ | --- | --- |
73
+ | 写入 Excel **0~1 小数列**(点击率/转化率/互动率) | 直接写入 JSON 数值(**禁止**再 ÷100) |
74
+ | 写客户话术 / 文案的 `x%` | `(v * 100).toFixed(2) + "%"` |
75
+ | `interactionRate`(字符串) | `parseFloat(row.interactionRate)` 后按数值字段使用(同样 0~1 小数) |
76
+ | `interactions === 0` / `null` | **平均费用**(`spend / interactions`)与 **互动率** 列填 **`—`**,禁止除零 |
75
77
 
76
78
  ### 工作簿级
77
79
 
78
- | 顺序 | Sheet 名 | 数据来源(CLI 落盘) |
79
- | ---: | ---------- | -------------------- |
80
- | 1 | `账户报告` | `campaigns` + 复盘文案(stats/overview 汇总后由 Agent 撰写) |
80
+ | 顺序 | Sheet 名 | 数据来源 |
81
+ | ---: | --- | --- |
82
+ | 1 | `账户报告` | `campaigns` + 复盘文案(stats/overview 汇总后 Agent 撰写) |
81
83
  | 2 | `关键词` | `keywords` |
82
84
  | 3 | `搜索词` | `search-terms` |
83
- | 4 | `设备` | **`campaign-device`**(`campaign-device-*.json`;按系列/组拆行,非账户级 `devices`) |
84
- | 5 | `国家` | **`campaign-geo`**(`campaign-geo-*.json`;按系列/地域拆行,非账户级 `geographic`) |
85
+ | 4 | `设备` | **`campaign-device-*.json`**(按系列/组拆行) |
86
+ | 5 | `国家` | **`campaign-geo-*.json`**(按系列/地域拆行) |
85
87
 
86
88
  ### 各 Sheet 共同版式
87
89
 
88
- - **第 1 行(A1)**:该 Sheet 的**报告标题**(见下表「R1 标题」)。建议合并单元格横跨该 Sheet **R3 表头所含全部列**(列数随 Sheet 而定)。
89
- - **第 2 行(A2)**:统计区间,**中文可读**:`YYYY年M月D日 - YYYY年M月D日`(由 `--start` / `--end` 转换,与样表一致)。
90
- - **第 3 行**:**表头**(列名、顺序须与下表一致)。
91
- - **第 4 行起**:数据行;列宽与自动筛选、首行冻结为可选(样表含 `autoFilter`、部分 Sheet 对数据区设默认**按费用/转化相关列降序**排序,Agent 可复现或省略,**不得**因此改数)。
92
-
93
- ### 百分比与金额(与样表一致)
94
-
95
- - **点击率、转化率、互动率**等列:样表为 **0~1 小数**(例如 7.95% 存 `0.0795`);若写百分比数字列须与运营约定二选一,**禁止**同一文件混用。
96
- - **费用、CPC、每次转化费用、预算**等:与 `references/account-analytics.md` 一致;`campaigns` 中 **`budgetAmount` 为分**,展示为「元」须 **÷100**;同条 `spend`、`averageCpc` 等已为**元**。
90
+ - **R1(A1)**:报告标题(见各 Sheet 表);建议合并单元格横跨该 Sheet R3 表头全部列。
91
+ - **R2(A2)**:统计区间,中文可读:`YYYY年M月D日 - YYYY年M月D日`。
92
+ - **R3**:表头(列名、顺序须与下表一致)。
93
+ - **R4 起**:数据行;列宽、自动筛选、首行冻结、降序排序为可选,**不得**因此改数。
94
+ - **百分比列**:样表为 0~1 小数(如 7.95% 存 `0.08`);与运营约定二选一,**禁止**同一文件混用。
95
+ - **金额**:与 `references/account-analytics.md` 一致;`campaigns.budgetAmount` 为分,展示「元」须 ÷100;`spend`、`averageCpc` 等已为元。
97
96
 
98
97
  ---
99
98
 
@@ -101,22 +100,23 @@ siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-ou
101
100
 
102
101
  | 行 | 内容 |
103
102
  | --- | --- |
104
- | R1 标题 | `广告系列报告`(与样表一致;若运营统一改名,可改文案但须保持 Sheet 名仍为 `账户报告`) |
105
- | R2 | 统计区间(中文日期,见上) |
106
- | R3 表头(A→K,共 11 列) | `广告系列` \| `预算` \| `费用` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `所有转化次数` \| `转化次数` \| `每次转化费用` \| `转化率` |
107
- | R4… | 每行一条广告系列:来自 `campaigns-*.json` 的 `campaignName`、`budgetAmount`(÷100 为元)、`spend`、`impressions`、`clicks`、**`ctr` 直接写入「点击率」(已归一为 0~1 小数)**、`averageCpc`、**`allConversions ` →「所有转化次数」**、**`conversions` →「转化次数」**、`costPerConversion`、**`conversionRate` 直接写入「转化率」(已归一为 0~1 小数)**;若缺 `allConversions ` `conversions`,「所有转化次数」可与「转化次数」同值或填 `0` / `—` 并在脚注说明(以 outline 为准) |
108
- | 末行「合计」 | **广告系列**列填 `总计`;**预算**列填 `--`;**展示 / 点击 / 所有转化次数 / 转化次数 / 费用**等做列求和;**点击率** = 合计点击÷合计展示;**转化率** = 合计转化÷合计点击(**禁止**用合计转化÷合计展示冒充);**每次转化费用** = 合计费用÷合计转化(转化为 0 时填 `—`);禁止对各行比率取算术平均 |
103
+ | R1 | `广告系列报告`(如运营改名,可改文案但 Sheet 名仍为 `账户报告`) |
104
+ | R2 | 统计区间 |
105
+ | R3A→K11 列) | `广告系列` \| `预算` \| `费用` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `所有转化次数` \| `转化次数` \| `每次转化费用` \| `转化率` |
106
+ | R4… | 来自 `campaigns-*.json`:`campaignName`、`budgetAmount`(÷100 为元)、`spend`、`impressions`、`clicks`、`ctr`(已归一直接写入「点击率」)、`averageCpc`、`allConversions`→「所有转化次数」、`conversions`→「转化次数」、`costPerConversion`、`conversionRate`(已归一直接写入「转化率」);缺 `allConversions` 时与「转化次数」同值或填 `0` / `—`,并在脚注说明 |
107
+ | 末行「合计」 | **广告系列**列填 `总计`;**预算**列填 `--`;**展示 / 点击 / 所有转化次数 / 转化次数 / 费用** 做列求和;**点击率** = 合计点击 ÷ 合计展示;**转化率** = 合计转化 ÷ 合计点击(**禁止**用合计转化 ÷ 合计展示);**每次转化费用** = 合计费用 ÷ 合计转化(转化为 0 时填 `—`);禁止对各行比率取算术平均 |
109
108
 
110
- 表下**留白若干行**后写 **「数据复盘」**(与样表一致):
109
+ 表下**留白若干行**后写 **「数据复盘」**:
111
110
 
112
111
  - 首行标题:`{结束日所在月份}月份数据复盘:`(例:`12月份数据复盘:`)。
113
- - 接续 **5 条结构化要点**(每条一行或自动换行,对应样表逻辑):
114
- **1. 账户层级**(整体消耗、展示、点击、点击率与 3% 基准对比、询盘/转化数、平均询盘成本等,数来自 stats/overview 与上表合计);
115
- **2. 关键词层级**(高转化词、高消耗低转化词及出价/竞争力建议);
116
- **3. 搜索字词层级**(标红/高意向词、否词与加词建议);
117
- **4. 设备层级**(基于 **`campaign-device`**:各设备在系列上的消耗/转化分布;复盘可汇总或点出高消耗系列×设备组合);
118
- **5. 国家层级**(基于 **`campaign-geo`**:各国家/地区在系列上的消耗/转化;高消耗/低转化地域与降权/调价建议)。
119
- 文案由 Agent 据 JSON 撰写,**不得编造**表中不存在的数字。
112
+ - 5 条结构化要点:
113
+ 1. **账户层级**:整体消耗、展示、点击、点击率与 3% 基准对比、询盘/转化数、平均询盘成本(数据来自 stats/overview 与上表合计)。
114
+ 2. **关键词层级**:高转化词、高消耗低转化词、出价/竞争力建议。
115
+ 3. **搜索字词层级**:标红/高意向词、否词与加词建议。
116
+ 4. **设备层级**(基于 `campaign-device`):各设备在系列上的消耗/转化分布;可点出高消耗系列×设备组合。
117
+ 5. **国家层级**(基于 `campaign-geo`):各国家/地区在系列上的消耗/转化;高消耗低转化地域与降权/调价建议。
118
+
119
+ 文案由 Agent 据 JSON 撰写,**不得编造**表中不存在的数字。
120
120
 
121
121
  ---
122
122
 
@@ -124,10 +124,10 @@ siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-ou
124
124
 
125
125
  | 行 | 内容 |
126
126
  | --- | --- |
127
- | R1 标题 | `搜索关键字报告` |
128
- | R2 | 统计区间(同 `账户报告`) |
129
- | R3 表头(A→L,共 12 列) | `关键字` \| `匹配类型` \| `广告系列` \| `广告组` \| `费用` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `转化次数` \| `每次转化费用` \| `转化率` |
130
- | R4… | `keywords-*.json` 行映射;`keywordMatchType` → 匹配类型;`campaignName` / `adGroupName` 等按 outline;**`ctr` / `conversionRate` 直接写入「点击率」「转化率」(CLI 已统一归一为 0~1 小数)** |
127
+ | R1 | `搜索关键字报告` |
128
+ | R2 | 统计区间 |
129
+ | R3A→L12 列) | `关键字` \| `匹配类型` \| `广告系列` \| `广告组` \| `费用` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `转化次数` \| `每次转化费用` \| `转化率` |
130
+ | R4… | `keywords-*.json`:`keywordMatchType`→匹配类型;`campaignName` / `adGroupName` 等按 outline;`ctr` / `conversionRate` 已归一,直接写入 |
131
131
 
132
132
  ---
133
133
 
@@ -135,10 +135,10 @@ siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-ou
135
135
 
136
136
  | 行 | 内容 |
137
137
  | --- | --- |
138
- | R1 标题 | `搜索字词报告` |
138
+ | R1 | `搜索字词报告` |
139
139
  | R2 | 统计区间 |
140
- | R3 表头(A→N,共 14 列) | `搜索字词` \| `匹配类型` \| `已添加/已排除` \| `广告系列` \| `广告组` \| `关键字` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` |
141
- | R4… | `search-terms-*.json`;`已添加/已排除` 若 JSON 无此枚举则留空或填「—」,禁止臆造状态;**`ctr` / `conversionRate` 直接写入「点击率」「转化率」(CLI 已统一归一为 0~1 小数)** |
140
+ | R3A→N14 列) | `搜索字词` \| `匹配类型` \| `已添加/已排除` \| `广告系列` \| `广告组` \| `关键字` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` |
141
+ | R4… | `search-terms-*.json`:`已添加/已排除` 若 JSON 无此枚举则留空或填「—」,禁止臆造;`ctr` / `conversionRate` 已归一,直接写入 |
142
142
 
143
143
  ---
144
144
 
@@ -146,10 +146,10 @@ siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-ou
146
146
 
147
147
  | 行 | 内容 |
148
148
  | --- | --- |
149
- | R1 标题 | `设备报告` |
149
+ | R1 | `设备报告` |
150
150
  | R2 | 统计区间 |
151
- | R3 表头(A→M,共 13 列) | `设备` \| `级别` \| `广告系列` \| `出价调整` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `所有转化次数` \| `转化次数` \| `每次转化费用` \| `转化率` |
152
- | R4… | **`campaign-device-*.json`**(`devices[]`):`deviceType` → 设备;`campaignName` / `adGroupName` →「广告系列」等;**`allConversions `(或 outline 中的等价字段)→「所有转化次数」**;`conversions` →「转化次数」;**`ctr` / `conversionRate` 直接写入(已归一为 0~1 小数)**;**出价调整** 无字段则「—」;**级别**列按运营约定(如填 `广告系列` 或 `账户`,全文一致) |
151
+ | R3A→M13 列) | `设备` \| `级别` \| `广告系列` \| `出价调整` \| `展示次数` \| `点击次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `所有转化次数` \| `转化次数` \| `每次转化费用` \| `转化率` |
152
+ | R4… | `campaign-device-*.json`(`devices[]`):`deviceType`→设备;`campaignName` / `adGroupName`→「广告系列」等;`allConversions`→「所有转化次数」;`conversions`→「转化次数」;`ctr` / `conversionRate` 直接写入;**出价调整** 无字段则「—」;**级别**列按运营约定(如填 `广告系列` 或 `账户`,全文一致) |
153
153
 
154
154
  ---
155
155
 
@@ -157,24 +157,16 @@ siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-ou
157
157
 
158
158
  | 行 | 内容 |
159
159
  | --- | --- |
160
- | R1 标题 | `地理位置报告` |
160
+ | R1 | `地理位置报告` |
161
161
  | R2 | 统计区间 |
162
- | R3 表头(A→M,共 13 列) | `地理位置` \| `广告系列` \| `展示次数` \| `互动次数` \| `互动率` \| `费用` \| `平均费用` \| `点击次数` \| `点击率` \| `所有转化次数` \| `转化次数` \| `每次转化费用` \| `转化率` |
163
- | R4… | **`campaign-geo-*.json`**(`countries[]`):`countryOrRegion` → 地理位置;`campaignName` →「广告系列」;**`allConversions `(或等价)→「所有转化次数」**;`conversions` →「转化次数」;**互动次数** → `interactions`;**互动率** → `interactionRate`(字符串须解析)或 `interactions/impressions`(`interactions` 为 0 时互动率填 **`—`**);**平均费用** **必须**为 **`spend / interactions`**,`interactions` 为 0 / null / undefined 时填 **`—`**;**`ctr` / `conversionRate` 直接写入(已归一为 0~1 小数)**;其余列按 outline 映射。 |
164
-
165
- ---
166
-
167
- ## Excel 交付(谁来做)
168
-
169
- 若用户或运营要求交付 **xlsx**:须满足上文**最终 xlsx 版式规范**;实现仍遵守本文开头「架构约定」——**仅**由 Agent 写脚本生成,**无** CLI 内置写表命令。
162
+ | R3A→M13 列) | `地理位置` \| `广告系列` \| `展示次数` \| `互动次数` \| `互动率` \| `费用` \| `平均费用` \| `点击次数` \| `点击率` \| `所有转化次数` \| `转化次数` \| `每次转化费用` \| `转化率` |
163
+ | R4… | `campaign-geo-*.json`(`countries[]`):`countryOrRegion`→地理位置;`campaignName`→「广告系列」;`allConversions`→「所有转化次数」;`conversions`→「转化次数」;**互动次数**→`interactions`;**互动率**→`interactionRate`(字符串须解析)或 `interactions/impressions`,`interactions` 为 0 时填 `—`;**平均费用 必须** = `spend / interactions`,`interactions` 为 0 / null / undefined 时填 `—`;`ctr` / `conversionRate` 直接写入;其余列按 outline 映射 |
170
164
 
171
165
  ---
172
166
 
173
167
  ## 对外客户话术(固定结构,填数来自 JSON)
174
168
 
175
- 首行建议:
176
-
177
- `统计区间:<S> ~ <E>(货币:<币种>)`
169
+ 首行:`统计区间:<S> ~ <E>(货币:<币种>)`
178
170
 
179
171
  正文模板:
180
172
 
@@ -191,29 +183,25 @@ siluzan-tso google-analysis -a <mediaCustomerId> --start <S> --end <E> --json-ou
191
183
  8. 账户余额:<金额+币种>(截至查询时点)
192
184
  ```
193
185
 
194
- **第 3 条**:若 CLI 返回的是**账户整体 CTR**,话术写「整体点击率」而非「搜索点击率」,避免与搜索广告狭义口径冲突;若数据中可区分搜索广告 CTR,再写「搜索点击率」。**百分比数字**:`overview-*.json`(`schemaVersion: 2` 起)的 `ctr` 已是 **0~1 小数**(如 `0.1026`),话术 `x%` 用 `(ctr * 100).toFixed(2) + "%"`,**禁止**直接打印数值得到 "0.1%"。
195
-
196
- **第 1 条「平均每天」**:`区间总消耗 / 区间日历天数`(含起止日),在脚本中计算,禁止手填。
186
+ - **第 1 条「平均每天」**:`区间总消耗 / 区间日历天数`(含起止日),脚本计算,禁止手填。
187
+ - **第 3 条**:CLI 返回的若是账户整体 CTR,写「整体点击率」而非「搜索点击率」;可区分时再写「搜索点击率」。`overview-*.json`(`schemaVersion: 2`)的 `ctr` 已是 0~1 小数(如 `0.10`),话术 `x%` 用 `(ctr * 100).toFixed(2) + "%"`,**禁止**直接打印数值得到 "0.10%"。
188
+ - **所有金额、百分比** 一律 **2 位小数**。
197
189
 
198
190
  ---
199
191
 
200
- ## 复盘小结 + 优化建议(对内或可附在客户邮件末段)
192
+ ## 复盘小结 + 优化建议(对内 / 邮件末段)
201
193
 
202
- 基于同一批 JSON(尤其 `campaigns`、`keywords`、`search-terms`、**`campaign-device`**、**`campaign-geo`**、`overview`):
194
+ 基于同一批 JSON(`campaigns`、`keywords`、`search-terms`、`campaign-device`、`campaign-geo`、`overview`):
203
195
 
204
- - **复盘**:36 条 bullet:消耗集中度、高消耗系列/词、地域与设备差异、CTR/CPC 相对水平。
205
- - **优化建议**:35 条可执行项(预算、否词、落地页、系列状态等),**不额外拉数**;缺数据则标 `[数据不可用:原因]`。
196
+ - **复盘**:3~6 条 bullet:消耗集中度、高消耗系列/词、地域与设备差异、CTR/CPC 相对水平。
197
+ - **优化建议**:3~5 条可执行项(预算、否词、落地页、系列状态等),**不额外拉数**;缺数据则标 `[数据不可用:原因]`。
206
198
 
207
199
  ---
208
200
 
209
201
  ## 与 `google-period-report.md` 的差异
210
202
 
211
- | 项 | 周期报告 `google-period-report.md` | 本文 OKKI 周报 |
212
- | -- | ---------------------------------- | ---------------- |
213
- | 默认维度 | 8 维 + 主动追问可选追加 | **固定** `overview,campaigns,keywords,search-terms,campaign-device,campaign-geo` + `stats` + `balance` |
214
- | 输出形态 | 长文分析报告 | **固定话术** + 短复盘 + **多 Sheet Excel(Agent 脚本写,非 CLI)** |
203
+ | 项 | `google-period-report.md` | 本文 OKKI 周报 |
204
+ | --- | --- | --- |
205
+ | 默认维度 | 8 维 + 主动追问追加 | **固定** `overview,campaigns,keywords,search-terms,campaign-device,campaign-geo` + `stats` + `balance` |
206
+ | 输出形态 | 长文分析报告 | **固定话术** + 短复盘 + **多 Sheet Excel(Agent 脚本写)** |
215
207
  | 典型用户 | 内部分析 | **发客户**的同步简报 |
216
-
217
-
218
-
219
-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-tso-cli",
3
- "version": "1.1.19-beta.10",
3
+ "version": "1.1.19-beta.11",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",