siluzan-cso-cli 1.0.0-beta.40 → 1.0.0-beta.41

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
@@ -20,7 +20,7 @@ siluzan-cso init -d /path/to/skills # 写入自定义目录
20
20
  siluzan-cso init --force # 强制覆盖已存在文件
21
21
  ```
22
22
 
23
- > **注意**:当前为测试版(1.0.0-beta.40),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
23
+ > **注意**:当前为测试版(1.0.0-beta.41),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
24
24
 
25
25
  | 助手 | 建议 `--ai` |
26
26
  |------|-------------|
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env -S node --disable-warning=ExperimentalWarning
2
2
  import {
3
3
  __commonJS,
4
4
  __toESM,
@@ -4164,7 +4164,7 @@ async function runPublish(options) {
4164
4164
  currentUserId = meUser.entityId;
4165
4165
  }
4166
4166
  }
4167
- const now = nowUtc();
4167
+ const now2 = nowUtc();
4168
4168
  const uniqueActionId = guid();
4169
4169
  const taskName = input.taskName ?? defaultTaskName();
4170
4170
  const isDomestic = input.isDomesticTrade ?? false;
@@ -4203,8 +4203,8 @@ async function runPublish(options) {
4203
4203
  videoType,
4204
4204
  csoPlatformType,
4205
4205
  publishTimeSetting: {},
4206
- actionStartTime: now,
4207
- actionStopTime: now,
4206
+ actionStartTime: now2,
4207
+ actionStopTime: now2,
4208
4208
  version: "v3"
4209
4209
  };
4210
4210
  if (options.dryRun) {
@@ -5021,9 +5021,9 @@ async function runReportRecords(options) {
5021
5021
  console.log();
5022
5022
  }
5023
5023
  function defaultDownloadPath(recordId) {
5024
- const now = /* @__PURE__ */ new Date();
5024
+ const now2 = /* @__PURE__ */ new Date();
5025
5025
  const pad = (n) => String(n).padStart(2, "0");
5026
- const name = `operations-report-${recordId}-${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}.pdf`;
5026
+ const name = `operations-report-${recordId}-${now2.getFullYear()}${pad(now2.getMonth() + 1)}${pad(now2.getDate())}-${pad(now2.getHours())}${pad(now2.getMinutes())}${pad(now2.getSeconds())}.pdf`;
5027
5027
  return path8.resolve(process.cwd(), name);
5028
5028
  }
5029
5029
  async function downloadFile(url, output) {
@@ -5839,16 +5839,16 @@ function formatDateRange(datePreset, startDateInput, endDateInput) {
5839
5839
  if (!datePreset || datePreset === "all") {
5840
5840
  return { startDate: "", endDate: "" };
5841
5841
  }
5842
- const now = /* @__PURE__ */ new Date();
5843
- const start = new Date(now);
5844
- if (datePreset === "week") start.setDate(now.getDate() - 7);
5845
- if (datePreset === "month") start.setMonth(now.getMonth() - 1);
5846
- if (datePreset === "year") start.setFullYear(now.getFullYear() - 1);
5842
+ const now2 = /* @__PURE__ */ new Date();
5843
+ const start = new Date(now2);
5844
+ if (datePreset === "week") start.setDate(now2.getDate() - 7);
5845
+ if (datePreset === "month") start.setMonth(now2.getMonth() - 1);
5846
+ if (datePreset === "year") start.setFullYear(now2.getFullYear() - 1);
5847
5847
  const pad = (v) => String(v).padStart(2, "0");
5848
5848
  const fmt = (d) => `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
5849
5849
  return {
5850
5850
  startDate: `${fmt(start)} 00:00:00`,
5851
- endDate: `${fmt(now)} 23:59:59`
5851
+ endDate: `${fmt(now2)} 23:59:59`
5852
5852
  };
5853
5853
  }
