siluzan-tso-cli 1.1.29-beta.2 → 1.1.29-beta.21

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 (169) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +3174 -867
  3. package/dist/skill/AGENTS.md +30 -31
  4. package/dist/skill/SKILL.md +16 -33
  5. package/dist/skill/_meta.json +2 -2
  6. package/dist/skill/assets/campaign-create-keyword-test.fixed.json +10 -33
  7. package/dist/skill/assets/campaign-create-template.json +2 -0
  8. package/dist/skill/assets/campaign-create-template.md +114 -99
  9. package/dist/skill/assets/market-analysis-rules.md +55 -55
  10. package/dist/skill/assets/meta-period-report-rules.md +61 -60
  11. package/dist/skill/assets/pmax-asset-group-template.json +12 -4
  12. package/dist/skill/assets/pmax-asset-group-template.md +25 -0
  13. package/dist/skill/assets/pmax-brand-assets-template.json +25 -0
  14. package/dist/skill/assets/pmax-brand-assets-template.md +22 -0
  15. package/dist/skill/assets/pmax-brand-guidelines-enable-template.json +24 -0
  16. package/dist/skill/assets/pmax-brand-guidelines-enable-template.md +22 -0
  17. package/dist/skill/assets/pmax-create-template.json +41 -2
  18. package/dist/skill/assets/pmax-create-template.md +84 -51
  19. package/dist/skill/assets/pmax-lead-form-template.json +36 -0
  20. package/dist/skill/assets/pmax-lead-form-template.md +70 -0
  21. package/dist/skill/assets/pmax-signals-template.json +2 -6
  22. package/dist/skill/assets/pmax-whatsapp-template.json +26 -0
  23. package/dist/skill/assets/pmax-whatsapp-template.md +45 -0
  24. package/dist/skill/assets/website-diagnosis-rules.md +67 -67
  25. package/dist/skill/references/README.md +78 -65
  26. package/dist/skill/references/accounts/accounts.md +99 -105
  27. package/dist/skill/references/accounts/finance.md +23 -79
  28. package/dist/skill/references/accounts/open-account-by-media.md +84 -81
  29. package/dist/skill/references/accounts/open-account-google-ui.md +24 -24
  30. package/dist/skill/references/analytics/account-analytics.md +94 -103
  31. package/dist/skill/references/analytics/facebook-analysis-guide.md +61 -61
  32. package/dist/skill/references/analytics/google-analysis-batch.md +2 -2
  33. package/dist/skill/references/analytics/keyword-planner-workflows.md +22 -23
  34. package/dist/skill/references/analytics/market-analysis-guide.md +31 -25
  35. package/dist/skill/references/analytics/rag.md +20 -20
  36. package/dist/skill/references/analytics/reporting.md +4 -4
  37. package/dist/skill/references/analytics/website-diagnosis-guide.md +24 -24
  38. package/dist/skill/references/core/agent-conventions.md +136 -106
  39. package/dist/skill/references/core/cli-enums.md +47 -53
  40. package/dist/skill/references/core/playbooks.md +42 -41
  41. package/dist/skill/references/core/subagent-orchestration.md +40 -40
  42. package/dist/skill/references/core/tips.md +18 -61
  43. package/dist/skill/references/core/workflows.md +36 -29
  44. package/dist/skill/references/google-ads/google-ads-campaign-plan.md +25 -24
  45. package/dist/skill/references/google-ads/google-ads.md +81 -57
  46. package/dist/skill/references/google-ads/pmax-api.md +138 -34
  47. package/dist/skill/references/google-ads/rules/README.md +15 -15
  48. package/dist/skill/references/google-ads/rules/google-ads-account-audit.md +22 -22
  49. package/dist/skill/references/google-ads/rules/google-ads-compliance.md +27 -27
  50. package/dist/skill/references/google-ads/rules/google-ads-keyword-strategy.md +15 -15
  51. package/dist/skill/references/google-ads/rules/google-ads-keyword-taxonomy.md +32 -22
  52. package/dist/skill/references/google-ads/rules/google-ads-launch-plan-template.md +32 -30
  53. package/dist/skill/references/google-ads/rules/google-ads-pmax-guide.md +3 -1
  54. package/dist/skill/references/misc/tso-home.md +8 -8
  55. package/dist/skill/references/operations/clue.md +1 -1
  56. package/dist/skill/references/operations/forewarning.md +1 -1
  57. package/dist/skill/references/operations/hosted-automation-optimize-index.md +2 -2
  58. package/dist/skill/references/operations/hosted-automation-scenarios.md +5 -5
  59. package/dist/skill/references/operations/hosted-automation-self-control.md +15 -15
  60. package/dist/skill/references/operations/hosted-automation-user-catalog.md +13 -13
  61. package/dist/skill/references/operations/optimize.md +8 -8
  62. package/dist/skill/references/report-templates/README.md +45 -0
  63. package/dist/skill/references/report-templates/REPORT-WORKFLOW.md +114 -0
  64. package/dist/skill/references/report-templates/bing-period-report.md +65 -0
  65. package/dist/skill/references/report-templates/google-account-diagnosis-report.md +83 -0
  66. package/dist/skill/references/report-templates/google-ads-diagnosis.md +378 -0
  67. package/dist/skill/references/report-templates/google-inquiry-analysis.md +543 -0
  68. package/dist/skill/references/report-templates/google-period-report-excel.md +126 -0
  69. package/dist/skill/references/report-templates/google-period-report.md +60 -0
  70. package/dist/skill/references/report-templates/market-analysis-report.md +40 -0
  71. package/dist/skill/references/report-templates/meta-account-diagnosis-report.md +74 -0
  72. package/dist/skill/references/report-templates/meta-period-report-excel.md +230 -0
  73. package/dist/skill/references/report-templates/meta-period-report.md +219 -0
  74. package/dist/skill/references/report-templates/okki-weekly-google-client.md +217 -0
  75. package/dist/skill/references/report-templates/tiktok-period-report.md +56 -0
  76. package/dist/skill/references/report-templates/website-diagnosis-report.md +79 -0
  77. package/dist/skill/report-templates/README.md +16 -14
  78. package/dist/skill/report-templates/REPORT-WORKFLOW.md +13 -13
  79. package/dist/skill/report-templates/google-account-diagnosis-report.md +1 -1
  80. package/dist/skill/report-templates/google-ads-diagnosis.md +21 -21
  81. package/dist/skill/report-templates/google-inquiry-analysis.md +44 -44
  82. package/dist/skill/report-templates/google-period-report-excel.md +24 -24
  83. package/dist/skill/report-templates/google-period-report.md +23 -23
  84. package/dist/skill/report-templates/market-analysis-report.md +1 -1
  85. package/dist/skill/report-templates/meta-period-report-excel.md +72 -64
  86. package/dist/skill/report-templates/meta-period-report.html +706 -428
  87. package/dist/skill/report-templates/meta-period-report.md +61 -60
  88. package/dist/skill/report-templates/okki-weekly-google-client.md +26 -26
  89. package/dist/skill/report-templates/report-template-academic.html +1 -1
  90. package/dist/skill/report-templates/report-template-dark.html +1 -1
  91. package/dist/skill/report-templates/report-template-formal.html +1 -1
  92. package/dist/skill/report-templates/report-template-mobile.html +1 -1
  93. package/dist/skill/report-templates/report-template-onepager.html +1 -1
  94. package/dist/skill/report-templates/report-template-print.html +1 -1
  95. package/dist/skill/report-templates/report-template.html +1 -1
  96. package/dist/skill/report-templates/website-diagnosis-report.html +1731 -1653
  97. package/dist/skill/report-templates/website-diagnosis-report.md +21 -23
  98. package/dist/skill/scripts/install.ps1 +1 -1
  99. package/dist/skill/scripts/install.sh +1 -1
  100. package/dist/skill/snippets/handoff-p7-inquiry.md +5 -5
  101. package/eval/cases/accounts-entityid-vs-mediaccustomerid.scenario.json +2 -14
  102. package/eval/cases/accounts-mcc-bind-inquiry.scenario.json +1 -3
  103. package/eval/cases/accounts-single-balance-not-bulk.scenario.json +3 -14
  104. package/eval/cases/budget-display-not-raw-micros.scenario.json +1 -8
  105. package/eval/cases/clue-meta-leads-json.scenario.json +2 -14
  106. package/eval/cases/clue-tiktok-leads-json.scenario.json +2 -11
  107. package/eval/cases/destructive-account-delink-needs-confirm.scenario.json +3 -9
  108. package/eval/cases/destructive-forewarning-delete-needs-confirm.scenario.json +3 -9
  109. package/eval/cases/destructive-invoice-apply-needs-confirm.scenario.json +3 -9
  110. package/eval/cases/facebook-analysis-google-section-aliases.scenario.json +2 -11
  111. package/eval/cases/facebook-analysis-not-google-keywords.scenario.json +3 -10
  112. package/eval/cases/facebook-analysis-period-default.scenario.json +2 -14
  113. package/eval/cases/finance-invoice-info-list.scenario.json +3 -11
  114. package/eval/cases/forewarning-list-google.scenario.json +3 -14
  115. package/eval/cases/google-ads-no-structural-without-confirm.scenario.json +2 -6
  116. package/eval/cases/google-analysis-keywords-route.scenario.json +2 -14
  117. package/eval/cases/human-p1-multiturn.scenario.json +1 -5
  118. package/eval/cases/meta-single-balance-not-bulk.scenario.json +3 -17
  119. package/eval/cases/no-legacy-json-flag.scenario.json +2 -6
  120. package/eval/cases/open-account-google-noninteractive.scenario.json +1 -3
  121. package/eval/cases/open-account-tiktok-license-file.scenario.json +1 -3
  122. package/eval/cases/optimize-list-by-account.scenario.json +3 -11
  123. package/eval/cases/p1-single-account-profile.scenario.json +1 -11
  124. package/eval/cases/p2-balance-scan-bulk.scenario.json +2 -9
  125. package/eval/cases/p3-accounts-digest.scenario.json +1 -5
  126. package/eval/cases/p4-fb-meta-period-report.scenario.json +2 -12
  127. package/eval/cases/p4-period-report-window.scenario.json +1 -8
  128. package/eval/cases/pmax-asset-group-create-with-bg.scenario.json +15 -0
  129. package/eval/cases/pmax-brand-edit-routing.scenario.json +12 -0
  130. package/eval/cases/pmax-edit-not-campaign-edit.scenario.json +15 -0
  131. package/eval/cases/pmax-enable-brand-guidelines.scenario.json +15 -0
  132. package/eval/cases/pmax-no-assets-update-brand-fields.scenario.json +12 -0
  133. package/eval/cases/rag-before-keyword-expand.scenario.json +1 -11
  134. package/eval/cases/rag-list-then-query.scenario.json +2 -14
  135. package/eval/cases/report-list-google.scenario.json +2 -11
  136. package/eval/cases/report-push-list-google.scenario.json +2 -11
  137. package/eval/cases/setup-login-or-env.scenario.json +1 -3
  138. package/eval/cases/setup-siluzan-data-permission-env.scenario.json +1 -3
  139. package/eval/cases/tiktok-bc-bind-inquiry.scenario.json +2 -6
  140. package/eval/cases/time-range-user-delegates-default.scenario.json +1 -8
  141. package/eval/cases/tips-json-out-filtering.scenario.json +1 -3
  142. package/eval/cases/tips-large-json-pagination.scenario.json +1 -3
  143. package/eval/cases/uj-ad-campaign-validate-before-create-stub.scenario.json +2 -11
  144. package/eval/cases/uj-ad-outdoor-campgear-search-plan.scenario.json +1 -3
  145. package/eval/cases/uj-analytics-30d-pdf-campaign-device-geo.scenario.json +6 -18
  146. package/eval/cases/uj-analytics-compare-google-tiktok-last-month-roi.scenario.json +1 -8
  147. package/eval/cases/uj-analytics-google-weekly-trends-campaigns-keywords.scenario.json +2 -11
  148. package/eval/cases/uj-analytics-report-push-weekly-email.scenario.json +1 -3
  149. package/eval/cases/uj-finance-invoice-records-this-month.scenario.json +2 -11
  150. package/eval/cases/uj-life-newbie-siluzan-google-end-to-end.scenario.json +1 -4
  151. package/eval/cases/uj-ops-google-accounts-list-normal.scenario.json +2 -17
  152. package/eval/cases/uj-ops-google-yesterday-spend-conversions.scenario.json +2 -14
  153. package/eval/cases/uj-ops-pause-worst-adgroup-confirm.scenario.json +2 -6
  154. package/eval/cases/uj-ops-tiktok-leads-last-week.scenario.json +3 -17
  155. package/eval/cases/uj-patrol-cpc-spike-adgroups-over-15.scenario.json +1 -5
  156. package/eval/cases/uj-patrol-forewarning-create-daily-cap-3000.scenario.json +1 -3
  157. package/eval/cases/uj-patrol-forewarning-trigger-records.scenario.json +3 -17
  158. package/eval/cases/uj-patrol-google-balances-low.scenario.json +2 -11
  159. package/eval/cases/uj-roi-optimize-records-then-execute-cautiously.scenario.json +3 -14
  160. package/eval/cases/uj-roi-search-terms-add-negative-keywords.scenario.json +2 -14
  161. package/eval/stub-fixtures/facebook-analysis.json +24 -4
  162. package/eval/stub-fixtures/meta-overview.json +4 -1
  163. package/eval/stub-fixtures/pmax-asset-group-create-ok.json +12 -0
  164. package/eval/stub-fixtures/pmax-brand-assets-edit-ok.json +11 -0
  165. package/eval/stub-fixtures/pmax-brand-guidelines-enable-ok.json +11 -0
  166. package/eval/stub-fixtures/pmax-edit-ok.json +11 -0
  167. package/eval/stub-fixtures/pmax-get-bg-on.json +20 -0
  168. package/package.json +1 -1
  169. package/dist/skill/references/core/deliverable-preflight.md +0 -109
