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 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 = "\u5904\u7406\u987A\u5E8F\uFF1A\u5148\u8BFB outlineFile\uFF08schema \u63CF\u8FF0\uFF0C\u975E\u6570\u636E\uFF09\u4E86\u89E3\u5B57\u6BB5\u7C7B\u578B\uFF0C\u518D\u7528\u811A\u672C\u8BFB writtenFiles[0]\uFF08\u771F\u5B9E JSON \u6570\u636E\uFF09\u505A\u7B5B\u9009/\u805A\u5408\uFF1B\u4E0D\u8981\u628A outline \u5F53\u6210\u6570\u636E\uFF0C\u4E5F\u4E0D\u8981\u628A JSON \u5F53\u6210 schema\u3002";
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
- obj[rule.target] = divToYuan(obj[rule.source], rule.divisor);
5245
- delete obj[rule.source];
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
- init_cli_table();
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: opts.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: opts.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
- const raw = await apiFetch2(
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
- const kw = (opts.keyword ?? "").trim().toLowerCase();
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\u5C06 name \u503C\u4F20\u7ED9 --trade-id\uFF09
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
- printCliTable(
120234
- list.map((r) => ({ name: r.name })),
120235
- [{ key: "name", header: "\u884C\u4E1A\u540D\u79F0\uFF08--trade-id\uFF09" }]
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 <name>", "\u884C\u4E1A\uFF08\u6765\u81EA open-account bing-industries \u7684 name \u5B57\u6BB5\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(
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 name \u503C\u4F20\u7ED9 open-account bing \u7684 --trade-id\uFF09").option("-k, --keyword <text>", "\u6309\u4E2D\u6587\u540D\u6216\u82F1\u6587\u540D\u8FC7\u6EE4").option(
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
@@ -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` + 脚本读盘(见 `references/core/tips.md`)。
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 摘要,**禁止**把 MB 级 JSON 贴回主对话。
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`;多账户加 `analytics/google-analysis-batch.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` |
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.25",
4
- "publishedAt": 1780474639427
3
+ "version": "1.1.26-beta.2",
4
+ "publishedAt": 1780539987793
5
5
  }
@@ -8,7 +8,8 @@
8
8
  | ---- | ---- |
9
9
  | `core/setup.md` | 安装、登录(手机验证码优先)、配置、更新 |
10
10
  | `core/agent-conventions.md` | **Agent 必读**:加载纪律、硬规范、数据转换、时间/币种/批量 |
11
- | `core/tips.md` | `--json-out` 协议、outlineJSON 处理顺序 |
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 为 `{webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=Google`;Kwai、Yandex 当前没有对应充值界面) |
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 行业名称(--trade-id 传返回的 name 字段值)
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 "IT/消费电子-其他" \
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 | `{webUrl}/v3/foreign_trade/tso/manageAccounts` |
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
- # {webUrl}/v3/foreign_trade/tso/manageAccounts
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` | `{webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=Google` |
125
- | TikTok | `TikTok` | `{webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=TikTok` |
126
- | Meta / Facebook | `MetaAd` | `{webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=MetaAd` |
127
- | Microsoft / Bing | `MicrosoftAd` | `{webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=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 | `{webUrl}/v3/foreign_trade/tso/recharge/pay_batch?mediaType=Google` |
136
- | TikTok | `{webUrl}/v3/foreign_trade/tso/recharge/pay_batch?mediaType=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 | `{webUrl}/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=Google` |
145
- | TikTok | `{webUrl}/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=TikTok` |
146
- | Meta / Facebook | `{webUrl}/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MetaAd` |
147
- | Microsoft / Bing | `{webUrl}/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MicrosoftAd` |
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 充值: {webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=Google
159
- - TikTok 充值: {webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=TikTok
160
- - Meta 充值: {webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=MetaAd
161
- - Microsoft/Bing 充值:{webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=MicrosoftAd
162
- - Google 批量充值: {webUrl}/v3/foreign_trade/tso/recharge/pay_batch?mediaType=Google
163
- - TikTok 批量充值: {webUrl}/v3/foreign_trade/tso/recharge/pay_batch?mediaType=TikTok
164
- - Google 月结充值: {webUrl}/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=Google
165
- - TikTok 月结充值: {webUrl}/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=TikTok
166
- - Meta 月结充值: {webUrl}/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MetaAd
167
- - Microsoft/Bing 月结充值:{webUrl}/v3/foreign_trade/tso/recharge/accountBillingQuota?mediaType=MicrosoftAd
168
- - 丝路赞钱包: {webUrl}/v3/foreign_trade/tso/recharge/siluzanWallet
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` 返回的 **name** 字段 |
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 "IT/消费电子-其他" \
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 → {webUrl}/v3/foreign_trade/tso/recharge/pay?mediaType=Google
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` 来完成筛选、聚合、排序等计算;**禁止**用 `Read` JSON 后在对话里心算或手填报告数字。
36
- - **写脚本前先读 `<section>-<accountId>.outline.txt`**(与 JSON stem 的纯文本,最后一行是 TS 式类型字面量)了解字段结构;它体积只有几百字节、不含数据,比直接 `Read` 整个 `*.json`(动辄几 MB / 几万行)省**两到三个数量级**的上下文,不要 `require()`,用 `fs.readFileSync(outlineFile,'utf8')` 读最后一行即可。
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)`
@@ -1,6 +1,6 @@
1
1
  # rag:知识库检索(TSO 广告投放辅助)
2
2
 
3
- 知识库管理页面在 https://www.siluzan.com/knowledge-base/
3
+ 知识库管理页面在 https://www-ci.siluzan.com/knowledge-base/
4
4
 
5
5
  为 **广告投放、账户分析、拓词、诊断报告** 等 TSO 业务提供**企业已入库**的产品、行业、客户背景事实依据。
6
6
 
@@ -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) | `{webUrl}/media-report/publish/{entityId}?culture=zh-CN` |
196
- | Google | 小时报(Hourly) | `{webUrl}/media-report/hour/{entityId}?culture=zh-CN` |
197
- | TikTok | 日报 | `{webUrl}/media-report/publish/{entityId}?culture=zh-CN` |
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
  ```