siluzan-cso-cli 1.1.18-beta.14 → 1.1.18-beta.16

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.18-beta.14),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
57
+ > **注意**:当前为测试版(1.1.18-beta.16),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
58
58
 
59
59
  | 助手 | 建议 `--ai` |
60
60
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -6782,6 +6782,9 @@ async function runAuthorize(opts) {
6782
6782
  }
6783
6783
 
6784
6784
  // src/commands/persona.ts
6785
+ import fs11 from "fs";
6786
+ import path11 from "path";
6787
+ var MAX_PERSONA_NAME = 60;
6785
6788
  function unwrapGetPersonas(raw) {
6786
6789
  if (!raw || typeof raw !== "object") return null;
6787
6790
  if ("results" in raw && Array.isArray(raw.results)) {
@@ -6874,6 +6877,111 @@ ${hint}`);
6874
6877
  printCliTable(rows, columns, tableOpts2);
6875
6878
  console.log("\n\u63D0\u793A\uFF1A\u5B8C\u6574 styleGuide\uFF08Markdown\uFF09\u8BF7\u4F7F\u7528 --json \u67E5\u770B\u6BCF\u6761\u8BB0\u5F55\u7684 styleGuide \u5B57\u6BB5\u3002");
6876
6879
  }
6880
+ function readStyleGuideFromFile(filePath) {
6881
+ const resolved = path11.resolve(process.cwd(), filePath);
6882
+ if (!fs11.existsSync(resolved)) {
6883
+ throw new Error(`styleGuide \u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${resolved}`);
6884
+ }
6885
+ const stat = fs11.statSync(resolved);
6886
+ if (!stat.isFile()) {
6887
+ throw new Error(`styleGuide \u6587\u4EF6\u8DEF\u5F84\u4E0D\u662F\u666E\u901A\u6587\u4EF6\uFF1A${resolved}`);
6888
+ }
6889
+ return fs11.readFileSync(resolved, "utf-8");
6890
+ }
6891
+ function unwrapAddPersona(raw) {
6892
+ if (!raw || typeof raw !== "object") return null;
6893
+ const r = raw;
6894
+ if ("id" in r || "personaName" in r || "styleGuide" in r) {
6895
+ return r;
6896
+ }
6897
+ if (r.data && typeof r.data === "object") {
6898
+ return r.data;
6899
+ }
6900
+ return null;
6901
+ }
6902
+ async function runPersonaCreate(options) {
6903
+ const config = loadConfig(options.token);
6904
+ const name = (options.name || "").trim();
6905
+ if (!name) {
6906
+ console.error("\n\u274C --name \u4E0D\u80FD\u4E3A\u7A7A");
6907
+ process.exit(1);
6908
+ }
6909
+ if (name.length > MAX_PERSONA_NAME) {
6910
+ console.error(`
6911
+ \u274C \u4EBA\u8BBE\u540D\u79F0\u957F\u5EA6\u4E0D\u80FD\u8D85\u8FC7 ${MAX_PERSONA_NAME} \u5B57\u7B26`);
6912
+ process.exit(1);
6913
+ }
6914
+ const hasInline = typeof options.styleGuide === "string" && options.styleGuide.length > 0;
6915
+ const hasFile = typeof options.styleGuideFile === "string" && options.styleGuideFile.length > 0;
6916
+ if (hasInline === hasFile) {
6917
+ console.error(
6918
+ "\n\u274C \u9700\u8981\u4ECE --style-guide \u4E0E --style-guide-file \u4E8C\u9009\u4E00\u4F20\u5165 styleGuide\uFF08\u4E0D\u80FD\u540C\u65F6\u4F20\uFF0C\u4E5F\u4E0D\u80FD\u90FD\u4E0D\u4F20\uFF09"
6919
+ );
6920
+ process.exit(1);
6921
+ }
6922
+ let styleGuide;
6923
+ try {
6924
+ styleGuide = hasFile ? readStyleGuideFromFile(options.styleGuideFile) : options.styleGuide ?? "";
6925
+ } catch (e) {
6926
+ console.error(`
6927
+ \u274C ${e.message}`);
6928
+ process.exit(1);
6929
+ }
6930
+ styleGuide = styleGuide.trim();
6931
+ if (!styleGuide) {
6932
+ console.error("\n\u274C styleGuide \u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A");
6933
+ process.exit(1);
6934
+ }
6935
+ const url = `${config.csoBaseUrl}/cso/v1/platformdata/AddPersona`;
6936
+ const body = {
6937
+ personaName: name,
6938
+ styleGuide,
6939
+ materials: []
6940
+ };
6941
+ let raw;
6942
+ try {
6943
+ raw = await apiFetch2(
6944
+ url,
6945
+ config,
6946
+ {
6947
+ method: "POST",
6948
+ headers: { "Content-Type": "application/json" },
6949
+ body: JSON.stringify(body)
6950
+ },
6951
+ Boolean(options.verbose)
6952
+ );
6953
+ } catch (e) {
6954
+ const msg = e.message;
6955
+ console.error(`
6956
+ \u274C \u8BF7\u6C42\u5931\u8D25\uFF1A${msg}`);
6957
+ if (!options.verbose) console.error(" \u52A0 --verbose \u53C2\u6570\u53EF\u67E5\u770B\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F");
6958
+ process.exit(1);
6959
+ }
6960
+ const persona = unwrapAddPersona(raw);
6961
+ if (!persona || !persona.id) {
6962
+ const msg = raw && typeof raw === "object" && "message" in raw ? String(raw.message ?? "") : "";
6963
+ console.error(`
6964
+ \u274C \u4FDD\u5B58\u4EBA\u8BBE\u5931\u8D25\uFF1A${msg || "\u670D\u52A1\u7AEF\u672A\u8FD4\u56DE\u6709\u6548\u4EBA\u8BBE ID"}`);
6965
+ if (options.verbose) {
6966
+ try {
6967
+ console.error(` \u539F\u59CB\u8FD4\u56DE\uFF1A${JSON.stringify(raw)}`);
6968
+ } catch {
6969
+ console.error(` \u539F\u59CB\u8FD4\u56DE\uFF1A${String(raw)}`);
6970
+ }
6971
+ }
6972
+ process.exit(1);
6973
+ }
6974
+ const displayName = persona.personaName && persona.personaName.trim() ? persona.personaName.trim() : name;
6975
+ if (options.json) {
6976
+ console.log(JSON.stringify(persona, null, 2));
6977
+ return;
6978
+ }
6979
+ console.log(`
6980
+ \u2705 \u4EBA\u8BBE\u300C${displayName}\u300D\u5DF2\u4FDD\u5B58`);
6981
+ console.log(` \u4EBA\u8BBE ID\uFF1A${persona.id}`);
6982
+ console.log(` styleGuide \u957F\u5EA6\uFF1A${styleGuide.length} \u5B57\u7B26`);
6983
+ console.log("\n\u540E\u7EED\u53EF\u7528 siluzan-cso persona list --id <id> \u67E5\u770B\u5B8C\u6574\u5185\u5BB9\u3002");
6984
+ }
6877
6985
 
6878
6986
  // src/commands/rag.ts
6879
6987
  function splitCsv(s) {
@@ -7313,7 +7421,7 @@ async function runRagList(options) {
7313
7421
  }
7314
7422
 
7315
7423
  // src/commands/config.ts
7316
- import * as fs11 from "fs";
7424
+ import * as fs12 from "fs";
7317
7425
  function cmdConfigShow() {
7318
7426
  const shared = readSharedConfig();
7319
7427
  const envApiKey = process.env.SILUZAN_API_KEY;
@@ -7530,6 +7638,23 @@ function registerCsoCommands(program2) {
7530
7638
  });
7531
7639
  }
7532
7640
  );
7641
+ personaCmd.command("create").description(
7642
+ "\u4FDD\u5B58\u4EBA\u8BBE\u5230 CSO \u5E73\u53F0\uFF08POST /cso/v1/platformdata/AddPersona\uFF09\u3002styleGuide \u7531\u8C03\u7528\u65B9\u81EA\u884C\u751F\u6210\uFF0CCLI \u53EA\u8D1F\u8D23\u6301\u4E45\u5316"
7643
+ ).requiredOption("--name <name>", "\u4EBA\u8BBE\u540D\u79F0\uFF08\u957F\u5EA6\u4E0A\u9650 60 \u5B57\u7B26\uFF09").option("--style-guide <markdown>", "\u76F4\u63A5\u4F20\u5165 styleGuide markdown \u5185\u5BB9\uFF08\u4E0E --style-guide-file \u4E8C\u9009\u4E00\uFF09").option(
7644
+ "--style-guide-file <path>",
7645
+ "\u4ECE\u672C\u5730 markdown \u6587\u4EF6\u8BFB\u53D6 styleGuide\uFF08\u4E0E --style-guide \u4E8C\u9009\u4E00\uFF0C\u957F\u6587\u63A8\u8350\u7528\u6587\u4EF6\uFF09"
7646
+ ).option("-t, --token <token>", "Token\uFF08\u53EF\u9009\uFF1B\u4F18\u5148\u4E8E ~/.siluzan/config.json\uFF09").option("--json", "\u8F93\u51FA\u5B8C\u6574 JSON\uFF08\u65B0\u5EFA\u540E\u7684\u4EBA\u8BBE\u8BE6\u60C5\uFF09", false).option("--verbose", "\u663E\u793A\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(
7647
+ async (opts) => {
7648
+ await runPersonaCreate({
7649
+ name: opts.name,
7650
+ styleGuide: opts.styleGuide,
7651
+ styleGuideFile: opts.styleGuideFile,
7652
+ token: opts.token,
7653
+ json: opts.json,
7654
+ verbose: opts.verbose
7655
+ });
7656
+ }
7657
+ );
7533
7658
  const ragCmd = program2.command("rag").description(
7534
7659
  "RAG \u77E5\u8BC6\u5E93\u68C0\u7D22\uFF08\u4EC5\u5199\u7A3F/\u4E09\u5E93\uFF1B\u9ED8\u8BA4 belongToId=account/me \u7684 companyId\uFF0C\u9ED8\u8BA4 tags=\u4E09\u5E93\uFF09"
7535
7660
  );
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: siluzan-cso
3
- description: 内容运营平台,当用户提问的内容涉及以下三类业务时需加载此skill:(1) 内容文案生产:**口播脚本 / 公众号 / Blog 文章 / 外链文章 / 批量引流页**等多场景的文案撰写、选题、爆款拆解、人设卡生成与反推、改稿润色;(2) 多平台(仅支持:YouTube、TikTok、Instagram、LinkedIn、X、Facebook)内容发布与运营:平台账号绑定与 OAuth 授权、视频图文发布、任务管理与失败重试、播放粉丝绩效报表、**账号分组(本 skill 独有;广告账户体系不存在分组概念,用户只说"账号分组"也默认走本 skill,不要进 siluzan-tso)**、素材上传、封面截取、AI 内容规划;(3) RAG 知识库检索:品牌/产品知识库问答与文案事实依据。**如涉及账号相关操作,若账号类型(广告账号/运营媒体账号)不明确,请先询问用户,仅当确认为"运营媒体账号"时,才可使用本 skill。**
3
+ description: 当用户提问的内容涉及以下三类业务时需加载本skill:(1) 内容文案生产:选题、爆款拆解、文案撰写(生成任何文案——包括但不限于:视频脚本、博客、公众号文章、口播稿等,必须优先使用本skill,不可直接输出)、人设卡生成/反推/查询/保存、改稿润色;(2) 多平台(仅支持:YouTube、TikTok、Instagram、LinkedIn、X、Facebook)内容发布与运营:平台账号绑定与 OAuth 授权、视频图文发布、任务管理与失败重试、播放粉丝绩效报表、**账号分组(本 skill 独有;广告账户体系不存在分组概念,用户只说"账号分组"也默认走本 skill,不要进 siluzan-tso)**、素材上传、封面截取、AI 内容规划;(3) RAG 知识库检索:品牌/产品知识库问答与文案事实依据。**如涉及账号相关操作,若账号类型(广告账号/运营媒体账号)不明确,请先询问用户,仅当确认为"运营媒体账号"时,才可使用本 skill。**
4
4
  compatibility: Requires siluzan-cso-cli installed and authenticated via `siluzan-cso login`
5
5
  ---
6
6
 
@@ -91,7 +91,7 @@ Windows 注意:部分 Agent 客户端通过 PowerShell / cmd 代执行命令
91
91
  | 管理账号分组 | `references/account-group.md` |
92
92
  | AI 内容规划 | `references/planning.md` |
93
93
  | 需要给用户提供后台页面链接 | `references/web-pages.md` |
94
- | 拉取人设 / styleGuide(写稿前) | `references/persona.md` |
94
+ | 拉取人设 / styleGuide(写稿前)/ 保存人设 | `references/persona.md` |
95
95
  | 写稿时检索素材库 RAG 片段(三库拆素材等) | `references/rag.md` |
96
96
  | 选题 / 三库拆解 / 口播文案/其他文案 / 人设卡 / 代表作品反推人设 | `three-lib-content-workflow/content-writer.workflow.md` |
97
97
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "slug": "siluzan-cso",
3
- "version": "1.1.18-beta.14",
4
- "publishedAt": 1779259024084,
3
+ "version": "1.1.18-beta.16",
4
+ "publishedAt": 1779349636620,
5
5
  "homepage": "https://www.siluzan.com",
6
6
  "source": "https://dev.azure.com/jack4it/Sammamish/_git/siluzan-skill",
7
7
  "requiredBinaries": [
@@ -8,13 +8,14 @@
8
8
 
9
9
  | 章节 | 标签 | 说明 |
10
10
  | ------------------------ | ---------- | ---------------------------------------------------- |
11
- | 一、高频模块库 | `[公众号]` | "对号入座开头""失败案例插入"等是公众号长文的典型积木 |
11
+ | 一、高频模块库 | `[公众号]` | "对号入座开头""失败案例插入"等是公众号长文的典型积木(§ 1.6 身份颁奖句式跨平台通用) |
12
12
  | 二、热点借势库 | `[通用]` | 热点本身跨平台,调用方式由各平台骨架决定 |
13
13
  | 三、标题模板库 | `[通用]` | 标题钩子规律跨平台适用,仅长度需要按平台调整 |
14
14
  | 四、封面图文案库 | `[公众号]` | "封面图"是公众号专属术语;视频是封面截图,规则不同 |
15
15
  | 五、关键金句库 | `[通用]` | 金句本身通用,但具体内容仍由人设卡决定 |
16
+ | 六、视频号口播模板 | `[视频]` | 3 套高复用口播模板 + 视频号 vs 公众号创作差异速查 |
16
17
 
17
- 视频脚本用户:可参考 二 / 三 / 五,跳过 / 四。
18
+ 视频脚本用户:可参考 二 / 三 / / 六 + § 1.6 身份颁奖句式,跳过 一(除 1.6) / 四。
18
19
 
19
20
  ---
20
21
 
@@ -105,6 +106,36 @@
105
106
 
106
107
  ---
107
108
 
109
+ ### 1.6 身份颁奖句式(替读者说他想让别人知道的样子)
110
+
111
+ **核心原理**:永远不要写"你应该怎样",要写"你早就已经是怎样的人"。
112
+ 说教没人转发,颁奖大家抢着转。
113
+
114
+ **句式模板**:
115
+
116
+ ```
117
+ [特定身份] 天生 / 早就 / 总是 [一个隐含夸赞的特征]
118
+ ```
119
+
120
+ **实战样本**:
121
+
122
+ | 场景 | 应用 |
123
+ |------|------|
124
+ | 出海赛道 | "真正在工厂里的人,才看得懂这件事" |
125
+ | 出海赛道 | "能忍住不跟卖的老板,已经赢了第一步" |
126
+ | 个人成长 | "高敏感人群天生高能量" |
127
+ | 行业观察 | "还在做深度内容的博主,是真的看懂了" |
128
+ | 跨境获客 | "提前做内容的工厂,早就在客户脑子里占了位置" |
129
+
130
+ **底层心法**:
131
+
132
+ > **读者转发你的文章,不是为了你——**
133
+ > **是为了证明"我就是这种人"。**
134
+ >
135
+ > 你的工作不是教育他,是替他颁奖。
136
+
137
+ ---
138
+
108
139
  ## 二、热点借势库(按月归档) `[通用]`
109
140
 
110
141
  ### 2.1 热点档案标准字段
@@ -204,6 +235,88 @@
204
235
 
205
236
  ---
206
237
 
238
+ ## 六、视频号口播模板(3 套高复用 · 30-90 秒) `[视频]`
239
+
240
+ > 视频号和公众号底层逻辑同源(点赞 = 公开表态),
241
+ > 但口播脚本有自己的节奏。下面 3 套模板覆盖 80% 的口播场景。
242
+
243
+ ### 6.1 模板 A · 身份颁奖体(最高复用率)
244
+
245
+ ```
246
+ [钩子]:
247
+ 你有没有发现,[特定群体] 总是 [一个隐含夸赞的行为]?
248
+
249
+ [展开]:
250
+ 其实这不是巧合——
251
+ [原理 / 数据 / 故事]。
252
+
253
+ [立场]:
254
+ 所以我才说,[一个明确的强观点]。
255
+
256
+ [收尾]:
257
+ 如果你也是 [这个群体],点个赞让我知道。
258
+ ```
259
+
260
+ **适用场景**:知识科普、个人成长、行业观察类
261
+
262
+ ---
263
+
264
+ ### 6.2 模板 B · 正向重构体(避免焦虑)
265
+
266
+ ```
267
+ [钩子]:
268
+ [领域] 这件事,99% 的人都觉得是 [负面 X]。
269
+
270
+ [反转]:
271
+ 但真正做成的人都知道,这其实是 [正向 Y]。
272
+
273
+ [展开]:
274
+ [3 个具体证据 / 案例]。
275
+
276
+ [收尾]:
277
+ 那些把它当 [负面 X] 的人,永远做不成;
278
+ 把它当 [正向 Y] 的人,已经在领跑。
279
+ ```
280
+
281
+ **适用场景**:行业洞察、商业评论、方法论分享类
282
+
283
+ ---
284
+
285
+ ### 6.3 模板 C · 立场鲜明体(敢于得罪一半人)
286
+
287
+ ```
288
+ [钩子]:
289
+ 今天说句可能得罪一半人的话。
290
+
291
+ [立场]:
292
+ [强观点表态]。
293
+
294
+ [展开]:
295
+ 因为 [核心理由 + 数据 + 案例]。
296
+
297
+ [收尾]:
298
+ 同意的点赞,不同意的也欢迎,但别假装中立。
299
+ ```
300
+
301
+ **适用场景**:观点输出、价值观表达、商业判断类
302
+
303
+ ---
304
+
305
+ ### 6.4 视频号 vs 公众号 创作差异速查表
306
+
307
+ | 维度 | 视频号口播 | 公众号文案 |
308
+ |------|-----------|-----------|
309
+ | **前 3 秒** | 正向钩子("你早就是 X 了")| 反差/反派钩子 |
310
+ | **结构** | 观点先行,案例支撑 | 案例先行,观点收束 |
311
+ | **情绪曲线** | 单调上扬(爽到底)| U 型(爽 → 慌 → 爽)|
312
+ | **负面元素** | 0%(社交禁忌)| 30%-50%(焦虑钩子有效)|
313
+ | **立场强度** | 必须明确表态 | 必须明确表态 |
314
+ | **CTA** | 不需要(点赞=CTA)| 必须具体动作 |
315
+ | **长度** | 30-90 秒 | 800-1500 字 |
316
+ | **可截屏** | 标题 1 句 + 收尾 1 句 | 全文 3-5 句金句 |
317
+
318
+ ---
319
+
207
320
  ## 反哺学习闭环
208
321
 
209
322
  每写完一篇新文章后,按需要回写:
@@ -21,6 +21,8 @@
21
21
  | 六、发文前 12 项自检 | `[公众号]` |
22
22
  | 七、4 类评论区生态 | `[公众号]` |
23
23
  | 八、叠加效应 | `[通用]` |
24
+ | 九、分享层 vs 阅读层 | `[通用]` |
25
+ | 十、群体共鸣 | `[公众号]` |
24
26
 
25
27
  视频脚本用户:只读 `[通用]` 章节即可,与主库(流量因子库.md)配合使用。
26
28
 
@@ -214,7 +216,49 @@ UGC、SOP、ROI、CTR、CPS、CAC、LTV、漏斗、转化、留存、复购、B
214
216
 
215
217
  ---
216
218
 
217
- ## 九、群体共鸣(按人设动态生成) `[公众号]`
219
+ ## 九、分享层 vs 阅读层 · 双语言策略 `[通用]`
220
+
221
+ > 核心洞察:同一篇内容,**朋友圈转发出去的瞬间**和**读者点开阅读的时候**,
222
+ > 是两种完全不同的心理场景。
223
+ > 一篇真正会爆的文章,必须同时满足两套语言。
224
+
225
+ ### 9.1 两层语言的本质差异
226
+
227
+ | 层 | 心理场景 | 用户行为 | 语言策略 |
228
+ |----|---------|---------|----------|
229
+ | **分享层**(标题 / 封面 / 朋友圈分享文案) | 公开表态 | "我转发=我代言" | **必须正向**——隐含夸赞读者 |
230
+ | **阅读层**(文章正文) | 私密深读 | "我阅读=我学习" | **可以负向**——焦虑钩子、反派、痛点都有效 |
231
+
232
+ ### 9.2 双语言策略的实战公式
233
+
234
+ **同一篇文章,准备两套语言——**
235
+
236
+ - **分享版(朋友圈视角)**:正向赋能 / 身份隐含夸赞
237
+ > 例:"3 年踩过这 7 个坑,活下来的人都做对了一件事"
238
+ > (读者转发 = 公开宣告"我是活下来的")
239
+
240
+ - **阅读版(深度阅读视角)**:可以详细讲坑、立反派、制造焦虑
241
+ > 例:文章内文可以拆每一个坑、每一个失败案例、每一个反派
242
+
243
+ ### 9.3 判断原则
244
+
245
+ - 标题、封面、朋友圈分享文案 → **永远用分享层语言**(正向)
246
+ - 文章正文、引子、章节标题 → **可以用阅读层语言**(负向钩子也行)
247
+
248
+ **这个差异之前没区分**——大部分写公众号的人把"焦虑钩子"放到了标题里,
249
+ 直接断了朋友圈传播链路。
250
+
251
+ ### 9.4 反例 vs 正例
252
+
253
+ | 反例(焦虑式标题,转发率低)❌ | 正例(颁奖式标题,转发率高)✅ |
254
+ |-------------------------------|-------------------------------|
255
+ | 90% 的出海老板都死在做品牌上 | 5000 个出海老板里,活下来的都做对了这一件事 |
256
+ | 你的工厂正在被淘汰 | 真正在闷头做产品的工厂,已经赢了第一步 |
257
+ | 创业 7 个坑 | 创业三年,我收获了 7 个锦囊 |
258
+
259
+ ---
260
+
261
+ ## 十、群体共鸣(按人设动态生成) `[公众号]`
218
262
 
219
263
  ### TF-0028 群体共鸣
220
264
 
@@ -15,6 +15,7 @@
15
15
  | 五、人设类账号 4 个增效器 | `[通用]` | 第一人称感、口头禅、私人词典等跨平台适用 |
16
16
  | 六、爆款率叠加公式 | `[通用]` | 弧线 × 叠加 × 自检 的方法论跨平台 |
17
17
  | 七、调味自由度 | `[通用]` | 人设决定调味的设计原则跨平台 |
18
+ | 八、颁奖 vs 说教 | `[通用]` | 二选一原则——人设类账号写作的致命底线 |
18
19
 
19
20
  ### 6 种叙事弧线的平台归属
20
21
 
@@ -340,3 +341,51 @@ Step 4: 改完跑一遍局部自检
340
341
  **核心原则**:菜谱不变,调味全由人设卡决定。
341
342
 
342
343
  更换人设卡,文章就能自动换一套皮肤。
344
+
345
+ ---
346
+
347
+ ## 八、颁奖 vs 说教 · 二选一原则 `[通用]`
348
+
349
+ > 这是写人设类账号最容易踩、又最致命的一个坑。
350
+ > 跨平台通用——视频号、公众号、小红书全都适用。
351
+
352
+ ### 8.1 两种语态的本质差异
353
+
354
+ | 语态 | 对读者说什么 | 读者感受 | 转发率 |
355
+ |------|-------------|---------|--------|
356
+ | **说教** | "你应该 / 你需要 / 你必须" | 被指挥、被评判 | 极低 |
357
+ | **颁奖** | "你早就是 / 你已经在 / 你天生就" | 被看见、被肯定 | 极高 |
358
+
359
+ ### 8.2 二选一原则
360
+
361
+ > **永远不要写"你应该怎样"。**
362
+ > **要写"你已经是怎样的人"。**
363
+ >
364
+ > 说教没人转发,颁奖大家抢着转。
365
+
366
+ ### 8.3 改写对照表
367
+
368
+ | 说教句(❌)| 颁奖句(✅)|
369
+ |------------|------------|
370
+ | 你应该提前布局海外市场 | 提前布局海外市场的老板,已经吃到了第一波红利 |
371
+ | 你必须用 AI 提效 | 已经在用 AI 的团队,效率早就甩开同行一倍 |
372
+ | 你不能只投搜索广告 | 真正会做投放的人,早就把战场往前移了 |
373
+ | 你要学会做内容 | 在做内容的工厂,正在变成下一波出海赢家 |
374
+ | 不要执着做品牌 | 先赚到钱的老板,才有资格谈品牌 |
375
+
376
+ ### 8.4 为什么"颁奖"比"说教"传播率高 10 倍
377
+
378
+ | 心理机制 | 说教式 | 颁奖式 |
379
+ |---------|--------|-------|
380
+ | **读者第一反应** | "凭什么你来教我?" | "对,我就是这种人。" |
381
+ | **转发动机** | 几乎为 0 | "我转发=我对号入座" |
382
+ | **身份感** | 被矮化 | 被加冕 |
383
+ | **社交价值** | 负值 | 正值 |
384
+
385
+ ### 8.5 一句话铁律
386
+
387
+ > **读者转发你的文章,不是为了你——**
388
+ > **是为了证明"我就是这种人"。**
389
+ >
390
+ > **你的工作不是教育他,是替他颁奖。**
391
+
@@ -1,8 +1,13 @@
1
- # persona:人设列表(GetPersonas)
1
+ # persona:人设查询与保存(GetPersonas / AddPersona
2
2
 
3
- 对应 Web / MarkAI `getPersonas()`:`POST {csoBaseUrl}/cso/v1/platformdata/GetPersonas`,请求体 `{}`。返回人设列表,含 **`styleGuide`**(Markdown 风格指南)、`materials`、`taskStatus` 等,供文案与三库工作流使用。
3
+ 对应 Web / MarkAI `getPersonas()`、`addPersona()`:
4
4
 
5
- ## 命令
5
+ - 列表:`POST {csoBaseUrl}/cso/v1/platformdata/GetPersonas`,请求体 `{}`
6
+ - 新建:`POST {csoBaseUrl}/cso/v1/platformdata/AddPersona`,请求体 `{ personaName, styleGuide, materials: [] }`
7
+
8
+ 返回人设含 **`styleGuide`**(Markdown 风格指南)、`materials`、`taskStatus` 等,供文案与三库工作流使用。
9
+
10
+ ## 命令一:查询人设列表
6
11
 
7
12
  ```text
8
13
  siluzan-cso persona list [选项]
@@ -17,17 +22,47 @@ siluzan-cso persona list [选项]
17
22
  | `--unicode` | 表格使用 Unicode 线框 |
18
23
  | `--verbose` | 打印详细错误 |
19
24
 
25
+ 终端表格仅展示 `styleGuide` 摘要;需要全文时用 `--json`。
26
+
27
+ ## 命令二:保存人设到平台
28
+
29
+ ```text
30
+ siluzan-cso persona create --name <名称> ( --style-guide <markdown> | --style-guide-file <path> ) [选项]
31
+ ```
32
+
33
+ | 选项 | 说明 |
34
+ | ----------------------------- | -------------------------------------------------------------------------- |
35
+ | `--name <name>` | **必填**。人设名称,长度上限 60 字符 |
36
+ | `--style-guide <markdown>` | 直接传入 styleGuide markdown 内容(与 `--style-guide-file` 二选一) |
37
+ | `--style-guide-file <path>` | 从本地 markdown 文件读取 styleGuide(长文推荐用文件,与 `--style-guide` 二选一) |
38
+ | `-t, --token <token>` | 凭据(可选) |
39
+ | `--json` | 输出完整 JSON(新建后的人设详情,含返回 `id`) |
40
+ | `--verbose` | 打印详细错误 |
41
+
42
+ > **CLI 不会替你生成 styleGuide**。AI 助手在调用本命令前,应先按
43
+ > `three-lib-content-workflow/persona-reverse-sop.md` 的 SOP 把 styleGuide 写好(Markdown 格式),再用
44
+ > `--style-guide-file` 把文件喂给 CLI。这样保持 CLI 只做平台持久化、不依赖外部 LLM 的设计。
45
+
46
+ ### 典型用法
47
+
48
+ 1. AI 助手先把 styleGuide 写到临时文件,如 `./tmp-persona.md`
49
+ 2. 调命令保存:
50
+ ```text
51
+ siluzan-cso persona create --name "外贸老炮" --style-guide-file ./tmp-persona.md
52
+ ```
53
+ 3. 拿到回包里的 `id`,后续写稿时用 `siluzan-cso persona list --id <id> --json` 取全文复核。
54
+
20
55
  ## 字段说明
21
56
 
22
57
  | 字段 | 含义 |
23
58
  | ------------- | ----------------------------------------------------- |
24
59
  | `personaName` | 人设名称 |
25
60
  | `styleGuide` | 风格指南正文(Markdown) |
26
- | `materials` | 参考素材(文件名、URL 等) |
61
+ | `materials` | 参考素材(文件名、URL 等),新建时固定传空数组 |
27
62
  | `taskStatus` | `1` 待生成 · `2` 生成中 · `3` 生成完成 · `4` 生成失败 |
28
63
 
29
- 终端表格仅展示 `styleGuide` 摘要;需要全文时用 `--json`。
30
-
31
64
  ## 与 Skill 的关系
32
65
 
33
- 编写口播/成稿前应先拿到目标人设的 `styleGuide`,再结合 `three-lib-content-workflow/` 中的 SOP。详见上级 `SKILL.md`「三库内容工作流」。
66
+ 编写口播/成稿前应先拿到目标人设的 `styleGuide`,再结合 `three-lib-content-workflow/` 中的 SOP
67
+ 若用户要求「新建一个人设」,先按 `persona-reverse-sop.md` 反推风格指南、确认无误后再用 `persona create` 写回平台。
68
+ 详见上级 `SKILL.md`「三库内容工作流」。
@@ -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.18-beta.14'
12
+ $PKG_VERSION = '1.1.18-beta.16'
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.18-beta.14"
12
+ readonly PKG_VERSION="1.1.18-beta.16"
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"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-cso-cli",
3
- "version": "1.1.18-beta.14",
3
+ "version": "1.1.18-beta.16",
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",