siluzan-tso-cli 1.1.19-beta.16 → 1.1.19-beta.18

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.16),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
54
+ > **注意**:当前为测试版(1.1.19-beta.18),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
55
 
56
56
  | 助手 | 建议 `--ai` |
57
57
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -4948,110 +4948,215 @@ var init_geo_en2zh = __esm({
4948
4948
  "src/commands/google-analysis/geo-en2zh.json"() {
4949
4949
  geo_en2zh_default = {
4950
4950
  Afghanistan: "\u963F\u5BCC\u6C57",
4951
+ Albania: "\u963F\u5C14\u5DF4\u5C3C\u4E9A",
4951
4952
  Algeria: "\u963F\u5C14\u53CA\u5229\u4E9A",
4953
+ Andorra: "\u5B89\u9053\u5C14",
4954
+ Angola: "\u5B89\u54E5\u62C9",
4955
+ "Antigua & Barbuda": "\u5B89\u63D0\u74DC\u548C\u5DF4\u5E03\u8FBE",
4956
+ "Antigua and Barbuda": "\u5B89\u63D0\u74DC\u548C\u5DF4\u5E03\u8FBE",
4952
4957
  Argentina: "\u963F\u6839\u5EF7",
4958
+ Armenia: "\u4E9A\u7F8E\u5C3C\u4E9A",
4953
4959
  Australia: "\u6FB3\u5927\u5229\u4E9A",
4954
4960
  Austria: "\u5965\u5730\u5229",
4961
+ Azerbaijan: "\u963F\u585E\u62DC\u7586",
4962
+ Bahamas: "\u5DF4\u54C8\u9A6C",
4955
4963
  Bahrain: "\u5DF4\u6797",
4956
4964
  Bangladesh: "\u5B5F\u52A0\u62C9\u56FD",
4965
+ Barbados: "\u5DF4\u5DF4\u591A\u65AF",
4957
4966
  Belarus: "\u767D\u4FC4\u7F57\u65AF",
4958
4967
  Belgium: "\u6BD4\u5229\u65F6",
4968
+ Belize: "\u4F2F\u5229\u5179",
4969
+ Benin: "\u8D1D\u5B81",
4970
+ Bhutan: "\u4E0D\u4E39",
4971
+ Bolivia: "\u73BB\u5229\u7EF4\u4E9A",
4972
+ "Bosnia & Herzegovina": "\u6CE2\u65AF\u5C3C\u4E9A\u548C\u9ED1\u585E\u54E5\u7EF4\u90A3",
4973
+ "Bosnia and Herzegovina": "\u6CE2\u65AF\u5C3C\u4E9A\u548C\u9ED1\u585E\u54E5\u7EF4\u90A3",
4974
+ Botswana: "\u535A\u8328\u74E6\u7EB3",
4959
4975
  Brazil: "\u5DF4\u897F",
4960
4976
  Brunei: "\u6587\u83B1",
4961
4977
  Bulgaria: "\u4FDD\u52A0\u5229\u4E9A",
4962
4978
  "Burkina Faso": "\u5E03\u57FA\u7EB3\u6CD5\u7D22",
4979
+ Burundi: "\u5E03\u9686\u8FEA",
4980
+ "Cabo Verde": "\u4F5B\u5F97\u89D2",
4963
4981
  Cambodia: "\u67EC\u57D4\u5BE8",
4982
+ Cameroon: "\u5580\u9EA6\u9686",
4964
4983
  Canada: "\u52A0\u62FF\u5927",
4984
+ "Central African Republic": "\u4E2D\u975E\u5171\u548C\u56FD",
4985
+ Chad: "\u4E4D\u5F97",
4965
4986
  Chile: "\u667A\u5229",
4966
4987
  China: "\u4E2D\u56FD",
4967
4988
  Colombia: "\u54E5\u4F26\u6BD4\u4E9A",
4989
+ Comoros: "\u79D1\u6469\u7F57",
4990
+ "Costa Rica": "\u54E5\u65AF\u8FBE\u9ECE\u52A0",
4968
4991
  "Cote d'Ivoire": "\u79D1\u7279\u8FEA\u74E6",
4969
4992
  Croatia: "\u514B\u7F57\u5730\u4E9A",
4993
+ Cuba: "\u53E4\u5DF4",
4994
+ Cyprus: "\u585E\u6D66\u8DEF\u65AF",
4970
4995
  Czechia: "\u6377\u514B",
4971
4996
  "Democratic Republic of the Congo": "\u521A\u679C\u6C11\u4E3B\u5171\u548C\u56FD",
4972
4997
  Denmark: "\u4E39\u9EA6",
4998
+ Djibouti: "\u5409\u5E03\u63D0",
4999
+ Dominica: "\u591A\u7C73\u5C3C\u514B",
5000
+ "Dominican Republic": "\u591A\u7C73\u5C3C\u52A0\u5171\u548C\u56FD",
5001
+ Ecuador: "\u5384\u74DC\u591A\u5C14",
4973
5002
  Egypt: "\u57C3\u53CA",
5003
+ "El Salvador": "\u8428\u5C14\u74E6\u591A",
5004
+ "Equatorial Guinea": "\u8D64\u9053\u51E0\u5185\u4E9A",
5005
+ Eritrea: "\u5384\u7ACB\u7279\u91CC\u4E9A",
5006
+ Estonia: "\u7231\u6C99\u5C3C\u4E9A",
5007
+ Eswatini: "\u65AF\u5A01\u58EB\u5170",
4974
5008
  Ethiopia: "\u57C3\u585E\u4FC4\u6BD4\u4E9A",
5009
+ Fiji: "\u6590\u6D4E",
4975
5010
  Finland: "\u82AC\u5170",
4976
5011
  France: "\u6CD5\u56FD",
5012
+ Gabon: "\u52A0\u84EC",
5013
+ Gambia: "\u5188\u6BD4\u4E9A",
4977
5014
  Georgia: "\u683C\u9C81\u5409\u4E9A",
4978
5015
  Germany: "\u5FB7\u56FD",
4979
5016
  Ghana: "\u52A0\u7EB3",
4980
5017
  Greece: "\u5E0C\u814A",
5018
+ Grenada: "\u683C\u6797\u7EB3\u8FBE",
5019
+ Guatemala: "\u5371\u5730\u9A6C\u62C9",
4981
5020
  Guinea: "\u51E0\u5185\u4E9A",
5021
+ "Guinea-Bissau": "\u51E0\u5185\u4E9A\u6BD4\u7ECD",
5022
+ Guyana: "\u572D\u4E9A\u90A3",
5023
+ Haiti: "\u6D77\u5730",
5024
+ Honduras: "\u6D2A\u90FD\u62C9\u65AF",
4982
5025
  "Hong Kong": "\u9999\u6E2F",
4983
5026
  Hungary: "\u5308\u7259\u5229",
5027
+ Iceland: "\u51B0\u5C9B",
4984
5028
  India: "\u5370\u5EA6",
4985
5029
  Indonesia: "\u5370\u5EA6\u5C3C\u897F\u4E9A",
5030
+ Iran: "\u4F0A\u6717",
4986
5031
  Iraq: "\u4F0A\u62C9\u514B",
4987
5032
  Ireland: "\u7231\u5C14\u5170",
4988
5033
  "Isle of Man": "\u9A6C\u6069\u5C9B",
4989
5034
  Israel: "\u4EE5\u8272\u5217",
4990
5035
  Italy: "\u610F\u5927\u5229",
5036
+ Jamaica: "\u7259\u4E70\u52A0",
4991
5037
  Japan: "\u65E5\u672C",
4992
5038
  Johannesburg: "\u7EA6\u7FF0\u5185\u65AF\u5821",
4993
5039
  Jordan: "\u7EA6\u65E6",
4994
5040
  Kazakhstan: "\u54C8\u8428\u514B\u65AF\u5766",
4995
5041
  Kenya: "\u80AF\u5C3C\u4E9A",
5042
+ Kiribati: "\u57FA\u91CC\u5DF4\u65AF",
5043
+ Kosovo: "\u79D1\u7D22\u6C83",
4996
5044
  Kuwait: "\u79D1\u5A01\u7279",
4997
5045
  Kyrgyzstan: "\u5409\u5C14\u5409\u65AF\u65AF\u5766",
4998
5046
  Laos: "\u8001\u631D",
5047
+ Latvia: "\u62C9\u8131\u7EF4\u4E9A",
4999
5048
  Lebanon: "\u9ECE\u5DF4\u5AE9",
5049
+ Lesotho: "\u83B1\u7D22\u6258",
5050
+ Liberia: "\u5229\u6BD4\u91CC\u4E9A",
5000
5051
  Libya: "\u5229\u6BD4\u4E9A",
5052
+ Liechtenstein: "\u5217\u652F\u6566\u58EB\u767B",
5053
+ Lithuania: "\u7ACB\u9676\u5B9B",
5001
5054
  Luxembourg: "\u5362\u68EE\u5821",
5055
+ Macau: "\u6FB3\u95E8",
5056
+ Madagascar: "\u9A6C\u8FBE\u52A0\u65AF\u52A0",
5057
+ Malawi: "\u9A6C\u62C9\u7EF4",
5002
5058
  Malaysia: "\u9A6C\u6765\u897F\u4E9A",
5059
+ Maldives: "\u9A6C\u5C14\u4EE3\u592B",
5003
5060
  Mali: "\u9A6C\u91CC",
5061
+ Malta: "\u9A6C\u8033\u4ED6",
5062
+ "Marshall Islands": "\u9A6C\u7ECD\u5C14\u7FA4\u5C9B",
5004
5063
  Mauritania: "\u6BDB\u91CC\u5854\u5C3C\u4E9A",
5005
5064
  Mauritius: "\u6BDB\u91CC\u6C42\u65AF",
5006
5065
  Mexico: "\u58A8\u897F\u54E5",
5066
+ Micronesia: "\u5BC6\u514B\u7F57\u5C3C\u897F\u4E9A",
5067
+ Moldova: "\u6469\u5C14\u591A\u74E6",
5068
+ Monaco: "\u6469\u7EB3\u54E5",
5069
+ Mongolia: "\u8499\u53E4",
5070
+ Montenegro: "\u9ED1\u5C71",
5007
5071
  Morocco: "\u6469\u6D1B\u54E5",
5072
+ Mozambique: "\u83AB\u6851\u6BD4\u514B",
5008
5073
  "Myanmar (Burma)": "\u7F05\u7538",
5074
+ Namibia: "\u7EB3\u7C73\u6BD4\u4E9A",
5075
+ Nauru: "\u7459\u9C81",
5009
5076
  Nepal: "\u5C3C\u6CCA\u5C14",
5010
5077
  Netherlands: "\u8377\u5170",
5011
5078
  "New Zealand": "\u65B0\u897F\u5170",
5079
+ Nicaragua: "\u5C3C\u52A0\u62C9\u74DC",
5012
5080
  Niger: "\u5C3C\u65E5\u5C14",
5013
5081
  Nigeria: "\u5C3C\u65E5\u5229\u4E9A",
5082
+ "North Korea": "\u671D\u9C9C",
5014
5083
  "North Macedonia": "\u5317\u9A6C\u5176\u987F",
5015
5084
  Norway: "\u632A\u5A01",
5016
5085
  Oman: "\u963F\u66FC",
5017
5086
  Pakistan: "\u5DF4\u57FA\u65AF\u5766",
5087
+ Palau: "\u5E15\u52B3",
5018
5088
  Palestine: "\u5DF4\u52D2\u65AF\u5766",
5089
+ Panama: "\u5DF4\u62FF\u9A6C",
5090
+ "Papua New Guinea": "\u5DF4\u5E03\u4E9A\u65B0\u51E0\u5185\u4E9A",
5091
+ Paraguay: "\u5DF4\u62C9\u572D",
5019
5092
  Peru: "\u79D8\u9C81",
5020
5093
  Philippines: "\u83F2\u5F8B\u5BBE",
5021
5094
  Poland: "\u6CE2\u5170",
5022
5095
  Portugal: "\u8461\u8404\u7259",
5096
+ "Puerto Rico": "\u6CE2\u591A\u9ECE\u5404",
5023
5097
  Qatar: "\u5361\u5854\u5C14",
5024
5098
  "Republic of the Congo": "\u521A\u679C\u5171\u548C\u56FD",
5025
5099
  Romania: "\u7F57\u9A6C\u5C3C\u4E9A",
5026
5100
  Russia: "\u4FC4\u7F57\u65AF",
5101
+ Rwanda: "\u5362\u65FA\u8FBE",
5102
+ "Saint Kitts and Nevis": "\u5723\u57FA\u8328\u548C\u5C3C\u7EF4\u65AF",
5103
+ "Saint Lucia": "\u5723\u5362\u897F\u4E9A",
5104
+ "Saint Vincent and the Grenadines": "\u5723\u6587\u68EE\u7279\u548C\u683C\u6797\u7EB3\u4E01\u65AF",
5105
+ Samoa: "\u8428\u6469\u4E9A",
5106
+ "San Marino": "\u5723\u9A6C\u529B\u8BFA",
5107
+ "S\xE3o Tom\xE9 & Pr\xEDncipe": "\u5723\u591A\u7F8E\u548C\u666E\u6797\u897F\u6BD4",
5108
+ "Sao Tome and Principe": "\u5723\u591A\u7F8E\u548C\u666E\u6797\u897F\u6BD4",
5027
5109
  "Saudi Arabia": "\u6C99\u7279\u963F\u62C9\u4F2F",
5028
5110
  Senegal: "\u585E\u5185\u52A0\u5C14",
5029
5111
  Serbia: "\u585E\u5C14\u7EF4\u4E9A",
5112
+ Seychelles: "\u585E\u820C\u5C14",
5030
5113
  "Sierra Leone": "\u585E\u62C9\u5229\u6602",
5031
5114
  Singapore: "\u65B0\u52A0\u5761",
5032
5115
  Slovakia: "\u65AF\u6D1B\u4F10\u514B",
5033
5116
  Slovenia: "\u65AF\u6D1B\u6587\u5C3C\u4E9A",
5117
+ "Solomon Islands": "\u6240\u7F57\u95E8\u7FA4\u5C9B",
5118
+ Somalia: "\u7D22\u9A6C\u91CC",
5034
5119
  "South Africa": "\u5357\u975E",
5035
5120
  "South Korea": "\u97E9\u56FD",
5121
+ "South Sudan": "\u5357\u82CF\u4E39",
5036
5122
  Spain: "\u897F\u73ED\u7259",
5037
5123
  "Spanish Fork": "Spanish Fork",
5038
5124
  "Sri Lanka": "\u65AF\u91CC\u5170\u5361",
5125
+ "St. Kitts & Nevis": "\u5723\u57FA\u8328\u548C\u5C3C\u7EF4\u65AF",
5126
+ "St. Lucia": "\u5723\u5362\u897F\u4E9A",
5127
+ "St. Vincent & Grenadines": "\u5723\u6587\u68EE\u7279\u548C\u683C\u6797\u7EB3\u4E01\u65AF",
5128
+ Sudan: "\u82CF\u4E39",
5129
+ Suriname: "\u82CF\u91CC\u5357",
5039
5130
  Sweden: "\u745E\u5178",
5040
5131
  Switzerland: "\u745E\u58EB",
5132
+ Syria: "\u53D9\u5229\u4E9A",
5041
5133
  Taiwan: "\u53F0\u6E7E",
5042
5134
  Tajikistan: "\u5854\u5409\u514B\u65AF\u5766",
5043
5135
  Tanzania: "\u5766\u6851\u5C3C\u4E9A",
5044
5136
  Thailand: "\u6CF0\u56FD",
5045
5137
  "Timor-Leste": "\u4E1C\u5E1D\u6C76",
5046
5138
  Togo: "\u591A\u54E5",
5139
+ Tonga: "\u6C64\u52A0",
5140
+ "Trinidad & Tobago": "\u7279\u7ACB\u5C3C\u8FBE\u548C\u591A\u5DF4\u54E5",
5141
+ "Trinidad and Tobago": "\u7279\u7ACB\u5C3C\u8FBE\u548C\u591A\u5DF4\u54E5",
5142
+ Tunisia: "\u7A81\u5C3C\u65AF",
5047
5143
  Turkiye: "\u571F\u8033\u5176",
5144
+ Turkmenistan: "\u571F\u5E93\u66FC\u65AF\u5766",
5145
+ Tuvalu: "\u56FE\u74E6\u5362",
5146
+ Uganda: "\u4E4C\u5E72\u8FBE",
5048
5147
  Ukraine: "\u4E4C\u514B\u5170",
5049
5148
  "United Arab Emirates": "\u963F\u8054\u914B",
5050
5149
  "United Kingdom": "\u82F1\u56FD",
5051
5150
  "United States": "\u7F8E\u56FD",
5151
+ Uruguay: "\u4E4C\u62C9\u572D",
5052
5152
  Uzbekistan: "\u4E4C\u5179\u522B\u514B\u65AF\u5766",
5153
+ Vanuatu: "\u74E6\u52AA\u963F\u56FE",
5154
+ "Vatican City": "\u68B5\u8482\u5188",
5155
+ Venezuela: "\u59D4\u5185\u745E\u62C9",
5053
5156
  Vietnam: "\u8D8A\u5357",
5054
- Yemen: "\u4E5F\u95E8"
5157
+ Yemen: "\u4E5F\u95E8",
5158
+ Zambia: "\u8D5E\u6BD4\u4E9A",
5159
+ Zimbabwe: "\u6D25\u5DF4\u5E03\u97E6"
5055
5160
  };
5056
5161
  }
5057
5162
  });
