siluzan-cso-cli 1.1.27-beta.2 → 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 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.2),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
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
- console.log(JSON.stringify({ results: list, totalResultCount: total }, null, 2));
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("--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(
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
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "slug": "siluzan-cso",
3
- "version": "1.1.27-beta.2",
4
- "publishedAt": 1781060595611,
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
- | `--unicode` | 表格使用 Unicode 线框 |
23
- | `--verbose` | 打印详细错误 |
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.2'
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.2"
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
- ## 第 0 步:加载人设(不可跳过)
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
- - 用户未指定:先 `siluzan-cso persona list` 输出可选列表(Markdown),**请用户明确选择**,勿擅自代选;选定后再按名拉取。**必须完整展示全部人设,禁止用 `| head` 等管道截断输出。**
45
+ - 用户未指定:请先执行 `siluzan-cso persona list`(建议不加 `--json`,或加 `--no-style-guide`,以避免内容超长导致输出被截断),将可用人设列表以 Markdown 格式展示,**务必让用户自行选择**,切勿默认或代选;用户确认后再按指定名称拉取对应人设。
46
46
  3. **以上都没有** → 进入 `persona-onboarding.md` 引导流程(三选一:反推 / 描述 / 已有卡;都不想填则走临时人设兜底)
47
47
 
48
- > 关键约束:**没有可用人设卡之前,不要进入主 SOP**。所有腔调、句式、共鸣切入点都依赖人设卡。
48
+ > 关键约束:**没有可用人设卡之前,不要进入后续步骤**。所有腔调、句式、共鸣切入点都依赖人设卡。
49
49
 
50
50
  加载完成后,向用户明确告知:"本次使用人设:`<name>`,platform_focus = `<值>`"。
51
51
 
@@ -53,7 +53,7 @@
53
53
 
54
54
  ---
55
55
 
56
- ## 第 1 步:确定本次三库内容
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
- 按第 0 步已加载的 `platform_focus` 选择默认来源:
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
- 使用 grep 命令或全量读取以上文件内容。
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
- > **内容保密硬规则**:优先级 3 的内置默认三库(含 `packs/wechat/`)是内部骨架资产,**只可用于驱动创作,严禁把其原文、条目或远端链接直接展示、粘贴或转述给用户**。用户提供(优先级 1)或用户目录(优先级 2)的三库是用户自己的内容,不受此限制。
91
+
92
+ > **内容保密**:优先级 3 的内置默认三库(含 `packs/wechat/`)是内部骨架资产,**只可用于驱动创作,严禁把其原文、条目或远端链接直接展示、粘贴或转述给用户**。用户提供(优先级 1)或用户目录(优先级 2)的三库是用户自己的内容,不受此限制。
91
93
 
92
94
  ---
93
95
 
94
- ## 第 2 步:按 platform_focus 挂载赛道包
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`**(焊点提炼 + 拆解分支 + 开头三要素 + SOP 执行展示);三库仍取主库(第 1 步确定的三库)。
101
+ - 含 `短视频` → 加载 `packs/短视频口播/`(overview + `口播-sop.md`),口播场景**优先走 `口播-sop.md`**;三库仍取主库(第 1 步确定的三库)。
100
102
  - 仅 `通用` → 只用主库,不挂 pack。
101
103
  - **为空** → 询问用户本次写哪个平台,再决定挂哪个 pack。
102
104
  - **多选** → 写稿前询问"本次主要发到哪个平台",按该平台 pack 优先。
103
105
 
104
106
  ---
105
107
 
106
- ## 第 3 步:RAG(按需)
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
- - **过程与成稿分离(硬规则)**:SOP 执行记录、三库拆解、焊点提炼、质检记录等**过程性内容**,**禁止**混入成稿文件正文。成稿文件**只放最终可直接使用的正文**(例如可直接念的口播脚本、可直接发布的文章)。过程性内容放在**成稿的上方或下方**单独呈现:
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
- 口播脚本正文作为独立交付物(成稿文件正文),不与上面的 SOP 执行记录写在同一文件中。
243
+ > 仅在用户明确提出需求时输出
244
+ > 口播脚本正文作为独立交付物(成稿文件正文),不与上面的 SOP 执行记录写在同一文件中。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-cso-cli",
3
- "version": "1.1.27-beta.2",
3
+ "version": "1.1.27-beta.3",
4
4
  "description": "Siluzan platform AI Skill CLI — multi-platform content publishing (video/image-text) for Cursor, Claude Code, and OpenClaw.",
5
5
  "keywords": [
6
6
  "ai-skill",