siluzan-cso-cli 1.1.9-beta.2 → 1.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/index.js +115 -75
- package/dist/skill/SKILL.md +16 -35
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/references/publish.md +1 -1
- package/dist/skill/references/setup.md +24 -8
- package/dist/skill/references/web-pages.md +20 -20
- package/dist/skill/scripts/install.ps1 +254 -0
- package/dist/skill/scripts/install.sh +274 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
在**用户的目标项目根目录**执行(根据用户使用的助手选择 `--ai`):
|
|
43
43
|
|
|
44
44
|
```bash
|
|
45
|
-
npm install -g siluzan-cso-cli
|
|
45
|
+
npm install -g siluzan-cso-cli
|
|
46
46
|
siluzan-cso init --ai cursor # 写入 Cursor(默认)
|
|
47
47
|
siluzan-cso init --ai cursor,claude # 同时写入多个平台
|
|
48
48
|
siluzan-cso init --ai all # 写入所有支持的平台
|
|
@@ -50,7 +50,6 @@ 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`。
|
|
54
53
|
|
|
55
54
|
| 助手 | 建议 `--ai` |
|
|
56
55
|
|------|-------------|
|
package/dist/index.js
CHANGED
|
@@ -1939,11 +1939,11 @@ var require_semver2 = __commonJS({
|
|
|
1939
1939
|
import { Command, Option } from "commander";
|
|
1940
1940
|
|
|
1941
1941
|
// src/config/defaults.ts
|
|
1942
|
-
var BUILD_ENV = "
|
|
1943
|
-
var DEFAULT_API_BASE = "https://api
|
|
1944
|
-
var DEFAULT_CSO_BASE = "https://cso
|
|
1945
|
-
var DEFAULT_WEB_BASE = "https://www
|
|
1946
|
-
var DEFAULT_AGENT_BASE = "https://agent
|
|
1942
|
+
var BUILD_ENV = "production";
|
|
1943
|
+
var DEFAULT_API_BASE = "https://api.siluzan.com";
|
|
1944
|
+
var DEFAULT_CSO_BASE = "https://cso.siluzan.com";
|
|
1945
|
+
var DEFAULT_WEB_BASE = "https://www.siluzan.com";
|
|
1946
|
+
var DEFAULT_AGENT_BASE = "https://agent.mysiluzan.com";
|
|
1947
1947
|
|
|
1948
1948
|
// src/commands/init.ts
|
|
1949
1949
|
import * as fs2 from "fs/promises";
|
|
@@ -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
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
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())
|
|
2004
|
-
|
|
2005
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
|
2091
|
-
const
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
const
|
|
2096
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
6240
|
-
|
|
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 (
|
|
6243
|
-
const
|
|
6244
|
-
|
|
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
|
|
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,
|
|
6304
|
-
"
|
|
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
|
});
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -9,43 +9,14 @@ compatibility: Requires siluzan-cso-cli installed and authenticated via `siluzan
|
|
|
9
9
|
|
|
10
10
|
# siluzan-cso
|
|
11
11
|
|
|
12
|
-
##
|
|
12
|
+
## 一键安装
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
如果 CLI 尚未安装,直接帮用户执行安装脚本(脚本位于 `scripts/install.sh` 和 `scripts/install.ps1`):
|
|
15
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` 安装) |
|
|
16
|
+
- **macOS / Linux / WSL / Git Bash:** `bash scripts/install.sh`
|
|
17
|
+
- **Windows PowerShell:** `powershell -ExecutionPolicy Bypass -File scripts/install.ps1`
|
|
22
18
|
|
|
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` 完成安装与配置。
|
|
19
|
+
脚本会自动完成 Node.js 检测/安装、CLI 全局安装、Skill 全局注册,并交互式引导用户配置 API Key。
|
|
49
20
|
|
|
50
21
|
---
|
|
51
22
|
|
|
@@ -57,6 +28,16 @@ compatibility: Requires siluzan-cso-cli installed and authenticated via `siluzan
|
|
|
57
28
|
|
|
58
29
|
---
|
|
59
30
|
|
|
31
|
+
## 可选环境变量
|
|
32
|
+
|
|
33
|
+
| 变量 | 说明 |
|
|
34
|
+
|------|------|
|
|
35
|
+
| `SILUZAN_API_KEY` | 从环境变量读取 API Key(优先级高于 config.json,CI/CD 推荐) |
|
|
36
|
+
| `SILUZAN_AUTH_TOKEN` | 从环境变量读取 JWT Token(优先级高于 config.json) |
|
|
37
|
+
| `SILUZAN_DATA_PERMISSION` | 从环境变量读取数据权限标识(优先级高于 config.json) |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
60
41
|
## 能力范围
|
|
61
42
|
|
|
62
43
|
| 业务流程 | 手段 | 说明 |
|
|
@@ -174,6 +155,6 @@ account-group ──需要 mediaCustomerId──► list-accounts
|
|
|
174
155
|
|
|
175
156
|
> 无对应 CLI 命令的模块,或需要引导用户在网页端查看数据时,查阅 `references/web-pages.md` 获取完整页面清单与链接。
|
|
176
157
|
|
|
177
|
-
URL 格式:`https://www
|
|
158
|
+
URL 格式:`https://www.siluzan.com/v3/foreign_trade/cso/{页面}`
|
|
178
159
|
|
|
179
160
|
常用页面:`task`(任务管理)· `postVideo`(发布页)· `ManageAccounts`(账号管理)· `planning`(AI 内容规划)· `table`(绩效报表)· `Workdata`(作品数据)
|
package/dist/skill/_meta.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "siluzan-cso",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"publishedAt":
|
|
3
|
+
"version": "1.1.10",
|
|
4
|
+
"publishedAt": 1776306496073,
|
|
5
5
|
"homepage": "https://www.siluzan.com",
|
|
6
6
|
"source": "https://dev.azure.com/jack4it/Sammamish/_git/siluzan-skill",
|
|
7
7
|
"requiredBinaries": [
|
|
@@ -199,7 +199,7 @@ siluzan-cso publish -c publish-config.json
|
|
|
199
199
|
|
|
200
200
|
> 查询发布状态、处理失败项 → 参见 `references/task.md`
|
|
201
201
|
|
|
202
|
-
前往 CSO 任务管理页面查看进度:`https://www
|
|
202
|
+
前往 CSO 任务管理页面查看进度:`https://www.siluzan.com/v3/foreign_trade/cso/task`
|
|
203
203
|
|
|
204
204
|
---
|
|
205
205
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## 安装 CLI
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npm install -g siluzan-cso-cli
|
|
6
|
+
npm install -g siluzan-cso-cli
|
|
7
7
|
```
|
|
8
8
|
|
|
9
9
|
环境要求:Node.js 18+
|
|
@@ -44,12 +44,28 @@ siluzan-cso config set --token <Token> # 备用:设置 JWT Token
|
|
|
44
44
|
|
|
45
45
|
> **⚠️ 不要使用 `config set --token <token>` 的方式。** 该方式会将 Token 明文写入 shell history(`~/.bash_history`、`~/.zsh_history`、PowerShell 历史),存在凭证泄露风险。推荐使用 `siluzan-cso login` 交互式输入。
|
|
46
46
|
|
|
47
|
-
API Key 获取入口:`https://cso
|
|
47
|
+
API Key 获取入口:`https://cso.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
|
|
@@ -63,8 +79,8 @@ siluzan-cso config show
|
|
|
63
79
|
输出示例:
|
|
64
80
|
```
|
|
65
81
|
构建环境 : production
|
|
66
|
-
apiBaseUrl : https://api
|
|
67
|
-
csoBaseUrl : https://cso
|
|
82
|
+
apiBaseUrl : https://api.siluzan.com
|
|
83
|
+
csoBaseUrl : https://cso.siluzan.com
|
|
68
84
|
apiKey : abcd****1234
|
|
69
85
|
```
|
|
70
86
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# web-pages — CSO 后台页面速查
|
|
2
2
|
|
|
3
3
|
> 当需要引导用户前往网页端查看数据或执行操作时,使用本文件中的页面链接。
|
|
4
|
-
> URL 格式:`https://www
|
|
4
|
+
> URL 格式:`https://www.siluzan.com/v3/foreign_trade/cso/{页面路径}`
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
|
|
12
12
|
| 页面 | 完整链接 | 功能说明 |
|
|
13
13
|
|------|----------|----------|
|
|
14
|
-
| 账号管理 | `https://www
|
|
15
|
-
| 账号分组 | `https://www
|
|
16
|
-
| 重点账号 | `https://www
|
|
14
|
+
| 账号管理 | `https://www.siluzan.com/v3/foreign_trade/cso/ManageAccounts` | 绑定/授权/查看媒体账号列表、账号状态、Token 到期时间 |
|
|
15
|
+
| 账号分组 | `https://www.siluzan.com/v3/foreign_trade/cso/AccountGroup` | 新建分组、管理分组内账号 |
|
|
16
|
+
| 重点账号 | `https://www.siluzan.com/v3/foreign_trade/cso/KeyAccounts` | 配置重点关注账号、数据备份 |
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
---
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
|
|
23
23
|
| 页面 | 完整链接 | 功能说明 |
|
|
24
24
|
|------|----------|----------|
|
|
25
|
-
| 发布作品 | `https://www
|
|
25
|
+
| 发布作品 | `https://www.siluzan.com/v3/foreign_trade/cso/postVideo?contentType=1` | 矩阵发布视频、图文、草稿管理、话题组 contentType=1 是视频,contentType=2是图文 |
|
|
26
26
|
|
|
27
|
-
| 发布日历 | `https://www
|
|
28
|
-
| 营销日历 | `https://www
|
|
27
|
+
| 发布日历 | `https://www.siluzan.com/v3/foreign_trade/cso/publishCalendar` | 日历视图规划发布任务、创建/编辑发布任务 |
|
|
28
|
+
| 营销日历 | `https://www.siluzan.com/v3/foreign_trade/cso/marketingCalendar` | 营销节点日历、跳转创建发布任务 |
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
|
|
34
34
|
| 页面 | 完整链接 | 功能说明 |
|
|
35
35
|
|------|----------|----------|
|
|
36
|
-
| 任务列表 | `https://www
|
|
37
|
-
| 视频管理 | `https://www
|
|
38
|
-
| 视频搬家 | `https://www
|
|
39
|
-
| 搬家记录 | `https://www
|
|
36
|
+
| 任务列表 | `https://www.siluzan.com/v3/foreign_trade/cso/task` | 发布任务列表、状态筛选、任务详情抽屉 |
|
|
37
|
+
| 视频管理 | `https://www.siluzan.com/v3/foreign_trade/cso/VideoMgr` | 已发布视频/图文列表、删除、重发、评论查看 |
|
|
38
|
+
| 视频搬家 | `https://www.siluzan.com/v3/foreign_trade/cso/relocation` | 将视频搬运到其他平台 |
|
|
39
|
+
| 搬家记录 | `https://www.siluzan.com/v3/foreign_trade/cso/MovingRecord` | 搬家任务列表与执行状态 |
|
|
40
40
|
|
|
41
41
|
---
|
|
42
42
|
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
|
|
45
45
|
| 页面 | 完整链接 | 功能说明 |
|
|
46
46
|
|------|----------|----------|
|
|
47
|
-
| 私信管理 | `https://www
|
|
48
|
-
| 评论管理 | `https://www
|
|
49
|
-
| 智能互动 | `https://www
|
|
47
|
+
| 私信管理 | `https://www.siluzan.com/v3/foreign_trade/cso/letter` | 按渠道/时间查看与处理私信(多平台 Tab) |
|
|
48
|
+
| 评论管理 | `https://www.siluzan.com/v3/foreign_trade/cso/comment` | 收到的评论列表、回复、账号组筛选 |
|
|
49
|
+
| 智能互动 | `https://www.siluzan.com/v3/foreign_trade/cso/interaction` | 私信欢迎语、自动回复规则配置 |
|
|
50
50
|
|
|
51
51
|
---
|
|
52
52
|
|
|
@@ -54,9 +54,9 @@
|
|
|
54
54
|
|
|
55
55
|
| 页面 | 完整链接 | 功能说明 |
|
|
56
56
|
|------|----------|----------|
|
|
57
|
-
| 作品数据 | `https://www
|
|
58
|
-
| 账户数据 | `https://www
|
|
59
|
-
| 绩效报表 | `https://www
|
|
57
|
+
| 作品数据 | `https://www.siluzan.com/v3/foreign_trade/cso/Workdata` | 作品维度统计、图表、明细(对应 CLI `report fetch`) |
|
|
58
|
+
| 账户数据 | `https://www.siluzan.com/v3/foreign_trade/cso/accountdata` | 账户维度汇总数据、趋势图表 |
|
|
59
|
+
| 绩效报表 | `https://www.siluzan.com/v3/foreign_trade/cso/table` | 多维度绩效报表、PDF 导出(对应 CLI `report fetch/records/download`) |
|
|
60
60
|
|
|
61
61
|
---
|
|
62
62
|
|
|
@@ -64,10 +64,10 @@
|
|
|
64
64
|
|
|
65
65
|
| 页面 | 完整链接 | 功能说明 |
|
|
66
66
|
|------|----------|----------|
|
|
67
|
-
| 内容规划 | `https://www
|
|
68
|
-
| 营销首页 | `https://www
|
|
67
|
+
| 内容规划 | `https://www.siluzan.com/v3/foreign_trade/cso/planning` | AI 内容规划列表、生成规划、企业维度筛选(对应 CLI `planning`) |
|
|
68
|
+
| 营销首页 | `https://www.siluzan.com/v3/foreign_trade/cso/ContentHome` | 工作台总览:账号数、视频数、最新评论与视频 |
|
|
69
69
|
|
|
70
|
-
| 话题组 | `https://www
|
|
70
|
+
| 话题组 | `https://www.siluzan.com/v3/foreign_trade/cso/TopicGroup` | 话题组维护、话题内容管理 |
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
---
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
#Requires -Version 5.1
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# Siluzan Skill 一键安装脚本 (PowerShell)
|
|
4
|
+
# 适用系统:Windows 10/11 (PowerShell 5.1+ 或 PowerShell 7+)
|
|
5
|
+
# 使用方式:irm https://skill.siluzan.com/install.ps1 | iex
|
|
6
|
+
# =============================================================================
|
|
7
|
+
|
|
8
|
+
$ErrorActionPreference = 'Stop'
|
|
9
|
+
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
10
|
+
|
|
11
|
+
# ── 常量 ─────────────────────────────────────────────────────────────────────
|
|
12
|
+
$NODE_MAJOR_MIN = 18
|
|
13
|
+
$WEB_BASE = 'https://www.siluzan.com'
|
|
14
|
+
$API_KEY_URL = "$WEB_BASE/v3/foreign_trade/settings/apiKeyManagement"
|
|
15
|
+
$NPM_MIRROR = 'https://registry.npmmirror.com'
|
|
16
|
+
|
|
17
|
+
# ── 辅助函数 ──────────────────────────────────────────────────────────────────
|
|
18
|
+
function Write-Info { param([string]$Msg) Write-Host "[OK] $Msg" -ForegroundColor Green }
|
|
19
|
+
function Write-Warn { param([string]$Msg) Write-Host "[!] $Msg" -ForegroundColor Yellow }
|
|
20
|
+
function Write-Err { param([string]$Msg) Write-Host "[X] $Msg" -ForegroundColor Red }
|
|
21
|
+
function Write-Step { param([string]$Msg) Write-Host "`n-- $Msg --" -ForegroundColor White }
|
|
22
|
+
|
|
23
|
+
function Read-Input {
|
|
24
|
+
param([string]$Prompt)
|
|
25
|
+
Write-Host $Prompt -NoNewline
|
|
26
|
+
return [Console]::ReadLine()
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function Refresh-Path {
|
|
30
|
+
$machinePath = [Environment]::GetEnvironmentVariable('Path', 'Machine')
|
|
31
|
+
$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')
|
|
32
|
+
$env:Path = "$machinePath;$userPath"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# ── Node.js 版本检查 ─────────────────────────────────────────────────────────
|
|
36
|
+
function Test-NodeVersion {
|
|
37
|
+
try {
|
|
38
|
+
$nodeCmd = Get-Command node -ErrorAction SilentlyContinue
|
|
39
|
+
if (-not $nodeCmd) { return $false }
|
|
40
|
+
$ver = (node -v) -replace '^v', ''
|
|
41
|
+
$major = [int]($ver.Split('.')[0])
|
|
42
|
+
return $major -ge $NODE_MAJOR_MIN
|
|
43
|
+
} catch {
|
|
44
|
+
return $false
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function Get-NodeVersionString {
|
|
49
|
+
try { return (node -v) } catch { return 'N/A' }
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
# ── Node.js 安装 ─────────────────────────────────────────────────────────────
|
|
53
|
+
function Install-NodeJS {
|
|
54
|
+
$hasWinget = $null -ne (Get-Command winget -ErrorAction SilentlyContinue)
|
|
55
|
+
|
|
56
|
+
if ($hasWinget) {
|
|
57
|
+
Write-Info "通过 winget 安装 Node.js LTS..."
|
|
58
|
+
winget install -e --id OpenJS.NodeJS.LTS --silent --accept-package-agreements --accept-source-agreements
|
|
59
|
+
if ($LASTEXITCODE -ne 0) {
|
|
60
|
+
Write-Warn "winget 安装返回非零状态,尝试备用方案..."
|
|
61
|
+
Install-NodeFallback
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
} else {
|
|
65
|
+
Install-NodeFallback
|
|
66
|
+
return
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
Refresh-Path
|
|
70
|
+
|
|
71
|
+
if (-not (Test-NodeVersion)) {
|
|
72
|
+
Write-Warn "刷新 PATH 后仍未找到 Node.js,尝试定位安装目录..."
|
|
73
|
+
$progFiles = $env:ProgramFiles
|
|
74
|
+
$nodePath = "$progFiles\nodejs"
|
|
75
|
+
if (Test-Path "$nodePath\node.exe") {
|
|
76
|
+
$env:Path = "$nodePath;$env:Path"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function Install-NodeFallback {
|
|
82
|
+
Write-Err "无法自动安装 Node.js"
|
|
83
|
+
Write-Host ''
|
|
84
|
+
Write-Host " 请手动安装 Node.js:" -ForegroundColor Cyan
|
|
85
|
+
Write-Host ' https://nodejs.org/en/download/'
|
|
86
|
+
Write-Host ''
|
|
87
|
+
Write-Host " 安装完成后,重新打开 PowerShell 并再次运行本脚本。"
|
|
88
|
+
throw "需要先安装 Node.js"
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
# ── 主流程 ────────────────────────────────────────────────────────────────────
|
|
92
|
+
function Main {
|
|
93
|
+
Write-Host ''
|
|
94
|
+
Write-Host '+---------------------------------------------+' -ForegroundColor White
|
|
95
|
+
Write-Host '| Siluzan Skill 一键安装 |' -ForegroundColor White
|
|
96
|
+
Write-Host '+---------------------------------------------+' -ForegroundColor White
|
|
97
|
+
Write-Host ''
|
|
98
|
+
|
|
99
|
+
# ── 步骤 1:环境检查 ──
|
|
100
|
+
Write-Step "步骤 1/5:环境检查"
|
|
101
|
+
|
|
102
|
+
if (Test-NodeVersion) {
|
|
103
|
+
Write-Info "Node.js $(Get-NodeVersionString) 已安装"
|
|
104
|
+
} else {
|
|
105
|
+
$nodeCmd = Get-Command node -ErrorAction SilentlyContinue
|
|
106
|
+
if ($nodeCmd) {
|
|
107
|
+
Write-Warn "Node.js $(Get-NodeVersionString) 版本过低(需要 >= $NODE_MAJOR_MIN),即将升级..."
|
|
108
|
+
} else {
|
|
109
|
+
Write-Warn "未检测到 Node.js,即将自动安装..."
|
|
110
|
+
}
|
|
111
|
+
Install-NodeJS
|
|
112
|
+
|
|
113
|
+
if (-not (Test-NodeVersion)) {
|
|
114
|
+
Write-Err "Node.js 安装失败,请手动安装:https://nodejs.org/"
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
Write-Info "Node.js $(Get-NodeVersionString) 安装成功"
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
$npmCmd = Get-Command npm -ErrorAction SilentlyContinue
|
|
121
|
+
if (-not $npmCmd) {
|
|
122
|
+
Refresh-Path
|
|
123
|
+
$npmCmd = Get-Command npm -ErrorAction SilentlyContinue
|
|
124
|
+
}
|
|
125
|
+
if (-not $npmCmd) {
|
|
126
|
+
Write-Err "未找到 npm(Node.js 安装可能不完整)"
|
|
127
|
+
return
|
|
128
|
+
}
|
|
129
|
+
Write-Info "npm 就绪"
|
|
130
|
+
|
|
131
|
+
# 切换 npm 源到国内镜像(加速下载)
|
|
132
|
+
$currentRegistry = ''
|
|
133
|
+
try { $currentRegistry = (npm config get registry 2>$null).Trim() } catch {}
|
|
134
|
+
if ($currentRegistry -ne $NPM_MIRROR -and $currentRegistry -ne "$NPM_MIRROR/") {
|
|
135
|
+
Write-Info "切换 npm registry → 国内镜像(npmmirror.com)加速下载..."
|
|
136
|
+
npm config set registry $NPM_MIRROR
|
|
137
|
+
Write-Info "npm registry 已设置为 $NPM_MIRROR"
|
|
138
|
+
} else {
|
|
139
|
+
Write-Info "npm registry 已是国内镜像"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
# ── 步骤 2:选择 Skill ──
|
|
143
|
+
Write-Step "步骤 2/5:选择 Skill"
|
|
144
|
+
Write-Host " 1) CSO — 内容发布(视频/图文 → 抖音/视频号/YouTube/TikTok 等)"
|
|
145
|
+
Write-Host " 2) TSO — 广告管理(查账户/余额/消耗/充值/开户/MCC 等)"
|
|
146
|
+
Write-Host " 3) 两者都安装"
|
|
147
|
+
Write-Host ''
|
|
148
|
+
$skillChoice = Read-Input " 请选择 [1/2/3,默认 3]: "
|
|
149
|
+
if ([string]::IsNullOrWhiteSpace($skillChoice)) { $skillChoice = '3' }
|
|
150
|
+
|
|
151
|
+
$installCso = $false
|
|
152
|
+
$installTso = $false
|
|
153
|
+
switch ($skillChoice) {
|
|
154
|
+
'1' { $installCso = $true }
|
|
155
|
+
'2' { $installTso = $true }
|
|
156
|
+
default { $installCso = $true; $installTso = $true }
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
# ── 步骤 3:安装 CLI + 全局注册 Skill ──
|
|
160
|
+
Write-Step "步骤 3/5:安装 CLI 并注册 Skill 到所有 AI 平台"
|
|
161
|
+
|
|
162
|
+
if ($installCso) {
|
|
163
|
+
Write-Info "安装 siluzan-cso-cli..."
|
|
164
|
+
npm install -g siluzan-cso-cli
|
|
165
|
+
if ($LASTEXITCODE -ne 0) { Write-Err "安装 siluzan-cso-cli 失败"; return }
|
|
166
|
+
Write-Info "注册 CSO Skill 到所有平台全局目录..."
|
|
167
|
+
siluzan-cso init --global --force
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if ($installTso) {
|
|
171
|
+
Write-Info "安装 siluzan-tso-cli..."
|
|
172
|
+
npm install -g siluzan-tso-cli
|
|
173
|
+
if ($LASTEXITCODE -ne 0) { Write-Err "安装 siluzan-tso-cli 失败"; return }
|
|
174
|
+
Write-Info "注册 TSO Skill 到所有平台全局目录..."
|
|
175
|
+
siluzan-tso init --global --force
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
# ── 步骤 4:打开浏览器引导创建 API Key ──
|
|
179
|
+
Write-Step "步骤 4/5:配置 API Key"
|
|
180
|
+
Write-Host ''
|
|
181
|
+
Write-Host " 即将打开 API Key 管理页面,请在浏览器中:"
|
|
182
|
+
Write-Host " ① 注册 / 登录 Siluzan 账号"
|
|
183
|
+
Write-Host " ② 点击「新建 API Key」"
|
|
184
|
+
|
|
185
|
+
if ($installCso -and $installTso) {
|
|
186
|
+
Write-Host " ③ 勾选权限:素材、CSO(素材中心服务)和 TSO(广告投放服务)"
|
|
187
|
+
} elseif ($installCso) {
|
|
188
|
+
Write-Host " ③ 勾选权限:素材、CSO(素材中心服务)"
|
|
189
|
+
} else {
|
|
190
|
+
Write-Host " ③ 勾选权限:素材、TSO(广告投放服务)"
|
|
191
|
+
}
|
|
192
|
+
Write-Host " ④ 复制生成的 API Key"
|
|
193
|
+
Write-Host ''
|
|
194
|
+
|
|
195
|
+
try {
|
|
196
|
+
Start-Process $API_KEY_URL
|
|
197
|
+
Write-Info "已在浏览器中打开 API Key 管理页面"
|
|
198
|
+
} catch {
|
|
199
|
+
Write-Warn "无法自动打开浏览器,请手动访问:"
|
|
200
|
+
Write-Host " $API_KEY_URL" -ForegroundColor Cyan
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
Write-Host ''
|
|
204
|
+
$apiKey = Read-Input " 粘贴 API Key(直接回车跳过): "
|
|
205
|
+
|
|
206
|
+
if (-not [string]::IsNullOrWhiteSpace($apiKey)) {
|
|
207
|
+
if ($installCso) {
|
|
208
|
+
siluzan-cso login --api-key $apiKey
|
|
209
|
+
}
|
|
210
|
+
if ($installTso) {
|
|
211
|
+
siluzan-tso login --api-key $apiKey
|
|
212
|
+
}
|
|
213
|
+
Write-Info "API Key 已保存到 ~/.siluzan/config.json"
|
|
214
|
+
} else {
|
|
215
|
+
Write-Host ''
|
|
216
|
+
Write-Warn "已跳过 API Key 配置,后续可通过以下方式设置:"
|
|
217
|
+
Write-Host " 方式 1:siluzan-cso login --api-key YOUR_API_KEY"
|
|
218
|
+
Write-Host " 方式 2:`$env:SILUZAN_API_KEY = 'YOUR_API_KEY'"
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
# ── 步骤 5:完成 ──
|
|
222
|
+
Write-Step "步骤 5/5:安装完成"
|
|
223
|
+
Write-Host ''
|
|
224
|
+
Write-Host " Siluzan Skill 安装成功!" -ForegroundColor Green
|
|
225
|
+
Write-Host ''
|
|
226
|
+
Write-Host " 已安装到以下全局 Skill 目录(所有 AI 助手通用):"
|
|
227
|
+
Write-Host ' ~/.cursor/skills/ ~/.claude/skills/ ~/.agents/skills/' -ForegroundColor DarkGray
|
|
228
|
+
Write-Host ' ~/.gemini/skills/ ~/.codex/skills/ ~/.kilo/skills/' -ForegroundColor DarkGray
|
|
229
|
+
Write-Host ' ~/.codeium/windsurf/skills/ ~/.config/opencode/skills/' -ForegroundColor DarkGray
|
|
230
|
+
Write-Host ' ~/.openclaw/skills/ ~/.workbuddy/skills/' -ForegroundColor DarkGray
|
|
231
|
+
Write-Host ''
|
|
232
|
+
Write-Host " 常用命令:"
|
|
233
|
+
if ($installCso) {
|
|
234
|
+
Write-Host " siluzan-cso list-accounts # 查看媒体账号"
|
|
235
|
+
Write-Host " siluzan-cso publish --help # 发布内容"
|
|
236
|
+
}
|
|
237
|
+
if ($installTso) {
|
|
238
|
+
Write-Host " siluzan-tso list-accounts # 查看广告账户"
|
|
239
|
+
Write-Host " siluzan-tso balance --help # 查询余额"
|
|
240
|
+
}
|
|
241
|
+
Write-Host ''
|
|
242
|
+
Write-Host " 更新 CLI 与 Skill 文件:"
|
|
243
|
+
if ($installCso) {
|
|
244
|
+
Write-Host " siluzan-cso update"
|
|
245
|
+
}
|
|
246
|
+
if ($installTso) {
|
|
247
|
+
Write-Host " siluzan-tso update"
|
|
248
|
+
}
|
|
249
|
+
Write-Host ''
|
|
250
|
+
Write-Info "如遇问题请查看 $WEB_BASE 或联系支持"
|
|
251
|
+
Write-Host ''
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
Main
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# Siluzan Skill 一键安装脚本
|
|
4
|
+
# 支持系统:macOS、Linux、Windows (Git Bash / WSL)
|
|
5
|
+
# 使用方式:bash <(curl -fsSL https://skill.siluzan.com/install.sh)
|
|
6
|
+
# =============================================================================
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
# ── 常量 ─────────────────────────────────────────────────────────────────────
|
|
11
|
+
RED='\033[0;31m'
|
|
12
|
+
GREEN='\033[0;32m'
|
|
13
|
+
YELLOW='\033[1;33m'
|
|
14
|
+
CYAN='\033[0;36m'
|
|
15
|
+
BOLD='\033[1m'
|
|
16
|
+
DIM='\033[2m'
|
|
17
|
+
NC='\033[0m'
|
|
18
|
+
|
|
19
|
+
readonly NODE_MAJOR_MIN=18
|
|
20
|
+
readonly WEB_BASE="https://www.siluzan.com"
|
|
21
|
+
readonly API_KEY_URL="${WEB_BASE}/v3/foreign_trade/settings/apiKeyManagement"
|
|
22
|
+
readonly NPM_MIRROR="https://registry.npmmirror.com"
|
|
23
|
+
|
|
24
|
+
# ── 辅助函数 ──────────────────────────────────────────────────────────────────
|
|
25
|
+
info() { printf "${GREEN}[✓]${NC} %s\n" "$1"; }
|
|
26
|
+
warn() { printf "${YELLOW}[!]${NC} %s\n" "$1"; }
|
|
27
|
+
error() { printf "${RED}[✗]${NC} %s\n" "$1" >&2; }
|
|
28
|
+
step() { printf "\n${BOLD}── 步骤 %s ──${NC}\n" "$1"; }
|
|
29
|
+
|
|
30
|
+
read_input() {
|
|
31
|
+
local prompt="$1" val=""
|
|
32
|
+
printf "%s" "$prompt"
|
|
33
|
+
read -r val < /dev/tty 2>/dev/null || read -r val
|
|
34
|
+
echo "$val"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# ── 检测操作系统 ──────────────────────────────────────────────────────────────
|
|
38
|
+
detect_os() {
|
|
39
|
+
local uname_out
|
|
40
|
+
uname_out=$(uname -s 2>/dev/null || echo "Unknown")
|
|
41
|
+
case "$uname_out" in
|
|
42
|
+
Darwin*) echo "macos" ;;
|
|
43
|
+
Linux*) echo "linux" ;;
|
|
44
|
+
MINGW*|MSYS*|CYGWIN*) echo "gitbash" ;;
|
|
45
|
+
*) echo "unknown" ;;
|
|
46
|
+
esac
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
# ── 打开浏览器 ───────────────────────────────────────────────────────────────
|
|
50
|
+
open_url() {
|
|
51
|
+
local url="$1"
|
|
52
|
+
local os_type
|
|
53
|
+
os_type=$(detect_os)
|
|
54
|
+
case "$os_type" in
|
|
55
|
+
macos) open "$url" 2>/dev/null && return 0 ;;
|
|
56
|
+
linux) xdg-open "$url" 2>/dev/null && return 0 ;;
|
|
57
|
+
gitbash) start "$url" 2>/dev/null && return 0 ;;
|
|
58
|
+
esac
|
|
59
|
+
return 1
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
# ── Node.js 安装 ─────────────────────────────────────────────────────────────
|
|
63
|
+
node_version_ok() {
|
|
64
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
65
|
+
return 1
|
|
66
|
+
fi
|
|
67
|
+
local version major
|
|
68
|
+
version=$(node -v | tr -d 'v')
|
|
69
|
+
major=$(echo "$version" | cut -d. -f1)
|
|
70
|
+
[ "$major" -ge "$NODE_MAJOR_MIN" ]
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
install_node() {
|
|
74
|
+
local os_type
|
|
75
|
+
os_type=$(detect_os)
|
|
76
|
+
|
|
77
|
+
case "$os_type" in
|
|
78
|
+
macos)
|
|
79
|
+
if command -v brew >/dev/null 2>&1; then
|
|
80
|
+
info "通过 Homebrew 安装 Node.js LTS..."
|
|
81
|
+
brew install node@22
|
|
82
|
+
brew link --overwrite node@22 2>/dev/null || true
|
|
83
|
+
else
|
|
84
|
+
info "通过 install-node.vercel.app 安装 Node.js LTS..."
|
|
85
|
+
curl -fsSL https://install-node.vercel.app/lts | bash -s -- --yes
|
|
86
|
+
fi
|
|
87
|
+
;;
|
|
88
|
+
linux)
|
|
89
|
+
if command -v apt-get >/dev/null 2>&1; then
|
|
90
|
+
info "通过 NodeSource 安装 Node.js 22.x (apt)..."
|
|
91
|
+
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
|
|
92
|
+
sudo apt-get install -y nodejs
|
|
93
|
+
elif command -v yum >/dev/null 2>&1; then
|
|
94
|
+
info "通过 NodeSource 安装 Node.js 22.x (yum)..."
|
|
95
|
+
curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo -E bash -
|
|
96
|
+
sudo yum install -y nodejs
|
|
97
|
+
else
|
|
98
|
+
info "通过 install-node.vercel.app 安装 Node.js LTS..."
|
|
99
|
+
curl -fsSL https://install-node.vercel.app/lts | bash -s -- --yes
|
|
100
|
+
fi
|
|
101
|
+
;;
|
|
102
|
+
gitbash)
|
|
103
|
+
error "Git Bash 无法自动安装 Node.js。"
|
|
104
|
+
echo ""
|
|
105
|
+
echo " 请使用以下方式之一安装:"
|
|
106
|
+
echo " 1. 在 PowerShell 中运行:irm https://skill.siluzan.com/install.ps1 | iex"
|
|
107
|
+
echo " 2. 手动下载安装:https://nodejs.org/en/download/"
|
|
108
|
+
echo ""
|
|
109
|
+
exit 1
|
|
110
|
+
;;
|
|
111
|
+
*)
|
|
112
|
+
error "不支持的系统,请手动安装 Node.js >= $NODE_MAJOR_MIN:"
|
|
113
|
+
echo " https://nodejs.org/en/download/"
|
|
114
|
+
exit 1
|
|
115
|
+
;;
|
|
116
|
+
esac
|
|
117
|
+
|
|
118
|
+
# 刷新 PATH(某些安装方式需要)
|
|
119
|
+
export PATH="$HOME/.local/bin:$HOME/.nodejs/bin:/usr/local/bin:$PATH"
|
|
120
|
+
hash -r 2>/dev/null || true
|
|
121
|
+
|
|
122
|
+
if ! node_version_ok; then
|
|
123
|
+
error "Node.js 安装似乎未成功,请手动安装后重试"
|
|
124
|
+
echo " https://nodejs.org/en/download/"
|
|
125
|
+
exit 1
|
|
126
|
+
fi
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
# ── 主流程 ────────────────────────────────────────────────────────────────────
|
|
130
|
+
main() {
|
|
131
|
+
echo ""
|
|
132
|
+
echo -e "${BOLD}╭─────────────────────────────────────────────╮${NC}"
|
|
133
|
+
echo -e "${BOLD}│ Siluzan Skill 一键安装 │${NC}"
|
|
134
|
+
echo -e "${BOLD}╰─────────────────────────────────────────────╯${NC}"
|
|
135
|
+
echo ""
|
|
136
|
+
|
|
137
|
+
# ── 步骤 1:环境检查与 Node.js 安装 ──
|
|
138
|
+
step "1/5:环境检查"
|
|
139
|
+
|
|
140
|
+
if node_version_ok; then
|
|
141
|
+
info "Node.js $(node -v) 已安装"
|
|
142
|
+
else
|
|
143
|
+
if command -v node >/dev/null 2>&1; then
|
|
144
|
+
warn "Node.js $(node -v) 版本过低(需要 >= ${NODE_MAJOR_MIN}),即将升级..."
|
|
145
|
+
else
|
|
146
|
+
warn "未检测到 Node.js,即将自动安装..."
|
|
147
|
+
fi
|
|
148
|
+
install_node
|
|
149
|
+
info "Node.js $(node -v) 安装成功"
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
if command -v pnpm >/dev/null 2>&1; then
|
|
153
|
+
PKG_MANAGER="pnpm"
|
|
154
|
+
elif command -v npm >/dev/null 2>&1; then
|
|
155
|
+
PKG_MANAGER="npm"
|
|
156
|
+
else
|
|
157
|
+
error "npm 未找到(Node.js 安装可能不完整)"
|
|
158
|
+
exit 1
|
|
159
|
+
fi
|
|
160
|
+
info "$PKG_MANAGER 就绪"
|
|
161
|
+
|
|
162
|
+
# 切换 npm 源到国内镜像(加速下载)
|
|
163
|
+
local current_registry
|
|
164
|
+
current_registry=$(npm config get registry 2>/dev/null || echo "")
|
|
165
|
+
if [ "$current_registry" != "$NPM_MIRROR" ] && [ "$current_registry" != "${NPM_MIRROR}/" ]; then
|
|
166
|
+
info "切换 npm registry → 国内镜像(npmmirror.com)加速下载..."
|
|
167
|
+
npm config set registry "$NPM_MIRROR"
|
|
168
|
+
info "npm registry 已设置为 $NPM_MIRROR"
|
|
169
|
+
else
|
|
170
|
+
info "npm registry 已是国内镜像"
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# ── 步骤 2:选择要安装的 Skill ──
|
|
174
|
+
step "2/5:选择 Skill"
|
|
175
|
+
echo " 1) CSO — 内容发布(视频/图文 → 抖音/视频号/YouTube/TikTok 等)"
|
|
176
|
+
echo " 2) TSO — 广告管理(查账户/余额/消耗/充值/开户/MCC 等)"
|
|
177
|
+
echo " 3) 两者都安装"
|
|
178
|
+
echo ""
|
|
179
|
+
local skill_choice
|
|
180
|
+
skill_choice=$(read_input " 请选择 [1/2/3,默认 3]: ")
|
|
181
|
+
: "${skill_choice:=3}"
|
|
182
|
+
|
|
183
|
+
local install_cso=0 install_tso=0
|
|
184
|
+
case "$skill_choice" in
|
|
185
|
+
1) install_cso=1 ;;
|
|
186
|
+
2) install_tso=1 ;;
|
|
187
|
+
*) install_cso=1; install_tso=1 ;;
|
|
188
|
+
esac
|
|
189
|
+
|
|
190
|
+
# ── 步骤 3:安装 CLI 并全局注册 Skill ──
|
|
191
|
+
step "3/5:安装 CLI 并注册 Skill 到所有 AI 平台"
|
|
192
|
+
|
|
193
|
+
if [ "$install_cso" -eq 1 ]; then
|
|
194
|
+
info "安装 siluzan-cso-cli..."
|
|
195
|
+
$PKG_MANAGER install -g siluzan-cso-cli
|
|
196
|
+
info "注册 CSO Skill 到所有平台全局目录..."
|
|
197
|
+
siluzan-cso init --global --force
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
if [ "$install_tso" -eq 1 ]; then
|
|
201
|
+
info "安装 siluzan-tso-cli..."
|
|
202
|
+
$PKG_MANAGER install -g siluzan-tso-cli
|
|
203
|
+
info "注册 TSO Skill 到所有平台全局目录..."
|
|
204
|
+
siluzan-tso init --global --force
|
|
205
|
+
fi
|
|
206
|
+
|
|
207
|
+
# ── 步骤 4:打开浏览器并引导创建 API Key ──
|
|
208
|
+
step "4/5:配置 API Key"
|
|
209
|
+
echo ""
|
|
210
|
+
echo " 即将打开 API Key 管理页面,请在浏览器中:"
|
|
211
|
+
echo " ① 注册 / 登录 Siluzan 账号"
|
|
212
|
+
echo " ② 点击「新建 API Key」"
|
|
213
|
+
if [ "$install_cso" -eq 1 ] && [ "$install_tso" -eq 1 ]; then
|
|
214
|
+
echo " ③ 勾选权限:素材、CSO(素材中心服务)和 TSO(广告投放服务)"
|
|
215
|
+
elif [ "$install_cso" -eq 1 ]; then
|
|
216
|
+
echo " ③ 勾选权限:素材、CSO(素材中心服务)"
|
|
217
|
+
else
|
|
218
|
+
echo " ③ 勾选权限:素材、TSO(广告投放服务)"
|
|
219
|
+
fi
|
|
220
|
+
echo " ④ 复制生成的 API Key"
|
|
221
|
+
echo ""
|
|
222
|
+
|
|
223
|
+
if ! open_url "$API_KEY_URL"; then
|
|
224
|
+
warn "无法自动打开浏览器,请手动访问:"
|
|
225
|
+
echo -e " ${CYAN}${API_KEY_URL}${NC}"
|
|
226
|
+
else
|
|
227
|
+
info "已在浏览器中打开 API Key 管理页面"
|
|
228
|
+
fi
|
|
229
|
+
|
|
230
|
+
echo ""
|
|
231
|
+
local api_key
|
|
232
|
+
api_key=$(read_input " 粘贴 API Key(直接回车跳过): ")
|
|
233
|
+
|
|
234
|
+
if [ -n "$api_key" ]; then
|
|
235
|
+
if [ "$install_cso" -eq 1 ]; then
|
|
236
|
+
siluzan-cso login --api-key "$api_key"
|
|
237
|
+
fi
|
|
238
|
+
if [ "$install_tso" -eq 1 ]; then
|
|
239
|
+
siluzan-tso login --api-key "$api_key"
|
|
240
|
+
fi
|
|
241
|
+
info "API Key 已保存到 ~/.siluzan/config.json"
|
|
242
|
+
else
|
|
243
|
+
echo ""
|
|
244
|
+
warn "已跳过 API Key 配置,后续可通过以下方式设置:"
|
|
245
|
+
echo " 方式 1:siluzan-cso login --api-key <YOUR_API_KEY>"
|
|
246
|
+
echo " 方式 2:export SILUZAN_API_KEY=<YOUR_API_KEY>"
|
|
247
|
+
fi
|
|
248
|
+
|
|
249
|
+
# ── 步骤 5:完成 ──
|
|
250
|
+
step "5/5:安装完成"
|
|
251
|
+
echo ""
|
|
252
|
+
echo -e " ${GREEN}✅ Siluzan Skill 安装成功!${NC}"
|
|
253
|
+
echo ""
|
|
254
|
+
echo " 已安装到以下全局 Skill 目录(所有 AI 助手通用):"
|
|
255
|
+
echo -e " ${DIM}~/.cursor/skills/ ~/.claude/skills/ ~/.agents/skills/"
|
|
256
|
+
echo -e " ~/.gemini/skills/ ~/.codex/skills/ ~/.kilo/skills/"
|
|
257
|
+
echo -e " ~/.windsurf/skills/ (via ~/.codeium/) ~/.opencode/skills/"
|
|
258
|
+
echo -e " ~/.openclaw/skills/ ~/.workbuddy/skills/${NC}"
|
|
259
|
+
echo ""
|
|
260
|
+
echo " 常用命令:"
|
|
261
|
+
[ "$install_cso" -eq 1 ] && echo " siluzan-cso list-accounts # 查看媒体账号"
|
|
262
|
+
[ "$install_cso" -eq 1 ] && echo " siluzan-cso publish --help # 发布内容"
|
|
263
|
+
[ "$install_tso" -eq 1 ] && echo " siluzan-tso list-accounts # 查看广告账户"
|
|
264
|
+
[ "$install_tso" -eq 1 ] && echo " siluzan-tso balance --help # 查询余额"
|
|
265
|
+
echo ""
|
|
266
|
+
echo " 更新 CLI 与 Skill 文件:"
|
|
267
|
+
[ "$install_cso" -eq 1 ] && echo " siluzan-cso update"
|
|
268
|
+
[ "$install_tso" -eq 1 ] && echo " siluzan-tso update"
|
|
269
|
+
echo ""
|
|
270
|
+
info "如遇问题请查看 ${WEB_BASE} 或联系支持"
|
|
271
|
+
echo ""
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
main "$@"
|
package/package.json
CHANGED