siluzan-tso-cli 1.1.19 → 1.1.20-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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 非重点国」切片:按 `focusCountries`(中文国家名数组,运营未指定时默认取分析月询盘 Top1 国家,详见 `report-templates/google-inquiry-analysis.md`「重点国家配置」节)判桶,无需走大洲表;**禁止**在脚本中硬编码任何具体国家名。
280
+ 5. **国家 → 大洲映射**:脚本里读 `references/geo-continents.json`,未命中标 `未知大洲` 不阻塞,结尾打印未命中清单。Sheet 3 国家透视 / Sheet 6 国家维度 / Sheet 4 下半区切片**均应按行的 `countryNameZh` 字段聚合**(CLI 已用 Google Ads geotargets 字典自动把 `Mumbai → 印度` / `Davao Region → 菲律宾` 等 city / region 级归并到国家,未命中时回落 `countryOrRegionZh`)。Sheet 4「重点国 vs 非重点国」切片:按 `focusCountries`(中文国家名数组,运营未指定时默认取分析月询盘 Top1 国家,详见 `report-templates/google-inquiry-analysis.md`「重点国家配置」节)判桶,用 `focusCountries.includes(countryNameZh)` 即可;**禁止**在脚本中硬编码任何具体国家名。
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",
4
- "publishedAt": 1778754808006
3
+ "version": "1.1.20-beta.2",
4
+ "publishedAt": 1778828241807
5
5
  }
@@ -7,7 +7,7 @@
7
7
 
8
8
  ## invoice-info — 发票抬头管理
9
9
 
10
- 对应页面:`https://www.siluzan.com/v3/foreign_trade/settings/invoiceInformation`
10
+ 对应页面:`https://www-ci.siluzan.com/v3/foreign_trade/settings/invoiceInformation`
11
11
 
12
12
  发票抬头是开票申请时使用的公司/企业信息模板,支持三种类型:
13
13
 
@@ -133,10 +133,10 @@ siluzan-tso config show
133
133
  **示例:**
134
134
 
135
135
  ```
136
- - 现金充值(单笔):https://www.siluzan.com/recharge/pay
137
- - 现金充值(批量):https://www.siluzan.com/recharge/pay_batch
138
- - 月结充值: https://www.siluzan.com/recharge/accountBillingQuota
139
- - 丝路赞钱包: https://www.siluzan.com/recharge/siluzanWallet
136
+ - 现金充值(单笔):https://www-ci.siluzan.com/recharge/pay
137
+ - 现金充值(批量):https://www-ci.siluzan.com/recharge/pay_batch
138
+ - 月结充值: https://www-ci.siluzan.com/recharge/accountBillingQuota
139
+ - 丝路赞钱包: https://www-ci.siluzan.com/recharge/siluzanWallet
140
140
  ```
141
141
 
142
142
  ---
@@ -84,8 +84,10 @@
84
84
  "德国": "欧洲",
85
85
  "俄罗斯": "欧洲",
86
86
  "法国": "欧洲",
87
+ "法罗群岛": "欧洲",
87
88
  "梵蒂冈": "欧洲",
88
89
  "芬兰": "欧洲",
90
+ "根西岛": "欧洲",
89
91
  "荷兰": "欧洲",
90
92
  "黑山": "欧洲",
91
93
  "捷克": "欧洲",
@@ -108,46 +110,69 @@
108
110
  "圣马力诺": "欧洲",
109
111
  "斯洛伐克": "欧洲",
110
112
  "斯洛文尼亚": "欧洲",
113
+ "斯瓦尔巴和扬马延": "欧洲",
111
114
  "乌克兰": "欧洲",
112
115
  "西班牙": "欧洲",
113
116
  "希腊": "欧洲",
114
117
  "匈牙利": "欧洲",
115
118
  "意大利": "欧洲",
116
119
  "英国": "欧洲",
