siluzan-cso-cli 1.1.9-beta.2 → 1.1.9-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
@@ -50,7 +50,7 @@ siluzan-cso init -d /path/to/skills # 写入自定义目录
50
50
  siluzan-cso init --force # 强制覆盖已存在文件
51
51
  ```
52
52
 
53
- > **注意**:当前为测试版(1.1.9-beta.2),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
53
+ > **注意**:当前为测试版(1.1.9-beta.3),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
54
54
 
55
55
  | 助手 | 建议 `--ai` |
56
56
  |------|-------------|
package/dist/index.js CHANGED
@@ -1977,54 +1977,76 @@ async function getSkillFiles(skillDir, apiBaseUrl) {
1977
1977
 
1978
1978
  // src/commands/init.ts
1979
1979
  var __dirname = path2.dirname(fileURLToPath(import.meta.url));
1980
- var TARGET_DIRS = {
1981
- cursor: (cwd) => path2.join(cwd, ".cursor", "skills", "siluzan-platform"),
1982
- claude: (cwd) => path2.join(cwd, ".claude", "skills", "siluzan-platform"),
1983
- /** OpenClaw 工作区技能目录,见 https://docs.openclaw.ai/skills */
1984
- "openclaw-workspace": (cwd) => path2.join(cwd, "skills", "siluzan-platform"),
1985
- "openclaw-global": (_cwd, home) => path2.join(home, ".openclaw", "skills", "siluzan-platform"),
1986
- /** WorkBuddy (CodeBuddy) 项目级技能目录 */
1987
- "workbuddy-workspace": (cwd) => path2.join(cwd, ".workbuddy", "skills", "siluzan-platform"),
1988
- /** WorkBuddy (CodeBuddy) 用户级技能目录(全局可用) */
1989
- "workbuddy-global": (_cwd, home) => path2.join(home, ".workbuddy", "skills", "siluzan-platform")
1980
+ var SKILL_DIR_NAME = "siluzan-platform";
1981
+ var PROJECT_DIRS = {
1982
+ agents: (cwd) => path2.join(cwd, ".agents", "skills", SKILL_DIR_NAME),
1983
+ cursor: (cwd) => path2.join(cwd, ".cursor", "skills", SKILL_DIR_NAME),
1984
+ claude: (cwd) => path2.join(cwd, ".claude", "skills", SKILL_DIR_NAME),
1985
+ windsurf: (cwd) => path2.join(cwd, ".windsurf", "skills", SKILL_DIR_NAME),
1986
+ gemini: (cwd) => path2.join(cwd, ".gemini", "skills", SKILL_DIR_NAME),
1987
+ codex: (cwd) => path2.join(cwd, ".codex", "skills", SKILL_DIR_NAME),
1988
+ opencode: (cwd) => path2.join(cwd, ".opencode", "skills", SKILL_DIR_NAME),
1989
+ kilo: (cwd) => path2.join(cwd, ".kilo", "skills", SKILL_DIR_NAME),
1990
+ openclaw: (cwd) => path2.join(cwd, "skills", SKILL_DIR_NAME),
1991
+ workbuddy: (cwd) => path2.join(cwd, ".workbuddy", "skills", SKILL_DIR_NAME)
1990
1992
  };
1993
+ var GLOBAL_DIRS = {
1994
+ agents: (home) => path2.join(home, ".agents", "skills", SKILL_DIR_NAME),
1995
+ cursor: (home) => path2.join(home, ".cursor", "skills", SKILL_DIR_NAME),
1996
+ claude: (home) => path2.join(home, ".claude", "skills", SKILL_DIR_NAME),
1997
+ windsurf: (home) => path2.join(home, ".codeium", "windsurf", "skills", SKILL_DIR_NAME),
1998
+ gemini: (home) => path2.join(home, ".gemini", "skills", SKILL_DIR_NAME),
1999
+ codex: (home) => path2.join(home, ".codex", "skills", SKILL_DIR_NAME),
2000
+ opencode: (home) => path2.join(home, ".config", "opencode", "skills", SKILL_DIR_NAME),
2001
+ kilo: (home) => path2.join(home, ".kilo", "skills", SKILL_DIR_NAME),
2002
+ openclaw: (home) => path2.join(home, ".openclaw", "skills", SKILL_DIR_NAME),
2003
+ workbuddy: (home) => path2.join(home, ".workbuddy", "skills", SKILL_DIR_NAME)
2004
+ };
2005
+ var ALL_PLATFORM_KEYS = Object.keys(PROJECT_DIRS);
1991
2006
  function parseTargets(raw) {
1992
2007
  const normalized = raw.trim().toLowerCase();
1993
2008
  if (normalized === "all") {
1994
- return [
1995
- "cursor",
1996
- "claude",
1997
- "openclaw-workspace",
1998
- "openclaw-global",
1999
- "workbuddy-workspace",
2000
- "workbuddy-global"
2001
- ];
2009
+ return ALL_PLATFORM_KEYS.map((k) => ({ keys: [k], isGlobal: false }));
2002
2010
  }
2003
- const parts = normalized.split(",").map((s) => s.trim()).map((p) => {
2004
- if (p === "openclaw") return "openclaw-workspace";
2005
- if (p === "workbuddy") return "workbuddy-workspace";
2006
- return p;
2007
- });
2008
- const allowed = [
2009
- "cursor",
2010
- "claude",
2011
- "openclaw-workspace",
2012
- "openclaw-global",
2013
- "workbuddy-workspace",
2014
- "workbuddy-global"
2015
- ];
2016
- const result = [];
2011
+ const parts = normalized.split(",").map((s) => s.trim());
2012
+ const results = [];
2013
+ const seen = /* @__PURE__ */ new Set();
2017
2014
  for (const p of parts) {
2018
- if (!allowed.includes(p)) {
2015
+ let key = p;
2016
+ let isGlobal = false;
2017
+ if (p === "openclaw-workspace") {
2018
+ key = "openclaw";
2019
+ isGlobal = false;
2020
+ } else if (p === "openclaw-global") {
2021
+ key = "openclaw";
2022
+ isGlobal = true;
2023
+ } else if (p === "openclaw") {
2024
+ key = "openclaw";
2025
+ isGlobal = false;
2026
+ } else if (p === "workbuddy-workspace") {
2027
+ key = "workbuddy";
2028
+ isGlobal = false;
2029
+ } else if (p === "workbuddy-global") {
2030
+ key = "workbuddy";
2031
+ isGlobal = true;
2032
+ } else if (p === "workbuddy") {
2033
+ key = "workbuddy";
2034
+ isGlobal = false;
2035
+ }
2036
+ if (!ALL_PLATFORM_KEYS.includes(key)) {
2019
2037
  console.error(
2020
- `\u672A\u77E5\u5E73\u53F0: ${p}\u3002\u53EF\u9009: cursor, claude, openclaw-workspace, openclaw-global, workbuddy-workspace, workbuddy-global, all`
2038
+ `\u672A\u77E5\u5E73\u53F0: ${p}\u3002\u53EF\u9009: ${ALL_PLATFORM_KEYS.join(", ")}, openclaw-workspace, openclaw-global, workbuddy-workspace, workbuddy-global, all`
2021
2039
  );
2022
2040
  process.exitCode = 1;
2023
2041
  return [];
2024
2042
  }
2025
- result.push(p);
2043
+ const uid = `${key}:${isGlobal}`;
2044
+ if (!seen.has(uid)) {
2045
+ seen.add(uid);
2046
+ results.push({ keys: [key], isGlobal });
2047
+ }
2026
2048
  }
2027
- return [...new Set(result)];
2049
+ return results;
2028
2050
  }
2029
2051
  function skillRoot() {
2030
2052
  return path2.join(__dirname, "skill");
@@ -2084,16 +2106,30 @@ async function runInit(options) {
2084
2106
  if (anyWritten) {
2085
2107
  installedEntries.push({ target: "custom", cwd: "", dir: destDir });
2086
2108
  }
2109
+ } else if (options.global) {
2110
+ for (const key of ALL_PLATFORM_KEYS) {
2111
+ const destDir = GLOBAL_DIRS[key](home);
2112
+ console.log(`[${key} global] \u2192 ${destDir}`);
2113
+ const anyWritten = await writeSkillFilesToDir(destDir, skillFiles, options.force);
2114
+ if (anyWritten) {
2115
+ installedEntries.push({ target: `${key}-global`, cwd: "" });
2116
+ }
2117
+ }
2087
2118
  } else {
2088
2119
  const targets = parseTargets(options.aiTargets);
2089
2120
  if (targets.length === 0) return;
2090
- for (const target of targets) {
2091
- const destDir = TARGET_DIRS[target](options.cwd, home);
2092
- console.log(`[${target}] \u2192 ${destDir}`);
2093
- const anyWritten = await writeSkillFilesToDir(destDir, skillFiles, options.force);
2094
- if (anyWritten) {
2095
- const isGlobal = target === "openclaw-global" || target === "workbuddy-global";
2096
- installedEntries.push({ target, cwd: isGlobal ? "" : options.cwd });
2121
+ for (const entry of targets) {
2122
+ for (const key of entry.keys) {
2123
+ const destDir = entry.isGlobal ? GLOBAL_DIRS[key](home) : PROJECT_DIRS[key](options.cwd);
2124
+ const label = entry.isGlobal ? `${key} global` : key;
2125
+ console.log(`[${label}] \u2192 ${destDir}`);
2126
+ const anyWritten = await writeSkillFilesToDir(destDir, skillFiles, options.force);
2127
+ if (anyWritten) {
2128
+ installedEntries.push({
2129
+ target: entry.isGlobal ? `${key}-global` : key,
2130
+ cwd: entry.isGlobal ? "" : options.cwd
2131
+ });
2132
+ }
2097
2133
  }
2098
2134
  }
2099
2135
  }
@@ -2101,18 +2137,8 @@ async function runInit(options) {
2101
2137
  saveInstalledTargets(installedEntries);
2102
2138
  }
2103
2139
  console.log("\n\u4E0B\u4E00\u6B65\uFF1A");
2104
- console.log(
2105
- "1. \u9996\u6B21\u4F7F\u7528\u8BF7\u8FD0\u884C\uFF1Asiluzan-cso login \uFF08\u5F15\u5BFC\u6CE8\u518C/\u767B\u5F55\u5E76\u4FDD\u5B58 Token\uFF09"
2106
- );
2107
- console.log(
2108
- "2. \u540E\u7EED\u5347\u7EA7\u8FD0\u884C\uFF1Asiluzan-cso update \uFF08\u81EA\u52A8\u66F4\u65B0 CLI \u4E0E skill \u6587\u4EF6\uFF09"
2109
- );
2110
- console.log(
2111
- "3. OpenClaw \u5168\u5C40\u6280\u80FD\u82E5\u672A\u751F\u6548\uFF0C\u8BF7\u5728 ~/.openclaw/openclaw.json \u7684 skills.load.extraDirs \u4E2D\u52A0\u5165\u6280\u80FD\u7236\u76EE\u5F55\u3002"
2112
- );
2113
- console.log(
2114
- "4. WorkBuddy \u6280\u80FD\u5B89\u88C5\u540E\u91CD\u542F WorkBuddy \u5373\u53EF\u751F\u6548\uFF08~/.workbuddy/skills/ \u6216\u9879\u76EE .workbuddy/skills/\uFF09\u3002"
2115
- );
2140
+ console.log("1. \u9996\u6B21\u4F7F\u7528\u8BF7\u8FD0\u884C\uFF1Asiluzan-cso login \uFF08\u5F15\u5BFC\u6CE8\u518C/\u767B\u5F55\u5E76\u4FDD\u5B58 Token\uFF09");
2141
+ console.log("2. \u540E\u7EED\u5347\u7EA7\u8FD0\u884C\uFF1Asiluzan-cso update \uFF08\u81EA\u52A8\u66F4\u65B0 CLI \u4E0E skill \u6587\u4EF6\uFF09");
2116
2142
  }
2117
2143
 
2118
2144
  // src/commands/login.ts
@@ -2712,7 +2738,7 @@ function loadConfig(tokenArg) {
2712
2738
  const authToken = tokenArg ?? process.env.SILUZAN_AUTH_TOKEN ?? shared.authToken ?? "";
2713
2739
  if (!apiKey && !authToken) {
2714
2740
  console.error(
2715
- "\n\u274C \u672A\u627E\u5230\u8BA4\u8BC1\u51ED\u636E\u3002\n\n \u65B9\u5F0F\u4E00\uFF08\u63A8\u8350\uFF09\uFF1AAPI Key\n \u5728\u4E1D\u8DEF\u8D5E\u300C\u8BBE\u7F6E \u2192 API Key \u7BA1\u7406\u300D\u521B\u5EFA API Key\uFF0C\u7136\u540E\u8FD0\u884C\uFF1A\n siluzan-cso login --api-key <YOUR_API_KEY>\n\n \u65B9\u5F0F\u4E8C\uFF1AJWT Token\n siluzan-cso login\n"
2741
+ "\n\u274C \u672A\u627E\u5230\u8BA4\u8BC1\u51ED\u636E\u3002\n\n \u65B9\u5F0F\u4E00\uFF08\u63A8\u8350\uFF09\uFF1AAPI Key\n \u5728\u4E1D\u8DEF\u8D5E\u300C\u8BBE\u7F6E \u2192 API Key \u7BA1\u7406\u300D\u521B\u5EFA API Key\uFF0C\u7136\u540E\u8FD0\u884C\uFF1A\n siluzan-cso login --api-key <YOUR_API_KEY>\n\n \u65B9\u5F0F\u4E8C\uFF1A\u73AF\u5883\u53D8\u91CF\uFF08CI/CD \u63A8\u8350\uFF09\n export SILUZAN_API_KEY=<YOUR_API_KEY>\n # \u6216 export SILUZAN_AUTH_TOKEN=<YOUR_TOKEN>\n\n \u65B9\u5F0F\u4E09\uFF1AJWT Token\n siluzan-cso login\n"
2716
2742
  );
2717
2743
  process.exit(1);
2718
2744
  }
@@ -2737,7 +2763,7 @@ function loadConfig(tokenArg) {
2737
2763
  \u274C agentBaseUrl \u4E0D\u5408\u6CD5\uFF1A${agentErr}`);
