siluzan-tso-cli 1.1.53-beta.1 → 1.1.53-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.
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.53-beta.1),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
54
+ > **注意**:当前为测试版(1.1.53-beta.2),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
55
 
56
56
  | 助手 | 建议 `--ai` |
57
57
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -135189,7 +135189,7 @@ async function runGoogleQuarterlyRender(opts) {
135189
135189
  // src/commands/google-quarterly/register.ts
135190
135190
  function registerGoogleQuarterlyCommands(program2) {
135191
135191
  const root = program2.command("google-quarterly").description("Google \u5B63\u5EA6\u7ECF\u8425\u62A5\u544A\uFF1Acollect \u51FA\u4E8B\u5B9E\uFF0CAgent \u5199 narrative \u540E render HTML");
135192
- const collect = root.command("collect").description("\u62C9\u591A\u5468\u671F google-analysis \u5E76\u5199\u51FA google-quarterly-collect.json\uFF08\u4EC5\u4E8B\u5B9E\uFF09").requiredOption("-a, --account <id>", "Google mediaCustomerId").option("--start <date>", "\u672C\u671F\u5F00\u59CB YYYY-MM-DD\uFF08\u7701\u7565=\u4E0A\u4E00\u5B8C\u6574\u81EA\u7136\u5B63\uFF09").option("--end <date>", "\u672C\u671F\u7ED3\u675F YYYY-MM-DD").option("--inquiries <file>", "\u8FD0\u8425\u8BE2\u76D8 JSON\uFF08items \u6216\u6570\u7EC4\uFF09").option("--inquiry-conversion <name>", "\u65E0\u8BE2\u76D8\u8868\u65F6\u7528\u8BE5\u8F6C\u5316\u52A8\u4F5C\u540D\u79F0\u515C\u5E95").option("--account-name <name>", "\u5C01\u9762\u5BA2\u6237\u540D").option("--currency <code>", "\u8D27\u5E01\u4EE3\u7801").option("--youtube-channel <tokenId>", "CSO YouTube \u5A92\u4F53\u8D26\u53F7 externalTokenId\uFF08\u53EF\u9009\uFF0C\u62C9\u8BA2\u9605\uFF09").option("--keyword-seeds <words>", "Keyword Planner \u79CD\u5B50\u8BCD\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u53EF\u9009\uFF0C\u4E0D\u662F\u884C\u4E1A\u6307\u6570\uFF09").option("--json-out <dir>", "\u843D\u76D8\u76EE\u5F55").option("--token <token>", "JWT").option("--verbose", "\u6253\u5370\u8BF7\u6C42\u8BE6\u60C5");
135192
+ const collect = root.command("collect").description("\u62C9\u591A\u5468\u671F google-analysis \u5E76\u5199\u51FA google-quarterly-collect.json\uFF08\u4EC5\u4E8B\u5B9E\uFF09").requiredOption("-a, --account <id>", "Google mediaCustomerId").option("--start <date>", "\u672C\u671F\u5F00\u59CB YYYY-MM-DD\uFF08\u7701\u7565=\u4E0A\u4E00\u5B8C\u6574\u81EA\u7136\u5B63\uFF09").option("--end <date>", "\u672C\u671F\u7ED3\u675F YYYY-MM-DD").option("--inquiries <file>", "\u8FD0\u8425\u8BE2\u76D8 JSON\uFF08\u6570\u7EC4\u6216 items\uFF09\uFF1B\u7981\u6B62\u4F20 xlsx\uFF0C\u7531 Agent \u5148\u8F6C").option("--inquiry-conversion <name>", "\u65E0\u8BE2\u76D8\u8868\u65F6\u7528\u8BE5\u8F6C\u5316\u52A8\u4F5C\u540D\u79F0\u515C\u5E95").option("--account-name <name>", "\u5C01\u9762\u5BA2\u6237\u540D").option("--currency <code>", "\u8D27\u5E01\u4EE3\u7801").option("--youtube-channel <tokenId>", "CSO YouTube \u5A92\u4F53\u8D26\u53F7 externalTokenId\uFF08\u53EF\u9009\uFF0C\u62C9\u8BA2\u9605\uFF09").option("--keyword-seeds <words>", "Keyword Planner \u79CD\u5B50\u8BCD\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u53EF\u9009\uFF0C\u4E0D\u662F\u884C\u4E1A\u6307\u6570\uFF09").option("--json-out <dir>", "\u843D\u76D8\u76EE\u5F55").option("--token <token>", "JWT").option("--verbose", "\u6253\u5370\u8BF7\u6C42\u8BE6\u60C5");
135193
135193
  collect.action(
135194
135194
  async (opts) => {
135195
135195
  if (!opts.jsonOut?.trim()) {
@@ -121,7 +121,7 @@ siluzan-tso -h
121
121
  | ------------------ | ------ | -------- |
122
122
  | Google 广告账户诊断 / 健康检查(**含账户 ID**) | **P1** | `references/analytics/account-analytics.md` + `report-templates/google-ads-diagnosis.md`(可选对照 `report-templates/google-account-diagnosis-report.md`) |
123
123
  | Google 账户周期 **数据汇总**(只要花费/转化/8 维/Excel;**无**规划/客户版/大族) | **P4** | `report-templates/google-period-report.md` + `references/analytics/account-analytics.md`;Excel 加 `google-period-report-excel.md` |
124
- | Google/谷歌 **月度报告** / **月总结与规划** / **季度报告** / **Q3 汇总** / **Q4 规划** / **季度汇报** / **投放季报** / 客户版 / 大族模板 / 下月规划(效率+区域询盘+国家明细) | **P10** | `report-templates/google-quarterly-report.md`(`google-quarterly collect`+`render`;花费默认 +30%~+50%;**不做**行业数据) |
124
+ | Google/谷歌 **月度报告** / **月总结与规划** / **季度报告** / **Q3 汇总** / **Q4 规划** / **季度汇报** / **投放季报** / 客户版 / 大族模板 / 下月规划(效率+区域询盘+国家明细) | **P10** | `report-templates/google-quarterly-report.md`(询盘载体须先转 JSON 再 `--inquiries`,禁止把 xlsx 丢给 collect;`collect`+`render`;花费默认 +30%~+50%;**不做**行业数据) |
125
125
  | Meta/Facebook 周期或诊断 | **P4-FB** | `report-templates/meta-period-report.md` + `assets/meta-period-report-rules.md` + `references/analytics/facebook-analysis-guide.md` |
126
126
  | TikTok / Bing 周期报告 | **P4** | `references/analytics/account-analytics.md` + 对应 `report-templates/*-period-report.md` |
127
127
  | Yandex 账户分析 / 周期 / 月报 | **P4** | `report-templates/yandex-period-report.md` + `references/analytics/account-analytics.md`;Excel 加 `yandex-period-report-excel.md` |
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.53-beta.1",
4
- "publishedAt": 1789550993140
3
+ "version": "1.1.53-beta.2",
4
+ "publishedAt": 1789552686722
5
5
  }
@@ -30,7 +30,7 @@
30
30
 
31
31
  | 命令 | 选项 | 说明 |
32
32
  | ---- | ---- | ---- |
33
- | google-quarterly collect | --inquiries | 运营询盘 JSON |
33
+ | google-quarterly collect | --inquiries | 运营询盘 **JSON**(数组或 `items`);禁止传 xlsx/csv,由 Agent 先转 |
34
34
  | google-quarterly collect | --inquiry-conversion | 转化动作名称兜底 |
35
35
  | google-quarterly collect | --youtube-channel | 可选;本期报告不展示频道订阅总数 / 来源饼 |
36
36
  | google-quarterly collect | --keyword-seeds | 逗号分隔种子词(Keyword Planner,不是行业指数) |
@@ -323,6 +323,7 @@
323
323
  | P1 / P4 / P10 | 账户 ID | 「请提供 Google 广告账户 ID(mediaCustomerId)。」 |
324
324
  | P1 / P4 | 时间 | 按 `agent-conventions.md` §五 反问区间 |
325
325
  | P10 | 时间 | 季度话术可省略(上一完整季);月度报告 / 下月规划用上一完整月或用户指定月 |
326
+ | P10 | 询盘附件 | 先转 `inquiries.json` 再 `--inquiries`;**禁止**把 xlsx/csv 原文件传给 collect |
326
327
  | P6 | 非 OKKI 话术 | 若用户实际要普通周期报告 → 改 P4 并说明 |
327
328
  | P7 | 无询盘文件 | 贴字段清单,**禁止编造询盘**;若用户只要账户级零转化 → 改 **P3** |
328
329
  | P3(§零·D) | 时间区间 | 按 `agent-conventions.md` §五 反问;巡检默认近 7 天须写明区间 |
@@ -200,7 +200,7 @@
200
200
  - **步骤**:
201
201
  1. 确认账户与区间:季度话术省略日期 → 上一完整自然季;**月度报告 / 下月规划** → 上一完整自然月(或用户指定月)作 `--start/--end`。
202
202
  2. `list-accounts -m Google -k <mediaCustomerId> --json-out ./snap-p10`(取户名、币种)。
203
- 3. 有运营询盘表则整理成 JSON `--inquiries`;没有可加 `--inquiry-conversion <转化动作名>`;再没有询盘位留空并脚注。
203
+ 3. **询盘载体 JSON(CLI 不读 xlsx)**:用户给了 xlsx / csv / 截图 / 粘贴表 → Agent 抽行落盘 `./snap-p10/inquiries.json`(字段见 `google-quarterly-report.md`「询盘入场」)再 `--inquiries`;**禁止**把原始文件传给 collect。无载体可 `--inquiry-conversion <名>`;再没有则询盘位留空,**禁止编造**。
204
204
  4. `google-quarterly collect -a <id> --start <S> --end <D> --json-out ./snap-p10 --account-name "<名>"`(可选 `--keyword-seeds`)。YouTube 广告层用 Ads 视频报表,不拉频道订阅总数 / 来源饼 / 视频类型。
205
205
  5. 读 `google-quarterly-collect.json`,只写 `narrative` 到 `google-quarterly.json`(禁止改 kpis / monthly / planDefaults 数字)。
206
206
  6. 下期规划默认花费 +30%~+50%(用 `planDefaults.spendLow`~`spendHigh`);CPA/询盘目标不自动外推。
@@ -5,6 +5,36 @@
5
5
  >
6
6
  > **触发(命中即 P10,勿改 P4/P9)**:月度报告、月总结与规划、季度报告、Q3 汇总、Q4 规划、季度汇报、投放季报、客户版、大族模板、下月规划;或「效率 + 区域询盘 + 国家明细 + 规划」。用户说月度则 `--start/--end` 用该月(默认上一完整自然月)。
7
7
 
8
+ ## 询盘入场(硬规则)
9
+
10
+ CLI **不读** xlsx / csv / 截图。流程固定三步:
11
+
12
+ 1. 用户给询盘载体(xlsx / csv / 截图 / 粘贴表,格式不限)。
13
+ 2. **Agent** 抽行、归一后落盘 `./snap-p10/inquiries.json`,再 `--inquiries` 传给 collect。
14
+ 3. collect → 只写 `narrative` → `render` 出 HTML。
15
+
16
+ **禁止**把原始 `.xlsx` / `.csv` 传给 `--inquiries`(会 `JSON.parse` 失败)。没有载体:可 `--inquiry-conversion <转化动作名>`;再没有则询盘位留空并脚注。**禁止编造询盘行。**
17
+
18
+ 落盘 JSON:根为数组或 `{ "items": [...] }`。每行至少有国家 +(月份或日期):
19
+
20
+ | 用途 | 接受的键 | 归一 |
21
+ | ---- | -------- | ---- |
22
+ | 国家 | `国家` / `国家(中文)` / `country` / `countryZh` | 英文/缩写先译中文,与 geographic `countryNameZh` 对齐 |
23
+ | 月份 | `月份` / `month` / `ym` | `2026-04` 或 `4月份`(有日期则用日期年) |
24
+ | 日期 | `时间` / `date` / `time` | `YYYY-MM-DD`;Excel 序列号由 Agent 转好 |
25
+ | 产品 | `产品` / `product` | 可选 |
26
+ | 来源 | `客户来源` / `来源` / `source` | 可选 |
27
+
28
+ 样例(字段名任选上表别名):
29
+
30
+ ```json
31
+ [
32
+ { "月份": "4月份", "国家(中文)": "印度", "时间": "2026-04-12", "产品": "协作机器人", "客户来源": "WhatsApp" }
33
+ ]
34
+ ```
35
+
36
+ e2e 对照:`src/commands/google-quarterly/test-fixtures/inquiries-q2-2026.xlsx`(给人看的样表)+ 同目录 `.json`(collect 真入口)。
37
+
8
38
  ## CLI
9
39
 
10
40
  ```bash
@@ -12,8 +42,8 @@ siluzan-tso google-quarterly collect \
12
42
  -a <mediaCustomerId> --start 2023-07-01 --end 2023-09-30 \
13
43
  --json-out ./snap-p10 \
14
44
  --account-name "客户名" \
15
- --inquiries ./inquiries.json # 可选,运营询盘 JSON(Excel mock 见下)
16
- # --inquiry-conversion "表单提交" # 无询盘表时用转化动作名称兜底
45
+ --inquiries ./inquiries.json # 可选;必须是上节 JSON,禁止传 xlsx
46
+ # --inquiry-conversion "表单提交" # 无询盘载体时用转化动作名称兜底
17
47
 
18
48
  # Agent 撰写 ./snap-p10/google-quarterly.json(只含 narrative,勿改 kpis)
19
49
 
@@ -25,11 +55,6 @@ siluzan-tso google-quarterly render \
25
55
 
26
56
  省略 `--start/--end` 时 collect 用上一完整自然季(上海日历)。
27
57
 
28
- e2e / 试跑询盘 mock(Q2 2026,27 条,覆盖欧美/东南亚/印度/印尼/中东/非洲/其他):
29
-
30
- - Excel:`src/commands/google-quarterly/test-fixtures/inquiries-q2-2026.xlsx`(运营表头)
31
- - JSON:同目录 `inquiries-q2-2026.json`(`--inquiries` 直接吃这个;xlsx 需先解析成 JSON)
32
-
33
58
  可选:`--keyword-seeds "a,b"` 走 Keyword Planner(标注数据源,禁止写成行业指数)。**不做**频道订阅总数、订阅来源饼、视频类型(要 YouTube Analytics / 人工分类)。YouTube 广告能拿到的曝光 / TrueView / 完播 / CPV / 频道 ID /(若已关联)广告带来订阅,collect 会写入 `specialAds` + `videosSummary`,render 直接展示。
34
59
 
35
60
  Agent JSON Schema:`assets/google-quarterly-report.schema.json`。
@@ -47,7 +72,7 @@ Agent JSON Schema:`assets/google-quarterly-report.schema.json`。
47
72
  | 字段 | 来源 |
48
73
  | ---- | ---- |
49
74
  | `kpis` / `monthly` | 系列加总;月度来自各月 `campaigns`,不是 daily-metrics |
50
- | `inquiries` | 运营询盘表优先;否则 `--inquiry-conversion`;再否则空,页脚注明口径 |
75
+ | `inquiries` | Agent 转好的 JSON(`--inquiries`)优先;否则 `--inquiry-conversion`;再否则空,页脚注明口径 |
51
76
  | `regions` / `countries` | 询盘按国家归并(印度/印尼单独成桶)+ 花费来自 geographic |
52
77
  | `usStates` / `meta.drillCountry` | 下钻对象=本期花费最高国家;Sammamish `GET …/reports/geo/subdivisions`(`geo_target_state` / `province` / `region`);无分段则回退该国国家行,**不写死美国** |
53
78
  | `specialAds` / `videosSummary` | YouTube 视频名 + Ads 视频指标 → PMax 系列名 → 其他非搜索 → `none`(HTML 隐藏整章)。不做订阅总数 / 来源饼 / 视频类型 |
@@ -5,6 +5,36 @@
5
5
  >
6
6
  > **触发(命中即 P10,勿改 P4/P9)**:月度报告、月总结与规划、季度报告、Q3 汇总、Q4 规划、季度汇报、投放季报、客户版、大族模板、下月规划;或「效率 + 区域询盘 + 国家明细 + 规划」。用户说月度则 `--start/--end` 用该月(默认上一完整自然月)。
7
7
 
8
+ ## 询盘入场(硬规则)
9
+
10
+ CLI **不读** xlsx / csv / 截图。流程固定三步:
11
+
12
+ 1. 用户给询盘载体(xlsx / csv / 截图 / 粘贴表,格式不限)。
13
+ 2. **Agent** 抽行、归一后落盘 `./snap-p10/inquiries.json`,再 `--inquiries` 传给 collect。
14
+ 3. collect → 只写 `narrative` → `render` 出 HTML。
15
+
16
+ **禁止**把原始 `.xlsx` / `.csv` 传给 `--inquiries`(会 `JSON.parse` 失败)。没有载体:可 `--inquiry-conversion <转化动作名>`;再没有则询盘位留空并脚注。**禁止编造询盘行。**
17
+
18
+ 落盘 JSON:根为数组或 `{ "items": [...] }`。每行至少有国家 +(月份或日期):
19
+
20
+ | 用途 | 接受的键 | 归一 |
21
+ | ---- | -------- | ---- |
22
+ | 国家 | `国家` / `国家(中文)` / `country` / `countryZh` | 英文/缩写先译中文,与 geographic `countryNameZh` 对齐 |
23
+ | 月份 | `月份` / `month` / `ym` | `2026-04` 或 `4月份`(有日期则用日期年) |
24
+ | 日期 | `时间` / `date` / `time` | `YYYY-MM-DD`;Excel 序列号由 Agent 转好 |
25
+ | 产品 | `产品` / `product` | 可选 |
26
+ | 来源 | `客户来源` / `来源` / `source` | 可选 |
27
+
28
+ 样例(字段名任选上表别名):
29
+
30
+ ```json
31
+ [
32
+ { "月份": "4月份", "国家(中文)": "印度", "时间": "2026-04-12", "产品": "协作机器人", "客户来源": "WhatsApp" }
33
+ ]
34
+ ```
35
+
36
+ e2e 对照:`src/commands/google-quarterly/test-fixtures/inquiries-q2-2026.xlsx`(给人看的样表)+ 同目录 `.json`(collect 真入口)。
37
+
8
38
  ## CLI
9
39
 
10
40
  ```bash
@@ -12,8 +42,8 @@ siluzan-tso google-quarterly collect \
12
42
  -a <mediaCustomerId> --start 2023-07-01 --end 2023-09-30 \
13
43
  --json-out ./snap-p10 \
14
44
  --account-name "客户名" \
15
- --inquiries ./inquiries.json # 可选,运营询盘 JSON(Excel mock 见下)
16
- # --inquiry-conversion "表单提交" # 无询盘表时用转化动作名称兜底
45
+ --inquiries ./inquiries.json # 可选;必须是上节 JSON,禁止传 xlsx
46
+ # --inquiry-conversion "表单提交" # 无询盘载体时用转化动作名称兜底
17
47
 
18
48
  # Agent 撰写 ./snap-p10/google-quarterly.json(只含 narrative,勿改 kpis)
19
49
 
@@ -25,11 +55,6 @@ siluzan-tso google-quarterly render \
25
55
 
26
56
  省略 `--start/--end` 时 collect 用上一完整自然季(上海日历)。
27
57
 
28
- e2e / 试跑询盘 mock(Q2 2026,27 条,覆盖欧美/东南亚/印度/印尼/中东/非洲/其他):
29
-
30
- - Excel:`src/commands/google-quarterly/test-fixtures/inquiries-q2-2026.xlsx`(运营表头)
31
- - JSON:同目录 `inquiries-q2-2026.json`(`--inquiries` 直接吃这个;xlsx 需先解析成 JSON)
32
-
33
58
  可选:`--keyword-seeds "a,b"` 走 Keyword Planner(标注数据源,禁止写成行业指数)。**不做**频道订阅总数、订阅来源饼、视频类型(要 YouTube Analytics / 人工分类)。YouTube 广告能拿到的曝光 / TrueView / 完播 / CPV / 频道 ID /(若已关联)广告带来订阅,collect 会写入 `specialAds` + `videosSummary`,render 直接展示。
34
59
 
35
60
  Agent JSON Schema:`assets/google-quarterly-report.schema.json`。
@@ -47,7 +72,7 @@ Agent JSON Schema:`assets/google-quarterly-report.schema.json`。
47
72
  | 字段 | 来源 |
48
73
  | ---- | ---- |
49
74
  | `kpis` / `monthly` | 系列加总;月度来自各月 `campaigns`,不是 daily-metrics |
50
- | `inquiries` | 运营询盘表优先;否则 `--inquiry-conversion`;再否则空,页脚注明口径 |
75
+ | `inquiries` | Agent 转好的 JSON(`--inquiries`)优先;否则 `--inquiry-conversion`;再否则空,页脚注明口径 |
51
76
  | `regions` / `countries` | 询盘按国家归并(印度/印尼单独成桶)+ 花费来自 geographic |
52
77
  | `usStates` / `meta.drillCountry` | 下钻对象=本期花费最高国家;Sammamish `GET …/reports/geo/subdivisions`(`geo_target_state` / `province` / `region`);无分段则回退该国国家行,**不写死美国** |
53
78
  | `specialAds` / `videosSummary` | YouTube 视频名 + Ads 视频指标 → PMax 系列名 → 其他非搜索 → `none`(HTML 隐藏整章)。不做订阅总数 / 来源饼 / 视频类型 |
@@ -9,7 +9,7 @@ $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.53-beta.1'
12
+ $PKG_VERSION = '1.1.53-beta.2'
13
13
  $CLI_BIN = 'siluzan-tso'
14
14
  $SKILL_LABEL = 'Siluzan TSO'
15
15
  $INSTALL_CMD = 'npm install -g siluzan-tso-cli@beta'
@@ -9,7 +9,7 @@ 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.53-beta.1"
12
+ readonly PKG_VERSION="1.1.53-beta.2"
13
13
  readonly CLI_BIN="siluzan-tso"
14
14
  readonly SKILL_LABEL="Siluzan TSO"
15
15
  readonly INSTALL_CMD="npm install -g siluzan-tso-cli@beta"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-tso-cli",
3
- "version": "1.1.53-beta.1",
3
+ "version": "1.1.53-beta.2",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",