@@ -4,16 +4,17 @@
4
4
 
5
5
  ---
6
6
 
7
- | 轨 | 条件 | 动作 |
8
- |----|------|------|
7
+ | 轨 | 条件 | 动作 |
8
+ | ------------ | ---------------------------------------- | ------------------------------------------------------------------------ |
9
9
  | **直读直写** | 用户已给账户/预算/组/词/RSA 等结构化数据 | 通过代码转换为 campaign-create直接可用的 JSON → validate → 确认 → create |
10
- | **方案先行** | 无完整结构,或要求「先出方案」 | 读本文件 + 必读规则 → 生成 JSON → validate → Markdown → 确认 → create |
10
+ | **方案先行** | 无完整结构,或要求「先出方案」 | 读本文件 + 必读规则 → 生成 JSON → validate → Markdown → 确认 → create |
11
11
 
12
12
  **硬约束**
13
13
 
14
14
  - 可执行真相只有 **JSON**(`assets/campaign-create-template.json` 同构);Markdown 只读投影。
15
+ - **Agent Read 顺序(建系列前必做)**:① `assets/campaign-create-template.json`(复制/改写的结构真相源)→ ② `assets/campaign-create-template.md`(字段说明与踩坑)。**禁止**只读 `.md` 凭印象拼 JSON。
15
16
  - 改需求 **只改 JSON**,再 `campaign-validate`,再刷新 Markdown。