120
+ "泽西岛": "欧洲",
121
+ "直布罗陀": "欧洲",
117
122
 
123
+ "阿鲁巴": "北美",
124
+ "安圭拉": "北美",
118
125
  "安提瓜和巴布达": "北美",
119
126
  "巴巴多斯": "北美",
120
127
  "巴哈马": "北美",
121
128
  "巴拿马": "北美",
129
+ "百慕大": "北美",
122
130
  "波多黎各": "北美",
123
131
  "伯利兹": "北美",
124
132
  "多米尼加共和国": "北美",
125
133
  "多米尼克": "北美",
134
+ "法属圣马丁": "北美",
126
135
  "哥斯达黎加": "北美",
127
136
  "格林纳达": "北美",
137
+ "格陵兰": "北美",
128
138
  "古巴": "北美",
139
+ "瓜德罗普": "北美",
129
140
  "海地": "北美",
141
+ "荷属加勒比区": "北美",
142
+ "荷属圣马丁": "北美",
130
143
  "洪都拉斯": "北美",
131
144
  "加拿大": "北美",
145
+ "开曼群岛": "北美",
146
+ "库拉索": "北美",
147
+ "马提尼克": "北美",
132
148
  "美国": "北美",
149
+ "美属维尔京群岛": "北美",
150
+ "蒙特塞拉特": "北美",
133
151
  "墨西哥": "北美",
134
152
  "尼加拉瓜": "北美",
135
153
  "萨尔瓦多": "北美",
154
+ "圣巴泰勒米": "北美",
136
155
  "圣基茨和尼维斯": "北美",
137
156
  "圣卢西亚": "北美",
157
+ "圣皮埃尔和密克隆群岛": "北美",
138
158
  "圣文森特和格林纳丁斯": "北美",
159
+ "特克斯和凯科斯群岛": "北美",
139
160
  "特立尼达和多巴哥": "北美",
140
161
  "危地马拉": "北美",
141
162
  "牙买加": "北美",
163
+ "英属维尔京群岛": "北美",
142
164
 
143
165
  "阿根廷": "南美",
144
166
  "巴拉圭": "南美",
145
167
  "巴西": "南美",
146
168
  "玻利维亚": "南美",
147
169
  "厄瓜多尔": "南美",
170
+ "法属圭亚那": "南美",
171
+ "福克兰群岛": "南美",
148
172
  "哥伦比亚": "南美",
149
173
  "圭亚那": "南美",
150
174
  "秘鲁": "南美",
175
+ "南乔治亚和南桑威奇群岛": "南美",
151
176
  "苏里南": "南美",
152
177
  "委内瑞拉": "南美",
153
178
  "乌拉圭": "南美",
@@ -181,10 +206,12 @@
181
206
  "莱索托": "非洲",
182
207
  "利比里亚": "非洲",
183
208
  "利比亚": "非洲",
209
+ "留尼汪": "非洲",
184
210
  "卢旺达": "非洲",
185
211
  "马达加斯加": "非洲",
186
212
  "马拉维": "非洲",
187
213
  "马里": "非洲",
214
+ "马约特": "非洲",
188
215
  "毛里求斯": "非洲",
189
216
  "毛里塔尼亚": "非洲",
190
217
  "摩洛哥": "非洲",
@@ -198,12 +225,15 @@
198
225
  "塞内加尔": "非洲",
199
226
  "塞舌尔": "非洲",
200
227
  "圣多美和普林西比": "非洲",
228
+ "圣赫勒拿": "非洲",
201
229
  "斯威士兰": "非洲",
202
230
  "苏丹": "非洲",
203
231
  "索马里": "非洲",
204
232
  "坦桑尼亚": "非洲",
205
233
  "突尼斯": "非洲",
206
234
  "乌干达": "非洲",
235
+ "西撒哈拉": "非洲",
236
+ "英属印度洋领地": "非洲",
207
237
  "约翰内斯堡": "非洲",
