siluzan-tso-cli 1.1.48-beta.2 → 1.1.48-beta.3
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 -1
- package/dist/index.js +7 -3
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/accounts/accounts-balance-stats.md +1 -1
- package/dist/skill/references/core/agent-conventions.md +2 -0
- package/dist/skill/references/core/playbooks.md +2 -2
- package/dist/skill/references/core/tips.md +9 -0
- package/dist/skill/scripts/install.ps1 +1 -1
- package/dist/skill/scripts/install.sh +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -51,7 +51,7 @@ siluzan-tso init -d /path/to/skills # 写入自定义目录
|
|
|
51
51
|
siluzan-tso init --force # 强制覆盖已存在文件
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
> **注意**:当前为测试版(1.1.48-beta.
|
|
54
|
+
> **注意**:当前为测试版(1.1.48-beta.3),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
55
55
|
|
|
56
56
|
| 助手 | 建议 `--ai` |
|
|
57
57
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -2813,6 +2813,9 @@ function createVersionNotifier(opts) {
|
|
|
2813
2813
|
}
|
|
2814
2814
|
return { notifyIfOutdated: notifyIfOutdated2, fetchLatestVersion: fetchLatestVersion2 };
|
|
2815
2815
|
}
|
|
2816
|
+
function sanitizeTableCell(value) {
|
|
2817
|
+
return String(value ?? "").replace(/\r\n|\r|\n/g, " ").replace(/\|/g, TABLE_CELL_PIPE);
|
|
2818
|
+
}
|
|
2816
2819
|
function printCliTable(rows, columns, options) {
|
|
2817
2820
|
if (rows.length === 0) return;
|
|
2818
2821
|
const plain = options?.plain !== false;
|
|
@@ -2826,7 +2829,7 @@ function printCliTable(rows, columns, options) {
|
|
|
2826
2829
|
style: plain ? { head: [], border: [] } : void 0
|
|
2827
2830
|
});
|
|
2828
2831
|
for (const r of rows) {
|
|
2829
|
-
table.push(columns.map((c) =>
|
|
2832
|
+
table.push(columns.map((c) => sanitizeTableCell(r[c.key])));
|
|
2830
2833
|
}
|
|
2831
2834
|
for (const line of table.toString().split("\n")) {
|
|
2832
2835
|
printLine(indent + line);
|
|
@@ -3901,7 +3904,7 @@ async function issueApiKeyWithPhoneCode(opts) {
|
|
|
3901
3904
|
});
|
|
3902
3905
|
return apiKey;
|
|
3903
3906
|
}
|
|
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, 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;
|
|
3907
|
+
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;
|
|
3905
3908
|
var init_dist = __esm({
|
|
3906
3909
|
"../common/dist/index.js"() {
|
|
3907
3910
|
"use strict";
|
|
@@ -3969,6 +3972,7 @@ var init_dist = __esm({
|
|
|
3969
3972
|
PERF_PREFIX = "[SILUZAN_HTTP_PERF]";
|
|
3970
3973
|
DEFAULT_DETAIL_MAX = 400;
|
|
3971
3974
|
VERBOSE_DETAIL_MAX = 800;
|
|
3975
|
+
TABLE_CELL_PIPE = "\uFF5C";
|
|
3972
3976
|
ASCII_TABLE_CHARS = {
|
|
3973
3977
|
top: "-",
|
|
3974
3978
|
"top-mid": "+",
|
|
@@ -116990,7 +116994,7 @@ function printPlanItemsByAdGroup(configFile, layer, layerItems) {
|
|
|
116990
116994
|
}
|
|
116991
116995
|
}
|
|
116992
116996
|
function mdCell(text) {
|
|
116993
|
-
return text.replace(
|
|
116997
|
+
return text.replace(/\r?\n/g, " ").replace(/\|/g, "\uFF5C").trim();
|
|
116994
116998
|
}
|
|
116995
116999
|
function statusLabel(status) {
|
|
116996
117000
|
if (status === "ok") return "\u2705 \u5DF2\u521B\u5EFA";
|
package/dist/skill/_meta.json
CHANGED
|
@@ -47,7 +47,7 @@ siluzan-tso balance-scan -m BingV2 -a id1,id2,id3 --json-out ./snap-p2-subset
|
|
|
47
47
|
siluzan-tso balance-scan -m MetaAd --json-out ./snap-p2-meta
|
|
48
48
|
```
|
|
49
49
|
|
|
50
|
-
**读盘要点**:先看 `meta.dataIssue`(非空则失败)。`data.items` = **全部已检查账户**(OAuth 失效户不在 items,见 `meta.skippedInvalidOAuth`);`meta.hitCount` = 触阈值条数。预警筛 `hitReason !== "none"`;`hitReason="none"` 表示已检查但未触阈值。按 `remainingDays` 升序交付。用 **`dailySpend`** 做日均(口径见 `meta.spendDays` / `meta.spendWindow`),勿把 `stats` 区间合计 `spend` 当「每天消耗」。Google 消耗走 `account-spend-overview`,`startDate`/`endDate` 带东八区墙钟(`…T00:00:00+08:00` / `…T23:59:59+08:00`),与 `stats` 同口径。与 `balance` / `accounts-digest` 分工见 `references/core/agent-conventions.md`
|
|
50
|
+
**读盘要点**:先看 `meta.dataIssue`(非空则失败)。`data.items` = **全部已检查账户**(OAuth 失效户不在 items,见 `meta.skippedInvalidOAuth`);`meta.hitCount` = 触阈值条数。预警筛 `hitReason !== "none"`;`hitReason="none"` 表示已检查但未触阈值。按 `remainingDays` 升序交付。用 **`dailySpend`** 做日均(口径见 `meta.spendDays` / `meta.spendWindow`),勿把 `stats` 区间合计 `spend` 当「每天消耗」。Google 消耗走 `account-spend-overview`,`startDate`/`endDate` 带东八区墙钟(`…T00:00:00+08:00` / `…T23:59:59+08:00`),与 `stats` 同口径。与 `balance` / `accounts-digest` 分工见 `references/core/agent-conventions.md` §八。向用户写 Markdown 表时 `advertiserName` / `name` 必须把 `|` 换成 `|`(见 conventions §三)。
|
|
51
51
|
|
|
52
52
|
---
|
|
53
53
|
|
|
@@ -118,6 +118,8 @@
|
|
|
118
118
|
|
|
119
119
|
**写 Excel 时所有 ID 必须是文本(字符串),禁止数字类型**:含 `mediaCustomerId` / `entityId` / `accountId` / `campaignId` / `adGroupId` / `keywordId` / `criterionId` / geo `locationId` 及一切以 `Id`/`ID`/`id` 结尾的标识列。写入前一律 `String(id)`;`exceljs` 设 `numFmt: '@'`(文本),`openpyxl` 写字符串且勿让推断成 number。**禁止**写成 JSON number / Excel 数值单元格(会科学计数法或丢精度,如 `2.77E+09`)。金额、次数、比率等度量字段仍用数字类型。
|
|
120
120
|
|
|
121
|
+
**写 Markdown 表必须消毒单元格**:公司名 / 账户名 / 文案常含 `|` 或换行,原样塞进 `| col |` 会拆列。脚本投影表时把 `|` 换成 `|`、换行换成空格(与 CLI `printCliTable` 同一规则);**禁止**改 JSON 原值。示例见 `tips.md`「投影 Markdown 表」。
|
|
122
|
+
|
|
121
123
|
**中间结果一律落盘**:跨步骤数据不靠对话记忆;Windows 避免管道传 JSON,优先 `--json-out` + `node -e` 读文件。
|
|
122
124
|
|
|
123
125
|
---
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
- **步骤**:
|
|
44
44
|
1. 全量巡检:`balance-scan -m <媒体> --threshold-days 7 --json-out ./snap-p2`(可选 `--min-balance 100` / `--target-days 60`)。
|
|
45
45
|
2. 已知子集:`balance-scan -m <媒体> -a id1,id2,id3 --json-out ./snap-p2-subset`(跳过翻页)。
|
|
46
|
-
- **产物**:`data.items` 为全部已检查账户(按 `remainingDays` 升序);预警筛 `hitReason !== "none"`;`hitReason="none"` 表示未触阈值;消耗过低的僵尸账户 `remainingDays` 为 null
|
|
46
|
+
- **产物**:`data.items` 为全部已检查账户(按 `remainingDays` 升序);预警筛 `hitReason !== "none"`;`hitReason="none"` 表示未触阈值;消耗过低的僵尸账户 `remainingDays` 为 null、不纳入预警。向用户贴 Markdown 表时单元格必须把 `|` 换成 `|`(公司名常含 `|`)。**禁止**逐账户 `balance`。
|
|
47
47
|
|
|
48
48
|
---
|
|
49
49
|
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
2. **高 CPA 巡检**:加 `--max-cpa <n>`(保留 CPA > n,或有消耗且转化为 0 的账户)。
|
|
61
61
|
3. **零转化 / 零询盘巡检**:加 `--zero-conversions`(有消耗且转化 = 0 或未返回)。
|
|
62
62
|
4. 基于落盘 `data.items` 与 `meta.totals` 生成报告,**不要**再逐账户 `stats`。
|
|
63
|
-
- **产物**:向用户交付排序表(或明确「无命中」);表格覆盖用户请求的**每一个** ID
|
|
63
|
+
- **产物**:向用户交付排序表(或明确「无命中」);表格覆盖用户请求的**每一个** ID(未返回的占一行标注「未返回」)。Markdown 单元格须把 `|` 换成 `|`。**禁止**只落盘不说话。
|
|
64
64
|
|
|
65
65
|
---
|
|
66
66
|
|
|
@@ -311,3 +311,12 @@ console.log('可用字段:', first && Object.keys(first));
|
|
|
311
311
|
- **用 `process.stdout.write` 而不是 `console.log` 提取单个值**:前者不带换行符,方便直接赋给 shell 变量。
|
|
312
312
|
- **节点代码复杂时拆分写法**:不要写超过 10 行的 `node -e` 单行,改用 `node -e "$(cat <<'EOF'\n...\nEOF\n)"` 或多行 `.mjs` 脚本文件。
|
|
313
313
|
- 同一运行目录、同一"查询 id"的多次拉数会合并到 `cli-manifest-<id>.json` 的 `artifacts[]`;不同账户/实体写入各自的 manifest,互不覆盖。
|
|
314
|
+
- **投影 Markdown 表**:公司名等字段可能含 `|`,必须消毒后再拼 `| col |`。JSON 原值保持不动。
|
|
315
|
+
|
|
316
|
+
```javascript
|
|
317
|
+
const mdCell = (v) => String(v ?? "-").replace(/\r\n|\r|\n/g, " ").replace(/\|/g, "|");
|
|
318
|
+
const line = (cells) => `| ${cells.map(mdCell).join(" | ")} |`;
|
|
319
|
+
console.log(line(["账户ID", "公司", "余额"]));
|
|
320
|
+
console.log(line(["---", "---", "---"]));
|
|
321
|
+
for (const x of items) console.log(line([x.mediaCustomerId, x.advertiserName, x.balance]));
|
|
322
|
+
```
|
|
@@ -9,7 +9,7 @@ $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.48-beta.
|
|
12
|
+
$PKG_VERSION = '1.1.48-beta.3'
|
|
13
13
|
$CLI_BIN = 'siluzan-tso'
|
|
14
14
|
$SKILL_LABEL = 'Siluzan TSO'
|
|
15
15
|
$INSTALL_CMD = 'npm install -g siluzan-tso-cli@beta'
|
|
@@ -9,7 +9,7 @@ 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.48-beta.
|
|
12
|
+
readonly PKG_VERSION="1.1.48-beta.3"
|
|
13
13
|
readonly CLI_BIN="siluzan-tso"
|
|
14
14
|
readonly SKILL_LABEL="Siluzan TSO"
|
|
15
15
|
readonly INSTALL_CMD="npm install -g siluzan-tso-cli@beta"
|