siluzan-tso-cli 1.1.36-beta.1 → 1.1.36
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 +73 -12
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/accounts/accounts.md +3 -3
- 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/account-analytics.md +13 -1
- package/dist/skill/references/analytics/rag.md +1 -1
- package/dist/skill/references/analytics/reporting.md +5 -5
- package/dist/skill/references/core/agent-conventions.md +5 -0
- package/dist/skill/references/core/setup.md +5 -5
- package/dist/skill/references/misc/tso-home.md +2 -2
- package/dist/skill/references/report-templates/bing-period-report.md +20 -2
- package/dist/skill/report-templates/bing-period-report.md +20 -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.36-beta.1),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
55
54
|
|
|
56
55
|
| 助手 | 建议 `--ai` |
|
|
57
56
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -3829,7 +3829,7 @@ var DEFAULT_API_BASE;
|
|
|
3829
3829
|
var init_defaults = __esm({
|
|
3830
3830
|
"src/config/defaults.ts"() {
|
|
3831
3831
|
"use strict";
|
|
3832
|
-
DEFAULT_API_BASE = "https://tso-api
|
|
3832
|
+
DEFAULT_API_BASE = "https://tso-api.siluzan.com";
|
|
3833
3833
|
}
|
|
3834
3834
|
});
|
|
3835
3835
|
|
|
@@ -106735,7 +106735,7 @@ async function writeReportAnalysisSnapshot(params) {
|
|
|
106735
106735
|
);
|
|
106736
106736
|
await fs8.writeFile(
|
|
106737
106737
|
path12.join(absDir, outlineFileName),
|
|
106738
|
-
`${formatOutlineFileBody(fileName, params.payload)}
|
|
106738
|
+
`${formatOutlineFileBody(fileName, params.payload, params.outlineExtraHints)}
|
|
106739
106739
|
`,
|
|
106740
106740
|
"utf8"
|
|
106741
106741
|
);
|
|
@@ -127807,6 +127807,55 @@ function syncOverviewBalanceFields(record) {
|
|
|
127807
127807
|
return out;
|
|
127808
127808
|
}
|
|
127809
127809
|
|
|
127810
|
+
// src/commands/bing-analysis/normalize-bing-rates.ts
|
|
127811
|
+
var RATE_FIELD_NAMES2 = /* @__PURE__ */ new Set(["ctr", "conversionRate"]);
|
|
127812
|
+
var BING_RATE_BEARING_SECTIONS = /* @__PURE__ */ new Set([
|
|
127813
|
+
"overview",
|
|
127814
|
+
"device",
|
|
127815
|
+
"geographic",
|
|
127816
|
+
"age-audience",
|
|
127817
|
+
"gender-audience",
|
|
127818
|
+
"audience-merged",
|
|
127819
|
+
"campaigns",
|
|
127820
|
+
"ad-groups",
|
|
127821
|
+
"ads",
|
|
127822
|
+
"keywords",
|
|
127823
|
+
"search-terms"
|
|
127824
|
+
]);
|
|
127825
|
+
function divIfFiniteNumber2(v) {
|
|
127826
|
+
return typeof v === "number" && Number.isFinite(v) ? v / 100 : v;
|
|
127827
|
+
}
|
|
127828
|
+
function divideRatesInPlace2(value, seen) {
|
|
127829
|
+
if (value === null || typeof value !== "object") return;
|
|
127830
|
+
if (seen.has(value)) return;
|
|
127831
|
+
seen.add(value);
|
|
127832
|
+
if (Array.isArray(value)) {
|
|
127833
|
+
for (const item of value) divideRatesInPlace2(item, seen);
|
|
127834
|
+
return;
|
|
127835
|
+
}
|
|
127836
|
+
const obj = value;
|
|
127837
|
+
for (const k of Object.keys(obj)) {
|
|
127838
|
+
if (RATE_FIELD_NAMES2.has(k)) {
|
|
127839
|
+
obj[k] = divIfFiniteNumber2(obj[k]);
|
|
127840
|
+
} else {
|
|
127841
|
+
divideRatesInPlace2(obj[k], seen);
|
|
127842
|
+
}
|
|
127843
|
+
}
|
|
127844
|
+
}
|
|
127845
|
+
function normalizeBingRateScales(payload, section) {
|
|
127846
|
+
if (!BING_RATE_BEARING_SECTIONS.has(section)) return payload;
|
|
127847
|
+
divideRatesInPlace2(payload, /* @__PURE__ */ new WeakSet());
|
|
127848
|
+
return payload;
|
|
127849
|
+
}
|
|
127850
|
+
var BING_RATE_NORMALIZED_OUTLINE_HINTS = [
|
|
127851
|
+
"// \u6982\u7387\u5B57\u6BB5\uFF1A`ctr` / `conversionRate` \u5DF2\u7531 bing-analysis CLI \u4ECE\u7F51\u5173\u767E\u5206\u6570\u523B\u5EA6\u5F52\u4E00\u4E3A **0~1 \u5C0F\u6570**\uFF08\u5982 `0.0074` = 0.74%\uFF09\u3002",
|
|
127852
|
+
"// \u5199\u300Cx%\u300D\u6587\u6848\uFF1A`(v * 100).toFixed(2) + '%'`\uFF1B**\u7981\u6B62**\u518D \xF7100\uFF0C\u4E5F**\u7981\u6B62**\u628A JSON \u6570\u503C\u5F53\u300C\u5DF2\u662F\u767E\u5206\u6570\u300D\u76F4\u63A5\u52A0 `%`\uFF08\u4F1A \xD7100 \u9519\u8BEF\uFF0C\u5982 0.74% \u663E\u793A\u6210 74%\uFF09\u3002"
|
|
127853
|
+
];
|
|
127854
|
+
function buildBingOutlineHints(section) {
|
|
127855
|
+
if (!BING_RATE_BEARING_SECTIONS.has(section)) return void 0;
|
|
127856
|
+
return BING_RATE_NORMALIZED_OUTLINE_HINTS;
|
|
127857
|
+
}
|
|
127858
|
+
|
|
127810
127859
|
// src/commands/bing-analysis/fetch.ts
|
|
127811
127860
|
var BING_KEYWORD_LIMIT_DEFAULT = 100;
|
|
127812
127861
|
function stripLocalDate(d) {
|
|
@@ -127919,7 +127968,10 @@ async function fetchBingOverviewPayload(config, id, startDate, endDate, verbose)
|
|
|
127919
127968
|
endDate,
|
|
127920
127969
|
verbose
|
|
127921
127970
|
);
|
|
127922
|
-
return
|
|
127971
|
+
return normalizeBingSectionPayload(
|
|
127972
|
+
syncOverviewBalanceFields(withPrevious),
|
|
127973
|
+
"overview"
|
|
127974
|
+
);
|
|
127923
127975
|
}
|
|
127924
127976
|
async function enrichBingOverviewPreviousPeriod(config, accountId, record, startDate, endDate, verbose) {
|
|
127925
127977
|
if (!isBingPeriodBlockEmpty(record.previousPeriod)) {
|
|
@@ -127963,13 +128015,16 @@ async function fetchBingAudienceMergedPayload(config, id, startDate, endDate, ve
|
|
|
127963
128015
|
fetchBingJson(config, ageUrl, verbose),
|
|
127964
128016
|
fetchBingJson(config, genderUrl, verbose)
|
|
127965
128017
|
]);
|
|
127966
|
-
return
|
|
127967
|
-
|
|
127968
|
-
|
|
127969
|
-
|
|
127970
|
-
|
|
127971
|
-
|
|
127972
|
-
|
|
128018
|
+
return normalizeBingSectionPayload(
|
|
128019
|
+
{
|
|
128020
|
+
mergedParts: ["AgeAudienceData", "GenderAudienceData"],
|
|
128021
|
+
startDate,
|
|
128022
|
+
endDate,
|
|
128023
|
+
account: id,
|
|
128024
|
+
data: { ageAudience: ageData, genderAudience: genderData }
|
|
128025
|
+
},
|
|
128026
|
+
"audience-merged"
|
|
128027
|
+
);
|
|
127973
128028
|
}
|
|
127974
128029
|
async function fetchBingSectionPayload(def, opts, config, id) {
|
|
127975
128030
|
const { startDate, endDate } = resolveBingDateRange(opts.start, opts.end);
|
|
@@ -127986,7 +128041,12 @@ async function fetchBingSectionPayload(def, opts, config, id) {
|
|
|
127986
128041
|
params.set("orderByCost", "true");
|
|
127987
128042
|
}
|
|
127988
128043
|
const url = reportingUrl(config, id, def.segment, params.toString());
|
|
127989
|
-
|
|
128044
|
+
const raw = await fetchBingJson(config, url, verbose);
|
|
128045
|
+
return normalizeBingRateScales(raw, def.name);
|
|
128046
|
+
}
|
|
128047
|
+
function normalizeBingSectionPayload(payload, section) {
|
|
128048
|
+
if (payload === null || typeof payload !== "object") return payload;
|
|
128049
|
+
return normalizeBingRateScales(payload, section);
|
|
127990
128050
|
}
|
|
127991
128051
|
function endpointHintForBingSection(def) {
|
|
127992
128052
|
return `GET \u2026/BingV2/{id}/${def.segment}`;
|
|
@@ -128045,7 +128105,8 @@ async function runAllBingSections(opts) {
|
|
|
128045
128105
|
accountId: id,
|
|
128046
128106
|
dateRange: { start: startDate, end: endDate },
|
|
128047
128107
|
payload,
|
|
128048
|
-
cliVersion
|
|
128108
|
+
cliVersion,
|
|
128109
|
+
outlineExtraHints: buildBingOutlineHints(def.name)
|
|
128049
128110
|
});
|
|
128050
128111
|
return {
|
|
128051
128112
|
section: def.name,
|
package/dist/skill/_meta.json
CHANGED
|
@@ -280,7 +280,7 @@ siluzan-tso account-history --start 2026-03-01 --end 2026-03-31 --json-out ./sna
|
|
|
280
280
|
| 状态 | 含义 | 下一步操作 |
|
|
281
281
|
| ---------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
282
282
|
| `Pending` | 审核中 | 等待,可反复运行此命令轮询;审核周期因媒体而异 |
|
|
283
|
-
| `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `https://www
|
|
283
|
+
| `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google`;Kwai、Yandex 当前没有对应充值界面) |
|
|
284
284
|
| `Rejected` | 被拒 | 查看 `--json-out` 落盘中的 `reason` 字段了解拒绝原因;修改资料后重新提交;若原因不明,引导用户联系丝路赞客服 |
|
|
285
285
|
|
|
286
286
|
---
|
|
@@ -909,7 +909,7 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
|
|
|
909
909
|
|
|
910
910
|
| 功能 | 媒体 | 网页路径 |
|
|
911
911
|
| --------------------------------------- | ------ | ------------------------------------------------- |
|
|
912
|
-
| **账户激活**(邀请他人激活 / 充值激活) | Google | `https://www
|
|
912
|
+
| **账户激活**(邀请他人激活 / 充值激活) | Google | `https://www.siluzan.com/v3/foreign_trade/tso/manageAccounts` |
|
|
913
913
|
|
|
914
914
|
**Agent 建议话术**:
|
|
915
915
|
|
|
@@ -918,5 +918,5 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
|
|
|
918
918
|
siluzan-tso config show # 查看 webUrl 字段
|
|
919
919
|
|
|
920
920
|
# 账户激活(Google)→ 引导至账户管理页
|
|
921
|
-
# https://www
|
|
921
|
+
# https://www.siluzan.com/v3/foreign_trade/tso/manageAccounts
|
|
922
922
|
```
|
|
@@ -117,7 +117,7 @@ siluzan-tso config show
|
|
|
117
117
|
|
|
118
118
|
### 充值页链接(按媒体 × 类型)
|
|
119
119
|
|
|
120
|
-
链接模式:`https://www
|
|
120
|
+
链接模式:`https://www.siluzan.com/v3/foreign_trade/tso/recharge/<page>?mediaType=<mediaType>`;丝路赞钱包:`https://www.siluzan.com/v3/foreign_trade/tso/recharge/siluzanWallet`(无媒体参数)。
|
|
121
121
|
|
|
122
122
|
| 充值类型 | `<page>` | 支持媒体(`mediaType` 参数) |
|
|
123
123
|
| ------------------------- | --------------------- | ------------------------------------------- |
|
|
@@ -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
|
## 首次响应硬规范(必读)
|
|
@@ -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 → https://www
|
|
63
|
+
# 审核通过后:config show → https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
---
|
|
@@ -319,7 +319,7 @@ siluzan-tso tiktok-analysis -a 1234567890 --start 2026-03-01 --end 2026-03-31 \
|
|
|
319
319
|
|
|
320
320
|
## Bing(BingV2)账户分析
|
|
321
321
|
|
|
322
|
-
> **日期限制**:Bing 报表不能包含今天或昨天。省略时 CLI 默认截至前天的近 7
|
|
322
|
+
> **日期限制**:Bing 报表不能包含今天或昨天。省略时 CLI 默认截至前天的近 7 天。用户要**已结束的完整自然月**(如「6月份」)→ `--start` 当月 1 日、`--end` 当月最后一天(6 月 = `06-30`,**禁止**减 1 天),见 `report-templates/bing-period-report.md` §日期规则。
|
|
323
323
|
|
|
324
324
|
与 `google-analysis` / `facebook-analysis` 同架构:`bing-analysis -a … --json-out …`(省略子命令名默认执行 `run`,批量拉取全部维度或 `--sections` 指定子集)。
|
|
325
325
|
|
|
@@ -343,6 +343,18 @@ siluzan-tso bing-analysis -a <mediaCustomerId> --start 2026-03-01 --end 2026-03-
|
|
|
343
343
|
|
|
344
344
|
报告模板:`report-templates/bing-period-report.md`(**每个 section 须写「分析」**;**余额**:`overview` section 落盘 JSON 常自动校正 0 快照,读 `balance`/`remainingAccountBudget` 或 `balance` 命令;**环比**:网关 `previousPeriod` 常空,CLI 二次拉上一周期回填)。
|
|
345
345
|
|
|
346
|
+
### 点击率 / 转化率口径(必读)
|
|
347
|
+
|
|
348
|
+
Bing 的 `ctr` / `conversionRate` 为 0~1 小数**(`0.007434` = 0.74%),与 Google `schemaVersion ≥ 2` 一致。
|
|
349
|
+
|
|
350
|
+
| 场景 | 正确写法 | 错误写法 |
|
|
351
|
+
| ---- | -------- | -------- |
|
|
352
|
+
| 报告 HTML 展示 | `(ctr * 100).toFixed(2) + '%'` | `ctr.toFixed(2) + '%'`(会显示 74% 而非 0.74%) |
|
|
353
|
+
| Excel 0~1 列 | 直接写 JSON 数值 | 再 ÷100 |
|
|
354
|
+
| 脚本校验 | `clicks / impressions` 与 `ctr` 应一致(允许四舍五入) | 心算或凭印象 |
|
|
355
|
+
|
|
356
|
+
各 `overview-*.outline.txt` 等文件头部含 `//` 硬提示,Agent **须先读 outline** 再写报告。
|
|
357
|
+
|
|
346
358
|
---
|
|
347
359
|
|
|
348
360
|
## 报告模板
|
|
@@ -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) | `https://www
|
|
196
|
-
| Google | 小时报(Hourly) | `https://www
|
|
197
|
-
| TikTok | 日报 | `https://www
|
|
195
|
+
| Google | 日报(Daily) | `https://www.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
|
|
196
|
+
| Google | 小时报(Hourly) | `https://www.siluzan.com/media-report/hour/{entityId}?culture=zh-CN` |
|
|
197
|
+
| TikTok | 日报 | `https://www.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
|
|
210
|
+
# webUrl: https://www.siluzan.com
|
|
211
211
|
|
|
212
212
|
# 第三步:拼接链接(Google 日报)
|
|
213
|
-
# https://www
|
|
213
|
+
# https://www.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
|
|
214
214
|
```
|
|
@@ -149,6 +149,11 @@
|
|
|
149
149
|
| Google 关键词/系列分析 | `now - 30d` ~ `now - 1d` |
|
|
150
150
|
| MetaAd 账户分析 | 不得默认,必须问 |
|
|
151
151
|
|
|
152
|
+
**完整自然月口径**(用户说「X 月 / X月份 / 月报」且该月已结束,或上表「月报」默认):
|
|
153
|
+
|
|
154
|
+
- `--start` = 当月 1 日,`--end` = 当月最后一天(6 月 → `06-01` ~ `06-30`,**禁止** `06-29`)。
|
|
155
|
+
- **Bing** `bing-analysis`:「不能含今天/昨天」仅当区间碰到**执行日**的今天/昨天时才需把结束日压到前天;**已结束的历史自然月必须用该月最后一天**,细则见 `report-templates/bing-period-report.md` §日期规则。交付前核对 `overview` 的 `activeDays` = 该月日历天数。
|
|
156
|
+
|
|
152
157
|
---
|
|
153
158
|
|
|
154
159
|
## 六、币种与金额
|
|
@@ -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 步:让用户报出手机号后,立刻发码(命令立即返回,不会等待输入)
|
|
@@ -129,9 +129,9 @@ siluzan-tso config show
|
|
|
129
129
|
|
|
130
130
|
```
|
|
131
131
|
构建环境 : production
|
|
132
|
-
apiBaseUrl : https://tso-api
|
|
133
|
-
googleApiUrl : https://googleapi
|
|
134
|
-
webUrl : https://www
|
|
132
|
+
apiBaseUrl : https://tso-api.siluzan.com
|
|
133
|
+
googleApiUrl : https://googleapi.mysiluzan.com
|
|
134
|
+
webUrl : https://www.siluzan.com
|
|
135
135
|
apiKey : abcd****1234
|
|
136
136
|
```
|
|
137
137
|
|
|
@@ -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
|
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
|
|
13
13
|
- Bing 接口**无法**拉取过新的数据;时间范围内**任意一天**若为**今天**或**昨天**,请求会失败。
|
|
14
14
|
- **CLI**:`--start` / `--end` 须**同传或同省略**;省略时默认**截至前天**的近 7 天(与 `bing-analysis` 实现一致)。
|
|
15
|
-
-
|
|
15
|
+
- **自选区间且靠近当前日期**时,结束日须 ≤ **前天**(仅当区间会碰到今天/昨天才需要压到前天;**不是**把历史自然月最后一天减 1 天)。
|
|
16
|
+
|
|
17
|
+
### 用户说「X 月 / X月份 / 月报」(已结束的完整自然月)
|
|
18
|
+
|
|
19
|
+
用户指定某一月份(如「6月份报告」「6月 Bing 月报」)且该月**已结束**时:
|
|
20
|
+
|
|
21
|
+
| 项 | 规则 |
|
|
22
|
+
| --- | --- |
|
|
23
|
+
| `--start` | 当月 **1 日**(如 `2026-06-01`) |
|
|
24
|
+
| `--end` | 当月**最后一天**(如 6 月 → `2026-06-30`,**禁止**写成 `06-29`) |
|
|
25
|
+
| 报告首行 | `统计区间:YYYY-MM-01 ~ YYYY-MM-<末>` |
|
|
26
|
+
|
|
27
|
+
示例(7 月 8 日要 6 月报告):
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
siluzan-tso bing-analysis -a <id> --start 2026-06-01 --end 2026-06-30 --json-out ./snap-bing
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**禁止**因「Bing 不能含今天/昨天」而对**已结束的历史自然月**把 `--end` 减 1 天——该限制只针对区间内的日历日是否等于**执行当天的今天或昨天**;6 月 30 日在 7 月 8 日拉数完全合法。拉数后核对 `overview` 落盘里的 `activeDays` 应等于该月日历天数(6 月 = 30)。
|
|
16
34
|
|
|
17
35
|
---
|
|
18
36
|
|
|
@@ -35,7 +53,7 @@ siluzan-tso bing-analysis -a <mediaCustomerId> --start <S> --end <E> \
|
|
|
35
53
|
|
|
36
54
|
- 写脚本前先读各 `bing-*-<id>.outline.txt`,再读 `.json`(见 `references/core/agent-conventions.md` §三)。
|
|
37
55
|
- TopN、排序、汇总均在脚本内完成,禁止心算。
|
|
38
|
-
- 金额字段已为**元**;`ctr` / `conversionRate`
|
|
56
|
+
- 金额字段已为**元**;`ctr` / `conversionRate` 等:**`bing-analysis` 落盘前已从网关百分数刻度归一为 0~1 小数**(如 `0.0074` = 0.74%),展示百分比用 `(v * 100).toFixed(2) + '%'`;**禁止**把 JSON 数值当「已是百分数」直接加 `%`(会重复 ×100,如 0.74% 显示成 74%)。
|
|
39
57
|
|
|
40
58
|
---
|
|
41
59
|
|
|
@@ -12,7 +12,25 @@
|
|
|
12
12
|
|
|
13
13
|
- Bing 接口**无法**拉取过新的数据;时间范围内**任意一天**若为**今天**或**昨天**,请求会失败。
|
|
14
14
|
- **CLI**:`--start` / `--end` 须**同传或同省略**;省略时默认**截至前天**的近 7 天(与 `bing-analysis` 实现一致)。
|
|
15
|
-
-
|
|
15
|
+
- **自选区间且靠近当前日期**时,结束日须 ≤ **前天**(仅当区间会碰到今天/昨天才需要压到前天;**不是**把历史自然月最后一天减 1 天)。
|
|
16
|
+
|
|
17
|
+
### 用户说「X 月 / X月份 / 月报」(已结束的完整自然月)
|
|
18
|
+
|
|
19
|
+
用户指定某一月份(如「6月份报告」「6月 Bing 月报」)且该月**已结束**时:
|
|
20
|
+
|
|
21
|
+
| 项 | 规则 |
|
|
22
|
+
| --- | --- |
|
|
23
|
+
| `--start` | 当月 **1 日**(如 `2026-06-01`) |
|
|
24
|
+
| `--end` | 当月**最后一天**(如 6 月 → `2026-06-30`,**禁止**写成 `06-29`) |
|
|
25
|
+
| 报告首行 | `统计区间:YYYY-MM-01 ~ YYYY-MM-<末>` |
|
|
26
|
+
|
|
27
|
+
示例(7 月 8 日要 6 月报告):
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
siluzan-tso bing-analysis -a <id> --start 2026-06-01 --end 2026-06-30 --json-out ./snap-bing
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**禁止**因「Bing 不能含今天/昨天」而对**已结束的历史自然月**把 `--end` 减 1 天——该限制只针对区间内的日历日是否等于**执行当天的今天或昨天**;6 月 30 日在 7 月 8 日拉数完全合法。拉数后核对 `overview` 落盘里的 `activeDays` 应等于该月日历天数(6 月 = 30)。
|
|
16
34
|
|
|
17
35
|
---
|
|
18
36
|
|
|
@@ -35,7 +53,7 @@ siluzan-tso bing-analysis -a <mediaCustomerId> --start <S> --end <E> \
|
|
|
35
53
|
|
|
36
54
|
- 写脚本前先读各 `bing-*-<id>.outline.txt`,再读 `.json`(见 `references/core/agent-conventions.md` §三)。
|
|
37
55
|
- TopN、排序、汇总均在脚本内完成,禁止心算。
|
|
38
|
-
- 金额字段已为**元**;`ctr` / `conversionRate`
|
|
56
|
+
- 金额字段已为**元**;`ctr` / `conversionRate` 等:**`bing-analysis` 落盘前已从网关百分数刻度归一为 0~1 小数**(如 `0.0074` = 0.74%),展示百分比用 `(v * 100).toFixed(2) + '%'`;**禁止**把 JSON 数值当「已是百分数」直接加 `%`(会重复 ×100,如 0.74% 显示成 74%)。
|
|
39
57
|
|
|
40
58
|
---
|
|
41
59
|
|
|
@@ -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.36
|
|
12
|
+
$PKG_VERSION = '1.1.36'
|
|
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.36
|
|
12
|
+
readonly PKG_VERSION="1.1.36"
|
|
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
|