208
238
  "赞比亚": "非洲",
209
239
  "乍得": "非洲",
@@ -211,16 +241,35 @@
211
241
 
212
242
  "澳大利亚": "大洋洲",
213
243
  "巴布亚新几内亚": "大洋洲",
244
+ "北马里亚纳群岛": "大洋洲",
245
+ "法属波利尼西亚": "大洋洲",
214
246
  "斐济": "大洋洲",
247
+ "关岛": "大洋洲",
248
+ "赫德岛和麦克唐纳群岛": "大洋洲",
215
249
  "基里巴斯": "大洋洲",
250
+ "科科斯(基林)群岛": "大洋洲",
251
+ "库克群岛": "大洋洲",
216
252
  "马绍尔群岛": "大洋洲",
253
+ "美国本土外小岛屿": "大洋洲",
254
+ "美属萨摩亚": "大洋洲",
217
255
  "密克罗尼西亚": "大洋洲",
218
256
  "瑙鲁": "大洋洲",
257
+ "纽埃": "大洋洲",
258
+ "诺福克岛": "大洋洲",
219
259
  "帕劳": "大洋洲",
260
+ "皮特凯恩群岛": "大洋洲",
220
261
  "萨摩亚": "大洋洲",
262
+ "圣诞岛": "大洋洲",
221
263
  "所罗门群岛": "大洋洲",
222
264
  "汤加": "大洋洲",
223
265
  "图瓦卢": "大洋洲",
266
+ "托克劳": "大洋洲",
267
+ "瓦利斯和富图纳": "大洋洲",
224
268
  "瓦努阿图": "大洋洲",
225
- "新西兰": "大洋洲"
269
+ "新喀里多尼亚": "大洋洲",
270
+ "新西兰": "大洋洲",
271
+
272
+ "布韦岛": "南极洲",
273
+ "法属南部领地": "南极洲",
274
+ "南极洲": "南极洲"
226
275
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 拓词、竞品网址拓词、词包清洗、否词、建户关键词结构:**先 Read 本文件**,再按需打开 `references/google-ads.md`(命令参数)与 `references/google-ads-rules/google-ads-keyword-strategy.md`(匹配与分组原则)。
4
4
  >
5
- > **数据口径**:`siluzan-tso keyword` 走网关 `keywordidea/google`(关键字创意/体量与竞价参考),可选 `--url` 叠加站内网址拓词服务;与账户内 **`google-analysis` 投放表现**不是同一套数据,文档与回复中须区分「市场参考」与「账户实际花费/转化」。
5
+ > **数据口径**:`siluzan-tso keyword` 走网关 `keywordidea/google`(市场侧关键字创意/体量与竞价参考;后端使用共享 MCC + 缓存全局 OAuth Token,**无需用户绑账户**),可选 `--url` 叠加站内网址拓词服务;与账户内 **`google-analysis` 投放表现**不是同一套数据,文档与回复中须区分「市场参考」与「账户实际花费/转化」。
6
6
 
7
7
  ---
8
8
 
@@ -77,8 +77,8 @@
77
77
 
78
78
  ### 5)高商业意图粗筛(出价 + 竞争度 + 搜索量)
79
79
 
80
- 1. `siluzan-tso keyword --json-out ./snap-kw`
81
- 2. 对落盘 `items` 按 `averageCpc`(JSON 内常为微单位;表格 stdout 已换算展示)、`competition` / `competitionV2`、`montlySearch` 综合排序截断;**勿承诺**「页首出价高位」等 CLI 未文档化字段,除非当次 outline 中明确存在。
80
+ 1. `siluzan-tso keyword -k "..." --json-out ./snap-kw`
81
+ 2. 对落盘 `items` 按 `averageCpc`(JSON 内常为微单位;表格 stdout 已换算展示)、`competition` / `competitionV2`、`montlySearch` 综合排序截断;此外 `lowTopOfPageBidMicros` / `highTopOfPageBidMicros`(页首出价 20/80 分位,**微单位**)可用于评估合理出价区间。
82
82
 
