siluzan-cso-cli 1.1.27-beta.1 → 1.1.27-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 +13 -2
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/persona.md +21 -8
- package/dist/skill/scripts/install.ps1 +1 -1
- package/dist/skill/scripts/install.sh +1 -1
- package/dist/skill/three-lib-content-workflow/content-writer.workflow.md +15 -13
- package/dist/skill/three-lib-content-workflow/packs//347/237/255/350/247/206/351/242/221/345/217/243/346/222/255//345/217/243/346/222/255-sop.md +20 -13
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -54,7 +54,7 @@ siluzan-cso init -d /path/to/skills # 写入自定义目录
|
|
|
54
54
|
siluzan-cso init --force # 强制覆盖已存在文件
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
> **注意**:当前为测试版(1.1.27-beta.
|
|
57
|
+
> **注意**:当前为测试版(1.1.27-beta.3),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
|
|
58
58
|
|
|
59
59
|
| 助手 | 建议 `--ai` |
|
|
60
60
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -6928,6 +6928,11 @@ function previewText(s, max = 72) {
|
|
|
6928
6928
|
if (t.length <= max) return t;
|
|
6929
6929
|
return `${t.slice(0, max)}\u2026`;
|
|
6930
6930
|
}
|
|
6931
|
+
function projectPersonaForJson(p, includeStyleGuide) {
|
|
6932
|
+
if (includeStyleGuide) return p;
|
|
6933
|
+
const { styleGuide, ...rest } = p;
|
|
6934
|
+
return { ...rest, styleGuideChars: styleGuide?.length ?? 0 };
|
|
6935
|
+
}
|
|
6931
6936
|
async function runPersonaList(options) {
|
|
6932
6937
|
const config = loadConfig(options.token);
|
|
6933
6938
|
const url = `${config.csoBaseUrl}/cso/v1/platformdata/GetPersonas`;
|
|
@@ -6963,7 +6968,9 @@ async function runPersonaList(options) {
|
|
|
6963
6968
|
}
|
|
6964
6969
|
const total = payload.totalResultCount ?? payload.results.length;
|
|
6965
6970
|
if (options.json) {
|
|
6966
|
-
|
|
6971
|
+
const includeStyleGuide = options.includeStyleGuide !== false;
|
|
6972
|
+
const results = list.map((p) => projectPersonaForJson(p, includeStyleGuide));
|
|
6973
|
+
console.log(JSON.stringify({ results, totalResultCount: total }, null, 2));
|
|
6967
6974
|
return;
|
|
6968
6975
|
}
|
|
6969
6976
|
if (list.length === 0) {
|
|
@@ -7758,13 +7765,17 @@ function registerCsoCommands(program2) {
|
|
|
7758
7765
|
}
|
|
7759
7766
|
);
|
|
7760
7767
|
const personaCmd = program2.command("persona").description("CSO \u4EBA\u8BBE\uFF1A\u67E5\u8BE2\u5E73\u53F0\u4EBA\u8BBE\u4E0E styleGuide\uFF08Markdown\uFF09");
|
|
7761
|
-
personaCmd.command("list").description("\u62C9\u53D6\u4EBA\u8BBE\u5217\u8868\uFF08POST /cso/v1/platformdata/GetPersonas\uFF0C\u4E0E Web \u7AEF\u4E00\u81F4\uFF09").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--id <id>", "\u53EA\u663E\u793A\u6307\u5B9A\u4EBA\u8BBE id").option("--name <text>", "\u6309\u4EBA\u8BBE\u540D\u79F0\u5B50\u4E32\u8FC7\u6EE4").option("--json", "\u8F93\u51FA\u5B8C\u6574 JSON\uFF08\u542B styleGuide\uFF09", false).option(
|
|
7768
|
+
personaCmd.command("list").description("\u62C9\u53D6\u4EBA\u8BBE\u5217\u8868\uFF08POST /cso/v1/platformdata/GetPersonas\uFF0C\u4E0E Web \u7AEF\u4E00\u81F4\uFF09").option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--id <id>", "\u53EA\u663E\u793A\u6307\u5B9A\u4EBA\u8BBE id").option("--name <text>", "\u6309\u4EBA\u8BBE\u540D\u79F0\u5B50\u4E32\u8FC7\u6EE4").option("--json", "\u8F93\u51FA\u5B8C\u6574 JSON\uFF08\u542B styleGuide\uFF09", false).option(
|
|
7769
|
+
"--no-style-guide",
|
|
7770
|
+
"\u642D\u914D --json\uFF1A\u7701\u7565 styleGuide\uFF0C\u4EC5\u8F93\u51FA styleGuideChars\uFF08\u5B57\u7B26\u6570\uFF09\u3002styleGuide \u901A\u5E38\u5F88\u957F\uFF0C\u5168\u91CF\u5217\u8868\u6613\u88AB\u5BBF\u4E3B bash \u5DE5\u5177\u622A\u65AD\u4E22\u8BB0\u5F55\uFF0C\u9700\u8981\u5B8C\u6574\u5185\u5BB9\u65F6\u518D\u7528 --id \u5355\u72EC\u62C9\u53D6"
|
|
7771
|
+
).option("--unicode", "\u4F7F\u7528 Unicode \u7EBF\u6846\u8868\u683C\uFF08\u9ED8\u8BA4 ASCII +-|\uFF09", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(
|
|
7762
7772
|
async (opts) => {
|
|
7763
7773
|
await runPersonaList({
|
|
7764
7774
|
token: opts.token,
|
|
7765
7775
|
id: opts.id,
|
|
7766
7776
|
name: opts.name,
|
|
7767
7777
|
json: opts.json,
|
|
7778
|
+
includeStyleGuide: opts.styleGuide,
|
|
7768
7779
|
unicode: opts.unicode,
|
|
7769
7780
|
verbose: opts.verbose
|
|
7770
7781
|
});
|
package/dist/skill/_meta.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "siluzan-cso",
|
|
3
|
-
"version": "1.1.27-beta.
|
|
4
|
-
"publishedAt":
|
|
3
|
+
"version": "1.1.27-beta.3",
|
|
4
|
+
"publishedAt": 1781076321263,
|
|
5
5
|
"homepage": "https://www.siluzan.com",
|
|
6
6
|
"source": "https://dev.azure.com/jack4it/Sammamish/_git/siluzan-skill",
|
|
7
7
|
"requiredBinaries": [
|
|
@@ -13,17 +13,29 @@
|
|
|
13
13
|
siluzan-cso persona list [选项]
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
| 选项 | 说明
|
|
17
|
-
| --------------------- |
|
|
18
|
-
| `-t, --token <token>` | 凭据(可选,默认读 `~/.siluzan/config.json`)
|
|
19
|
-
| `--id <id>` | 只显示指定人设 id
|
|
20
|
-
| `--name <text>` | 按人设名称子串过滤(客户端过滤)
|
|
21
|
-
| `--json` | 输出完整 JSON(含完整 `styleGuide`)
|
|
22
|
-
| `--
|
|
23
|
-
| `--
|
|
16
|
+
| 选项 | 说明 |
|
|
17
|
+
| --------------------- | ----------------------------------------------------------------------------- |
|
|
18
|
+
| `-t, --token <token>` | 凭据(可选,默认读 `~/.siluzan/config.json`) |
|
|
19
|
+
| `--id <id>` | 只显示指定人设 id |
|
|
20
|
+
| `--name <text>` | 按人设名称子串过滤(客户端过滤) |
|
|
21
|
+
| `--json` | 输出完整 JSON(含完整 `styleGuide`) |
|
|
22
|
+
| `--no-style-guide` | 搭配 `--json`:省略 `styleGuide`,改输出 `styleGuideChars`(字符数) |
|
|
23
|
+
| `--unicode` | 表格使用 Unicode 线框 |
|
|
24
|
+
| `--verbose` | 打印详细错误 |
|
|
24
25
|
|
|
25
26
|
终端表格仅展示 `styleGuide` 摘要;需要全文时用 `--json`。
|
|
26
27
|
|
|
28
|
+
> **⚠️ 列全量列表请优先用 `--json --no-style-guide`。** `styleGuide` 通常每条数千字,账号下人设一多,全量 `--json` 输出动辄数万字符,
|
|
29
|
+
> 极易被宿主(如 deerflow sandbox 的 `bash` 工具,默认 `bash_output_max_chars=20000`)**从中间截断**,导致列表里部分人设直接丢失。
|
|
30
|
+
> 正确姿势:先 `persona list --json --no-style-guide` 拿到完整列表(仅含 `styleGuideChars` 长度提示),选中目标后再用
|
|
31
|
+
> `persona list --id <id> --json` 单独拉那一条的完整 `styleGuide`。
|
|
32
|
+
|
|
33
|
+
`--no-style-guide` 模式下每条记录形如(去掉 `styleGuide`,新增 `styleGuideChars`):
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{ "id": "...", "personaName": "...", "taskStatus": 3, "materials": [], "styleGuideChars": 5837 }
|
|
37
|
+
```
|
|
38
|
+
|
|
27
39
|
## 命令二:保存人设到平台
|
|
28
40
|
|
|
29
41
|
```text
|
|
@@ -51,6 +63,7 @@ siluzan-cso persona create --name <名称> ( --style-guide <markdown> | --style-
|
|
|
51
63
|
siluzan-cso persona create --name "外贸老炮" --style-guide-file ./tmp-persona.md
|
|
52
64
|
```
|
|
53
65
|
3. 拿到回包里的 `id`,后续写稿时用 `siluzan-cso persona list --id <id> --json` 取全文复核。
|
|
66
|
+
(若是「先浏览全部人设再挑一个」,先 `persona list --json --no-style-guide` 看精简列表,再按 `--id` 取全文,避免长列表被宿主截断。)
|
|
54
67
|
|
|
55
68
|
## 字段说明
|
|
56
69
|
|
|
@@ -9,7 +9,7 @@ $ErrorActionPreference = 'Stop'
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
$PKG_NAME = 'siluzan-cso-cli'
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
$PKG_VERSION = '1.1.27-beta.
|
|
12
|
+
$PKG_VERSION = '1.1.27-beta.3'
|
|
13
13
|
$CLI_BIN = 'siluzan-cso'
|
|
14
14
|
$SKILL_LABEL = 'Siluzan CSO'
|
|
15
15
|
$INSTALL_CMD = 'npm install -g siluzan-cso-cli@beta'
|
|
@@ -9,7 +9,7 @@ set -euo pipefail
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
readonly PKG_NAME="siluzan-cso-cli"
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
readonly PKG_VERSION="1.1.27-beta.
|
|
12
|
+
readonly PKG_VERSION="1.1.27-beta.3"
|
|
13
13
|
readonly CLI_BIN="siluzan-cso"
|
|
14
14
|
readonly SKILL_LABEL="Siluzan CSO"
|
|
15
15
|
readonly INSTALL_CMD="npm install -g siluzan-cso-cli@beta"
|
|
@@ -35,17 +35,17 @@
|
|
|
35
35
|
|
|
36
36
|
---
|
|
37
37
|
|
|
38
|
-
## 第
|
|
38
|
+
## 第 1 步:加载人设
|
|
39
39
|
|
|
40
40
|
按以下优先级判断:
|
|
41
41
|
|
|
42
42
|
1. **用户本次提供了人设卡**(文件 / 文本 / 截图)→ 解析并校验是否符合 `persona-schema.md` → 缺字段补问 → A1 确认 → `siluzan-cso persona create` 保存 → 进入主流程
|
|
43
43
|
2. **CSO 平台已有人设** →
|
|
44
44
|
- 用户已指定人设名:`siluzan-cso persona list --name <人设名> --json`,读 `styleGuide` 字段作为人设卡。若不存在或异常,请用户核对名称。
|
|
45
|
-
-
|
|
45
|
+
- 用户未指定:请先执行 `siluzan-cso persona list`(建议不加 `--json`,或加 `--no-style-guide`,以避免内容超长导致输出被截断),将可用人设列表以 Markdown 格式展示,**务必让用户自行选择**,切勿默认或代选;用户确认后再按指定名称拉取对应人设。
|
|
46
46
|
3. **以上都没有** → 进入 `persona-onboarding.md` 引导流程(三选一:反推 / 描述 / 已有卡;都不想填则走临时人设兜底)
|
|
47
47
|
|
|
48
|
-
>
|
|
48
|
+
> 关键约束:**没有可用人设卡之前,不要进入后续步骤**。所有腔调、句式、共鸣切入点都依赖人设卡。
|
|
49
49
|
|
|
50
50
|
加载完成后,向用户明确告知:"本次使用人设:`<name>`,platform_focus = `<值>`"。
|
|
51
51
|
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
|
|
54
54
|
---
|
|
55
55
|
|
|
56
|
-
## 第
|
|
56
|
+
## 第 2 步:确定本次三库内容
|
|
57
57
|
|
|
58
58
|
按以下优先级确定本次创作使用的三库内容:
|
|
59
59
|
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
|
|
72
72
|
远端地址:https://staticpn.siluzan.com/assets/chat/thrju_sofn/
|
|
73
73
|
|
|
74
|
-
按第
|
|
74
|
+
按第 1 步已加载的 `platform_focus` 选择默认来源:
|
|
75
75
|
|
|
76
76
|
- **含 `公众号`** → 优先取公众号专属三库(`<远端地址>/packs/wechat/`):
|
|
77
77
|
- 流量因子库:<远端地址>/packs/wechat/umferdarthattasafn.md
|
|
@@ -83,27 +83,29 @@
|
|
|
83
83
|
- 产品资产库:<远端地址>/vorueignasafn.md
|
|
84
84
|
- 烹调方法库:<远端地址>/matreidsluadferdasafn.md
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
先把以上每个文件**完整下载到本地临时目录**(如 `~/.siluzan/content-library/.tmp/`),再从本地文件按需或全量读取。
|
|
87
|
+
|
|
88
|
+
> **加载完整性**:下载时必须整文件落盘(`curl -o` / `wget`),**禁止用 `head`、`tail -n`、`| head -n` 等截断管道**,否则后面的条目根本没下载到。落盘后再按需(grep 定位)或全量读取。
|
|
87
89
|
|
|
88
90
|
> **优先级说明**:公众号专属三库(`packs/wechat/`)属于优先级 3 内部的"公众号默认层",**高于全局默认、低于用户文件**,整体顺序为 **1(用户提供)> 2(用户目录)> pack(公众号专属默认)> 全局默认**。即:只要优先级 1/2 命中了三库文件,公众号也直接用它们,**不再取 pack 三库**。
|
|
89
|
-
|
|
90
|
-
>
|
|
91
|
+
|
|
92
|
+
> **内容保密**:优先级 3 的内置默认三库(含 `packs/wechat/`)是内部骨架资产,**只可用于驱动创作,严禁把其原文、条目或远端链接直接展示、粘贴或转述给用户**。用户提供(优先级 1)或用户目录(优先级 2)的三库是用户自己的内容,不受此限制。
|
|
91
93
|
|
|
92
94
|
---
|
|
93
95
|
|
|
94
|
-
## 第
|
|
96
|
+
## 第 3 步:按 platform_focus 挂载赛道包
|
|
95
97
|
|
|
96
98
|
读人设卡的 `platform_focus` 字段:
|
|
97
99
|
|
|
98
100
|
- 含 `公众号` → 加载 `packs/公众号爆款/overview.md`(黄金骨架、12 项自检、5 大传播弹药、标题模板等结构与质检规范),正文按 pack 的"黄金骨架"。**三库内容以第 1 步确定的为准**:公众号默认走 `packs/wechat/` 远端专属三库,但若优先级 1/2 已命中用户三库,则直接用用户的、不再取 pack 三库(详见第 1 步优先级说明,整体 1 > 2 > pack > 全局默认)。
|
|
99
|
-
- 含 `短视频` → 加载 `packs/短视频口播/`(overview + `口播-sop.md`),口播场景**优先走 `口播-sop.md
|
|
101
|
+
- 含 `短视频` → 加载 `packs/短视频口播/`(overview + `口播-sop.md`),口播场景**优先走 `口播-sop.md`**;三库仍取主库(第 1 步确定的三库)。
|
|
100
102
|
- 仅 `通用` → 只用主库,不挂 pack。
|
|
101
103
|
- **为空** → 询问用户本次写哪个平台,再决定挂哪个 pack。
|
|
102
104
|
- **多选** → 写稿前询问"本次主要发到哪个平台",按该平台 pack 优先。
|
|
103
105
|
|
|
104
106
|
---
|
|
105
107
|
|
|
106
|
-
## 第
|
|
108
|
+
## 第 4 步:RAG(按需)
|
|
107
109
|
|
|
108
110
|
如需从平台知识库检索品牌/产品内部素材,调用 `siluzan-cso rag query`(`-q` 内多个短词用**空格**分隔时,CLI 会分检再合并排序;详见 `references/rag.md`),结果归入主 SOP 第 4 步"拆素材"。不用于与文案无关的场景。
|
|
109
111
|
|
|
@@ -133,9 +135,9 @@
|
|
|
133
135
|
3. **以上都没有的兜底情况**:
|
|
134
136
|
- 不落盘文件,直接在对话中给出全文
|
|
135
137
|
- **文件命名**:始终采用语义化命名,例如 `<人设>-<选题>-成稿.md`。
|
|
136
|
-
-
|
|
138
|
+
- **过程与成稿分离**:SOP 执行记录、三库拆解、焊点提炼、质检记录等**过程性内容**,**禁止**混入成稿文件正文。成稿文件**只放最终可直接使用的正文**(例如可直接念的口播脚本、可直接发布的文章):
|
|
137
139
|
- 若过程性内容也需要落盘,**单独落一个文件**(如 `<人设>-<选题>-SOP执行记录.md`),与成稿文件并列;
|
|
138
|
-
-
|
|
140
|
+
- 若不需落盘,则在对话中简要展示,不要写进成稿文件里。
|
|
139
141
|
- **对话内容硬规则**:**禁止**把已落盘文件的长正文再完整粘贴到对话里,只需保留极短说明 —— 摘要、文件名 / 路径、下一步建议。
|
|
140
142
|
- 文件正文默认使用 **Markdown** 排版;若你随后进入的场景子文档(例如口播)对正文格式另有硬约束(纯文本、禁用装饰符等),**以该子文档为准**,扩展名可为 `.md` 或 `.txt` 等,但「落盘 + 按工具能力呈现」的原则仍然适用。
|
|
141
143
|
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
适用场景:账号定位是拆解型,用户提供一条高转化视频脚本,需要输出本账号口播稿。
|
|
52
52
|
|
|
53
53
|
**拆解规则**:
|
|
54
|
+
|
|
54
55
|
- 拆两三个这条脚本火的原因(反差、同频、结果感、场景感、争议点)
|
|
55
56
|
- 每次只选 1-2 个点深拆,拆透比拆全更重要
|
|
56
57
|
- 每个维度至少提供3个品类的可抄文案(不必完整,只针对所拆的点)
|
|
@@ -88,11 +89,13 @@
|
|
|
88
89
|
**用户提供了热点** → 直接用,找热点与账号定位的情绪交叉点(嫁接点)。明确回答:这个热点能带来什么情绪?和账号受众的真实处境交叉在哪里?
|
|
89
90
|
|
|
90
91
|
**用户没有提供热点** → 主动检索流量因子库:
|
|
92
|
+
|
|
91
93
|
- 优先召回 `time_sensitive = true` 的条目
|
|
92
94
|
- 按人设的受众和情绪类型过滤
|
|
93
95
|
- 召回 1-2 个候选因子,选嫁接点最自然的一个
|
|
94
96
|
|
|
95
97
|
然后从库里召回 2-4 个具体 TF 条目,明确标注:
|
|
98
|
+
|
|
96
99
|
- 每个因子的编号和名称
|
|
97
100
|
- 为什么这个因子适合这条内容
|
|
98
101
|
- 热点的分工:热点负责开头同频,其余因子负责中段支撑
|
|
@@ -104,6 +107,7 @@
|
|
|
104
107
|
### 第3步:匹配产品资产
|
|
105
108
|
|
|
106
109
|
从产品资产库里选取对应的 PA 模板:
|
|
110
|
+
|
|
107
111
|
- 明确标注选用的 PA 编号和名称
|
|
108
112
|
- 说明从这个模板里调用了哪些具体句式(开头句式、过渡句式、结尾句式)
|
|
109
113
|
- 如果有金句库或高频模块可用,一并标注
|
|
@@ -124,11 +128,11 @@
|
|
|
124
128
|
|
|
125
129
|
**焊点类型决定后续结构**:
|
|
126
130
|
|
|
127
|
-
| 焊点类型
|
|
128
|
-
|
|
129
|
-
| 这条火在"反常识"
|
|
130
|
-
| 这条火在"强结果感" | 结果开头 → 倒推为什么 → 复刻路径
|
|
131
|
-
| 这条火在"场景代入" | 场景还原 → 拆带入感 → 给模板
|
|
131
|
+
| 焊点类型 | 对应结构 |
|
|
132
|
+
| ------------------ | -------------------------------------------- |
|
|
133
|
+
| 这条火在"反常识" | 观点先行 → 拆认知差 → 给可抄句 |
|
|
134
|
+
| 这条火在"强结果感" | 结果开头 → 倒推为什么 → 复刻路径 |
|
|
135
|
+
| 这条火在"场景代入" | 场景还原 → 拆带入感 → 给模板 |
|
|
132
136
|
| 这条火在"争议立场" | 偏执观点开头 → 拆为什么有人骂有人爱 → 怎么用 |
|
|
133
137
|
|
|
134
138
|
---
|
|
@@ -136,6 +140,7 @@
|
|
|
136
140
|
### 第4.5步:焊点质检
|
|
137
141
|
|
|
138
142
|
检查:
|
|
143
|
+
|
|
139
144
|
- 焊点是不是自然(不突兀、不生硬)
|
|
140
145
|
- 价值是不是先给(内容在前,产品在后)
|
|
141
146
|
- CTA 会不会太硬
|
|
@@ -150,6 +155,7 @@
|
|
|
150
155
|
**结构由焊点类型决定,不由"写内容"这个动作决定。**
|
|
151
156
|
|
|
152
157
|
从烹调方法库明确选取:
|
|
158
|
+
|
|
153
159
|
- 结构模板(标注库中名称)
|
|
154
160
|
- 推进方式(标注库中名称)
|
|
155
161
|
- 表现手法(标注库中名称)
|
|
@@ -168,11 +174,13 @@
|
|
|
168
174
|
按「开头抓人 → 中段展开 → 结尾承接」写成可直接念的版本。
|
|
169
175
|
|
|
170
176
|
**开头三要素(至少命中2个)**:
|
|
177
|
+
|
|
171
178
|
- **价值呈现**:开头就告诉对方能得到什么
|
|
172
179
|
- **看完即得**:承诺即时回报,降低跳出
|
|
173
180
|
- **失去焦虑**:不看会错过什么(FOMO 钩子)
|
|
174
181
|
|
|
175
182
|
**写作风格要求**:
|
|
183
|
+
|
|
176
184
|
- 短句、口语、有节奏,可以直接念出来
|
|
177
185
|
- 有判断、有画面
|
|
178
186
|
- 开头 3 秒必须有同频感(让目标受众觉得"你在说我")
|
|
@@ -180,6 +188,7 @@
|
|
|
180
188
|
- 腔调按人设卡的 `tone` / `pace` / `common_phrases` / `keywords` 注入,命中 `forbidden_expressions` 立即替换
|
|
181
189
|
|
|
182
190
|
**如果是拆解类内容**,结尾必须附:
|
|
191
|
+
|
|
183
192
|
- 至少 3 个细分产品品类的可抄文案
|
|
184
193
|
- 每句遵循"先说买家处境,再说你做什么"的结构
|
|
185
194
|
- 品类由用户指定或自行判断选最贴近的
|
|
@@ -189,6 +198,7 @@
|
|
|
189
198
|
### 第7步:终稿自检
|
|
190
199
|
|
|
191
200
|
**通用自检**(必查):
|
|
201
|
+
|
|
192
202
|
- 有没有废话
|
|
193
203
|
- 有没有断层
|
|
194
204
|
- 会不会太像 AI
|
|
@@ -200,6 +210,7 @@
|
|
|
200
210
|
根据人设的受众和目标,检查内容是否符合这个账号"听起来该有的感觉"。
|
|
201
211
|
|
|
202
212
|
**六条输出质量标准**(每次生成完必须逐条核对):
|
|
213
|
+
|
|
203
214
|
1. 流量因子是否从库里取,是否标注了 TF 编号
|
|
204
215
|
2. 同频是否真正带入了受众处境(不是泛泛的情绪,是他们今天正在经历的事)
|
|
205
216
|
3. 开头三要素是否至少命中2个
|
|
@@ -211,14 +222,9 @@
|
|
|
211
222
|
|
|
212
223
|
---
|
|
213
224
|
|
|
214
|
-
## SOP
|
|
215
|
-
|
|
216
|
-
每次生成脚本,必须展示 SOP 执行记录。**SOP 执行记录是过程性内容,禁止混入成稿文件正文**——成稿文件(口播脚本)只放可直接念的脚本正文。SOP 执行记录放在成稿的**上方或下方**单独呈现(详见 `content-writer.workflow.md` 输出段「过程与成稿分离」硬规则):
|
|
217
|
-
|
|
218
|
-
- 落盘时:成稿文件只含脚本正文;SOP 执行记录另存为独立文件(如 `<人设>-<选题>-SOP执行记录.md`),或仅在对话中展示。
|
|
219
|
-
- 切勿把下面的「SOP 执行记录」段落写进口播脚本文件里。
|
|
225
|
+
## SOP执行记录
|
|
220
226
|
|
|
221
|
-
SOP
|
|
227
|
+
如用户需要SOP执行记录,请按以下格式输出:
|
|
222
228
|
|
|
223
229
|
```
|
|
224
230
|
## SOP 执行记录
|
|
@@ -234,4 +240,5 @@ SOP 执行记录格式如下:
|
|
|
234
240
|
**六条输出标准核对**:[逐条✅/❌]
|
|
235
241
|
```
|
|
236
242
|
|
|
237
|
-
|
|
243
|
+
> 仅在用户明确提出需求时输出
|
|
244
|
+
> 口播脚本正文作为独立交付物(成稿文件正文),不与上面的 SOP 执行记录写在同一文件中。
|
package/package.json
CHANGED