siluzan-tso-cli 1.1.54-beta.3 → 1.1.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/index.js +60 -6
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/accounts/accounts-list.md +1 -1
- package/dist/skill/references/accounts/accounts-permissions.md +2 -2
- package/dist/skill/references/accounts/finance.md +1 -1
- package/dist/skill/references/accounts/open-account-by-media.md +1 -1
- package/dist/skill/references/accounts/open-account-google-ui.md +1 -1
- package/dist/skill/references/analytics/rag.md +1 -1
- package/dist/skill/references/analytics/reporting.md +5 -5
- package/dist/skill/references/core/setup.md +5 -5
- package/dist/skill/references/google-ads/google-ads-write.md +1 -1
- package/dist/skill/references/misc/tso-home.md +2 -2
- package/dist/skill/scripts/install.ps1 +3 -3
- package/dist/skill/scripts/install.sh +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -43,7 +43,7 @@ HTML 报告模板外部资源:**ECharts** 统一使用 `https://staticpn.siluz
|
|
|
43
43
|
在**用户的目标项目根目录**执行(根据用户使用的助手选择 `--ai`):
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
npm install -g siluzan-tso-cli
|
|
46
|
+
npm install -g siluzan-tso-cli
|
|
47
47
|
siluzan-tso init --ai cursor # 写入 Cursor(默认)
|
|
48
48
|
siluzan-tso init --ai cursor,claude # 同时写入多个平台
|
|
49
49
|
siluzan-tso init --ai all # 写入所有支持的平台
|
|
@@ -51,7 +51,6 @@ siluzan-tso init -d /path/to/skills # 写入自定义目录
|
|
|
51
51
|
siluzan-tso init --force # 强制覆盖已存在文件
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
> **注意**:当前为测试版(1.1.54-beta.3),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
55
54
|
|
|
56
55
|
| 助手 | 建议 `--ai` |
|
|
57
56
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -2582,6 +2582,27 @@ async function parseApiResponse(status, text2, verbose) {
|
|
|
2582
2582
|
return text2;
|
|
2583
2583
|
}
|
|
2584
2584
|
}
|
|
2585
|
+
function isTransientNetworkError(err) {
|
|
2586
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
2587
|
+
const code = err?.code;
|
|
2588
|
+
if (typeof code === "string" && ["ECONNRESET", "EPIPE", "ETIMEDOUT", "ECONNABORTED"].includes(code)) {
|
|
2589
|
+
return true;
|
|
2590
|
+
}
|
|
2591
|
+
return /响应解压失败|aborted|socket hang up|ECONNRESET|unexpected end of file/i.test(msg);
|
|
2592
|
+
}
|
|
2593
|
+
async function requestWithReadRetry(url, options) {
|
|
2594
|
+
const method = (options.method ?? "GET").toUpperCase();
|
|
2595
|
+
for (let attempt = 0; ; attempt++) {
|
|
2596
|
+
try {
|
|
2597
|
+
return await rawRequest(url, options);
|
|
2598
|
+
} catch (err) {
|
|
2599
|
+
if (method !== "GET" || attempt >= GET_RETRY_DELAYS_MS.length || !isTransientNetworkError(err)) {
|
|
2600
|
+
throw err;
|
|
2601
|
+
}
|
|
2602
|
+
await new Promise((r) => setTimeout(r, GET_RETRY_DELAYS_MS[attempt]));
|
|
2603
|
+
}
|
|
2604
|
+
}
|
|
2605
|
+
}
|
|
2585
2606
|
async function apiFetch(url, config, options = {}, verbose = false) {
|
|
2586
2607
|
const method = options.method ?? "GET";
|
|
2587
2608
|
const reqHeaders = {
|
|
@@ -2595,7 +2616,7 @@ async function apiFetch(url, config, options = {}, verbose = false) {
|
|
|
2595
2616
|
...options.headers ?? {}
|
|
2596
2617
|
};
|
|
2597
2618
|
const body = typeof options.body === "string" ? options.body : void 0;
|
|
2598
|
-
const res = await
|
|
2619
|
+
const res = await requestWithReadRetry(url, {
|
|
2599
2620
|
method,
|
|
2600
2621
|
headers: reqHeaders,
|
|
2601
2622
|
body
|
|
@@ -2613,7 +2634,7 @@ async function apiFetchWithHeaders(url, config, options = {}, verbose = false) {
|
|
|
2613
2634
|
...options.headers ?? {}
|
|
2614
2635
|
};
|
|
2615
2636
|
const body = typeof options.body === "string" ? options.body : void 0;
|
|
2616
|
-
const res = await
|
|
2637
|
+
const res = await requestWithReadRetry(url, { method, headers: reqHeaders, body });
|
|
2617
2638
|
const text2 = res.text;
|
|
2618
2639
|
if (res.status < 200 || res.status >= 300) {
|
|
2619
2640
|
throw new Error(formatHttpError(res.status, text2, { verbose }));
|
|
@@ -3901,7 +3922,7 @@ async function issueApiKeyWithPhoneCode(opts) {
|
|
|
3901
3922
|
});
|
|
3902
3923
|
return apiKey;
|
|
3903
3924
|
}
|
|
3904
|
-
var import_semver, SILUZAN_DIR, CONFIG_FILE, inProcessLockChain, ALLOWED_HOSTNAME_SUFFIXES, EXACT_ID_FIELD_NAMES, SILUZAN_AGENT_COMPANY_SOURCE_TYPE, DEERFLOW_AGENT_ENV, _clientProduct, _resolveVersion, DEFAULT_TIMEOUT_MS, MAX_RESPONSE_BYTES, httpsAgent, httpAgent, PERF_PREFIX, DEFAULT_DETAIL_MAX, VERBOSE_DETAIL_MAX, TABLE_CELL_PIPE, ASCII_TABLE_CHARS, CLI_SNAPSHOT_MANIFEST_FILE, SCHEMA_VERSION, FALLBACK_FIELD_GUIDE_REFS, _cliPackage, _resolveCliVersion, _fieldGuideRefs, OUTLINE_AGENT_HINT, TS_LIKE_ARRAY_SAMPLE_MAX, MAX_INVOCATION_CHARS, currentInvocation, MAX_COMMIT_CHARS, WRITE_AUDIT_AGENT_AUTO_COMMIT, cliCommitOverride, WRITE_AUDIT_SCHEMA_VERSION, MUTATING, BEIJING_TZ, AUDIT_LOG_FILENAME_RE, DEFAULT_MAX_FILE_MB, MIN_SEGMENT_BYTES, MAX_SEGMENT_BYTES, DEFAULT_RETENTION_DAYS, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS, PRUNE_THROTTLE_MS, lastPruneAtMs, MAX_BODY_CHARS, MAX_ERROR_CHARS, DEFAULT_FIND_AUDIT_MAX_DAYS, MAX_SNAPSHOT_FILE_BYTES, API_KEY_SERVICE_VALUES;
|
|
3925
|
+
var import_semver, SILUZAN_DIR, CONFIG_FILE, inProcessLockChain, ALLOWED_HOSTNAME_SUFFIXES, EXACT_ID_FIELD_NAMES, SILUZAN_AGENT_COMPANY_SOURCE_TYPE, DEERFLOW_AGENT_ENV, _clientProduct, _resolveVersion, DEFAULT_TIMEOUT_MS, MAX_RESPONSE_BYTES, httpsAgent, httpAgent, PERF_PREFIX, DEFAULT_DETAIL_MAX, VERBOSE_DETAIL_MAX, GET_RETRY_DELAYS_MS, TABLE_CELL_PIPE, ASCII_TABLE_CHARS, CLI_SNAPSHOT_MANIFEST_FILE, SCHEMA_VERSION, FALLBACK_FIELD_GUIDE_REFS, _cliPackage, _resolveCliVersion, _fieldGuideRefs, OUTLINE_AGENT_HINT, TS_LIKE_ARRAY_SAMPLE_MAX, MAX_INVOCATION_CHARS, currentInvocation, MAX_COMMIT_CHARS, WRITE_AUDIT_AGENT_AUTO_COMMIT, cliCommitOverride, WRITE_AUDIT_SCHEMA_VERSION, MUTATING, BEIJING_TZ, AUDIT_LOG_FILENAME_RE, DEFAULT_MAX_FILE_MB, MIN_SEGMENT_BYTES, MAX_SEGMENT_BYTES, DEFAULT_RETENTION_DAYS, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS, PRUNE_THROTTLE_MS, lastPruneAtMs, MAX_BODY_CHARS, MAX_ERROR_CHARS, DEFAULT_FIND_AUDIT_MAX_DAYS, MAX_SNAPSHOT_FILE_BYTES, API_KEY_SERVICE_VALUES;
|
|
3905
3926
|
var init_dist = __esm({
|
|
3906
3927
|
"../common/dist/index.js"() {
|
|
3907
3928
|
"use strict";
|
|
@@ -3969,6 +3990,7 @@ var init_dist = __esm({
|
|
|
3969
3990
|
PERF_PREFIX = "[SILUZAN_HTTP_PERF]";
|
|
3970
3991
|
DEFAULT_DETAIL_MAX = 400;
|
|
3971
3992
|
VERBOSE_DETAIL_MAX = 800;
|
|
3993
|
+
GET_RETRY_DELAYS_MS = [1e3, 3e3];
|
|
3972
3994
|
TABLE_CELL_PIPE = "\uFF5C";
|
|
3973
3995
|
ASCII_TABLE_CHARS = {
|
|
3974
3996
|
top: "-",
|
|
@@ -4027,7 +4049,7 @@ var DEFAULT_API_BASE;
|
|
|
4027
4049
|
var init_defaults = __esm({
|
|
4028
4050
|
"src/config/defaults.ts"() {
|
|
4029
4051
|
"use strict";
|
|
4030
|
-
DEFAULT_API_BASE = "https://tso-api
|
|
4052
|
+
DEFAULT_API_BASE = "https://tso-api.siluzan.com";
|
|
4031
4053
|
}
|
|
4032
4054
|
});
|
|
4033
4055
|
|
|
@@ -113858,7 +113880,10 @@ async function runAdKeywordEdit(opts) {
|
|
|
113858
113880
|
if (opts.maxCpc !== void 0) body["maxCPC"] = toCentAmount(opts.maxCpc);
|
|
113859
113881
|
if (opts.finalUrl !== void 0) body["finalURL"] = opts.finalUrl;
|
|
113860
113882
|
if (opts.status !== void 0) body["userStatusV2"] = opts.status;
|
|
113883
|
+
const notAppliedHint = ` \u8BF7\u52FF\u6539\u7528\u300C\u5220\u9664\u540E\u91CD\u5EFA\u300D\u7ED5\u8FC7\uFF08\u4F1A\u4E22\u5931\u5173\u952E\u8BCD id \u4E0E\u5386\u53F2\u6570\u636E\uFF09\uFF0C\u8BF7\u53CD\u9988\u5E73\u53F0\u6392\u67E5\u3002
|
|
113884
|
+
`;
|
|
113861
113885
|
const url = `${googleApiUrl}/keywordmanagement/Keyword/${opts.account}/batch`;
|
|
113886
|
+
let currentId = opts.id;
|
|
113862
113887
|
try {
|
|
113863
113888
|
const raw = await apiFetch2(
|
|
113864
113889
|
url,
|
|
@@ -113869,6 +113894,7 @@ async function runAdKeywordEdit(opts) {
|
|
|
113869
113894
|
const first = Array.isArray(raw) && raw.length > 0 && raw[0] && typeof raw[0] === "object" ? raw[0] : null;
|
|
113870
113895
|
const returnedId = first && typeof first["id"] === "string" ? first["id"] : void 0;
|
|
113871
113896
|
if (returnedId && returnedId !== opts.id) {
|
|
113897
|
+
currentId = returnedId;
|
|
113872
113898
|
console.log(
|
|
113873
113899
|
`
|
|
113874
113900
|
\u2139\uFE0F \u7F51\u5173\u8FD4\u56DE\u7684\u5173\u952E\u8BCD id \u5DF2\u53D8\u66F4\u4E3A ${returnedId}\uFF08\u8BF7\u6C42\u65F6 id \u4E3A ${opts.id}\uFF09\uFF0C\u540E\u7EED\u67E5\u8BE2\u8BF7\u4F7F\u7528\u65B0 id\u3002
|
|
@@ -113881,8 +113907,7 @@ async function runAdKeywordEdit(opts) {
|
|
|
113881
113907
|
`
|
|
113882
113908
|
\u274C \u7F51\u5173\u8FD4\u56DE\u6210\u529F\uFF0C\u4F46\u4EE5\u4E0B\u5B57\u6BB5\u672A\u751F\u6548\uFF1A
|
|
113883
113909
|
${mismatches.map((m) => ` - ${m}`).join("\n")}
|
|
113884
|
-
|
|
113885
|
-
`
|
|
113910
|
+
` + notAppliedHint
|
|
113886
113911
|
);
|
|
113887
113912
|
process.exit(1);
|
|
113888
113913
|
}
|
|
@@ -113892,6 +113917,35 @@ ${mismatches.map((m) => ` - ${m}`).join("\n")}
|
|
|
113892
113917
|
`);
|
|
113893
113918
|
process.exit(1);
|
|
113894
113919
|
}
|
|
113920
|
+
if (opts.finalUrl !== void 0 || opts.maxCpc !== void 0 || opts.status !== void 0) {
|
|
113921
|
+
let fresh;
|
|
113922
|
+
try {
|
|
113923
|
+
fresh = await findItemInList(
|
|
113924
|
+
listUrl,
|
|
113925
|
+
config,
|
|
113926
|
+
currentId,
|
|
113927
|
+
opts.verbose
|
|
113928
|
+
);
|
|
113929
|
+
} catch (err) {
|
|
113930
|
+
console.error(
|
|
113931
|
+
`
|
|
113932
|
+
\u274C \u5199\u5165\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46\u56DE\u8BFB\u6821\u9A8C\u5931\u8D25\uFF1A${err instanceof Error ? err.message : String(err)}
|
|
113933
|
+
\u7A0D\u540E\u7528 ad keywords \u6838\u5BF9 id=${currentId} \u7684\u5B9E\u9645\u503C\uFF1B\u672A\u751F\u6548\u65F6\u91CD\u8DD1 keyword-edit \u5373\u53EF\uFF08\u5E42\u7B49\uFF09\u3002
|
|
113934
|
+
` + notAppliedHint
|
|
113935
|
+
);
|
|
113936
|
+
process.exit(1);
|
|
113937
|
+
}
|
|
113938
|
+
const mismatches = findKeywordEditMismatches(body, fresh, opts);
|
|
113939
|
+
if (mismatches.length > 0) {
|
|
113940
|
+
console.error(
|
|
113941
|
+
`
|
|
113942
|
+
\u274C \u7F51\u5173\u8FD4\u56DE\u6210\u529F\uFF0C\u4F46\u56DE\u8BFB\u540E\u4EE5\u4E0B\u5B57\u6BB5\u672A\u751F\u6548\uFF1A
|
|
113943
|
+
${mismatches.map((m) => ` - ${m}`).join("\n")}
|
|
113944
|
+
` + notAppliedHint
|
|
113945
|
+
);
|
|
113946
|
+
process.exit(1);
|
|
113947
|
+
}
|
|
113948
|
+
}
|
|
113895
113949
|
console.log(`
|
|
113896
113950
|
\u2705 \u5173\u952E\u8BCD\u5DF2\u66F4\u65B0
|
|
113897
113951
|
`);
|
package/dist/skill/_meta.json
CHANGED
|
@@ -168,7 +168,7 @@ siluzan-tso account-history --start 2026-03-01 --end 2026-03-31 --json-out ./sna
|
|
|
168
168
|
| 状态 | 含义 | 下一步操作 |
|
|
169
169
|
| ---------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
170
170
|
| `Pending` | 审核中 | 等待,可反复运行此命令轮询;审核周期因媒体而异 |
|
|
171
|
-
| `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `https://www
|
|
171
|
+
| `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google`;Yandex 当前没有对应充值界面) |
|
|
172
172
|
| `Rejected` | 被拒 | 查看 `--json-out` 落盘中的 `reason` 字段了解拒绝原因;修改资料后重新提交;若原因不明,引导用户联系丝路赞客服 |
|
|
173
173
|
|
|
174
174
|
---
|
|
@@ -490,7 +490,7 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
|
|
|
490
490
|
|
|
491
491
|
| 功能 | 媒体 | 网页路径 |
|
|
492
492
|
| --------------------------------------- | ------ | ------------------------------------------------- |
|
|
493
|
-
| **账户激活**(邀请他人激活 / 充值激活) | Google | `https://www
|
|
493
|
+
| **账户激活**(邀请他人激活 / 充值激活) | Google | `https://www.siluzan.com/v3/foreign_trade/tso/manageAccounts` |
|
|
494
494
|
|
|
495
495
|
**Agent 建议话术**:
|
|
496
496
|
|
|
@@ -499,5 +499,5 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
|
|
|
499
499
|
siluzan-tso config show # 查看 webUrl 字段
|
|
500
500
|
|
|
501
501
|
# 账户激活(Google)→ 引导至账户管理页
|
|
502
|
-
# https://www
|
|
502
|
+
# https://www.siluzan.com/v3/foreign_trade/tso/manageAccounts
|
|
503
503
|
```
|
|
@@ -126,7 +126,7 @@ siluzan-tso config show
|
|
|
126
126
|
|
|
127
127
|
### 充值页链接(按媒体 × 类型)
|
|
128
128
|
|
|
129
|
-
链接模式:`https://www
|
|
129
|
+
链接模式:`https://www.siluzan.com/v3/foreign_trade/tso/recharge/<page>?mediaType=<mediaType>`;丝路赞钱包:`https://www.siluzan.com/v3/foreign_trade/tso/recharge/siluzanWallet`(无媒体参数)。
|
|
130
130
|
|
|
131
131
|
| 充值类型 | `<page>` | 支持媒体(`mediaType` 参数) |
|
|
132
132
|
| ------------------------- | --------------------- | ------------------------------------------- |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 各媒体开户
|
|
2
2
|
|
|
3
|
-
> 网页链接:`https://www
|
|
3
|
+
> 网页链接:`https://www.siluzan.com/v3/foreign_trade/tso/accountOpeningHistory?tso=%2Fv3umijs%2Ftso%2FaccountOpeningHistory`
|
|
4
4
|
> 多命令串联见 `references/core/workflows.md` § 流程一。
|
|
5
5
|
|
|
6
6
|
## Contents
|
|
@@ -65,7 +65,7 @@ siluzan-tso open-account google-wizard
|
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
67
|
siluzan-tso account-history -m Google
|
|
68
|
-
# 审核通过后:config show → https://www
|
|
68
|
+
# 审核通过后:config show → https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
---
|
|
@@ -190,9 +190,9 @@ siluzan-tso report push receive-emails -m Google [--json-out ./snap]
|
|
|
190
190
|
|
|
191
191
|
| 媒体 | 报告类型 | URL 模板 |
|
|
192
192
|
| ------ | ---------------- | ----------------------------------------------------------- |
|
|
193
|
-
| Google | 日报(Daily) | `https://www
|
|
194
|
-
| Google | 小时报(Hourly) | `https://www
|
|
195
|
-
| TikTok | 日报 | `https://www
|
|
193
|
+
| Google | 日报(Daily) | `https://www.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
|
|
194
|
+
| Google | 小时报(Hourly) | `https://www.siluzan.com/media-report/hour/{entityId}?culture=zh-CN` |
|
|
195
|
+
| TikTok | 日报 | `https://www.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
|
|
196
196
|
|
|
197
197
|
`entityId` 来自 `siluzan-tso report list --json-out ./snap` 中每条记录的 `entityId` 字段。
|
|
198
198
|
|
|
@@ -205,8 +205,8 @@ siluzan-tso report list -m Google --json-out ./snap
|
|
|
205
205
|
|
|
206
206
|
# 第二步:查看 webUrl
|
|
207
207
|
siluzan-tso config show
|
|
208
|
-
# webUrl: https://www
|
|
208
|
+
# webUrl: https://www.siluzan.com
|
|
209
209
|
|
|
210
210
|
# 第三步:拼接链接(Google 日报)
|
|
211
|
-
# https://www
|
|
211
|
+
# https://www.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
|
|
212
212
|
```
|
|
@@ -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
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
---
|
|
@@ -64,7 +64,7 @@ siluzan-tso config set --api-key <Key> # 或 config 直接写入
|
|
|
64
64
|
siluzan-tso config set --token <Token> # 备用:设置 JWT Token
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
API Key 获取入口:`https://www
|
|
67
|
+
API Key 获取入口:`https://www.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
|
|
68
68
|
|
|
69
69
|
```bash
|
|
70
70
|
# 第 1 步:让用户报出手机号后,立刻发码(命令立即返回,不会等待输入)
|
|
@@ -127,9 +127,9 @@ siluzan-tso config show
|
|
|
127
127
|
|
|
128
128
|
```
|
|
129
129
|
构建环境 : production
|
|
130
|
-
apiBaseUrl : https://tso-api
|
|
131
|
-
googleApiUrl : https://googleapi
|
|
132
|
-
webUrl : https://www
|
|
130
|
+
apiBaseUrl : https://tso-api.siluzan.com
|
|
131
|
+
googleApiUrl : https://googleapi.mysiluzan.com
|
|
132
|
+
webUrl : https://www.siluzan.com
|
|
133
133
|
apiKey : abcd****1234
|
|
134
134
|
```
|
|
135
135
|
|
|
@@ -336,7 +336,7 @@ siluzan-tso ad keyword-delete -a <accountId> --id <keywordId> --adgroup-id <adGr
|
|
|
336
336
|
|
|
337
337
|
## ad keyword-edit — 搜索关键词编辑
|
|
338
338
|
|
|
339
|
-
先用 `ad keywords --json-out ./snap` 取完整对象,再提交修改。只改 `--final-url` / `--max-cpc` / `--status` 时原地更新,`id` 与历史数据保留;改 `--text` / `--match-type`(Google 侧词面与匹配类型不可变)会新建并删除旧词,`id` 变化时 CLI
|
|
339
|
+
先用 `ad keywords --json-out ./snap` 取完整对象,再提交修改。只改 `--final-url` / `--max-cpc` / `--status` 时原地更新,`id` 与历史数据保留;改 `--text` / `--match-type`(Google 侧词面与匹配类型不可变)会新建并删除旧词,`id` 变化时 CLI 会提示。改 `--final-url` / `--max-cpc` / `--status` 后 CLI 会重新拉列表回读实际值,只有回读一致才输出 ✅;未生效或回读失败则报错退出。此时**禁止**自行改用 `keyword-delete` + `keyword-create`,也禁止直调网关删除重建(会丢失 id 与历史数据),哪怕只改一条也不行。应停下来告知用户「平台未生效、需反馈平台」,可另给 Google Ads Editor 导入清单作为替代方案。
|
|
340
340
|
|
|
341
341
|
```bash
|
|
342
342
|
siluzan-tso ad keyword-edit \
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
siluzan-tso config show # 取 webUrl
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
首页地址:`https://www
|
|
9
|
+
首页地址:`https://www.siluzan.com/v3/foreign_trade/tso/home`
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -25,7 +25,7 @@ siluzan-tso config show # 取 webUrl
|
|
|
25
25
|
|
|
26
26
|
## 推荐话术
|
|
27
27
|
|
|
28
|
-
1. **「和首页一样的总览」** → 打开 `https://www
|
|
28
|
+
1. **「和首页一样的总览」** → 打开 `https://www.siluzan.com/v3/foreign_trade/tso/home`。
|
|
29
29
|
2. **「某个 Google 账户昨天花了多少」** → `list-accounts -m Google` + `stats -m Google -a <id>`。
|
|
30
30
|
3. **「有待充值账户」** → 说明聚合数据在首页;CLI 可 `list-accounts` + `balance` 逐户排查,或引导充值页。
|
|
31
31
|
|
|
@@ -9,11 +9,11 @@ $ErrorActionPreference = 'Stop'
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
$PKG_NAME = 'siluzan-tso-cli'
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
$PKG_VERSION = '1.1.54
|
|
12
|
+
$PKG_VERSION = '1.1.54'
|
|
13
13
|
$CLI_BIN = 'siluzan-tso'
|
|
14
14
|
$SKILL_LABEL = 'Siluzan TSO'
|
|
15
|
-
$INSTALL_CMD = 'npm install -g siluzan-tso-cli
|
|
16
|
-
$WEB_BASE = 'https://www
|
|
15
|
+
$INSTALL_CMD = 'npm install -g siluzan-tso-cli'
|
|
16
|
+
$WEB_BASE = 'https://www.siluzan.com'
|
|
17
17
|
|
|
18
18
|
# -- Constants ----------------------------------------------------------------
|
|
19
19
|
$NODE_MAJOR_MIN = 18
|
|
@@ -9,11 +9,11 @@ set -euo pipefail
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
readonly PKG_NAME="siluzan-tso-cli"
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
readonly PKG_VERSION="1.1.54
|
|
12
|
+
readonly PKG_VERSION="1.1.54"
|
|
13
13
|
readonly CLI_BIN="siluzan-tso"
|
|
14
14
|
readonly SKILL_LABEL="Siluzan TSO"
|
|
15
|
-
readonly INSTALL_CMD="npm install -g siluzan-tso-cli
|
|
16
|
-
readonly WEB_BASE="https://www
|
|
15
|
+
readonly INSTALL_CMD="npm install -g siluzan-tso-cli"
|
|
16
|
+
readonly WEB_BASE="https://www.siluzan.com"
|
|
17
17
|
|
|
18
18
|
# -- Constants ----------------------------------------------------------------
|
|
19
19
|
readonly NODE_MAJOR_MIN=18
|