83
83
  ### 6)Campaign → AdGroup → 关键词 映射表 + 匹配建议
84
84
 
@@ -101,4 +101,6 @@
101
101
  siluzan-tso keyword -k "<必填,逗号分隔多词>" [--url <url>] [--include <words>] [--exclude <words>] [--json] [--json-out <dir>] [--verbose]
102
102
  ```
103
103
 
104
+ **返回字段**(与后端 `Samm.Core.Service.KeywordRecommendation` 对齐):`keyword` / `montlySearch` / `averageCpc`(微单位)/ `competition`(0~1 数值)/ `competitionV2`(`Low/Medium/High/Unknown`)/ `keywordPlanCompetitionLevel`(1~4 整数)/ `lowTopOfPageBidMicros` / `highTopOfPageBidMicros`(页首出价 P20/P80,微单位)/ `source`(`"Google"` 或 `"Cgy"`)。后端已按 `keywordPlanCompetitionLevel` 降序排序。
105
+
104
106
  与只读账户关键词列表、否词 CRUD 的对照仍归 **`references/google-ads.md`** 中 `ad keywords` / `ad keyword-*` 各节。
@@ -214,8 +214,8 @@ siluzan-tso report list -m Google --json
214
214
 
215
215
  # 第二步:查看 webUrl
216
216
  siluzan-tso config show
217
- # webUrl: https://www.siluzan.com
217
+ # webUrl: https://www-ci.siluzan.com
218
218
 
219
219
  # 第三步:拼接链接(Google 日报)
220
- # https://www.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
220
+ # https://www-ci.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
221
221
  ```
@@ -10,7 +10,7 @@
10
10
  ## 安装 CLI
11
11
 
12
12
  ```bash
13
- npm install -g siluzan-tso-cli
13
+ npm install -g siluzan-tso-cli@beta
14
14
  ```
15
15
 
16
16
  ---
@@ -64,7 +64,7 @@ siluzan-tso config set --api-key <Key> # 或 config 直接写入
64
64
  siluzan-tso config set --token <Token> # 备用:设置 JWT Token
65
65
  ```
66
66
 
67
- API Key 获取入口:`https://www.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
67
+ API Key 获取入口:`https://www-ci.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
68
68
 
69
69
  ```bash
70
70
  # 第 1 步:让用户报出手机号后,立刻发码(命令立即返回,不会等待输入)
@@ -129,9 +129,9 @@ siluzan-tso config show
129
129
 
130
130
  ```
131
131
  构建环境 : production
132
- apiBaseUrl : https://tso-api.siluzan.com
133
- googleApiUrl : https://googleapi.mysiluzan.com
134
- webUrl : https://www.siluzan.com
132
+ apiBaseUrl : https://tso-api-ci.siluzan.com
133
+ googleApiUrl : https://googleapi-ci.mysiluzan.com
134
+ webUrl : https://www-ci.siluzan.com
135
135
  apiKey : abcd****1234
136
136
  ```
137
137
 
@@ -6,7 +6,7 @@
6
6
 
7
7
  用 `siluzan-tso config show` 读取 **`webUrl`**,再拼接路径:
8
8
 
9
- 首页地址:`https://www.siluzan.com/v3/foreign_trade/tso/home`
9
+ 首页地址:`https://www-ci.siluzan.com/v3/foreign_trade/tso/home`
10
10
 
11
11
  > 若用户已登录 TSO,也可从左侧菜单进入「首页」。
12
12
 
@@ -84,7 +84,10 @@ for month in <S月, S+1月, E月>:
84
84
  - `keywords` / `search-terms`:Sheet 7 / 8;默认 `limit=200`(TOP200)。
