siluzan-tso-cli 1.1.43-beta.4 → 1.1.44-beta.1
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 +1 -1
- package/dist/index.js +24 -12
- package/dist/skill/SKILL.md +5 -1
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/accounts/accounts-balance-stats.md +6 -2
- package/dist/skill/references/core/intent-routing.md +2 -0
- package/dist/skill/references/core/workflows.md +1 -0
- package/dist/skill/references/google-ads/google-ads-campaign-plan.md +2 -0
- package/dist/skill/references/google-ads/google-ads-write.md +9 -0
- package/dist/skill/references/google-ads/google-ads.md +13 -0
- package/dist/skill/scripts/install.ps1 +1 -1
- package/dist/skill/scripts/install.sh +1 -1
- package/package.json +1 -1
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.
|
|
54
|
+
> **注意**:当前为测试版(1.1.44-beta.1),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
55
55
|
|
|
56
56
|
| 助手 | 建议 `--ai` |
|
|
57
57
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -4503,13 +4503,17 @@ var init_currency_display = __esm({
|
|
|
4503
4503
|
function fmt(d) {
|
|
4504
4504
|
return d.toISOString().slice(0, 10);
|
|
4505
4505
|
}
|
|
4506
|
-
function
|
|
4506
|
+
function dateRangeLastNDays(n) {
|
|
4507
|
+
const days = Math.max(1, Math.floor(Number(n) || 1));
|
|
4507
4508
|
const end = /* @__PURE__ */ new Date();
|
|
4508
4509
|
end.setDate(end.getDate() - 1);
|
|
4509
4510
|
const start = new Date(end);
|
|
4510
|
-
start.setDate(start.getDate() -
|
|
4511
|
+
start.setDate(start.getDate() - (days - 1));
|
|
4511
4512
|
return { startDate: fmt(start), endDate: fmt(end) };
|
|
4512
4513
|
}
|
|
4514
|
+
function defaultDateRange() {
|
|
4515
|
+
return dateRangeLastNDays(7);
|
|
4516
|
+
}
|
|
4513
4517
|
function resolveAccountOverviewMediaRoute(cliMedia, accountMediaAccountType) {
|
|
4514
4518
|
if (cliMedia === "MetaAd" && accountMediaAccountType === "FacebookAds") {
|
|
4515
4519
|
return "FacebookAds";
|
|
@@ -106986,6 +106990,8 @@ async function runBalanceScan(opts) {
|
|
|
106986
106990
|
}
|
|
106987
106991
|
const media = opts.media;
|
|
106988
106992
|
const thresholdDays = opts.thresholdDays ?? 7;
|
|
106993
|
+
const spendDays = Math.max(1, Math.floor(opts.spendDays ?? 7));
|
|
106994
|
+
const spendWindow = dateRangeLastNDays(spendDays);
|
|
106989
106995
|
const minBalance = opts.minBalance ?? null;
|
|
106990
106996
|
const minDailySpend = opts.minDailySpend ?? 0.01;
|
|
106991
106997
|
const targetDays = opts.targetDays ?? 30;
|
|
@@ -107042,17 +107048,19 @@ async function runBalanceScan(opts) {
|
|
|
107042
107048
|
media,
|
|
107043
107049
|
accountIds: validIds,
|
|
107044
107050
|
config,
|
|
107051
|
+
startDate: spendWindow.startDate,
|
|
107052
|
+
endDate: spendWindow.endDate,
|
|
107045
107053
|
verbose: opts.verbose,
|
|
107046
107054
|
accountMediaTypes: buildAccountMediaTypesMap(allItems),
|
|
107047
107055
|
onChunkStart: (chunkIdx, totalChunks, ids) => {
|
|
107048
107056
|
process.stderr.write(
|
|
107049
|
-
` \u2192 [\
|
|
107057
|
+
` \u2192 [\u8FD1${spendDays}\u65E5\u6D88\u8017] \u7B2C ${chunkIdx}/${totalChunks} \u6279\u8BF7\u6C42\u4E2D\uFF08${ids.length} \u6237\uFF09\u2026
|
|
107050
107058
|
`
|
|
107051
107059
|
);
|
|
107052
107060
|
},
|
|
107053
107061
|
onOverviewDone: (chunkIdx, totalChunks, ids, size) => {
|
|
107054
107062
|
process.stderr.write(
|
|
107055
|
-
` \u2713 [\
|
|
107063
|
+
` \u2713 [\u8FD1${spendDays}\u65E5\u6D88\u8017] \u7B2C ${chunkIdx}/${totalChunks} \u6279\u5B8C\u6210\uFF08${ids.length} \u6237 \u2192 ${size} \u6761\uFF09
|
|
107056
107064
|
`
|
|
107057
107065
|
);
|
|
107058
107066
|
process.stderr.write(
|
|
@@ -107081,8 +107089,8 @@ async function runBalanceScan(opts) {
|
|
|
107081
107089
|
const bal = balanceMap.get(id);
|
|
107082
107090
|
const ov = overviewMap.get(id);
|
|
107083
107091
|
const balance = bal?.remainingAccountBudget ?? null;
|
|
107084
|
-
const
|
|
107085
|
-
const dailySpend =
|
|
107092
|
+
const windowSpend = Number(ov?.spend ?? 0);
|
|
107093
|
+
const dailySpend = windowSpend > 0 ? windowSpend / spendDays : 0;
|
|
107086
107094
|
let remainingDays = null;
|
|
107087
107095
|
let recommendedTopup = null;
|
|
107088
107096
|
if (dailySpend >= minDailySpend && balance !== null) {
|
|
@@ -107135,6 +107143,8 @@ async function runBalanceScan(opts) {
|
|
|
107135
107143
|
minDailySpend,
|
|
107136
107144
|
targetDaysForTopup: targetDays
|
|
107137
107145
|
},
|
|
107146
|
+
spendDays,
|
|
107147
|
+
spendWindow,
|
|
107138
107148
|
pageSize,
|
|
107139
107149
|
maxPages,
|
|
107140
107150
|
batchChunkSize: validIds.length > 0 ? batchChunkSize : null,
|
|
@@ -107184,7 +107194,7 @@ ${media} \u8D26\u6237\u4F59\u989D\u626B\u63CF\u5B8C\u6210\uFF1A\u5171\u626B\u63C
|
|
|
107184
107194
|
{ key: "company", header: "\u516C\u53F8" },
|
|
107185
107195
|
{ key: "name", header: "\u8D26\u6237\u540D" },
|
|
107186
107196
|
{ key: "balance", header: "\u4F59\u989D" },
|
|
107187
|
-
{ key: "daily", header:
|
|
107197
|
+
{ key: "daily", header: `\u65E5\u5747\u6D88\u8017(\u8FD1${spendDays}\u65E5)` },
|
|
107188
107198
|
{ key: "days", header: "\u5269\u4F59\u5929\u6570" },
|
|
107189
107199
|
{ key: "topup", header: `\u5EFA\u8BAE\u5145\u503C(\u76EE\u6807${targetDays}\u5929)` },
|
|
107190
107200
|
{ key: "reason", header: "\u547D\u4E2D\u539F\u56E0" }
|
|
@@ -107210,6 +107220,7 @@ ${media} \u8D26\u6237\u4F59\u989D\u626B\u63CF\u5B8C\u6210\uFF1A\u5171\u626B\u63C
|
|
|
107210
107220
|
`
|
|
107211
107221
|
\u63D0\u793A\uFF1A\u4E0A\u8868\u5DF2\u6309\u5269\u4F59\u5929\u6570\u5347\u5E8F\u6392\u5E8F\u3002
|
|
107212
107222
|
- \u5982\u9700\u8C03\u6574\u9608\u503C\uFF1A--threshold-days 14 / --min-balance 500
|
|
107223
|
+
- \u5982\u9700\u8C03\u6574\u65E5\u5747\u56DE\u770B\u5929\u6570\uFF1A--spend-days 3
|
|
107213
107224
|
- \u5982\u9700\u8C03\u6574\u5EFA\u8BAE\u5145\u503C\u76EE\u6807\u7EED\u822A\uFF1A--target-days 60
|
|
107214
107225
|
- \u5982\u9700\u5BFC\u51FA\u7ED3\u6784\u5316\u6570\u636E\uFF1A\u52A0 --json-out <\u76EE\u5F55>\uFF08\u542B meta \u6C47\u603B\uFF0C\u89C1 cli-manifest-<media>.json\uFF09
|
|
107215
107226
|
`
|
|
@@ -107226,17 +107237,17 @@ function register9(program2) {
|
|
|
107226
107237
|
).option(
|
|
107227
107238
|
"-a, --accounts <ids>",
|
|
107228
107239
|
"\u6307\u5B9A mediaCustomerId\uFF08\u9017\u53F7\u5206\u9694\uFF09\uFF1B\u8DF3\u8FC7\u6E05\u5355\u7FFB\u9875\uFF0C\u62C9\u53D6\u540E\u5168\u90E8\u8F93\u51FA\uFF08\u4E0D\u6309\u9608\u503C\u8FC7\u6EE4\uFF09"
|
|
107229
|
-
).option(
|
|
107230
|
-
"--
|
|
107231
|
-
"\
|
|
107232
|
-
(v) =>
|
|
107240
|
+
).option("--threshold-days <n>", "\u5269\u4F59\u7EED\u822A\u5929\u6570\u9608\u503C\uFF08\u9ED8\u8BA4 7\uFF09", (v) => parseFloat(v)).option(
|
|
107241
|
+
"--spend-days <n>",
|
|
107242
|
+
"\u65E5\u5747\u6D88\u8017\u56DE\u770B\u81EA\u7136\u65E5\u6570\uFF08\u622A\u81F3\u6628\u5929\u4E0D\u542B\u4ECA\u5929\uFF1B\u9ED8\u8BA4 7\uFF1B\u65E5\u5747=\u7A97\u53E3\u5408\u8BA1/\u5929\u6570\uFF09",
|
|
107243
|
+
(v) => parseInt(v, 10)
|
|
107233
107244
|
).option(
|
|
107234
107245
|
"--min-balance <n>",
|
|
107235
107246
|
"\u989D\u5916\u6309\u7EDD\u5BF9\u4F59\u989D\u9608\u503C\u547D\u4E2D\uFF08\u4E3B\u5E01\u79CD\u91D1\u989D\uFF0C\u4E0E --threshold-days \u53D6\u5E76\u96C6\uFF09",
|
|
107236
107247
|
(v) => parseFloat(v)
|
|
107237
107248
|
).option(
|
|
107238
107249
|
"--min-daily-spend <n>",
|
|
107239
|
-
"\u8FD1
|
|
107250
|
+
"\u8FD1 N \u65E5\u65E5\u5747\u6D88\u8017 < \u6B64\u503C\u7684\u8D26\u6237\u89C6\u4E3A\u50F5\u5C38\u8D26\u6237\u4E0D\u505A\u7EED\u822A\u4F30\u7B97\uFF08\u9ED8\u8BA4 0.01\uFF1BN \u89C1 --spend-days\uFF09",
|
|
107240
107251
|
(v) => parseFloat(v)
|
|
107241
107252
|
).option("--target-days <n>", "\u5EFA\u8BAE\u5145\u503C\u6309\u6B64\u76EE\u6807\u7EED\u822A\u5929\u6570\u8BA1\u7B97\uFF08\u9ED8\u8BA4 30\uFF09", (v) => parseFloat(v)).option("--page-size <n>", "\u5206\u9875\u5927\u5C0F\uFF08\u9ED8\u8BA4 200\uFF0C\u4E0A\u9650 500\uFF09", (v) => parseInt(v, 10)).option(
|
|
107242
107253
|
"--max-pages <n>",
|
|
@@ -107253,6 +107264,7 @@ function register9(program2) {
|
|
|
107253
107264
|
media: opts.media,
|
|
107254
107265
|
accounts: opts.accounts,
|
|
107255
107266
|
thresholdDays: opts.thresholdDays,
|
|
107267
|
+
spendDays: opts.spendDays,
|
|
107256
107268
|
minBalance: opts.minBalance,
|
|
107257
107269
|
minDailySpend: opts.minDailySpend,
|
|
107258
107270
|
targetDays: opts.targetDays,
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: siluzan-tso
|
|
3
|
-
description: 丝路赞 TSO 广告平台(Google/Bing/Yandex/TikTok/Kwai/MetaAd),凡涉及丝路赞/TSO、投广告、出价预算、广告账户管理,或需要做行业分析/市场分析/行业分析报告(含「写一份 XX 行业报告」「电商/制造/医疗等行业报告」「市场调查/战略市场/KA 市场报告」「竞品/GTM/市场格局/行业趋势」等,无论是否提及丝路赞/广告/客户)须加载本 skill。【§零·最高优先】网址/域名/官网+诊断/检测/监测/评估/体检/报告/符合投放要求/能不能投(含「网络诊断」混说)→P8 website-diagnosis collect(禁纯WebFetch/肉眼看页),禁止P9/P1/W3、禁止A/B/C/D追问;细则见 intent-routing.md §零。【§零·B·次高优先】未命中§零时,行业/市场分析报告类话术→必走P9 market-analysis collect+render出HTML,禁止纯WebSearch/WebFetch在对话里写Markdown/HTML当终稿、禁止改走P8/P1/P4/W5/google-analysis;细则见 references/core/intent-routing.md §零·B。【§零·C·关键词规划】Google Ads/谷歌广告拓词、关键词规划/推荐、Keyword Planner、长尾关键词、月搜索量/搜索量、竞争度、核心词/种子词扩词(含「阅读网址/文章/页面后针对核心词出带搜索量词表」,无论是否提及丝路赞/TSO/账户)→必走W5 keyword -k … --google-only --json-out,禁止WebSearch/WebFetch编造搜索量当终稿;细则见 references/core/intent-routing.md §零·C。【报告/诊断消歧】其余报告类话术禁止默认某一CLI——行业/市场/战略/行业分析报告→P9 market-analysis(必走collect+render,禁止纯WebSearch代替);Google账户ID+健康诊断→P1 google-ads-diagnosis;账户ID+周期/月度→P4;Meta/TikTok/Bing周期→P4/P4-FB;多账户对比→P3/P5;OKKI周报→P6;Google询盘→P7;官网+明确要搜索广告方案/campaign JSON→W3;仅要词表+搜索量/竞争度→W5;平台优化报告列表/推送→W7;对象仍不清→Read intent-routing.md。【账户】列表/余额/消耗/激活账单(W1)、多账户余额预警 balance-scan(P2)、多户消耗汇总 accounts-digest(P3)、六大媒体开户与进度(W2)、分享/解绑/MCC/BC/BM/权限(W9)。【投放】Google
|
|
3
|
+
description: 丝路赞 TSO 广告平台(Google/Bing/Yandex/TikTok/Kwai/MetaAd),凡涉及丝路赞/TSO、投广告、出价预算、广告账户管理,或需要做行业分析/市场分析/行业分析报告(含「写一份 XX 行业报告」「电商/制造/医疗等行业报告」「市场调查/战略市场/KA 市场报告」「竞品/GTM/市场格局/行业趋势」等,无论是否提及丝路赞/广告/客户)须加载本 skill。【§零·最高优先】网址/域名/官网+诊断/检测/监测/评估/体检/报告/符合投放要求/能不能投(含「网络诊断」混说)→P8 website-diagnosis collect(禁纯WebFetch/肉眼看页),禁止P9/P1/W3、禁止A/B/C/D追问;细则见 intent-routing.md §零。【§零·B·次高优先】未命中§零时,行业/市场分析报告类话术→必走P9 market-analysis collect+render出HTML,禁止纯WebSearch/WebFetch在对话里写Markdown/HTML当终稿、禁止改走P8/P1/P4/W5/google-analysis;细则见 references/core/intent-routing.md §零·B。【§零·C·关键词规划】Google Ads/谷歌广告拓词、关键词规划/推荐、Keyword Planner、长尾关键词、月搜索量/搜索量、竞争度、核心词/种子词扩词(含「阅读网址/文章/页面后针对核心词出带搜索量词表」,无论是否提及丝路赞/TSO/账户)→必走W5 keyword -k … --google-only --json-out,禁止WebSearch/WebFetch编造搜索量当终稿;细则见 references/core/intent-routing.md §零·C。【报告/诊断消歧】其余报告类话术禁止默认某一CLI——行业/市场/战略/行业分析报告→P9 market-analysis(必走collect+render,禁止纯WebSearch代替);Google账户ID+健康诊断→P1 google-ads-diagnosis;账户ID+周期/月度→P4;Meta/TikTok/Bing周期→P4/P4-FB;多账户对比→P3/P5;OKKI周报→P6;Google询盘→P7;官网+明确要搜索广告方案/campaign JSON→W3;仅要词表+搜索量/竞争度→W5;平台优化报告列表/推送→W7;对象仍不清→Read intent-routing.md。【账户】列表/余额/消耗/激活账单(W1)、多账户余额预警 balance-scan(P2)、多户消耗汇总 accounts-digest(P3)、六大媒体开户与进度(W2)、分享/解绑/MCC/BC/BM/权限(W9)。【投放】Google **仅支持搜索广告(Search)与 PMax**(不支持展示广告 Display);搜索系列方案与 campaign-validate/create(W3)、系列/组/广告/关键词 CRUD/拒审、PMax 创建与素材、AI智投草稿 batch(W4)、拓词 keyword -k(W5)、AI广告优化 optimize(W6)、优化合规 SOP。【财务】充值/钱包、转账记录、发票/开票/抬头(W8);写操作审计与 restore。【运营】智能预警 forewarning 创建/启停/记录(W10)、TikTok/Meta 线索 clue(W11)、日周巡检(W12)、宿主编排/投放自控/异常监控(hosted-automation)。【其他】RAG 知识库检索、Meta/Facebook 周期与诊断 HTML、Google/Meta 周期 Excel、多账户 google-analysis-batch。
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: 需要 Node.js 18+、已安装 siluzan-tso-cli,通过 send-login-code + login 或 config set 完成鉴权
|
|
6
6
|
metadata:
|
|
@@ -42,6 +42,7 @@ siluzan-tso -h
|
|
|
42
42
|
- **Google CID 特殊性**:UI 常写 `123-456-7890`(带连字符),平台 `mediaCustomerId` 为纯数字 `1234567890`。CLI 会自动去连字符;**勿**把带横杠 403 误判为 OAuth 失效。优先用 `list-accounts` 的纯数字 ID。
|
|
43
43
|
- **禁止臆测授权过期**:见 403/`HTTP 403`/拉数失败/「可能 OAuth 失效」时,**禁止**口头推断授权过期或直接 `reauth`。须先核验 ID(及 Google 连字符),再跑 `account check-access -a <mediaCustomerId>`(套餐已激活前提下),以返回的 `accessible` / `reauth_required` / `no_permission` 为准;细则见 `accounts-permissions.md`。
|
|
44
44
|
- **Google 广告命令名**:列表是 `ad campaigns`(不是 `ad-campaigns` / `campaign list`);`balance`/`stats` 须带 `-m Google`;单国地域用 `ad geo search … --json-out`(或 `geo resolve`)。
|
|
45
|
+
- **Google 广告类型边界**:CLI/Skill **仅支持** Google **搜索广告(Search)** 与 **Performance Max(PMax)** 的方案、创建与精细管理;**不支持展示广告(Display)**(含自适应展示广告 RDA、独立 Display 系列)。用户要做展示广告时须明确告知不支持,可改推 Search / PMax;**禁止**用 `campaign-create` / `ad-create` 伪装创建 Display。
|
|
45
46
|
- **创建完成后交付(硬性)**:跑完 `ad batch diff`(须带 `--json-out`/`--md-out`)后,把落盘 JSON 的 **`reportMarkdown` 全文**(或 Read `reportMarkdownFile`)以 **Markdown 消息原样发给用户**;禁止只摘要、禁止只说「创建成功/未发现缺失」。
|
|
46
47
|
- `list-accounts` 无余额/消耗;列全部用 `--page-size 999`。
|
|
47
48
|
- 多户余额用 `balance-scan`(P2),多户消耗用 `accounts-digest`(P3);禁止外层 for-loop 逐户拉数。
|
|
@@ -72,9 +73,12 @@ siluzan-tso -h
|
|
|
72
73
|
|
|
73
74
|
### Google 广告投放
|
|
74
75
|
|
|
76
|
+
> **类型边界**:仅 **Search** + **PMax**;**不支持 Display(展示广告)**。详见 `references/google-ads/google-ads.md` Gotchas。
|
|
77
|
+
|
|
75
78
|
| 用户意图(关键词) | 工作流 | 必读文档 |
|
|
76
79
|
| ------------------ | ------ | -------- |
|
|
77
80
|
| 新建搜索系列 / 出投放方案 / Excel·表格方案 / 官网生成搜索广告 | **W3** | `references/google-ads/google-ads-campaign-plan.md`(§**仅出方案 vs 创建**)+ **`assets/campaign-create-template.json`**(先 Read)+ `assets/campaign-create-template.md` + `rules/google-ads-launch-plan-template.md`(JSON 后**写代码**投影完整审查稿);有方案文件时加 `rules/google-ads-plan-source-fidelity.md`。**≠ P8 / ≠ P9 / ≠ W5**;**禁止**因缺账户阻塞出方案、**禁止**只交概览表 |
|
|
81
|
+
| 展示广告 / Display / 自适应展示广告(RDA) | — | **不支持**。向用户说明后改推 Search(W3)或 PMax(W3);勿创建、勿假装已支持 |
|
|
78
82
|
| 广告系列/组/广告/关键词 **查询** / 拒审字段 | W3 | `references/google-ads/google-ads-read.md` |
|
|
79
83
|
| 广告系列/组/广告/关键词 **创建·编辑·启停** | W3 | `references/google-ads/google-ads-write.md` |
|
|
80
84
|
| PMax 系列 | W3 | **`assets/pmax-create-template.json`**(先 Read)+ `assets/pmax-create-template.md` + `rules/google-ads-pmax-launch-plan-template.md`(**写代码**投影完整审查稿)+ `references/google-ads/pmax-api.md` + `google-ads-write.md`(PMax 节) |
|
package/dist/skill/_meta.json
CHANGED
|
@@ -23,7 +23,8 @@ siluzan-tso balance-scan -m <媒体类型> [选项]
|
|
|
23
23
|
| ---- | ---- | ---- |
|
|
24
24
|
| `-m, --media <type>` | 必填:`Google \| TikTok \| Yandex \| MetaAd \| BingV2 \| Kwai` | — |
|
|
25
25
|
| `-a, --accounts <ids>` | 指定 `mediaCustomerId`(逗号分隔);**跳过清单翻页**,拉取后全部输出(不按阈值过滤) | — |
|
|
26
|
-
| `--threshold-days <n>` |
|
|
26
|
+
| `--threshold-days <n>` | 剩余续航天数阈值 | `7` |
|
|
27
|
+
| `--spend-days <n>` | 日均消耗回看自然日数(截至昨天不含今天;日均 = 窗口合计 / N) | `7` |
|
|
27
28
|
| `--min-balance <n>` | 绝对余额阈值(与 threshold 取并集) | — |
|
|
28
29
|
| `--min-daily-spend <n>` | 日均消耗低于此值视为僵尸账户,不做续航估算 | `0.01` |
|
|
29
30
|
| `--target-days <n>` | 建议充值目标续航天数 | `30` |
|
|
@@ -36,6 +37,9 @@ siluzan-tso balance-scan -m <媒体类型> [选项]
|
|
|
36
37
|
# 全量巡检(Playbook P2)
|
|
37
38
|
siluzan-tso balance-scan -m Google --threshold-days 7 --json-out ./snap-p2
|
|
38
39
|
|
|
40
|
+
# 近 3 日日均 + 续航阈值 7 天
|
|
41
|
+
siluzan-tso balance-scan -m Google --threshold-days 7 --spend-days 3 --json-out ./snap-p2
|
|
42
|
+
|
|
39
43
|
# 已知子集
|
|
40
44
|
siluzan-tso balance-scan -m BingV2 -a id1,id2,id3 --json-out ./snap-p2-subset
|
|
41
45
|
|
|
@@ -43,7 +47,7 @@ siluzan-tso balance-scan -m BingV2 -a id1,id2,id3 --json-out ./snap-p2-subset
|
|
|
43
47
|
siluzan-tso balance-scan -m MetaAd --json-out ./snap-p2-meta
|
|
44
48
|
```
|
|
45
49
|
|
|
46
|
-
**读盘要点**:先看 `meta.dataIssue`(非空则失败);再按 `remainingDays` 升序交付;`hitReason="none"` 表示未触阈值;用 **`dailySpend`**
|
|
50
|
+
**读盘要点**:先看 `meta.dataIssue`(非空则失败);再按 `remainingDays` 升序交付;`hitReason="none"` 表示未触阈值;用 **`dailySpend`** 做日均(口径见 `meta.spendDays` / `meta.spendWindow`),勿把 `stats` 区间合计 `spend` 当「每天消耗」。与 `balance` / `accounts-digest` 分工见 `references/core/agent-conventions.md` §八。
|
|
47
51
|
|
|
48
52
|
---
|
|
49
53
|
|
|
@@ -240,6 +240,7 @@
|
|
|
240
240
|
| 「这个**网站**好不好 / 能不能投 / **是否符合投放要求**」(无广告方案诉求) | **P8** | 误走 W3(因带「Google 广告」);或 WebFetch 当终稿 |
|
|
241
241
|
| 「**电商/制造**行业怎么样 / 市场格局」(**无 URL**) | **P9** | 误走 P8 |
|
|
242
242
|
| 「根据**官网**做 **Google 搜索广告** / 关键词表」 | **W3**(可无账户先出方案) | 误走 P8;或卡在要账户才出方案 |
|
|
243
|
+
| 「做 **展示广告** / Display / 自适应展示广告(RDA)」 | **不支持**(告知用户;可改推 Search / PMax → W3) | 误用 `campaign-create` / `ad-create` 伪装 Display |
|
|
243
244
|
| 「读**网址/文章** + **核心词** + 要 **月搜索量/竞争度** 长尾词表」 | **W5(§零·C)** | 纯 WebSearch 编数;误走 P8/P9/W3 |
|
|
244
245
|
| 只要 **Keyword Planner / 拓词** 指标,不要 campaign JSON | **W5** | 误走 W3 走 validate/create |
|
|
245
246
|
|
|
@@ -264,6 +265,7 @@
|
|
|
264
265
|
| `转化成本监控` / `CPA 监控` / `谷歌ADS转化成本` / `低余额账户转化成本` | **P3(§零·D)** | `accounts-digest`;可加 `--max-cpa` |
|
|
265
266
|
| `昨日零询盘` / `零询盘账户` / `0 转化` / `有消耗无转化`(**无 CRM 附件**) | **P3(§零·D)** | `--zero-conversions`;**不是 P7** |
|
|
266
267
|
| `根据 … 生成 Google **搜索**广告` / `搜索广告方案` / `关键词表` + 官网 URL | **W3** | ≠ P8 ≠ P9;若同时要 **搜索量/竞争度** → **W5** |
|
|
268
|
+
| `展示广告` / `Display 广告` / `自适应展示广告` / `RDA`(要创建/出方案) | **不支持** | 仅 Search + PMax;告知后可改推 W3 |
|
|
267
269
|
| **月搜索量** / **竞争度** / **Keyword Planner** / **长尾关键词** / **针对核心词推荐** | **W5(§零·C)** | 必 `keyword --google-only` |
|
|
268
270
|
| `丝路赞` / `Siluzan` + `优化报告列表` / `报告推送` | **W7** | ≠ 自拉数 P1/P4 |
|
|
269
271
|
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
## W3 · Google 广告创建与精细管理
|
|
56
56
|
|
|
57
57
|
- **触发**:新建搜索系列、出投放方案、**按 Excel/表格投放方案创建**、**根据官网/网站/URL 生成 Google 搜索广告(含「表格格式」)**、搜索广告文案/关键词/计划表、系列/组/广告/关键词 CRUD、PMax、拒审处理、日常调价/启停。
|
|
58
|
+
- **类型边界**:本工作流 **仅支持** Google **搜索广告(Search)** 与 **PMax**;**不支持展示广告(Display)**(含 RDA / 独立 Display 系列)。用户要做展示广告 → 明确告知不支持,可改推 Search / PMax;**禁止**用本卡片流程伪装创建 Display。
|
|
58
59
|
- **勿误判**:仅给官网 URL 且目标是「写/生成搜索广告」→ **本卡片(W3)**,不是 P8 网站诊断、不是 P9 市场分析;若用户只要拓词无系列结构 → **W5**。
|
|
59
60
|
- **仅出方案(默认优先)**:用户说「出方案 / 规划 / 表格 / 先别创建·开户·投钱」,或**未给账户且未要求创建** → 按 `google-ads-campaign-plan.md` §「仅出方案 vs 创建」:落盘 JSON + **写代码投影完整审查稿**(默认 MD;用户指定则 Excel 等),`account`=`[PENDING_ACCOUNT]`;**禁止**先要广告账户再开工;跳过 `list-accounts` / `geo resolve` / validate / create,直到用户确认创建。
|
|
60
61
|
- **必读**:方案与门禁 `references/google-ads/google-ads-campaign-plan.md` + **`assets/campaign-create-template.json`**(先 Read)+ `assets/campaign-create-template.md` + `rules/google-ads-launch-plan-template.md`;**有 Excel/表格方案时另读** `references/google-ads/rules/google-ads-plan-source-fidelity.md`;写命令参数 `references/google-ads/google-ads-write.md`;查询/拒审 `google-ads-read.md`;batch 补建 `google-ads-batch.md`;PMax 加 **`assets/pmax-create-template.json`** + `assets/pmax-create-template.md` + `rules/google-ads-pmax-launch-plan-template.md` + `references/google-ads/pmax-api.md`。
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# Google 搜索广告:方案生成与系列创建
|
|
2
2
|
|
|
3
3
|
> **新建/规划搜索系列时 Read 本文件**。写命令见 `google-ads-write.md`;batch 见 `google-ads-batch.md`;查询见 `google-ads-read.md`。
|
|
4
|
+
>
|
|
5
|
+
> **类型边界**:本文件仅覆盖 **搜索广告(Search)**。PMax 走 `pmax-api.md` / `pmax-create-template`。**不支持展示广告(Display)**——用户要 Display 时须说明不支持,勿用本文件 JSON 伪装。
|
|
4
6
|
|
|
5
7
|
---
|
|
6
8
|
|
|
@@ -12,12 +12,21 @@
|
|
|
12
12
|
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
+
## 支持范围
|
|
16
|
+
|
|
17
|
+
- ✅ **搜索广告(Search)**:`campaign-validate` / `campaign-create`、组/关键词、`ad-create`(RSA)等
|
|
18
|
+
- ✅ **Performance Max(PMax)**:`pmax-validate` / `pmax-create` 及存量 PMax 写命令(见 `pmax-api.md`)
|
|
19
|
+
- ❌ **展示广告(Display)**:**不支持**创建与精细管理(含 RDA);用户要 Display 时须说明不支持并改推 Search / PMax,**禁止**伪装创建
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
15
23
|
## 写操作硬纪律(Agent 易踩)
|
|
16
24
|
|
|
17
25
|
- **必须** `--commit "…"`;漏了会直接失败。
|
|
18
26
|
- 列表命令:`ad campaigns` / `ad groups` / `ad list` / `ad keywords`(**没有** `google-ads`、没有必用 `campaign-list`;`campaign-list` 仅为 `campaigns` 别名)。
|
|
19
27
|
- `--json-out <path>`:**路径必填**,JSON 落盘;禁止 `--json-out` 裸用或管道 stdout。
|
|
20
28
|
- 系列 `statusDisplay` 含「投放期已结束」≠ 已删除;以 JSON **`statusV2`** 为准(见 `google-ads-read.md`)。
|
|
29
|
+
- **勿创建 Display**:`campaign-create` / `ad-create` 仅面向 Search(RSA);PMax 走 `pmax-*`。
|
|
21
30
|
|
|
22
31
|
---
|
|
23
32
|
|
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
> `SKILL.md` / 工作流已指向子文件时,**直接 Read 子文件**。本文件含共享 Gotchas。
|
|
4
4
|
|
|
5
|
+
## 支持的广告类型(硬边界)
|
|
6
|
+
|
|
7
|
+
| 类型 | CLI / Skill | 说明 |
|
|
8
|
+
| ---- | ----------- | ---- |
|
|
9
|
+
| **搜索广告(Search)** | ✅ 支持 | 方案、`campaign-validate` / `campaign-create`、组/RSA/关键词 CRUD、扩展等 |
|
|
10
|
+
| **Performance Max(PMax)** | ✅ 支持 | `pmax-validate` / `pmax-create` 及存量 PMax 管理(见 `pmax-api.md`) |
|
|
11
|
+
| **展示广告(Display)** | ❌ **不支持** | 含独立 Display 系列、自适应展示广告(RDA)等;**禁止**创建或伪装创建 |
|
|
12
|
+
|
|
13
|
+
用户明确要求展示广告时:如实告知不支持,可改推 Search 或 PMax;**禁止**用搜索系列 JSON / `ad-create`(RSA)冒充 Display。
|
|
14
|
+
|
|
15
|
+
> 账户内若已有 Display 系列,`ad campaigns` 等**只读列表**仍可能见到(`channelTypeV2` 含 `DISPLAY`);本 Skill **不对**其做方案/创建/精细写管理。
|
|
16
|
+
|
|
5
17
|
## 何时 Read
|
|
6
18
|
|
|
7
19
|
| 任务 | Read |
|
|
@@ -15,6 +27,7 @@
|
|
|
15
27
|
|
|
16
28
|
## Gotchas
|
|
17
29
|
|
|
30
|
+
- **广告类型**:仅 Search + PMax;**不支持 Display**(见上文「支持的广告类型」)。
|
|
18
31
|
- **命令名**:系列列表是 `ad campaigns`(别名 `campaign-list`),**禁止** `ad-campaigns` / `campaign list`。`balance`/`stats` 须 `-m Google`。
|
|
19
32
|
- **Google 客户 ID(CID)带连字符**:UI / 用户口述常为 `123-456-7890`,平台 `mediaCustomerId` 与 Google 网关路径需要 `1234567890`。`ad campaigns` / `ad groups` / `ad list` 等 `-a` 与 JSON 顶层 `account` **可带连字符**(CLI 自动去掉)。若错误为 `HTTP 403:123-456-7890`(回显带横杠),先换纯数字重试,**禁止**据此直接判断 OAuth 过期或 `reauth`。
|
|
20
33
|
- **禁止臆测授权过期**:`ad *` / geo / 拉数出现 403/500 时,**禁止**对用户说「授权可能过期」。须核验 ID 后,在套餐已激活前提下执行 `account check-access -a <mediaCustomerId>`,仅当 `reauth_required`(或与 `invalidOAuthToken=true` 交叉确认)才走重授权。见 [`accounts-permissions.md`](../accounts/accounts-permissions.md)。
|
|
@@ -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.
|
|
12
|
+
$PKG_VERSION = '1.1.44-beta.1'
|
|
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.
|
|
12
|
+
readonly PKG_VERSION="1.1.44-beta.1"
|
|
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"
|