5854
5854
  function createQueryString3(query) {
@@ -6530,8 +6530,306 @@ async function runRagQuery(options) {
6530
6530
  ${header}${body}`);
6531
6531
  }
6532
6532
 
6533
- // src/commands/config.ts
6533
+ // src/commands/library.ts
6534
+ import { DatabaseSync } from "node:sqlite";
6534
6535
  import * as fs10 from "fs";
6536
+ import * as path10 from "path";
6537
+ import * as os6 from "os";
6538
+ var DB_DIR = path10.join(os6.homedir(), ".siluzan");
6539
+ var DB_PATH = path10.join(DB_DIR, "libraries.db");
6540
+ var TYPE_PREFIX = { traffic: "TF", product: "PA", cooking: "CK" };
6541
+ var TYPE_LABEL = { traffic: "\u6D41\u91CF\u56E0\u5B50\u5E93", product: "\u4EA7\u54C1\u8D44\u4EA7\u5E93", cooking: "\u70F9\u8C03\u65B9\u6CD5\u5E93" };
6542
+ function openDb() {
6543
+ fs10.mkdirSync(DB_DIR, { recursive: true });
6544
+ const db = new DatabaseSync(DB_PATH);
6545
+ initSchema(db);
6546
+ return db;
6547
+ }
6548
+ function initSchema(db) {
6549
+ db.exec(`
6550
+ CREATE TABLE IF NOT EXISTS library_entries (
6551
+ id TEXT PRIMARY KEY,
6552
+ library_type TEXT NOT NULL,
6553
+ title TEXT NOT NULL,
6554
+ summary TEXT,
6555
+ content TEXT,
6556
+ tags TEXT,
6557
+ status TEXT DEFAULT 'active',
6558
+ use_count INTEGER DEFAULT 0,
6559
+ last_used_at TEXT,
6560
+ effectiveness REAL,
6561
+ agent_notes TEXT,
6562
+ extra TEXT,
6563
+ created_at TEXT NOT NULL,
6564
+ updated_at TEXT NOT NULL
6565
+ );
6566
+ CREATE INDEX IF NOT EXISTS idx_lib_type ON library_entries(library_type);
6567
+ CREATE INDEX IF NOT EXISTS idx_lib_status ON library_entries(status);
6568
+ `);
6569
+ }
6570
+ function nextId(db, type) {
6571
+ const prefix = TYPE_PREFIX[type];
6572
+ const row = db.prepare(
6573
+ `SELECT id FROM library_entries WHERE library_type = ? ORDER BY id DESC LIMIT 1`
6574
+ ).get(type);
6575
+ if (!row) return `${prefix}-0001`;
6576
+ const num = parseInt(row.id.split("-")[1] ?? "0", 10) + 1;
6577
+ return `${prefix}-${String(num).padStart(4, "0")}`;
6578
+ }
6579
+ function now() {
6580
+ return (/* @__PURE__ */ new Date()).toISOString();
6581
+ }
6582
+ function runLibraryInit(opts) {
6583
+ const db = openDb();
6584
+ db.close();
6585
+ if (opts.json) {
6586
+ console.log(JSON.stringify({ ok: true, path: DB_PATH }));
6587
+ } else {
6588
+ console.log(`\u2705 \u4E09\u5E93\u6570\u636E\u5E93\u5DF2\u521D\u59CB\u5316\uFF1A${DB_PATH}`);
6589
+ }
6590
+ }
6591
+ function runLibrarySearch(opts) {
6592
+ const db = openDb();
6593
+ const q = `%${opts.query}%`;
6594
+ const limit = opts.limit ?? 10;
6595
+ let sql = `SELECT * FROM library_entries WHERE status != 'archived' AND (title LIKE ? OR summary LIKE ? OR content LIKE ?)`;
6596
+ const params = [q, q, q];
6597
+ if (opts.type) {
6598
+ sql += ` AND library_type = ?`;
6599
+ params.push(opts.type);
6600
+ }
6601
+ if (opts.tag) {
6602
+ sql += ` AND tags LIKE ?`;
6603
+ params.push(`%${opts.tag}%`);
6604
+ }
6605
+ sql += ` ORDER BY use_count DESC, effectiveness DESC NULLS LAST LIMIT ?`;
6606
+ params.push(limit);
6607
+ const rows = db.prepare(sql).all(...params);
6608
+ db.close();
6609
+ if (opts.json) {
6610
+ console.log(JSON.stringify(rows, null, 2));
6611
+ return;
6612
+ }
6613
+ if (rows.length === 0) {
6614
+ console.log("\u65E0\u5339\u914D\u7ED3\u679C");
6615
+ return;
6616
+ }
6617
+ printSearchResults(rows);
6618
+ }
6619
+ function runLibraryList(opts) {
6620
+ const db = openDb();
6621
+ const status = opts.status ?? "active";
6622
+ const sort = opts.sort ?? "created_at";
6623
+ const limit = opts.limit ?? 50;
6624
+ let sql = `SELECT * FROM library_entries WHERE status = ?`;
6625
+ const params = [status];
6626
+ if (opts.type) {
6627
+ sql += ` AND library_type = ?`;
6628
+ params.push(opts.type);
6629
+ }
6630
+ sql += ` ORDER BY ${sort} DESC LIMIT ?`;
6631
+ params.push(limit);
6632
+ const rows = db.prepare(sql).all(...params);
6633
+ db.close();
6634
+ if (opts.json) {
6635
+ console.log(JSON.stringify(rows, null, 2));
6636
+ return;
6637
+ }
6638
+ if (rows.length === 0) {
6639
+ console.log("\u6682\u65E0\u6761\u76EE");
6640
+ return;
6641
+ }
6642
+ printSearchResults(rows);
6643
+ }
6644
+ function runLibraryGet(opts) {
6645
+ const db = openDb();
6646
+ const row = db.prepare(`SELECT * FROM library_entries WHERE id = ?`).get(opts.id);
6647
+ db.close();
6648
+ if (!row) {
6649
+ console.error(`\u274C \u672A\u627E\u5230\u6761\u76EE\uFF1A${opts.id}`);
6650
+ process.exit(1);
6651
+ }
6652
+ if (opts.json) {
6653
+ console.log(JSON.stringify(row, null, 2));
6654
+ return;
6655
+ }
6656
+ console.log(`
6657
+ \u3010${row.id}\u3011${row.title}`);
6658
+ console.log(`\u5E93\uFF1A${TYPE_LABEL[row.library_type]} \u72B6\u6001\uFF1A${row.status} \u4F7F\u7528\u6B21\u6570\uFF1A${row.use_count} \u6548\u679C\u8BC4\u5206\uFF1A${row.effectiveness ?? "\u672A\u8BC4\u5206"}`);
6659
+ if (row.summary) console.log(`
6660
+ \u6458\u8981\uFF1A${row.summary}`);
6661
+ if (row.content) console.log(`
6662
+ \u5185\u5BB9\uFF1A
6663
+ ${row.content}`);
6664
+ if (row.tags) {
6665
+ const tags = JSON.parse(row.tags);
6666
+ if (tags.length) console.log(`
6667
+ \u6807\u7B7E\uFF1A${tags.join("\u3001")}`);
6668
+ }
6669
+ if (row.agent_notes) console.log(`
6670
+ Agent \u7B14\u8BB0\uFF1A${row.agent_notes}`);
6671
+ console.log();
6672
+ }
6673
+ function runLibraryAdd(opts) {
6674
+ const db = openDb();
6675
+ const id = nextId(db, opts.type);
6676
+ const ts = now();
6677
+ const tags = opts.tags ? JSON.stringify(opts.tags.split(/[,,、]/).map((t) => t.trim()).filter(Boolean)) : null;
6678
+ db.prepare(`
6679
+ INSERT INTO library_entries (id, library_type, title, summary, content, tags, status, use_count, agent_notes, extra, created_at, updated_at)
6680
+ VALUES (?, ?, ?, ?, ?, ?, 'active', 0, ?, NULL, ?, ?)
6681
+ `).run(id, opts.type, opts.title, opts.summary ?? null, opts.content ?? null, tags, opts.notes ?? null, ts, ts);
6682
+ db.close();
6683
+ if (opts.json) {
6684
+ console.log(JSON.stringify({ ok: true, id }));
6685
+ } else {
6686
+ console.log(`\u2705 \u5DF2\u65B0\u589E\u6761\u76EE ${id}\uFF1A${opts.title}`);
6687
+ }
6688
+ }
6689
+ function runLibraryUpdate(opts) {
6690
+ const db = openDb();
6691
+ const row = db.prepare(`SELECT * FROM library_entries WHERE id = ?`).get(opts.id);
6692
+ if (!row) {
6693
+ console.error(`\u274C \u672A\u627E\u5230\u6761\u76EE\uFF1A${opts.id}`);
6694
+ db.close();
6695
+ process.exit(1);
6696
+ }
6697
+ const sets = [];
6698
+ const params = [];
6699
+ if (opts.title !== void 0) {
6700
+ sets.push("title = ?");
6701
+ params.push(opts.title);
6702
+ }
6703
+ if (opts.summary !== void 0) {
6704
+ sets.push("summary = ?");
6705
+ params.push(opts.summary);
6706
+ }
6707
+ if (opts.content !== void 0) {
6708
+ sets.push("content = ?");
6709
+ params.push(opts.content);
6710
+ }
6711
+ if (opts.tags !== void 0) {
6712
+ const tags = JSON.stringify(opts.tags.split(/[,,、]/).map((t) => t.trim()).filter(Boolean));
6713
+ sets.push("tags = ?");
6714
+ params.push(tags);
6715
+ }
6716
+ if (opts.status !== void 0) {
6717
+ sets.push("status = ?");
6718
+ params.push(opts.status);
6719
+ }
6720
+ if (opts.score !== void 0) {
6721
+ sets.push("effectiveness = ?");
6722
+ params.push(parseFloat(opts.score));
6723
+ }
6724
+ if (opts.notes !== void 0) {
6725
+ sets.push("agent_notes = ?");
6726
+ params.push(opts.notes);
6727
+ }
6728
+ if (sets.length === 0) {
6729
+ console.log("\u65E0\u9700\u66F4\u65B0");
6730
+ db.close();
6731
+ return;
6732
+ }
6733
+ sets.push("updated_at = ?");
6734
+ params.push(now());
6735
+ params.push(opts.id);
6736
+ db.prepare(`UPDATE library_entries SET ${sets.join(", ")} WHERE id = ?`).run(...params);
6737
+ db.close();
6738
+ if (opts.json) {
6739
+ console.log(JSON.stringify({ ok: true, id: opts.id, updated: sets.length - 1 }));
6740
+ } else {
6741
+ console.log(`\u2705 \u5DF2\u66F4\u65B0\u6761\u76EE ${opts.id}`);
6742
+ }
6743
+ }
6744
+ function runLibraryUse(opts) {
6745
+ const db = openDb();
6746
+ const row = db.prepare(`SELECT id FROM library_entries WHERE id = ?`).get(opts.id);
6747
+ if (!row) {
6748
+ console.error(`\u274C \u672A\u627E\u5230\u6761\u76EE\uFF1A${opts.id}`);
6749
+ db.close();
6750
+ process.exit(1);
6751
+ }
6752
+ db.prepare(`UPDATE library_entries SET use_count = use_count + 1, last_used_at = ?, updated_at = ? WHERE id = ?`).run(now(), now(), opts.id);
6753
+ db.close();
6754
+ if (opts.json) {
6755
+ console.log(JSON.stringify({ ok: true, id: opts.id }));
6756
+ } else {
6757
+ console.log(`\u2705 \u5DF2\u8BB0\u5F55\u4F7F\u7528\uFF1A${opts.id}`);
6758
+ }
6759
+ }
6760
+ function runLibraryRetire(opts) {
6761
+ const db = openDb();
6762
+ const row = db.prepare(`SELECT id FROM library_entries WHERE id = ?`).get(opts.id);
6763
+ if (!row) {
6764
+ console.error(`\u274C \u672A\u627E\u5230\u6761\u76EE\uFF1A${opts.id}`);
6765
+ db.close();
6766
+ process.exit(1);
6767
+ }
6768
+ const ts = now();
6769
+ const notes = opts.reason ? `[\u5F52\u6863] ${opts.reason}` : "[\u5F52\u6863]";
6770
+ db.prepare(`UPDATE library_entries SET status = 'archived', agent_notes = ?, updated_at = ? WHERE id = ?`).run(notes, ts, opts.id);
6771
+ db.close();
6772
+ if (opts.json) {
6773
+ console.log(JSON.stringify({ ok: true, id: opts.id, status: "archived" }));
6774
+ } else {
6775
+ console.log(`\u2705 \u5DF2\u5F52\u6863\u6761\u76EE ${opts.id}${opts.reason ? `\uFF08\u539F\u56E0\uFF1A${opts.reason}\uFF09` : ""}`);
6776
+ }
6777
+ }
6778
+ function runLibraryStats(opts) {
6779
+ const db = openDb();
6780
+ let typeFilter = opts.type ? `AND library_type = '${opts.type}'` : "";
6781
+ const total = db.prepare(`SELECT COUNT(*) as n FROM library_entries WHERE status = 'active' ${typeFilter}`).get().n;
6782
+ const archived = db.prepare(`SELECT COUNT(*) as n FROM library_entries WHERE status = 'archived' ${typeFilter}`).get().n;
6783
+ const topUsed = db.prepare(`SELECT id, title, library_type, use_count FROM library_entries WHERE status = 'active' ${typeFilter} ORDER BY use_count DESC LIMIT 5`).all();
6784
+ const topEffective = db.prepare(`SELECT id, title, library_type, effectiveness FROM library_entries WHERE status = 'active' AND effectiveness IS NOT NULL ${typeFilter} ORDER BY effectiveness DESC LIMIT 5`).all();
6785
+ const unused = db.prepare(`SELECT id, title, library_type FROM library_entries WHERE status = 'active' AND use_count = 0 ${typeFilter} LIMIT 10`).all();
6786
+ const byType = db.prepare(`SELECT library_type, COUNT(*) as n FROM library_entries WHERE status = 'active' ${typeFilter} GROUP BY library_type`).all();
6787
+ db.close();
6788
+ if (opts.json) {
6789
+ console.log(JSON.stringify({ total, archived, byType, topUsed, topEffective, unused }, null, 2));
6790
+ return;
6791
+ }
6792
+ console.log(`
6793
+ \u{1F4CA} \u4E09\u5E93\u7EDF\u8BA1${opts.type ? `\uFF08${TYPE_LABEL[opts.type]}\uFF09` : ""}`);
6794
+ console.log(` \u6D3B\u8DC3\u6761\u76EE\uFF1A${total} \u5DF2\u5F52\u6863\uFF1A${archived}`);
6795
+ if (byType.length) {
6796
+ console.log("\n \u5404\u5E93\u5206\u5E03\uFF1A");
6797
+ for (const r of byType) console.log(` \xB7 ${TYPE_LABEL[r.library_type]}\uFF1A${r.n} \u6761`);
6798
+ }
6799
+ if (topUsed.length) {
6800
+ console.log("\n \u{1F525} \u4F7F\u7528\u6700\u591A\uFF08Top 5\uFF09\uFF1A");
6801
+ for (const r of topUsed) console.log(` \xB7 [${r.id}] ${r.title}\uFF08${r.use_count} \u6B21\uFF09`);
6802
+ }
6803
+ if (topEffective.length) {
6804
+ console.log("\n \u2B50 \u6548\u679C\u6700\u4F73\uFF08Top 5\uFF09\uFF1A");
6805
+ for (const r of topEffective) console.log(` \xB7 [${r.id}] ${r.title}\uFF08${(r.effectiveness * 100).toFixed(0)}%\uFF09`);
6806
+ }
6807
+ if (unused.length) {
6808
+ console.log(`
6809
+ \u{1F4A4} \u4ECE\u672A\u4F7F\u7528\uFF08${unused.length} \u6761\uFF0C\u5EFA\u8BAE\u68C0\u67E5\u6216\u5F52\u6863\uFF09\uFF1A`);
6810
+ for (const r of unused) console.log(` \xB7 [${r.id}] ${r.title}`);
6811
+ }
6812
+ console.log();
6813
+ }
6814
+ function printSearchResults(rows) {
6815
+ console.log(`
6816
+ \u5171 ${rows.length} \u6761\u7ED3\u679C\uFF1A
6817
+ `);
6818
+ for (const r of rows) {
6819
+ const score = r.effectiveness !== null ? ` | \u6548\u679C ${(r.effectiveness * 100).toFixed(0)}%` : "";
6820
+ const used = r.use_count > 0 ? ` | \u4F7F\u7528 ${r.use_count} \u6B21` : "";
6821
+ console.log(`\u3010${r.id}\u3011${r.title} (${TYPE_LABEL[r.library_type]}${score}${used})`);
6822
+ if (r.summary) console.log(` ${r.summary}`);
6823
+ if (r.tags) {
6824
+ const tags = JSON.parse(r.tags);
6825
+ if (tags.length) console.log(` \u6807\u7B7E\uFF1A${tags.slice(0, 6).join("\u3001")}`);
6826
+ }
6827
+ console.log();
6828
+ }
6829
+ }
6830
+
6831
+ // src/commands/config.ts
6832
+ import * as fs11 from "fs";
6535
6833
  function cmdConfigShow() {
6536
6834
  const shared = readSharedConfig();
6537
6835
  if (!shared.authToken && !shared.apiKey) {
@@ -6722,6 +7020,43 @@ personaCmd.command("list").description("\u62C9\u53D6\u4EBA\u8BBE\u5217\u8868\uFF
6722
7020
  verbose: opts.verbose
6723
7021
  });
6724
7022
  });
7023
+ var libraryCmd = program.command("library").description("\u4E09\u5E93\u672C\u5730 SQLite \u7BA1\u7406\uFF08~/.siluzan/libraries.db\uFF09\uFF1A\u521D\u59CB\u5316\u3001\u5BFC\u5165\u3001\u68C0\u7D22\u3001Agent \u81EA\u7EF4\u62A4");
7024
+ libraryCmd.command("init").description("\u521D\u59CB\u5316\u4E09\u5E93\u6570\u636E\u5E93\uFF08~/.siluzan/libraries.db\uFF09\uFF0C\u5DF2\u5B58\u5728\u65F6\u8DF3\u8FC7").option("--json", "\u4EE5 JSON \u8F93\u51FA", false).action((opts) => runLibraryInit(opts));
7025
+ libraryCmd.command("search").description("\u5168\u6587\u68C0\u7D22\u4E09\u5E93\u6761\u76EE\uFF08title + summary + content\uFF09").requiredOption("-q, --query <text>", "\u68C0\u7D22\u5173\u952E\u8BCD").option("--type <traffic|product|cooking>", "\u9650\u5B9A\u5E93\u7C7B\u578B").option("--tag <tag>", "\u6309\u6807\u7B7E\u8FC7\u6EE4").option("--limit <n>", "\u8FD4\u56DE\u6761\u6570\uFF08\u9ED8\u8BA4 10\uFF09", "10").option("--json", "\u4EE5 JSON \u8F93\u51FA", false).action((opts) => {
7026
+ runLibrarySearch({
7027
+ query: opts.query,
7028
+ type: opts.type,
7029
+ tag: opts.tag,
7030
+ limit: opts.limit ? parseInt(opts.limit, 10) : void 0,
7031
+ json: opts.json
7032
+ });
7033
+ });
7034
+ libraryCmd.command("list").description("\u5217\u51FA\u4E09\u5E93\u6761\u76EE\uFF08\u53EF\u6309\u5E93\u7C7B\u578B/\u72B6\u6001/\u6392\u5E8F\u7B5B\u9009\uFF09").option("--type <traffic|product|cooking>", "\u9650\u5B9A\u5E93\u7C7B\u578B").option("--status <active|archived|draft>", "\u72B6\u6001\uFF08\u9ED8\u8BA4 active\uFF09", "active").option("--sort <use_count|effectiveness|created_at>", "\u6392\u5E8F\u5B57\u6BB5\uFF08\u9ED8\u8BA4 created_at\uFF09", "created_at").option("--limit <n>", "\u8FD4\u56DE\u6761\u6570\uFF08\u9ED8\u8BA4 50\uFF09", "50").option("--json", "\u4EE5 JSON \u8F93\u51FA", false).action((opts) => {
7035
+ runLibraryList({
7036
+ type: opts.type,
7037
+ status: opts.status,
7038
+ sort: opts.sort,
7039
+ limit: opts.limit ? parseInt(opts.limit, 10) : void 0,
7040
+ json: opts.json
7041
+ });
7042
+ });
7043
+ libraryCmd.command("get").description("\u67E5\u770B\u5355\u6761\u5B8C\u6574\u5185\u5BB9").argument("<id>", "\u6761\u76EE ID\uFF0C\u5982 TF-0001 / PA-0001 / CK-0001").option("--json", "\u4EE5 JSON \u8F93\u51FA", false).action((id, opts) => runLibraryGet({ id, ...opts }));
7044
+ libraryCmd.command("add").description("\u65B0\u589E\u6761\u76EE\uFF08Agent \u53D1\u73B0\u65B0\u89C4\u5F8B\u65F6\u8C03\u7528\uFF09").requiredOption("--type <traffic|product|cooking>", "\u5E93\u7C7B\u578B").requiredOption("--title <text>", "\u6761\u76EE\u6807\u9898").option("--summary <text>", "\u4E00\u53E5\u8BDD\u6458\u8981").option("--content <text>", "\u5B8C\u6574\u5185\u5BB9").option("--tags <tags>", "\u6807\u7B7E\uFF0C\u9017\u53F7\u5206\u9694").option("--notes <text>", "Agent \u521D\u59CB\u7B14\u8BB0").option("--json", "\u4EE5 JSON \u8F93\u51FA", false).action((opts) => {
7045
+ const t = opts.type;
7046
+ if (!["traffic", "product", "cooking"].includes(t)) {
7047
+ console.error("\u274C --type \u5FC5\u987B\u4E3A traffic / product / cooking");
7048
+ process.exit(1);
7049
+ }
7050
+ runLibraryAdd({ ...opts, type: t });
7051
+ });
7052
+ libraryCmd.command("update").description("\u66F4\u65B0\u6761\u76EE\u5185\u5BB9\u3001\u8BC4\u5206\u6216 Agent \u7B14\u8BB0\uFF08\u81EA\u6211\u4F18\u5316\u6838\u5FC3\u64CD\u4F5C\uFF09").argument("<id>", "\u6761\u76EE ID").option("--title <text>", "\u65B0\u6807\u9898").option("--summary <text>", "\u65B0\u6458\u8981").option("--content <text>", "\u65B0\u5185\u5BB9").option("--tags <tags>", "\u65B0\u6807\u7B7E\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u8986\u76D6\u5168\u90E8\uFF09").option("--status <active|archived|draft>", "\u65B0\u72B6\u6001").option("--score <0-1>", "\u6548\u679C\u8BC4\u5206 0.0\u20131.0\uFF08Agent \u5728\u6210\u7A3F\u540E\u8BC4\u4EF7\uFF09").option("--notes <text>", "Agent \u7B14\u8BB0\uFF08\u8FFD\u52A0\u6216\u8986\u76D6\uFF09").option("--json", "\u4EE5 JSON \u8F93\u51FA", false).action((id, opts) => {
7053
+ runLibraryUpdate({ id, ...opts, status: opts.status });
7054
+ });
7055
+ libraryCmd.command("use").description("\u6807\u8BB0\u6761\u76EE\u5DF2\u88AB\u5F15\u7528\uFF08\u7D2F\u8BA1 use_count\uFF0CAgent \u6BCF\u6B21\u5F15\u7528\u65F6\u8C03\u7528\uFF09").argument("<id>", "\u6761\u76EE ID").option("--json", "\u4EE5 JSON \u8F93\u51FA", false).action((id, opts) => runLibraryUse({ id, ...opts }));
7056
+ libraryCmd.command("retire").description("\u5F52\u6863\u5931\u6548\u6761\u76EE\uFF08Agent \u53D1\u73B0\u67D0\u6761\u76EE\u6301\u7EED\u8868\u73B0\u4E0D\u4F73\u65F6\u8C03\u7528\uFF09").argument("<id>", "\u6761\u76EE ID").option("--reason <text>", "\u5F52\u6863\u539F\u56E0\uFF08\u5199\u5165 agent_notes\uFF09").option("--json", "\u4EE5 JSON \u8F93\u51FA", false).action((id, opts) => runLibraryRetire({ id, ...opts }));
7057
+ libraryCmd.command("stats").description("\u4E09\u5E93\u4F7F\u7528\u7EDF\u8BA1\uFF1A\u6761\u76EE\u6570\u3001\u9AD8\u9891\u6761\u76EE\u3001\u9AD8\u6548\u6761\u76EE\u3001\u4ECE\u672A\u4F7F\u7528\u6761\u76EE").option("--type <traffic|product|cooking>", "\u9650\u5B9A\u5E93\u7C7B\u578B").option("--json", "\u4EE5 JSON \u8F93\u51FA", false).action((opts) => {
7058
+ runLibraryStats({ type: opts.type, json: opts.json });
7059
+ });
6725
7060
  var ragCmd = program.command("rag").description("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");
6726
7061
  ragCmd.command("query").description("\u6309\u5173\u952E\u8BCD\u68C0\u7D22\u5DF2\u7EB3\u5165\u5411\u91CF\u7684\u77E5\u8BC6\u7247\u6BB5\uFF08GET cutapi/v1/material/queryknowledges\uFF09").requiredOption("-q, --query <text>", "\u68C0\u7D22\u5173\u952E\u8BCD\u6216\u95EE\u53E5").option(
6727
7062
  "--belong-to-id <id>",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: siluzan-cso
3
3
  description: >-
4
- 协助使用 Siluzan CSO 完成两类业务:(1)多平台内容发布与运营(YouTube、TikTok、Instagram、LinkedIn、X、视频号),以及账号授权、数据报表、任务管理;(2)内容文案生产——三库选题/拆解/口播成稿。当用户提到视频发布、账号管理、内容文案、RAG 检索、人设风格或 siluzan-cso 命令时激活。
4
+ 协助使用 Siluzan CSO 完成两类业务:(1)多媒体平台内容发布与运营(YouTube、TikTok、Instagram、LinkedIn、X、视频号),以及账号授权、数据报表、任务管理;(2)内容文案生产——三库选题/拆解/口播成稿。当用户提到视频发布、媒体账号管理、内容文案、RAG 检索、人设风格或 siluzan-cso 命令时激活。
5
5
  compatibility: Requires siluzan-cso-cli installed and authenticated via `siluzan-cso login`
6
6
  metadata:
7
7
  description_en: >-
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-cso",
3
- "version": "1.0.0-beta.40",
4
- "publishedAt": 1775617255353
3
+ "version": "1.0.0-beta.41",
4
+ "publishedAt": 1775619518051
5
5
  }
@@ -0,0 +1,235 @@
1
+ # 产品资产库
2
+
3
+ ## 总览
4
+
5
+ 产品资产库用于沉淀可复用的内容模板资产。每条资产都对应一种稳定的内容结构,适合在不同热点、不同选题、不同人设中反复调用。
6
+
7
+ ---
8
+
9
+ ## PA-0001|强观点开场型
10
+
11
+ - **模板类型**:hook_opinion
12
+ - **一句话说明**:以强反差或强判断直接开场,不铺垫,第一句话就亮出核心观点,适合成功易风格的趋势判断类内容。
13
+ - **适用平台**:抖音、视频号
14
+ - **适用目标**:起量、认知占位、扩大曝光
15
+ - **适用场景**:热点解读、趋势判断、行业分析
16
+ - **适用语气**:强判断、生意感、强势
17
+ - **长度范围**:60-120秒口播
18
+ - **节奏要求**:前5秒必须抛出核心判断,不能有任何废话。中段快节奏推进,每10-15秒一个小高潮。结尾要有余韵,不能硬收。
19
+ - **结构块**:强观点开头(5秒内)、现象描述(拉近距离)、核心判断(生意逻辑)、趋势或格局升维、金句收尾
20
+ - **开头句式**:你以为……其实……;所有人都在说……,但没人告诉你……;这不是一个……的问题,这是一个……的问题;如果你还在……,那你已经落后了
21
+ - **过渡句式**:但真正的问题不是这个——;我们换一个角度来看——;你看到的是……,我看到的是——;说白了就一件事——
22
+ - **结尾句式**:谁先看懂,谁就先拿到下一轮机会;这不是一个普通新闻,这是一个信号;你现在看到的,三年后就是常识
23
+ - **CTA句式**:关注我,下期继续讲;评论区告诉我你怎么看;这个判断你认同吗?
24
+ - **必要结构**:强观点开头、核心判断、金句收尾
25
+ - **可选结构**:数据支撑、案例佐证、行动建议
26
+ - **避坑说明**:不要铺垫超过10秒才说主题;不要用疑问句开头(无力);不要以转化为目的写结尾
27
+ - **人设适配**:chenggongyi
28
+ - **状态**:active
29
+
30
+ ---
31
+
32
+ ## PA-0002|认知重构型
33
+
34
+ - **模板类型**:insight_reframe
35
+ - **一句话说明**:先呈现大众的错误认知,再提供新框架颠覆它,让受众产生“原来如此”的顿悟感。成功易和尚薇均适用,但落点不同。
36
+ - **适用平台**:抖音、视频号、小红书
37
+ - **适用目标**:认知占位、建立信任、起量
38
+ - **适用场景**:打破误解、专业背书、观点输出
39
+ - **适用语气**:专业、犀利、有画面
40
+ - **长度范围**:60-90秒口播 / 800-1500字图文
41
+ - **节奏要求**:第一段说错误认知(让受众点头),第二段急转直下打脸,第三段给新框架,节奏是:慢→快→稳。
42
+ - **结构块**:呈现大众认知(引发共鸣)、反转:这个认知其实是错的、真正的逻辑是什么、新框架的实际意义、行动建议或结尾升维
43
+ - **开头句式**:很多人以为……(实际上……);99%的人都搞错了一件事——;你做了这么多年……,但你真的理解它吗;所有人都告诉你……,但没人告诉你为什么
44
+ - **过渡句式**:但这里有一个根本性的误判——;真正值得注意的是——;换一个框架来看这件事——;不是……而是……
45
+ - **结尾句式**:认知不到位,努力是白费;这才是真正的……逻辑;看清楚这一点,比多做十件事都有用
46
+ - **CTA句式**:你之前是怎么理解这件事的?评论区聊聊;关注我,持续更新这类判断
47
+ - **必要结构**:错误认知呈现、反转打脸、新框架
48
+ - **可选结构**:数据佐证、案例支撑、行动建议
49
+ - **避坑说明**:不要反转太快,要先让受众点头;不要只打脸不给解法;不要用太学术的语言表达新框架
50
+ - **人设适配**:chenggongyi、shangwei
51
+ - **状态**:active
52
+
53
+ ---
54
+
55
+ ## PA-0003|风险预警型
56
+
57
+ - **模板类型**:risk_warning
58
+ - **一句话说明**:以潜在危险或已出现的负面信号开场,拉高危机感,然后给出判断和应对思路。成功易的核心内容形态之一。
59
+ - **适用平台**:抖音、视频号
60
+ - **适用目标**:认知占位、起量、引发共鸣
61
+ - **适用场景**:热点解读、趋势预警、行业分析
62
+ - **适用语气**:强判断、紧迫感、生意感
63
+ - **长度范围**:45-90秒口播
64
+ - **节奏要求**:前3秒制造紧迫感,中段快速铺证据,后段给判断和建议,节奏要快,不能松弛。
65
+ - **结构块**:危机信号(3秒内抛出)、证据链铺陈(快速)、本质判断、谁会受影响 / 谁能逃过、行动建议或格局升维
66
+ - **开头句式**:一个信号,你可能还没注意到——;如果这件事是真的,那……将是第一批受害者;这不是危言耸听——;真正值得警惕的是……
67
+ - **过渡句式**:这背后的逻辑是——;问题的根源在于——;你以为只是……,其实是……
68
+ - **结尾句式**:早看到,早准备,机会从来留给有准备的人;这是信号,不是新闻;看清楚这件事,比什么都重要
69
+ - **CTA句式**:你所在的行业有没有这个信号?评论区说说;关注我,下期继续跟进
70
+ - **必要结构**:危机信号、本质判断
71
+ - **可选结构**:数据证据、案例佐证、应对建议
72
+ - **避坑说明**:不要纯渲染焦虑而没有判断;不要结尾软掉;不要信息过多导致节奏松散
73
+ - **人设适配**:chenggongyi
74
+ - **状态**:active
75
+
76
+ ---
77
+
78
+ ## PA-0004|案例拆解型
79
+
80
+ - **模板类型**:case_breakdown
81
+ - **一句话说明**:以一个真实或典型案例为核心,拆解背后的逻辑,从故事进入,从判断出来。两个人设均适用,落点不同。
82
+ - **适用平台**:抖音、视频号、小红书、B站
83
+ - **适用目标**:建立信任、认知占位、引发共鸣
84
+ - **适用场景**:案例故事、经验分享、行业分析
85
+ - **适用语气**:有画面、真实感、有判断
86
+ - **长度范围**:90-180秒口播 / 1000-2000字图文
87
+ - **节奏要求**:先讲故事拉人进来,再拆逻辑,最后升维到判断。中间案例细节要具体,不能太虚。
88
+ - **结构块**:案例开场(具体人/事/数字)、事情经过(有细节)、核心转折点、背后的商业逻辑、可复用的判断或方法
89
+ - **开头句式**:有一个……(工厂/老板/公司),做了一件事——;去年有个案例,我一直没忘——;我见过最典型的一个例子是——;某某行业有个规律:……(接案例印证)
90
+ - **过渡句式**:这件事有趣的地方在于——;表面上是……,实际上是——;这里有一个很多人忽略的细节——
91
+ - **结尾句式**:这个案例告诉我们的,不是……,而是……;同样的机会,为什么别人拿到了,你没拿到;规律都是一样的,变的只是场景
92
+ - **CTA句式**:你有没有遇到过类似的情况?评论区聊聊;这个逻辑在你行业成立吗?
93
+ - **必要结构**:案例开场、核心转折点、商业逻辑
94
+ - **可选结构**:数据支撑、横向对比、行动建议
95
+ - **避坑说明**:案例不能太模糊,要有具体细节;不要只讲故事不给判断;不要硬套到所有行业
96
+ - **人设适配**:chenggongyi、shangwei
97
+ - **状态**:active
98
+
99
+ ---
100
+
101
+ ## PA-0005|趋势分析型
102
+
103
+ - **模板类型**:trend_analysis
104
+ - **一句话说明**:从当下正在发生的宏观或行业变化切入,分析方向和影响,给出具有前瞻性的判断。成功易的标志内容形态。
105
+ - **适用平台**:抖音、视频号
106
+ - **适用目标**:认知占位、品牌势能、起量
107
+ - **适用场景**:趋势判断、行业分析、全球生意趋势
108
+ - **适用语气**:强判断、生意感、格局感
109
+ - **长度范围**:60-120秒口播
110
+ - **节奏要求**:先点出趋势信号,中段拆产业链影响,后段给格局判断。不能只讲表象,每段都要有“所以对你意味着什么”。
111
+ - **结构块**:趋势信号切入、产业链或供应链影响拆解、对不同类型老板的不同影响、格局判断(谁受益/谁受损)、建议或升维结尾
112
+ - **开头句式**:有一件事正在发生,大多数人还没意识到——;这个信号,很多人以为是偶然,其实是必然——;全球正在发生一件事,和你的生意直接相关——
113
+ - **过渡句式**:这对……意味着什么?;背后的逻辑是——;你看到的是……,我看到的是……
114
+ - **结尾句式**:趋势不等人,看懂了就要快;先看懂的人,已经在布局了;这不是新闻,这是下一个三年的预演
115
+ - **CTA句式**:关注我,持续跟踪这个趋势;你觉得这个趋势会持续多久?评论区聊
116
+ - **必要结构**:趋势信号、影响拆解、格局判断
117
+ - **可选结构**:数据引用、案例支撑、行动建议
118
+ - **避坑说明**:不要只讲大趋势不落到生意;不要用数字堆砌代替判断;结尾不能软
119
+ - **人设适配**:chenggongyi
120
+ - **状态**:active
121
+
122
+ ---
123
+
124
+ ## PA-0006|问题解法型
125
+
126
+ - **模板类型**:problem_solution
127
+ - **一句话说明**:先精准点出受众的某个具体痛点,再给出可执行的步骤解法。尚薇的核心内容形态,强调实操性和可落地性。
128
+ - **适用平台**:抖音、视频号、小红书
129
+ - **适用目标**:促进转化、私信咨询、建立信任
130
+ - **适用场景**:外贸获客教程、平台运营实操、新手可执行清单
131
+ - **适用语气**:务实、直接、步骤清晰
132
+ - **长度范围**:60-120秒口播 / 600-1200字图文
133
+ - **节奏要求**:痛点要说得精准(让人感觉在说自己),步骤要清晰可数,结尾要有一个明确的行动指令。节奏稳、清晰、不废话。
134
+ - **结构块**:精准点痛(让受众感觉在说自己)、为什么大多数人解决不了(错误原因)、正确的步骤是(2-5步,清晰可执行)、每步的关键注意事项、行动号召 / 引导咨询
135
+ - **开头句式**:如果你做……还没有……,大概率是这几个原因——;别再……了,真正有效的是这几步——;很多人在……上反复踩坑,根本原因是——;做了这么久……,但你有没有做对这一步——
136
+ - **过渡句式**:第一步,先……;接下来最关键的是——;这一步很多人都做错了——;注意这里有个坑——
137
+ - **结尾句式**:你只需要照着做,结果不会差;最关键的一步是……,别跳过;先把这一步做好,其他的再说
138
+ - **CTA句式**:不会操作的,评论区留言,我来回复;需要详细教程的,私信我;照着做了的,告诉我效果怎么样
139
+ - **必要结构**:精准点痛、可执行步骤、行动号召
140
+ - **可选结构**:错误原因分析、注意事项、案例佐证
141
+ - **避坑说明**:步骤不能超过5步否则记不住;不要讲道理不给动作;行动号召必须具体不能只说“关注我”
142
+ - **人设适配**:shangwei
143
+ - **状态**:active
144
+
145
+ ---
146
+
147
+ ## PA-0007|转化促单型
148
+
149
+ - **模板类型**:conversion_cta
150
+ - **一句话说明**:以用户痛点+解决方案+信任背书为结构,直接推动咨询或成交。适合尚薇的私信引导、咨询转化场景。
151
+ - **适用平台**:抖音、视频号、小红书
152
+ - **适用目标**:促进转化、私信咨询
153
+ - **适用场景**:外贸转化方法、询盘提升、服务推广
154
+ - **适用语气**:务实、真诚、直接
155
+ - **长度范围**:30-60秒口播 / 300-600字图文
156
+ - **节奏要求**:节奏快,废话少,每句都有用。先共情,再给价值,最后明确行动路径。
157
+ - **结构块**:精准共情(说出目标客户的处境)、我能帮你做到什么(具体承诺)、为什么找我而不是别人(差异化信任点)、具体行动路径(如何联系/获取)
158
+ - **开头句式**:如果你正在……,这条视频专门为你录的——;做……还没有结果的,我告诉你为什么——;三年教了……个学员,总结出一套……
159
+ - **过渡句式**:我能帮你做到的是——;跟我合作的人,通常会——;一个很简单的方法——
160
+ - **结尾句式**:想了解更多,私信我“关键词”;评论区扣“1”,我给你发详细方法;名额有限,认真的来
161
+ - **CTA句式**:私信我“外贸”,领取免费资料;评论区扣数字,我来一对一回复;想系统学的,看主页置顶
162
+ - **必要结构**:精准共情、具体价值承诺、明确行动路径
163
+ - **可选结构**:信任背书、案例数据、稀缺感营造
164
+ - **避坑说明**:不要太硬推,要先共情;行动路径必须明确具体;不要承诺做不到的事
165
+ - **人设适配**:shangwei
166
+ - **状态**:active
167
+
168
+ ---
169
+
170
+ ## PA-0008|清单干货型
171
+
172
+ - **模板类型**:listicle
173
+ - **一句话说明**:用“X个方法/X件事/X个坑”的清单结构输出实用内容,条理清晰、易于保存转发。尚薇的高频内容形态。
174
+ - **适用平台**:小红书、抖音、视频号
175
+ - **适用目标**:建立信任、促进转化、评论互动
176
+ - **适用场景**:外贸获客教程、避坑指南、新手可执行清单
177
+ - **适用语气**:务实、直接、专业
178
+ - **长度范围**:60-120秒口播 / 500-1000字图文
179
+ - **节奏要求**:标题必须有数字(3个/5个/7个)。每条要有标题+一句解释。不要所有条目等量齐观,最关键的放第2或第3条(不是第1条)。
180
+ - **结构块**:标题抛出(X个……)、快速点出受众痛点、清单条目(每条:是什么+为什么+怎么做)、最重要的那条加强、收尾行动建议
181
+ - **开头句式**:做外贸……,这X件事一定要知道——;新手做……,这X个坑早点踩才好——;想在……上拿到结果,先搞清楚这X步——
182
+ - **过渡句式**:第一个……(第二个……);这里最重要的是——;很多人忽略的一点是——
183
+ - **结尾句式**:记住这X条,少走弯路;先把这X步做完,再想其他的;保存起来,用到的时候再看
184
+ - **CTA句式**:收藏这条视频,用到的时候翻出来;还有哪个问题没搞清楚?评论区告诉我;想要完整版清单的,私信我
185
+ - **必要结构**:数字标题、清单条目(≥3条)、最重要条目强调
186
+ - **可选结构**:痛点引入、案例举例、行动号召
187
+ - **避坑说明**:条目不能超过7个(记不住);每条不能太长(超过2句就说不清楚);不要全是废话没有干货
188
+ - **人设适配**:shangwei
189
+ - **状态**:active
190
+
191
+ ---
192
+
193
+ ## PA-0009|评论互动型
194
+
195
+ - **模板类型**:comment_engagement
196
+ - **一句话说明**:以引发讨论和评论为核心目标的内容结构,用争议性观点或开放式问题推动互动,提升账号权重。
197
+ - **适用平台**:抖音、视频号、小红书
198
+ - **适用目标**:评论互动、起量、扩大曝光
199
+ - **适用场景**:观点输出、话题讨论、互动提升
200
+ - **适用语气**:有争议性、真诚、接地气
201
+ - **长度范围**:30-60秒口播 / 200-500字图文
202
+ - **节奏要求**:内容可以稍短,但结尾的互动引导必须明确且有吸引力。观点要有一定争议性,让人想回应。
203
+ - **结构块**:抛出有争议的观点或真实困惑、简短说明自己的理由、开放式提问引导评论
204
+ - **开头句式**:我说一个可能很多人不同意的观点——;有一件事我一直想问大家——;做了这么多年……,我发现一个规律,你觉得对吗?
205
+ - **过渡句式**:我这么想的原因是——;当然也有人觉得——
206
+ - **结尾句式**:你怎么看?评论区告诉我;你是哪种情况?;同意的扣1,不同意的扣2
207
+ - **CTA句式**:评论区聊聊你的经历;同意的扣1,不同意的说说你的理由;你有没有遇到过类似的情况?
208
+ - **必要结构**:争议性观点或真实困惑、开放式互动引导
209
+ - **可选结构**:简短理由说明、案例举例
210
+ - **避坑说明**:不要提问太多(一次一个问题);问题要有吸引力不能太宽泛;不要为了争议而争议,要真诚
211
+ - **人设适配**:chenggongyi、shangwei
212
+ - **状态**:active
213
+
214
+ ---
215
+
216
+ ## PA-0010|故事驱动型
217
+
218
+ - **模板类型**:story_driven
219
+ - **一句话说明**:以个人经历或真实故事为主线,带出核心判断或方法,情感真实,节奏舒缓,适合建立深度信任。
220
+ - **适用平台**:视频号、抖音、小红书
221
+ - **适用目标**:建立信任、品牌势能、引发共鸣
222
+ - **适用场景**:个人经历分享、品牌故事、转型案例
223
+ - **适用语气**:真诚、有画面、有温度
224
+ - **长度范围**:90-180秒口播 / 1000-2000字图文
225
+ - **节奏要求**:故事要有细节,不能太虚。转折点要明确,让受众感受到“变化”。结尾的判断或方法要自然从故事里长出来,不能硬贴。
226
+ - **结构块**:故事切入(具体场景/时间/人物)、困境或挑战(让人代入)、转折或顿悟、结果与收获、对受众的启发或判断
227
+ - **开头句式**:五年前,我做了一个决定——;有一个客户,我到现在还记得他说的一句话——;我刚开始做……的时候,犯了一个错,现在想想还后怕——
228
+ - **过渡句式**:直到有一天——;那一刻我才明白——;后来发生的事让我彻底改变了想法——
229
+ - **结尾句式**:这件事教会我的,比任何课程都值钱;我希望你能比我少走几年弯路;回头看,那个决定改变了一切
230
+ - **CTA句式**:你有没有类似的经历?评论区聊聊;关注我,我会持续分享这些真实的东西
231
+ - **必要结构**:具体故事场景、转折点、对受众的启发
232
+ - **可选结构**:数据/结果、延伸判断、行动建议
233
+ - **避坑说明**:故事不能太虚太顺,要有真实的挣扎感;不要讲完故事忘记给受众价值;不要为了煽情而煽情
234
+ - **人设适配**:chenggongyi、shangwei、siluzan
235
+ - **状态**:active
@@ -0,0 +1,406 @@
1
+ 流量因子库
2
+ 导出时间:2026-04-05 00:34:16
3
+ 1. TF-0001 外贸利润结构的核心逻辑
4
+ summary:外贸利润并不只来自成交价差,而是由客户获取、成交效率、供应链控制、汇率、履约成本共同决定。
5
+ content:外贸利润结构的关键,不是单看报价,而是看整条链路中的利润分配。很多企业表面成交了,但客户获取成本、样品成本、沟通成本、履约成本、售后成本一算,利润其实很薄。理解利润结构,才能知道钱到底赚在哪里、亏在哪里。
6
+ type:industry_knowledge
7
+ credibility:high
8
+ source_type:个人经验
9
+ source_ref:成功易知识库-利润结构整理
10
+ time_sensitive:False
11
+ effective_at:2026-03-29
12
+ status:active
13
+ topic_tags:外贸、利润、商业逻辑
14
+ industry_tags:外贸、制造业
15
+ scenario_tags:选题、脚本、认知内容
16
+ audience_tags:外贸老板、业务员、工厂老板
17
+ platform_tags:抖音、视频号、小红书
18
+ goal_tags:认知占位、起量、建立信任
19
+
20
+ 2. TF-0002 全球局势变化
21
+ summary:国际关系、战争、制裁、关税、外交博弈,都会直接影响贸易和供应链,是宏观流量的天然入口。
22
+ content:宏观事件天然带关注度,且和老板的钱袋子直接相关。适合内容方向:某国政策变化会怎么影响出口;某场冲突背后对行业的连锁反应;国际局势怎么改变订单流向。
23
+ category:趋势类
24
+ type:trend_factor
25
+ credibility:medium
26
+ source_type:时事分析
27
+ source_ref:流量因子库-趋势类
28
+ time_sensitive:True
29
+ effective_at:2026-03-30
30
+ status:active
31
+ topic_tags:全球局势、国际关系、战争、制裁、关税、外交、贸易
32
+ industry_tags:外贸、制造业、供应链
33
+ scenario_tags:选题、时事解读、趋势判断
34
+ audience_tags:外贸老板、工厂老板、供应链从业者
35
+ platform_tags:抖音、视频号、微博、小红书
36
+ goal_tags:起量、扩大曝光、认知占位
37
+
38
+ 3. TF-0003 AI对行业的冲击
39
+ summary:AI 不只是工具,是重新分配效率和利润的力量,老板最关心会不会替代自己、帮自己赚钱。
40
+ content:AI 自带热度,而且老板最关心'会不会替代我、帮我赚钱'。适合内容方向:AI 会先干掉哪些岗位;AI 会让哪些行业提效;AI 正在怎么改造外贸/制造业。
41
+ category:趋势类
42
+ type:trend_factor
43
+ credibility:high
44
+ source_type:行业趋势
45
+ source_ref:流量因子库-趋势类
46
+ time_sensitive:True
47
+ effective_at:2026-03-30
48
+ status:active
49
+ topic_tags:AI、人工智能、效率、行业冲击、替代、制造业、外贸
50
+ industry_tags:外贸、制造业、科技、服务业
51
+ scenario_tags:选题、趋势判断、科技解读
52
+ audience_tags:外贸老板、工厂老板、创业者、中层管理
53
+ platform_tags:抖音、视频号、B站、小红书
54
+ goal_tags:起量、认知占位、扩大曝光
55
+
56
+ 4. TF-0004 供应链重构
57
+ summary:产能迁移、工厂外迁、采购转移、物流变化,都在改变生意地图,是实打实的钱和订单流向变化。
58
+ content:供应链重构是实打实的钱和订单流向变化,和每个老板切身相关。适合内容方向:工厂为什么从这搬到那;哪些国家正在接单;哪些环节利润被重新分配。
59
+ category:趋势类
60
+ type:trend_factor
61
+ credibility:high
62
+ source_type:行业趋势
63
+ source_ref:流量因子库-趋势类
64
+ time_sensitive:True
65
+ effective_at:2026-03-30
66
+ status:active
67
+ topic_tags:供应链、产能迁移、工厂外迁、采购转移、物流、东南亚、墨西哥
68
+ industry_tags:外贸、制造业、供应链、物流
69
+ scenario_tags:选题、趋势判断、行业分析
70
+ audience_tags:外贸老板、工厂老板、采购负责人、供应链从业者
71
+ platform_tags:抖音、视频号、小红书
72
+ goal_tags:起量、认知占位、建立信任
73
+
74
+ 5. TF-0005 贸易规则变化
75
+ summary:认证、税率、海关、合规、出口限制,直接决定生意能不能做,对老板来说是生死线而非知识点。
76
+ content:对老板来说,贸易规则变化不是知识点,是生死线。适合内容方向:新规出来后谁受影响最大;某类产品还能不能出口;规则变化背后的机会和风险。
77
+ category:趋势类
78
+ type:trend_factor
79
+ credibility:high
80
+ source_type:政策分析
81
+ source_ref:流量因子库-趋势类
82
+ time_sensitive:True
83
+ effective_at:2026-03-30
84
+ status:active
85
+ topic_tags:贸易规则、认证、税率、海关、合规、出口限制、关税
86
+ industry_tags:外贸、制造业、进出口
87
+ scenario_tags:选题、政策解读、合规指引
88
+ audience_tags:外贸老板、贸易公司、工厂老板、进出口业务员
89
+ platform_tags:抖音、视频号、微信
90
+ goal_tags:起量、建立信任、认知占位
91
+
92
+ 6. TF-0006 行业洗牌信号
93
+ summary:行业不是一直平稳,真正重要的是谁在出局、谁在上升,'洗牌'天然带危机感和判断感。
94
+ content:'洗牌'天然带危机感和判断感,容易让人停下来思考自己的处境。适合内容方向:哪些企业已经撑不住了;为什么头部越来越强;什么打法正在失效。
95
+ category:趋势类
96
+ type:trend_factor
97
+ credibility:medium
98
+ source_type:行业趋势
99
+ source_ref:流量因子库-趋势类
100
+ time_sensitive:False
101
+ effective_at:2026-03-30
102
+ status:active
103
+ topic_tags:行业洗牌、企业出局、头部集中、打法失效、竞争格局
104
+ industry_tags:外贸、制造业、零售、电商
105
+ scenario_tags:选题、趋势判断、行业分析
106
+ audience_tags:外贸老板、工厂老板、创业者、中小企业主
107
+ platform_tags:抖音、视频号、小红书
108
+ goal_tags:起量、认知占位、引发共鸣
109
+
110
+ 7. TF-0007 焦虑感
111
+ summary:订单少、利润薄、客户跑、竞争狠,这些是老板的真实焦虑,也是最容易被点燃的情绪。
112
+ content:焦虑是最容易被点燃的情绪,能让人迅速产生共鸣和代入感。适合内容方向:为什么你越努力越难赚钱;为什么老客户也开始流失;为什么现在的生意越来越累。
113
+ category:情绪类
114
+ type:emotion_factor
115
+ credibility:high
116
+ source_type:用户洞察
117
+ source_ref:流量因子库-情绪类
118
+ time_sensitive:False
119
+ effective_at:2026-03-30
120
+ status:active
121
+ topic_tags:焦虑、订单减少、利润薄、客户流失、竞争激烈
122
+ industry_tags:外贸、制造业、中小企业
123
+ scenario_tags:选题、情绪触发、共鸣内容
124
+ audience_tags:外贸老板、工厂老板、中小企业主、业务员
125
+ platform_tags:抖音、视频号、小红书
126
+ goal_tags:起量、引发共鸣、扩大曝光
127
+
128
+ 8. TF-0008 机会感
129
+ summary:在大家觉得难的时候,真正的机会往往藏在变化里,'还能不能翻身'是人本能的吸引点。
130
+ content:人会本能地被'还能不能翻身'吸引,机会感是焦虑情绪的正向出口。适合内容方向:现在还能做什么;哪些行业其实刚开始;哪些市场正在冒头。
131
+ category:情绪类
132
+ type:emotion_factor
133
+ credibility:medium
134
+ source_type:行业洞察
135
+ source_ref:流量因子库-情绪类
136
+ time_sensitive:False
137
+ effective_at:2026-03-30
138
+ status:active
139
+ topic_tags:机会、翻身、新市场、新赛道、增量
140
+ industry_tags:外贸、制造业、跨境电商、新兴市场
141
+ scenario_tags:选题、情绪触发、机会挖掘
142
+ audience_tags:外贸老板、工厂老板、创业者、转型中的企业主
143
+ platform_tags:抖音、视频号、小红书
144
+ goal_tags:起量、引发共鸣、促进转化
145
+
146
+ 9. TF-0009 危机感
147
+ summary:不看趋势、不做调整就会被淘汰,危机感能逼人停下来把内容听完。
148
+ content:危机感能逼人停下来听你讲完,是完播率和互动率的强驱动力。适合内容方向:再不改打法就晚了;为什么老经验开始失效;哪些老板会先被淘汰。
149
+ category:情绪类
150
+ type:emotion_factor
151
+ credibility:high
152
+ source_type:用户洞察
153
+ source_ref:流量因子库-情绪类
154
+ time_sensitive:False
155
+ effective_at:2026-03-30
156
+ status:active
157
+ topic_tags:危机、淘汰、打法失效、老经验失效、转型
158
+ industry_tags:外贸、制造业、中小企业、传统行业
159
+ scenario_tags:选题、情绪触发、警示内容
160
+ audience_tags:外贸老板、工厂老板、中小企业主
161
+ platform_tags:抖音、视频号、小红书
162
+ goal_tags:起量、引发共鸣、扩大曝光
163
+
164
+ 10. TF-0010 反差感
165
+ summary:表面和实际、想象和真相往往差很远,反差最容易制造认知震动,引发传播。
166
+ content:反差最容易制造认知震动,是内容传播的强燃料。适合内容方向:看起来火,其实在崩;看起来难,其实机会最大;看起来普通,其实最赚钱。
167
+ category:情绪类
168
+ type:emotion_factor
169
+ credibility:medium
170
+ source_type:内容策略
171
+ source_ref:流量因子库-情绪类
172
+ time_sensitive:False
173
+ effective_at:2026-03-30
174
+ status:active
175
+ topic_tags:反差、认知颠覆、表象与真相、爆款逻辑
176
+ industry_tags:外贸、制造业、跨境电商、各类行业
177
+ scenario_tags:选题、情绪触发、反转内容
178
+ audience_tags:外贸老板、工厂老板、创业者、广泛受众
179
+ platform_tags:抖音、视频号、小红书、微博
180
+ goal_tags:起量、扩大曝光、引发传播
181
+
182
+ 11. TF-0011 确定性
183
+ summary:老板不缺信息,缺的是判断。在混乱里,人最想听一个明确答案。
184
+ content:在信息爆炸的时代,确定性比信息本身更值钱,能让人产生信任感和依赖感。适合内容方向:这个方向到底值不值得做;这个行业是不是还有机会;现在该先干什么。
185
+ category:情绪类
186
+ type:emotion_factor
187
+ credibility:high
188
+ source_type:用户洞察
189
+ source_ref:流量因子库-情绪类
190
+ time_sensitive:False
191
+ effective_at:2026-03-30
192
+ status:active
193
+ topic_tags:确定性、判断、方向感、决策支持
194
+ industry_tags:外贸、制造业、中小企业、各类行业
195
+ scenario_tags:选题、情绪触发、决策辅助
196
+ audience_tags:外贸老板、工厂老板、创业者、中小企业主
197
+ platform_tags:抖音、视频号、小红书
198
+ goal_tags:建立信任、认知占位、促进转化
199
+
200
+ 12. TF-0012 打破误解
201
+ summary:很多行业的共识其实是错的,打脸式认知最容易传播,能迅速建立专业形象。
202
+ content:打脸式认知最容易传播,是快速建立专业壁垒的有效手段。适合内容方向:外贸不是只能卷价格;AI 不是只有大公司能用;出海不是只有大品牌能做。
203
+ category:认知类
204
+ type:cognition_factor
205
+ credibility:high
206
+ source_type:行业洞察
207
+ source_ref:流量因子库-认知类
208
+ time_sensitive:False
209
+ effective_at:2026-03-30
210
+ status:active
211
+ topic_tags:打破误解、认知颠覆、行业共识、反常识
212
+ industry_tags:外贸、制造业、跨境电商、出海
213
+ scenario_tags:选题、认知内容、专业背书
214
+ audience_tags:外贸老板、工厂老板、创业者、从业者
215
+ platform_tags:抖音、视频号、小红书、B站
216
+ goal_tags:认知占位、建立信任、起量
217
+
218
+ 13. TF-0013 重新定义行业
219
+ summary:不是在原来的理解里修修补补,而是换一套看法,重新定义等于新框架,天然有高级感。
220
+ content:重新定义=新框架,天然高级,能让受众感到'原来还可以这么看'。适合内容方向:重新定义外贸;重新定义供应链;重新定义出海机会。
221
+ category:认知类
222
+ type:cognition_factor
223
+ credibility:high
224
+ source_type:个人经验
225
+ source_ref:流量因子库-认知类
226
+ time_sensitive:False
227
+ effective_at:2026-03-30
228
+ status:active
229
+ topic_tags:重新定义、新框架、行业视角、颠覆认知
230
+ industry_tags:外贸、制造业、供应链、出海
231
+ scenario_tags:选题、认知内容、专业背书
232
+ audience_tags:外贸老板、工厂老板、创业者、从业者
233
+ platform_tags:抖音、视频号、小红书、B站
234
+ goal_tags:认知占位、建立信任、起量
235
+
236
+ 14. TF-0014 商业本质解释
237
+ summary:所有表象背后最终都回到利润、效率、渠道、资源配置,这个层次最容易体现'懂生意'。
238
+ content:从商业本质出发的解释最能体现'懂生意'的人设,是建立专家权威的核心手段。适合内容方向:为什么这个行业总在卷;为什么利润会被吃掉;为什么大公司和小公司打法不同。
239
+ category:认知类
240
+ type:cognition_factor
241
+ credibility:high
242
+ source_type:个人经验
243
+ source_ref:流量因子库-认知类
244
+ time_sensitive:False
245
+ effective_at:2026-03-30
246
+ status:active
247
+ topic_tags:商业本质、利润、效率、渠道、资源配置、竞争逻辑
248
+ industry_tags:外贸、制造业、零售、电商、各类行业
249
+ scenario_tags:选题、认知内容、专业背书
250
+ audience_tags:外贸老板、工厂老板、创业者、中层管理
251
+ platform_tags:抖音、视频号、B站、小红书
252
+ goal_tags:认知占位、建立信任、促进转化
253
+
254
+ 15. TF-0015 行业判断
255
+ summary:哪些在增长、哪些在衰退、哪些已经过时,判断比知识更值钱,是高价值内容的核心。
256
+ content:判断比知识更值钱,能让受众感受到'这个人看得比我更远'。适合内容方向:哪些赛道还在上升;哪些行业已经不值得做;哪些玩法快失效了。
257
+ category:认知类
258
+ type:cognition_factor
259
+ credibility:medium
260
+ source_type:行业洞察
261
+ source_ref:流量因子库-认知类
262
+ time_sensitive:True
263
+ effective_at:2026-03-30
264
+ status:active
265
+ topic_tags:行业判断、赛道选择、增长、衰退、趋势预测
266
+ industry_tags:外贸、制造业、跨境电商、各类行业
267
+ scenario_tags:选题、趋势判断、认知内容
268
+ audience_tags:外贸老板、工厂老板、创业者、投资者
269
+ platform_tags:抖音、视频号、B站、小红书
270
+ goal_tags:认知占位、建立信任、起量
271
+
272
+ 16. TF-0016 赚钱逻辑拆解
273
+ summary:钱从哪里来、利润怎么形成、增长靠什么,老板最想知道怎么赚到钱,这类内容转化率最高。
274
+ content:老板最想知道怎么赚到钱,赚钱逻辑拆解类内容往往能带来最高的互动和转化。适合内容方向:这门生意为什么能赚钱;这个模式为什么跑得通;钱最后流向了谁。
275
+ category:认知类
276
+ type:cognition_factor
277
+ credibility:high
278
+ source_type:个人经验
279
+ source_ref:流量因子库-认知类
280
+ time_sensitive:False
281
+ effective_at:2026-03-30
282
+ status:active
283
+ topic_tags:赚钱逻辑、利润、商业模式、增长、钱的流向
284
+ industry_tags:外贸、制造业、零售、电商、各类行业
285
+ scenario_tags:选题、认知内容、商业拆解
286
+ audience_tags:外贸老板、工厂老板、创业者、中小企业主
287
+ platform_tags:抖音、视频号、B站、小红书
288
+ goal_tags:促进转化、建立信任、认知占位
289
+
290
+ 17. TF-0017 强场景
291
+ summary:真实场景能让抽象内容落地,场景感会让人更容易代入,提升完播率和互动率。
292
+ content:场景感会让人更容易代入,是抽象内容的最好容器。适合内容方向:工厂现场;港口现场;展会现场;海外仓现场;会议室决策现场。
293
+ category:画面类
294
+ type:visual_factor
295
+ credibility:high
296
+ source_type:实地内容
297
+ source_ref:流量因子库-画面类
298
+ time_sensitive:False
299
+ effective_at:2026-03-30
300
+ status:active
301
+ topic_tags:场景化、工厂、港口、展会、海外仓、实地拍摄
302
+ industry_tags:外贸、制造业、供应链、进出口
303
+ scenario_tags:选题、场景化内容、实地探访
304
+ audience_tags:外贸老板、工厂老板、供应链从业者、广泛受众
305
+ platform_tags:抖音、视频号、B站
306
+ goal_tags:起量、扩大曝光、引发共鸣
307
+
308
+ 18. TF-0018 真实案例
309
+ summary:案例是最能建立信任的表达方式,人天生爱看'别人怎么成、怎么死'。
310
+ content:人天生爱看'别人怎么成/怎么死',真实案例是最强的信任背书。适合内容方向:某工厂怎么转型;某老板怎么踩坑;某市场怎么爆发。
311
+ category:画面类
312
+ type:visual_factor
313
+ credibility:high
314
+ source_type:真实案例
315
+ source_ref:流量因子库-画面类
316
+ time_sensitive:False
317
+ effective_at:2026-03-30
318
+ status:active
319
+ topic_tags:真实案例、转型、踩坑、成功故事、失败教训
320
+ industry_tags:外贸、制造业、跨境电商、各类行业
321
+ scenario_tags:选题、案例故事、经验分享
322
+ audience_tags:外贸老板、工厂老板、创业者、从业者
323
+ platform_tags:抖音、视频号、小红书、B站
324
+ goal_tags:建立信任、引发共鸣、促进转化
325
+
326
+ 19. TF-0019 数字冲击
327
+ summary:数字能把变化讲得更具象,数字比形容词更有杀伤力,是增强内容说服力的最快手段。
328
+ content:数字比形容词更有杀伤力,是把变化讲得更具象的最快手段。适合内容方向:成本涨了多少;利润掉了多少;订单增加/减少多少;某市场增长了多少倍。
329
+ category:画面类
330
+ type:visual_factor
331
+ credibility:high
332
+ source_type:数据引用
333
+ source_ref:流量因子库-画面类
334
+ time_sensitive:True
335
+ effective_at:2026-03-30
336
+ status:active
337
+ topic_tags:数字、数据、成本、利润、增长、对比数据
338
+ industry_tags:外贸、制造业、跨境电商、各类行业
339
+ scenario_tags:选题、数据内容、说服力强化
340
+ audience_tags:外贸老板、工厂老板、创业者、广泛受众
341
+ platform_tags:抖音、视频号、小红书、微博
342
+ goal_tags:起量、扩大曝光、引发传播
343
+
344
+ 20. TF-0020 对比冲击
345
+ summary:对比能迅速建立认知差,人最容易被差异吸引,是制造视觉和认知冲击的高效结构。
346
+ content:人最容易被差异吸引,对比结构能快速拉开认知落差、放大信息价值。适合内容方向:国内 vs 海外;传统打法 vs 新打法;大厂 vs 小厂;旧模式 vs 新模式。
347
+ category:画面类
348
+ type:visual_factor
349
+ credibility:high
350
+ source_type:内容策略
351
+ source_ref:流量因子库-画面类
352
+ time_sensitive:False
353
+ effective_at:2026-03-30
354
+ status:active
355
+ topic_tags:对比、国内vs海外、新旧打法、大厂vs小厂、认知差
356
+ industry_tags:外贸、制造业、跨境电商、各类行业
357
+ scenario_tags:选题、对比内容、认知内容
358
+ audience_tags:外贸老板、工厂老板、创业者、广泛受众
359
+ platform_tags:抖音、视频号、小红书、微博
360
+ goal_tags:起量、扩大曝光、引发传播
361
+
362
+ 21. TF-0021 结果导向
363
+ summary:最终会发生什么、谁赚到钱、谁会出局,结果是所有人最关心的,能拉满完播和互动。
364
+ content:结果是所有人最关心的,结果导向的内容能让受众从头看到尾。适合内容方向:最后会变成什么样;谁会先死;谁会最后赢。
365
+ category:画面类
366
+ type:visual_factor
367
+ credibility:medium
368
+ source_type:行业洞察
369
+ source_ref:流量因子库-画面类
370
+ time_sensitive:False
371
+ effective_at:2026-03-30
372
+ status:active
373
+ topic_tags:结果、谁赢谁输、最终走向、预测、判断
374
+ industry_tags:外贸、制造业、跨境电商、各类行业
375
+ scenario_tags:选题、结果预测、趋势判断
376
+ audience_tags:外贸老板、工厂老板、创业者、广泛受众
377
+ platform_tags:抖音、视频号、小红书、微博
378
+ goal_tags:起量、扩大曝光、引发共鸣
379
+
380
+ 22. TF-0022 流量因子组合使用原则
381
+ summary:先从流量因子找抓手,再用人设过滤,最后落回商业判断,一条内容最好同时具备趋势+情绪+认知+画面四类因子各一个。
382
+ content:使用流量因子库的核心原则:第一步,先从流量因子里找'抓手';第二步,再用成功易的人设去过滤,确保内容风格一致;第三步,最后落回商业判断,不做纯热闹内容。一条高质量内容最好同时具备:1个趋势因子 + 1个情绪因子 + 1个认知因子 + 1个画面因子,四维组合才能兼顾流量和价值。
383
+
384
+ ## SilkLuZan 增补方向
385
+ - 平台规则变化
386
+ - 数据口径变化
387
+ - 内容同质化加速
388
+ - 账号风控升级
389
+ - 品牌信任翻车
390
+ - 节点营销
391
+ - 本地化适配
392
+ - 原创力壁垒
393
+ category:使用原则
394
+ type:usage_principle
395
+ credibility:high
396
+ source_type:方法论
397
+ source_ref:流量因子库-使用原则
398
+ time_sensitive:False
399
+ effective_at:2026-03-30
400
+ status:active
401
+ topic_tags:使用原则、内容策略、因子组合、人设过滤、商业判断
402
+ industry_tags:内容创作、短视频、知识付费
403
+ scenario_tags:内容规划、选题策略、脚本指导
404
+ audience_tags:内容创作者、运营人员、品牌负责人
405
+ platform_tags:抖音、视频号、小红书、B站
406
+ goal_tags:内容质量、流量与价值平衡、人设一致性
@@ -0,0 +1,179 @@
1
+ # 烹调方法库
2
+
3
+ ## 总览
4
+
5
+ 烹调方法库用于沉淀稳定的内容加工方法。它不替代产品资产库,而是负责把选题、热点、案例、观点“做成内容”。
6
+
7
+ ---
8
+
9
+ ## 一、结构模板库
10
+
11
+ ### 1)强观点开场
12
+
13
+ - **作用**:一上来就给判断,迅速建立作者立场。
14
+ - **适用场景**:趋势判断、热点解读、行业观点。
15
+ - **适用人设**:成功易。
16
+ - **结构逻辑**:先下结论,再补现象,再讲理由。
17
+ - **常用句式**:
18
+ - 你以为……其实……
19
+ - 这不是一个……的问题,这是一个……的问题
20
+ - 如果你还在……,那你已经落后了
21
+ - **使用要点**:前5秒必须抛核心观点,不能铺垫。
22
+
23
+ ### 2)认知重构
24
+
25
+ - **作用**:先打掉旧认知,再给出新框架,让受众产生“原来如此”的感觉。
26
+ - **适用场景**:打破误解、专业背书、观点输出。
27
+ - **适用人设**:成功易、尚薇。
28
+ - **结构逻辑**:大众认知 → 误判指出 → 新框架 → 行动意义。
29
+ - **常用句式**:
30
+ - 很多人以为……(实际上……)
31
+ - 99%的人都搞错了一件事——
32
+ - 不是……而是……
33
+ - **使用要点**:先让人点头,再反转;不要只打脸不给解法。
34
+
35
+ ### 3)风险预警
36
+
37
+ - **作用**:用危险信号开场,提升紧迫感,再给判断和建议。
38
+ - **适用场景**:危机预警、趋势变化、成本上涨、政策冲击。
39
+ - **适用人设**:成功易。
40
+ - **结构逻辑**:危机信号 → 证据链 → 本质判断 → 影响对象 → 行动建议。
41
+ - **常用句式**:
42
+ - 一个信号,你可能还没注意到——
43
+ - 这不是危言耸听——
44
+ - 真正值得警惕的是……
45
+ - **使用要点**:不要只制造焦虑,最后一定要落到判断。
46
+
47
+ ### 4)案例拆解
48
+
49
+ - **作用**:用具体案例带出规律和判断。
50
+ - **适用场景**:案例故事、经验分享、行业分析。
51
+ - **适用人设**:成功易、尚薇。
52
+ - **结构逻辑**:案例进入 → 过程展开 → 转折点 → 商业逻辑 → 可复用结论。
53
+ - **常用句式**:
54
+ - 去年有个案例,我一直没忘——
55
+ - 表面上是……,实际上是——
56
+ - 这个案例告诉我们的,不是……,而是……
57
+ - **使用要点**:案例要具体,不能虚;最后一定要抽象出逻辑。
58
+
59
+ ### 5)趋势分析
60
+
61
+ - **作用**:从宏观或行业变化切入,分析方向和影响,给前瞻判断。
62
+ - **适用场景**:全球局势、供应链变化、产业迁移、政策影响。
63
+ - **适用人设**:成功易。
64
+ - **结构逻辑**:趋势信号 → 产业链影响 → 对老板的意义 → 格局判断 → 升维收尾。
65
+ - **常用句式**:
66
+ - 有一件事正在发生,大多数人还没意识到——
67
+ - 全球正在发生一件事,和你的生意直接相关——
68
+ - 这不是新闻,这是下一个三年的预演
69
+ - **使用要点**:每一段都要回答“所以这对你意味着什么”。
70
+
71
+ ---
72
+
73
+ ## 二、推进方式库
74
+
75
+ ### 1)先现象后判断
76
+
77
+ - 先说大家看得见的变化,再说背后的本质。
78
+ - 适合做成“你看到的是……,我看到的是……”的句式。
79
+
80
+ ### 2)先痛点后步骤
81
+
82
+ - 先把受众痛点说准,再给出清晰动作。
83
+ - 适合尚薇类教程内容。
84
+
85
+ ### 3)先案例后逻辑
86
+
87
+ - 先讲一个具体人/事,再抽象出规律。
88
+ - 适合建立信任,也适合降低生硬感。
89
+
90
+ ### 4)先反转后新框架
91
+
92
+ - 先打掉老认知,再建立新理解。
93
+ - 适合趋势判断和认知类内容。
94
+
95
+ ### 5)先危机后建议
96
+
97
+ - 先抬高紧迫感,再给可执行方案。
98
+ - 适合风险预警类内容。
99
+
100
+ ### 6)先清单后强调重点
101
+
102
+ - 先列出几个点,再把最关键的一条单独加重。
103
+ - 适合干货型和教程型内容。
104
+
105
+ ---
106
+
107
+ ## 三、表现手法库
108
+
109
+ ### 1)结论先行
110
+
111
+ - 直接把判断放前面,不绕圈。
112
+ - 适合成功易风格。
113
+
114
+ ### 2)强对比
115
+
116
+ - 用“你看到的 vs 我看到的”“别人以为 vs 实际上”制造冲突感。
117
+
118
+ ### 3)短句快节奏
119
+
120
+ - 一句一层意思,推进快,适合口播。
121
+
122
+ ### 4)比喻化表达
123
+
124
+ - 用“地图重画、印钞机、护城河、信号”等词,把抽象逻辑说具体。
125
+
126
+ ### 5)动作感表达
127
+
128
+ - 用“第一步、接下来、最关键的一步”等方式,让内容能执行。
129
+
130
+ ### 6)开放式收尾
131
+
132
+ - 留出评论空间,而不是硬性结束。
133
+
134
+ ---
135
+
136
+ ## 四、成功易常用方法组合
137
+
138
+ - **强观点开场 + 风险预警**:适合热点冲击类内容。
139
+ - **认知重构 + 趋势分析**:适合讲“很多人搞错了什么”。
140
+ - **案例拆解 + 趋势判断**:适合讲行业变化和真实例子。
141
+ - **现象切入 + 比喻收尾**:适合做有记忆点的短视频口播。
142
+
143
+ ---
144
+
145
+ ## 五、尚薇常用方法组合
146
+
147
+ - **问题解法 + 先痛点后步骤**:适合教程类内容。
148
+ - **清单干货 + 先清单后强调重点**:适合做可保存可转发内容。
149
+ - **案例拆解 + 先案例后逻辑**:适合做实操经验分享。
150
+ - **评论互动 + 开放式收尾**:适合引导评论和私信。
151
+
152
+ ---
153
+
154
+ ## 六、使用原则
155
+
156
+ - 不要只讲方法,不落到内容。
157
+ - 不要只讲热闹,不落到判断。
158
+ - 不要追求花哨,优先追求可复用。
159
+ - 方法的价值在于稳定复现,不在于一次惊艳。
160
+
161
+ ---
162
+
163
+ ## 七、常用句式备忘
164
+
165
+ - 说白了就一件事——
166
+ - 但真正的问题不是这个——
167
+ - 表面上是……,实际上是——
168
+ - 你看到的是……,我看到的是——
169
+ - 这不是一个普通新闻,这是一个信号
170
+ - 谁先看懂,谁就先拿到下一轮机会
171
+
172
+ ---
173
+
174
+ ## 八、和产品资产库的关系
175
+
176
+ - **产品资产库**回答:有什么可用模板。
177
+ - **烹调方法库**回答:怎么把模板做成内容。
178
+
179
+ 二者配合,才是完整的内容生产流程。
@@ -13,15 +13,25 @@
13
13
  ## 执行前提
14
14
  执行流程详情见:`three-lib-content-workflow/sop.md` — 完整成稿链路:人设 → 目标 → 选题 → 提纲 → 正文 → 质检
15
15
 
16
- 1. **人设**:先调用 `siluzan-cso persona list --json`,取目标人设的 `styleGuide`(Markdown),以此为写作基准;`personas.md` 仅作补充示例。
16
+ 1. **人设**:先调用 `siluzan-cso persona list`,取目标人设的 列表(Markdown)让用户选择一个人设, 如果没有可以直接让用户描述或跳过
17
+ - 使用 `siluzan-cso persona list --name <人设名> --json `来获取完整人设信息
17
18
  2. **三库文件(客户提供)**:向用户索要以下三个文件,用作本次创作的素材依据:
18
19
  - 流量因子库文件(选题热点、反差点、情绪点等)
19
20
  - 产品资产库文件(产品/服务/能力描述、可复用资产等)
20
21
  - 烹调方法库文件(开头结构、叙事节奏、常用话术等)
21
22
 
22
- > 若用户未提供某个文件,跳过该库对应环节,用内置的 `collaboration.md` 结构定义作为兜底参考继续流程;三个文件均未提供时,全部以内置定义兜底。
23
- 3. **RAG**(可选):如需从平台知识库检索内部素材,调用 `siluzan-cso rag query`,结果归入「拆素材」环节;不用于与文案无关的场景。
23
+ - 若用户未提供某个文件,跳过该库对应环节,三个文件均未提供时,全部以内置定义兜底。
24
+ - `assets/产品资产库.md`
25
+ - `assets/流量因子库.md`
26
+ - `assets/烹调方法库.md`
27
+ > 如用户有联网搜索的SKILL此时可以调用,搜索你需要的内容
24
28
 
29
+ **本地 SQLite 三库(优先)**:若用户已提供三库文件,AI 应读取文件内容,理解每条条目后逐条调用 `library add` 写入本地数据库(`~/.siluzan/libraries.db`)。写入后后续创作直接用 `library search -q <关键词>` 检索,无需每次重新提供文件。
30
+ - 创作时:`library use <id>` 标记引用,积累使用频次
31
+ - 成稿后:`library update <id> --score <0-1> --notes <经验>` 记录效果
32
+ - 定期审查:`library stats` 查看高频/高效条目;低效条目用 `library retire` 归档
33
+ 3. **RAG**(可选):如需从平台知识库检索内部素材,调用 `siluzan-cso rag query`,结果归入「拆素材」环节;不用于与文案无关的场景。
34
+ > 如用户有联网搜索的SKILL此时可以调用,搜索你需要的内容
25
35
  ## 阅读顺序
26
36
 
27
37
  - 三库如何使用?详情见: `three-lib-content-workflow/collaboration.md`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-cso-cli",
3
- "version": "1.0.0-beta.40",
3
+ "version": "1.0.0-beta.41",
4
4
  "description": "Siluzan platform AI Skill CLI — multi-platform content publishing (video/image-text) for Cursor, Claude Code, and OpenClaw.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -42,7 +42,7 @@
42
42
  "siluzan-cli-common": "1.0.0"
43
43
  },
44
44
  "engines": {
45
- "node": ">=18"
45
+ "node": ">=24"
46
46
  },
47
47
  "scripts": {
48
48
  "postinstall": "node scripts/postinstall.mjs",