85
85
  - `campaign-geo`:含 `campaignName`,用于 Sheet 6「暂停的系列」列辅助派生(若运营不需要可留空);也用于 Sheet 3 国家级消耗 join。
86
86
  - `geographic`:账户级国家聚合;Sheet 6 月度循环主源;Sheet 4 下半区「重点国家 vs 非重点国」按月切片(重点国默认取分析月询盘 Top1 国家,可由运营覆盖,详见下文 Sheet 4 节)。
87
- - **`countryOrRegionZh`** 中文国家名在 `campaign-geo` / `geographic` 中**自动补字段**(见 `references/account-analytics.md`「中文化字段」);未命中字典时回落英文 `countryOrRegion`。
87
+ - **地理字段自动补齐**(由 `translate-fields.ts` `campaign-geo` / `geographic` 行上自动补,未命中字典则不补,详见 `references/account-analytics.md`「中文化字段」):
88
+ - `countryOrRegionZh`:与 `countryOrRegion` **同粒度**的中文翻译(`Mumbai → 孟买` / `India → 印度` / `Davao Region → 达沃地区`)
89
+ - `countryCode`:归并到的 ISO alpha-2 国家代码(`Mumbai → "IN"` / `Davao Region → "PH"` / `India → "IN"`),数据源 Google Ads 官方 geotargets CSV(约 9.5 万条目)
90
+ - `countryNameZh`:归并后的**国家级中文名**(`Mumbai → "印度"` / `Davao Region → "菲律宾"`)。**Sheet 3 国家透视、Sheet 6 国家维度均应按 `countryNameZh` 聚合**,自动把城市/地区行归并到所属国家,不再出现"未知大洲"。
88
91
 
89
92
  **写脚本前先读 `<section>-<id>.outline.txt`**(几百字节 TS 类型字面量),别直接 `Read` 几 MB 的 JSON。
90
93
 
@@ -239,7 +242,7 @@ for month in <S月, S+1月, E月>:
239
242
  表头:`国家(分析月份询盘国家)` \| `询盘个数` \| `所属大洲` \| `消耗`
240
243
  `询盘个数` = `inquiries.json` 按国家 count;
241
244
  `所属大洲` = 按上文「运营常用 5 桶合并」规则;
242
- `消耗` = `campaign-geo-*.json` 按 `countryOrRegionZh` 聚合的 `spend`(同一国家多系列累加);
245
+ `消耗` = `campaign-geo-*.json` 按 **`countryNameZh`** 聚合的 `spend`(同一国家的所有 city / region 行也归并;未命中归并字典时回落 `countryOrRegionZh`);
243
246
  末行 `总计`。
244
247
 
245
248
  2. **客户来源 × 询盘数**(H→I,国家透视下方留空 1 行后接续)
@@ -286,7 +289,7 @@ for month in <S月, S+1月, E月>:
286
289
  | R | 内容 |
287
290
  | --- | --- |
288
291
  | R7 | `时间` \| `国家` \| `消费` \| `线索数` \| `成本` \| `备注`|
289
- | 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 填 `—` |
292
+ | R8..R13 | 每月一对(`<focusLabel>` / `非<focusLabel>`,其中 `focusLabel` = `focusCountries.join("+")`):脚本读 `./<YYYY-MM>/geographic-*.json`,**按 `countryNameZh` 字段判桶**(CLI 已自动归并 city → country;未命中时回落 `countryOrRegionZh`):`focusCountries.includes(countryNameZh)`;`消费` = 该桶 `spend` 求和;`线索数` = `inquiries.json` 同月同桶(按 `country` 字段匹配 `focusCountries`) count;`成本` = `消费 / 线索数`,线索 0 填 `—` |
290
293
 
291
294
  **`Agent 数据洞察`**(**位置**:下区(重点国切片)最末行下方留空 1 行接续,**A 列起**;Agent 基于本 Sheet 上 + 下区数据自动生成,**禁止**编造;每条**必带**具体数字):
292
295
 