2738
2764
  process.exit(1);
2739
2765
  }
2740
- return { apiBaseUrl, csoBaseUrl, agentBaseUrl, authToken, apiKey, dataPermission: shared.dataPermission };
2766
+ return { apiBaseUrl, csoBaseUrl, agentBaseUrl, authToken, apiKey, dataPermission: process.env.SILUZAN_DATA_PERMISSION ?? shared.dataPermission };
2741
2767
  }
2742
2768
  function apiFetch2(url, config, options = {}, verbose = false) {
2743
2769
  return apiFetch(url, config, options, verbose);
@@ -6216,7 +6242,11 @@ ${header}${body}`);
6216
6242
  import * as fs10 from "fs";
6217
6243
  function cmdConfigShow() {
6218
6244
  const shared = readSharedConfig();
6219
- if (!shared.authToken && !shared.apiKey) {
6245
+ const envApiKey = process.env.SILUZAN_API_KEY;
6246
+ const envAuthToken = process.env.SILUZAN_AUTH_TOKEN;
6247
+ const effectiveApiKey = envApiKey ?? shared.apiKey ?? "";
6248
+ const effectiveAuthToken = envAuthToken ?? shared.authToken ?? "";
6249
+ if (!effectiveApiKey && !effectiveAuthToken) {
6220
6250
  console.log(
6221
6251
  `
6222
6252
  \u5C1A\u672A\u914D\u7F6E\u51ED\u636E\u3002
@@ -6226,25 +6256,34 @@ function cmdConfigShow() {
6226
6256
 
6227
6257
  \u6CE8\u518C\u767B\u5F55\u540E\u8FD0\u884C\u4EE5\u4E0B\u4EFB\u4E00\u547D\u4EE4\u5B8C\u6210\u914D\u7F6E\uFF1A
6228
6258
  siluzan-cso login \uFF08\u4F7F\u7528 API Key \u6216 Token \u767B\u5F55\uFF09
6259
+
6260
+ \u4E5F\u53EF\u901A\u8FC7\u73AF\u5883\u53D8\u91CF\u4F20\u5165\uFF08CI/CD \u63A8\u8350\uFF09\uFF1A
6261
+ export SILUZAN_API_KEY=<YOUR_API_KEY>
6262
+ export SILUZAN_AUTH_TOKEN=<YOUR_TOKEN>
6229
6263
  `
6230
6264
  );
6231
6265
  return;
6232
6266
  }
6233
6267
  const apiBaseUrl = process.env.SILUZAN_CSO_API_BASE ?? DEFAULT_API_BASE;
6234
6268
  const csoBaseUrl = DEFAULT_CSO_BASE;
6235
- const apiKey = shared.apiKey ?? "";
6236
- console.log("\n\u5F53\u524D\u914D\u7F6E\uFF08~/.siluzan/config.json\uFF09\uFF1A");
6269
+ console.log("\n\u5F53\u524D\u914D\u7F6E\uFF1A");
6237
6270
  console.log(` apiBaseUrl : ${apiBaseUrl}`);
6238
6271
  console.log(` csoBaseUrl : ${csoBaseUrl}`);
6239
- if (apiKey) {
6240
- console.log(` apiKey : ${maskSecret(apiKey)} \u2190 \u5F53\u524D\u751F\u6548\uFF08X-Api-Key \u9274\u6743\uFF09`);
6272
+ if (effectiveApiKey) {
6273
+ const src = envApiKey ? "env:SILUZAN_API_KEY" : "config.json";
6274
+ const active = " \u2190 \u5F53\u524D\u751F\u6548\uFF08X-Api-Key \u9274\u6743\uFF09";
6275
+ console.log(` apiKey : ${maskSecret(effectiveApiKey)} [${src}]${active}`);
6241
6276
  }
6242
- if (shared.authToken) {
6243
- const note = apiKey ? " \uFF08\u5DF2\u88AB apiKey \u8986\u76D6\uFF09" : " \u2190 \u5F53\u524D\u751F\u6548\uFF08Bearer \u9274\u6743\uFF09";
6244
- console.log(` authToken : ${maskSecret(shared.authToken)}${note}`);
6277
+ if (effectiveAuthToken) {
6278
+ const src = envAuthToken ? "env:SILUZAN_AUTH_TOKEN" : "config.json";
6279
+ const note = effectiveApiKey ? " \uFF08\u5DF2\u88AB apiKey \u8986\u76D6\uFF09" : " \u2190 \u5F53\u524D\u751F\u6548\uFF08Bearer \u9274\u6743\uFF09";
6280
+ console.log(` authToken : ${maskSecret(effectiveAuthToken)} [${src}]${note}`);
6245
6281
  }
6246
6282
  console.log(`
6247
6283
  \u914D\u7F6E\u6587\u4EF6\u4F4D\u7F6E\uFF1A${CONFIG_FILE}`);
6284
+ if (envApiKey || envAuthToken) {
6285
+ console.log(" \u2139\uFE0F \u90E8\u5206\u51ED\u636E\u6765\u81EA\u73AF\u5883\u53D8\u91CF\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E config.json\u3002");
6286
+ }
6248
6287
  if (process.platform !== "win32") {
6249
6288
  console.log(" \u26A0\uFE0F Token \u660E\u6587\u5B58\u50A8\uFF0C\u8BF7\u786E\u4FDD\u6587\u4EF6\u6743\u9650\u4E3A 600\uFF0C\u4E14\u4E0D\u8981\u63D0\u4EA4\u81F3\u4EE3\u7801\u4ED3\u5E93\u6216\u7F51\u76D8\u3002");
6250
6289
  }
@@ -6298,18 +6337,19 @@ program.command("login").description("\u5F15\u5BFC\u5B8C\u6210 Siluzan \u8D26\u5
6298
6337
  program.command("update").description("\u68C0\u67E5\u5E76\u66F4\u65B0 siluzan-cso-cli \u81F3\u6700\u65B0\u7248\u672C\uFF0C\u540C\u6B65\u5237\u65B0\u6240\u6709\u5DF2\u5B89\u88C5\u7684 skill \u6587\u4EF6").option("--force", "\u8DF3\u8FC7\u7248\u672C\u6BD4\u8F83\uFF0C\u5F3A\u5236\u91CD\u65B0\u5B89\u88C5\u5E76\u5237\u65B0 skill \u6587\u4EF6", false).option("--skip-init", "\u4EC5\u66F4\u65B0 CLI\uFF0C\u4E0D\u91CD\u65B0\u521D\u59CB\u5316 skill \u6587\u4EF6", false).action(async (opts) => {
6299
6338
  await runUpdate({ force: opts.force, skipInit: opts.skipInit });
6300
6339
  });
6301
- program.command("init").description("\u5C06 Skill \u6587\u4EF6\u5199\u5165\u6307\u5B9A AI \u52A9\u624B\u76EE\u5F55\uFF08--ai \u9009\u62E9\u9884\u8BBE\u5E73\u53F0\uFF0C\u6216 --dir \u6307\u5B9A\u4EFB\u610F\u76EE\u5F55\uFF09").option(
6340
+ program.command("init").description("\u5C06 Skill \u6587\u4EF6\u5199\u5165 AI \u52A9\u624B\u76EE\u5F55\uFF08\u9ED8\u8BA4\u5199\u5165\u6240\u6709\u5E73\u53F0\u7684\u9879\u76EE\u7EA7\u76EE\u5F55\uFF0C--global \u5199\u5165\u5168\u5C40\u76EE\u5F55\uFF09").option(
6302
6341
  "-a, --ai <targets>",
6303
- "\u76EE\u6807\u5E73\u53F0\uFF0C\u9017\u53F7\u5206\u9694\uFF1Acursor,claude,openclaw-workspace,openclaw-global,workbuddy-workspace,workbuddy-global,all",
6304
- "cursor"
6342
+ "\u76EE\u6807\u5E73\u53F0\uFF0C\u9017\u53F7\u5206\u9694\uFF1Acursor,claude,agents,windsurf,gemini,codex,opencode,kilo,openclaw,workbuddy,all",
6343
+ "all"
6305
6344
  ).option(
6306
6345
  "-d, --dir <path>",
6307
- "\u5C06 Skill \u6587\u4EF6\u76F4\u63A5\u5199\u5165\u6307\u5B9A\u76EE\u5F55\uFF08\u7EDD\u5BF9\u6216\u76F8\u5BF9\u8DEF\u5F84\uFF09\uFF0C\u4E0E --ai \u4E92\u65A5\uFF0C\u4F18\u5148\u7EA7\u66F4\u9AD8"
6308
- ).option("-f, --force", "\u8986\u76D6\u5DF2\u5B58\u5728\u7684 Skill \u6587\u4EF6", false).action(async (opts) => {
6346
+ "\u5C06 Skill \u6587\u4EF6\u76F4\u63A5\u5199\u5165\u6307\u5B9A\u76EE\u5F55\uFF08\u7EDD\u5BF9\u6216\u76F8\u5BF9\u8DEF\u5F84\uFF09\uFF0C\u4E0E --ai/--global \u4E92\u65A5\uFF0C\u4F18\u5148\u7EA7\u66F4\u9AD8"
6347
+ ).option("-g, --global", "\u5199\u5165\u6240\u6709\u5E73\u53F0\u7684\u5168\u5C40 skill \u76EE\u5F55\uFF08~/.xxx/skills/\uFF09", false).option("-f, --force", "\u8986\u76D6\u5DF2\u5B58\u5728\u7684 Skill \u6587\u4EF6", false).action(async (opts) => {
6309
6348
  await runInit({
6310
6349
  cwd: process.cwd(),
6311
6350
  aiTargets: opts.ai,
6312
6351
  dir: opts.dir,
6352
+ global: Boolean(opts.global),
6313
6353
  force: Boolean(opts.force),
6314
6354
  apiBaseUrl: DEFAULT_API_BASE
6315
6355
  });
@@ -9,43 +9,6 @@ compatibility: Requires siluzan-cso-cli installed and authenticated via `siluzan
9
9
 
10
10
  # siluzan-cso
11
11
 
12
- ## 前置条件与运行时依赖
13
-
14
- 使用本 Skill 前,以下组件必须已安装并就绪:
15
-
16
- ### 必需二进制 / 运行时
17
- | 依赖 | 最低版本 | 用途 |
18
- |------|---------|------|
19
- | **Node.js** | 18+ | CLI 执行运行时以及 `node -e` 数据过滤 |
20
- | **npm** 或 **pnpm** | npm 8+ / pnpm 8+ | 安装 `siluzan-cso-cli` 全局包 |
21
- | **siluzan-cso** CLI | 与 Skill 同版本 | 所有业务操作的执行入口(由 `npm install -g siluzan-cso-cli` 安装) |
22
-
23
- ### 可选二进制
24
- | 依赖 | 用途 |
25
- |------|------|
26
- | **ffmpeg** | `extract-cover` 命令截取视频封面帧(未安装时该命令会报错提示) |
27
-
28
- ### 凭据与配置文件
29
- | 项目 | 位置 | 说明 |
30
- |------|------|------|
31
- | API Key 或 Token | `~/.siluzan/config.json` 中的 `apiKey` 或 `authToken` 字段 | 用于所有 CSO API 调用的鉴权。API Key 在丝路赞控制台「个人设置 → API Key 管理」创建。**请勿将此文件提交到 Git。** |
32
- | csoBaseUrl | `~/.siluzan/config.json` 中的 `apiBaseUrl` | CSO 后端 API 地址,默认值由 CLI 构建时写入 |
33
-
34
- ### 网络端点
35
- 本 Skill 通过 CLI 访问以下远程服务:
36
- | 端点 | 用途 |
37
- |------|------|
38
- | `api.siluzan.com` / `api-ci.siluzan.com` | CSO 核心 API(账号管理、发布、素材、报表等) |
39
- | `cso.siluzan.com` / `cso-ci.siluzan.com` | CSO 前端页面(授权回调等浏览器操作) |
40
- | `www.siluzan.com` / `www-ci.siluzan.com` | 丝路赞主站(注册、API Key 管理) |
41
- | `registry.npmjs.org` | 版本更新检查 |
42
-
43
- ### 可选环境变量
44
- | 变量 | 说明 |
45
- |------|------|
46
- | `SILUZAN_AUTH_TOKEN` | 从环境变量读取 Token(优先级高于 config.json,CI/CD 推荐) |
47
-
48
- 如果上述依赖缺失,请先参照 `references/setup.md` 完成安装与配置。
49
12
 
50
13
  ---
51
14
 
@@ -57,6 +20,16 @@ compatibility: Requires siluzan-cso-cli installed and authenticated via `siluzan
57
20
 
58
21
  ---
59
22
 
23
+ ## 可选环境变量
24
+
25
+ | 变量 | 说明 |
26
+ |------|------|
27
+ | `SILUZAN_API_KEY` | 从环境变量读取 API Key(优先级高于 config.json,CI/CD 推荐) |
28
+ | `SILUZAN_AUTH_TOKEN` | 从环境变量读取 JWT Token(优先级高于 config.json) |
29
+ | `SILUZAN_DATA_PERMISSION` | 从环境变量读取数据权限标识(优先级高于 config.json) |
30
+
31
+ ---
32
+
60
33
  ## 能力范围
61
34
 
62
35
  | 业务流程 | 手段 | 说明 |
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "slug": "siluzan-cso",
3
- "version": "1.1.9-beta.2",
4
- "publishedAt": 1776070442759,
3
+ "version": "1.1.9-beta.3",
4
+ "publishedAt": 1776246656610,
5
5
  "homepage": "https://www.siluzan.com",
6
6
  "source": "https://dev.azure.com/jack4it/Sammamish/_git/siluzan-skill",
7
7
  "requiredBinaries": [
@@ -46,10 +46,26 @@ siluzan-cso config set --token <Token> # 备用:设置 JWT Token
46
46
 
47
47
  API Key 获取入口:`https://cso-ci.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
48
48
 
49
- **Token 读取优先级(由高到低):**
50
- 1. 环境变量 `SILUZAN_AUTH_TOKEN`(CI/CD 推荐)
51
- 2. `~/.siluzan/config.json` → `authToken`(`login` 写入此处)
52
- 3. 命令行 `--token <token>`(仅紧急临时用,用后立即轮换)
49
+ ### 通过环境变量传入凭据(CI/CD 推荐)
50
+
51
+ 无需写入 config.json,直接通过环境变量传入:
52
+
53
+ ```bash
54
+ export SILUZAN_API_KEY=<YOUR_API_KEY> # API Key(推荐)
55
+ # 或
56
+ export SILUZAN_AUTH_TOKEN=<YOUR_TOKEN> # JWT Token
57
+ ```
58
+
59
+ 环境变量优先级高于 config.json,适合 CI/CD、Docker 容器、自动化脚本等场景。可通过 `siluzan-cso config show` 确认当前生效的凭据来源。
60
+
61
+ **凭据读取优先级(由高到低):**
62
+
63
+ | 凭据类型 | 优先级 |
64
+ |---------|--------|
65
+ | API Key | `SILUZAN_API_KEY` 环境变量 → `config.json` → `apiKey` |
66
+ | JWT Token | `--token` CLI 参数 → `SILUZAN_AUTH_TOKEN` 环境变量 → `config.json` → `authToken` |
67
+
68
+ > API Key 鉴权优先级高于 JWT Token,两者同时存在时使用 API Key。
53
69
 
54
70
  > **若用户已配置过凭据,不要重复询问。** 先尝试直接运行命令;只有命令返回认证失败时,才引导用户重新执行 `siluzan-cso login`。
55
71
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-cso-cli",
3
- "version": "1.1.9-beta.2",
3
+ "version": "1.1.9-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
  "type": "module",
6
6
  "bin": {