@@ -55,7 +55,7 @@ Windows 注意:部分 Agent 客户端通过 PowerShell / cmd 代执行命令
55
55
  | `report-templates/report-template.html` | 默认 HTML 报告样式参考 |
56
56
  | `report-templates/okki-weekly-google-client.md` | **OKKI 周报**:固定话术 + 精简维度 CLI 拉数;**Excel 由 Agent 脚本写**(见 P6),无 CLI 内置写表命令 |
57
57
  | `report-templates/google-inquiry-analysis.md` | **Google 询盘分析**:固定话术(`Goog账户询盘分析` 等)→ 严格 3 个月窗口 + 用户上传询盘资料 + 8 Sheet xlsx(见 P7);国家→大洲映射见 `references/geo-continents.json` |
58
- | `references/geo-continents.json` | 国家中文名 → 7 大洲映射(亚洲/中东/欧洲/北美/南美/非洲/大洋洲),供询盘分析 Sheet 3 / Sheet 4 印度切片使用 |
58
+ | `references/geo-continents.json` | 国家中文名 → 7 大洲映射(亚洲/中东/欧洲/北美/南美/非洲/大洋洲),供询盘分析 Sheet 3 大洲透视 / Sheet 4 重点国切片(重点国可配置)使用 |
59
59
 
