siluzan-tso-cli 1.1.15 → 1.1.17-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/index.js +3 -3
- package/dist/skill/SKILL.md +88 -140
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/account-analytics.md +27 -4
- package/dist/skill/references/accounts.md +3 -1
- package/dist/skill/references/finance.md +5 -5
- package/dist/skill/references/google-analysis-batch.md +111 -146
- package/dist/skill/references/reporting.md +2 -2
- package/dist/skill/references/setup.md +5 -5
- package/dist/skill/references/tso-home.md +1 -1
- package/dist/skill/scripts/install.ps1 +6 -2
- package/dist/skill/scripts/install.sh +2 -2
- 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.17-beta.1),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
54
55
|
|
|
55
56
|
| 助手 | 建议 `--ai` |
|
|
56
57
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -2791,7 +2791,7 @@ var DEFAULT_API_BASE;
|
|
|
2791
2791
|
var init_defaults = __esm({
|
|
2792
2792
|
"src/config/defaults.ts"() {
|
|
2793
2793
|
"use strict";
|
|
2794
|
-
DEFAULT_API_BASE = "https://tso-api.siluzan.com";
|
|
2794
|
+
DEFAULT_API_BASE = "https://tso-api-ci.siluzan.com";
|
|
2795
2795
|
}
|
|
2796
2796
|
});
|
|
2797
2797
|
|
|
@@ -5949,7 +5949,7 @@ var init_google_analysis = __esm({
|
|
|
5949
5949
|
SECTIONS = [
|
|
5950
5950
|
{
|
|
5951
5951
|
name: "overview",
|
|
5952
|
-
description: "\u8D26\u6237\u603B\u89C8 OverviewSectionData",
|
|
5952
|
+
description: "\u8D26\u6237\u603B\u89C8 OverviewSectionData\uFF08\u5B9E\u65F6\uFF0C\u53EF\u67E5\u5F53\u5929\uFF09",
|
|
5953
5953
|
dateMode: "range",
|
|
5954
5954
|
path: (id) => `/reporting/media-account/${id}/OverviewSectionData`
|
|
5955
5955
|
},
|
|
@@ -6075,7 +6075,7 @@ var init_google_analysis = __esm({
|
|
|
6075
6075
|
},
|
|
6076
6076
|
{
|
|
6077
6077
|
name: "campaign-types",
|
|
6078
|
-
description: "\u5E7F\u544A\u7CFB\u5217\u7C7B\u578B\u6C47\u603B campaigns/types-summary",
|
|
6078
|
+
description: "\u5E7F\u544A\u7CFB\u5217\u7C7B\u578B\u6C47\u603B campaigns/types-summary\uFF08\u5B9E\u65F6\uFF0C\u53EF\u67E5\u5F53\u5929\uFF09",
|
|
6079
6079
|
dateMode: "none",
|
|
6080
6080
|
path: (id) => `/reporting/media-account/${id}/campaigns/types-summary`
|
|
6081
6081
|
}
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -9,14 +9,12 @@ allowed-tools: Bash(siluzan-tso:*) Read Write
|
|
|
9
9
|
|
|
10
10
|
# Siluzan TSO Skill
|
|
11
11
|
|
|
12
|
-
本 Skill
|
|
12
|
+
本 Skill 只保留任务边界、文档路由与执行规则。具体业务细节、参数、模板、流程与示例均以 references 文档为准。
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
16
|
## 一键安装
|
|
17
17
|
|
|
18
|
-
如果 CLI 尚未安装,直接帮用户执行对应平台的安装脚本:
|
|
19
|
-
|
|
20
18
|
- **macOS / Linux / WSL:**
|
|
21
19
|
```bash
|
|
22
20
|
bash <(curl -fsSL https://unpkg.com/siluzan-tso-cli@latest/dist/skill/scripts/install.sh)
|
|
@@ -26,7 +24,7 @@ allowed-tools: Bash(siluzan-tso:*) Read Write
|
|
|
26
24
|
irm https://unpkg.com/siluzan-tso-cli@latest/dist/skill/scripts/install.ps1 | iex
|
|
27
25
|
```
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
Windows 注意:部分 Agent 客户端通过 PowerShell / cmd 代执行命令时存在兼容性问题。若上述命令异常失败,请先安装 [Git for Windows](https://git-scm.com/download/win),然后在 Git Bash 中执行 macOS / Linux / WSL 的 Bash 安装命令。
|
|
30
28
|
|
|
31
29
|
参照 `references/setup.md` 完成安装与配置。
|
|
32
30
|
|
|
@@ -37,21 +35,21 @@ allowed-tools: Bash(siluzan-tso:*) Read Write
|
|
|
37
35
|
| 文档 | 功能 |
|
|
38
36
|
|------|------|
|
|
39
37
|
| `references/setup.md` | 安装、登录、配置、环境切换、更新 |
|
|
40
|
-
| `references/workflows.md` |
|
|
41
|
-
| `references/tips.md` | **Agent 拉数一律 `--json-out`**(目录或 `*.json` 文件)+ 读 `cli-manifest[-<查询id>].json` / 各 `<section>[-<查询id>].json` + **`*.outline.txt`**(TS
|
|
38
|
+
| `references/workflows.md` | 多步骤业务流程、跨命令串联 |
|
|
39
|
+
| `references/tips.md` | **Agent 拉数一律 `--json-out`**(目录或 `*.json` 文件)+ 读 `cli-manifest[-<查询id>].json` / 各 `<section>[-<查询id>].json` + **`*.outline.txt`**(TS 式类型,**几百字节,描述完整字段结构**——写聚合脚本前先读它而不是 `Read` 整个 JSON,省 2~3 个数量级 context);stdout 一行摘要含 `manifestFile` / `writtenFiles` / `outlineFile` 等 |
|
|
42
40
|
| `references/accounts.md` | 账户列表、余额、消耗、开户记录、授权/解绑/分享/MCC/BC/BM/邮箱授权 |
|
|
43
41
|
| `references/open-account-by-media.md` | 各媒体开户、参数与资料要求 |
|
|
44
|
-
| `references/google-ads.md` | Google Ads
|
|
42
|
+
| `references/google-ads.md` | Google Ads 创建、修改、优化与管理;含 `ad list` 等读命令的 JSON 拒审字段(`policyApprovalStatusV2`、`approvalStatusDetails` 等) |
|
|
45
43
|
| `references/reporting.md` | Siluzan TSO 优化报告(Google/TikTok)的生成、推送与查看 |
|
|
46
44
|
| `references/account-analytics.md` | 广告平台账户分析数据拉取与分析/诊断报告模板 |
|
|
47
|
-
| `references/google-analysis-batch.md` | **多账户 × 多维度** Google 数据批处理引擎(`
|
|
45
|
+
| `references/google-analysis-batch.md` | **多账户 × 多维度** Google 数据批处理引擎(`run/resume/status`);产物目录、退出码、stdout 协议、错误分类、resume 语义 |
|
|
48
46
|
| `references/optimize.md` | AI 优化建议记录、详情与历史查询 |
|
|
49
47
|
| `references/clue.md` | TikTok / Meta 线索表单 |
|
|
50
|
-
| `references/forewarning.md` | Siluzan
|
|
51
|
-
| `references/hosted-automation-user-catalog.md` |
|
|
48
|
+
| `references/forewarning.md` | Siluzan 智能预警规则与通知服务(仅微信推送);只负责创建,后续由 Siluzan 服务完成 |
|
|
49
|
+
| `references/hosted-automation-user-catalog.md` | 更强大的智能预警:预算/ROI 自控、异常监控、自动优化、自动化风控 |
|
|
52
50
|
| `references/finance.md` | 转账、开票、发票抬头、充值网页引导 |
|
|
53
|
-
| `references/write-audit-restore.md` | 本机写审计、`--commit`、补偿写 `audit restore-plan` / `restore-apply
|
|
54
|
-
| `report-templates/report-template.html` | 默认 HTML
|
|
51
|
+
| `references/write-audit-restore.md` | 本机写审计、`--commit`、补偿写 `audit restore-plan` / `restore-apply` |
|
|
52
|
+
| `report-templates/report-template.html` | 默认 HTML 报告样式参考 |
|
|
55
53
|
|
|
56
54
|
---
|
|
57
55
|
|
|
@@ -63,40 +61,22 @@ allowed-tools: Bash(siluzan-tso:*) Read Write
|
|
|
63
61
|
|
|
64
62
|
| 由 **本 Skill + CLI** 保证 | 由 **宿主客户端 / 外部调度** 负责 |
|
|
65
63
|
|---------------------------|-----------------------------------|
|
|
66
|
-
| 单次/按需调用下,命令能拉取验证所需的 **结构化字段**(**Agent:`--json-out <目录>`**
|
|
67
|
-
| 写操作命令语义清晰,文档给出
|
|
68
|
-
| 金额与 ID 口径与文档一致(`*Display`、`entityId` vs `mediaCustomerId`
|
|
64
|
+
| 单次/按需调用下,命令能拉取验证所需的 **结构化字段**(**Agent:`--json-out <目录>`** 落盘后读文件) | **何时**跑一轮检查(cron、事件、对话触发) |
|
|
65
|
+
| 写操作命令语义清晰,文档给出 **写后如何用读命令复核** | **IF 条件**(多指标 AND/OR、滑动时间窗等)的计算与决策 |
|
|
66
|
+
| 金额与 ID 口径与文档一致(`*Display`、`entityId` vs `mediaCustomerId` 等) | 命中后的 **触达**(钉钉/飞书/Slack 等)与内部 **P1/工单** 流程 |
|
|
69
67
|
| `references/google-ads.md` 等与命令、字段含义对齐 | 多账户、多系列的 **批处理循环**、限速、失败重试策略 |
|
|
70
68
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
具体检查项↔命令见 `references/hosted-automation-self-control.md`;异常监控 JSON 键名见 `references/hosted-automation-monitoring-json.md`;自动优化见 `references/hosted-automation-optimize-index.md`;总览见 `references/workflows.md`。
|
|
69
|
+
具体检查项见 `references/hosted-automation-self-control.md`、异常监控 JSON 键名见 `references/hosted-automation-monitoring-json.md`、自动优化见 `references/hosted-automation-optimize-index.md`、总览见 `references/workflows.md`。
|
|
74
70
|
|
|
75
71
|
---
|
|
76
72
|
|
|
77
73
|
## Skill 使用方式
|
|
78
74
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
- **禁止**用 `Read` 扫 JSON 后在对话里手填数或粘贴整份交付稿;**禁止**在报告脚本中以字面量写死应从 JSON 得到的业务数据。
|
|
83
|
-
- **(不推荐)Siluzan 平台异步生成**:调用接口后返回报告链接,你无法用它做数据分析。详见 `references/reporting.md`。
|
|
84
|
-
|
|
85
|
-
**写报告前必读**:`stats` / `balance` / `list-accounts` 里的账户 `status` 只表示**广告账户**是否可用,**不能**当作**广告系列**是否启用;系列状态须用 `ad campaigns`。详见 `references/account-analytics.md`「账户状态 ≠ 广告系列状态」。
|
|
86
|
-
|
|
87
|
-
### 广告账户相关
|
|
88
|
-
|
|
89
|
-
- 开户:`references/open-account-by-media.md`
|
|
90
|
-
- 账户管理:`references/accounts.md`
|
|
91
|
-
- 账户分析:`references/account-analytics.md`
|
|
92
|
-
- Google 广告管理:`references/google-ads.md`
|
|
93
|
-
|
|
94
|
-
### 仅调用接口、最终交付不需要你输出的功能
|
|
75
|
+
- **报告生成(推荐)**:`google-analysis … --json-out <目录>`(通过 `--sections` 选取维度),**须编写并执行代码**(Node/Python)从目录读取 JSON 完成计算再写出最终文件。详见 `references/account-analytics.md`。**禁止**用 `Read` 扫 JSON 后在对话里手填数,**禁止**在报告脚本中以字面量写死应从 JSON 得到的业务数据。
|
|
76
|
+
- **广告账户**:开户→`references/open-account-by-media.md`;管理→`references/accounts.md`;分析→`references/account-analytics.md`;Google 广告→`references/google-ads.md`
|
|
77
|
+
- **仅调用接口、无需你输出**:优化记录(`references/optimize.md`)、线索表单(`references/clue.md`)、预警(`references/forewarning.md`)、财务(`references/finance.md`)
|
|
95
78
|
|
|
96
|
-
|
|
97
|
-
- 线索表单:`references/clue.md`
|
|
98
|
-
- 预警(`references/forewarning.md`):仅微信推送;若宿主已有通知能力,可不依赖此功能。
|
|
99
|
-
- 财务:`references/finance.md`
|
|
79
|
+
**写报告前必读**:`stats` / `balance` / `list-accounts` 里的 `status` 只表示**广告账户**是否可用,**不能**当作**广告系列**是否启用;系列状态须用 `ad campaigns`。
|
|
100
80
|
|
|
101
81
|
---
|
|
102
82
|
|
|
@@ -104,35 +84,33 @@ allowed-tools: Bash(siluzan-tso:*) Read Write
|
|
|
104
84
|
|
|
105
85
|
### 执行流程
|
|
106
86
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
5. **完成**:确认所有步骤已执行完毕,结合 CLI 与 references 对用户下一步操作进行预测
|
|
87
|
+
**计划 → 确认 → 执行 → 验证 → 推测下一步**:
|
|
88
|
+
1. 读对应 references → 用 `-h` 确认命令 → 向用户输出操作计划
|
|
89
|
+
2. 涉及写入/修改/删除的操作必须与用户确认
|
|
90
|
+
3. 按计划执行,说明每步意图
|
|
91
|
+
4. 用成对的读命令复核写入结果;异步任务每 5s 轮询直到完成
|
|
92
|
+
5. 确认所有步骤已执行完毕,对用户下一步操作进行预测
|
|
114
93
|
|
|
115
94
|
### 硬规范
|
|
116
95
|
|
|
117
|
-
- **账户状态 ≠ 广告系列状态**:`stats`/`balance`/`list-accounts` 的 `status`
|
|
118
|
-
-
|
|
119
|
-
-
|
|
120
|
-
-
|
|
96
|
+
- **账户状态 ≠ 广告系列状态**:`stats`/`balance`/`list-accounts` 的 `status` 只表示账户是否可用,系列状态**必须**来自 `ad campaigns`。
|
|
97
|
+
- **数据时效性(实时 vs 每日同步)**:涉及「今天/当天/今日消耗」「实时消耗排行」前,**必须**先看 `references/account-analytics.md` 顶部「数据时效性」表选对接口(`accountsoverview` 系列接口同步昨天数据,不能查今天)。
|
|
98
|
+
- **不确定时读文档**:先读对应 references 或用 `-h` 查看帮助,不要猜参数。
|
|
99
|
+
- **先查账户再操作**:`list-accounts -m [mediaType] -k [mediaCustomerId]`。
|
|
100
|
+
- **使用 `--json-out` 处理数据**:处理顺序:先读 `outlineFile`(schema 描述,扩展名 **`.outline.txt`** 不是 `.json`,**禁止 `require()`**,用 `fs.readFileSync(outlineFile,'utf8')` 取最后一行 TS 式类型字面量即可了解全部字段路径)→ 再让脚本读 `writtenFiles[0]`(真实数据 JSON)做聚合。**outline 通常几百字节、JSON 常见几 MB,先读 outline 能节省 2~3 个数量级的上下文**——尤其多账户多维度场景,直接 `Read` 全量 JSON 几次就把对话窗口塞满了。**禁止**把 outline 当数据、跳过 outline 猜字段、把 outline 内容贴给用户当结论。
|
|
121
101
|
- **CLI 输出忠实**:数值与 ID 须与本次落盘 JSON 或表格 stdout 一致,不编造示例 ID。`data` 为空时只说明「当前返回无记录」并附原始 JSON 路径。
|
|
122
102
|
- **不猜测账户 ID**:`entityId` ≠ `mediaCustomerId`,两者均来自 `list-accounts`。
|
|
123
103
|
- **媒体类型区分大小写**:`Google`、`TikTok`、`MetaAd`、`BingV2`、`Kwai`。
|
|
124
|
-
-
|
|
125
|
-
- **写操作后确认**:完成写/修改/编辑/更新后确认数据正确。
|
|
126
|
-
- **主动更新**:详见 `references/setup.md`。
|
|
127
|
-
- **破坏性操作必须确认**:账户解绑/关闭/取消分享、BC/MCC 解绑、删除预警/报告/广告/关键词、发票申请、广告发布等操作前,必须明确告知并获得确认。
|
|
104
|
+
- **破坏性操作必须确认**:账户解绑/关闭/取消分享、BC/MCC 解绑、删除预警/报告/广告/关键词、发票申请、广告发布等。
|
|
128
105
|
- **Google 广告结构性改动**:须遵守 `references/google-ads.md` 开篇流程——先读规则、列计划与文档清单,用户确认后才执行写命令。
|
|
129
106
|
- **Google 开户(CLI 指引)**:`open-account google-wizard` 仅适用真实 TTY;Agent/自动化环境一律用非交互 `open-account google ...`,审核进度用 `account-history`。
|
|
107
|
+
- **主动更新**:详见 `references/setup.md`。
|
|
130
108
|
|
|
131
109
|
### 时间范围强制反问
|
|
132
110
|
|
|
133
|
-
涉及"投放数据 / 消耗 / 报告 / 周报 / 月报 / 优化建议"的任务,用户未给明确起止日期时**必须反问**(示例:A) 最近完整自然周 B) 本月 1 号到昨天 C) 自定义 YYYY-MM-DD
|
|
111
|
+
涉及"投放数据 / 消耗 / 报告 / 周报 / 月报 / 优化建议"的任务,用户未给明确起止日期时**必须反问**(示例:A) 最近完整自然周 B) 本月 1 号到昨天 C) 自定义 YYYY-MM-DD)。给出范围后,报告首行标注 `统计区间:YYYY-MM-DD ~ YYYY-MM-DD(货币:XXX)`。
|
|
134
112
|
|
|
135
|
-
|
|
113
|
+
**例外**(不反问):
|
|
136
114
|
- `list-accounts` 全量:用 `--json-out`,注意翻页
|
|
137
115
|
- 「昨天」单日 stats:默认 `Asia/Shanghai` 日历日;先 `list-accounts` 再 `stats`
|
|
138
116
|
- 仅持有 `entityId`:先 `list-accounts` 解析出 `mediaCustomerId`,禁止把 `entityId` 传给 `stats -a` / `balance -a`
|
|
@@ -140,103 +118,88 @@ allowed-tools: Bash(siluzan-tso:*) Read Write
|
|
|
140
118
|
|
|
141
119
|
**默认值白名单**(仅用户明确授权"你决定"时使用):
|
|
142
120
|
|
|
143
|
-
| 场景
|
|
144
|
-
|
|
145
|
-
| 日常投放巡检 / 余额扫描 | `now - 7d` ~ `now - 1d
|
|
146
|
-
| 周报
|
|
147
|
-
| 月报
|
|
148
|
-
| Google 关键词/系列分析
|
|
149
|
-
| MetaAd 账户分析
|
|
150
|
-
|
|
151
|
-
### 金额与货币单位
|
|
121
|
+
| 场景 | 默认窗口 |
|
|
122
|
+
|------|---------|
|
|
123
|
+
| 日常投放巡检 / 余额扫描 | `now - 7d` ~ `now - 1d` |
|
|
124
|
+
| 周报 | 上一个完整自然周(周一 ~ 周日) |
|
|
125
|
+
| 月报 | 上一个完整自然月(1 号 ~ 月末) |
|
|
126
|
+
| Google 关键词/系列分析 | `now - 30d` ~ `now - 1d` |
|
|
127
|
+
| MetaAd 账户分析 | 不得默认,必须问 |
|
|
152
128
|
|
|
153
|
-
|
|
154
|
-
- 报告/表格金额保留 2 位小数,写明货币代码(例如 `¥50.00 CNY`)。
|
|
129
|
+
### 金额与品牌名
|
|
155
130
|
|
|
156
|
-
|
|
131
|
+
- **永远使用 `*Display` 字段或表格展示值**做用户可见金额。报告/表格金额保留 2 位小数,写明货币代码(例如 `¥50.00 CNY`)。
|
|
132
|
+
- **品牌名**必须来自(按优先级):(1) 用户明确提供 (2) `list-accounts` 返回的 `mag.advertiserName` (3) 用户提供的网址→域名占位并标注 `[待确认品牌名]`。**严禁**把英文域名自行翻译为虚构中文品牌。
|
|
157
133
|
|
|
158
|
-
|
|
134
|
+
### 批量任务硬约束
|
|
159
135
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
|
163
|
-
|
|
|
164
|
-
|
|
|
165
|
-
|
|
|
166
|
-
| **多账户 × 多维度 Google 数据**(系列 / 地区 / 关键词等同时拉) | 2~10 账户:`google-analysis -a id1,id2,...`(自动转发到 batch 引擎);≥10 账户或需 resume / deadline:`google-analysis-batch run [-a id1,id2 \| --min-spend 1] --json-out <dir> --start --end --sections ...` | 外层 for-loop `google-analysis -a <单 id>` |
|
|
167
|
-
| 多系列诊断 | `ad campaigns --json-out <dir>` + node 读文件过滤 | 逐系列 `ad campaign-get` |
|
|
168
|
-
|
|
169
|
-
若无批量命令(如 117 个 Bing 账户剩余天数计算):先 `list-accounts --json-out <dir>` 一次性拿全量 → `node -e` 本地计算 → 只对命中账户做后续操作。
|
|
136
|
+
| 任务 | 推荐命令 | 禁止做法 |
|
|
137
|
+
|------|---------|---------|
|
|
138
|
+
| 多账户余额 / 预算不足预警 | `balance-scan -m <媒体> --threshold-days 7` | 逐账户循环 `balance --accounts ...` |
|
|
139
|
+
| 多账户投放画像 | `accounts-digest -m <媒体> [-a id1,id2] --start --end --json-out <dir>` | 逐账户 `stats` |
|
|
140
|
+
| 多账户 × 多维度 Google 数据 | **全量账号**:`google-analysis-batch run`(省略 `-a`)**2~10 子集**:`google-analysis -a id1,id2,...`(自动转发 batch);**≥10 子集或需 resume**:`google-analysis-batch run -a id1,id2,...` | 外层 for-loop;先跑 `list-accounts -m Google` 再把 ID 拼进 `-a` |
|
|
141
|
+
| 多系列诊断 | `ad campaigns --json-out <dir>` + node 读文件过滤 | 逐系列 `ad campaign-get` |
|
|
170
142
|
|
|
171
143
|
**`google-analysis-batch` 使用纪律**(详见 `references/google-analysis-batch.md`):
|
|
144
|
+
1. **拉全量 Google 数据时省略 `-a`**:CLI 内部自动拉清单,**禁止**先跑 `list-accounts -m Google` 再把 ID 拼进 `-a`。
|
|
145
|
+
2. 中断后**必须**用 `resume --run-id <id>` 续跑,**禁止**重新 `run`。
|
|
146
|
+
3. stdout 始终是单行 JSON(`kind=siluzan-tso-batch-summary`);进度读 `progress.json`、轨迹读 `state/tasks.jsonl`。
|
|
147
|
+
4. 退出码:`0` 全成功 / `2` 部分成功 / `3` 全失败或 Token 失效 / `4` 用法错误。
|
|
148
|
+
5. 401 响应 → 整批终止 + `tokenInvalidated:true`,提示用户 `siluzan-tso login` 后再 resume。
|
|
172
149
|
|
|
173
|
-
|
|
174
|
-
2. stdout 始终是单行 JSON(`kind=siluzan-tso-batch-summary`);进度详情读 `progress.json`、轨迹读 `state/tasks.jsonl`。
|
|
175
|
-
3. 退出码:`0` 全成功 / `2` 部分成功或 paused / `3` 全失败或 Token 失效 / `4` 用法错误。
|
|
176
|
-
4. 401 响应一旦出现,runner 会立刻终止整批并返回 `tokenInvalidated:true`,应提示用户 `siluzan-tso login` 后再 resume。
|
|
150
|
+
若无批量命令(如 117 个 Bing 账户剩余天数计算):先 `list-accounts --json-out <dir>` 一次性拿全量 → `node -e` 本地计算 → 只对命中账户做后续操作。
|
|
177
151
|
|
|
178
152
|
### 运行时长与进度
|
|
179
153
|
|
|
180
|
-
预估超 2
|
|
181
|
-
|
|
182
|
-
**长任务被中断后**:使用对应命令的 resume 入口续跑(如 `google-analysis-batch resume --run-id <id>`),**禁止**直接重跑 `run`;重跑会从零开始重复请求已完成的 task,浪费配额且可能再次触发限流。
|
|
154
|
+
预估超 2 分钟的任务先告知预计耗时;超 5 分钟未完成时主动检查并告知用户。长任务中断后用对应 resume 入口续跑,**禁止**直接重跑 `run`。
|
|
183
155
|
|
|
184
156
|
---
|
|
185
157
|
|
|
186
158
|
## Playbook:高频任务标准动作
|
|
187
159
|
|
|
188
|
-
|
|
160
|
+
### P1 · 单账户投放画像
|
|
189
161
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
1. **反问时间范围**(用户已授权默认时用白名单并写明区间)。
|
|
162
|
+
1. **反问时间范围**(已授权默认时用白名单并写明区间)。
|
|
193
163
|
2. `list-accounts -m Google -k <mediaCustomerId> --json-out ./snap-p1`
|
|
194
164
|
3. `stats -m Google -a <mediaCustomerId> --start <S> --end <D> --json-out ./snap-p1`
|
|
195
|
-
4. `ad campaigns -a <mediaCustomerId> --start <S> --end <D> --json-out ./snap-p1
|
|
165
|
+
4. `ad campaigns -a <mediaCustomerId> --start <S> --end <D> --json-out ./snap-p1`
|
|
196
166
|
5. 用 `report-templates/google-account-diagnosis-report.md` 模板输出,首行标注统计区间和货币。
|
|
197
|
-
6. 用户要求「先拉 JSON 再文字总结」时:指向具体 JSON 文件路径,再写总结。
|
|
198
167
|
|
|
199
|
-
### P2 · 多账户余额扫描
|
|
168
|
+
### P2 · 多账户余额扫描
|
|
200
169
|
|
|
201
|
-
|
|
170
|
+
**一条命令**:
|
|
202
171
|
```bash
|
|
203
172
|
siluzan-tso balance-scan -m BingV2 --threshold-days 7 --json-out ./snap-p2
|
|
204
173
|
# 可选:--min-balance 100 筛绝对余额;--target-days 60 算建议充值额
|
|
205
174
|
```
|
|
206
175
|
按 `remainingDays` 升序输出;消耗过低的僵尸账户不纳入预警。
|
|
207
176
|
|
|
208
|
-
### P3 ·
|
|
177
|
+
### P3 · 多账户投放画像汇总
|
|
209
178
|
|
|
210
|
-
**首选**:
|
|
211
179
|
```bash
|
|
212
180
|
siluzan-tso accounts-digest -m Google -a id1,id2,... --start <S> --end <D> --json-out ./snap-p3
|
|
213
181
|
```
|
|
214
182
|
1. 反问时间范围后再执行。
|
|
215
183
|
2. 基于落盘 `data.items` 与 `meta.totals` 生成报告,**不要**再逐账户 `stats`。
|
|
216
|
-
3. 表格须覆盖用户请求的**每一个** ID;某 ID
|
|
184
|
+
3. 表格须覆盖用户请求的**每一个** ID;某 ID 未出现时仍占一行标注「未返回」。
|
|
217
185
|
4. 跨币种账户按 `currencyCode` 分表或分币种小计。
|
|
218
186
|
|
|
219
|
-
### P4 · Google
|
|
187
|
+
### P4 · Google 账户周期报告
|
|
220
188
|
|
|
221
189
|
1. 确认时间范围;区间 > 3 个月时分段(季度/月)。
|
|
222
|
-
2. 按 P1
|
|
223
|
-
3.
|
|
224
|
-
4. 报告须含:账户概览、投放趋势、Top 关键词/系列/地区分布/优化建议;不得编造未拉取到的指标。
|
|
225
|
-
5. 品牌名遵守品牌名来源硬约束;系列启停只引用系列级状态字段。
|
|
226
|
-
|
|
227
|
-
### P5 · 多账户多维度报告("X 个 Google 账户的系列/地理/关键词数据")
|
|
190
|
+
2. 按 P1 步骤拿数据,用 `report-templates/google-period-report.md` 模板输出,首行标注统计区间和货币。
|
|
191
|
+
3. 报告须含:账户概览、投放趋势、Top 关键词/系列/地区分布、优化建议。
|
|
228
192
|
|
|
229
|
-
|
|
193
|
+
### P5 · 多账户多维度报告
|
|
230
194
|
|
|
231
|
-
|
|
195
|
+
> 适用:账户数 ≥ 2 且需拉取 ≥ 2 个 google-analysis 维度。**禁止**外层 for-loop。
|
|
232
196
|
|
|
233
|
-
|
|
234
|
-
- **≥ 10 账户 / 需要 resume / 需要 deadline / 全账户扫描**:用 `google-analysis-batch run`
|
|
197
|
+
**入口选择**:全量→省略 `-a`;2~10 子集→`google-analysis -a id1,id2,...`(自动转发 batch);≥10 子集/需 resume→`google-analysis-batch run -a id1,id2,...`
|
|
235
198
|
|
|
236
|
-
1. **反问时间范围 +
|
|
237
|
-
2.
|
|
199
|
+
1. **反问时间范围 + 维度**(默认 `campaigns,geographic,keywords`,可按需追加)。
|
|
200
|
+
2. **执行**:
|
|
238
201
|
```bash
|
|
239
|
-
#
|
|
202
|
+
# 全量账号(推荐):省略 -a,CLI 自动拉清单
|
|
240
203
|
siluzan-tso google-analysis-batch run \
|
|
241
204
|
--start <S> --end <D> \
|
|
242
205
|
--sections campaigns,geographic,keywords \
|
|
@@ -244,68 +207,53 @@ siluzan-tso accounts-digest -m Google -a id1,id2,... --start <S> --end <D> --jso
|
|
|
244
207
|
--min-spend 1 --keyword-limit 1000 \
|
|
245
208
|
--json-out ./snap-p5
|
|
246
209
|
|
|
247
|
-
#
|
|
210
|
+
# 仅当用户明确给出 ID 子集时才传 -a
|
|
248
211
|
siluzan-tso google-analysis-batch run \
|
|
249
212
|
-a id1,id2,id3,id4 \
|
|
250
213
|
--start <S> --end <D> \
|
|
251
214
|
--sections campaigns,geographic,keywords \
|
|
252
215
|
--json-out ./snap-p5
|
|
253
216
|
```
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
```
|
|
260
|
-
4. **只读查询**当前进度(不发起 HTTP):
|
|
261
|
-
```bash
|
|
262
|
-
siluzan-tso google-analysis-batch status --json-out ./snap-p5 --run-id <runId>
|
|
263
|
-
```
|
|
264
|
-
5. **产物消费**:每个账户的产物在 `<json-out>/<runId>/results/<accountId>/<section>-<accountId>.json`,配套 `manifest-<accountId>.json` 与 `*.outline.txt`。先读 outline 再写脚本聚合,与单账户 `google-analysis` 完全同口径。
|
|
265
|
-
6. 退出码:`0` 全成功 / `2` 部分成功或 paused / `3` 全失败或 Token 失效 / `4` 用法错误;Agent 据此决定是否继续后续步骤或提示用户 `siluzan-tso login`。
|
|
266
|
-
7. 详细产物结构、错误分类、stdout 协议见 `references/google-analysis-batch.md`。
|
|
217
|
+
3. **中断后只能 resume**:`siluzan-tso google-analysis-batch resume --json-out ./snap-p5 --run-id <runId>`
|
|
218
|
+
4. **只读进度**:`siluzan-tso google-analysis-batch status --json-out ./snap-p5 --run-id <runId>`
|
|
219
|
+
5. **产物消费**:每个账户产物在 `<json-out>/<runId>/results/<accountId>/<section>-<accountId>.json`,配套 `<section>-<accountId>.outline.txt` 与 `manifest-<accountId>.json`。
|
|
220
|
+
- **强制顺序**:先 `fs.readFileSync(outlineFile,'utf8')` 读 outline 的最后一行(TS 式类型,几百字节)→ 再写聚合脚本 → 由脚本 `require()` 真实 JSON 做计算。**禁止**直接 `Read` JSON 看结构——批跑常见 `keywords-*.json` 数 MB × N 账户,几次 `Read` 就把对话窗口塞满。
|
|
221
|
+
- 注意 outline 是 **`.outline.txt`** 不是 `.outline.json`,**禁止 `require()`**;其第 1 行注释明确写了 `// schema-only, NOT the data.`,**禁止**把它当业务数据贴给用户。
|
|
267
222
|
|
|
268
223
|
---
|
|
269
224
|
|
|
270
225
|
## Tips
|
|
271
226
|
|
|
272
|
-
### 账户 ID
|
|
227
|
+
### 账户 ID 示例(通过位数判断类型,不确定再用 `list-accounts -m [mediatype] -k [id]`)
|
|
273
228
|
|
|
274
|
-
|
|
275
|
-
- Google: `454xxx5137` 或 `270-xxx-0720`(使用时去掉 `-` → `270xxx0720`)
|
|
229
|
+
- Google: `454xxx5137` 或 `270-xxx-0720`(去掉 `-`)
|
|
276
230
|
- Tiktok: `70083497xxx59820033`
|
|
277
231
|
- Meta(Facebook): `1716030xxx734076`, `6843984xxx14909`, `479423xxx752348`
|
|
278
232
|
- Bing: `138xxx763`, `1882xxx80`
|
|
279
233
|
- Yandex: `porg-uthxxxrk`
|
|
280
234
|
- Kwai: `act_1716030xxx734076`
|
|
281
235
|
|
|
282
|
-
### 报告模板外部资源
|
|
283
|
-
|
|
284
|
-
以 HTML 为交付物时,`report-templates/*.html` 可能引用外部 CDN(Tailwind CSS、Font Awesome、ECharts、Google Fonts)。离线环境需将资源下载到本地后修改模板引用路径。
|
|
285
|
-
|
|
286
236
|
### 常见 HTTP 状态码
|
|
287
237
|
|
|
288
238
|
- **400**:参数错误,查看对应 reference 或用 `-h` 了解命令用法
|
|
289
|
-
- **401**:平台方返回则需用户重新授权;我方返回则让用户执行 `siluzan-tso login
|
|
239
|
+
- **401**:平台方返回则需用户重新授权;我方返回则让用户执行 `siluzan-tso login`
|
|
290
240
|
- **500**:服务可能正在部署/升级,建议提交给 Siluzan 相关人员
|
|
291
241
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
## 风险预警、预算&ROI 控制、异常监控、自动优化、自动化风控
|
|
242
|
+
### 报告模板外部资源
|
|
295
243
|
|
|
296
|
-
|
|
244
|
+
以 HTML 为交付物时,`report-templates/*.html` 可能引用外部 CDN。离线环境需将资源下载到本地后修改模板引用路径。
|
|
297
245
|
|
|
298
|
-
|
|
246
|
+
---
|
|
299
247
|
|
|
300
|
-
|
|
248
|
+
## 风险预警与自动化
|
|
301
249
|
|
|
302
|
-
|
|
250
|
+
详情见 `references/hosted-automation-user-catalog.md`。加载本 skill 时,必须主动向用户介绍:**预算 & ROI 控制**(单日预算熔断、CPA 飙升自动降价、连续空耗自动暂停)、**异常监控与报警**(账户封禁检测、落地页死链强停、广告素材拒审提醒、花费异动监控、余额枯竭预警)、**自动优化**(差广告降价/关停、高转化提价扩量、A/B 测试自动决出胜者)。
|
|
303
251
|
|
|
304
252
|
---
|
|
305
253
|
|
|
306
254
|
## 消息平台语法规范
|
|
307
255
|
|
|
308
|
-
|
|
256
|
+
需 webhook 等方式发送消息时,先阅读对应平台文档获取语法规范:
|
|
309
257
|
- 企业微信:https://developer.work.weixin.qq.com/document/path/99110
|
|
310
258
|
- 飞书:https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot
|
|
311
259
|
- 其他平台默认使用 markdown 输出
|
package/dist/skill/_meta.json
CHANGED
|
@@ -4,12 +4,35 @@
|
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
+
## 数据时效性(实时 vs 每日同步)—— 选命令前必读
|
|
8
|
+
|
|
9
|
+
涉及"今天/当天/今日消耗""实时消耗排行"等问题时,**必须**先按此表确认接口口径,否则今天消耗会被误判为 0。
|
|
10
|
+
|
|
11
|
+
| 命令 / 接口 | 时效性 | 能否查"今天" | 典型用途 |
|
|
12
|
+
|---|---|---|---|
|
|
13
|
+
| `google-analysis --sections overview`(Google 网关 `OverviewSectionData`) | **实时** | ✅ 可查当天 | 当天/今日消耗、当天高消耗账号排行 |
|
|
14
|
+
| `google-analysis --sections campaign-types`(`types-summary`) | **实时** | ✅ 可查当天 | 当天系列类型分布 |
|
|
15
|
+
| `google-analysis` 其他维度(`campaigns` / `keywords` / `devices` / ...) | 实时(受 Google Ads API 同步延迟影响) | 可查当天,但当天可能尚未结算 | 周期分析、报告 |
|
|
16
|
+
| `stats`、`balance-scan` 的近 7 日消耗、`accounts-digest`、`list-accounts` 合并消耗(TSO `accountsoverview`) | **每日同步昨天** | ❌ 查今天会全为 0 | 历史回溯、巡检、余额续航估算(口径为"截至昨天") |
|
|
17
|
+
| `balance`(`GetMediaAccountInfo`) | 实时 | — | 仅当前余额,不反映消耗 |
|
|
18
|
+
|
|
19
|
+
**选用规则**:
|
|
20
|
+
|
|
21
|
+
- 「今天/当天/今日消耗」「实时消耗排行」 → 用 `google-analysis(-batch) --sections overview`,`--start` / `--end` 都设为今天
|
|
22
|
+
- 「最近 N 天消耗 / 周报 / 月报 / 余额续航」 → `stats` / `balance-scan` / `accounts-digest`,默认窗口截至昨天即可
|
|
23
|
+
- **禁止**用 `accountsoverview` 系列接口(`stats` / `balance-scan` / `accounts-digest` / `list-accounts` 合并消耗)判断当天消耗
|
|
24
|
+
- **禁止**给当天高消耗场景加 `--min-spend`:该预筛选同样来自 `accountsoverview`,会把今天有消耗的账号当成 0 给筛掉
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
7
28
|
## 默认做法(核心工作流)
|
|
8
29
|
|
|
9
30
|
1. **先确认统计区间**:用户未给明确起止日期时**必须反问**(参见 SKILL.md 时间范围强制反问)。
|
|
10
31
|
2. 确定报告维度(默认含:执行摘要、每日趋势、月度汇总、系列表现、设备分布、地域分布、关键词表现、优化建议),详见 `report-templates/README.md`。
|
|
11
32
|
3. **拉数**:使用 `google-analysis … --json-out <dir>`(Google)或对应 `report <media>-*` 命令落盘。
|
|
12
|
-
4. **编写并执行代码**从磁盘读取 `manifest-<accountId>.json` 与各 `<section>-<accountId>.json
|
|
33
|
+
4. **编写并执行代码**从磁盘读取 `manifest-<accountId>.json` 与各 `<section>-<accountId>.json` 来完成筛选、聚合、排序等计算;**禁止**用 `Read` 看 JSON 后在对话里心算或手填报告数字。
|
|
34
|
+
- **写脚本前先读 `<section>-<accountId>.outline.txt`**(与 JSON 同 stem 的纯文本,最后一行是 TS 式类型字面量)了解字段结构;它体积只有几百字节、不含数据,比直接 `Read` 整个 `*.json`(动辄几 MB / 几万行)省**两到三个数量级**的上下文。**注意是 `.outline.txt` 不是 `.outline.json`**,不要 `require()`,用 `fs.readFileSync(outlineFile,'utf8')` 读最后一行即可。
|
|
35
|
+
- 真实数据始终从 `<section>-<accountId>.json` 由脚本读,**不要**把 outline 当作业务数据贴给用户。
|
|
13
36
|
5. **由代码写出最终文件**(HTML/Excel/PDF/PPT/Markdown 等)。**禁止**在报告脚本中以源码字面量写死应从 JSON 读取的业务数据(消耗金额、系列名、日期区间等)。允许的常量仅限:快照目录路径、JSON 字段键名、版式/结构占位。
|
|
14
37
|
6. **报告首行**须标注:`统计区间:YYYY-MM-DD ~ YYYY-MM-DD(货币:XXX)`,由脚本从 JSON 拼接写入,不得手写常量冒充。
|
|
15
38
|
7. 交付后帮用户打开报告文件。
|
|
@@ -61,7 +84,7 @@
|
|
|
61
84
|
|
|
62
85
|
## Google 账户分析:`google-analysis` 命令
|
|
63
86
|
|
|
64
|
-
> **重要**:`google-analysis` 是统一入口,所有 21 个维度都通过 `--sections` 选取。关键词维度用 `--sections keywords`,**不要**用 `ad keywords`
|
|
87
|
+
> **重要**:`google-analysis` 是统一入口,所有 21 个维度都通过 `--sections` 选取。关键词维度用 `--sections keywords`,**不要**用 `ad keywords` 代替。涉及「今天/当天」消耗的口径见本文顶部「数据时效性」表。
|
|
65
88
|
|
|
66
89
|
```bash
|
|
67
90
|
# 单维度
|
|
@@ -98,7 +121,7 @@ siluzan-tso google-analysis -a <id> --exclude materials,gold-account --json-out
|
|
|
98
121
|
|
|
99
122
|
| 维度 | 说明 |
|
|
100
123
|
|------|------|
|
|
101
|
-
| `overview` |
|
|
124
|
+
| `overview` | 总览(实时,可查当天;当天高消耗账号排行首选) |
|
|
102
125
|
| `keywords` | 关键词;可选 `--limit`、`--no-order-by-cost` |
|
|
103
126
|
| `search-terms` | 搜索词 |
|
|
104
127
|
| `campaigns` | 广告系列 |
|
|
@@ -118,7 +141,7 @@ siluzan-tso google-analysis -a <id> --exclude materials,gold-account --json-out
|
|
|
118
141
|
| `ads-index` | 质量指标 |
|
|
119
142
|
| `final-urls` | 最终到达网址(不传 `--start`/`--end`) |
|
|
120
143
|
| `dimension-summary` | 账户汇总 |
|
|
121
|
-
| `campaign-types` |
|
|
144
|
+
| `campaign-types` | 系列类型(实时,可查当天;不传 `--start`/`--end`) |
|
|
122
145
|
|
|
123
146
|
### stdout 摘要
|
|
124
147
|
|
|
@@ -127,7 +127,9 @@ siluzan-tso balance -m Google -a 6326027735 --json
|
|
|
127
127
|
|
|
128
128
|
---
|
|
129
129
|
|
|
130
|
-
## stats —
|
|
130
|
+
## stats — 查询投放消耗数据(每日同步昨天数据)
|
|
131
|
+
|
|
132
|
+
> **数据时效性**:本接口口径为 `accountsoverview`,每日凌晨同步昨天数据,**不能查今天**。判断「今天/当天/今日消耗」请走 `google-analysis(-batch) --sections overview`。完整时效性表见 `references/account-analytics.md` 顶部。
|
|
131
133
|
|
|
132
134
|
```bash
|
|
133
135
|
siluzan-tso stats -m <媒体类型> [选项]
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
## invoice-info — 发票抬头管理
|
|
9
9
|
|
|
10
|
-
对应页面:`https://www.siluzan.com/v3/foreign_trade/settings/invoiceInformation`
|
|
10
|
+
对应页面:`https://www-ci.siluzan.com/v3/foreign_trade/settings/invoiceInformation`
|
|
11
11
|
|
|
12
12
|
发票抬头是开票申请时使用的公司/企业信息模板,支持三种类型:
|
|
13
13
|
|
|
@@ -133,10 +133,10 @@ siluzan-tso config show
|
|
|
133
133
|
**示例:**
|
|
134
134
|
|
|
135
135
|
```
|
|
136
|
-
- 现金充值(单笔):https://www.siluzan.com/recharge/pay
|
|
137
|
-
- 现金充值(批量):https://www.siluzan.com/recharge/pay_batch
|
|
138
|
-
- 月结充值: https://www.siluzan.com/recharge/accountBillingQuota
|
|
139
|
-
- 丝路赞钱包: https://www.siluzan.com/recharge/siluzanWallet
|
|
136
|
+
- 现金充值(单笔):https://www-ci.siluzan.com/recharge/pay
|
|
137
|
+
- 现金充值(批量):https://www-ci.siluzan.com/recharge/pay_batch
|
|
138
|
+
- 月结充值: https://www-ci.siluzan.com/recharge/accountBillingQuota
|
|
139
|
+
- 丝路赞钱包: https://www-ci.siluzan.com/recharge/siluzanWallet
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
---
|
|
@@ -1,43 +1,37 @@
|
|
|
1
1
|
# `google-analysis-batch` —— 多账户 × 多维度 Google 数据批处理引擎
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> 适用:账户数 ≥ 5 且需拉 ≥ 2 个 google-analysis 维度。**禁止**外层 for-loop 替代。中断后**必须** `resume`,不得重跑 `run`。
|
|
4
|
+
>
|
|
5
|
+
> **数据时效性**:维度的实时 / 每日同步口径见 `references/account-analytics.md` 顶部「数据时效性」表。当天高消耗排行只能用 `--sections overview`,且**禁止**加 `--min-spend`(其预筛选来自非实时 `accountsoverview`)。
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
- **单 Node 进程**完成全部 task,复用 keep-alive,不再启动子进程做账户并发
|
|
8
|
-
- **双层并发**:账户级 × 维度级(默认 4 × 6 = 24),自适应降级
|
|
9
|
-
- **断点续跑**:被中断后用 `resume --run-id` 从断点继续,已成功的 task 不重复请求
|
|
10
|
-
- **错误分类**:401 立即终止整批;4xx 永久失败;429/5xx/超时/网络错误指数退避重试
|
|
11
|
-
- **machine-first**:stdout 一行 JSON 摘要;详细进度全部落盘,Agent 通过 `status` 读取
|
|
7
|
+
单 Node 进程,复用 keep-alive,双层并发(账户级 × 维度级),断点续跑,错误自动分类重试。
|
|
12
8
|
|
|
13
9
|
---
|
|
14
10
|
|
|
15
11
|
## 子命令
|
|
16
12
|
|
|
17
|
-
| 子命令
|
|
18
|
-
|
|
19
|
-
| `run`
|
|
20
|
-
| `resume` | 续跑:仅重做 pending / failed_retryable 的 task
|
|
21
|
-
| `status` |
|
|
13
|
+
| 子命令 | 用途 |
|
|
14
|
+
|--------|------|
|
|
15
|
+
| `run` | 首次执行:自动拉账户清单 + 双层并发 + 落盘 |
|
|
16
|
+
| `resume` | 续跑:仅重做 pending / failed_retryable 的 task |
|
|
17
|
+
| `status` | 只读查询进度与失败样例(不发起 HTTP) |
|
|
22
18
|
|
|
23
19
|
---
|
|
24
20
|
|
|
25
21
|
## 命令示例
|
|
26
22
|
|
|
27
|
-
###
|
|
23
|
+
### 获取所有google账号的指定section数据(省略 `-a`,CLI 自动拉账户清单)
|
|
28
24
|
|
|
29
25
|
```bash
|
|
30
26
|
siluzan-tso google-analysis-batch run \
|
|
31
27
|
--start 2026-04-30 --end 2026-05-06 \
|
|
32
28
|
--sections campaigns,geographic,keywords \
|
|
33
|
-
--account-concurrency 4 \
|
|
34
|
-
--
|
|
35
|
-
--keyword-limit 1000 \
|
|
36
|
-
--min-spend 1 \
|
|
29
|
+
--account-concurrency 4 --section-concurrency 6 \
|
|
30
|
+
--keyword-limit 1000 --min-spend 1 \
|
|
37
31
|
--json-out ./snap-batch
|
|
38
32
|
```
|
|
39
33
|
|
|
40
|
-
###
|
|
34
|
+
### 显式指定账户(仅用户给出 ID 子集时)
|
|
41
35
|
|
|
42
36
|
```bash
|
|
43
37
|
siluzan-tso google-analysis-batch run \
|
|
@@ -47,31 +41,7 @@ siluzan-tso google-analysis-batch run \
|
|
|
47
41
|
--json-out ./snap-batch
|
|
48
42
|
```
|
|
49
43
|
|
|
50
|
-
`-a`
|
|
51
|
-
- **跳过**账户清单拉取与余额/消耗查询,直接用传入 ID 构造任务(首条 stderr 提示也会消失)
|
|
52
|
-
- **不应用** `--min-spend` 过滤(即使同时传也无效)
|
|
53
|
-
- 账户元信息(`advertiserName` / `currencyCode` / `spend`)在 `accounts.json` 中为空,因为没拉清单
|
|
54
|
-
- 等价于 `siluzan-tso google-analysis -a id1,id2,id3 --json-out <dir>`,但额外支持 `--run-id` / `--deadline` / `--max-attempts` / 自适应限流
|
|
55
|
-
|
|
56
|
-
参数说明:
|
|
57
|
-
|
|
58
|
-
| 参数 | 说明 | 默认值 |
|
|
59
|
-
| ----------------------------- | -------------------------------------------------------------------- | --------------------------------- |
|
|
60
|
-
| `--json-out <baseDir>` | 必填,产物根目录;每个 runId 一个子目录 | — |
|
|
61
|
-
| `--run-id <id>` | 自定义 runId;留空自动生成 `run-YYYYMMDD-HHmmss-<rand4>` | 自动 |
|
|
62
|
-
| `-a, --accounts <ids>` | 显式 mediaCustomerId 列表(逗号分隔);传入则跳过清单拉取与 min-spend | 不传=自动拉清单 |
|
|
63
|
-
| `--start` / `--end` | 统计区间(YYYY-MM-DD);range 类维度未传时回落到 google-analysis 默认 | 近 7 天截至昨天 |
|
|
64
|
-
| `--sections <list>` | 维度(逗号分隔),合法值见 `references/account-analytics.md` | `campaigns,geographic,keywords` |
|
|
65
|
-
| `--account-concurrency <n>` | 账户级并发,1~16 | 4 |
|
|
66
|
-
| `--section-concurrency <n>` | 单账户内维度并发,1~16 | 6 |
|
|
67
|
-
| `--keyword-limit <n>` | 透传给 keywords / search-terms 等大账户场景的条数上限 | google-analysis 默认 |
|
|
68
|
-
| `--min-spend <n>` | 区间消耗 ≤ 此值的账户跳过;0=不过滤(与 `--accounts` 同传时无效) | 0 |
|
|
69
|
-
| `--deadline <duration>` | 整任务硬截止(如 `30m` / `2h` / `90s`),到期未完成标记 paused | 不设 |
|
|
70
|
-
| `--task-timeout-ms <n>` | 单 task 硬超时毫秒 | 60000 |
|
|
71
|
-
| `--max-attempts <n>` | 可重试错误的最大尝试次数 | 3 |
|
|
72
|
-
| `--refresh-dp` | 执行前强制刷新 Datapermission(一般无需) | false |
|
|
73
|
-
| `--no-verbose-progress` | 关闭 stderr 进度条(CI 推荐) | 默认开启 |
|
|
74
|
-
| `-t, --token` | 临时覆盖 Token | 走 ~/.siluzan/config.json |
|
|
44
|
+
`-a` 给定时:跳过清单拉取与余额/消耗查询;不应用 `--min-spend`;`accounts.json` 元信息为空。**任何情况下都不要**先 `list-accounts` 再把全部 ID 拼进 `-a`。
|
|
75
45
|
|
|
76
46
|
### 中断后续跑
|
|
77
47
|
|
|
@@ -79,68 +49,83 @@ siluzan-tso google-analysis-batch run \
|
|
|
79
49
|
siluzan-tso google-analysis-batch resume --json-out ./snap-batch --run-id <runId>
|
|
80
50
|
```
|
|
81
51
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
1. 从 `state/tasks.jsonl` 重建每个 task 的"最后一次状态"
|
|
85
|
-
2. 跳过 `success` / `failed_permanent` / `skipped` 的 task
|
|
86
|
-
3. 重新派发 `pending` / `running` / `failed_retryable` 的 task(`running` 是上次进程被强杀留下的"幽灵"状态)
|
|
52
|
+
从 `state/tasks.jsonl` 重建状态,跳过 success / failed_permanent / skipped,重做 pending / running / failed_retryable。
|
|
87
53
|
|
|
88
|
-
###
|
|
54
|
+
### 只读进度
|
|
89
55
|
|
|
90
56
|
```bash
|
|
91
57
|
siluzan-tso google-analysis-batch status --json-out ./snap-batch --run-id <runId>
|
|
92
58
|
```
|
|
93
59
|
|
|
94
|
-
|
|
60
|
+
不发起 HTTP,只读 `progress.json` + `tasks.jsonl`。
|
|
95
61
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## 参数
|
|
65
|
+
|
|
66
|
+
| 参数 | 说明 | 默认值 |
|
|
67
|
+
|------|------|--------|
|
|
68
|
+
| `--json-out <dir>` | 必填,产物根目录 | — |
|
|
69
|
+
| `--run-id <id>` | 自定义 runId | 自动 `run-YYYYMMDD-HHmmss-<rand4>` |
|
|
70
|
+
| `-a, --accounts <ids>` | 显式 ID 列表;传入则跳过清单拉取与 `--min-spend` | 省略时自动拉全量 Google 账号 |
|
|
71
|
+
| `--start` / `--end` | 统计区间(YYYY-MM-DD) | 近 7 天截至昨天 |
|
|
72
|
+
| `--sections <list>` | 维度(逗号分隔),合法值见 `references/account-analytics.md` | `campaigns,geographic,keywords` |
|
|
73
|
+
| `--account-concurrency <n>` | 账户级并发(1~16) | 4 |
|
|
74
|
+
| `--section-concurrency <n>` | 单账户内维度并发(1~16) | 6 |
|
|
75
|
+
| `--keyword-limit <n>` | keywords / search-terms 条数上限 | google-analysis 默认 |
|
|
76
|
+
| `--min-spend <n>` | 区间消耗 ≤ 此值跳过(与 `-a` 同传无效) | 0 |
|
|
77
|
+
| `--deadline <dur>` | 整任务硬截止(如 `30m` / `2h`),到期标记 paused | 不设 |
|
|
78
|
+
| `--task-timeout-ms <n>` | 单 task 硬超时 | 60000 |
|
|
79
|
+
| `--max-attempts <n>` | 可重试错误最大尝试次数 | 3 |
|
|
80
|
+
| `--refresh-dp` | 执行前强制刷新 Datapermission | false |
|
|
81
|
+
| `--no-verbose-progress` | 关闭 stderr 进度条(CI 推荐) | false |
|
|
82
|
+
| `-t, --token` | 临时覆盖 Token | `~/.siluzan/config.json` |
|
|
110
83
|
|
|
111
84
|
---
|
|
112
85
|
|
|
113
|
-
##
|
|
86
|
+
## 产物目录
|
|
114
87
|
|
|
115
88
|
```
|
|
116
89
|
<json-out>/<runId>/
|
|
117
|
-
├── run-manifest.json #
|
|
118
|
-
├── progress.json # 实时进度(每 5
|
|
119
|
-
├── accounts.json #
|
|
120
|
-
├── results
|
|
121
|
-
│
|
|
122
|
-
│
|
|
123
|
-
│
|
|
124
|
-
|
|
125
|
-
│
|
|
126
|
-
│ ├── keywords-<accountId>.json
|
|
127
|
-
│ ├── keywords-<accountId>.outline.txt
|
|
128
|
-
│ └── manifest-<accountId>.json
|
|
129
|
-
├── errors/
|
|
130
|
-
│ └── <accountId>/
|
|
131
|
-
│ └── <section>.error.json # 失败 task 的详情(class/status/message/attempts)
|
|
90
|
+
├── run-manifest.json # 参数、账户总数、限流配置
|
|
91
|
+
├── progress.json # 实时进度(每 5 task 原子刷新)
|
|
92
|
+
├── accounts.json # 筛选后账户清单
|
|
93
|
+
├── results/<accountId>/
|
|
94
|
+
│ ├── <section>-<accountId>.json # 与 google-analysis 同口径
|
|
95
|
+
│ ├── <section>-<accountId>.outline.txt
|
|
96
|
+
│ └── manifest-<accountId>.json
|
|
97
|
+
├── errors/<accountId>/
|
|
98
|
+
│ └── <section>.error.json # class / status / message / attempts
|
|
132
99
|
└── state/
|
|
133
|
-
├── tasks.jsonl
|
|
134
|
-
└── tasks.lock
|
|
100
|
+
├── tasks.jsonl # 事件溯源日志
|
|
101
|
+
└── tasks.lock # 运行时锁
|
|
135
102
|
```
|
|
136
103
|
|
|
137
|
-
|
|
104
|
+
**产物消费(Agent 强制顺序)**:先读 `*.outline.txt` 了解字段类型 → 再写聚合脚本 → 由脚本读 `<section>-<accountId>.json`。与单账户 `google-analysis` 完全同口径。
|
|
105
|
+
|
|
106
|
+
**为什么先读 outline 而不是直接 `Read` JSON**:
|
|
107
|
+
|
|
108
|
+
- `*.outline.txt` 是与 `*.json` **同 stem 的纯文本**(**注意扩展名 `.txt` 不是 `.json`,不要 `require()`**),最后一行是 TS 式类型字面量(如 `{ items: { id: number; spend: number; ... }[]; meta: { ... } }`),通常几百字节。
|
|
109
|
+
- 真实 `<section>-<accountId>.json` 在批跑场景常见 `keywords-*.json` 数 MB、`campaigns-*.json` × N 账户合计几十万行,`Read` 会**几次就把对话窗口塞满**,还有截断风险。
|
|
110
|
+
- 读 outline 节省 **2~3 个数量级**的上下文 token,足够你确定字段路径再写脚本聚合。
|
|
111
|
+
|
|
112
|
+
读 outline 的最小写法(脚本里也只读最后一行):
|
|
113
|
+
|
|
114
|
+
```js
|
|
115
|
+
const fs = require('node:fs');
|
|
116
|
+
// outlineFile 来自 manifest-<accountId>.json 的 sections[].outlineFile
|
|
117
|
+
const outline = fs.readFileSync(outlineFile, 'utf8');
|
|
118
|
+
const tsType = outline.trimEnd().split('\n').filter(l => !l.startsWith('//')).pop();
|
|
119
|
+
// tsType 形如:{ items: { id: number; spend: number; ... }[]; meta: { ... } }
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**禁止**:把 outline 内容当业务数据贴给用户当结论(第 1 行注释明确写了 `// outline of \`<xxx>.json\` — schema-only, NOT the data.`)。
|
|
138
123
|
|
|
139
124
|
---
|
|
140
125
|
|
|
141
126
|
## stdout 摘要协议
|
|
142
127
|
|
|
143
|
-
`run` / `resume` / `status` 的 stdout
|
|
128
|
+
`run` / `resume` / `status` 的 stdout 始终一行 JSON(`kind=siluzan-tso-batch-summary`):
|
|
144
129
|
|
|
145
130
|
```json
|
|
146
131
|
{
|
|
@@ -153,96 +138,76 @@ siluzan-tso google-analysis-batch status --json-out ./snap-batch --run-id <runId
|
|
|
153
138
|
"tokenInvalidated": false,
|
|
154
139
|
"elapsedMs": 423000,
|
|
155
140
|
"stats": {
|
|
156
|
-
"totalTasks": 468,
|
|
157
|
-
"
|
|
158
|
-
"
|
|
159
|
-
"failedRetryable": 2,
|
|
160
|
-
"skipped": 0,
|
|
161
|
-
"throttleEvents": 1
|
|
141
|
+
"totalTasks": 468, "success": 462,
|
|
142
|
+
"failedPermanent": 4, "failedRetryable": 2,
|
|
143
|
+
"skipped": 0, "throttleEvents": 1
|
|
162
144
|
}
|
|
163
145
|
}
|
|
164
146
|
```
|
|
165
147
|
|
|
166
|
-
|
|
148
|
+
进度详情读 `progress.json` 与 `state/tasks.jsonl`,不在 stdout。
|
|
167
149
|
|
|
168
150
|
---
|
|
169
151
|
|
|
170
|
-
##
|
|
152
|
+
## 退出码
|
|
171
153
|
|
|
172
|
-
|
|
|
173
|
-
|
|
174
|
-
| `0`
|
|
175
|
-
| `2`
|
|
176
|
-
| `3`
|
|
177
|
-
| `4`
|
|
154
|
+
| 码 | 含义 | 后续动作 |
|
|
155
|
+
|----|------|---------|
|
|
156
|
+
| `0` | 全部成功,state=`succeeded` | 继续后续 |
|
|
157
|
+
| `2` | 部分成功(`partial`)或超时(`paused`) | 看 `errors/` 或消费已有产物 |
|
|
158
|
+
| `3` | 全失败 / Token 失效 / 致命错误(`failed`) | `tokenInvalidated:true` → `siluzan-tso login` |
|
|
159
|
+
| `4` | 参数错误(命令未执行) | 修正参数重试 |
|
|
178
160
|
|
|
179
161
|
---
|
|
180
162
|
|
|
181
163
|
## 错误分类与重试
|
|
182
164
|
|
|
183
|
-
| 分类
|
|
184
|
-
|
|
185
|
-
| `abort`
|
|
186
|
-
| `failed_permanent` | HTTP 400 / 403 / 404
|
|
187
|
-
| `failed_retryable` | HTTP 408 / 429 / 5xx / 超时 / 网络错误
|
|
188
|
-
| `skipped`
|
|
165
|
+
| 分类 | 触发条件 | 处理 |
|
|
166
|
+
|------|---------|------|
|
|
167
|
+
| `abort` | HTTP 401 | **立即终止整批**,`tokenInvalidated:true`,可 resume |
|
|
168
|
+
| `failed_permanent` | HTTP 400 / 403 / 404 | 不重试,记入 `errors/` |
|
|
169
|
+
| `failed_retryable` | HTTP 408 / 429 / 5xx / 超时 / 网络错误 | 指数退避 `1s × 2^attempt + jitter`(cap 30s),最多 `--max-attempts` 次 |
|
|
170
|
+
| `skipped` | `invalidOAuthToken=true` 或被 `--min-spend` 过滤 | 不发起 HTTP |
|
|
189
171
|
|
|
190
|
-
**自适应降级**:滚动 20
|
|
172
|
+
**自适应降级**:滚动 20 task 内错误率 ≥ 30% → 账户并发与维度并发同时减半;冷却 60s。`progress.throttleEvents` 记录次数。
|
|
191
173
|
|
|
192
174
|
---
|
|
193
175
|
|
|
194
176
|
## 与 google-analysis 的关系
|
|
195
177
|
|
|
196
|
-
`google-analysis`
|
|
178
|
+
`google-analysis` 会根据 `-a` 的 ID 数量自动选路,底层共享同一引擎:
|
|
197
179
|
|
|
198
|
-
|
|
|
199
|
-
|
|
200
|
-
|
|
|
201
|
-
| 调度
|
|
202
|
-
| 失败处理
|
|
203
|
-
| 中断恢复
|
|
204
|
-
| stdout
|
|
205
|
-
|
|
|
206
|
-
| Resume 能力 | — | 用 `google-analysis-batch resume --run-id <runId>` | 同左 |
|
|
180
|
+
| | `google-analysis -a <单ID>` | `google-analysis -a id1,id2,id3` | `google-analysis-batch run` |
|
|
181
|
+
|--------|------|------|------|
|
|
182
|
+
| 账户数 | 1 | 2~10 | 任意(含 0→自动拉全量) |
|
|
183
|
+
| 调度 | 单账户多维度 | 双层并发 | 双层并发 |
|
|
184
|
+
| 失败处理 | 抛错 | 自动分类 + 退避 + 401 终止 | 同左 |
|
|
185
|
+
| 中断恢复 | 不支持 | `resume` | `resume` |
|
|
186
|
+
| stdout | snapshot-batch | `siluzan-tso-batch-summary`(含 `forwardedFrom`) | `siluzan-tso-batch-summary` |
|
|
187
|
+
| 产物 | `<dir>/<section>-<id>.json` | `<dir>/<runId>/results/<accountId>/<section>-<id>.json` | 同左 |
|
|
207
188
|
|
|
208
|
-
|
|
189
|
+
单 section JSON 结构完全一致,仅目录组织不同。
|
|
209
190
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
- 1 个账户 → `google-analysis -a id`(最简,无 runId 子目录)
|
|
213
|
-
- 2~10 个账户 + 一次性出报告 → `google-analysis -a id1,id2,...`(隐式走 batch,仍是 stdout 单行 JSON)
|
|
214
|
-
- ≥ 10 个账户、需要 `--deadline` / `--max-attempts` / `--run-id` / 中途 resume → 直接用 `google-analysis-batch run`
|
|
191
|
+
**选用**:1 账户 → `google-analysis -a id`;2~10 子集 → `google-analysis -a id1,id2,...`(隐式 batch);≥10 子集/需 resume → `google-analysis-batch run -a id1,id2,...`;全量 → `google-analysis-batch run`(省略 `-a`)。
|
|
215
192
|
|
|
216
193
|
---
|
|
217
194
|
|
|
218
195
|
## 常见问题
|
|
219
196
|
|
|
220
|
-
**Q
|
|
221
|
-
A
|
|
222
|
-
|
|
223
|
-
**Q:怎么知道上次的 runId?**
|
|
224
|
-
A:上次 `run` stdout 摘要里的 `runId` 字段;或浏览 `--json-out` 目录下最新的 `run-*` 子目录名。
|
|
225
|
-
|
|
226
|
-
**Q:401 触发整批终止后,是否需要重新跑全量?**
|
|
227
|
-
A:不需要。
|
|
228
|
-
1. `siluzan-tso login` 重新登录
|
|
229
|
-
2. `siluzan-tso google-analysis-batch resume --run-id <id> --refresh-dp` 续跑剩余 task
|
|
197
|
+
**Q:拉全量是不是先 `list-accounts` 再把 ID 拼进 `-a`?**
|
|
198
|
+
A:**不要**。`run` 不传 `-a` 时内部自动拉清单+余额+消耗,先 `list-accounts` 只是重复请求。直接 `google-analysis-batch run ...` 即可。
|
|
230
199
|
|
|
231
|
-
**Q:
|
|
232
|
-
A
|
|
200
|
+
**Q:Ctrl+C 后能否重新 `run`?**
|
|
201
|
+
A:**不能**。会生成新 runId,所有 task 从零开始。只能 `resume --run-id <旧id>`。
|
|
233
202
|
|
|
234
|
-
**Q
|
|
235
|
-
A
|
|
203
|
+
**Q:怎么知道上次 runId?**
|
|
204
|
+
A:上次 stdout 摘要的 `runId` 字段,或浏览 `--json-out` 下最新 `run-*` 目录名。
|
|
236
205
|
|
|
237
|
-
**Q:
|
|
238
|
-
A
|
|
239
|
-
- `class=permanent` → 通常是账户权限或参数问题,对该账户单独排查
|
|
240
|
-
- `class=retryable` 但仍失败 → 通常是网络或服务端持续不稳定,过段时间 `resume` 即可
|
|
241
|
-
|
|
242
|
-
---
|
|
206
|
+
**Q:401 后需要重跑全量吗?**
|
|
207
|
+
A:不需要。`siluzan-tso login` 后 `resume --run-id <id> --refresh-dp` 即可。
|
|
243
208
|
|
|
244
|
-
|
|
209
|
+
**Q:accounts.json 何时快照?能否手工改账户范围再 resume?**
|
|
210
|
+
A:首次 `run` 时写入并定型。要改账户范围,新建 runId 重新 `run`。
|
|
245
211
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
- 401 后整批终止,需 `login` 后再 resume(见 SKILL.md 退出码描述)
|
|
212
|
+
**Q:errors 文件能做什么?**
|
|
213
|
+
A:`class=permanent` → 对账户单独排查权限/参数;`class=retryable` 仍失败 → 过段时间 `resume`。
|
|
@@ -214,8 +214,8 @@ siluzan-tso report list -m Google --json
|
|
|
214
214
|
|
|
215
215
|
# 第二步:查看 webUrl
|
|
216
216
|
siluzan-tso config show
|
|
217
|
-
# webUrl: https://www.siluzan.com
|
|
217
|
+
# webUrl: https://www-ci.siluzan.com
|
|
218
218
|
|
|
219
219
|
# 第三步:拼接链接(Google 日报)
|
|
220
|
-
# https://www.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
|
|
220
|
+
# https://www-ci.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
|
|
221
221
|
```
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
## 安装 CLI
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
npm install -g siluzan-tso-cli
|
|
13
|
+
npm install -g siluzan-tso-cli@beta
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
---
|
|
@@ -47,7 +47,7 @@ siluzan-tso config set --api-key <Key> # 或通过 config set 直接写入
|
|
|
47
47
|
siluzan-tso config set --token <Token> # 备用:设置 JWT Token
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
API Key 获取入口:`https://www.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
|
|
50
|
+
API Key 获取入口:`https://www-ci.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
|
|
51
51
|
|
|
52
52
|
### 通过环境变量传入凭据(CI/CD 推荐)
|
|
53
53
|
|
|
@@ -82,9 +82,9 @@ siluzan-tso config show
|
|
|
82
82
|
|
|
83
83
|
```
|
|
84
84
|
构建环境 : production
|
|
85
|
-
apiBaseUrl : https://tso-api.siluzan.com
|
|
86
|
-
googleApiUrl : https://googleapi.mysiluzan.com
|
|
87
|
-
webUrl : https://www.siluzan.com
|
|
85
|
+
apiBaseUrl : https://tso-api-ci.siluzan.com
|
|
86
|
+
googleApiUrl : https://googleapi-ci.mysiluzan.com
|
|
87
|
+
webUrl : https://www-ci.siluzan.com
|
|
88
88
|
apiKey : abcd****1234
|
|
89
89
|
```
|
|
90
90
|
|
|
@@ -10,8 +10,8 @@ $ErrorActionPreference = 'Stop'
|
|
|
10
10
|
$PKG_NAME = 'siluzan-tso-cli'
|
|
11
11
|
$CLI_BIN = 'siluzan-tso'
|
|
12
12
|
$SKILL_LABEL = 'Siluzan TSO'
|
|
13
|
-
$INSTALL_CMD = 'npm install -g siluzan-tso-cli'
|
|
14
|
-
$WEB_BASE = 'https://www.siluzan.com'
|
|
13
|
+
$INSTALL_CMD = 'npm install -g siluzan-tso-cli@beta'
|
|
14
|
+
$WEB_BASE = 'https://www-ci.siluzan.com'
|
|
15
15
|
|
|
16
16
|
# -- Constants ----------------------------------------------------------------
|
|
17
17
|
$NODE_MAJOR_MIN = 18
|
|
@@ -87,6 +87,10 @@ function Main {
|
|
|
87
87
|
Write-Host "| $SKILL_LABEL -- Install |" -ForegroundColor White
|
|
88
88
|
Write-Host '+---------------------------------------------+' -ForegroundColor White
|
|
89
89
|
Write-Host ''
|
|
90
|
+
Write-Warn 'Windows note: some agent clients may fail when running PowerShell/cmd commands.'
|
|
91
|
+
Write-Host ' If this install fails unexpectedly, install Git for Windows and rerun the Bash installer in Git Bash:' -ForegroundColor DarkGray
|
|
92
|
+
Write-Host ' https://git-scm.com/download/win' -ForegroundColor DarkGray
|
|
93
|
+
Write-Host ''
|
|
90
94
|
|
|
91
95
|
# Step 1: Environment check
|
|
92
96
|
Write-Step 'Step 1/4: Environment check'
|
|
@@ -10,8 +10,8 @@ set -euo pipefail
|
|
|
10
10
|
readonly PKG_NAME="siluzan-tso-cli"
|
|
11
11
|
readonly CLI_BIN="siluzan-tso"
|
|
12
12
|
readonly SKILL_LABEL="Siluzan TSO"
|
|
13
|
-
readonly INSTALL_CMD="npm install -g siluzan-tso-cli"
|
|
14
|
-
readonly WEB_BASE="https://www.siluzan.com"
|
|
13
|
+
readonly INSTALL_CMD="npm install -g siluzan-tso-cli@beta"
|
|
14
|
+
readonly WEB_BASE="https://www-ci.siluzan.com"
|
|
15
15
|
|
|
16
16
|
# -- Constants ----------------------------------------------------------------
|
|
17
17
|
readonly NODE_MAJOR_MIN=18
|