siluzan-tso-cli 1.1.48-beta.1 → 1.1.48-beta.3
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 +57 -7
- package/dist/skill/AGENTS.md +1 -1
- package/dist/skill/SKILL.md +1 -1
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/assets/meta-lead-create-template.json +42 -1
- package/dist/skill/assets/meta-lead-create-template.md +3 -1
- package/dist/skill/references/README.md +1 -0
- package/dist/skill/references/accounts/accounts-balance-stats.md +1 -1
- package/dist/skill/references/core/agent-conventions.md +2 -0
- package/dist/skill/references/core/intent-routing.md +2 -1
- package/dist/skill/references/core/playbooks.md +2 -2
- package/dist/skill/references/core/tips.md +9 -0
- package/dist/skill/references/core/workflows.md +9 -8
- package/dist/skill/references/meta-ads/meta-ads-write.md +1 -1
- package/dist/skill/references/meta-ads/meta-ads.md +1 -0
- package/dist/skill/references/meta-ads/meta-lead-launch-plan-template.md +168 -0
- package/dist/skill/scripts/install.ps1 +1 -1
- package/dist/skill/scripts/install.sh +1 -1
- package/eval/cases/uj-meta-ad-validate-before-create-stub.scenario.json +3 -2
- 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.48-beta.
|
|
54
|
+
> **注意**:当前为测试版(1.1.48-beta.3),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
55
55
|
|
|
56
56
|
| 助手 | 建议 `--ai` |
|
|
57
57
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -2813,6 +2813,9 @@ function createVersionNotifier(opts) {
|
|
|
2813
2813
|
}
|
|
2814
2814
|
return { notifyIfOutdated: notifyIfOutdated2, fetchLatestVersion: fetchLatestVersion2 };
|
|
2815
2815
|
}
|
|
2816
|
+
function sanitizeTableCell(value) {
|
|
2817
|
+
return String(value ?? "").replace(/\r\n|\r|\n/g, " ").replace(/\|/g, TABLE_CELL_PIPE);
|
|
2818
|
+
}
|
|
2816
2819
|
function printCliTable(rows, columns, options) {
|
|
2817
2820
|
if (rows.length === 0) return;
|
|
2818
2821
|
const plain = options?.plain !== false;
|
|
@@ -2826,7 +2829,7 @@ function printCliTable(rows, columns, options) {
|
|
|
2826
2829
|
style: plain ? { head: [], border: [] } : void 0
|
|
2827
2830
|
});
|
|
2828
2831
|
for (const r of rows) {
|
|
2829
|
-
table.push(columns.map((c) =>
|
|
2832
|
+
table.push(columns.map((c) => sanitizeTableCell(r[c.key])));
|
|
2830
2833
|
}
|
|
2831
2834
|
for (const line of table.toString().split("\n")) {
|
|
2832
2835
|
printLine(indent + line);
|
|
@@ -3901,7 +3904,7 @@ async function issueApiKeyWithPhoneCode(opts) {
|
|
|
3901
3904
|
});
|
|
3902
3905
|
return apiKey;
|
|
3903
3906
|
}
|
|
3904
|
-
var import_semver, SILUZAN_DIR, CONFIG_FILE, inProcessLockChain, ALLOWED_HOSTNAME_SUFFIXES, EXACT_ID_FIELD_NAMES, SILUZAN_AGENT_COMPANY_SOURCE_TYPE, DEERFLOW_AGENT_ENV, _clientProduct, _resolveVersion, DEFAULT_TIMEOUT_MS, MAX_RESPONSE_BYTES, httpsAgent, httpAgent, PERF_PREFIX, DEFAULT_DETAIL_MAX, VERBOSE_DETAIL_MAX, ASCII_TABLE_CHARS, CLI_SNAPSHOT_MANIFEST_FILE, SCHEMA_VERSION, FALLBACK_FIELD_GUIDE_REFS, _cliPackage, _resolveCliVersion, _fieldGuideRefs, OUTLINE_AGENT_HINT, TS_LIKE_ARRAY_SAMPLE_MAX, MAX_INVOCATION_CHARS, currentInvocation, MAX_COMMIT_CHARS, WRITE_AUDIT_AGENT_AUTO_COMMIT, cliCommitOverride, WRITE_AUDIT_SCHEMA_VERSION, MUTATING, BEIJING_TZ, AUDIT_LOG_FILENAME_RE, DEFAULT_MAX_FILE_MB, MIN_SEGMENT_BYTES, MAX_SEGMENT_BYTES, DEFAULT_RETENTION_DAYS, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS, PRUNE_THROTTLE_MS, lastPruneAtMs, MAX_BODY_CHARS, MAX_ERROR_CHARS, DEFAULT_FIND_AUDIT_MAX_DAYS, MAX_SNAPSHOT_FILE_BYTES, API_KEY_SERVICE_VALUES;
|
|
3907
|
+
var import_semver, SILUZAN_DIR, CONFIG_FILE, inProcessLockChain, ALLOWED_HOSTNAME_SUFFIXES, EXACT_ID_FIELD_NAMES, SILUZAN_AGENT_COMPANY_SOURCE_TYPE, DEERFLOW_AGENT_ENV, _clientProduct, _resolveVersion, DEFAULT_TIMEOUT_MS, MAX_RESPONSE_BYTES, httpsAgent, httpAgent, PERF_PREFIX, DEFAULT_DETAIL_MAX, VERBOSE_DETAIL_MAX, TABLE_CELL_PIPE, ASCII_TABLE_CHARS, CLI_SNAPSHOT_MANIFEST_FILE, SCHEMA_VERSION, FALLBACK_FIELD_GUIDE_REFS, _cliPackage, _resolveCliVersion, _fieldGuideRefs, OUTLINE_AGENT_HINT, TS_LIKE_ARRAY_SAMPLE_MAX, MAX_INVOCATION_CHARS, currentInvocation, MAX_COMMIT_CHARS, WRITE_AUDIT_AGENT_AUTO_COMMIT, cliCommitOverride, WRITE_AUDIT_SCHEMA_VERSION, MUTATING, BEIJING_TZ, AUDIT_LOG_FILENAME_RE, DEFAULT_MAX_FILE_MB, MIN_SEGMENT_BYTES, MAX_SEGMENT_BYTES, DEFAULT_RETENTION_DAYS, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS, PRUNE_THROTTLE_MS, lastPruneAtMs, MAX_BODY_CHARS, MAX_ERROR_CHARS, DEFAULT_FIND_AUDIT_MAX_DAYS, MAX_SNAPSHOT_FILE_BYTES, API_KEY_SERVICE_VALUES;
|
|
3905
3908
|
var init_dist = __esm({
|
|
3906
3909
|
"../common/dist/index.js"() {
|
|
3907
3910
|
"use strict";
|
|
@@ -3969,6 +3972,7 @@ var init_dist = __esm({
|
|
|
3969
3972
|
PERF_PREFIX = "[SILUZAN_HTTP_PERF]";
|
|
3970
3973
|
DEFAULT_DETAIL_MAX = 400;
|
|
3971
3974
|
VERBOSE_DETAIL_MAX = 800;
|
|
3975
|
+
TABLE_CELL_PIPE = "\uFF5C";
|
|
3972
3976
|
ASCII_TABLE_CHARS = {
|
|
3973
3977
|
top: "-",
|
|
3974
3978
|
"top-mid": "+",
|
|
@@ -116990,7 +116994,7 @@ function printPlanItemsByAdGroup(configFile, layer, layerItems) {
|
|
|
116990
116994
|
}
|
|
116991
116995
|
}
|
|
116992
116996
|
function mdCell(text) {
|
|
116993
|
-
return text.replace(
|
|
116997
|
+
return text.replace(/\r?\n/g, " ").replace(/\|/g, "\uFF5C").trim();
|
|
116994
116998
|
}
|
|
116995
116999
|
function statusLabel(status) {
|
|
116996
117000
|
if (status === "ok") return "\u2705 \u5DF2\u521B\u5EFA";
|
|
@@ -122410,8 +122414,21 @@ function withMoneyDisplay(obj, currency) {
|
|
|
122410
122414
|
function formatYuanDisplay(value) {
|
|
122411
122415
|
return value == null ? "\u2014" : String(value);
|
|
122412
122416
|
}
|
|
122417
|
+
var META_PENDING_ACCOUNT = "[PENDING_ACCOUNT]";
|
|
122418
|
+
var META_PENDING_PAGE = "[PENDING_PAGE]";
|
|
122419
|
+
function isPendingMetaAccount(raw) {
|
|
122420
|
+
const t = (raw ?? "").trim();
|
|
122421
|
+
return t === "" || t === META_PENDING_ACCOUNT || t === "PENDING_ACCOUNT";
|
|
122422
|
+
}
|
|
122423
|
+
function isPendingMetaPage(raw) {
|
|
122424
|
+
const t = (raw ?? "").trim();
|
|
122425
|
+
return t === "" || t === META_PENDING_PAGE || t === "PENDING_PAGE";
|
|
122426
|
+
}
|
|
122413
122427
|
function parseMetaAccountId(raw) {
|
|
122414
122428
|
const t = (raw ?? "").trim();
|
|
122429
|
+
if (isPendingMetaAccount(t)) {
|
|
122430
|
+
return { ok: false, error: "account \u4ECD\u662F\u5360\u4F4D\uFF0Ccreate \u524D\u987B\u6362\u6210\u771F\u5B9E mediaCustomerId" };
|
|
122431
|
+
}
|
|
122415
122432
|
if (!t) return { ok: false, error: "account \u4E0D\u80FD\u4E3A\u7A7A" };
|
|
122416
122433
|
const digits = t.startsWith("act_") ? t.slice(4) : t;
|
|
122417
122434
|
if (!/^\d+$/.test(digits)) {
|
|
@@ -122900,10 +122917,21 @@ function pushBudgetPairErrors(errors, label, daily, lifetime) {
|
|
|
122900
122917
|
function runMetaLeadValidation(cfg) {
|
|
122901
122918
|
const errors = [];
|
|
122902
122919
|
const warnings = [];
|
|
122903
|
-
const
|
|
122904
|
-
if (
|
|
122905
|
-
|
|
122906
|
-
|
|
122920
|
+
const pendingAccount = isPendingMetaAccount(cfg.account);
|
|
122921
|
+
if (pendingAccount) {
|
|
122922
|
+
warnings.push(
|
|
122923
|
+
"account \u4E3A\u5360\u4F4D\uFF08\u4EC5\u51FA\u65B9\u6848\uFF09\uFF1Bcreate \u524D\u987B\u6362\u6210\u771F\u5B9E mediaCustomerId\uFF0C\u5E76\u5148 meta-ad pages"
|
|
122924
|
+
);
|
|
122925
|
+
} else {
|
|
122926
|
+
const account = parseMetaAccountId(cfg.account);
|
|
122927
|
+
if (!account.ok) errors.push(account.error);
|
|
122928
|
+
}
|
|
122929
|
+
if (isPendingMetaPage(cfg.pageId)) {
|
|
122930
|
+
if (pendingAccount) {
|
|
122931
|
+
warnings.push("pageId \u4E3A\u5360\u4F4D/\u7A7A\uFF08\u4EC5\u51FA\u65B9\u6848\uFF09\uFF1Bcreate \u524D\u5148 meta-ad pages \u53D6\u53EF\u6295\u653E\u4E3B\u9875");
|
|
122932
|
+
} else {
|
|
122933
|
+
errors.push("pageId \u5FC5\u586B\uFF08\u5148 meta-ad pages \u53D6\u53EF\u6295\u653E\u4E3B\u9875\uFF09");
|
|
122934
|
+
}
|
|
122907
122935
|
}
|
|
122908
122936
|
const mode = String(cfg.budgetMode ?? "").trim().toUpperCase();
|
|
122909
122937
|
if (mode !== "CBO" && mode !== "ABO") {
|
|
@@ -123028,6 +123056,28 @@ function runMetaLeadValidation(cfg) {
|
|
|
123028
123056
|
warnings.push(`${label}=ACTIVE \u4F1A\u5728\u521B\u5EFA\u65F6\u5C1D\u8BD5\u6295\u653E\uFF1B\u5EFA\u8BAE\u7701\u7565\uFF0C\u9ED8\u8BA4 PAUSED\uFF0C\u786E\u8BA4\u540E\u518D\u6539\u72B6\u6001`);
|
|
123029
123057
|
}
|
|
123030
123058
|
}
|
|
123059
|
+
const plan = cfg.plan;
|
|
123060
|
+
if (plan) {
|
|
123061
|
+
const tracks = plan.tracks ?? [];
|
|
123062
|
+
if (tracks.length < 3) {
|
|
123063
|
+
warnings.push("plan.tracks \u5EFA\u8BAE\u81F3\u5C11 3 \u4E2A\u89C6\u89C9\u5DEE\u5F02\u5957\u7CFB\uFF08\u5BA1\u67E5\u7A3F A/B/C\uFF09");
|
|
123064
|
+
}
|
|
123065
|
+
const visual = plan.matrix?.visual ?? [];
|
|
123066
|
+
const bodyTone = plan.matrix?.bodyTone ?? [];
|
|
123067
|
+
const headline = plan.matrix?.headline ?? [];
|
|
123068
|
+
if (visual.length < 3 || bodyTone.length < 2 || headline.length < 2) {
|
|
123069
|
+
warnings.push("plan.matrix \u5EFA\u8BAE\u81F3\u5C11 3 \u89C6\u89C9 \xD7 2 \u6B63\u6587\u6C14\u8D28 \xD7 2 \u6807\u9898\uFF083\xD72\xD72\uFF09");
|
|
123070
|
+
}
|
|
123071
|
+
if ((plan.adSets?.length ?? 0) > 1) {
|
|
123072
|
+
warnings.push(
|
|
123073
|
+
"plan.adSets \u591A\u7EC4\u53EA\u5199\u5165\u5BA1\u67E5\u7A3F\uFF1B\u4E00\u6B21 meta-ad create \u53EA\u843D\u5730 JSON.adset\uFF0C\u5176\u4F59\u7528 adset-create \u7EED\u5EFA"
|
|
123074
|
+
);
|
|
123075
|
+
}
|
|
123076
|
+
} else {
|
|
123077
|
+
warnings.push(
|
|
123078
|
+
"\u7F3A\u5C11 plan\uFF1A\u521B\u5EFA\u524D\u987B\u6309 meta-lead-launch-plan-template.md \u4ECE JSON \u6295\u5F71\u5B8C\u6574\u5BA1\u67E5\u7A3F\uFF1B\u5EFA\u8BAE\u8865 plan \u4EE5\u514D\u5BA1\u67E5\u7A3F\u7F3A\u54C1\u724C/\u5957\u7CFB/\u77E9\u9635"
|
|
123079
|
+
);
|
|
123080
|
+
}
|
|
123031
123081
|
return { errors, warnings };
|
|
123032
123082
|
}
|
|
123033
123083
|
async function runMetaAdValidate(opts) {
|
package/dist/skill/AGENTS.md
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
| Core | `references/core/` | conventions、intent-routing、playbooks、workflows |
|
|
29
29
|
| Accounts | `references/accounts/` | 直接读 `accounts-list` / `accounts-balance-stats` / `accounts-permissions` |
|
|
30
30
|
| Google Ads | `references/google-ads/` | `google-ads-read` / `write` / `batch`;`rules/` 先 README 再单文件 |
|
|
31
|
-
| Meta Ads | `references/meta-ads/` | Instant Form
|
|
31
|
+
| Meta Ads | `references/meta-ads/` | Instant Form:`meta-ads` / `read` / `write` + `meta-lead-launch-plan-template` |
|
|
32
32
|
| Analytics | `references/analytics/` | 拉数、批处理、拓词 |
|
|
33
33
|
| Operations | `references/operations/` | 预警、线索;自动化仅用户问起时 |
|
|
34
34
|
| Templates | `report-templates/*.md`、`assets/` | 报告纲要 / JSON 契约 |
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -93,7 +93,7 @@ siluzan-tso -h
|
|
|
93
93
|
|
|
94
94
|
| 用户意图(关键词) | 工作流 | 必读文档 |
|
|
95
95
|
| ------------------ | ------ | -------- |
|
|
96
|
-
| 新建 Meta/Facebook 线索广告 / Instant Form / 潜在客户表单投放 | **W13** | `references/meta-ads/meta-ads.md` + **`assets/meta-lead-create-template.json`**(先 Read)+ `assets/meta-lead-create-template.md` + `references/meta-ads/meta-ads-write.md`。**≠ W11 ≠ P4-FB ≠ W3** |
|
|
96
|
+
| 新建 Meta/Facebook 线索广告 / Instant Form / 潜在客户表单投放 / **出 Facebook 线索方案或表格** | **W13** | `references/meta-ads/meta-ads.md` + **`assets/meta-lead-create-template.json`**(先 Read)+ `assets/meta-lead-create-template.md` + **`references/meta-ads/meta-lead-launch-plan-template.md`**(**写代码**投影审查稿)+ `references/meta-ads/meta-ads-write.md`。**≠ W11 ≠ P4-FB ≠ W3** |
|
|
97
97
|
| Meta 系列/组/广告 **查询**(按 ID)/ 主页 / 表单列表 | W13 | `references/meta-ads/meta-ads-read.md` |
|
|
98
98
|
| Meta 系列/组/广告 **创建·编辑·启停**(原语) | W13 | `references/meta-ads/meta-ads-write.md` |
|
|
99
99
|
|
package/dist/skill/_meta.json
CHANGED
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"dailyBudget / lifetimeBudget 填元(10 = $10 / ¥10),禁止填网关最小单位 1000 当 10 元",
|
|
11
11
|
"form.reuseId 与新建表单字段二选一;表单建成后几乎不可改",
|
|
12
12
|
"图片三选一:imageHash / imagePath / imageUrl;创意必须用 hash",
|
|
13
|
-
"提交前:meta-
|
|
13
|
+
"提交前:validate → 写代码按 meta-lead-launch-plan-template.md 投影审查稿 → 用户确认 → create --commit",
|
|
14
|
+
"仅出方案:account=[PENDING_ACCOUNT] pageId=[PENDING_PAGE];勿因缺账户阻塞",
|
|
14
15
|
"create 默认 PAUSED;投放须三个对象分别 *-status ACTIVE",
|
|
15
16
|
"pages --json-out 读 items[].id(不是 pages[]);403 或空列表不要硬填 pageId",
|
|
16
17
|
"建广告报支付方式则停,补付款后 ad-create 续跑,不要重头 create",
|
|
@@ -60,5 +61,45 @@
|
|
|
60
61
|
},
|
|
61
62
|
"ad": {
|
|
62
63
|
"name": "Lead-Ad"
|
|
64
|
+
},
|
|
65
|
+
"plan": {
|
|
66
|
+
"brand": "ExampleBrand",
|
|
67
|
+
"customerName": "Example Co.",
|
|
68
|
+
"siteUrl": "https://www.example.com",
|
|
69
|
+
"pageUrl": "",
|
|
70
|
+
"businessOneLiner": "一句话业务",
|
|
71
|
+
"mainResult": "Instant Form 询盘",
|
|
72
|
+
"landingType": "产品页询盘 + 广告内即时表单(非仅官网首页)",
|
|
73
|
+
"creativeSpec": "4:5(1080×1350)或 1:1;图字 <20%",
|
|
74
|
+
"endorsements": [{ "text": "公开页面可见的认证/年限", "verified": false }],
|
|
75
|
+
"tracks": [
|
|
76
|
+
{
|
|
77
|
+
"id": "A",
|
|
78
|
+
"name": "产线实拍",
|
|
79
|
+
"shots": [
|
|
80
|
+
{
|
|
81
|
+
"id": "A1",
|
|
82
|
+
"composition": "车间中景,主体居中",
|
|
83
|
+
"onImageText": "Precision Aluminum Parts",
|
|
84
|
+
"tone": "工厂实证",
|
|
85
|
+
"forbid": "虚假认证、无法核对的数字",
|
|
86
|
+
"headlines": ["Factory Direct Quote", "Custom Aluminum Parts"],
|
|
87
|
+
"primaryText": "Hook\nPositioning\nProof + emoji\nCTA",
|
|
88
|
+
"cta": "Get Quote",
|
|
89
|
+
"description": "ISO-listed factory"
|
|
90
|
+
}
|
|
91
|
+
]
|
|
92
|
+
},
|
|
93
|
+
{ "id": "B", "name": "产品特写", "shots": [{ "id": "B1", "headlines": ["EV Motor Housing"], "primaryText": "…", "cta": "Learn More" }] },
|
|
94
|
+
{ "id": "C", "name": "场景应用", "shots": [{ "id": "C1", "headlines": ["Liquid-Cooled Housing"], "primaryText": "…", "cta": "Get Quote" }] }
|
|
95
|
+
],
|
|
96
|
+
"matrix": {
|
|
97
|
+
"visual": ["产线实拍", "产品特写", "场景应用"],
|
|
98
|
+
"bodyTone": ["证据向", "痛点向"],
|
|
99
|
+
"headline": ["规格向", "交付向"]
|
|
100
|
+
},
|
|
101
|
+
"complianceNotes": ["年限/客户数投放前核对", "不要写死无法核对的公差"],
|
|
102
|
+
"emojiPerPost": 2,
|
|
103
|
+
"adSets": [{ "name": "Lead-US", "countries": ["US"], "note": "本次 create 落地这一组" }]
|
|
63
104
|
}
|
|
64
105
|
}
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
| 场景 | 正确做法 |
|
|
12
12
|
| --- | --- |
|
|
13
|
-
| 创建 | `
|
|
13
|
+
| 创建 | `validate` → **写代码**按 `meta-lead-launch-plan-template.md` 投影审查稿(默认 MD;要表格出 xlsx)→ 用户确认 → `create --commit` |
|
|
14
|
+
| 仅出方案 | `account`=`[PENDING_ACCOUNT]`,`pageId`=`[PENDING_PAGE]`;JSON + 审查稿即可,**禁止**因缺账户阻塞 |
|
|
14
15
|
| 金额 | JSON 填**主币种元**(`10` = $10 / ¥10);CLI 按账户 `currency` 转最小单位。禁止把 `"1000"` 当 $1000 |
|
|
15
16
|
| CBO / ABO | `budgetMode=CBO`:预算只放 `campaign`;`ABO`:只放 `adset`。不能两边都有或都没有 |
|
|
16
17
|
| 主页 | 先 `meta-ad pages -a <id> --json-out`;空数组不要硬填历史 `pageId` |
|
|
@@ -38,6 +39,7 @@
|
|
|
38
39
|
| `adset.optimizationGoal` | 否 | 仅 `LEAD_GENERATION`(默认)/ `QUALITY_LEAD` |
|
|
39
40
|
| `creative.message` / `link` | 是 | `link` 常用隐私政策 URL |
|
|
40
41
|
| `ad.name` | 是 | 广告名 |
|
|
42
|
+
| `plan` | 审查稿建议有 | 品牌/套系/3×2×2/背书;create **不提交**。结构见 `references/meta-ads/meta-lead-launch-plan-template.md` |
|
|
41
43
|
|
|
42
44
|
`activate` 即使写 `true` 也不会自动投放。
|
|
43
45
|
|
|
@@ -50,6 +50,7 @@
|
|
|
50
50
|
| `references/meta-ads/meta-ads.md` | **Meta Instant Form 索引**(金额/ID) |
|
|
51
51
|
| `references/meta-ads/meta-ads-read.md` | 账户/主页/表单/按 ID 读系列组广告 |
|
|
52
52
|
| `references/meta-ads/meta-ads-write.md` | validate/create 与原语写命令 |
|
|
53
|
+
| `references/meta-ads/meta-lead-launch-plan-template.md` | 出方案/创建前审查稿(MD + 4 Sheet xlsx) |
|
|
53
54
|
| `assets/meta-lead-create-template.json` + `.md` | Lead Ad JSON 契约(**先 Read `.json`**) |
|
|
54
55
|
|
|
55
56
|
## 分析与报告
|
|
@@ -47,7 +47,7 @@ siluzan-tso balance-scan -m BingV2 -a id1,id2,id3 --json-out ./snap-p2-subset
|
|
|
47
47
|
siluzan-tso balance-scan -m MetaAd --json-out ./snap-p2-meta
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
**读盘要点**:先看 `meta.dataIssue`(非空则失败)。`data.items` = **全部已检查账户**(OAuth 失效户不在 items,见 `meta.skippedInvalidOAuth`);`meta.hitCount` = 触阈值条数。预警筛 `hitReason !== "none"`;`hitReason="none"` 表示已检查但未触阈值。按 `remainingDays` 升序交付。用 **`dailySpend`** 做日均(口径见 `meta.spendDays` / `meta.spendWindow`),勿把 `stats` 区间合计 `spend` 当「每天消耗」。Google 消耗走 `account-spend-overview`,`startDate`/`endDate` 带东八区墙钟(`…T00:00:00+08:00` / `…T23:59:59+08:00`),与 `stats` 同口径。与 `balance` / `accounts-digest` 分工见 `references/core/agent-conventions.md`
|
|
50
|
+
**读盘要点**:先看 `meta.dataIssue`(非空则失败)。`data.items` = **全部已检查账户**(OAuth 失效户不在 items,见 `meta.skippedInvalidOAuth`);`meta.hitCount` = 触阈值条数。预警筛 `hitReason !== "none"`;`hitReason="none"` 表示已检查但未触阈值。按 `remainingDays` 升序交付。用 **`dailySpend`** 做日均(口径见 `meta.spendDays` / `meta.spendWindow`),勿把 `stats` 区间合计 `spend` 当「每天消耗」。Google 消耗走 `account-spend-overview`,`startDate`/`endDate` 带东八区墙钟(`…T00:00:00+08:00` / `…T23:59:59+08:00`),与 `stats` 同口径。与 `balance` / `accounts-digest` 分工见 `references/core/agent-conventions.md` §八。向用户写 Markdown 表时 `advertiserName` / `name` 必须把 `|` 换成 `|`(见 conventions §三)。
|
|
51
51
|
|
|
52
52
|
---
|
|
53
53
|
|
|
@@ -118,6 +118,8 @@
|
|
|
118
118
|
|
|
119
119
|
**写 Excel 时所有 ID 必须是文本(字符串),禁止数字类型**:含 `mediaCustomerId` / `entityId` / `accountId` / `campaignId` / `adGroupId` / `keywordId` / `criterionId` / geo `locationId` 及一切以 `Id`/`ID`/`id` 结尾的标识列。写入前一律 `String(id)`;`exceljs` 设 `numFmt: '@'`(文本),`openpyxl` 写字符串且勿让推断成 number。**禁止**写成 JSON number / Excel 数值单元格(会科学计数法或丢精度,如 `2.77E+09`)。金额、次数、比率等度量字段仍用数字类型。
|
|
120
120
|
|
|
121
|
+
**写 Markdown 表必须消毒单元格**:公司名 / 账户名 / 文案常含 `|` 或换行,原样塞进 `| col |` 会拆列。脚本投影表时把 `|` 换成 `|`、换行换成空格(与 CLI `printCliTable` 同一规则);**禁止**改 JSON 原值。示例见 `tips.md`「投影 Markdown 表」。
|
|
122
|
+
|
|
121
123
|
**中间结果一律落盘**:跨步骤数据不靠对话记忆;Windows 避免管道传 JSON,优先 `--json-out` + `node -e` 读文件。
|
|
122
124
|
|
|
123
125
|
---
|
|
@@ -228,7 +228,7 @@
|
|
|
228
228
|
| **P2** | **多账户余额** 续航预警 | 余额扫描、快没钱了、充值预警 | 媒体(可选账户子集) | 列表 |
|
|
229
229
|
| **P5** | **多账户 × 多维度** 批拉 | 批量分析、多户 google-analysis | ≥2 户 + ≥2 维度 + 区间 | 聚合报告 |
|
|
230
230
|
| **W3** | 根据 **官网 / URL 生成 Google 搜索广告方案** | 根据网站**出广告**、搜索广告方案/计划/文案/关键词**表**、**生成**投放方案表格 | 官网 URL + **明确要广告方案**(**不**要求账户 ID) | JSON + 表格投影 |
|
|
231
|
-
| **W13** | **Meta / Facebook Instant Form 线索广告**投放 | 建 Meta 线索广告、Facebook 潜在客户表单投放、Instant Form、Lead Ad
|
|
231
|
+
| **W13** | **Meta / Facebook Instant Form 线索广告**投放 | 建 Meta 线索广告、Facebook 潜在客户表单投放、Instant Form、Lead Ad、**出 Facebook 线索广告方案/表格** | Meta 账户 + 主页;或先出 JSON 方案(可无账户) | JSON + 审查稿(MD/xlsx)+ validate/create |
|
|
232
232
|
| **W5** | **Google Ads 关键词规划** / 拓词(含市场指标) | 见 **§零·C**:拓词、Keyword Planner、长尾词、**月搜索量**、**竞争度**、核心词扩词、读 URL/文章后出词表 | 种子词 / 核心词(URL 可选) | 词表(指标来自 `keyword` CLI) |
|
|
233
233
|
| **W7** | **丝路赞平台内** 已生成的优化报告 / 推送 | Siluzan 优化报告列表、报告推送、邮件推送配置 | 按 `reporting.md` | 平台侧列表 |
|
|
234
234
|
|
|
@@ -241,6 +241,7 @@
|
|
|
241
241
|
| 「**电商/制造**行业怎么样 / 市场格局」(**无 URL**) | **P9** | 误走 P8 |
|
|
242
242
|
| 「根据**官网**做 **Google 搜索广告** / 关键词表」 | **W3**(可无账户先出方案) | 误走 P8;或卡在要账户才出方案 |
|
|
243
243
|
| 「建 **Meta/Facebook 线索广告** / Instant Form」 | **W13** | 误走 W11(那是拉已有线索);误走 P4-FB;误用 Google `ad` |
|
|
244
|
+
| 「出 **Facebook / Meta 线索广告方案** / 要表格」 | **W13** 仅出方案 + `meta-lead-launch-plan-template.md` | 误走 W3;跳过 JSON 直接手填表;因缺账户阻塞 |
|
|
244
245
|
| 「把 Meta **表单留资拉下来**」 | **W11** `clue -m Meta` | 误走 W13 去建广告 |
|
|
245
246
|
| 「做 **展示广告** / Display / 自适应展示广告(RDA)」 | **不支持**(告知用户;可改推 Search / PMax → W3) | 误用 `campaign-create` / `ad-create` 伪装 Display |
|
|
246
247
|
| 「读**网址/文章** + **核心词** + 要 **月搜索量/竞争度** 长尾词表」 | **W5(§零·C)** | 纯 WebSearch 编数;误走 P8/P9/W3 |
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
- **步骤**:
|
|
44
44
|
1. 全量巡检:`balance-scan -m <媒体> --threshold-days 7 --json-out ./snap-p2`(可选 `--min-balance 100` / `--target-days 60`)。
|
|
45
45
|
2. 已知子集:`balance-scan -m <媒体> -a id1,id2,id3 --json-out ./snap-p2-subset`(跳过翻页)。
|
|
46
|
-
- **产物**:`data.items` 为全部已检查账户(按 `remainingDays` 升序);预警筛 `hitReason !== "none"`;`hitReason="none"` 表示未触阈值;消耗过低的僵尸账户 `remainingDays` 为 null
|
|
46
|
+
- **产物**:`data.items` 为全部已检查账户(按 `remainingDays` 升序);预警筛 `hitReason !== "none"`;`hitReason="none"` 表示未触阈值;消耗过低的僵尸账户 `remainingDays` 为 null、不纳入预警。向用户贴 Markdown 表时单元格必须把 `|` 换成 `|`(公司名常含 `|`)。**禁止**逐账户 `balance`。
|
|
47
47
|
|
|
48
48
|
---
|
|
49
49
|
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
2. **高 CPA 巡检**:加 `--max-cpa <n>`(保留 CPA > n,或有消耗且转化为 0 的账户)。
|
|
61
61
|
3. **零转化 / 零询盘巡检**:加 `--zero-conversions`(有消耗且转化 = 0 或未返回)。
|
|
62
62
|
4. 基于落盘 `data.items` 与 `meta.totals` 生成报告,**不要**再逐账户 `stats`。
|
|
63
|
-
- **产物**:向用户交付排序表(或明确「无命中」);表格覆盖用户请求的**每一个** ID
|
|
63
|
+
- **产物**:向用户交付排序表(或明确「无命中」);表格覆盖用户请求的**每一个** ID(未返回的占一行标注「未返回」)。Markdown 单元格须把 `|` 换成 `|`。**禁止**只落盘不说话。
|
|
64
64
|
|
|
65
65
|
---
|
|
66
66
|
|
|
@@ -311,3 +311,12 @@ console.log('可用字段:', first && Object.keys(first));
|
|
|
311
311
|
- **用 `process.stdout.write` 而不是 `console.log` 提取单个值**:前者不带换行符,方便直接赋给 shell 变量。
|
|
312
312
|
- **节点代码复杂时拆分写法**:不要写超过 10 行的 `node -e` 单行,改用 `node -e "$(cat <<'EOF'\n...\nEOF\n)"` 或多行 `.mjs` 脚本文件。
|
|
313
313
|
- 同一运行目录、同一"查询 id"的多次拉数会合并到 `cli-manifest-<id>.json` 的 `artifacts[]`;不同账户/实体写入各自的 manifest,互不覆盖。
|
|
314
|
+
- **投影 Markdown 表**:公司名等字段可能含 `|`,必须消毒后再拼 `| col |`。JSON 原值保持不动。
|
|
315
|
+
|
|
316
|
+
```javascript
|
|
317
|
+
const mdCell = (v) => String(v ?? "-").replace(/\r\n|\r|\n/g, " ").replace(/\|/g, "|");
|
|
318
|
+
const line = (cells) => `| ${cells.map(mdCell).join(" | ")} |`;
|
|
319
|
+
console.log(line(["账户ID", "公司", "余额"]));
|
|
320
|
+
console.log(line(["---", "---", "---"]));
|
|
321
|
+
for (const x of items) console.log(line([x.mediaCustomerId, x.advertiserName, x.balance]));
|
|
322
|
+
```
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
| W10 | 智能预警规则管理 | `references/operations/forewarning.md` |
|
|
18
18
|
| W11 | 广告线索提取 | `references/operations/clue.md` |
|
|
19
19
|
| W12 | 日 / 周巡检 | `references/accounts/accounts-balance-stats.md` + 各域 |
|
|
20
|
-
| W13 | Meta Instant Form 线索广告 | `
|
|
20
|
+
| W13 | Meta Instant Form 线索广告 | `meta-ads.md` + **`meta-lead-launch-plan-template.md`** + `meta-ads-write.md` / `read` |
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
@@ -227,14 +227,15 @@
|
|
|
227
227
|
|
|
228
228
|
- **触发**:新建 Facebook / Meta 线索广告、Instant Form、潜在客户表单投放;改预算/定向/启停已有线索对象。
|
|
229
229
|
- **勿误判**:拉**已有**表单留资 → **W11** `clue -m Meta`;Meta 周期/诊断报告 → **P4-FB**;Google 搜索/PMax → **W3**。
|
|
230
|
-
- **必读**:`references/meta-ads/meta-ads.md
|
|
231
|
-
-
|
|
230
|
+
- **必读**:`references/meta-ads/meta-ads.md` + **`assets/meta-lead-create-template.json`**(先 Read)+ `meta-lead-create-template.md` + **`references/meta-ads/meta-lead-launch-plan-template.md`** + `meta-ads-write.md` / `meta-ads-read.md`。
|
|
231
|
+
- **仅出方案**(「出方案 / 只要表格」、未给账户且未说创建):跳过 list-accounts / pages;JSON 用 `[PENDING_ACCOUNT]` / `[PENDING_PAGE]` → **写代码**投影审查稿(默认 MD;要表格按模板出 4 Sheet xlsx)→ **停住等确认**。
|
|
232
|
+
- **步骤(创建)**:
|
|
232
233
|
1. `list-accounts -m MetaAd --page-size 999 --json-out ./snap` 取 `mediaCustomerId`。
|
|
233
|
-
2. `meta-ad account` / `meta-ad pages`:记下币种与 `pageId`(`--json-out` 主页在 `items[]`,须含 `ADVERTISE`)。**HTTP 403**
|
|
234
|
-
3.
|
|
234
|
+
2. `meta-ad account` / `meta-ad pages`:记下币种与 `pageId`(`--json-out` 主页在 `items[]`,须含 `ADVERTISE`)。**HTTP 403** 或主页为空则停。`spend_capDisplay` ≈ `amount_spentDisplay` → 仍可 PAUSED 创建,ACTIVE 投不出去。
|
|
235
|
+
3. 落盘同构 JSON(可执行字段 + `plan` 套系/矩阵/背书)。
|
|
235
236
|
4. 门禁:`meta-ad validate --config-file ./meta-lead.json --json-out ./snap`。
|
|
236
|
-
5.
|
|
237
|
+
5. **写代码**按 `meta-lead-launch-plan-template.md` 投影完整审查稿 → 用户确认(`--commit` 代替不了这步)。
|
|
237
238
|
6. `meta-ad create --config-file ./meta-lead.json --json-out ./snap --commit "…"`(默认 PAUSED;失败读已建成 ID 用原语续跑)。报「支付方式」则停,不要重头 create。
|
|
238
239
|
7. 按返回 ID `meta-ad campaign/adset/ad --id` 复核。
|
|
239
|
-
8. 需要投放:三个对象
|
|
240
|
-
-
|
|
240
|
+
8. 需要投放:三个对象 `*-status --status ACTIVE --commit`。清理:`DELETED`,顺序广告→组→系列。
|
|
241
|
+
- **产物**:审查稿路径(MD 或 xlsx)+ create 的 `formId` / `imageHash` / `campaignId` / `adSetId` / `creativeId` / `adId`;写后交代成败与是否仍为 PAUSED。
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
| 模板 | 复制 `assets/meta-lead-create-template.json`,字段见 `meta-lead-create-template.md` |
|
|
18
18
|
| 主页 | `siluzan-tso meta-ad pages -a <accountId> --json-out ./snap-fb` |
|
|
19
19
|
| 校验 | `siluzan-tso meta-ad validate --config-file ./meta-lead.json [--json-out ./snap]` |
|
|
20
|
-
| 审查稿 |
|
|
20
|
+
| 审查稿 | Agent **写代码**按 [meta-lead-launch-plan-template.md](meta-lead-launch-plan-template.md) 从 JSON 投影(默认 MD;要表格出 4 Sheet xlsx)→ 用户确认。`--commit` 不是方案确认 |
|
|
21
21
|
| 创建 | `siluzan-tso meta-ad create --config-file ./meta-lead.json --json-out ./snap --commit "创建 Instant Form 线索广告"` |
|
|
22
22
|
| 复核 | 用返回的 ID:`meta-ad campaign/adset/ad --id … --json-out` |
|
|
23
23
|
| 投放 | 三个对象分别 `*-status --status ACTIVE --commit "投放"` |
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
| 创建 / 编辑 / 启停 | [meta-ads-write.md](meta-ads-write.md) |
|
|
20
20
|
| 读账户 / 主页 / 表单 / 按 ID 读对象 | [meta-ads-read.md](meta-ads-read.md) |
|
|
21
21
|
| JSON 字段 | `assets/meta-lead-create-template.json`(先)+ `assets/meta-lead-create-template.md` |
|
|
22
|
+
| 出方案 / 审查稿 / 要表格 | [meta-lead-launch-plan-template.md](meta-lead-launch-plan-template.md) |
|
|
22
23
|
|
|
23
24
|
## Gotchas
|
|
24
25
|
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# Meta Instant Form 投放计划模板
|
|
2
|
+
|
|
3
|
+
> 用途:用户审查用的线索广告计划;字段须与已落盘的 `meta-lead-create` JSON 一致。流程见 `workflows.md` **W13**。
|
|
4
|
+
> 触发:出 Meta / Facebook 线索广告方案、要表格、创建前确认。
|
|
5
|
+
> 字段契约:`assets/meta-lead-create-template.json` + `meta-lead-create-template.md`
|
|
6
|
+
> 可执行边界:仅 Instant Form(`OUTCOME_LEADS`)。无 Advantage+ / 视频 / 系列列表。一次 `meta-ad create` 只落地 **1 系列 × 1 组 × 1 创意 × 1 广告**。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 交付顺序(固定)
|
|
11
|
+
|
|
12
|
+
1. 落盘与模板同构的 **`meta-lead-create` JSON**(唯一可执行数据源;对话里勿贴整份 JSON 当主交付)。
|
|
13
|
+
2. **创建阶段**跑 `meta-ad validate`;**仅出方案**可跳过网关,但仍建议本地 validate(`account` / `pageId` 可用占位)。
|
|
14
|
+
3. **审查稿(必做)**:Agent **写代码**(Node/Python)读取该 JSON,按下方模板投影完整文件。
|
|
15
|
+
- 默认 **Markdown**(`./meta-lead-plan.md`),结构对齐下文「Markdown 投影」。
|
|
16
|
+
- 用户要 **Excel / 表格 / xlsx**:同一脚本改输出,Sheet 对齐下文「Excel 四表」。**禁止**跳过 JSON 直接手填表。
|
|
17
|
+
- 须含:客户与落地页、表单**全部**字段、预算/国家、**全部**视觉套系正文与标题、3×2×2 矩阵——**禁止**只交概览表。
|
|
18
|
+
4. 用户确认后改需求只改 JSON → 重跑脚本刷新审查稿 →(创建阶段)再 validate → `meta-ad create --commit`。
|
|
19
|
+
|
|
20
|
+
### 仅出方案 vs 创建
|
|
21
|
+
|
|
22
|
+
| 阶段 | 触发 | 账户 | Agent 必须做 | 禁止 |
|
|
23
|
+
| --- | --- | --- | --- | --- |
|
|
24
|
+
| **仅出方案** | 「出方案 / 先别创建 / 只要表格」;或未给账户且未说要创建 | 不必须 | JSON(`account`=`[PENDING_ACCOUNT]`,`pageId`=`[PENDING_PAGE]`)+ 投影审查稿 | 因缺账户阻塞交付;未确认就 `create` |
|
|
25
|
+
| **创建** | 用户已确认方案并要落地,且已有 `mediaCustomerId` | 必须 | `pages` 写回真 `pageId` → validate → **再投影审查稿确认** → `create` | 跳过审查稿;跳过 validate |
|
|
26
|
+
|
|
27
|
+
占位约定:`account` = `"[PENDING_ACCOUNT]"`;`pageId` = `"[PENDING_PAGE]"`。选定账户后 `meta-ad pages` 写回真 ID,再 validate/create。
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Markdown ↔ JSON 映射
|
|
32
|
+
|
|
33
|
+
| 计划正文 | JSON |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| 账户 / 主页 | `account`、`pageId` |
|
|
36
|
+
| 品牌 / 客户 / 官网 / 一句话 | `plan.brand`、`plan.customerName`、`plan.siteUrl`、`plan.businessOneLiner` |
|
|
37
|
+
| 主结果 / 落地页型 | `plan.mainResult`、`plan.landingType`(须写 Instant Form + 具体页,勿只写「官网」) |
|
|
38
|
+
| 素材规格 | `plan.creativeSpec`(建议 `4:5(1080×1350)或 1:1;图字 <20%`) |
|
|
39
|
+
| 公开背书 | `plan.endorsements[]`(`verified!=true` 标「投放前删除」) |
|
|
40
|
+
| 预算模式 / 日预算 | `budgetMode`、`campaign.dailyBudget` 或 `adset.dailyBudget`(**元**) |
|
|
41
|
+
| 国家 / 年龄 | `adset.countries`、`ageMin`、`ageMax` |
|
|
42
|
+
| 表单字段 | `form.questions[]`(`reuseId` 时写复用 ID,勿编造字段) |
|
|
43
|
+
| 将创建的那条文案 | `creative.message` / `headline` / `link` / 图片三选一 |
|
|
44
|
+
| 视觉套系 A/B/C | `plan.tracks[]`(`shots[].headlines` / `primaryText` / `cta` / `description`) |
|
|
45
|
+
| 3×2×2 矩阵 | `plan.matrix.visual` / `bodyTone` / `headline` |
|
|
46
|
+
| 计划中的多组 | `plan.adSets[]`(审查稿用;create 只建 `adset`) |
|
|
47
|
+
| 合规 / emoji | `plan.complianceNotes`、`plan.emojiPerPost` |
|
|
48
|
+
|
|
49
|
+
`plan` **不**发给网关。多组、多套系要落地时:用户确认后先 `create` 第一条,再用 `adset-create` / `creative-create` / `ad-create` 按矩阵补。
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 模板正文(Markdown 投影)
|
|
54
|
+
|
|
55
|
+
脚本按以下格式写。`{{…}}` 只从 JSON 读取,不得手写与 JSON 矛盾的数。
|
|
56
|
+
|
|
57
|
+
```markdown
|
|
58
|
+
# {{plan.brand}} — Facebook 图文广告草案
|
|
59
|
+
|
|
60
|
+
- 客户/站点:{{plan.customerName}} + {{plan.siteUrl}} + {{plan.businessOneLiner}}
|
|
61
|
+
- 主结果:{{plan.mainResult}}
|
|
62
|
+
- 落地建议:{{plan.landingType}}(Instant Form;写清页型,不要只说「官网」)
|
|
63
|
+
- 素材规格:{{plan.creativeSpec}}
|
|
64
|
+
- 可引用公开背书(列表;`verified!=true` 标「投放前删除」)
|
|
65
|
+
{{plan.endorsements}}
|
|
66
|
+
|
|
67
|
+
> 账户:{{account}} 主页:{{pageId}} 预算:{{budgetMode}} {{日预算}} 元 国家:{{adset.countries}}
|
|
68
|
+
> 计划状态:**待确认** 本批可执行:Instant Form 线索广告(非 Advantage+)
|
|
69
|
+
|
|
70
|
+
## 套系 A|{{plan.tracks[0].name}}
|
|
71
|
+
### A1 画面说明(给设计/拍摄)
|
|
72
|
+
- 构图:{{shots[0].composition}}
|
|
73
|
+
- 图上仅一行英文:{{shots[0].onImageText}}
|
|
74
|
+
- 调性:{{shots[0].tone}}
|
|
75
|
+
- 禁忌:{{shots[0].forbid}}
|
|
76
|
+
|
|
77
|
+
Headline(≤5 词)
|
|
78
|
+
- `{{shots[0].headlines[0]}}`
|
|
79
|
+
- `{{shots[0].headlines[1]}}`
|
|
80
|
+
|
|
81
|
+
Primary text
|
|
82
|
+
{{shots[0].primaryText}}
|
|
83
|
+
|
|
84
|
+
CTA:{{shots[0].cta}}
|
|
85
|
+
Description:`{{shots[0].description}}`
|
|
86
|
+
|
|
87
|
+
(继续 A2 / B1 / C1… **至少 3 个视觉差异套系**)
|
|
88
|
+
|
|
89
|
+
## 将创建的这一条(JSON.creative,create 只交这个)
|
|
90
|
+
|
|
91
|
+
| 项 | 内容 |
|
|
92
|
+
| --- | --- |
|
|
93
|
+
| message | {{creative.message}} |
|
|
94
|
+
| headline | {{creative.headline}} |
|
|
95
|
+
| link | {{creative.link}} |
|
|
96
|
+
| 图片 | {{imageHash / imagePath / imageUrl}} |
|
|
97
|
+
| 表单 | {{form.name 或 form.reuseId}};字段:{{form.questions}} |
|
|
98
|
+
|
|
99
|
+
## 3×2×2 测试矩阵(上传时组合)
|
|
100
|
+
| 维度 | 选项 1 | 选项 2 | 选项 3 |
|
|
101
|
+
|---------|--------|--------|--------|
|
|
102
|
+
| 视觉 | {{matrix.visual[0]}} | {{matrix.visual[1]}} | {{matrix.visual[2]}} |
|
|
103
|
+
| 正文气质 | {{matrix.bodyTone[0]}} | {{matrix.bodyTone[1]}} | |
|
|
104
|
+
| 标题 | {{matrix.headline[0]}} | {{matrix.headline[1]}} | |
|
|
105
|
+
|
|
106
|
+
说明:每个「视觉 × 正文 × 标题」是素材组合建议;本批 **无 Advantage+**。
|
|
107
|
+
至少 3 图 × 2 文 × 2 标题再开投;create 先落地 JSON.creative,其余用原语补。
|
|
108
|
+
|
|
109
|
+
## Instant Form 字段
|
|
110
|
+
|
|
111
|
+
| type | label | key |
|
|
112
|
+
| --- | --- | --- |
|
|
113
|
+
| {{questions[i]}} | | |
|
|
114
|
+
|
|
115
|
+
## Emoji 与合规备忘
|
|
116
|
+
- {{plan.complianceNotes}}
|
|
117
|
+
- 每帖 emoji 个数:{{plan.emojiPerPost}}
|
|
118
|
+
|
|
119
|
+
草案依据为公开页面/客户材料,非广告后台数据。
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Excel 四表(用户要表格时)
|
|
125
|
+
|
|
126
|
+
对照客户方案 xlsx(`方案总览` / `1-客户画像` / `2-账户结构` / `3-表单询盘C1`)。Agent 脚本写 `.xlsx`,**无** CLI excel 子命令。ID 列用文本。
|
|
127
|
+
|
|
128
|
+
### Sheet `方案总览`
|
|
129
|
+
|
|
130
|
+
| 项目 | 内容 |
|
|
131
|
+
| --- | --- |
|
|
132
|
+
| 客户名称 | `plan.customerName` |
|
|
133
|
+
| Facebook 主页 | `plan.pageUrl` 或「待 pages 后补」 |
|
|
134
|
+
| 官方网站 | `plan.siteUrl` |
|
|
135
|
+
| 主营业务 | `plan.businessOneLiner` |
|
|
136
|
+
| 营销目标 | `plan.mainResult`(表单询盘 / Instant Form) |
|
|
137
|
+
| 日预算 | `campaign.dailyBudget` 或 `adset.dailyBudget` + 币种说明 |
|
|
138
|
+
| 广告结构 | 写清「本次 create:1×1×1」;`plan.adSets` 多组则写「计划 N 组,其余原语续建」 |
|
|
139
|
+
| 投放策略 | Instant Form;`adset.optimizationGoal` |
|
|
140
|
+
|
|
141
|
+
### Sheet `1-客户画像`
|
|
142
|
+
|
|
143
|
+
两列:项目 / 内容。至少含:公司名称、核心产品、目标市场(`adset.countries`)、可引用背书(未核实标「投放前删除」)。定向兴趣/职位若只存在于 `plan`,须标注「**本批组定向只认国家/年龄/性别**,兴趣词仅作素材与获客说明」。
|
|
144
|
+
|
|
145
|
+
### Sheet `2-账户结构`
|
|
146
|
+
|
|
147
|
+
| 层级 | 名称 | 国家 | 日预算(元) | 备注 |
|
|
148
|
+
| --- | --- | --- | --- | --- |
|
|
149
|
+
| Campaign | `campaign.name` | — | CBO 时填系列预算 | `OUTCOME_LEADS` |
|
|
150
|
+
| Ad Set(将创建) | `adset.name` | `adset.countries` | ABO 时填组预算 | 本次 create |
|
|
151
|
+
| Ad Set(计划) | `plan.adSets[]` | 各国 | — | 确认后再 `adset-create` |
|
|
152
|
+
| Ad | `ad.name` | — | — | 挂 `creative` |
|
|
153
|
+
|
|
154
|
+
### Sheet `3-表单询盘C1`
|
|
155
|
+
|
|
156
|
+
上表:表单字段(`#` / type / label / 必填)。
|
|
157
|
+
中表:将创建文案(Primary text = `creative.message`,Headline = `creative.headline`,CTA)。
|
|
158
|
+
下表:套系 A/B/C 的 Headline / Primary text / CTA / Description(来自 `plan.tracks`)。
|
|
159
|
+
可加一小表:3×2×2 矩阵。
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Agent 投影纪律
|
|
164
|
+
|
|
165
|
+
- **写代码**读 JSON 生成 MD/xlsx;禁止在对话里手抄全文案当终稿。
|
|
166
|
+
- 改需求改 JSON 后重跑脚本,不要只改审查稿。
|
|
167
|
+
- `create` 前必须把审查稿交给用户并得到确认;`--commit` 不是方案确认。
|
|
168
|
+
- 数字(同心度、年限、客户数)写进 `plan.endorsements` / `complianceNotes`:不可证的标「投放前删除」,不要写死进 `creative.message` 除非用户书面确认。
|
|
@@ -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.48-beta.
|
|
12
|
+
$PKG_VERSION = '1.1.48-beta.3'
|
|
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.48-beta.
|
|
12
|
+
readonly PKG_VERSION="1.1.48-beta.3"
|
|
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"
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
"turns": [
|
|
5
5
|
"Meta 账户 3995107670753101,主页先用 pages 查。帮我出一套美国 Instant Form 线索广告方案 JSON(CBO 日预算 10 美元),落盘后请先校验再让我确认是否创建。不要去拉已有线索。"
|
|
6
6
|
],
|
|
7
|
-
"judgeExpectation": "路径:生成 meta-lead-create JSON 后应调用 meta-ad validate(可用 stub
|
|
8
|
-
"skillMapping": "references/core/workflows.md W13;references/meta-ads/meta-ads-write.md",
|
|
7
|
+
"judgeExpectation": "路径:生成 meta-lead-create JSON 后应调用 meta-ad validate(可用 stub),并按 meta-lead-launch-plan-template 从 JSON 投影审查稿(禁止只交概览、禁止跳过确认);通过后再提议 meta-ad create --commit;不得跳过 validate,不得用 Google ad campaign-create / clue 代替。\n输出:JSON 含 account/pageId/budgetMode/form/campaign/adset/creative/ad(建议含 plan);须提及默认 PAUSED 与三个对象分别 status ACTIVE。",
|
|
8
|
+
"skillMapping": "references/core/workflows.md W13;references/meta-ads/meta-ads-write.md;references/meta-ads/meta-lead-launch-plan-template.md",
|
|
9
9
|
"judgeReferencePaths": [
|
|
10
10
|
"references/core/workflows.md",
|
|
11
11
|
"references/meta-ads/meta-ads-write.md",
|
|
12
|
+
"references/meta-ads/meta-lead-launch-plan-template.md",
|
|
12
13
|
"assets/meta-lead-create-template.md"
|
|
13
14
|
],
|
|
14
15
|
"commandMustInclude": [
|