16
- - **PMax 系列创建**走独立流水线(勿用本文件 JSON 模板):`assets/pmax-create-template.md` + `ad pmax-validate` / `ad pmax-create`;运营诊断见 `google-ads/rules/google-ads-pmax-guide.md`。
17
+ - **PMax 系列创建**走独立流水线(勿用本文件 JSON 模板):**先 Read `assets/pmax-create-template.json`** + `assets/pmax-create-template.md` + `ad pmax-validate` / `ad pmax-create`;**Lead Gen/B2B 方案默认含 `campaignExtensions.leadForm`**(方案 Markdown 须单列表单);运营诊断见 `google-ads/rules/google-ads-pmax-guide.md`。
17
18
  - 搜索网络:仅 Google 搜索(`TargetSearchNetwork`/`TargetContentNetwork`/`TargetPartnerSearchNetwork` 均为 false)。
18
19
 
19
20
  ---
@@ -24,8 +25,8 @@
24
25
  |----|------|-----------|
25
26
  | 1 | `list-accounts` 锁定 `account` / `customerName` / 币种 | `references/accounts/currency.md` |
26
27
  | 2 | 可选 `rag query`;`keyword` / `keyword geo-list` 拓词 | `references/analytics/keyword-planner-workflows.md` |
27
- | 3 | 按分层规则写入 `KeywordsForBatchJob`(Exact/Phrase/Broad | `google-ads/rules/google-ads-keyword-taxonomy.md`(参考,非 CLI 强制) |
28
- | 4 | `campaign`(预算/出价/地域/否词≥20/RSA/附加信息) | `assets/campaign-create-template.md` |
28
+ | 3 | 按分层规则写入 `KeywordsForBatchJob`(Exact/Phrase/Broad);**否词单独写** `NegativeKeywordsForBatchJob`(勿与正向词混放) | `google-ads/rules/google-ads-keyword-taxonomy.md`(参考,非 CLI 强制) |
29
+ | 4 | 复制 `campaign-create-template.json` 并填 `campaign`(预算/出价/地域/否词≥20/RSA/附加信息) | **`assets/campaign-create-template.json`** + `assets/campaign-create-template.md` |
29
30
  | 5 | **`ad campaign-validate --config-file <json>`**(失败只改 JSON;超长见下文「超长人工确认」) | 下文「校验」 |
30
31
  | 6 | 输出:**JSON 代码块** → **Markdown**(`google-ads-launch-plan-template.md` 正文)→ 待确认 | — |
31
32
  | 7 | 用户确认后 **`ad campaign-create`** | `google-ads/google-ads.md`|
@@ -43,28 +44,28 @@
43
44
 
44
45
  ### 必读(出方案前)
45
46
 
46
- | 文档 | 用途 |
47
- |------|------|
48
- | `google-ads/rules/google-ads-keyword-taxonomy.md` | 核心/长尾与匹配块**建议**(Agent 参考,CLI 不强制) |
49
- | `google-ads/rules/google-ads-compliance.md` | 词与文案合规 |
50
- | `google-ads/rules/sensitive-industries.md` | 敏感行业(若相关) |
51
- | `google-ads/rules/google-ads-launch-plan-template.md` | 用户可见 Markdown 结构与 RSA/否词表 |
47
+ | 文档 | 用途 |
48
+ | ------------------------------------------------------ | --------------------------------------------------------------- |
49
+ | `google-ads/rules/google-ads-keyword-taxonomy.md` | 核心/长尾与匹配块**建议**(Agent 参考,CLI 不强制) |
50
+ | `google-ads/rules/google-ads-compliance.md` | 词与文案合规 |
51
+ | `google-ads/rules/sensitive-industries.md` | 敏感行业(若相关) |
52
+ | `google-ads/rules/google-ads-launch-plan-template.md` | 用户可见 Markdown 结构与 RSA/否词表 |
52
53
  | `google-ads/rules/google-ads-creative-optimization.md` | RSA 创意主题;`campaign-validate` 强制 **15** 标题 + **4** 描述 |
53
- | `assets/campaign-create-template.md` | JSON 字段契约 |
54
+ | **`assets/campaign-create-template.json`** + `assets/campaign-create-template.md` | JSON 结构(先 Read `.json`)+ 字段说明 |
54
55
 
55
56
  ### 按需(触及时再读)
56
57
 
57
- | 文档 | 何时 |
58
- |------|------|
59
- | `google-ads/rules/google-ads-keyword-strategy.md` | 分组/匹配/否定词策略争议 |
60
- | `google-ads/rules/google-ads-campaign-optimization.md` | 出价策略、预算、学习期 |
61
- | `google-ads/rules/google-ads-landing-page-discovery-via-webfetch.md` | 仅首页、需推断 PDP/PLP |
62
- | `google-ads/rules/google-ads-conversion-architecture.md` | 转化/EC/归因说明 |
63
- | `google-ads/rules/google-ads-keyword-optimization.md` | 上线后优化,非首建 |
64
- | `google-ads/rules/google-ads-account-audit.md` | 账户诊断,非首建 |
65
- | `google-ads/rules/google-ads-audience-strategy.md` | 受众/RLSA |
66
- | `google-ads/rules/google-ads-pmax-guide.md` | PMax 运营/诊断;**创建**见 `assets/pmax-create-template.md` |
67
- | `references/google-ads/pmax-api.md` | PMax 网关路径与 Search API 边界 |
58
+ | 文档 | 何时 |
59
+ | -------------------------------------------------------------------- | ----------------------------------------------------------- |
60
+ | `google-ads/rules/google-ads-keyword-strategy.md` | 分组/匹配/否定词策略争议 |
61
+ | `google-ads/rules/google-ads-campaign-optimization.md` | 出价策略、预算、学习期 |
62
+ | `google-ads/rules/google-ads-landing-page-discovery-via-webfetch.md` | 仅首页、需推断 PDP/PLP |
63
+ | `google-ads/rules/google-ads-conversion-architecture.md` | 转化/EC/归因说明 |
64
+ | `google-ads/rules/google-ads-keyword-optimization.md` | 上线后优化,非首建 |
65
+ | `google-ads/rules/google-ads-account-audit.md` | 账户诊断,非首建 |
66
+ | `google-ads/rules/google-ads-audience-strategy.md` | 受众/RLSA |
67
+ | `google-ads/rules/google-ads-pmax-guide.md` | PMax 运营/诊断;**创建**见 `assets/pmax-create-template.md` |
68
+ | `references/google-ads/pmax-api.md` | PMax 网关路径与 Search API 边界 |
68
69
 
69
70
  复述给用户:**3–5 条**与本次任务相关的合规/策略要点即可,无需罗列全部文件名。
70
71
 
@@ -13,8 +13,8 @@
13
13
 
14
14
  ## ID 来源速查
15
15
 
16
- | 需要的 ID | 获取命令 |
17
- | ------------------- | ------------------------------------------------------------ |
16
+ | 需要的 ID | 获取命令 |
17
+ | ------------------- | ----------------------------------------------------------------------- |
18
18
  | `accountId`(`-a`) | `siluzan-tso list-accounts --json-out ./snap` → `mediaCustomerId` |
19
19
  | 广告系列 `id` | `siluzan-tso ad campaigns -a <accountId> --json-out ./snap` → `id` |
20
20
  | 广告组 `id`、`name` | `siluzan-tso ad groups -a <accountId> --json-out ./snap` → `id`、`name` |
@@ -33,14 +33,14 @@
33
33
 
34
34
  > **与 Search 隔离**:勿用 `campaign-create` 或 `campaign-create-template.json`。网关摘录见 `references/google-ads/pmax-api.md`。
35
35
 
36
- | 步骤 | 命令 |
37
- |------|------|
38
- | 模板 | 复制 `assets/pmax-create-template.json`,字段见 `assets/pmax-create-template.md` |
39
- | **素材转换** | `siluzan-tso ad pmax-image-convert --input ./banner.jpg --output-dir ./assets --prefix <name> [--update-config ./pmax.json]` |
40
- | 地理 ID | `siluzan-tso ad geo search -a <accountId> -q "<地区名>"` |
41
- | 校验 | `siluzan-tso ad pmax-validate --config-file ./pmax.json [--json-out ./snap-pmax]`(图片规格 + 文案超长 `lengthViolations`;超长勿自动截断,见 `google-ads/google-ads-campaign-plan.md` § 超长人工确认) |
42
- | 创建 | `siluzan-tso ad pmax-create --config-file ./pmax.json [--json-out ./snap-pmax]` |
43
- | 复核 | `siluzan-tso ad campaigns -a <accountId> --json-out ./snap` → `channelTypeV2` 为 `PERFORMANCE_MAX` |
36
+ | 步骤 | 命令 |
37
+ | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
38
+ | 模板 | 复制 `assets/pmax-create-template.json`,字段见 `assets/pmax-create-template.md` |
39
+ | **素材转换** | `siluzan-tso ad pmax-image-convert --input ./banner.jpg --output-dir ./assets --prefix <name> [--update-config ./pmax.json]` |
40
+ | 地理 ID | `siluzan-tso ad geo search -a <accountId> -q "<地区名>"` |
41
+ | 校验 | `siluzan-tso ad pmax-validate --config-file ./pmax.json [--json-out ./snap-pmax]`(图片规格 + 文案超长 `lengthViolations`;超长勿自动截断,见 `google-ads/google-ads-campaign-plan.md` § 超长人工确认) |
42
+ | 创建 | `siluzan-tso ad pmax-create --config-file ./pmax.json [--json-out ./snap-pmax]` |
43
+ | 复核 | `siluzan-tso ad campaigns -a <accountId> --json-out ./snap` → `channelTypeV2` 为 `PERFORMANCE_MAX` |
44
44
 
45
45
  **PMax**:`ad pmax-create` **同步**返回 `campaignId`、`assetGroupId`、`budgetId`;无 `ad batch get/diff`。详见 `pmax-api.md`。
46
46
 
@@ -54,19 +54,22 @@
54
54
 
55
55
  ### 已上线 PMax 管理(CLI)
56
56
 
57
- | 能力 | 命令 |
58
- |------|------|
59
- | 详情 | `ad pmax-get -a <id> --campaign-id <cid>` |
60
- | 改活动 | `ad pmax-edit`(`--patch-file` 或 `--status` / `--budget` + `--budget-id`) |
61
- | 新资产组 | `ad pmax-asset-group-create --config-file …` |
62
- | 改资产组 | `ad pmax-asset-group-edit` |
63
- | 删资产组 | `ad pmax-asset-group-edit --status REMOVED`(软删;网关无 DELETE 端点) |
64
- | 改资产 | `ad pmax-assets-update --config-file …` |
65
- | YouTube 追加 | `ad pmax-youtube-link`(单条 `--youtube` / `--video-path`);批量见 `ad pmax-assets-update` |
66
- | 信号 | `ad pmax-signals-get` / `ad pmax-signals-set`;受众下拉 `ad pmax-audiences` |
67
- | 图片库 | `ad pmax-image-upload` |
68
- | 报表 | `ad pmax-report-asset-groups` / `ad pmax-report-geo` |
69
- | 删活动 | `ad campaign-delete -a <id> --id <campaignId>`(与 Search 共用;勿用 `ad campaign-edit`) |
57
+ | 能力 | 命令 |
58
+ | ---------------- | ---------------------------------------------------------------------------------------------------------- |
59
+ | 详情 | `ad pmax-get -a <id> --campaign-id <cid>`(读 `_brandGuidelinesActive`) |
60
+ | 改活动 | `ad pmax-edit`(`--patch-file` 或 `--status` / `--budget` + `--budget-id`) |
61
+ | Campaign 品牌 | `ad pmax-brand-assets-edit`(BG 已开启) |
62
+ | 启用 BG | `ad pmax-brand-guidelines-enable --config-file …`(存量活动) |
63
+ | 新资产组 | `ad pmax-asset-group-create --config-file …`(BG 下自动省略品牌) |
64
+ | 改资产组 | `ad pmax-asset-group-edit` |
65
+ | 删资产组 | `ad pmax-asset-group-edit --status REMOVED`(软删;网关无 DELETE 端点) |
66
+ | 改资产 | `ad pmax-assets-update --config-file …` |
67
+ | YouTube 追加 | `ad pmax-youtube-link`(单条 `--youtube` / `--video-path`);批量见 `ad pmax-assets-update` |
68
+ | 信号 | `ad pmax-signals-get` / `ad pmax-signals-set`;受众下拉 `ad pmax-audiences` |
69
+ | 附加资产 | `ad extension pmax-types`;`callout` / `snippet` / `lead-form` / `whatsapp`(见 `pmax-api.md` § 附加资产) |
70
+ | 图片库 | `ad pmax-image-upload` |
71
+ | 报表 | `ad pmax-report-asset-groups` / `ad pmax-report-geo` |
72
+ | 删活动 | `ad campaign-delete -a <id> --id <campaignId>`(与 Search 共用;勿用 `ad campaign-edit`) |
70
73
 
71
74
  模板与 HTTP 对照:`references/google-ads/pmax-api.md`。
72
75
 
@@ -179,7 +182,7 @@ siluzan-tso ad adgroup-create \
179
182
  | `--name <name>` | 广告组名称 | ✅ |
180
183
  | `--max-cpc <amount>` | 最高 CPC(主币种金额) | ✅ |
181
184
  | `--status` | `ENABLED`(默认)/ `PAUSED` | |
182
- | `--json-out` | 输出网关返回的完整 adgroup 对象(含 `id` / `maxCPCAmountYuan` 等) | |
185
+ | `--json-out` | 输出网关返回的完整 adgroup 对象(含 `id` / `maxCPCAmountYuan` 等) | |
183
186
 
184
187
  **返回字段(--json-out)**:网关同步返回完整 adgroup,含 **`id`**(adgroupId)、`name`、`campaignId`、`statusV2`、`maxCPCAmountYuan`(元,CLI 已 ÷100)、`typeV2: "SEARCH_STANDARD"` 等 75+ 字段。批量创建脚本应直接读 `id`,**不需要**再次 `ad groups --json-out ./snap` 反查。
185
188
 
@@ -353,23 +356,23 @@ siluzan-tso ad batch diff --batch-id <taskId> --config-file ./campaign.json
353
356
 
354
357
  ### 失败处理(Agent 必遵)
355
358
 
356
- | `status` | 含义 | 做法 |
357
- | -------- | ---- | ---- |
358
- | `Creating` | 仍在执行 | 继续 `ad batch get`,勿重复 `campaign-create` |
359
- | `Successfully` | 全部成功 | **须** `ad batch diff` 核对计划与账户一致(无缺失应 ✅) |
360
- | `Failed` | 全部失败 | `ad batch get` 读 `reason`/`errors` → **只改 JSON** → 再 `ad campaign-create`(**不要** `batch diff`) |
361
- | `HasFailed` | 部分成功 | **须** `ad batch diff` 列出缺失 → 分步补建或删系列重提 |
359
+ | `status` | 含义 | 做法 |
360
+ | -------------- | -------- | ------------------------------------------------------------------------------------------------------ |
361
+ | `Creating` | 仍在执行 | 继续 `ad batch get`,勿重复 `campaign-create` |
362
+ | `Successfully` | 全部成功 | **须** `ad batch diff` 核对计划与账户一致(无缺失应 ✅) |
363
+ | `Failed` | 全部失败 | `ad batch get` 读 `reason`/`errors` → **只改 JSON** → 再 `ad campaign-create`(**不要** `batch diff`) |
364
+ | `HasFailed` | 部分成功 | **须** `ad batch diff` 列出缺失 → 分步补建或删系列重提 |
362
365
 
363
366
  **`HasFailed` 分支:**
364
367
 
365
368
  1. **多数广告组未建成**(`AdGroupsForBatchJob` 中多数项无 `Id`,默认 ≥50%):
366
369
  `ad campaign-delete -a <accountId> --id <campaignId>` → 按 `reason`/`errors` 修正 **campaign.json** → 重新 `ad campaign-create`。**不要**在脏系列上反复补建。
367
370
 
368
- 2. **仅少数组/资产失败**(系列与大部分组已有 `Id`):
369
- - 缺组:`ad adgroup-create`(`--json-out` 取 `id`)
370
- - 缺词:`ad keyword-create`(词面格式同 JSON `KeywordsForBatchJob`)
371
+ 2. **仅少数组/资产失败**(系列与大部分组已有 `Id`):
372
+ - 缺组:`ad adgroup-create`(`--json-out` 取 `id`)
373
+ - 缺词:`ad keyword-create`(词面格式同 JSON `KeywordsForBatchJob`)
371
374
  - 缺 RSA:`ad ad-create`(`--headlines` / `--descriptions` 从 JSON `AdsForBatchJob` 抄)
372
- 补建前可用 `ad groups` / `ad keywords` 核对账户现状。
375
+ 补建前可用 `ad groups` / `ad keywords` 核对账户现状。
373
376
 
374
377
  **`ad batch diff` 比对维度:**系列是否存在 → 各 `AdGroupsForBatchJob[].Name` → 组内关键词(匹配类型+词面)→ RSA 首条标题 → 系列否定词 → 附加信息条数。默认按层级树状输出每条缺失的 **JSON 路径 + 计划内容 + 账户实况**;`--json-out` 可落盘完整结构。
375
378
 
@@ -405,13 +408,13 @@ siluzan-tso ad campaign-edit \
405
408
  [--search-network true|false] [--content-network true|false]
406
409
  ```
407
410
 
408
- | `--bidding` | 须配合 |
409
- |-------------|--------|
410
- | `TARGET_SPEND` | 可选 `--bid-ceiling`(0=不限) |
411
- | `MANUAL_CPC` | 可选 `--manual-ecpc` |
412
- | `TARGET_CPA` | **必填** `--target-cpa` |
413
- | `TARGET_ROAS` | **必填** `--target-roas`(2.5 = 250%) |
414
- | `MAXIMIZE_CONVERSIONS` | 可选 `--target-cpa`(目标 CPA,元) |
411
+ | `--bidding` | 须配合 |
412
+ | ---------------------- | -------------------------------------- |
413
+ | `TARGET_SPEND` | 可选 `--bid-ceiling`(0=不限) |
414
+ | `MANUAL_CPC` | 可选 `--manual-ecpc` |
415
+ | `TARGET_CPA` | **必填** `--target-cpa` |
416
+ | `TARGET_ROAS` | **必填** `--target-roas`(2.5 = 250%) |
417
+ | `MAXIMIZE_CONVERSIONS` | 可选 `--target-cpa`(目标 CPA,元) |
415
418
 
416
419
  示例:
417
420
 
@@ -512,11 +515,19 @@ siluzan-tso ad keyword-negative-edit \
512
515
 
513
516
  ## ad extension — 附加信息管理
514
517
 
515
- 修改方式为**先删后建**(无 PUT 接口)。所有 `extension <type>` 子命令均支持 `--json-out`,输出网关返回的扩展对象(含 `id`),批量脚本可据此回填。
518
+ Callout / Snippet / Sitelink / Call 等类型修改可**先删后建**;**Lead Form / WhatsApp** 支持 `ad extension update`(PUT;WhatsApp 成功后 **id 会变**)。所有 `extension <type>` 子命令均支持 `--json-out`,输出网关返回的扩展对象(含 `id`),批量脚本可据此回填。
516
519
 
517
520
  ```bash
521
+ # PMax 支持的类型与层级(含 LEAD_FORM)
522
+ siluzan-tso ad extension pmax-types [--json-out ./snap]
523
+
524
+ # 结构化摘要标头(按语言)
525
+ siluzan-tso ad extension snippet-headers [--json-out ./snap]
526
+
518
527
  # 查询
519
- siluzan-tso ad extension list -a <accountId> [--type SITELINK|CALL|CALLOUT|STRUCTURED_SNIPPET] [--json-out ./snap]
528
+ siluzan-tso ad extension list -a <accountId> \
529
+ [--type SITELINK|CALL|CALLOUT|STRUCTURED_SNIPPET|LEAD_FORM|BUSINESS_MESSAGE] \
530
+ [--campaign-id <campaignId>] [--json-out ./snap]
520
531
 
521
532
  # 附加链接
522
533
  siluzan-tso ad extension sitelink -a <accountId> --text "文字" --url "https://..." \
@@ -532,11 +543,24 @@ siluzan-tso ad extension callout -a <accountId> --text "免费送货上门" [--l
532
543
  # 附加结构化摘要
533
544
  siluzan-tso ad extension snippet -a <accountId> --header "Brands" --values "A,B,C" [--level Account] [--json-out ./snap]
534
545
 
546
+ # PMax 潜在客户表单(仅 Campaign 级;模板 assets/pmax-lead-form-template.json)
547
+ siluzan-tso ad extension lead-form -a <accountId> --config-file ./lead-form.json [--json-out ./snap]
548
+
549
+ # PMax WhatsApp 私信(BUSINESS_MESSAGE;需 Google API 白名单;模板 assets/pmax-whatsapp-template.json)
550
+ siluzan-tso ad extension whatsapp -a <accountId> --config-file ./whatsapp.json [--json-out ./snap]
551
+
552
+ # 更新 Lead Form 或 WhatsApp(配置文件含 leadForm / businessMessage;WhatsApp PUT 后 id 会变)
553
+ siluzan-tso ad extension update -a <accountId> --id <extensionId> --config-file ./lead-form.json
554
+
535
555
  # 删除
536
556
  siluzan-tso ad extension delete -a <accountId> --id <extensionId>
537
557
  ```
538
558
 
539
- `--header` 常用值:`Brands`/`Services`/`Amenities`/`Types`/`Styles`/`Courses`/`Models` 等。
559
+ **PMax 约束**:仅 `Account` / `Campaign` 层级;`Ad Group` 会 400。`LEAD_FORM` 仅 Campaign。WhatsApp 每 Campaign 仅 1 个 ENABLED,须 Google API 白名单。
560
+
561
+ `--header` 常用值:`Brands`/`Services`/`Amenities`/`Types`/`Styles`/`Courses`/`Models` 等(完整列表:`ad extension snippet-headers`)。
562
+
563
+ **网关**:`ExtensionManagementController.cs` — `pmaxSupportedTypeList`、`structuredSnippetHeaders`、`extension/{accountId}` POST/PUT/DELETE。
540
564
 
541
565
  ---
542
566
 
@@ -573,9 +597,9 @@ siluzan-tso ad geo remove -a <accountId> --campaign-id <id> --location-id <id>
573
597
 
574
598
  **`--bid-modifier` 口径(`add` / `set-bid` 均为 Google 倍率)**
575
599
 
576
- | 倍率 | 含义 |
577
- |------|------|
578
- | `1.0` | 不调整 |
600
+ | 倍率 | 含义 |
601
+ | ----- | -------- |
602
+ | `1.0` | 不调整 |
579
603
  | `1.2` | 提高 20% |
580
604
  | `0.8` | 降低 20% |
581
605
 
@@ -589,19 +613,19 @@ siluzan-tso ad geo remove -a <accountId> --campaign-id <id> --location-id <id>
589
613
 
590
614
  与 AI 优化「修改设备出价」能力同源。
591
615
 
592
- | 级别 | 列表 | 修改 |
593
- |------|------|------|
594
- | **系列**(默认) | `GET …/campaignmanagement/{id}/BidModifiers/Devices` | `PUT …/campaigns/{campaignId}/Criteria/{criterionId}/BidModifier/{bidModifier}` |
595
- | **广告组** | `GET …/adgroupnmanagement/bidmodifiers/{id}?campaignId&adgroupId&criteriaType=PLATFORM` | `PUT …/adgroupnmanagement/bidmodifiers/{id}?campaignId&adGroupId` + Body `Criterion[]` |
616
+ | 级别 | 列表 | 修改 |
617
+ | ---------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
618
+ | **系列**(默认) | `GET …/campaignmanagement/{id}/BidModifiers/Devices` | `PUT …/campaigns/{campaignId}/Criteria/{criterionId}/BidModifier/{bidModifier}` |
619
+ | **广告组** | `GET …/adgroupnmanagement/bidmodifiers/{id}?campaignId&adgroupId&criteriaType=PLATFORM` | `PUT …/adgroupnmanagement/bidmodifiers/{id}?campaignId&adGroupId` + Body `Criterion[]` |
596
620
 
597
621
  **`--bid-modifier` 口径(系列级直接透传 Google 倍率)**
598
622
 
599
- | 倍率 | 含义 |
600
- |------|------|
601
- | `1.0` | 不调整 |
602
- | `0.8` | 降低 20% |
603
- | `1.2` | 提高 20% |
604
- | `0` | 排除该设备(-100%) |
623
+ | 倍率 | 含义 |
624
+ | ----- | ------------------- |
625
+ | `1.0` | 不调整 |
626
+ | `0.8` | 降低 20% |
627
+ | `1.2` | 提高 20% |
628
+ | `0` | 排除该设备(-100%) |
605
629
 
606
630
  广告组级会在 CLI 内将倍率转为后端百分比:`(倍率 - 1) × 100`。
607
631
 
@@ -2,10 +2,10 @@
2
2
 
3
3
  ## 金额单位
4
4
 
5
- | JSON / CLI | 提交到 API |
6
- |------------|------------|
7
- | `budget: 5.5`(元) | `550`(×100) |
8
- | `targetCpa_BidingAmount: 0.5`(元) | `50` |
5
+ | JSON / CLI | 提交到 API |
6
+ | ----------------------------------- | ------------- |
7
+ | `budget: 5.5`(元) | `550`(×100) |
8
+ | `targetCpa_BidingAmount: 0.5`(元) | `50` |
9
9
 
10
10
  报表 `spend` 为美元浮点,勿与管理 API 混用。
11
11
 
@@ -13,24 +13,99 @@
13
13
 
14
14
  ## CLI 命令
15
15
 
16
- | 命令 | 说明 |
17
- |------|------|
18
- | `ad pmax-validate` | 本地校验 |
19
- | `ad pmax-create` | 创建系列(同步返回 `campaignId` 等) |
20
- | `ad pmax-channel-types` | 渠道类型列表 |
21
- | `ad pmax-get` | 系列详情 |
22
- | `ad pmax-edit` | 编辑系列 |
23
- | `ad pmax-asset-group-create` | 新建资产组 |
24
- | `ad pmax-asset-group-edit` | 编辑资产组 |
25
- | `ad pmax-assets-update` | 更新资产 |
26
- | `ad pmax-youtube-link` | **追加**单条 YouTube 视频(不替换已有视频) |
27
- | `ad pmax-signals-get` / `ad pmax-signals-set` | 读/写信号(**全量** PUT) |
28
- | `ad pmax-audiences` | 受众列表 |
29
- | `ad pmax-image-upload` | 单张图片上传 |
30
- | `ad pmax-report-asset-groups` / `ad pmax-report-geo` | 报表 |
31
- | `ad campaigns` | 列表(筛 `PERFORMANCE_MAX`) |
32
-
33
- 模板:`assets/pmax-create-template.json`、`pmax-asset-group-template.json`、`pmax-assets-update-template.json`、`pmax-signals-template.json`、`pmax-patch-campaign-template.json`。
16
+ | 命令 | 说明 |
17
+ | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
18
+ | `ad pmax-validate` | 本地校验 |
19
+ | `ad pmax-create` | 创建系列(同步返回 `campaignId` 等) |
20
+ | `ad pmax-channel-types` | 渠道类型列表 |
21
+ | `ad pmax-get` | 系列详情(含 `brandAssets[]`;`--json-out` 附加 `_brandGuidelinesActive`、`_agentBrandHint`) |
22
+ | `ad pmax-edit` | 编辑系列(预算/出价/状态;**不可**改 `brandGuidelinesEnabled`) |
23
+ | `ad pmax-brand-assets-edit` | BG 已开启时改 Campaign 级品牌(商家名/Logo/样式) |
24
+ | `ad pmax-brand-guidelines-enable` | 存量活动启用 BG(不可关闭) |
25
+ | `ad pmax-asset-group-create` | 新建资产组 |
26
+ | `ad pmax-asset-group-edit` | 编辑资产组 |
27
+ | `ad pmax-assets-update` | 更新资产 |
28
+ | `ad pmax-youtube-link` | **追加**单条 YouTube 视频(不替换已有视频) |
29
+ | `ad pmax-signals-get` / `ad pmax-signals-set` | 读/写信号(**全量** PUT) |
30
+ | `ad pmax-audiences` | 受众列表 |
31
+ | `ad pmax-image-upload` | 单张图片上传 |
32
+ | `ad pmax-report-asset-groups` / `ad pmax-report-geo` | 报表 |
33
+ | `ad campaigns` | 列表(筛 `PERFORMANCE_MAX`) |
34
+ | `ad extension pmax-types` | PMax 支持的附加资产类型与层级 |
35
+ | `ad extension callout` / `snippet` / `lead-form` / `whatsapp` | 宣传信息 / 结构化摘要 / 潜在客户表单 / WhatsApp |
36
+ | `ad extension list` | 查询已挂载扩展(`--type` / `--campaign-id`) |
37
+
38
+ 模板:`assets/pmax-create-template.json`、`pmax-asset-group-template.json`、`pmax-assets-update-template.json`、`pmax-signals-template.json`、`pmax-patch-campaign-template.json`、`pmax-brand-assets-template.json`、`pmax-brand-guidelines-enable-template.json`、`pmax-lead-form-template.json`。
39
+
40
+ ### 附加资产(Callout / Snippet / Lead Form)
41
+
42
+ 网关 `POST .../campaign/pmax` **不**接受扩展字段;CLI 通过 **`campaignExtensions`** 在 `pmax-create` 成功后**自动编排** `extensionmanagement`(与手动 `ad extension *` 等价)。
43
+
44
+ **方式 A(推荐,一条命令)**:在 `pmax-create` JSON 中填 `campaignExtensions`。**Lead Gen / B2B 询盘方案须含 `leadForm`**(勿只写 callouts/snippets;用户明确不要表单才省略):
45
+
46
+ ```json
47
+ {
48
+ "campaignExtensions": {
49
+ "callouts": ["Free shipping"],
50
+ "structuredSnippets": [{ "header": "Services", "values": ["A", "B", "C"] }],
51
+ "leadForm": {
52
+ "businessName": "...",
53
+ "headline": "...",
54
+ "description": "...",
55
+ "privacyPolicyUrl": "...",
56
+ "finalUrl": "...",
57
+ "fields": [{ "inputType": "EMAIL" }]
58
+ },
59
+ "businessMessage": {
60
+ "starterMessage": "Hi!",
61
+ "whatsapp": { "countryCode": "US", "phoneNumber": "2125550100" }
62
+ }
63
+ }
64
+ }
65
+ ```
66
+
67
+ `pmax-validate` 会一并校验;`pmax-create` 成功后在同一次调用内挂载(`--json-out` 含 `campaignExtensions` 结果)。
68
+
69
+ **方式 B(分步)**:活动创建后手动走 `extensionmanagement`(PMax 限制 Account/Campaign 层级)。
70
+
71
+ | 中文 | 类型 | 命令 |
72
+ | --------------- | -------------------- | ---------------------------------------------------------------------------------------------------- |
73
+ | 宣传信息 | `CALLOUT` | `ad extension callout -a <id> --text "..." --level Campaign --campaign-id <cid>` |
74
+ | 结构化摘要 | `STRUCTURED_SNIPPET` | `ad extension snippet -a <id> --header Brands --values "A,B,C" --level Campaign --campaign-id <cid>` |
75
+ | 潜在客户表单 | `LEAD_FORM` | `ad extension lead-form -a <id> --config-file ./lead-form.json` |
76
+ | 附加链接 / 电话 | `SITELINK` / `CALL` | `ad extension sitelink` / `call`(同上 `--level Campaign`) |
77
+ | 私信 WhatsApp | `BUSINESS_MESSAGE` | `ad extension whatsapp` 或 `campaignExtensions.businessMessage` |
78
+
79
+ ```bash
80
+ # 查 PMax 支持类型
81
+ siluzan-tso ad extension pmax-types --json-out ./snap
82
+
83
+ # 结构化摘要标头下拉
84
+ siluzan-tso ad extension snippet-headers --json-out ./snap
85
+
86
+ # Lead Form(模板见 assets/pmax-lead-form-template.md)
87
+ siluzan-tso ad extension lead-form -a <accountId> --config-file ./lead-form.json --json-out ./snap
88
+
89
+ # WhatsApp(模板见 assets/pmax-whatsapp-template.md;需 Google API 白名单)
90
+ siluzan-tso ad extension whatsapp -a <accountId> --config-file ./whatsapp.json --json-out ./snap
91
+
92
+ # 复核 / 更新 / 删除
93
+ siluzan-tso ad extension list -a <accountId> --type LEAD_FORM --campaign-id <cid> --json-out ./snap
94
+ siluzan-tso ad extension list -a <accountId> --type BUSINESS_MESSAGE --campaign-id <cid> --json-out ./snap
95
+ siluzan-tso ad extension update -a <accountId> --id <extId> --config-file ./lead-form.json
96
+ siluzan-tso ad extension update -a <accountId> --id <extId> --config-file ./whatsapp.json # id 会变
97
+ siluzan-tso ad extension delete -a <accountId> --id <extId>
98
+ ```
99
+
100
+ **约束**:
101
+
102
+ - PMax **不支持** `level: Ad Group`(会 400)
103
+ - `LEAD_FORM` **仅** `Campaign` 级;每活动通常 1 个
104
+ - `BUSINESS_MESSAGE`(WhatsApp)每 Campaign **仅 1 个** ENABLED;须 **Google API 白名单**
105
+ - WhatsApp **PUT 后 asset id 会变**;后续操作须用响应中的新 `id`
106
+ - 创建 Lead Form 后后端自动尝试开启 `SUBMIT_LEAD_FORM` + `GOOGLE_HOSTED` 转化目标
107
+
108
+ **网关**:`GET /extensionmanagement/pmaxSupportedTypeList`;`POST|PUT|DELETE /extensionmanagement/extension/{accountId}[/{id}]`(Sammamish `ExtensionManagementController.cs`)。
34
109
 
35
110
  ### 图片(推荐流程)
36
111
 
@@ -42,13 +117,13 @@
42
117
 
43
118
  **语义(与后端 `pmax-frontend-api.md` §5.3 / §5.4 一致)**:`YOUTUBE_VIDEO` 默认 **追加**,每个资产组最多 **15** 条;不可重复链接同一 `videoId`。仅当 `pmax-assets-update` 显式传 `replaceFieldTypes: ["YOUTUBE_VIDEO"]` 时才会先删后增(替换全部视频)。
44
119
 
45
- | 场景 | 命令 / 接口 |
46
- |------|-------------|
47
- | 创建时挂 1 条 | `pmax-create` JSON:`videoPath` 或 `youtubeUrlOrId`(二选一,单次最多 1 条) |
48
- | 追加 1 条 | `ad pmax-youtube-link` → `POST .../asset-group/{id}/youtube` |
49
- | 批量追加多条 | `ad pmax-assets-update` → `PUT .../assets`,`assetsToLink` 中多条 `YOUTUBE_VIDEO` |
50
- | 取消链接 | `ad pmax-assets-update`,`assetGroupAssetResourceNamesToRemove`(取自 `pmax-get` 的 `assets[].assetResourceName`) |
51
- | 替换全部视频 | `ad pmax-assets-update`,`replaceFieldTypes: ["YOUTUBE_VIDEO"]` + 新的 `assetsToLink` |
120
+ | 场景 | 命令 / 接口 |
121
+ | ------------- | ------------------------------------------------------------------------------------------------------------------ |
122
+ | 创建时挂 1 条 | `pmax-create` JSON:`videoPath` 或 `youtubeUrlOrId`(二选一,单次最多 1 条) |
123
+ | 追加 1 条 | `ad pmax-youtube-link` → `POST .../asset-group/{id}/youtube` |
124
+ | 批量追加多条 | `ad pmax-assets-update` → `PUT .../assets`,`assetsToLink` 中多条 `YOUTUBE_VIDEO` |
125
+ | 取消链接 | `ad pmax-assets-update`,`assetGroupAssetResourceNamesToRemove`(取自 `pmax-get` 的 `assets[].assetResourceName`) |
126
+ | 替换全部视频 | `ad pmax-assets-update`,`replaceFieldTypes: ["YOUTUBE_VIDEO"]` + 新的 `assetsToLink` |
52
127
 
53
128
  **创建时自动链接**
54
129
 
@@ -76,7 +151,11 @@ siluzan-tso ad pmax-youtube-link -a <id> --asset-group-id <agId> --campaign-id <
76
151
  "assetGroupId": "98765432101",
77
152
  "assetsToLink": [
78
153
  { "fieldType": "YOUTUBE_VIDEO", "youtubeVideoId": "dQw4w9WgXcQ", "assetName": "Promo1" },
79
- { "fieldType": "YOUTUBE_VIDEO", "youtubeVideoId": "https://youtu.be/jNQXAC9IVRw", "assetName": "Promo2" }
154
+ {
155
+ "fieldType": "YOUTUBE_VIDEO",
156
+ "youtubeVideoId": "https://youtu.be/jNQXAC9IVRw",
157
+ "assetName": "Promo2"
158
+ }
80
159
  ]
81
160
  }
82
161
  ```
@@ -85,13 +164,38 @@ siluzan-tso ad pmax-youtube-link -a <id> --asset-group-id <agId> --campaign-id <
85
164
 
86
165
  ---
87
166
 
167
+ ## Brand Guidelines(品牌手册,Google v21+)
168
+
169
+ Google v21+ 新建 PMax **默认开启** BG:`businessName` / Logo 挂在 **Campaign**(`brandAssets[]`),全活动共用;首个 AssetGroup 的 `assets[]` **不含** 品牌。
170
+
171
+ ### Agent 决策(必读)
172
+
173
+ 1. **任何编辑前先** `ad pmax-get --json-out` → 读 `_brandGuidelinesActive`(或 `_agentBrandHint`)
174
+ 2. BG 生效 → 改品牌用 `ad pmax-brand-assets-edit`;追加 AG **省略** 品牌字段
175
+ 3. BG 未生效 → 改品牌在 AssetGroup 上用 `ad pmax-assets-update`;或 `ad pmax-brand-guidelines-enable` 启用 BG
176
+
177
+ | 场景 | 命令 |
178
+ | ------------------ | --------------------------------------------------------------------------------- |
179
+ | 创建(默认 BG 开) | `pmax-create` JSON 仍必填 `businessName`+Logo;可省略 `brandGuidelinesEnabled` |
180
+ | 创建(旧路径) | JSON 加 `"brandGuidelinesEnabled": false` |
181
+ | 改 Campaign 级品牌 | `ad pmax-brand-assets-edit -a <id> --campaign-id <cid> --patch-file ./brand.json` |
182
+ | 存量启用 BG | `ad pmax-brand-guidelines-enable --config-file ./enable-bg.json` |
183
+ | 追加资产组 | `pmax-asset-group-create`(CLI 自动判断,BG 下无需 Logo/商家名) |
184
+
185
+ **禁止**:BG 生效时对 AssetGroup 执行 `pmax-assets-update` 链接 `BUSINESS_NAME`/`LOGO`/`LANDSCAPE_LOGO`(CLI 预检阻断,网关亦 400)。
186
+
187
+ 模板:`assets/pmax-brand-assets-template.md`、`pmax-brand-guidelines-enable-template.md`。
188
+
189
+ ---
190
+
88
191
  ## 编辑流程
89
192
 
90
- 1. `ad pmax-get` 拉详情
193
+ 1. `ad pmax-get` 拉详情(读 `_brandGuidelinesActive`)
91
194
  2. 改系列 → `ad pmax-edit` 或 `--patch-file`
92
- 3. 改资产组`ad pmax-asset-group-edit`
93
- 4. 改资产 → `ad pmax-assets-update`(`campaignId` 必填)
94
- 5. 改信号 → `ad pmax-signals-get` `ad pmax-audiences` `ad pmax-signals-set`(一次带齐两类数组)
195
+ 3. **改品牌**BG 生效:`ad pmax-brand-assets-edit`;未生效:`ad pmax-assets-update` 或先 `pmax-brand-guidelines-enable`
196
+ 4. 改资产组 → `ad pmax-asset-group-edit`
197
+ 5. AG 内素材 → `ad pmax-assets-update`(`campaignId` 必填;勿改品牌 fieldType BG 生效)
198
+ 6. 改信号 → `ad pmax-signals-get` → `ad pmax-audiences` → `ad pmax-signals-set`(一次带齐两类数组)
95
199
 
96
200
  ---
97
201
 
@@ -2,20 +2,20 @@
2
2
 
3
3
  > 本目录为 **策略/SOP 文档**,非 CLI 参数表。命令与字段见 `references/google-ads/google-ads.md`;新建流程见 `google-ads/google-ads-campaign-plan.md`。
4
4
 
5
- | 文件 | 何时 Read |
6
- | ---- | --------- |
7
- | `google-ads-account-audit.md` | 账户健康度审计、结构诊断 |
8
- | `google-ads-campaign-optimization.md` | 系列层优化决策 |
9
- | `google-ads-keyword-strategy.md` | 关键词策略规划 |
10
- | `google-ads-keyword-optimization.md` | 关键词出价/否定/扩词优化 |
11
- | `google-ads-keyword-taxonomy.md` | 词类分层与命名 |
12
- | `google-ads-creative-optimization.md` | 创意/文案优化 |
13
- | `google-ads-audience-strategy.md` | 受众策略 |
14
- | `google-ads-pmax-guide.md` | PMax 运营指南(配合 `assets/pmax-create-template.md`) |
15
- | `google-ads-conversion-architecture.md` | 转化追踪架构 |
16
- | `google-ads-compliance.md` | 合规与政策 |
17
- | `google-ads-landing-page-discovery-via-webfetch.md` | 落地页发现(WebFetch) |
18
- | `google-ads-launch-plan-template.md` | 上线计划模板 |
19
- | `sensitive-industries.md` | 敏感行业限制 |
5
+ | 文件 | 何时 Read |
6
+ | --------------------------------------------------- | ------------------------------------------------------ |
7
+ | `google-ads-account-audit.md` | 账户健康度审计、结构诊断 |
8
+ | `google-ads-campaign-optimization.md` | 系列层优化决策 |
9
+ | `google-ads-keyword-strategy.md` | 关键词策略规划 |
10
+ | `google-ads-keyword-optimization.md` | 关键词出价/否定/扩词优化 |
11
+ | `google-ads-keyword-taxonomy.md` | 词类分层与命名 |
12
+ | `google-ads-creative-optimization.md` | 创意/文案优化 |
13
+ | `google-ads-audience-strategy.md` | 受众策略 |
14
+ | `google-ads-pmax-guide.md` | PMax 运营指南(配合 `assets/pmax-create-template.md`) |
15
+ | `google-ads-conversion-architecture.md` | 转化追踪架构 |
16
+ | `google-ads-compliance.md` | 合规与政策 |
17
+ | `google-ads-landing-page-discovery-via-webfetch.md` | 落地页发现(WebFetch) |
18
+ | `google-ads-launch-plan-template.md` | 上线计划模板 |
19
+ | `sensitive-industries.md` | 敏感行业限制 |
20
20
 
21
21
  宿主编排下的自动优化分文件 SOP:`references/operations/hosted-automation-optimize-index.md`。