siluzan-tso-cli 1.1.25 → 1.1.26-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/index.js +171 -30
- package/dist/skill/SKILL.md +5 -3
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/README.md +2 -1
- package/dist/skill/references/accounts/accounts.md +5 -5
- package/dist/skill/references/accounts/finance.md +32 -32
- package/dist/skill/references/accounts/open-account-by-media.md +4 -2
- package/dist/skill/references/accounts/open-account-google-ui.md +1 -1
- package/dist/skill/references/analytics/account-analytics.md +2 -2
- package/dist/skill/references/analytics/rag.md +1 -1
- package/dist/skill/references/analytics/reporting.md +5 -5
- package/dist/skill/references/core/agent-conventions.md +20 -5
- package/dist/skill/references/core/deliverable-preflight.md +107 -0
- package/dist/skill/references/core/playbooks.md +4 -2
- package/dist/skill/references/core/setup.md +5 -5
- package/dist/skill/references/core/skill-authoring.md +1 -1
- package/dist/skill/references/core/subagent-orchestration.md +1 -1
- package/dist/skill/references/core/tips.md +14 -11
- package/dist/skill/references/core/workflows.md +6 -6
- package/dist/skill/references/misc/tso-home.md +2 -2
- package/dist/skill/report-templates/REPORT-WORKFLOW.md +8 -0
- package/dist/skill/scripts/check-deliverable-snap.mjs +170 -0
- package/dist/skill/scripts/install.ps1 +3 -3
- package/dist/skill/scripts/install.sh +3 -3
- package/eval/stub-fixtures/meta-overview.json +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -43,7 +43,7 @@ HTML 报告模板引用以下 CDN:`cdn.tailwindcss.com`、`cdnjs.cloudflare.co
|
|
|
43
43
|
在**用户的目标项目根目录**执行(根据用户使用的助手选择 `--ai`):
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
npm install -g siluzan-tso-cli
|
|
46
|
+
npm install -g siluzan-tso-cli@beta
|
|
47
47
|
siluzan-tso init --ai cursor # 写入 Cursor(默认)
|
|
48
48
|
siluzan-tso init --ai cursor,claude # 同时写入多个平台
|
|
49
49
|
siluzan-tso init --ai all # 写入所有支持的平台
|
|
@@ -51,6 +51,7 @@ siluzan-tso init -d /path/to/skills # 写入自定义目录
|
|
|
51
51
|
siluzan-tso init --force # 强制覆盖已存在文件
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
> **注意**:当前为测试版(1.1.26-beta.2),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
54
55
|
|
|
55
56
|
| 助手 | 建议 `--ai` |
|
|
56
57
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -3328,7 +3328,7 @@ var DEFAULT_API_BASE;
|
|
|
3328
3328
|
var init_defaults = __esm({
|
|
3329
3329
|
"src/config/defaults.ts"() {
|
|
3330
3330
|
"use strict";
|
|
3331
|
-
DEFAULT_API_BASE = "https://tso-api.siluzan.com";
|
|
3331
|
+
DEFAULT_API_BASE = "https://tso-api-ci.siluzan.com";
|
|
3332
3332
|
}
|
|
3333
3333
|
});
|
|
3334
3334
|
|
|
@@ -4014,7 +4014,7 @@ var init_cli_json = __esm({
|
|
|
4014
4014
|
CLI_SNAPSHOT_MANIFEST_FILE = "cli-manifest.json";
|
|
4015
4015
|
CLI_PACKAGE = "siluzan-tso-cli";
|
|
4016
4016
|
SCHEMA_VERSION = 1;
|
|
4017
|
-
OUTLINE_AGENT_HINT = "\
|
|
4017
|
+
OUTLINE_AGENT_HINT = "\u7981\u6B62\u7528 Read/cat \u6253\u5F00 writtenFiles \u4E2D\u7684\u5B8C\u6574\u4E1A\u52A1 *.json\u3002\u987A\u5E8F\uFF1A1) \u89E3\u6790\u672C\u884C stdout \u6458\u8981\uFF1B2) \u4EC5\u53EF\u8BFB outlineFile\uFF08*.outline.txt\uFF0Cschema\uFF09\uFF1B3) \u5FC5\u987B\u7528 node/python \u811A\u672C require/readFileSync \u8BFB JSON \u5E76\u6253\u5370\u6240\u9700\u5B57\u6BB5\u3002\u52FF\u628A JSON \u8D34\u8FDB\u5BF9\u8BDD\u3002";
|
|
4018
4018
|
DEFAULT_FIELD_GUIDE = {
|
|
4019
4019
|
markdownRefs: ["references/accounts/currency.md", "references/core/tips.md", "references/accounts/accounts.md"]
|
|
4020
4020
|
};
|
|
@@ -4740,6 +4740,9 @@ function buildOutlineHints(section) {
|
|
|
4740
4740
|
...GOOGLE_ANALYSIS_CAMPAIGNS_COMPETITIVE_METRICS_HINTS
|
|
4741
4741
|
);
|
|
4742
4742
|
}
|
|
4743
|
+
if (section === "ads") {
|
|
4744
|
+
hints.push(...GOOGLE_ANALYSIS_ADS_OUTLINE_BUDGET_HINTS);
|
|
4745
|
+
}
|
|
4743
4746
|
const zhHints = GOOGLE_ANALYSIS_ZH_FIELD_HINTS_BY_SECTION[section];
|
|
4744
4747
|
if (zhHints) hints.push(...zhHints);
|
|
4745
4748
|
return hints.length > 0 ? hints : void 0;
|
|
@@ -4852,7 +4855,7 @@ async function writeGoogleAnalysisSnapshot(params) {
|
|
|
4852
4855
|
agentHint: OUTLINE_AGENT_HINT
|
|
4853
4856
|
};
|
|
4854
4857
|
}
|
|
4855
|
-
var LEGACY_MANIFEST_FILE, CLI_PACKAGE2, SCHEMA_VERSION2, DEFAULT_FIELD_GUIDE2, GOOGLE_ANALYSIS_CAMPAIGNS_OUTLINE_BUDGET_HINTS, GOOGLE_ANALYSIS_CAMPAIGNS_COMPETITIVE_METRICS_HINTS, RATE_BEARING_SECTIONS, GOOGLE_ANALYSIS_RATE_NORMALIZED_OUTLINE_HINTS, GOOGLE_ANALYSIS_ENVELOPE_OUTLINE_HINTS, GOOGLE_ANALYSIS_ZH_FIELD_HINTS_BY_SECTION;
|
|
4858
|
+
var LEGACY_MANIFEST_FILE, CLI_PACKAGE2, SCHEMA_VERSION2, DEFAULT_FIELD_GUIDE2, GOOGLE_ANALYSIS_CAMPAIGNS_OUTLINE_BUDGET_HINTS, GOOGLE_ANALYSIS_ADS_OUTLINE_BUDGET_HINTS, GOOGLE_ANALYSIS_CAMPAIGNS_COMPETITIVE_METRICS_HINTS, RATE_BEARING_SECTIONS, GOOGLE_ANALYSIS_RATE_NORMALIZED_OUTLINE_HINTS, GOOGLE_ANALYSIS_ENVELOPE_OUTLINE_HINTS, GOOGLE_ANALYSIS_ZH_FIELD_HINTS_BY_SECTION;
|
|
4856
4859
|
var init_google_analysis = __esm({
|
|
4857
4860
|
"src/utils/snapshot/google-analysis.ts"() {
|
|
4858
4861
|
"use strict";
|
|
@@ -4870,6 +4873,9 @@ var init_google_analysis = __esm({
|
|
|
4870
4873
|
"// \u91D1\u989D\uFF1A`campaigns[].budgetAmountYuan` / `campaignTargetCpaYuan` / `maximizeConversionsTargetCpaYuan` \u5747\u4E3A**\u5143**\uFF08CLI \u51FA\u53E3\u7EDF\u4E00\uFF09\uFF1B\u540C\u884C `spend` / `averageCpc` / `costPerConversion` \u4E5F\u662F\u5143\u3002",
|
|
4871
4874
|
"// \u65E7\u5B57\u6BB5 `budgetAmount`\uFF08\u5206\uFF09/ `*Micros`\uFF08\u5FAE\u5143\uFF09\u5DF2\u4E0D\u518D\u843D\u76D8\uFF0C**\u7981\u6B62**\u518D\u505A \xF7100 / \xF71_000_000 \u6362\u7B97\u3002"
|
|
4872
4875
|
];
|
|
4876
|
+
GOOGLE_ANALYSIS_ADS_OUTLINE_BUDGET_HINTS = [
|
|
4877
|
+
"// \u91D1\u989D\uFF1A`ads[].spend` / `averageCpc` / `costPerConversion` \u843D\u76D8\u524D\u5DF2\u7EDF\u4E00\u4E3A**\u5143**\uFF08`costPerConversion` \u7531\u7F51\u5173\u5FAE\u5143 \xF71e6\uFF09\uFF1B**\u7981\u6B62**\u518D\u5BF9 `costPerConversion` \u505A \xF71_000_000\u3002"
|
|
4878
|
+
];
|
|
4873
4879
|
GOOGLE_ANALYSIS_CAMPAIGNS_COMPETITIVE_METRICS_HINTS = [
|
|
4874
4880
|
"// \u7ADE\u4E89\u6307\u6807\uFF1A`campaigns[].competitiveMetrics` \u4E3A **0~1 \u5C0F\u6570**\uFF08\u5982 `0.0999` = 9.99%\uFF09\uFF0C\u542B Top/AbsoluteTop/Content/ClickShare \u7B49\uFF1B\u65E0\u6570\u636E\u65F6\u4E3A `null`\u3002",
|
|
4875
4881
|
"// \u884C\u9876 `searchImpressionShare` / `searchBudgetLostImpressionShare` / `searchRankLostImpressionShare` \u843D\u76D8\u524D\u5DF2\u5F52\u4E00\u4E3A **0~1 \u5C0F\u6570**\uFF08\u4E0E `competitiveMetrics` \u540C\u540D\u9879\u4E00\u81F4\uFF09\uFF1B\u5C55\u793A\u4E3A % \u65F6 \xD7100\u3002",
|
|
@@ -5240,10 +5246,14 @@ function divToYuan(v, divisor) {
|
|
|
5240
5246
|
}
|
|
5241
5247
|
function applyMoneyRules(obj, rules) {
|
|
5242
5248
|
for (const rule of rules) {
|
|
5243
|
-
if (rule.source in obj)
|
|
5244
|
-
|
|
5245
|
-
|
|
5249
|
+
if (!(rule.source in obj)) continue;
|
|
5250
|
+
const yuan = divToYuan(obj[rule.source], rule.divisor);
|
|
5251
|
+
if (rule.inPlace) {
|
|
5252
|
+
obj[rule.source] = yuan;
|
|
5253
|
+
continue;
|
|
5246
5254
|
}
|
|
5255
|
+
obj[rule.target] = yuan;
|
|
5256
|
+
delete obj[rule.source];
|
|
5247
5257
|
}
|
|
5248
5258
|
}
|
|
5249
5259
|
function applyDeep(value, rules, seen) {
|
|
@@ -5266,7 +5276,7 @@ function normalizeMoneyScales(payload, section) {
|
|
|
5266
5276
|
applyDeep(payload, rules, /* @__PURE__ */ new WeakSet());
|
|
5267
5277
|
return payload;
|
|
5268
5278
|
}
|
|
5269
|
-
var CAMPAIGN_MONEY_RULES, RULE_BY_SECTION;
|
|
5279
|
+
var CAMPAIGN_MONEY_RULES, ADS_MONEY_RULES, RULE_BY_SECTION;
|
|
5270
5280
|
var init_normalize_money = __esm({
|
|
5271
5281
|
"src/commands/google-analysis/normalize-money.ts"() {
|
|
5272
5282
|
"use strict";
|
|
@@ -5279,8 +5289,12 @@ var init_normalize_money = __esm({
|
|
|
5279
5289
|
divisor: 1e6
|
|
5280
5290
|
}
|
|
5281
5291
|
];
|
|
5292
|
+
ADS_MONEY_RULES = [
|
|
5293
|
+
{ source: "costPerConversion", target: "costPerConversion", divisor: 1e6, inPlace: true }
|
|
5294
|
+
];
|
|
5282
5295
|
RULE_BY_SECTION = {
|
|
5283
|
-
campaigns: CAMPAIGN_MONEY_RULES
|
|
5296
|
+
campaigns: CAMPAIGN_MONEY_RULES,
|
|
5297
|
+
ads: ADS_MONEY_RULES
|
|
5284
5298
|
};
|
|
5285
5299
|
}
|
|
5286
5300
|
});
|
|
@@ -120059,7 +120073,133 @@ init_auth();
|
|
|
120059
120073
|
import * as fs9 from "fs";
|
|
120060
120074
|
import * as path14 from "path";
|
|
120061
120075
|
init_cli_json_snapshot();
|
|
120062
|
-
|
|
120076
|
+
|
|
120077
|
+
// src/commands/open-account/bing-industry-dict.ts
|
|
120078
|
+
init_auth();
|
|
120079
|
+
var ORPHAN_PARENT_KEY = "__orphan__";
|
|
120080
|
+
function normalizeBingTradeReadList(readResponse) {
|
|
120081
|
+
let raw = readResponse;
|
|
120082
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
120083
|
+
const o = raw;
|
|
120084
|
+
if ("value" in o && Array.isArray(o.value)) {
|
|
120085
|
+
raw = o.value;
|
|
120086
|
+
} else if ("data" in o) {
|
|
120087
|
+
raw = o.data;
|
|
120088
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
120089
|
+
const inner = raw;
|
|
120090
|
+
if (Array.isArray(inner.data)) raw = inner.data;
|
|
120091
|
+
else if (Array.isArray(inner.value)) raw = inner.value;
|
|
120092
|
+
}
|
|
120093
|
+
}
|
|
120094
|
+
}
|
|
120095
|
+
return Array.isArray(raw) ? raw : [];
|
|
120096
|
+
}
|
|
120097
|
+
function applyBingTradeTranslations(records, translationRows) {
|
|
120098
|
+
for (const item of records) {
|
|
120099
|
+
for (const row of translationRows) {
|
|
120100
|
+
if (item.name == row.name) {
|
|
120101
|
+
item.TranslationLanguage = row.value;
|
|
120102
|
+
break;
|
|
120103
|
+
}
|
|
120104
|
+
}
|
|
120105
|
+
}
|
|
120106
|
+
}
|
|
120107
|
+
function extractTradeListRecords(raw) {
|
|
120108
|
+
if (Array.isArray(raw)) return raw;
|
|
120109
|
+
if (!raw || typeof raw !== "object") return [];
|
|
120110
|
+
const o = raw;
|
|
120111
|
+
const data = o.data;
|
|
120112
|
+
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
120113
|
+
const records = data.records;
|
|
120114
|
+
if (Array.isArray(records)) return records;
|
|
120115
|
+
}
|
|
120116
|
+
if (Array.isArray(o.records)) return o.records;
|
|
120117
|
+
return [];
|
|
120118
|
+
}
|
|
120119
|
+
function buildBingIndustryOptions(records) {
|
|
120120
|
+
const byId = new Map(records.map((r) => [String(r.id), r]));
|
|
120121
|
+
const level2 = records.filter(
|
|
120122
|
+
(r) => String(r.tradeLevel) === "2" || r.tradeLevel === 2
|
|
120123
|
+
);
|
|
120124
|
+
const byParent = /* @__PURE__ */ new Map();
|
|
120125
|
+
for (const row of level2) {
|
|
120126
|
+
const pid = row.parentId == null ? ORPHAN_PARENT_KEY : String(row.parentId);
|
|
120127
|
+
if (!byParent.has(pid)) byParent.set(pid, []);
|
|
120128
|
+
byParent.get(pid).push(row);
|
|
120129
|
+
}
|
|
120130
|
+
const cmpCode = (a, b) => String(a.code ?? "").localeCompare(String(b.code ?? ""), void 0, { numeric: true });
|
|
120131
|
+
const groups = [];
|
|
120132
|
+
for (const [parentKey, children] of byParent) {
|
|
120133
|
+
const parent = parentKey === ORPHAN_PARENT_KEY ? null : byId.get(parentKey);
|
|
120134
|
+
const label = parent?.TranslationLanguage || parent?.name || (parentKey === ORPHAN_PARENT_KEY ? "\u2014" : parentKey);
|
|
120135
|
+
groups.push({
|
|
120136
|
+
parentId: parentKey === ORPHAN_PARENT_KEY ? "" : parentKey,
|
|
120137
|
+
label,
|
|
120138
|
+
children: [...children].sort(cmpCode)
|
|
120139
|
+
});
|
|
120140
|
+
}
|
|
120141
|
+
const emptyParent = { id: "", code: "" };
|
|
120142
|
+
groups.sort((a, b) => {
|
|
120143
|
+
const pa = a.parentId ? byId.get(a.parentId) : null;
|
|
120144
|
+
const pb = b.parentId ? byId.get(b.parentId) : null;
|
|
120145
|
+
return cmpCode(pa ?? emptyParent, pb ?? emptyParent);
|
|
120146
|
+
});
|
|
120147
|
+
const out = [];
|
|
120148
|
+
for (const g of groups) {
|
|
120149
|
+
for (const row of g.children) {
|
|
120150
|
+
const id = String(row.id ?? "");
|
|
120151
|
+
const label = String(row.TranslationLanguage || row.name || id);
|
|
120152
|
+
out.push({
|
|
120153
|
+
id,
|
|
120154
|
+
label,
|
|
120155
|
+
group: g.label,
|
|
120156
|
+
name: String(row.name ?? "")
|
|
120157
|
+
});
|
|
120158
|
+
}
|
|
120159
|
+
}
|
|
120160
|
+
return out;
|
|
120161
|
+
}
|
|
120162
|
+
function filterBingIndustryOptions(options, keyword) {
|
|
120163
|
+
const kw = keyword.trim().toLowerCase();
|
|
120164
|
+
if (!kw) return options;
|
|
120165
|
+
return options.filter((o) => {
|
|
120166
|
+
const hay = `${o.id} ${o.label} ${o.group} ${o.name}`.toLowerCase();
|
|
120167
|
+
return hay.includes(kw);
|
|
120168
|
+
});
|
|
120169
|
+
}
|
|
120170
|
+
function resolveBingTradeIdForSubmit(tradeIdOrLabel, options) {
|
|
120171
|
+
const raw = tradeIdOrLabel.trim();
|
|
120172
|
+
if (!raw) return raw;
|
|
120173
|
+
const byId = options.find((o) => o.id === raw);
|
|
120174
|
+
if (byId) return byId.id;
|
|
120175
|
+
const byLabel = options.find(
|
|
120176
|
+
(o) => o.label === raw || o.name === raw || `${o.group}/${o.label}` === raw
|
|
120177
|
+
);
|
|
120178
|
+
if (byLabel) return byLabel.id;
|
|
120179
|
+
return raw;
|
|
120180
|
+
}
|
|
120181
|
+
async function fetchBingIndustryOptions(config, verbose) {
|
|
120182
|
+
const rawList = await apiFetch2(
|
|
120183
|
+
`${config.apiBaseUrl}/BingV2Account/Management/TradeList`,
|
|
120184
|
+
config,
|
|
120185
|
+
{ method: "POST", body: JSON.stringify({ page: 1, pageSize: 9999 }) },
|
|
120186
|
+
verbose
|
|
120187
|
+
);
|
|
120188
|
+
const records = extractTradeListRecords(rawList).map((r) => ({
|
|
120189
|
+
...r,
|
|
120190
|
+
id: String(r.id ?? "")
|
|
120191
|
+
}));
|
|
120192
|
+
const rawRead = await apiFetch2(
|
|
120193
|
+
`${config.apiBaseUrl}/query/media-account/bing/BingTradeList/Read`,
|
|
120194
|
+
config,
|
|
120195
|
+
{},
|
|
120196
|
+
verbose
|
|
120197
|
+
);
|
|
120198
|
+
applyBingTradeTranslations(records, normalizeBingTradeReadList(rawRead));
|
|
120199
|
+
return buildBingIndustryOptions(records);
|
|
120200
|
+
}
|
|
120201
|
+
|
|
120202
|
+
// src/commands/open-account/bing.ts
|
|
120063
120203
|
async function uploadAttachment(filePath, apiBaseUrl, config, verbose) {
|
|
120064
120204
|
const fileName = path14.basename(filePath);
|
|
120065
120205
|
const fileBuffer = fs9.readFileSync(filePath);
|
|
@@ -120138,13 +120278,19 @@ async function runOpenAccountBing(opts) {
|
|
|
120138
120278
|
opts.advertiserId
|
|
120139
120279
|
);
|
|
120140
120280
|
const accountCount = Math.min(Math.max(opts.accountCount ?? 1, 1), 6);
|
|
120281
|
+
let tradeId = opts.tradeId;
|
|
120282
|
+
try {
|
|
120283
|
+
const industryOptions = await fetchBingIndustryOptions(config, opts.verbose);
|
|
120284
|
+
tradeId = resolveBingTradeIdForSubmit(opts.tradeId, industryOptions);
|
|
120285
|
+
} catch {
|
|
120286
|
+
}
|
|
120141
120287
|
const body = {
|
|
120142
120288
|
mediaAccountGroupId: magKey,
|
|
120143
120289
|
accountCount,
|
|
120144
120290
|
bingCustomerInfo: {
|
|
120145
120291
|
name: opts.advertiserName,
|
|
120146
120292
|
province: opts.province,
|
|
120147
|
-
tradeId
|
|
120293
|
+
tradeId,
|
|
120148
120294
|
nameShort: opts.nameShort,
|
|
120149
120295
|
postcode: opts.postcode ?? "",
|
|
120150
120296
|
city: opts.city,
|
|
@@ -120164,7 +120310,7 @@ async function runOpenAccountBing(opts) {
|
|
|
120164
120310
|
companyName: opts.advertiserName,
|
|
120165
120311
|
postcode: opts.postcode ?? "",
|
|
120166
120312
|
province: opts.province,
|
|
120167
|
-
tradeId
|
|
120313
|
+
tradeId,
|
|
120168
120314
|
nameShort: opts.nameShort,
|
|
120169
120315
|
fileId,
|
|
120170
120316
|
fileName,
|
|
@@ -120193,13 +120339,7 @@ async function runOpenAccountBingIndustries(opts) {
|
|
|
120193
120339
|
const config = loadConfig(opts.token);
|
|
120194
120340
|
let list;
|
|
120195
120341
|
try {
|
|
120196
|
-
|
|
120197
|
-
`${config.apiBaseUrl}/query/media-account/bing/BingTradeList/Read`,
|
|
120198
|
-
config,
|
|
120199
|
-
{},
|
|
120200
|
-
opts.verbose
|
|
120201
|
-
);
|
|
120202
|
-
list = Array.isArray(raw) ? raw : raw.value ?? [];
|
|
120342
|
+
list = await fetchBingIndustryOptions(config, opts.verbose);
|
|
120203
120343
|
} catch (err) {
|
|
120204
120344
|
console.error(
|
|
120205
120345
|
`
|
|
@@ -120208,10 +120348,7 @@ async function runOpenAccountBingIndustries(opts) {
|
|
|
120208
120348
|
);
|
|
120209
120349
|
process.exit(1);
|
|
120210
120350
|
}
|
|
120211
|
-
|
|
120212
|
-
if (kw) {
|
|
120213
|
-
list = list.filter((r) => r.name.toLowerCase().includes(kw));
|
|
120214
|
-
}
|
|
120351
|
+
list = filterBingIndustryOptions(list, opts.keyword ?? "");
|
|
120215
120352
|
const n = list.length;
|
|
120216
120353
|
const bingIndPayload = wrapListJson({ page: 1, pageSize: Math.max(n, 1), total: n, items: list });
|
|
120217
120354
|
if (await emitCliJsonOrSnapshot(opts, {
|
|
@@ -120223,17 +120360,21 @@ async function runOpenAccountBingIndustries(opts) {
|
|
|
120223
120360
|
}
|
|
120224
120361
|
console.log(
|
|
120225
120362
|
`
|
|
120226
|
-
BingV2 \u884C\u4E1A\u5217\u8868\uFF08\u7B2C 1 \u9875\uFF0C\u672C\u9875 ${list.length} \u6761\uFF0C\u5171 ${list.length} \u6761\uFF0C\
|
|
120363
|
+
BingV2 \u884C\u4E1A\u5217\u8868\uFF08\u7B2C 1 \u9875\uFF0C\u672C\u9875 ${list.length} \u6761\uFF0C\u5171 ${list.length} \u6761\uFF0C--trade-id \u4F20 id \u5217\uFF0C\u4E0E\u7F51\u9875\u4E0B\u62C9\u4E00\u81F4\uFF09
|
|
120227
120364
|
`
|
|
120228
120365
|
);
|
|
120229
120366
|
if (list.length === 0) {
|
|
120230
|
-
console.log(" \u65E0\u6570\u636E\u3002\n");
|
|
120367
|
+
console.log(" \u65E0\u6570\u636E\u3002\u53EF\u53BB\u6389 --keyword \u67E5\u770B\u5168\u91CF\uFF0C\u6216\u6362\u66F4\u77ED\u7684\u4E2D\u6587\u5173\u952E\u8BCD\u3002\n");
|
|
120231
120368
|
return;
|
|
120232
120369
|
}
|
|
120233
|
-
|
|
120234
|
-
|
|
120235
|
-
|
|
120236
|
-
);
|
|
120370
|
+
let lastGroup = "";
|
|
120371
|
+
for (const row of list) {
|
|
120372
|
+
if (row.group !== lastGroup) {
|
|
120373
|
+
console.log(` \u25B8 ${row.group}`);
|
|
120374
|
+
lastGroup = row.group;
|
|
120375
|
+
}
|
|
120376
|
+
console.log(` ${row.label} (id: ${row.id})`);
|
|
120377
|
+
}
|
|
120237
120378
|
console.log();
|
|
120238
120379
|
}
|
|
120239
120380
|
|
|
@@ -121092,7 +121233,7 @@ function register24(program2) {
|
|
|
121092
121233
|
});
|
|
121093
121234
|
}
|
|
121094
121235
|
);
|
|
121095
|
-
openAccountCmd.command("bing").description("\u63D0\u4EA4 Bing/BingV2 \u5F00\u6237\u7533\u8BF7\uFF08\u9700\u4E0A\u4F20\u8425\u4E1A\u6267\u7167\u56FE\u7247\uFF0C\u6309\u516C\u53F8\u540D\u81EA\u52A8\u521B\u5EFA/\u5173\u8054\u5E7F\u544A\u4E3B\u7EC4\uFF09").requiredOption("--pattern <Direct|Agency>", "\u76F4\u63A5/\u4EE3\u7406\uFF1ADirect\uFF08\u76F4\u63A5\uFF09\u6216 Agency\uFF08\u4EE3\u7406\uFF09").requiredOption("--advertiser-name <name>", "\u516C\u53F8\u540D\u79F0\uFF08\u5E7F\u544A\u4E3B\u5168\u79F0\uFF0C\u7528\u4E8E\u5339\u914D\u6216\u521B\u5EFA\u5E7F\u544A\u4E3B\u7EC4\uFF09").requiredOption("--name-short <short>", "\u516C\u53F8\u7B80\u79F0").requiredOption("--name-remark-list <name>", "\u5F00\u6237\u540D\u79F0\uFF08\u8D26\u6237\u663E\u793A\u540D\uFF09").requiredOption("--province <province>", "\u516C\u53F8\u6240\u5728\u7701\u4EFD").requiredOption("--city <city>", "\u516C\u53F8\u6240\u5728\u57CE\u5E02").requiredOption("--address <address>", "\u516C\u53F8\u8BE6\u7EC6\u5730\u5740").requiredOption("--postcode <code>", "\u516C\u53F8\u6240\u5728\u5730\u90AE\u7F16").requiredOption("--trade-id <
|
|
121236
|
+
openAccountCmd.command("bing").description("\u63D0\u4EA4 Bing/BingV2 \u5F00\u6237\u7533\u8BF7\uFF08\u9700\u4E0A\u4F20\u8425\u4E1A\u6267\u7167\u56FE\u7247\uFF0C\u6309\u516C\u53F8\u540D\u81EA\u52A8\u521B\u5EFA/\u5173\u8054\u5E7F\u544A\u4E3B\u7EC4\uFF09").requiredOption("--pattern <Direct|Agency>", "\u76F4\u63A5/\u4EE3\u7406\uFF1ADirect\uFF08\u76F4\u63A5\uFF09\u6216 Agency\uFF08\u4EE3\u7406\uFF09").requiredOption("--advertiser-name <name>", "\u516C\u53F8\u540D\u79F0\uFF08\u5E7F\u544A\u4E3B\u5168\u79F0\uFF0C\u7528\u4E8E\u5339\u914D\u6216\u521B\u5EFA\u5E7F\u544A\u4E3B\u7EC4\uFF09").requiredOption("--name-short <short>", "\u516C\u53F8\u7B80\u79F0").requiredOption("--name-remark-list <name>", "\u5F00\u6237\u540D\u79F0\uFF08\u8D26\u6237\u663E\u793A\u540D\uFF09").requiredOption("--province <province>", "\u516C\u53F8\u6240\u5728\u7701\u4EFD").requiredOption("--city <city>", "\u516C\u53F8\u6240\u5728\u57CE\u5E02").requiredOption("--address <address>", "\u516C\u53F8\u8BE6\u7EC6\u5730\u5740").requiredOption("--postcode <code>", "\u516C\u53F8\u6240\u5728\u5730\u90AE\u7F16").requiredOption("--trade-id <id>", "\u884C\u4E1A tradeId\uFF08\u6765\u81EA open-account bing-industries \u7684 id\uFF0C\u4E0E\u7F51\u9875\u4E0B\u62C9 value \u4E00\u81F4\uFF09").requiredOption("--promotion-link <url>", "\u5F00\u6237\u7F51\u5740\uFF08\u63A8\u5E7F\u94FE\u63A5\uFF09").requiredOption("--license-file <path>", "\u8425\u4E1A\u6267\u7167\u56FE\u7247\u672C\u5730\u8DEF\u5F84\uFF08JPG/PNG/PDF\uFF09").option("--account-count <n>", "\u5F00\u6237\u6570\u91CF\uFF081~6\uFF0C\u9ED8\u8BA4 1\uFF09", parseInt).option("--advertiser-cid <cid>", "\u7ECF\u7406\u8D26\u53F7 ID\uFF08\u53EF\u9009\uFF09").option("--advertiser-name2 <name>", "\u7ECF\u7406\u8D26\u53F7\u540D\u79F0\uFF08\u53EF\u9009\uFF0C\u4E0E --advertiser-cid \u914D\u5BF9\uFF09").option("--advertiser-id <magKey>", "\u53EF\u9009\uFF1A\u624B\u52A8\u6307\u5B9A\u5E7F\u544A\u4E3B\u7EC4 magKey\uFF08\u4E00\u822C\u65E0\u9700\u586B\u5199\uFF09").option("-t, --token <token>", "Auth Token").option("--verbose", "\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(
|
|
121096
121237
|
async (opts) => {
|
|
121097
121238
|
await runOpenAccountBing({
|
|
121098
121239
|
token: opts.token,
|
|
@@ -121157,7 +121298,7 @@ function register24(program2) {
|
|
|
121157
121298
|
});
|
|
121158
121299
|
}
|
|
121159
121300
|
);
|
|
121160
|
-
openAccountCmd.command("bing-industries").description("\u5217\u51FA BingV2 \u884C\u4E1A\u5206\u7C7B\uFF08\u5C06
|
|
121301
|
+
openAccountCmd.command("bing-industries").description("\u5217\u51FA BingV2 \u884C\u4E1A\u5206\u7C7B\uFF08\u4E0E\u7F51\u9875\u540C\u6E90\uFF1B\u5C06 id \u4F20\u7ED9 open-account bing \u7684 --trade-id\uFF09").option("-k, --keyword <text>", "\u6309\u4E2D\u6587\u884C\u4E1A\u540D\u3001\u5206\u7EC4\u540D\u3001\u82F1\u6587 name \u6216 id \u8FC7\u6EE4").option(
|
|
121161
121302
|
"--json-out <path>",
|
|
121162
121303
|
"\u843D\u76D8\uFF08\u76EE\u5F55\u6216 *.json \u6587\u4EF6\u8DEF\u5F84\uFF09\u5E76\u66F4\u65B0 cli-manifest[-<\u67E5\u8BE2id>].json\uFF1B\u76EE\u5F55\u6A21\u5F0F\u6587\u4EF6\u540D\u4E3A `<section>[-<\u67E5\u8BE2id>].json`\uFF1Bstdout \u4E00\u884C\u6458\u8981 JSON\uFF0C\u542B outlineFile\uFF08TS \u5F0F\u7C7B\u578B\u5728 `*.outline.txt`\uFF09",
|
|
121163
121304
|
void 0
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -15,7 +15,9 @@ allowed-tools: Bash(siluzan-tso:*) Read Write
|
|
|
15
15
|
|
|
16
16
|
<!-- 注入到 SKILL.md.tmpl 的 {{AGENT_PREAMBLE}};构建时由 gen-skill-docs.mjs 合并 -->
|
|
17
17
|
|
|
18
|
-
> **Agent 纪律(每个新任务必读)**:Read `references/core/agent-conventions.md`,再按 `SKILL.md` 任务表 Read 域文档。禁止跨话题复用参数记忆;数据类任务一律 `--json-out` +
|
|
18
|
+
> **Agent 纪律(每个新任务必读)**:Read `references/core/agent-conventions.md`,再按 `SKILL.md` 任务表 Read 域文档。禁止跨话题复用参数记忆;数据类任务一律 `--json-out` + **仅用代码**读落盘 JSON(见 `references/core/tips.md`)——**禁止**用 Read 工具打开 `writtenFiles` 里的完整 `*.json`。
|
|
19
|
+
>
|
|
20
|
+
> **报告/Excel 交付前**:Read `references/core/deliverable-preflight.md`,运行 `node scripts/check-deliverable-snap.mjs <snapDir>`;币种只认 `currencyCode`,禁止默认 Google=美金。
|
|
19
21
|
>
|
|
20
22
|
> **开户**:首次进入开户话题须先向用户罗列该媒体(或未指明媒体时六平台)**全部必填项**,见 `references/accounts/open-account-by-media.md` §「首次响应硬规范」。
|
|
21
23
|
>
|
|
@@ -70,7 +72,7 @@ Windows:部分 Agent 通过 PowerShell 代执行时可能失败,改在 [Git
|
|
|
70
72
|
宿主具备 **Task / subagent**(或内置 Bash/Explore)时:
|
|
71
73
|
|
|
72
74
|
1. **复杂报告或批处理**(P5 / P6 OKKI / P7 询盘)、预计 CLI 输出很长 → 先 Read `references/core/subagent-orchestration.md`,按**决策矩阵**选择主会话或子会话。
|
|
73
|
-
2. Handoff 模板在 skill 根目录 `snippets/handoff-p{5,6,7}-*.md`;子会话只回传 manifest/exitCode
|
|
75
|
+
2. Handoff 模板在 skill 根目录 `snippets/handoff-p{5,6,7}-*.md`;子会话只回传 manifest/exitCode 摘要,**禁止** Read 落盘业务 JSON、**禁止**把 MB 级 JSON 贴回主对话(须脚本读盘后只回传脚本输出)。
|
|
74
76
|
3. **无 subagent 能力** → 跳过本节,按 `core/playbooks.md` 在主会话执行。
|
|
75
77
|
|
|
76
78
|
写操作、`--commit`、401/batch `resume` 策略由**主 Agent**负责,不默认下放子会话。
|
|
@@ -83,7 +85,7 @@ Windows:部分 Agent 通过 PowerShell 代执行时可能失败,改在 [Git
|
|
|
83
85
|
| ------------------ | ----------------------------- |
|
|
84
86
|
| 任意任务(首次) | `core/agent-conventions.md` |
|
|
85
87
|
| 账户列表 / 余额 / 消耗 / 分享 / MCC / 多账户汇总 | `accounts/accounts.md`;金额加 `accounts/currency.md` |
|
|
86
|
-
| 拉数 / 报告 / 周报 / `google-analysis` | `analytics/account-analytics.md` + `core/tips.md
|
|
88
|
+
| 拉数 / 报告 / 周报 / `google-analysis` | `analytics/account-analytics.md` + `core/tips.md` + **`core/deliverable-preflight.md`**;多账户加 `analytics/google-analysis-batch.md` |
|
|
87
89
|
| Meta/Facebook 周期或诊断报告 / `facebook-analysis` | `analytics/facebook-analysis-guide.md` + `report-templates/meta-period-report.md`(或 `meta-account-diagnosis-report.md`)+ `core/playbooks.md` P4-FB |
|
|
88
90
|
| 网站诊断 / 落地页评分 / `website-diagnosis` | `analytics/website-diagnosis-guide.md` + `assets/website-diagnosis-rules.md` + `report-templates/website-diagnosis-report.md`(**终稿 HTML**)+ `core/playbooks.md` P8 |
|
|
89
91
|
| Google 新建搜索系列 | `google-ads/google-ads-campaign-plan.md` |
|
package/dist/skill/_meta.json
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
| ---- | ---- |
|
|
9
9
|
| `core/setup.md` | 安装、登录(手机验证码优先)、配置、更新 |
|
|
10
10
|
| `core/agent-conventions.md` | **Agent 必读**:加载纪律、硬规范、数据转换、时间/币种/批量 |
|
|
11
|
-
| `core/tips.md` | `--json-out` 协议、outline
|
|
11
|
+
| `core/tips.md` | `--json-out` 协议、outline→脚本读 JSON |
|
|
12
|
+
| `core/deliverable-preflight.md` | **交付前自检**:币种 + manifest 完整性;`scripts/check-deliverable-snap.mjs` |
|
|
12
13
|
| `core/playbooks.md` | P1–P7 高频任务标准动作 |
|
|
13
14
|
| `core/workflows.md` | 多命令串联业务流程 |
|
|
14
15
|
| `core/skill-authoring.md` | Skill 文档维护最佳实践(维护者) |
|
|
@@ -257,7 +257,7 @@ siluzan-tso account-history --start 2026-03-01 --end 2026-03-31 --json-out ./sna
|
|
|
257
257
|
| 状态 | 含义 | 下一步操作 |
|
|
258
258
|
| ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
259
259
|
| `Pending` | 审核中 | 等待,可反复运行此命令轮询;审核周期因媒体而异 |
|
|
260
|
-
| `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `
|
|
260
|
+
| `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google`;Kwai、Yandex 当前没有对应充值界面) |
|
|
261
261
|
| `Rejected` | 被拒 | 查看 `--json-out` 落盘中的 `reason` 字段了解拒绝原因;修改资料后重新提交;若原因不明,引导用户联系丝路赞客服 |
|
|
262
262
|
|
|
263
263
|
---
|
|
@@ -517,7 +517,7 @@ siluzan-tso open-account yandex \
|
|
|
517
517
|
### Bing/BingV2 开户(需要营业执照图片)
|
|
518
518
|
|
|
519
519
|
```bash
|
|
520
|
-
# 前置:查询 Bing
|
|
520
|
+
# 前置:查询 Bing 行业(--trade-id 传 bing-industries 输出的 id,与网页下拉 value 一致)
|
|
521
521
|
siluzan-tso open-account bing-industries --keyword "科技"
|
|
522
522
|
|
|
523
523
|
siluzan-tso open-account bing \
|
|
@@ -530,7 +530,7 @@ siluzan-tso open-account bing \
|
|
|
530
530
|
--address "南山区科技园XX路XX号XX大厦" \
|
|
531
531
|
--postcode "518000" \
|
|
532
532
|
--promotion-link "https://www.brand-a.com" \
|
|
533
|
-
--trade-id "
|
|
533
|
+
--trade-id "<bing-industries 输出的 id>" \
|
|
534
534
|
--license-file "/path/to/license.jpg"
|
|
535
535
|
```
|
|
536
536
|
|
|
@@ -810,7 +810,7 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
|
|
|
810
810
|
|
|
811
811
|
| 功能 | 媒体 | 网页路径 |
|
|
812
812
|
| --------------------------------------- | ------ | ---------------------------------------------- |
|
|
813
|
-
| **账户激活**(邀请他人激活 / 充值激活) | Google | `
|
|
813
|
+
| **账户激活**(邀请他人激活 / 充值激活) | Google | `https://www-ci.siluzan.com/v3/foreign_trade/tso/manageAccounts` |
|
|
814
814
|
|
|
815
815
|
**Agent 建议话术**:
|
|
816
816
|
|
|
@@ -819,5 +819,5 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
|
|
|
819
819
|
siluzan-tso config show # 查看 webUrl 字段
|
|
820
820
|
|
|
821
821
|
# 账户激活(Google)→ 引导至账户管理页
|
|
822
|
-
#
|
|
822
|
+
# https://www-ci.siluzan.com/v3/foreign_trade/tso/manageAccounts
|
|
823
823
|
```
|
|
@@ -121,10 +121,10 @@ siluzan-tso config show
|
|
|
121
121
|
|
|
122
122
|
| 媒体 | `mediaType` 参数 | 传统充值/现金充值链接 |
|
|
123
123
|
| ---- | ---------------- | ------------ |
|
|
124
|
-
| Google | `Google` | `
|
|
125
|
-
| TikTok | `TikTok` | `
|
|
126
|
-
| Meta / Facebook | `MetaAd` | `
|
|
127
|
-
| Microsoft / Bing | `MicrosoftAd` | `
|
|
124
|
+
| Google | `Google` | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google` |
|
|
125
|
+
| TikTok | `TikTok` | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=TikTok` |
|
|
126
|
+
| Meta / Facebook | `MetaAd` | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=MetaAd` |
|
|
127
|
+
| Microsoft / Bing | `MicrosoftAd` | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=MicrosoftAd` |
|
|
128
128
|
|
|
129
129
|
> Yandex、Kwai 当前没有传统充值/现金充值界面;用户询问这些媒体充值时,不要拼接充值页链接,应说明当前网页不提供对应充值入口,并建议联系丝路赞客服或业务负责人确认处理方式。
|
|
130
130
|
|
|
@@ -132,8 +132,8 @@ siluzan-tso config show
|
|
|
132
132
|
|
|
133
133
|
| 媒体 | 批量充值链接 |
|
|
134
134
|
| ---- | ------------ |
|
|
135
|
-
| Google | `
|
|
136
|
-
| TikTok | `
|
|
135
|
+
| Google | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay_batch?mediaType=Google` |
|
|
136
|
+
| TikTok | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay_batch?mediaType=TikTok` |
|
|
137
137
|
|
|
138
138
|
> Meta、Microsoft/Bing、Yandex、Kwai 当前不要引导到批量充值页。
|
|
139
139
|
|
|
@@ -141,10 +141,10 @@ siluzan-tso config show
|
|
|
141
141
|
|
|
142
142
|
| 媒体 | 月结充值链接 |
|
|
143
143
|
| ---- | ------------ |
|
|
144
|
-
| Google | `
|
|
145
|
-
| TikTok | `
|
|
146
|
-
| Meta / Facebook | `
|
|
147
|
-
| Microsoft / Bing | `
|
|
144
|
+
| Google | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=Google` |
|
|
145
|
+
| TikTok | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=TikTok` |
|
|
146
|
+
| Meta / Facebook | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MetaAd` |
|
|
147
|
+
| Microsoft / Bing | `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MicrosoftAd` |
|
|
148
148
|
|
|
149
149
|
> Yandex、Kwai 当前不要引导到月结充值页。
|
|
150
150
|
|
|
@@ -155,17 +155,17 @@ siluzan-tso config show
|
|
|
155
155
|
```
|
|
156
156
|
需要进行充值,请访问丝路赞平台对应页面完成操作:
|
|
157
157
|
|
|
158
|
-
- Google 充值:
|
|
159
|
-
- TikTok 充值:
|
|
160
|
-
- Meta 充值:
|
|
161
|
-
- Microsoft/Bing 充值:
|
|
162
|
-
- Google 批量充值:
|
|
163
|
-
- TikTok 批量充值:
|
|
164
|
-
- Google 月结充值:
|
|
165
|
-
- TikTok 月结充值:
|
|
166
|
-
- Meta 月结充值:
|
|
167
|
-
- Microsoft/Bing 月结充值:
|
|
168
|
-
- 丝路赞钱包:
|
|
158
|
+
- Google 充值: https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
|
|
159
|
+
- TikTok 充值: https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=TikTok
|
|
160
|
+
- Meta 充值: https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=MetaAd
|
|
161
|
+
- Microsoft/Bing 充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=MicrosoftAd
|
|
162
|
+
- Google 批量充值: https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay_batch?mediaType=Google
|
|
163
|
+
- TikTok 批量充值: https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay_batch?mediaType=TikTok
|
|
164
|
+
- Google 月结充值: https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=Google
|
|
165
|
+
- TikTok 月结充值: https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=TikTok
|
|
166
|
+
- Meta 月结充值: https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MetaAd
|
|
167
|
+
- Microsoft/Bing 月结充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MicrosoftAd
|
|
168
|
+
- 丝路赞钱包: https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/siluzanWallet
|
|
169
169
|
|
|
170
170
|
Yandex、Kwai 当前没有传统充值/现金充值和月结充值界面,需联系丝路赞客服或业务负责人确认处理方式。
|
|
171
171
|
批量充值当前仅支持 Google 和 TikTok;Meta、Microsoft/Bing、Yandex、Kwai 不要引导到批量充值页。
|
|
@@ -174,17 +174,17 @@ Yandex、Kwai 当前没有传统充值/现金充值和月结充值界面,需
|
|
|
174
174
|
**示例:**
|
|
175
175
|
|
|
176
176
|
```
|
|
177
|
-
- Google 充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
|
|
178
|
-
- TikTok 充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=TikTok
|
|
179
|
-
- Meta 充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=MetaAd
|
|
180
|
-
- Microsoft/Bing 充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=MicrosoftAd
|
|
181
|
-
- Google 批量充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay_batch?mediaType=Google
|
|
182
|
-
- TikTok 批量充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay_batch?mediaType=TikTok
|
|
183
|
-
- Google 月结充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=Google
|
|
184
|
-
- TikTok 月结充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=TikTok
|
|
185
|
-
- Meta 月结充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MetaAd
|
|
186
|
-
- Microsoft/Bing 月结充值:https://www.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MicrosoftAd
|
|
187
|
-
- 丝路赞钱包:https://www.siluzan.com/v3/foreign_trade/tso/recharge/siluzanWallet
|
|
177
|
+
- Google 充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
|
|
178
|
+
- TikTok 充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=TikTok
|
|
179
|
+
- Meta 充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=MetaAd
|
|
180
|
+
- Microsoft/Bing 充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=MicrosoftAd
|
|
181
|
+
- Google 批量充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay_batch?mediaType=Google
|
|
182
|
+
- TikTok 批量充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay_batch?mediaType=TikTok
|
|
183
|
+
- Google 月结充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=Google
|
|
184
|
+
- TikTok 月结充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=TikTok
|
|
185
|
+
- Meta 月结充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MetaAd
|
|
186
|
+
- Microsoft/Bing 月结充值:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MicrosoftAd
|
|
187
|
+
- 丝路赞钱包:https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/siluzanWallet
|
|
188
188
|
```
|
|
189
189
|
|
|
190
190
|
---
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
| 城市 | `--city` | |
|
|
85
85
|
| 详细地址 | `--address` | |
|
|
86
86
|
| 邮编 | `--postcode` | |
|
|
87
|
-
| 行业 | `--trade-id` | `bing-industries
|
|
87
|
+
| 行业 | `--trade-id` | 先 `bing-industries`;传输出 **id**(与网页下拉 value 一致),勿猜中文名 |
|
|
88
88
|
| 推广链接 | `--promotion-link` | |
|
|
89
89
|
| 执照图片 | `--license-file` | JPG/PNG/PDF 本地路径 |
|
|
90
90
|
|
|
@@ -199,6 +199,8 @@ siluzan-tso account-history -m Yandex
|
|
|
199
199
|
|
|
200
200
|
**必填**:见上表 § BingV2。
|
|
201
201
|
|
|
202
|
+
> **行业(Agent 硬规范)**:与网页一致,数据源为 `TradeList` + `BingTradeList/Read` 合并后的**二级**选项。必须先执行 `open-account bing-industries`(`--keyword` 可匹配中文行业名、分组名、英文 name 或 id),从输出取 **`id`** 填入 `--trade-id`。**禁止**凭记忆写行业名或编造「一级/二级」拼接字符串。
|
|
203
|
+
|
|
202
204
|
```bash
|
|
203
205
|
siluzan-tso open-account bing-industries --keyword "科技"
|
|
204
206
|
|
|
@@ -212,7 +214,7 @@ siluzan-tso open-account bing \
|
|
|
212
214
|
--address "南山区科技园XX路XX号" \
|
|
213
215
|
--postcode "518000" \
|
|
214
216
|
--promotion-link "https://www.brand-a.com" \
|
|
215
|
-
--trade-id "
|
|
217
|
+
--trade-id "<bing-industries 输出的 id>" \
|
|
216
218
|
--license-file "/path/to/license.jpg"
|
|
217
219
|
|
|
218
220
|
siluzan-tso account-history -m BingV2
|
|
@@ -60,7 +60,7 @@ siluzan-tso open-account google-wizard
|
|
|
60
60
|
|
|
61
61
|
```bash
|
|
62
62
|
siluzan-tso account-history -m Google
|
|
63
|
-
# 审核通过后:config show →
|
|
63
|
+
# 审核通过后:config show → https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
---
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
1. **先确认统计区间**:用户未给明确起止日期时**必须反问**(参见 SKILL.md 时间范围强制反问)。
|
|
33
33
|
2. 确定报告维度(默认含:执行摘要、每日趋势、月度汇总、系列表现、设备分布、地域分布、关键词表现、优化建议),详见 `report-templates/README.md`。若用户使用 **「使用 okki 周报模板…」「OKKI 周报」** 等固定话术发客户,改走 **`report-templates/okki-weekly-google-client.md`**(与 SKILL **P6** 一致),不再按 `google-period-report.md` 的默认 8 维追问。
|
|
34
34
|
3. **拉数**:使用 `google-analysis … --json-out <dir>`(Google)或对应 `report <media>-*` 命令落盘。
|
|
35
|
-
4. **编写并执行代码**从磁盘读取 `manifest-<accountId>.json` 与各 `<section>-<accountId>.json`
|
|
36
|
-
-
|
|
35
|
+
4. **编写并执行代码**从磁盘读取 `manifest-<accountId>.json` 与各 `<section>-<accountId>.json` 来完成筛选、聚合、排序等计算;**禁止**用宿主 `Read` 打开业务 `*.json`;**禁止**在对话里心算或手填报告数字。
|
|
36
|
+
- **写脚本前**用 Read 仅打开 `<section>-<accountId>.outline.txt`(或 `node -e` 读最后一行类型字面量)了解字段结构;**业务 JSON 只许在脚本里** `require` / `readFileSync`,脚本 `console.log` 打印所需汇总。
|
|
37
37
|
- 真实数据始终从 `<section>-<accountId>.json` 通过代码获取,**不要**把 outline 当作业务数据贴给用户。
|
|
38
38
|
5. **由代码写出最终文件**(HTML/Excel/PDF/PPT/Markdown/word 等)。**禁止**在报告脚本中以源码字面量写死应从 JSON 读取的业务数据(消耗金额、系列名、日期区间等)。允许的常量仅限:快照目录路径、JSON 字段键名、版式/结构占位。
|
|
39
39
|
6. **报告首行**须标注:`统计区间:YYYY-MM-DD ~ YYYY-MM-DD(货币:XXX)`
|
|
@@ -192,9 +192,9 @@ siluzan-tso report push receive-emails -m Google [--json-out ./snap]
|
|
|
192
192
|
|
|
193
193
|
| 媒体 | 报告类型 | URL 模板 |
|
|
194
194
|
| ------ | ---------------- | -------------------------------------------------------- |
|
|
195
|
-
| Google | 日报(Daily) | `
|
|
196
|
-
| Google | 小时报(Hourly) | `
|
|
197
|
-
| TikTok | 日报 | `
|
|
195
|
+
| Google | 日报(Daily) | `https://www-ci.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
|
|
196
|
+
| Google | 小时报(Hourly) | `https://www-ci.siluzan.com/media-report/hour/{entityId}?culture=zh-CN` |
|
|
197
|
+
| TikTok | 日报 | `https://www-ci.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
|
|
198
198
|
|
|
199
199
|
`entityId` 来自 `siluzan-tso report list --json-out ./snap` 中每条记录的 `entityId` 字段。
|
|
200
200
|
|
|
@@ -207,8 +207,8 @@ siluzan-tso report list -m Google --json-out ./snap
|
|
|
207
207
|
|
|
208
208
|
# 第二步:查看 webUrl
|
|
209
209
|
siluzan-tso config show
|
|
210
|
-
# webUrl: https://www.siluzan.com
|
|
210
|
+
# webUrl: https://www-ci.siluzan.com
|
|
211
211
|
|
|
212
212
|
# 第三步:拼接链接(Google 日报)
|
|
213
|
-
# https://www.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
|
|
213
|
+
# https://www-ci.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
|
|
214
214
|
```
|