60
60
  ---
61
61
 
@@ -277,7 +277,7 @@ siluzan-tso accounts-digest -m Google -a id1,id2,... --start <S> --end <D> --jso
277
277
  siluzan-tso google-analysis -a <mediaCustomerId> --start <M3S> --end <M3E> --sections geographic --json-out ./snap-inquiry/m3
278
278
  ```
279
279
  4. **先 outline 后脚本**:与 P6 同纪律。读各 `*.outline.txt` 拿字段结构 → 写聚合脚本读 JSON → 计算 8 Sheet 数据。
280
- 5. **国家 → 大洲映射**:脚本里读 `references/geo-continents.json`,未命中标 `未知大洲` 不阻塞,结尾打印未命中清单。Sheet 4「印度 vs 非印度」切片:直接判断 `countryOrRegionZh === "印度"`,无需走大洲表。
280
+ 5. **国家 → 大洲映射**:脚本里读 `references/geo-continents.json`,未命中标 `未知大洲` 不阻塞,结尾打印未命中清单。Sheet 4「重点国 vs 非重点国」切片:按 `focusCountries`(中文国家名数组,运营未指定时默认取分析月询盘 Top1 国家,详见 `report-templates/google-inquiry-analysis.md`「重点国家配置」节)判桶,无需走大洲表;**禁止**在脚本中硬编码任何具体国家名。
281
281
  6. **必产 8 Sheet xlsx**:版式/Sheet 名/列定义/数值格式以 `report-templates/google-inquiry-analysis.md` 为准;**只能**由 Agent 在当前环境执行脚本(Node `xlsx`/`exceljs`,Python `openpyxl` 均可)生成,**禁止**假设 `siluzan-tso … excel` 这类 CLI 子命令存在。
282
282
  7. 遵守 SKILL 硬规范:金额 `*Display`、`budgetAmount` 是分(÷100)、禁止手填业务数、禁止编造 ID。
283
283
 
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.19-beta.16",
4
- "publishedAt": 1778729294629
3
+ "version": "1.1.19-beta.18",
4
+ "publishedAt": 1778752719300
5
5
  }
@@ -1,195 +1,226 @@
1
1
  {
2
2
  "_meta": {
3
3
  "description": "国家中文名 → 大洲映射,用于 google-inquiry-analysis.md Sheet 3 国家维度透视的「所属大洲」列。",
4
- "buckets": ["亚洲", "中东", "欧洲", "北美", "南美", "非洲", "大洋洲"],
5
- "coverage": "覆盖 tso-cli/src/commands/google-analysis/geo-en2zh.json 的 105 个条目,外加运营样表中出现但未在字典里的常见国家(伊朗、津巴布韦、委内瑞拉、突尼斯、苏丹、阿塞拜疆、立陶宛等)。",
6
- "secondary_merge_hint": "运营常用 5 桶(印度+印尼 / 中东 / 非洲 / 欧美 / 亚洲):由 Agent 脚本在写表前对本字典做二次合并,伪代码见模板「国家 → 大洲映射」节。",
4
+ "buckets": [
5
+ "亚洲",
6
+ "中东",
7
+ "欧洲",
8
+ "北美",
9
+ "南美",
10
+ "非洲",
11
+ "大洋洲"
12
+ ],
13
+ "coverage": "覆盖 ISO 3166-1 主权国家 + 港澳台、巴勒斯坦、马恩岛、波多黎各等常用领土;与 tso-cli/src/commands/google-analysis/geo-en2zh.json 由 scripts/generate-geo-dictionaries.mjs 同步生成;新增国家请在脚本的 ISO_TO_CONTINENT 中加映射后重跑。",
14
+ "secondary_merge_hint": "运营常用 5 桶(<重点国> / 中东 / 非洲 / 欧美 / 亚洲(除重点国)):由 Agent 脚本在写表前对本字典做二次合并;重点国 focusCountries 由运营每次会议前配置(默认取分析月询盘 Top1 国家),伪代码与默认规则见 google-inquiry-analysis.md「国家 → 大洲映射」「重点国家配置」两节。",
7
15
  "unmatched_policy": "未命中标 `未知大洲`,不阻塞;脚本结尾打印未命中清单,运营回流补字典。"
8
16
  },
9
17
 
10
- "中国": "亚洲",
11
- "香港": "亚洲",
12
- "台湾": "亚洲",
13
- "日本": "亚洲",
14
- "韩国": "亚洲",
15
- "蒙古": "亚洲",
16
- "印度": "亚洲",
17
- "印度尼西亚": "亚洲",
18
- "巴基斯坦": "亚洲",
19
- "孟加拉国": "亚洲",
20
- "斯里兰卡": "亚洲",
21
- "尼泊尔": "亚洲",
22
18
  "阿富汗": "亚洲",
23
- "马尔代夫": "亚洲",
19
+ "澳门": "亚洲",
20
+ "巴基斯坦": "亚洲",
24
21
  "不丹": "亚洲",
25
- "新加坡": "亚洲",
26
- "马来西亚": "亚洲",
27
- "泰国": "亚洲",
28
- "越南": "亚洲",
29
- "菲律宾": "亚洲",
30
- "缅甸": "亚洲",
31
- "柬埔寨": "亚洲",
32
- "老挝": "亚洲",
33
- "文莱": "亚洲",
22
+ "朝鲜": "亚洲",
34
23
  "东帝汶": "亚洲",
24
+ "菲律宾": "亚洲",
35
25
  "哈萨克斯坦": "亚洲",
36
- "乌兹别克斯坦": "亚洲",
26
+ "韩国": "亚洲",
37
27
  "吉尔吉斯斯坦": "亚洲",
28
+ "柬埔寨": "亚洲",
29
+ "老挝": "亚洲",
30
+ "马尔代夫": "亚洲",
31
+ "马来西亚": "亚洲",
32
+ "蒙古": "亚洲",
33
+ "孟加拉国": "亚洲",
34
+ "缅甸": "亚洲",
35
+ "尼泊尔": "亚洲",
36
+ "日本": "亚洲",
37
+ "斯里兰卡": "亚洲",
38
38
  "塔吉克斯坦": "亚洲",
39
+ "台湾": "亚洲",
40
+ "泰国": "亚洲",
39
41
  "土库曼斯坦": "亚洲",
42
+ "文莱": "亚洲",
43
+ "乌兹别克斯坦": "亚洲",
44
+ "香港": "亚洲",
45
+ "新加坡": "亚洲",
46
+ "印度": "亚洲",
47
+ "印度尼西亚": "亚洲",
48
+ "越南": "亚洲",
49
+ "中国": "亚洲",
40
50
 
41
- "沙特阿拉伯": "中东",
42
51
  "阿联酋": "中东",
43
- "卡塔尔": "中东",
52
+ "阿曼": "中东",
53
+ "阿塞拜疆": "中东",
54
+ "巴勒斯坦": "中东",
44
55
  "巴林": "中东",
56
+ "格鲁吉亚": "中东",
57
+ "卡塔尔": "中东",
45
58
  "科威特": "中东",
46
- "阿曼": "中东",
47
- "也门": "中东",
48
- "伊朗": "中东",
49
- "伊拉克": "中东",
50
- "约旦": "中东",
51
59
  "黎巴嫩": "中东",
52
- "叙利亚": "中东",
53
- "以色列": "中东",
54
- "巴勒斯坦": "中东",
55
- "土耳其": "中东",
56
60
  "塞浦路斯": "中东",
57
- "阿塞拜疆": "中东",
61
+ "沙特阿拉伯": "中东",
62
+ "土耳其": "中东",
63
+ "叙利亚": "中东",
58
64
  "亚美尼亚": "中东",
59
- "格鲁吉亚": "中东",
65
+ "也门": "中东",
66
+ "伊拉克": "中东",
67
+ "伊朗": "中东",
68
+ "以色列": "中东",
69
+ "约旦": "中东",
60
70
 
61
- "英国": "欧洲",
71
+ "阿尔巴尼亚": "欧洲",
62
72
  "爱尔兰": "欧洲",
63
- "法国": "欧洲",
64
- "德国": "欧洲",
65
- "意大利": "欧洲",
66
- "西班牙": "欧洲",
67
- "葡萄牙": "欧洲",
68
- "荷兰": "欧洲",
69
- "比利时": "欧洲",
70
- "卢森堡": "欧洲",
71
- "瑞士": "欧洲",
73
+ "爱沙尼亚": "欧洲",
74
+ "安道尔": "欧洲",
72
75
  "奥地利": "欧洲",
73
- "希腊": "欧洲",
74
- "瑞典": "欧洲",
75
- "挪威": "欧洲",
76
- "丹麦": "欧洲",
77
- "芬兰": "欧洲",
78
- "冰岛": "欧洲",
79
- "波兰": "欧洲",
80
- "捷克": "欧洲",
81
- "斯洛伐克": "欧洲",
82
- "匈牙利": "欧洲",
83
- "罗马尼亚": "欧洲",
76
+ "白俄罗斯": "欧洲",
84
77
  "保加利亚": "欧洲",
85
- "克罗地亚": "欧洲",
86
- "斯洛文尼亚": "欧洲",
87
- "塞尔维亚": "欧洲",
88
78
  "北马其顿": "欧洲",
79
+ "比利时": "欧洲",
80
+ "冰岛": "欧洲",
81
+ "波兰": "欧洲",
89
82
  "波斯尼亚和黑塞哥维那": "欧洲",
90
- "阿尔巴尼亚": "欧洲",
83
+ "丹麦": "欧洲",
84
+ "德国": "欧洲",
85
+ "俄罗斯": "欧洲",
86
+ "法国": "欧洲",
87
+ "梵蒂冈": "欧洲",
88
+ "芬兰": "欧洲",
89
+ "荷兰": "欧洲",
91
90
  "黑山": "欧洲",
92
- "马耳他": "欧洲",
91
+ "捷克": "欧洲",
92
+ "科索沃": "欧洲",
93
+ "克罗地亚": "欧洲",
94
+ "拉脱维亚": "欧洲",
95
+ "立陶宛": "欧洲",
96
+ "列支敦士登": "欧洲",
97
+ "卢森堡": "欧洲",
98
+ "罗马尼亚": "欧洲",
93
99
  "马恩岛": "欧洲",
94
- "乌克兰": "欧洲",
95
- "白俄罗斯": "欧洲",
96
- "俄罗斯": "欧洲",
100
+ "马耳他": "欧洲",
97
101
  "摩尔多瓦": "欧洲",
98
- "立陶宛": "欧洲",
99
- "拉脱维亚": "欧洲",
100
- "爱沙尼亚": "欧洲",
102
+ "摩纳哥": "欧洲",
103
+ "挪威": "欧洲",
104
+ "葡萄牙": "欧洲",
105
+ "瑞典": "欧洲",
106
+ "瑞士": "欧洲",
107
+ "塞尔维亚": "欧洲",
108
+ "圣马力诺": "欧洲",
109
+ "斯洛伐克": "欧洲",
110
+ "斯洛文尼亚": "欧洲",
111
+ "乌克兰": "欧洲",
112
+ "西班牙": "欧洲",
113
+ "希腊": "欧洲",
114
+ "匈牙利": "欧洲",
115
+ "意大利": "欧洲",
116
+ "英国": "欧洲",
101
117
 
102
- "美国": "北美",
103
- "加拿大": "北美",
104
- "墨西哥": "北美",
118
+ "安提瓜和巴布达": "北美",
119
+ "巴巴多斯": "北美",
120
+ "巴哈马": "北美",
121
+ "巴拿马": "北美",
122
+ "波多黎各": "北美",
123
+ "伯利兹": "北美",
124
+ "多米尼加共和国": "北美",
125
+ "多米尼克": "北美",
126
+ "哥斯达黎加": "北美",
127
+ "格林纳达": "北美",
105
128
  "古巴": "北美",
106
129
  "海地": "北美",
107
- "多米尼加共和国": "北美",
108
- "牙买加": "北美",
109
- "巴哈马": "北美",
110
- "危地马拉": "北美",
111
130
  "洪都拉斯": "北美",
112
- "萨尔瓦多": "北美",
131
+ "加拿大": "北美",
132
+ "美国": "北美",
133
+ "墨西哥": "北美",
113
134
  "尼加拉瓜": "北美",
114
- "哥斯达黎加": "北美",
115
- "巴拿马": "北美",
116
- "波多黎各": "北美",
135
+ "萨尔瓦多": "北美",
136
+ "圣基茨和尼维斯": "北美",
137
+ "圣卢西亚": "北美",
138
+ "圣文森特和格林纳丁斯": "北美",
117
139
  "特立尼达和多巴哥": "北美",
140
+ "危地马拉": "北美",
141
+ "牙买加": "北美",
118
142
 
119
- "巴西": "南美",
120
143
  "阿根廷": "南美",
121
- "智利": "南美",
122
- "秘鲁": "南美",
123
- "哥伦比亚": "南美",
124
- "委内瑞拉": "南美",
125
- "厄瓜多尔": "南美",
126
- "玻利维亚": "南美",
127
- "乌拉圭": "南美",
128
144
  "巴拉圭": "南美",
145
+ "巴西": "南美",
146
+ "玻利维亚": "南美",
147
+ "厄瓜多尔": "南美",
148
+ "哥伦比亚": "南美",
129
149
  "圭亚那": "南美",
150
+ "秘鲁": "南美",
130
151
  "苏里南": "南美",
152
+ "委内瑞拉": "南美",
153
+ "乌拉圭": "南美",
154
+ "智利": "南美",
131
155
 
132
- "埃及": "非洲",
133
- "利比亚": "非洲",
134
- "突尼斯": "非洲",
135
156
  "阿尔及利亚": "非洲",
136
- "摩洛哥": "非洲",
137
- "毛里塔尼亚": "非洲",
138
- "苏丹": "非洲",
139
- "南苏丹": "非洲",
157
+ "埃及": "非洲",
140
158
  "埃塞俄比亚": "非洲",
141
- "肯尼亚": "非洲",
142
- "坦桑尼亚": "非洲",
143
- "乌干达": "非洲",
144
- "卢旺达": "非洲",
159
+ "安哥拉": "非洲",
160
+ "贝宁": "非洲",
161
+ "博茨瓦纳": "非洲",
162
+ "布基纳法索": "非洲",
145
163
  "布隆迪": "非洲",
146
- "索马里": "非洲",
147
- "吉布提": "非洲",
164
+ "赤道几内亚": "非洲",
165
+ "多哥": "非洲",
148
166
  "厄立特里亚": "非洲",
149
- "尼日利亚": "非洲",
150
- "尼日尔": "非洲",
151
- "马里": "非洲",
152
- "布基纳法索": "非洲",
153
- "塞内加尔": "非洲",
167
+ "佛得角": "非洲",
154
168
  "冈比亚": "非洲",
155
- "几内亚比绍": "非洲",
156
- "几内亚": "非洲",
157
- "塞拉利昂": "非洲",
158
- "利比里亚": "非洲",
159
- "科特迪瓦": "非洲",
160
- "加纳": "非洲",
161
- "多哥": "非洲",
162
- "贝宁": "非洲",
163
- "喀麦隆": "非洲",
164
- "中非共和国": "非洲",
165
- "乍得": "非洲",
166
169
  "刚果共和国": "非洲",
167
170
  "刚果民主共和国": "非洲",
171
+ "吉布提": "非洲",
172
+ "几内亚": "非洲",
173
+ "几内亚比绍": "非洲",
174
+ "加纳": "非洲",
168
175
  "加蓬": "非洲",
169
- "赤道几内亚": "非洲",
170
- "圣多美和普林西比": "非洲",
171
- "安哥拉": "非洲",
172
- "赞比亚": "非洲",
173
176
  "津巴布韦": "非洲",
177
+ "喀麦隆": "非洲",
178
+ "科摩罗": "非洲",
179
+ "科特迪瓦": "非洲",
180
+ "肯尼亚": "非洲",
181
+ "莱索托": "非洲",
182
+ "利比里亚": "非洲",
183
+ "利比亚": "非洲",
184
+ "卢旺达": "非洲",
185
+ "马达加斯加": "非洲",
174
186
  "马拉维": "非洲",
187
+ "马里": "非洲",
188
+ "毛里求斯": "非洲",
189
+ "毛里塔尼亚": "非洲",
190
+ "摩洛哥": "非洲",
175
191
  "莫桑比克": "非洲",
176
- "博茨瓦纳": "非洲",
177
192
  "纳米比亚": "非洲",
178
193
  "南非": "非洲",
179
- "莱索托": "非洲",
180
- "斯威士兰": "非洲",
181
- "马达加斯加": "非洲",
182
- "毛里求斯": "非洲",
194
+ "南苏丹": "非洲",
195
+ "尼日尔": "非洲",
196
+ "尼日利亚": "非洲",
197
+ "塞拉利昂": "非洲",
198
+ "塞内加尔": "非洲",
183
199
  "塞舌尔": "非洲",
184
- "科摩罗": "非洲",
200
+ "圣多美和普林西比": "非洲",
201
+ "斯威士兰": "非洲",
202
+ "苏丹": "非洲",
203
+ "索马里": "非洲",
204
+ "坦桑尼亚": "非洲",
205
+ "突尼斯": "非洲",
206
+ "乌干达": "非洲",
185
207
  "约翰内斯堡": "非洲",
208
+ "赞比亚": "非洲",
209
+ "乍得": "非洲",
210
+ "中非共和国": "非洲",
186
211
 
187
212
  "澳大利亚": "大洋洲",
188
- "新西兰": "大洋洲",
189
213
  "巴布亚新几内亚": "大洋洲",
190
214
  "斐济": "大洋洲",
215
+ "基里巴斯": "大洋洲",
216
+ "马绍尔群岛": "大洋洲",
217
+ "密克罗尼西亚": "大洋洲",
218
+ "瑙鲁": "大洋洲",
219
+ "帕劳": "大洋洲",
220
+ "萨摩亚": "大洋洲",
191
221
  "所罗门群岛": "大洋洲",
222
+ "汤加": "大洋洲",
223
+ "图瓦卢": "大洋洲",
192
224
  "瓦努阿图": "大洋洲",
193
- "萨摩亚": "大洋洲",
194
- "汤加": "大洋洲"
225
+ "新西兰": "大洋洲"
195
226
  }
@@ -83,7 +83,7 @@ for month in <S月, S+1月, E月>:
83
83
  - `campaigns`:Sheet 5 主表,含 `biddingStrategyTypeV2`(策略)、`startDate`(开始日期)、`budgetAmount`(**分**,÷100 为元)。
84
84
  - `keywords` / `search-terms`:Sheet 7 / 8;默认 `limit=200`(TOP200)。
85
85
  - `campaign-geo`:含 `campaignName`,用于 Sheet 6「暂停的系列」列辅助派生(若运营不需要可留空);也用于 Sheet 3 国家级消耗 join。
86
- - `geographic`:账户级国家聚合;Sheet 6 月度循环主源;Sheet 4 下半区「印度 vs 非印度」按月切片。
86
+ - `geographic`:账户级国家聚合;Sheet 6 月度循环主源;Sheet 4 下半区「重点国家 vs 非重点国」按月切片(重点国默认取分析月询盘 Top1 国家,可由运营覆盖,详见下文 Sheet 4 节)。
87
87
  - **`countryOrRegionZh`** 中文国家名在 `campaign-geo` / `geographic` 中**自动补字段**(见 `references/account-analytics.md`「中文化字段」);未命中字典时回落英文 `countryOrRegion`。
88
88
 
89
89
  **写脚本前先读 `<section>-<id>.outline.txt`**(几百字节 TS 类型字面量),别直接 `Read` 几 MB 的 JSON。
@@ -119,13 +119,15 @@ for month in <S月, S+1月, E月>:
119
119
 
120
120
  ## 国家 → 大洲映射
121
121
 
122
- - **数据源**:`references/geo-continents.json`(中文国家名 → 7 大洲)。
122
+ - **数据源**:`references/geo-continents.json`(中文国家名 → 7 大洲,覆盖 200+ 主权国家 + 港澳台/巴勒斯坦/马恩岛/波多黎各等领土,由 `tso-cli/scripts/generate-geo-dictionaries.mjs` 与 `geo-en2zh.json` 同步生成;新增国家请加 `ISO_TO_CONTINENT` 映射后跑 `pnpm --filter siluzan-tso-cli run geo:generate`,**不要**手改 JSON)。
123
123
  - **默认 7 桶**:`亚洲` / `中东` / `欧洲` / `北美` / `南美` / `非洲` / `大洋洲`。
124
- - **运营常用 5 桶合并**(与样表 Sheet 3 一致):`印度+印尼` / `中东` / `非洲` / `欧美` / `亚洲(除印度印尼)`。**由脚本在写表前做二次合并**,伪代码:
124
+ - **运营常用 5 桶合并**(与样表 Sheet 3 一致):`<重点国>` / `中东` / `非洲` / `欧美` / `亚洲(除重点国)`。**由脚本在写表前做二次合并**,伪代码:
125
125
 
126
126
  ```javascript
