siluzan-tso-cli 1.1.53-beta.4 → 1.1.53-beta.5
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/skill/_meta.json +2 -2
- package/dist/skill/references/report-templates/google-quarterly-plan.md +6 -6
- package/dist/skill/references/report-templates/google-quarterly-report.md +1 -1
- package/dist/skill/report-templates/google-quarterly-plan.md +6 -6
- package/dist/skill/report-templates/google-quarterly-report.html +22 -9
- package/dist/skill/report-templates/google-quarterly-report.md +1 -1
- 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.53-beta.
|
|
54
|
+
> **注意**:当前为测试版(1.1.53-beta.5),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
55
55
|
|
|
56
56
|
| 助手 | 建议 `--ai` |
|
|
57
57
|
| ----------------------- | ------------------------------------ |
|
package/dist/skill/_meta.json
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
| 5 | `keywords` | 关键词与搜索主题 | Search 分组 + 匹配 + 否词方向;有 PMax 则 Search Themes |
|
|
34
34
|
| 6 | `audience` | 受众规划 | Audience Signal / 名单 / 再营销;没有的标「需创建或导入」 |
|
|
35
35
|
| 7 | `creative` | 素材与落地页 | 主题、资产缺口、测试假设(每轮 1~2 变量)、广告↔页面映射 |
|
|
36
|
-
| 8 | `roadmap` | 季度执行路线图 |
|
|
36
|
+
| 8 | `roadmap` | 季度执行路线图 | 第一个月 / 第二个月 / 第三个月:任务、交付物、完成条件、依赖 |
|
|
37
37
|
| 9 | `risks` | 风险与待确认 | 预算、数据、素材、页面、销售承接、合规;假设清单 |
|
|
38
38
|
|
|
39
39
|
每条结论前加口径标签之一:`已确认` / `基于历史数据` / `建议验证` / `待业务确认`。
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"keywords": { "analysis": ["产品词精确/词组…", "否词方向:求职/教程/免费"] },
|
|
49
49
|
"audience": { "analysis": ["待业务确认:客户名单未导入"] },
|
|
50
50
|
"creative": { "analysis": ["主题:工业场景…", "缺口:PMax 视频"] },
|
|
51
|
-
"roadmap": { "analysis": ["
|
|
51
|
+
"roadmap": { "analysis": ["第一个月:目标与基础…", "第二个月:核心建设…", "第三个月:已验证方向扩"] },
|
|
52
52
|
"risks": { "analysis": ["销售回传缺失 → 主目标暂用表单并标注"] }
|
|
53
53
|
}
|
|
54
54
|
}
|
|
@@ -104,7 +104,7 @@ CPA、询盘目标**不**从历史外推。要写数字须用户给,或标「
|
|
|
104
104
|
| Q23 | 广告↔页 | 每个核心主题至少一个明确页面方向。禁止广告讲 A、页面展 B |
|
|
105
105
|
| Q24 | 转化路径 | CTA、表单字段、感谢页、电话/WhatsApp/邮件、CRM 回传、销售跟进 |
|
|
106
106
|
| Q25 | 销售承接 | 接收人、响应时效、分配、无效反馈、结果回传。无承接则降低扩量优先级 |
|
|
107
|
-
| Q26 | 三月节奏 |
|
|
107
|
+
| Q26 | 三月节奏 | 见下表。写「第一个月 / 第二个月 / 第三个月」,禁止写「第1月」(会被读成 1 月 / 2 月 / 3 月)。能从本期结束日推下期日历月时写成「第一个月(10月)」。月度报告改成「本月 / 次月 / 再次月」 |
|
|
108
108
|
| Q27 | 依赖 | 每项关键规划标依赖、负责人或待确认 |
|
|
109
109
|
| Q28 | 风险 | 至少覆盖:预算不足、转化量不足、数据质量、落地页未完成、素材不足、销售承接、市场合规 |
|
|
110
110
|
| Q29 | 假设 | 假设不得写成事实;用四类口径标签 |
|
|
@@ -114,9 +114,9 @@ CPA、询盘目标**不**从历史外推。要写数字须用户给,或标「
|
|
|
114
114
|
|
|
115
115
|
| 阶段 | 核心任务 | 交付 | 完成条件 |
|
|
116
116
|
| ---- | -------- | ---- | -------- |
|
|
117
|
-
|
|
|
118
|
-
|
|
|
119
|
-
|
|
|
117
|
+
| 第一个月 · 基础与验证 | 目标、预算、市场优先级;补转化追踪、落地页、素材、受众 | 目标表、预算表、Campaign 结构、词/Themes、素材与页面清单 | 核心投放基础具备,关键依赖写清 |
|
|
118
|
+
| 第二个月 · 重点建设 | 核心市场与核心类型;有限变量测试 | 核心 Campaign、素材测试批次、受众组合、页面优化版 | 核心方向验证完,形成可续投项目 |
|
|
119
|
+
| 第三个月 · 扩展与沉淀 | 只围已验证方向扩市场/预算/词/素材/受众 | 扩展计划、下季建议、有效资产、未完成项 | 可扩展方向和下季待解决问题都明确 |
|
|
120
120
|
|
|
121
121
|
## 硬约束
|
|
122
122
|
|
|
@@ -112,7 +112,7 @@ Agent JSON Schema:`assets/google-quarterly-report.schema.json`。
|
|
|
112
112
|
"keywords": { "analysis": ["产品词精确/词组;否词:求职/教程"] },
|
|
113
113
|
"audience": { "analysis": ["待业务确认:客户名单未导入"] },
|
|
114
114
|
"creative": { "analysis": ["主题:工业场景;缺口:PMax 视频"] },
|
|
115
|
-
"roadmap": { "analysis": ["
|
|
115
|
+
"roadmap": { "analysis": ["第一个月基础验证;第二个月核心建设;第三个月已验证方向扩"] },
|
|
116
116
|
"risks": { "analysis": ["销售回传缺失"] }
|
|
117
117
|
}
|
|
118
118
|
}
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
| 5 | `keywords` | 关键词与搜索主题 | Search 分组 + 匹配 + 否词方向;有 PMax 则 Search Themes |
|
|
34
34
|
| 6 | `audience` | 受众规划 | Audience Signal / 名单 / 再营销;没有的标「需创建或导入」 |
|
|
35
35
|
| 7 | `creative` | 素材与落地页 | 主题、资产缺口、测试假设(每轮 1~2 变量)、广告↔页面映射 |
|
|
36
|
-
| 8 | `roadmap` | 季度执行路线图 |
|
|
36
|
+
| 8 | `roadmap` | 季度执行路线图 | 第一个月 / 第二个月 / 第三个月:任务、交付物、完成条件、依赖 |
|
|
37
37
|
| 9 | `risks` | 风险与待确认 | 预算、数据、素材、页面、销售承接、合规;假设清单 |
|
|
38
38
|
|
|
39
39
|
每条结论前加口径标签之一:`已确认` / `基于历史数据` / `建议验证` / `待业务确认`。
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"keywords": { "analysis": ["产品词精确/词组…", "否词方向:求职/教程/免费"] },
|
|
49
49
|
"audience": { "analysis": ["待业务确认:客户名单未导入"] },
|
|
50
50
|
"creative": { "analysis": ["主题:工业场景…", "缺口:PMax 视频"] },
|
|
51
|
-
"roadmap": { "analysis": ["
|
|
51
|
+
"roadmap": { "analysis": ["第一个月:目标与基础…", "第二个月:核心建设…", "第三个月:已验证方向扩"] },
|
|
52
52
|
"risks": { "analysis": ["销售回传缺失 → 主目标暂用表单并标注"] }
|
|
53
53
|
}
|
|
54
54
|
}
|
|
@@ -104,7 +104,7 @@ CPA、询盘目标**不**从历史外推。要写数字须用户给,或标「
|
|
|
104
104
|
| Q23 | 广告↔页 | 每个核心主题至少一个明确页面方向。禁止广告讲 A、页面展 B |
|
|
105
105
|
| Q24 | 转化路径 | CTA、表单字段、感谢页、电话/WhatsApp/邮件、CRM 回传、销售跟进 |
|
|
106
106
|
| Q25 | 销售承接 | 接收人、响应时效、分配、无效反馈、结果回传。无承接则降低扩量优先级 |
|
|
107
|
-
| Q26 | 三月节奏 |
|
|
107
|
+
| Q26 | 三月节奏 | 见下表。写「第一个月 / 第二个月 / 第三个月」,禁止写「第1月」(会被读成 1 月 / 2 月 / 3 月)。能从本期结束日推下期日历月时写成「第一个月(10月)」。月度报告改成「本月 / 次月 / 再次月」 |
|
|
108
108
|
| Q27 | 依赖 | 每项关键规划标依赖、负责人或待确认 |
|
|
109
109
|
| Q28 | 风险 | 至少覆盖:预算不足、转化量不足、数据质量、落地页未完成、素材不足、销售承接、市场合规 |
|
|
110
110
|
| Q29 | 假设 | 假设不得写成事实;用四类口径标签 |
|
|
@@ -114,9 +114,9 @@ CPA、询盘目标**不**从历史外推。要写数字须用户给,或标「
|
|
|
114
114
|
|
|
115
115
|
| 阶段 | 核心任务 | 交付 | 完成条件 |
|
|
116
116
|
| ---- | -------- | ---- | -------- |
|
|
117
|
-
|
|
|
118
|
-
|
|
|
119
|
-
|
|
|
117
|
+
| 第一个月 · 基础与验证 | 目标、预算、市场优先级;补转化追踪、落地页、素材、受众 | 目标表、预算表、Campaign 结构、词/Themes、素材与页面清单 | 核心投放基础具备,关键依赖写清 |
|
|
118
|
+
| 第二个月 · 重点建设 | 核心市场与核心类型;有限变量测试 | 核心 Campaign、素材测试批次、受众组合、页面优化版 | 核心方向验证完,形成可续投项目 |
|
|
119
|
+
| 第三个月 · 扩展与沉淀 | 只围已验证方向扩市场/预算/词/素材/受众 | 扩展计划、下季建议、有效资产、未完成项 | 可扩展方向和下季待解决问题都明确 |
|
|
120
120
|
|
|
121
121
|
## 硬约束
|
|
122
122
|
|
|
@@ -247,11 +247,10 @@
|
|
|
247
247
|
.bcell .n { font-size: 13px; color: var(--text-2); margin-top: 4px; }
|
|
248
248
|
.closing {
|
|
249
249
|
text-align: center; background: #fff; border: 1px solid var(--line-light);
|
|
250
|
-
border-radius: var(--radius-lg); padding: 56px 24px; margin: 20px 0
|
|
250
|
+
border-radius: var(--radius-lg); padding: 56px 24px; margin: 20px 0 24px; box-shadow: var(--shadow);
|
|
251
251
|
}
|
|
252
252
|
.closing h2 { margin: 0 0 10px; font-size: 36px; font-weight: 600; }
|
|
253
253
|
.closing p { margin: 0; color: var(--text-3); font-size: 13px; }
|
|
254
|
-
.footnote { text-align: center; color: var(--text-3); font-size: 12px; padding: 12px 0 24px; }
|
|
255
254
|
.hidden { display: none !important; }
|
|
256
255
|
@media print { .topnav { display: none; } .page, .chapter, .cover { break-inside: avoid; box-shadow: none; } }
|
|
257
256
|
</style>
|
|
@@ -332,6 +331,20 @@
|
|
|
332
331
|
return `${String(range.start).slice(0, 10)} ~ ${String(range.end).slice(0, 10)}`;
|
|
333
332
|
}
|
|
334
333
|
|
|
334
|
+
/** 下期三个月:写「第一个月」而不是「第1月」,避免被读成 1 月 / 2 月 / 3 月。 */
|
|
335
|
+
function nextPeriodMonthLabels(current) {
|
|
336
|
+
const base = ["第一个月", "第二个月", "第三个月"];
|
|
337
|
+
const end = current && current.end;
|
|
338
|
+
const match = typeof end === "string" ? /^(\d{4})-(\d{2})-(\d{2})$/.exec(end.trim()) : null;
|
|
339
|
+
if (!match) return base;
|
|
340
|
+
let month = Number(match[2]);
|
|
341
|
+
return base.map((label) => {
|
|
342
|
+
month += 1;
|
|
343
|
+
if (month > 12) month = 1;
|
|
344
|
+
return `${label}(${month}月)`;
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
|
|
335
348
|
function ellipsis(text, max) {
|
|
336
349
|
const s = String(text ?? "").trim();
|
|
337
350
|
return s.length > max ? s.slice(0, max) + "…" : s;
|
|
@@ -492,7 +505,7 @@
|
|
|
492
505
|
<div class="bcell"><div class="p">${money(planDefaults.spendLow, currency)}</div><div class="n">建议档 +30%</div></div>
|
|
493
506
|
<div class="bcell"><div class="p">${money(planDefaults.spendHigh, currency)}</div><div class="n">扩量档 +50%</div></div>
|
|
494
507
|
</div>
|
|
495
|
-
${monthSplitTable(planDefaults, currency)}
|
|
508
|
+
${monthSplitTable(planDefaults, currency, meta.current)}
|
|
496
509
|
</div>
|
|
497
510
|
<div class="plan-stack">${planChapters(plan)}</div>
|
|
498
511
|
</section>
|
|
@@ -500,7 +513,6 @@
|
|
|
500
513
|
<h2>谢谢</h2>
|
|
501
514
|
<p>${esc(name)} · ${esc(periodLabel(meta.current))}</p>
|
|
502
515
|
</section>
|
|
503
|
-
<p class="footnote">${esc(name)} · ${esc(periodLabel(meta.current))}</p>
|
|
504
516
|
`;
|
|
505
517
|
|
|
506
518
|
const months = data.monthly || [];
|
|
@@ -858,17 +870,18 @@
|
|
|
858
870
|
return `<div class="plan-card"><div class="tag">${esc(title)}</div><ul>${items.map((x) => `<li>${esc(x)}</li>`).join("")}</ul></div>`;
|
|
859
871
|
}
|
|
860
872
|
|
|
861
|
-
function monthSplitTable(defaults, currency) {
|
|
873
|
+
function monthSplitTable(defaults, currency, current) {
|
|
862
874
|
const months = defaults && defaults.monthSuggested;
|
|
863
875
|
if (!Array.isArray(months) || months.length < 3) return "";
|
|
864
876
|
const shares = (defaults.monthShares || [0.3, 0.35, 0.35]).map((n) => Math.round(Number(n) * 100) + "%");
|
|
877
|
+
const labels = nextPeriodMonthLabels(current);
|
|
865
878
|
return `<h3 class="st">建议档月度拆分</h3>
|
|
866
879
|
<div class="table-wrap"><table class="data compact">
|
|
867
|
-
<thead><tr><th
|
|
880
|
+
<thead><tr><th>下期月份</th><th class="num">占比</th><th class="num">建议花费</th></tr></thead>
|
|
868
881
|
<tbody>
|
|
869
|
-
<tr><td
|
|
870
|
-
<tr><td
|
|
871
|
-
<tr><td
|
|
882
|
+
<tr><td>${esc(labels[0])}</td><td class="num">${shares[0] || "30%"}</td><td class="num">${money(months[0], currency)}</td></tr>
|
|
883
|
+
<tr><td>${esc(labels[1])}</td><td class="num">${shares[1] || "35%"}</td><td class="num">${money(months[1], currency)}</td></tr>
|
|
884
|
+
<tr><td>${esc(labels[2])}</td><td class="num">${shares[2] || "35%"}</td><td class="num">${money(months[2], currency)}</td></tr>
|
|
872
885
|
</tbody>
|
|
873
886
|
</table></div>`;
|
|
874
887
|
}
|
|
@@ -112,7 +112,7 @@ Agent JSON Schema:`assets/google-quarterly-report.schema.json`。
|
|
|
112
112
|
"keywords": { "analysis": ["产品词精确/词组;否词:求职/教程"] },
|
|
113
113
|
"audience": { "analysis": ["待业务确认:客户名单未导入"] },
|
|
114
114
|
"creative": { "analysis": ["主题:工业场景;缺口:PMax 视频"] },
|
|
115
|
-
"roadmap": { "analysis": ["
|
|
115
|
+
"roadmap": { "analysis": ["第一个月基础验证;第二个月核心建设;第三个月已验证方向扩"] },
|
|
116
116
|
"risks": { "analysis": ["销售回传缺失"] }
|
|
117
117
|
}
|
|
118
118
|
}
|
|
@@ -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.53-beta.
|
|
12
|
+
$PKG_VERSION = '1.1.53-beta.5'
|
|
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.53-beta.
|
|
12
|
+
readonly PKG_VERSION="1.1.53-beta.5"
|
|
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"
|