@@ -330,7 +333,7 @@ for month in <S月, S+1月, E月>:
330
333
  | R | 内容 |
331
334
  | --- | --- |
332
335
  | R1(A→N,14 列) | `月份(Excel 序列号)` \| `国家/地区(匹配)` \| `点击次数` \| `展示次数` \| `点击率` \| `平均每次点击费用` \| `费用` \| `转化次数` \| `每次转化费用` \| `转化率` \| `询盘个数` \| `(留空)` \| `(留空)` \| `暂停的系列` |
333
- | R2… | 笛卡尔积:`3 个月 × N 个国家`;脚本循环读 `./<YYYY-MM>/geographic-*.json`,每行 `countryOrRegionZh`(回落 `countryOrRegion`)+ 该月该国家的指标;`询盘个数` = `inquiries.json` 同月同国家 count(左 join,缺失为 0);`暂停的系列` 留空给运营手填(不要编造) |
336
+ | R2… | 笛卡尔积:`3 个月 × N 个国家`;脚本循环读 `./<YYYY-MM>/geographic-*.json`,每行**按 `countryNameZh` 聚合**(自动把 `Mumbai / Karachi / London` 等 city / region 行归并到所属国家;未命中归并字典回落 `countryOrRegionZh`)+ 该月该国家的指标;`询盘个数` = `inquiries.json` 同月同国家 count(左 join,缺失为 0);`暂停的系列` 留空给运营手填(不要编造) |
334
337
 
335
338
  排序:按月份升序(与运营样表"45931 / 45962 / 45992 / 46023"顺序一致——分别对应 2025-10 ~ 2026-01 起算的 Excel 日期序列号);同月内按 `点击次数` 降序。
336
339
 
@@ -10,8 +10,8 @@ $ErrorActionPreference = 'Stop'
10
10
  $PKG_NAME = 'siluzan-tso-cli'
11
11
  $CLI_BIN = 'siluzan-tso'
12
12
  $SKILL_LABEL = 'Siluzan TSO'
13
- $INSTALL_CMD = 'npm install -g siluzan-tso-cli'
14
- $WEB_BASE = 'https://www.siluzan.com'
13
+ $INSTALL_CMD = 'npm install -g siluzan-tso-cli@beta'
14
+ $WEB_BASE = 'https://www-ci.siluzan.com'
15
15
 
16
16
  # -- Constants ----------------------------------------------------------------
17
17
  $NODE_MAJOR_MIN = 18
@@ -10,8 +10,8 @@ set -euo pipefail
10
10
  readonly PKG_NAME="siluzan-tso-cli"
11
11
  readonly CLI_BIN="siluzan-tso"
12
12
  readonly SKILL_LABEL="Siluzan TSO"
13
- readonly INSTALL_CMD="npm install -g siluzan-tso-cli"
14
- readonly WEB_BASE="https://www.siluzan.com"
13
+ readonly INSTALL_CMD="npm install -g siluzan-tso-cli@beta"
14
+ readonly WEB_BASE="https://www-ci.siluzan.com"
15
15
 
16
16
  # -- Constants ----------------------------------------------------------------
17
17
  readonly NODE_MAJOR_MIN=18
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-tso-cli",
3
- "version": "1.1.19",
3
+ "version": "1.1.20-beta.2",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",
@@ -79,6 +79,7 @@
79
79
  "eval:export-cases": "tsx eval/scripts/export-scenarios.mts",
80
80
  "geo:generate": "node scripts/generate-geo-dictionaries.mjs",
81
81
  "geo:check": "node scripts/generate-geo-dictionaries.mjs --check",
82
+ "geo:fetch": "node scripts/fetch-google-ads-geo.mjs",
82
83
  "test:ad-read": "node scripts/test-ad-api-read.mjs",
83
84
  "start": "node dist/index.js",
84
85
  "typecheck": "tsc --noEmit -p tsconfig.json"