siluzan-tso-cli 1.0.0-beta.47 → 1.0.0-beta.49

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
@@ -20,7 +20,7 @@ siluzan-tso init -d /path/to/skills # 写入自定义目录
20
20
  siluzan-tso init --force # 强制覆盖已存在文件
21
21
  ```
22
22
 
23
- > **注意**:当前为测试版(1.0.0-beta.47),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
23
+ > **注意**:当前为测试版(1.0.0-beta.49),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
24
24
 
25
25
  | 助手 | 建议 `--ai` |
26
26
  |------|-------------|
package/dist/index.js CHANGED
@@ -7468,13 +7468,13 @@ async function runAdGeoList(opts) {
7468
7468
  const config = loadConfig(opts.token);
7469
7469
  const googleApiUrl = requireGoogleApi(config);
7470
7470
  let url;
7471
+ const params = new URLSearchParams();
7471
7472
  if (opts.mode === "report") {
7472
- const params = new URLSearchParams();
7473
- params.set("startDate", toGoogleDate(opts.startDate, -30));
7474
- params.set("endDate", toGoogleDate(opts.endDate, 0));
7475
7473
  url = `${googleApiUrl}/geotargetmanagement/v2/list/${opts.account}?${params}`;
7476
7474
  } else {
7477
- url = `${googleApiUrl}/campaignmanagement/v2/${opts.mode}locations/${opts.account}`;
7475
+ params.set("startDate", toGoogleDate(opts.startDate, -30));
7476
+ params.set("endDate", toGoogleDate(opts.endDate, 0));
7477
+ url = `${googleApiUrl}/campaignmanagement/v2/${opts.mode}locations/${opts.account}?${params}`;
7478
7478
  }
7479
7479
  let data;
7480
7480
  try {
@@ -7486,7 +7486,11 @@ async function runAdGeoList(opts) {
7486
7486
  process.exit(1);
7487
7487
  }
7488
7488
  const rawData = data.data;
7489
- const items = Array.isArray(rawData) ? rawData : rawData?.countries ?? [];
7489
+ let items = Array.isArray(rawData) ? rawData : rawData?.countries ?? [];
7490
+ if (opts.campaignId) {
7491
+ const targetId = opts.campaignId;
7492
+ items = items.filter((item) => String(item["campaignId"] ?? "") === targetId);
7493
+ }
7490
7494
  const modeLabel = { targeted: "\u5DF2\u5B9A\u4F4D", excluded: "\u5DF2\u6392\u9664", report: "\u6D88\u8017\u62A5\u544A" }[opts.mode];
7491
7495
  const n = items.length;
7492
7496
  if (opts.json) {
@@ -11023,7 +11027,7 @@ geoCmd.command("search").description("\u641C\u7D22\u53EF\u7528\u7684\u5730\u7406
11023
11027
  verbose: opts.verbose
11024
11028
  });
11025
11029
  });
11026
- geoCmd.command("list").description("\u67E5\u8BE2\u5730\u7406\u4F4D\u7F6E\u5B9A\u5411\u5217\u8868\uFF08targeted = \u5DF2\u5B9A\u4F4D\uFF1Bexcluded = \u5DF2\u6392\u9664\uFF1Breport = \u6D88\u8017\u62A5\u544A\uFF09").requiredOption("-a, --account <id>", "Google \u8D26\u6237 mediaCustomerId").option("--mode <mode>", "\u5217\u8868\u7C7B\u578B\uFF1Atargeted | excluded | report\uFF08\u9ED8\u8BA4 targeted\uFF09", "targeted").option("--start <date>", "\u6D88\u8017\u62A5\u544A\u5F00\u59CB\u65E5\u671F\uFF08\u4EC5 mode=report \u65F6\u6709\u6548\uFF09").option("--end <date>", "\u6D88\u8017\u62A5\u544A\u7ED3\u675F\u65E5\u671F\uFF08\u4EC5 mode=report \u65F6\u6709\u6548\uFF09").option("-t, --token <token>", "Auth Token").option("--json", "JSON \u683C\u5F0F\u8F93\u51FA", false).option("--verbose", "\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
11030
+ geoCmd.command("list").description("\u67E5\u8BE2\u5730\u7406\u4F4D\u7F6E\u5B9A\u5411\u5217\u8868\uFF08targeted = \u5DF2\u5B9A\u4F4D\uFF1Bexcluded = \u5DF2\u6392\u9664\uFF1Breport = \u6D88\u8017\u62A5\u544A\uFF0C\u53EF\u9009\u6309\u5E7F\u544A\u7CFB\u5217\u8FC7\u6EE4\uFF09").requiredOption("-a, --account <id>", "Google \u8D26\u6237 mediaCustomerId").option("--mode <mode>", "\u5217\u8868\u7C7B\u578B\uFF1Atargeted | excluded | report\uFF08\u9ED8\u8BA4 targeted\uFF09", "targeted").option("--campaign-id <id>", "\u53EF\u9009\uFF1A\u6309\u5E7F\u544A\u7CFB\u5217 ID \u8FC7\u6EE4\u7ED3\u679C\uFF08\u6765\u81EA ad campaigns\uFF09").option("--start <date>", "\u5F00\u59CB\u65E5\u671F YYYY-MM-DD\uFF08\u9ED8\u8BA4 30 \u5929\u524D\uFF0C\u6240\u6709\u6A21\u5F0F\u751F\u6548\uFF09").option("--end <date>", "\u7ED3\u675F\u65E5\u671F YYYY-MM-DD\uFF08\u9ED8\u8BA4\u4ECA\u5929\uFF0C\u6240\u6709\u6A21\u5F0F\u751F\u6548\uFF09").option("-t, --token <token>", "Auth Token").option("--json", "JSON \u683C\u5F0F\u8F93\u51FA", false).option("--verbose", "\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(async (opts) => {
11027
11031
  if (!["targeted", "excluded", "report"].includes(opts.mode)) {
11028
11032
  console.error("\n\u274C --mode \u53EA\u63A5\u53D7 targeted | excluded | report\n");
11029
11033
  process.exit(1);
@@ -11032,6 +11036,7 @@ geoCmd.command("list").description("\u67E5\u8BE2\u5730\u7406\u4F4D\u7F6E\u5B9A\u
11032
11036
  token: opts.token,
11033
11037
  account: opts.account,
11034
11038
  mode: opts.mode,
11039
+ campaignId: opts.campaignId,
11035
11040
  startDate: opts.start,
11036
11041
  endDate: opts.end,
11037
11042
  json: opts.json,
@@ -21,6 +21,8 @@ description: >-
21
21
 
22
22
  # Siluzan TSO Skill
23
23
 
24
+ 在使用本skill输出的任何内容中,包括但不限于报告,计划,总结,严禁让用户执行本skill提供的命令行。(setup.md)中的命令除外
25
+
24
26
  ## 文档索引
25
27
  实现用户要求时,请先阅读以下对应功能的文档
26
28
  | 文档 | 内容 |
@@ -60,6 +62,14 @@ description: >-
60
62
  3. 输出成html后可以转成pdf方便用户查看
61
63
  ---
62
64
 
65
+ ## 命令选择原则(按意图推导,不死记流程)
66
+
67
+ - **先想业务意图,再选命令**:根据用户说的是「开户 / 看余额 / 看国家 / 看消耗 / 生成报告 / 优化账户」这类业务目标,主动在 `references/*.md` 和 使用`-h`找**一整个命令组合**,而不是只挑一个看起来相关的命令。
68
+ - **地域 / 国家相关问题优先用 `ad geo` 系列**:
69
+ - 用户问「投放国家/地区/地理分布/某国有没有投放」这类问题时,优先通过 `ad geo search/list` 或 `google-analysis geographic` 这类带地理维度的接口,而不是只用 `ad campaigns`。
70
+ - 示例:用户给出账户 ID,问「查询这个账号所有广告系列的投放国家」,应优先查 `ad geo list` / `ad geo report`(见 `references/google-ads.md` 与 `references/workflows.md` 中的 geo 章节),必要时再结合 `campaigns` 做交叉验证。
71
+ - **遇到不熟悉的业务,必须先查命令与文档**:不能凭直觉乱拼命令;先看 `-h` / 单命令 `-h`,再结合 `references/workflows.md` / 相关 `references/*.md` 推导一套合理的执行顺序,然后自己执行命令完成操作。
72
+
63
73
  ## 自动更新规则
64
74
  CLI 命令执行后可能在输出末尾出现以下两种标记,Agent 必须按对应规则处理:
65
75
  ### `[SILUZAN_FORCE_UPDATE]` — 强制更新(必须,不可跳过)
@@ -80,12 +90,12 @@ CLI 命令执行后可能在输出末尾出现以下两种标记,Agent 必须
80
90
  - **使用 --json 处理数据**:需对返回数据做计算或筛选时,加 `--json`,再用 `node -e` 过滤提取(见 `references/tips.md`)。
81
91
  - **不要猜测账户 ID**:`entityId` ≠ `mediaCustomerId`,两者均来自 `list-accounts`。
82
92
  - **媒体类型区分大小写**:`Google`、`TikTok`、`MetaAd`、`BingV2`、`Kwai`。
83
- - **一个完整的产品,不应该暴露内部命令**:除了 `setup` 中的 `login` 命令,所有命令行工具都是交由你完全代替用户执行。禁止向用户透露任何命令行、参数或代码逻辑。
93
+ - **严格禁止任何让用户执行命令的行为**:除了 `setup` 中的 `login` 命令,所有命令行工具都是交由你完全代替用户执行。禁止向用户透露任何命令行、参数或代码逻辑。
84
94
  - **具体业务的额外规范**:开户、优化、报告、Google 广告创建等场景的详细约束,请分别在执行前阅读对应的 `references/*.md` 文档。
85
95
 
86
96
 
87
97
  ## 账户ID示例
88
- 用于快速确定用户发送账号的类型,xxx是脱敏处理,一般主要通过位数就能确定账号类型,无法确定再查list-account -m mediatype -k id
98
+ 用于快速确定用户发送账号的类型,xxx是脱敏处理,一般主要通过位数就能确定账号类型,无法确定再查list-account -m [mediatype] -k [id]
89
99
  Google: 4545xxx137
90
100
  Tiktok: 70083497xxx59820033
91
101
  Meta(Facebook): 1716030xxx734076, 6843984xxx14909, 479423xxx752348
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.0.0-beta.47",
4
- "publishedAt": 1774942711256
3
+ "version": "1.0.0-beta.49",
4
+ "publishedAt": 1774950028612
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-tso-cli",
3
- "version": "1.0.0-beta.47",
3
+ "version": "1.0.0-beta.49",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "type": "module",
6
6
  "bin": {