127
- function bucketForSheet3(country, continents) {
128
- if (country === "印度" || country === "印度尼西亚") return "印度+印尼";
127
+ // focusCountries 由运营每次会议前确认(见下方「重点国家配置」节);
128
+ // 单国时桶名 = 国家名(如 "印度");多国时桶名 = 列表拼接(如 "印度+印度尼西亚")。
129
+ function bucketForSheet3(country, continents, focusCountries) {
130
+ if (focusCountries.includes(country)) return focusCountries.join("+");
129
131
  const c = continents[country];
130
132
  if (c === "欧洲" || c === "北美" || c === "南美") return "欧美";
131
133
  return c || "未知";
@@ -151,7 +153,7 @@ for month in <S月, S+1月, E月>:
151
153
 
152
154
  | 顺序 | Sheet 名 | 主源 |
153
155
  | ---: | --- | --- |
154
- | 1 | `会议核心内容` | Agent 复盘(不拉数) |
156
+ | 1 | `会议讨论议题` | Agent Sheet 2~8 提炼议题(不拉数);**含「会后补写区」由运营会后手填决策** |
155
157
  | 2 | `询盘明细---<S月>-<E月>月份` | `inquiries.json` |
156
158
  | 3 | `询盘分析-最近3个月` | `inquiries.json` + `campaign-geo-*.json` |
157
159
  | 4 | `账号分析-最近3个月` | `daily-metrics-*.json`(按月聚合)+ `geographic-*.json` × 3 月 |
@@ -162,14 +164,30 @@ for month in <S月, S+1月, E月>:
162
164
 
163
165
  ---
164
166
 
165
- ### Sheet 1 `会议核心内容`
167
+ ### Sheet 1 `会议讨论议题`
168
+
169
+ > **语义**:Agent 产出的是**会议前数据分析**,**不可能**知道会上讨论了什么 / 决策了什么。本 Sheet 由 Agent 把其他 7 个 Sheet 的**数据异常与机会**提炼成**待讨论议题**,会后由运营手工把决策结论补到「会后补写区」。
170
+ >
171
+ > **口吻硬约束**:议题区**只用**「建议讨论…」「是否…」「Top X 是…,是否…」等开放语气,**禁止**出现「已暂停」「已新增」「决定切换」这类决策口吻;禁止编造未在数据中出现的国家/产品/渠道。
166
172
 
167
173
  | 行 | 内容 |
168
174
  | --- | --- |
169
- | R1 | 一句话总结:`本次会议主要围绕广告投放策略展开,讨论并决策了多个国家的投放暂停、新增及预算调整事宜。`(**Agent 须按本期数据重写**,禁止照搬原样文案) |
170
- | R2 | 4 大块(**Agent 基于其他 7 Sheet 的发现撰写,禁止编造**):<br>① **投放策略调整**:国家层面(暂停/新增/调整哪些国家)/ 产品层面(哪些产品系列要切换 Pmax 等)/ 渠道层面(WhatsApp / info邮箱 等转化表现)<br>② **数据分析与预算**:数据准确性、预算建议(基于 Sheet 4 月趋势 + Sheet 5 系列消耗占比)<br>③ **待办** / 投放策略执行清单<br>④ **风险与下次会议焦点** |
175
+ | R1 | 一句话数据要点(Agent 基于本期 Sheet 2~8 的核心发现概括,例:`本期 3 个月共 {N} 条询盘,{E月} CPL ¥{x}(环比 {±%}),消耗 Top3 国家:{A/B/C},询盘 Top3 国家:{X/Y/Z}。`) |
176
+ | R2 | `议题分类` \| `数据要点(引用具体数字)` \| `候选讨论选项` \| `数据来源` |
177
+ | R3+ | 议题列表(**Agent 基于其他 7 个 Sheet 数据撰写,每条都要带具体数字**),4 大类,每类视数据出 1~3 条: |
178
+ | | ① **国家投放议题**:列出 (a) 消耗 Top + 询盘 Top (b) 高消耗 0 询盘国家 (c) 有询盘但消耗 ≈ 0 的国家;候选选项写「建议讨论:暂停 / 持平 / 加大」三选;数据来源标 `Sheet 3 / Sheet 6` |
179
+ | | ② **产品策略议题**:基于 Sheet 3 产品透视 + Sheet 5 系列;指出 CPL 显著高/低的产品系列;候选选项写「建议讨论:调匹配类型 / 切 Pmax / 暂停」;数据来源标 `Sheet 3 / Sheet 5` |
180
+ | | ③ **渠道与数据采集议题**:基于 Sheet 3 客户来源透视,列出占比 Top1/Top2 渠道;若多渠道字面无法区分(如 `AI Search` / `Info邮箱`),议题写「建议讨论:是否加追踪参数」;数据来源标 `Sheet 3` |
181
+ | | ④ **预算与节奏议题**:基于 Sheet 4 上区月趋势(CPL / CVR / 消耗环比)+ Sheet 5 系列消耗占比,列出预算保持/上调/下调 3 个候选方向,每个方向给出对应的「触发数据」;数据来源标 `Sheet 4 / Sheet 5` |
182
+ | 空 1 行 | — |
183
+ | 标题 | `会后补写区 · 由运营会议结束后手填` |
184
+ | 表头 | `#` \| `决策内容` \| `负责人` \| `截止日期` \| `所属议题(R3+ 行号)` |
185
+ | R… | **留 5~8 空行,Agent 不填**;运营开完会按议题手工补写 |
171
186
 
172
- **禁造数**:每条结论必须能在其他 Sheet 里找到对应数据来源,否则不写。
187
+ **禁造数硬规范**:
188
+ - 议题区每条结论必须能在其他 Sheet 里找到具体数据来源行(标注 Sheet 号),否则不写。
189
+ - **禁止**写「玻利维亚消耗高已暂停」这类肯定句;只能写「玻利维亚消耗 ¥XXX、0 询盘,建议讨论是否暂停」。
190
+ - 「会后补写区」**保持空白**,等运营手填;Agent **不**预填决策。
173
191
 
174
192
  ---
175
193
 
@@ -182,6 +200,18 @@ for month in <S月, S+1月, E月>:
182
200
 
183
201
  按 `month` + `seq` 升序。**不**对询盘做去重 / 校验。
184
202
 
203
+ **`数据质量提示`**(主表下方空 1 行接续;Agent 基于本表数据自动生成,**禁止**编造;纯观察、不带建议口吻):
204
+
205
+ | # | 观察 | 数据依据 |
206
+ | --- | --- | --- |
207
+ | 1 | 询盘总量与月分布 | 3 个月共 `{N}` 条;分月:S月 `{n1}` / 中月 `{n2}` / E月 `{n3}` |
208
+ | 2 | 字段缺失率(IP / 产品 / 客户来源) | `IP` 缺失 `{x}%`、`产品` 缺失 `{y}%`、`客户来源` 缺失 `{z}%`(任一字段缺失率 > 30% 时高亮) |
209
+ | 3 | 重复 IP(同 IP 出现 ≥ 2 条询盘) | `{m}` 条,涉及 `{k}` 个 IP(列出 Top3) |
210
+ | 4 | 国家集中度 | Top1 国家 `{country}` 占 `{p1}%`、Top3 合计 `{p3}%`(> 60% 时高亮"高度集中") |
211
+ | 5 | 询盘时间分布异常 | 若存在单日 ≥ 5 条询盘的"尖峰日",列日期与条数;否则填 `—` |
212
+
213
+ **口径硬约束**:所有 `{...}` 占位符**必须**替换为本期真实数字;某项若数据不足则填 `—`,**禁止**写"约""大概"等模糊词。
214
+
185
215
  ---
186
216
 
187
217
  ### Sheet 3 `询盘分析-最近3个月`
@@ -207,6 +237,19 @@ for month in <S月, S+1月, E月>:
207
237
  `消耗`:产品维度的消耗在 `campaigns-*.json` 中需运营自配「产品 → 系列前缀映射」(见下方「可选:产品 → 系列前缀映射」节)。如未配置,**留空** + 脚注:`[ 数据不可用:未配置产品→系列映射 ]`,**禁止**编造分摊;
208
238
  `CPL` = `消耗 / 询盘个数`,询盘个数为 0 时填 `—`。
209
239
 
240
+ **`Agent 数据洞察`**(4 个透视下方留空 1 行接续;Agent 基于本 Sheet 数据自动生成,**禁止**编造;每条**必带**具体数字):
241
+
242
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
243
+ | --- | --- | --- |
244
+ | 1 | **高消耗 0 询盘国家**(透视 1 交叉) | 列出消耗 > `{阈值}` 但询盘 = 0 的国家清单(按消耗降序,最多 5 个);阈值取本期国家消耗中位数 |
245
+ | 2 | **0 消耗有询盘国家**(透视 1 交叉,可能是自然流量/远端品牌词) | 列出消耗 ≈ 0(< `¥10`)但询盘 ≥ 1 的国家(按询盘降序,最多 5 个) |
246
+ | 3 | **客户来源集中度**(透视 2) | Top1 渠道占 `{p1}%`、Top3 合计 `{p3}%`;> 70% 高亮"渠道高度集中,风险敞口大" |
247
+ | 4 | **长尾渠道**(透视 2) | 占比 < 5% 的渠道数量与合计占比;用于会议讨论"是否归并/精简" |
248
+ | 5 | **产品 CPL 偏差**(透视 3,仅当产品→系列映射已配置) | 列出 CPL > 整体均值 × 1.5 的产品(拖累),CPL < 整体均值 × 0.5 的产品(明星) |
249
+ | 6 | **大洲映射缺漏** | 透视 1 中"所属大洲 = 未知大洲"的国家清单(提示运营回流 `geo-continents.json`) |
250
+
251
+ **条数**:上表 6 条为**完整模板**;若某条数据为空(如未配置产品映射、无大洲缺漏),可省略该行,但其余必出。
252
+
210
253
  ---
211
254
 
212
255
  ### Sheet 4 `账号分析-最近3个月`
@@ -221,12 +264,27 @@ for month in <S月, S+1月, E月>:
221
264
  | R2 | `时间` \| `点击次数` \| `展示次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` \| `询盘个数` \| `CPL` |
222
265
  | R3..R5 | 倒序写 3 个月(**E 月在上**,S 月在下):脚本读 `daily-metrics-*.json` 按月(`date` 前 7 位 `YYYY-MM`)求和;`点击率` = sum(clicks)/sum(impressions);`转化率` = sum(conversions)/sum(clicks);`每次转化费用` = sum(spend)/sum(conversions),转化 0 填 `—`;`询盘个数` = `inquiries.json` 按月 count;`CPL` = sum(spend)/`询盘个数`(询盘 0 填 `—`) |
223
266
 
224
- **下区**(B→G)3 月 × 印度/非印度切片(共 6 行):
267
+ **下区**(B→G)3 月 × **重点国家 / 非重点国** 切片(共 6 行):
268
+
269
+ > **重点国家口径**(`focusCountries`):见下方「重点国家配置」节,**禁止**在模板里写死任何国家名。
225
270
 
226
271
  | R | 内容 |
227
272
  | --- | --- |
228
- | R7 | `时间` \| `国家` \| `消费` \| `线索数` \| `成本` \| 备注列 `此版块非必须` |
229
- | R8..R13 | 每月一对(`印度` / `非印度`):脚本读 `./<YYYY-MM>/geographic-*.json`,按 `countryOrRegionZh === "印度" \|\| countryOrRegion === "India"` 二分;`消费` = 该桶 `spend` 求和;`线索数` = `inquiries.json` 同月同桶(中国/印度国家中文名匹配) count;`成本` = `消费 / 线索数`,线索 0 填 `—` |
273
+ | R7 | `时间` \| `国家` \| `消费` \| `线索数` \| `成本` \| `备注`|
274
+ | R8..R13 | 每月一对(`<focusLabel>` / `非<focusLabel>`,其中 `focusLabel` = `focusCountries.join("+")`):脚本读 `./<YYYY-MM>/geographic-*.json`,按 `focusCountries.includes(countryOrRegionZh) \|\| focusCountries.includes(geoEn2Zh[countryOrRegion])` 二分;`消费` = 该桶 `spend` 求和;`线索数` = `inquiries.json` 同月同桶(按 `country` 字段匹配 `focusCountries`) count;`成本` = `消费 / 线索数`,线索 0 填 `—` |
275
+
276
+ **`Agent 数据洞察`**(下区下方留空 1 行接续;Agent 基于本 Sheet 上 + 下区数据自动生成,**禁止**编造;每条**必带**具体数字):
277
+
278
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
279
+ | --- | --- | --- |
280
+ | 1 | **CPL 月环比**(上区) | E月 CPL `¥{x_E}` vs 中月 `¥{x_M}` vs S月 `¥{x_S}`;E月环比 `{±%}`;幅度 \|`> 30%`\| 高亮"显著波动" |
281
+ | 2 | **CTR / CVR 月环比**(上区) | CTR:`{ctr_E}` / `{ctr_M}` / `{ctr_S}`(趋势 ↑↓→);CVR:`{cvr_E}` / `{cvr_M}` / `{cvr_S}`(趋势 ↑↓→) |
282
+ | 3 | **消耗与询盘相关性**(上区) | 列出 3 个月 `费用` 与 `询盘个数` 的同向 / 反向关系(如"消耗 ↓ 但询盘 ↑"提示效率提升) |
283
+ | 4 | **重点国 vs 非重点国成本差额**(下区) | E月:重点国 CPL `¥{a}` vs 非重点国 `¥{b}`,差额 `{|a-b|}`;若重点国 CPL < 非重点国 CPL × 0.5 高亮"重点国成本显著低于其他市场" |
284
+ | 5 | **重点国线索贡献占比**(下区) | E月重点国线索 `{n}` 条,占总量 `{p}%`;3 个月平均占比 `{avg_p}%`;< 20% 提示"重点国线索贡献低,考虑扩展其他市场" |
285
+ | 6 | **重点国趋势**(下区,3 月对比) | 重点国线索数 / 消耗 / CPL 三个月趋势(如"重点国 CPL 连续 3 月下降"或"消耗稳定线索下降") |
286
+
287
+ **条数**:6 条为完整模板;若 `focusCountries = []`(本期无询盘),仅出第 1~3 条上区洞察,下区 3 条标 `[ 本期无重点国,省略下区洞察 ]`。
230
288
 
231
289
  ---
232
290
 
@@ -263,6 +321,19 @@ for month in <S月, S+1月, E月>:
263
321
 
264
322
  > **月份列用 Excel 日期序列号**还是 `YYYY-MM` 字符串?运营样表用日期序列号(如 `45931`、`46023`);本模板**任选其一**,但**全表统一**;若用字符串则 R1 表头改为 `月份(YYYY-MM)`。
265
323
 
324
+ **`Agent 数据洞察`**(笛卡尔积主表下方留空 1 行接续;Agent 基于本 Sheet 数据自动生成,**禁止**编造):
325
+
326
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
327
+ | --- | --- | --- |
328
+ | 1 | **国家月趋势 · 连续下降** | 列出 `费用` 连续 3 个月下降的国家(S → 中 → E 单调递减),按 E月消耗降序前 5 |
329
+ | 2 | **国家月趋势 · 连续上升** | 列出 `费用` 连续 3 个月上升的国家(S → 中 → E 单调递增),按 E月消耗降序前 5 |
330
+ | 3 | **新进入国家**(E 月有消耗,S 月消耗 = 0) | 列国家、E 月消耗、E 月询盘;提示"本期新铺量国家" |
331
+ | 4 | **退出国家**(S 月有消耗,E 月消耗 = 0) | 列国家、S 月消耗、3 月累计询盘;提示"本期已停投国家,可与暂停系列对照" |
332
+ | 5 | **高消耗 0 询盘国家**(与 Sheet 3 透视 1 交叉验证) | 列 3 月累计 `费用` Top10 中 3 月累计 `询盘个数` = 0 的国家 |
333
+ | 6 | **CPA 异常国家** | 列 3 月平均 `每次转化费用` > 整体平均 × 2 的国家(且转化数 ≥ 3,排除小样本噪声) |
334
+
335
+ **条数**:6 条为完整模板;某类无数据时该行填 `[ 无 ]`,**禁止**省略(保持出表完整)。
336
+
266
337
  ---
267
338
 
268
339
  ### Sheet 7 `关键词`
@@ -275,6 +346,19 @@ for month in <S月, S+1月, E月>:
275
346
 
276
347
  按 `转化` 降序、`消耗` 降序双排序。
277
348
 
349
+ **`Agent 数据洞察`**(关键词主表下方留空 1 行接续;Agent 基于本 Sheet 数据自动生成,**禁止**编造):
350
+
351
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
352
+ | --- | --- | --- |
353
+ | 1 | **匹配方式占比** | `Broad`:`{n_b}` 个、占消耗 `{p_b}%`;`Phrase`:`{n_p}` 个、占消耗 `{p_p}%`;`Exact`:`{n_e}` 个、占消耗 `{p_e}%`;Broad 消耗占比 > 70% 高亮"过度依赖广泛匹配" |
354
+ | 2 | **高消耗 0 转化关键词**(精准止损候选) | 列 `消耗` Top20 中 `转化` = 0 的关键词,按消耗降序前 5;每条标 `关键词` + `匹配方式` + `消耗` |
355
+ | 3 | **CPA 异常关键词**(拖累候选) | 列 `CPA` > 整体平均 × 2 且 `转化` ≥ 2 的关键词,前 5;每条标 `关键词` + `CPA` + `转化数` |
356
+ | 4 | **明星关键词**(性价比候选) | 列 `CPA` < 整体平均 × 0.5 且 `转化` ≥ 3 的关键词,前 5;每条标 `关键词` + `CPA` + `转化数` |
357
+ | 5 | **单关键词消耗集中度** | Top3 关键词合计消耗占比 `{p3}%`;> 50% 高亮"消耗高度集中于少数关键词,风险敞口大" |
358
+ | 6 | **跨系列关键词重复** | 同一 `关键词` + `匹配方式` 出现在 ≥ 2 个 `系列` 中的条目数;提示"内部互抢候选" |
359
+
360
+ **条数**:6 条为完整模板;某类无数据时该行填 `[ 无 ]`。
361
+
278
362
  ---
279
363
 
280
364
  ### Sheet 8 `搜索字词`
@@ -290,6 +374,46 @@ for month in <S月, S+1月, E月>:
290
374
 
291
375
  > **关于"绝对页首展示次数百分比 / 页首展示次数百分比"**:当前 `SearchTermListRow` 类型只显式声明了通用指标,但 `[key: string]: unknown` 兜底使原始字段照常落盘。脚本应读 JSON 原始字段名(实际跑一次确认网关返回字段名,如 `absoluteTopImpressionPercentage` / `topImpressionPercentage`),命中即写、未返回则填 `—`。
292
376
 
377
+ **`Agent 数据洞察`**(搜索字词主表下方留空 1 行接续;Agent 基于本 Sheet 数据自动生成,**禁止**编造):
378
+
379
+ | # | 洞察类别 | 内容(每条引用本 Sheet 具体数字) |
380
+ | --- | --- | --- |
381
+ | 1 | **未添加但高转化搜索词**(候选加为关键词) | 列 `已添加/已排除` ≠ "已添加" 且 `转化次数` ≥ `{阈值}` 的搜索词,按转化降序前 10;阈值取本期搜索词转化中位数 |
382
+ | 2 | **已添加但 0 转化高消耗搜索词**(候选加为否定关键词) | 列 `已添加/已排除` = "已添加" 且 `转化次数` = 0 且 `费用` > `¥{阈值}` 的搜索词,按消耗降序前 10;阈值取本期搜索词消耗 P75 |
383
+ | 3 | **无关搜索词**(意图偏离候选) | 基于 `搜索字词` 文本扫描,标出与广告组 / 关键字 主题明显不符的词(如"工厂"系列出现"价格便宜""免费""教程"等),前 5;**仅展示**,**不**自动判定,由运营会上拍板 |
384
+ | 4 | **匹配方式分布** | `Broad`:`{n_b}` 个、占消耗 `{p_b}%`;`Phrase`:`{n_p}` 个、占消耗 `{p_p}%`;`Exact`:`{n_e}` 个、占消耗 `{p_e}%` |
385
+ | 5 | **页首展示低 / 高消耗搜索词**(仅当 `页首展示次数百分比` 字段可用) | 列 `费用` Top20 中 `页首展示次数百分比` < 50% 的搜索词,前 5;提示"花了钱但很少展示到页首,出价/质量得分待优化" |
386
+
387
+ **条数**:5 条为完整模板;若网关未返回页首展示字段(第 5 条),整行填 `[ 字段不可用 ]`;其余无数据填 `[ 无 ]`。
388
+
389
+ ---
390
+
391
+ ## 重点国家配置(Sheet 3 大洲桶 + Sheet 4 下半区切片共用)
392
+
393
+ `focusCountries` 是一个**中文国家名数组**,决定:
394
+
395
+ 1. Sheet 3 国家透视「所属大洲」列的特殊桶名(如 `印度` / `印度+印度尼西亚` / `美国` …);
396
+ 2. Sheet 4 下半区按月二分的「重点国 / 非重点国」分桶。
397
+
398
+ **取值规则**(按优先级):
399
+
400
+ 1. **运营在会议前显式指定**(最高优先级),例如:
401
+
402
+ ```json
403
+ { "focusCountries": ["印度"] }
404
+ ```
405
+
406
+ 或多国(与样表 Sheet 3「印度+印尼」桶呼应):
407
+
408
+ ```json
409
+ { "focusCountries": ["印度", "印度尼西亚"] }
410
+ ```
411
+
412
+ 2. **默认值(运营未指定时)**:取**分析月(最后一个月 E 月)`inquiries.json` 询盘数 Top1 国家**。脚本在控制台打印一行:`[focusCountry auto-pick] {E月}询盘 Top1 = {国家}({count} 条),如需调整请回填运营配置`。
413
+ 3. **空数组兜底**:若分析月询盘 0 条,`focusCountries = []`;Sheet 3 跳过「重点国」单桶(直接走默认 5 桶里的对应大洲),Sheet 4 下半区**整段省略**并在 Sheet 标题留脚注 `[ 本期无询盘,省略国家切片 ]`。
414
+
415
+ **禁止**:在脚本里硬编码 `"印度"`、`"India"` 等具体国家名作为业务逻辑(仅 `geo-en2zh.json` / `geo-continents.json` 这种字典数据除外)。
416
+
293
417
  ---
294
418
 
295
419
  ## 可选:产品 → 系列前缀映射
@@ -320,7 +444,7 @@ for month in <S月, S+1月, E月>:
320
444
  | 输出形态 | 长文报告 | 客户话术 + 多 Sheet xlsx | **8 Sheet xlsx(不含客户话术)** |
321
445
  | Excel 由谁写 | Agent 脚本(可选) | Agent 脚本 | **Agent 脚本(必需)** |
322
446
  | 大洲映射 | 不涉及 | 不涉及 | **`references/geo-continents.json`** |
323
- | 印度 vs 非印度切片 | 否 | 否 | **是**(Sheet 4 下半区) |
447
+ | 重点国家 vs 非重点国切片 | 否 | 否 | **是**(Sheet 4 下半区,重点国可配置) |
324
448
 
325
449
  ---
326
450
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-tso-cli",
3
- "version": "1.1.19-beta.16",
3
+ "version": "1.1.19-beta.18",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",
@@ -77,6 +77,8 @@
77
77
  "build:prod": "node scripts/write-defaults.mjs --env production && tsup && node scripts/copy-skill-assets.mjs --env production",
78
78
  "build:test": "node scripts/write-defaults.mjs --env test && tsup && node scripts/copy-skill-assets.mjs --env test",
79
79
  "eval:export-cases": "tsx eval/scripts/export-scenarios.mts",
80
+ "geo:generate": "node scripts/generate-geo-dictionaries.mjs",
81
+ "geo:check": "node scripts/generate-geo-dictionaries.mjs --check",
80
82
  "test:ad-read": "node scripts/test-ad-api-read.mjs",
81
83
  "start": "node dist/index.js",
82
84
  "typecheck": "tsc --noEmit -p tsconfig.json"