siluzan-cso-cli 1.1.8 → 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 +32 -1
- package/dist/index.js +175 -275
- package/dist/skill/SKILL.md +31 -7
- package/dist/skill/_meta.json +18 -2
- package/dist/skill/references/publish.md +1 -1
- package/dist/skill/references/setup.md +25 -9
- package/dist/skill/references/web-pages.md +20 -20
- package/package.json +11 -3
package/README.md
CHANGED
|
@@ -2,6 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
当用户发来本页面的 **URL** 时,请按顺序协助用户完成安装。
|
|
4
4
|
|
|
5
|
+
## 0. 安全与透明性说明
|
|
6
|
+
|
|
7
|
+
本 Skill 是 **instruction-only**(纯指令型),不包含可执行代码文件。它通过指导 AI 助手调用 `siluzan-cso` CLI 来操作丝路赞内容发布平台。
|
|
8
|
+
|
|
9
|
+
### 运行时依赖
|
|
10
|
+
| 项目 | 说明 |
|
|
11
|
+
|------|------|
|
|
12
|
+
| **Node.js 18+** | CLI 运行时 |
|
|
13
|
+
| **npm 8+** 或 **pnpm** | 安装 CLI 全局包 |
|
|
14
|
+
| **siluzan-cso** CLI | 由 `npm install -g siluzan-cso-cli` 安装 |
|
|
15
|
+
| **ffmpeg**(可选) | `extract-cover` 命令截取视频封面帧 |
|
|
16
|
+
|
|
17
|
+
### 凭据与网络
|
|
18
|
+
| 项目 | 说明 |
|
|
19
|
+
|------|------|
|
|
20
|
+
| API Key / Token | 存储在 `~/.siluzan/config.json`,用于所有 API 调用鉴权 |
|
|
21
|
+
| CSO API | `api.siluzan.com`(生产)/ `api-ci.siluzan.com`(测试) |
|
|
22
|
+
| 前端页面 | `cso.siluzan.com`(授权回调等浏览器操作) |
|
|
23
|
+
| 版本检查 | `registry.npmjs.org` |
|
|
24
|
+
|
|
25
|
+
### 可选环境变量
|
|
26
|
+
| 变量 | 说明 |
|
|
27
|
+
|------|------|
|
|
28
|
+
| `SILUZAN_AUTH_TOKEN` | 从环境变量读取 Token(优先级高于 config.json,CI/CD 推荐) |
|
|
29
|
+
|
|
30
|
+
### 可执行的操作范围
|
|
31
|
+
- **只读**:查询媒体账号、运营报表、发布任务状态、人设列表、RAG 知识库检索等
|
|
32
|
+
- **写入**(需用户确认):上传素材、提交发布任务、创建/更新账号分组、生成 AI 内容规划
|
|
33
|
+
- **本地文件操作**:`extract-cover` 截取视频帧输出图片;`init` 将 Skill 文件写入 AI 助手目录
|
|
34
|
+
|
|
5
35
|
## 1. 环境
|
|
6
36
|
|
|
7
37
|
- Node.js **18+**
|
|
@@ -12,7 +42,7 @@
|
|
|
12
42
|
在**用户的目标项目根目录**执行(根据用户使用的助手选择 `--ai`):
|
|
13
43
|
|
|
14
44
|
```bash
|
|
15
|
-
npm install -g siluzan-cso-cli
|
|
45
|
+
npm install -g siluzan-cso-cli@beta
|
|
16
46
|
siluzan-cso init --ai cursor # 写入 Cursor(默认)
|
|
17
47
|
siluzan-cso init --ai cursor,claude # 同时写入多个平台
|
|
18
48
|
siluzan-cso init --ai all # 写入所有支持的平台
|
|
@@ -20,6 +50,7 @@ siluzan-cso init -d /path/to/skills # 写入自定义目录
|
|
|
20
50
|
siluzan-cso init --force # 强制覆盖已存在文件
|
|
21
51
|
```
|
|
22
52
|
|
|
53
|
+
> **注意**:当前为测试版(1.1.9-beta.3),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
|
|
23
54
|
|
|
24
55
|
| 助手 | 建议 `--ai` |
|
|
25
56
|
|------|-------------|
|
package/dist/index.js
CHANGED
|
@@ -342,8 +342,8 @@ var require_semver = __commonJS({
|
|
|
342
342
|
}
|
|
343
343
|
// preminor will bump the version up to the next minor release, and immediately
|
|
344
344
|
// down to pre-release. premajor and prepatch work the same way.
|
|
345
|
-
inc(
|
|
346
|
-
if (
|
|
345
|
+
inc(release, identifier, identifierBase) {
|
|
346
|
+
if (release.startsWith("pre")) {
|
|
347
347
|
if (!identifier && identifierBase === false) {
|
|
348
348
|
throw new Error("invalid increment argument: identifier is empty");
|
|
349
349
|
}
|
|
@@ -354,7 +354,7 @@ var require_semver = __commonJS({
|
|
|
354
354
|
}
|
|
355
355
|
}
|
|
356
356
|
}
|
|
357
|
-
switch (
|
|
357
|
+
switch (release) {
|
|
358
358
|
case "premajor":
|
|
359
359
|
this.prerelease.length = 0;
|
|
360
360
|
this.patch = 0;
|
|
@@ -445,7 +445,7 @@ var require_semver = __commonJS({
|
|
|
445
445
|
break;
|
|
446
446
|
}
|
|
447
447
|
default:
|
|
448
|
-
throw new Error(`invalid increment argument: ${
|
|
448
|
+
throw new Error(`invalid increment argument: ${release}`);
|
|
449
449
|
}
|
|
450
450
|
this.raw = this.format();
|
|
451
451
|
if (this.build.length) {
|
|
@@ -511,7 +511,7 @@ var require_inc = __commonJS({
|
|
|
511
511
|
"../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/inc.js"(exports, module) {
|
|
512
512
|
"use strict";
|
|
513
513
|
var SemVer = require_semver();
|
|
514
|
-
var inc = (version,
|
|
514
|
+
var inc = (version, release, options, identifier, identifierBase) => {
|
|
515
515
|
if (typeof options === "string") {
|
|
516
516
|
identifierBase = identifier;
|
|
517
517
|
identifier = options;
|
|
@@ -521,7 +521,7 @@ var require_inc = __commonJS({
|
|
|
521
521
|
return new SemVer(
|
|
522
522
|
version instanceof SemVer ? version.version : version,
|
|
523
523
|
options
|
|
524
|
-
).inc(
|
|
524
|
+
).inc(release, identifier, identifierBase).version;
|
|
525
525
|
} catch (er) {
|
|
526
526
|
return null;
|
|
527
527
|
}
|
|
@@ -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.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";
|
|
1942
|
+
var BUILD_ENV = "test";
|
|
1943
|
+
var DEFAULT_API_BASE = "https://api-ci.siluzan.com";
|
|
1944
|
+
var DEFAULT_CSO_BASE = "https://cso-ci.siluzan.com";
|
|
1945
|
+
var DEFAULT_WEB_BASE = "https://www-ci.siluzan.com";
|
|
1946
|
+
var DEFAULT_AGENT_BASE = "https://agent-ci.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
|
|
@@ -2129,7 +2155,6 @@ import { randomUUID as _randomUUID } from "crypto";
|
|
|
2129
2155
|
import * as fs22 from "fs";
|
|
2130
2156
|
import * as path22 from "path";
|
|
2131
2157
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
2132
|
-
import * as os22 from "os";
|
|
2133
2158
|
var SILUZAN_DIR = path3.join(os2.homedir(), ".siluzan");
|
|
2134
2159
|
var CONFIG_FILE = path3.join(SILUZAN_DIR, "config.json");
|
|
2135
2160
|
function readStr(raw, key) {
|
|
@@ -2210,21 +2235,33 @@ function validateBaseUrl(raw) {
|
|
|
2210
2235
|
}
|
|
2211
2236
|
return null;
|
|
2212
2237
|
}
|
|
2238
|
+
var DEFAULT_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
2239
|
+
var MAX_RESPONSE_BYTES = 50 * 1024 * 1024;
|
|
2213
2240
|
function rawRequest(url, options) {
|
|
2214
2241
|
return new Promise((resolve6, reject) => {
|
|
2215
2242
|
const parsed = new URL(url);
|
|
2216
2243
|
const transport = parsed.protocol === "https:" ? https : http;
|
|
2244
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
2245
|
+
const maxBytes = options.maxResponseBytes ?? MAX_RESPONSE_BYTES;
|
|
2217
2246
|
const reqOpts = {
|
|
2218
2247
|
hostname: parsed.hostname,
|
|
2219
2248
|
port: parsed.port || (parsed.protocol === "https:" ? 443 : 80),
|
|
2220
2249
|
path: parsed.pathname + parsed.search,
|
|
2221
2250
|
method: options.method ?? "GET",
|
|
2222
|
-
headers: options.headers
|
|
2251
|
+
headers: options.headers,
|
|
2252
|
+
timeout: timeoutMs || void 0
|
|
2223
2253
|
};
|
|
2224
2254
|
const req = transport.request(reqOpts, (res) => {
|
|
2225
2255
|
let data = "";
|
|
2256
|
+
let byteLen = 0;
|
|
2226
2257
|
res.setEncoding("utf8");
|
|
2227
2258
|
res.on("data", (chunk) => {
|
|
2259
|
+
byteLen += Buffer.byteLength(chunk, "utf8");
|
|
2260
|
+
if (maxBytes && byteLen > maxBytes) {
|
|
2261
|
+
res.destroy();
|
|
2262
|
+
reject(new Error(`\u54CD\u5E94\u4F53\u8D85\u8FC7\u4E0A\u9650\uFF08${(maxBytes / 1024 / 1024).toFixed(0)} MB\uFF09\uFF0C\u5DF2\u4E2D\u65AD\u8FDE\u63A5`));
|
|
2263
|
+
return;
|
|
2264
|
+
}
|
|
2228
2265
|
data += chunk;
|
|
2229
2266
|
});
|
|
2230
2267
|
res.on("end", () => {
|
|
@@ -2237,6 +2274,10 @@ function rawRequest(url, options) {
|
|
|
2237
2274
|
resolve6({ status: res.statusCode ?? 0, text: data, headers });
|
|
2238
2275
|
});
|
|
2239
2276
|
});
|
|
2277
|
+
req.on("timeout", () => {
|
|
2278
|
+
req.destroy();
|
|
2279
|
+
reject(new Error(`\u8BF7\u6C42\u8D85\u65F6\uFF08${(timeoutMs / 1e3).toFixed(0)} \u79D2\uFF09\uFF1A${options.method ?? "GET"} ${url}`));
|
|
2280
|
+
});
|
|
2240
2281
|
req.on("error", reject);
|
|
2241
2282
|
if (options.body) req.write(options.body);
|
|
2242
2283
|
req.end();
|
|
@@ -2332,140 +2373,29 @@ async function fetchNpmVersion(pkgName, tag, timeoutMs = 4e3) {
|
|
|
2332
2373
|
return null;
|
|
2333
2374
|
}
|
|
2334
2375
|
}
|
|
2335
|
-
|
|
2336
|
-
function isSentryDisabled() {
|
|
2337
|
-
return process.env.SILUZAN_SENTRY_DISABLED === "1" || process.env.SILUZAN_SENTRY_DISABLED === "true";
|
|
2338
|
-
}
|
|
2339
|
-
function getDsn() {
|
|
2340
|
-
return process.env.SILUZAN_SENTRY_DSN?.trim() || DEFAULT_SENTRY_DSN;
|
|
2341
|
-
}
|
|
2342
|
-
var cliMeta = { name: "siluzan-cli", version: "unknown" };
|
|
2343
|
-
var cliInvocation = "";
|
|
2344
|
-
function setSiluzanCliInvocation(redactedCommandLine) {
|
|
2345
|
-
cliInvocation = redactedCommandLine;
|
|
2346
|
-
}
|
|
2347
|
-
function redactCliArgvForSentry(argv) {
|
|
2348
|
-
const args = argv.slice(2);
|
|
2349
|
-
const redactNext = /* @__PURE__ */ new Set(["-t", "--token", "--api-key", "--password"]);
|
|
2350
|
-
const out = [];
|
|
2351
|
-
for (let i = 0; i < args.length; i++) {
|
|
2352
|
-
const a = args[i];
|
|
2353
|
-
if (redactNext.has(a)) {
|
|
2354
|
-
out.push(a, "***");
|
|
2355
|
-
i++;
|
|
2356
|
-
continue;
|
|
2357
|
-
}
|
|
2358
|
-
const eq = a.indexOf("=");
|
|
2359
|
-
if (eq > 0) {
|
|
2360
|
-
const key = a.slice(0, eq).toLowerCase();
|
|
2361
|
-
if (key === "--token" || key === "--api-key" || key === "--password") {
|
|
2362
|
-
out.push(`${a.slice(0, eq)}=***`);
|
|
2363
|
-
continue;
|
|
2364
|
-
}
|
|
2365
|
-
}
|
|
2366
|
-
if (/^-t[^-]/.test(a) && a.length > 3) {
|
|
2367
|
-
out.push("-t***");
|
|
2368
|
-
continue;
|
|
2369
|
-
}
|
|
2370
|
-
out.push(a);
|
|
2371
|
-
}
|
|
2372
|
-
return out.join(" ");
|
|
2373
|
-
}
|
|
2374
|
-
function setSiluzanCliMeta(name, version) {
|
|
2375
|
-
cliMeta = { name, version };
|
|
2376
|
-
if (sentryReady) {
|
|
2377
|
-
void import("@sentry/node").then((Sentry) => {
|
|
2378
|
-
Sentry.setTag("cli", name);
|
|
2379
|
-
Sentry.setTag("cli_version", version);
|
|
2380
|
-
}).catch(() => {
|
|
2381
|
-
});
|
|
2382
|
-
}
|
|
2383
|
-
}
|
|
2384
|
-
var sentryReady = false;
|
|
2385
|
-
var sentryInitPromise = null;
|
|
2386
|
-
var flushHookRegistered = false;
|
|
2387
|
-
function buildRuntimeContext() {
|
|
2388
|
-
const platform = process.platform;
|
|
2389
|
-
const osName = platform === "win32" ? "Windows" : platform === "darwin" ? "macOS" : "Linux";
|
|
2390
|
-
return {
|
|
2391
|
-
os: {
|
|
2392
|
-
name: osName,
|
|
2393
|
-
version: os22.release(),
|
|
2394
|
-
// 内核版本,如 10.0.26100(Win11)、24.3.0(macOS)
|
|
2395
|
-
arch: process.arch
|
|
2396
|
-
// x64 / arm64
|
|
2397
|
-
},
|
|
2398
|
-
runtime: {
|
|
2399
|
-
node_version: process.version,
|
|
2400
|
-
// v18.x.x / v20.x.x
|
|
2401
|
-
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
2402
|
-
}
|
|
2403
|
-
};
|
|
2404
|
-
}
|
|
2405
|
-
async function ensureSentryInitialized(requestUrl) {
|
|
2406
|
-
const dsn = getDsn();
|
|
2407
|
-
if (!dsn || isSentryDisabled()) return false;
|
|
2408
|
-
if (sentryReady) return true;
|
|
2409
|
-
if (!sentryInitPromise) {
|
|
2410
|
-
sentryInitPromise = (async () => {
|
|
2411
|
-
const Sentry = await import("@sentry/node");
|
|
2412
|
-
const envOverride = process.env.SILUZAN_SENTRY_ENV?.trim();
|
|
2413
|
-
const environment = envOverride || (inferSiluzanRuntimeEnvironment(requestUrl) === "test" ? "test" : "production");
|
|
2414
|
-
Sentry.init({
|
|
2415
|
-
dsn,
|
|
2416
|
-
environment,
|
|
2417
|
-
sendDefaultPii: true,
|
|
2418
|
-
tracesSampleRate: 0
|
|
2419
|
-
});
|
|
2420
|
-
const ctx = buildRuntimeContext();
|
|
2421
|
-
Sentry.setContext("os", ctx.os);
|
|
2422
|
-
Sentry.setContext("runtime", ctx.runtime);
|
|
2423
|
-
Sentry.setTag("cli", cliMeta.name);
|
|
2424
|
-
Sentry.setTag("cli_version", cliMeta.version);
|
|
2425
|
-
if (!flushHookRegistered) {
|
|
2426
|
-
flushHookRegistered = true;
|
|
2427
|
-
process.once("beforeExit", () => {
|
|
2428
|
-
void Sentry.flush(2e3).catch(() => {
|
|
2429
|
-
});
|
|
2430
|
-
});
|
|
2431
|
-
}
|
|
2432
|
-
sentryReady = true;
|
|
2433
|
-
})();
|
|
2434
|
-
}
|
|
2435
|
-
await sentryInitPromise;
|
|
2436
|
-
return sentryReady;
|
|
2437
|
-
}
|
|
2438
|
-
function deriveMainApiOriginFromRequestUrl(requestUrl) {
|
|
2376
|
+
function deriveMainApiOrigin(apiBase) {
|
|
2439
2377
|
try {
|
|
2440
|
-
const u = new URL(
|
|
2378
|
+
const u = new URL(apiBase);
|
|
2441
2379
|
const host = u.hostname.toLowerCase();
|
|
2442
|
-
if (!host.endsWith("siluzan.com"))
|
|
2380
|
+
if (!host.endsWith("siluzan.com")) {
|
|
2381
|
+
return apiBase.includes("-ci") ? "https://api-ci.siluzan.com" : "https://api.siluzan.com";
|
|
2382
|
+
}
|
|
2443
2383
|
if (host.startsWith("tso-api")) {
|
|
2444
2384
|
return `${u.protocol}//${host.replace(/^tso-api/, "api")}`;
|
|
2445
2385
|
}
|
|
2446
2386
|
if (host === "api.siluzan.com" || host === "api-ci.siluzan.com") {
|
|
2447
2387
|
return `${u.protocol}//${host}`;
|
|
2448
2388
|
}
|
|
2449
|
-
return
|
|
2450
|
-
} catch {
|
|
2451
|
-
return null;
|
|
2452
|
-
}
|
|
2453
|
-
}
|
|
2454
|
-
function inferSiluzanRuntimeEnvironment(requestUrl) {
|
|
2455
|
-
try {
|
|
2456
|
-
const host = new URL(requestUrl).hostname.toLowerCase();
|
|
2457
|
-
return host.includes("-ci") ? "test" : "production";
|
|
2389
|
+
return apiBase.includes("-ci") ? "https://api-ci.siluzan.com" : "https://api.siluzan.com";
|
|
2458
2390
|
} catch {
|
|
2459
|
-
return "
|
|
2391
|
+
return apiBase.includes("-ci") ? "https://api-ci.siluzan.com" : "https://api.siluzan.com";
|
|
2460
2392
|
}
|
|
2461
2393
|
}
|
|
2462
|
-
function
|
|
2463
|
-
const
|
|
2464
|
-
return
|
|
2394
|
+
function pickStr(obj, key) {
|
|
2395
|
+
const v = obj[key];
|
|
2396
|
+
return typeof v === "string" && v.trim() ? v.trim() : void 0;
|
|
2465
2397
|
}
|
|
2466
|
-
|
|
2467
|
-
var userContextInflight = /* @__PURE__ */ new Map();
|
|
2468
|
-
function pickCompanyIdFromMe(data) {
|
|
2398
|
+
function pickCompanyId(data) {
|
|
2469
2399
|
const direct = pickStr(data, "companyId") ?? pickStr(data, "companyID") ?? pickStr(data, "CompanyId");
|
|
2470
2400
|
if (direct) return direct;
|
|
2471
2401
|
const ci = data["companyInfo"];
|
|
@@ -2482,40 +2412,15 @@ function parseMeResponse(text) {
|
|
|
2482
2412
|
const id = pickStr(data, "entityId") ?? pickStr(data, "id") ?? pickStr(data, "userId") ?? pickStr(data, "accountId");
|
|
2483
2413
|
const email = pickStr(data, "email");
|
|
2484
2414
|
const username = pickStr(data, "userName") ?? pickStr(data, "username") ?? pickStr(data, "name") ?? pickStr(data, "phone");
|
|
2485
|
-
const companyId =
|
|
2415
|
+
const companyId = pickCompanyId(data);
|
|
2486
2416
|
if (!id && !email && !username && !companyId) return null;
|
|
2487
2417
|
return { id, email, username, companyId };
|
|
2488
2418
|
} catch {
|
|
2489
2419
|
return null;
|
|
2490
2420
|
}
|
|
2491
2421
|
}
|
|
2492
|
-
function pickStr(obj, key) {
|
|
2493
|
-
const v = obj[key];
|
|
2494
|
-
return typeof v === "string" && v.trim() ? v.trim() : void 0;
|
|
2495
|
-
}
|
|
2496
|
-
async function fetchAndSetUser(mainOrigin, config) {
|
|
2497
|
-
const meUrl = `${mainOrigin.replace(/\/$/, "")}/query/account/me`;
|
|
2498
|
-
const authHeaders = config.apiKey ? { "x-api-key": config.apiKey } : { Authorization: `Bearer ${config.authToken}` };
|
|
2499
|
-
const res = await rawRequest(meUrl, {
|
|
2500
|
-
method: "GET",
|
|
2501
|
-
headers: {
|
|
2502
|
-
"Content-Type": "application/json",
|
|
2503
|
-
"Accept-Language": "zh-CN",
|
|
2504
|
-
...authHeaders
|
|
2505
|
-
}
|
|
2506
|
-
});
|
|
2507
|
-
if (res.status < 200 || res.status >= 300) return;
|
|
2508
|
-
const parsed = parseMeResponse(res.text);
|
|
2509
|
-
if (!parsed) return;
|
|
2510
|
-
const Sentry = await import("@sentry/node");
|
|
2511
|
-
const user = {};
|
|
2512
|
-
if (parsed.id) user.id = parsed.id;
|
|
2513
|
-
if (parsed.email) user.email = parsed.email;
|
|
2514
|
-
if (parsed.username) user.username = parsed.username;
|
|
2515
|
-
Sentry.setUser(user);
|
|
2516
|
-
}
|
|
2517
2422
|
async function fetchSiluzanCurrentUser(apiBase, config) {
|
|
2518
|
-
const mainOrigin =
|
|
2423
|
+
const mainOrigin = deriveMainApiOrigin(apiBase);
|
|
2519
2424
|
const meUrl = `${mainOrigin.replace(/\/$/, "")}/query/account/me`;
|
|
2520
2425
|
const authHeaders = config.apiKey ? { "x-api-key": config.apiKey } : { Authorization: `Bearer ${config.authToken}` };
|
|
2521
2426
|
try {
|
|
@@ -2540,38 +2445,6 @@ async function fetchSiluzanCurrentUser(apiBase, config) {
|
|
|
2540
2445
|
return null;
|
|
2541
2446
|
}
|
|
2542
2447
|
}
|
|
2543
|
-
function scheduleUserContext(mainOrigin, config) {
|
|
2544
|
-
const key = cacheKeyForUser(mainOrigin, config);
|
|
2545
|
-
if (userContextDone.has(key)) return;
|
|
2546
|
-
let p = userContextInflight.get(key);
|
|
2547
|
-
if (!p) {
|
|
2548
|
-
p = (async () => {
|
|
2549
|
-
try {
|
|
2550
|
-
await fetchAndSetUser(mainOrigin, config);
|
|
2551
|
-
} catch {
|
|
2552
|
-
} finally {
|
|
2553
|
-
userContextInflight.delete(key);
|
|
2554
|
-
userContextDone.add(key);
|
|
2555
|
-
}
|
|
2556
|
-
})();
|
|
2557
|
-
userContextInflight.set(key, p);
|
|
2558
|
-
}
|
|
2559
|
-
}
|
|
2560
|
-
function refreshSiluzanUser(apiBase, config) {
|
|
2561
|
-
if (isSentryDisabled()) return;
|
|
2562
|
-
void (async () => {
|
|
2563
|
-
try {
|
|
2564
|
-
const ok = await ensureSentryInitialized(apiBase);
|
|
2565
|
-
if (!ok) return;
|
|
2566
|
-
const mainOrigin = deriveMainApiOriginFromRequestUrl(apiBase) ?? (apiBase.includes("-ci") ? "https://api-ci.siluzan.com" : "https://api.siluzan.com");
|
|
2567
|
-
const key = cacheKeyForUser(mainOrigin, config);
|
|
2568
|
-
userContextDone.delete(key);
|
|
2569
|
-
userContextInflight.delete(key);
|
|
2570
|
-
scheduleUserContext(mainOrigin, config);
|
|
2571
|
-
} catch {
|
|
2572
|
-
}
|
|
2573
|
-
})();
|
|
2574
|
-
}
|
|
2575
2448
|
|
|
2576
2449
|
// src/commands/login.ts
|
|
2577
2450
|
async function runLogin(opts = {}) {
|
|
@@ -2582,7 +2455,6 @@ async function runLogin(opts = {}) {
|
|
|
2582
2455
|
process.exit(1);
|
|
2583
2456
|
}
|
|
2584
2457
|
writeSharedConfig({ authToken: token });
|
|
2585
|
-
refreshSiluzanUser(DEFAULT_API_BASE, { authToken: token });
|
|
2586
2458
|
console.log(`
|
|
2587
2459
|
\u2705 Token \u5DF2\u4FDD\u5B58\uFF08${maskSecret(token)}\uFF09`);
|
|
2588
2460
|
console.log(` \u914D\u7F6E\u6587\u4EF6\uFF1A${CONFIG_FILE}`);
|
|
@@ -2597,7 +2469,6 @@ async function runLogin(opts = {}) {
|
|
|
2597
2469
|
process.exit(1);
|
|
2598
2470
|
}
|
|
2599
2471
|
writeSharedConfig({ apiKey: key });
|
|
2600
|
-
refreshSiluzanUser(DEFAULT_API_BASE, { authToken: "", apiKey: key });
|
|
2601
2472
|
console.log(`
|
|
2602
2473
|
\u2705 API Key \u5DF2\u4FDD\u5B58\uFF08${maskSecret(key)}\uFF09`);
|
|
2603
2474
|
console.log(` \u914D\u7F6E\u6587\u4EF6\uFF1A${CONFIG_FILE}`);
|
|
@@ -2638,7 +2509,6 @@ async function runLogin(opts = {}) {
|
|
|
2638
2509
|
process.exit(1);
|
|
2639
2510
|
}
|
|
2640
2511
|
writeSharedConfig({ apiKey });
|
|
2641
|
-
refreshSiluzanUser(DEFAULT_API_BASE, { authToken: "", apiKey });
|
|
2642
2512
|
console.log(`
|
|
2643
2513
|
\u2705 API Key \u5DF2\u4FDD\u5B58\uFF08${maskSecret(apiKey)}\uFF09`);
|
|
2644
2514
|
console.log(` \u914D\u7F6E\u6587\u4EF6\uFF1A${CONFIG_FILE}`);
|
|
@@ -2823,6 +2693,7 @@ async function runUpdate(options) {
|
|
|
2823
2693
|
}
|
|
2824
2694
|
console.log(`
|
|
2825
2695
|
\u{1F504} \u6B63\u5728\u66F4\u65B0 ${targets.length} \u5904 skill \u5B89\u88C5\u4F4D\u7F6E \u2026`);
|
|
2696
|
+
let failCount = 0;
|
|
2826
2697
|
for (const entry of targets) {
|
|
2827
2698
|
const label = entry.target === "custom" ? entry.dir ?? "unknown" : entry.target;
|
|
2828
2699
|
const cwd = entry.cwd || os4.homedir();
|
|
@@ -2846,9 +2717,16 @@ async function runUpdate(options) {
|
|
|
2846
2717
|
});
|
|
2847
2718
|
}
|
|
2848
2719
|
} catch (e) {
|
|
2720
|
+
failCount++;
|
|
2849
2721
|
console.error(` \u274C \u66F4\u65B0\u5931\u8D25\uFF1A${e.message}`);
|
|
2850
2722
|
}
|
|
2851
2723
|
}
|
|
2724
|
+
if (failCount > 0) {
|
|
2725
|
+
console.error(`
|
|
2726
|
+
\u26A0\uFE0F ${targets.length} \u5904\u5B89\u88C5\u4F4D\u7F6E\u4E2D\u6709 ${failCount} \u5904\u66F4\u65B0\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u4E0A\u65B9\u9519\u8BEF\u4FE1\u606F\u3002`);
|
|
2727
|
+
console.log(" \u5982\u679C AI \u52A9\u624B\u6B63\u5728\u8FD0\u884C\uFF0C\u5EFA\u8BAE\u91CD\u542F\u4EE5\u4F7F\u5DF2\u6210\u529F\u7684 skill \u6587\u4EF6\u751F\u6548\u3002\n");
|
|
2728
|
+
process.exit(1);
|
|
2729
|
+
}
|
|
2852
2730
|
console.log("\n\u2705 \u5168\u90E8 skill \u6587\u4EF6\u5DF2\u5237\u65B0\u3002");
|
|
2853
2731
|
console.log(" \u5982\u679C AI \u52A9\u624B\u6B63\u5728\u8FD0\u884C\uFF0C\u5EFA\u8BAE\u91CD\u542F\u4EE5\u4F7F\u65B0 skill \u6587\u4EF6\u751F\u6548\u3002\n");
|
|
2854
2732
|
}
|
|
@@ -2860,7 +2738,7 @@ function loadConfig(tokenArg) {
|
|
|
2860
2738
|
const authToken = tokenArg ?? process.env.SILUZAN_AUTH_TOKEN ?? shared.authToken ?? "";
|
|
2861
2739
|
if (!apiKey && !authToken) {
|
|
2862
2740
|
console.error(
|
|
2863
|
-
"\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"
|
|
2864
2742
|
);
|
|
2865
2743
|
process.exit(1);
|
|
2866
2744
|
}
|
|
@@ -2885,8 +2763,7 @@ function loadConfig(tokenArg) {
|
|
|
2885
2763
|
\u274C agentBaseUrl \u4E0D\u5408\u6CD5\uFF1A${agentErr}`);
|
|
2886
2764
|
process.exit(1);
|
|
2887
2765
|
}
|
|
2888
|
-
|
|
2889
|
-
return { apiBaseUrl, csoBaseUrl, agentBaseUrl, authToken, apiKey, dataPermission: shared.dataPermission };
|
|
2766
|
+
return { apiBaseUrl, csoBaseUrl, agentBaseUrl, authToken, apiKey, dataPermission: process.env.SILUZAN_DATA_PERMISSION ?? shared.dataPermission };
|
|
2890
2767
|
}
|
|
2891
2768
|
function apiFetch2(url, config, options = {}, verbose = false) {
|
|
2892
2769
|
return apiFetch(url, config, options, verbose);
|
|
@@ -3045,8 +2922,7 @@ async function runListAccounts(options) {
|
|
|
3045
2922
|
mediaCustomerName: a.mediaCustomerName,
|
|
3046
2923
|
mediaAccountState: a.mediaAccountState ?? "",
|
|
3047
2924
|
invalidOAuthToken: a.invalidOAuthToken ?? false,
|
|
3048
|
-
|
|
3049
|
-
expiresOn: a.expiresOn ?? a.tokenTime ?? null,
|
|
2925
|
+
expiresOn: a.expiresOn ?? null,
|
|
3050
2926
|
lastAuthorizationTime: a.lastAuthorizationTime ?? null,
|
|
3051
2927
|
totalActiveTaskCount: a.totalActiveTaskCount ?? 0,
|
|
3052
2928
|
ownerInfo: a.ownerInfo ?? [],
|
|
@@ -3091,7 +2967,7 @@ async function runListAccounts(options) {
|
|
|
3091
2967
|
{ key: "commentCount", header: "\u8BC4\u8BBA\u6570" },
|
|
3092
2968
|
{ key: "diggCount", header: "\u83B7\u8D5E\u6570" },
|
|
3093
2969
|
{ key: "lastAuthTime", header: "\u4E0A\u6B21\u6388\u6743" },
|
|
3094
|
-
{ key: "
|
|
2970
|
+
{ key: "expiresOn", header: "Token\u5230\u671F" },
|
|
3095
2971
|
{ key: "owners", header: "\u8D1F\u8D23\u4EBA" }
|
|
3096
2972
|
];
|
|
3097
2973
|
for (const [platform, accounts] of groups) {
|
|
@@ -3110,7 +2986,7 @@ async function runListAccounts(options) {
|
|
|
3110
2986
|
commentCount: formatCount(ov?.commentCount),
|
|
3111
2987
|
diggCount: formatCount(ov?.diggCount),
|
|
3112
2988
|
lastAuthTime: formatDate(a.lastAuthorizationTime),
|
|
3113
|
-
|
|
2989
|
+
expiresOn: formatDate(a.expiresOn),
|
|
3114
2990
|
owners: formatOwners(a.ownerInfo)
|
|
3115
2991
|
};
|
|
3116
2992
|
});
|
|
@@ -6366,7 +6242,11 @@ ${header}${body}`);
|
|
|
6366
6242
|
import * as fs10 from "fs";
|
|
6367
6243
|
function cmdConfigShow() {
|
|
6368
6244
|
const shared = readSharedConfig();
|
|
6369
|
-
|
|
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) {
|
|
6370
6250
|
console.log(
|
|
6371
6251
|
`
|
|
6372
6252
|
\u5C1A\u672A\u914D\u7F6E\u51ED\u636E\u3002
|
|
@@ -6376,25 +6256,34 @@ function cmdConfigShow() {
|
|
|
6376
6256
|
|
|
6377
6257
|
\u6CE8\u518C\u767B\u5F55\u540E\u8FD0\u884C\u4EE5\u4E0B\u4EFB\u4E00\u547D\u4EE4\u5B8C\u6210\u914D\u7F6E\uFF1A
|
|
6378
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>
|
|
6379
6263
|
`
|
|
6380
6264
|
);
|
|
6381
6265
|
return;
|
|
6382
6266
|
}
|
|
6383
6267
|
const apiBaseUrl = process.env.SILUZAN_CSO_API_BASE ?? DEFAULT_API_BASE;
|
|
6384
6268
|
const csoBaseUrl = DEFAULT_CSO_BASE;
|
|
6385
|
-
|
|
6386
|
-
console.log("\n\u5F53\u524D\u914D\u7F6E\uFF08~/.siluzan/config.json\uFF09\uFF1A");
|
|
6269
|
+
console.log("\n\u5F53\u524D\u914D\u7F6E\uFF1A");
|
|
6387
6270
|
console.log(` apiBaseUrl : ${apiBaseUrl}`);
|
|
6388
6271
|
console.log(` csoBaseUrl : ${csoBaseUrl}`);
|
|
6389
|
-
if (
|
|
6390
|
-
|
|
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}`);
|
|
6391
6276
|
}
|
|
6392
|
-
if (
|
|
6393
|
-
const
|
|
6394
|
-
|
|
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}`);
|
|
6395
6281
|
}
|
|
6396
6282
|
console.log(`
|
|
6397
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
|
+
}
|
|
6398
6287
|
if (process.platform !== "win32") {
|
|
6399
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");
|
|
6400
6289
|
}
|
|
@@ -6421,11 +6310,21 @@ function cmdConfigClear() {
|
|
|
6421
6310
|
}
|
|
6422
6311
|
|
|
6423
6312
|
// src/index.ts
|
|
6313
|
+
process.on("uncaughtException", (err) => {
|
|
6314
|
+
console.error(`
|
|
6315
|
+
\u274C \u672A\u6355\u83B7\u7684\u5F02\u5E38\uFF1A${err.message}`);
|
|
6316
|
+
if (process.argv.includes("--verbose")) console.error(err.stack);
|
|
6317
|
+
process.exit(1);
|
|
6318
|
+
});
|
|
6319
|
+
process.on("unhandledRejection", (reason) => {
|
|
6320
|
+
const msg = reason instanceof Error ? reason.message : String(reason);
|
|
6321
|
+
console.error(`
|
|
6322
|
+
\u274C \u672A\u5904\u7406\u7684\u5F02\u6B65\u9519\u8BEF\uFF1A${msg}`);
|
|
6323
|
+
if (process.argv.includes("--verbose") && reason instanceof Error) console.error(reason.stack);
|
|
6324
|
+
process.exit(1);
|
|
6325
|
+
});
|
|
6424
6326
|
var program = new Command();
|
|
6425
6327
|
program.name("siluzan-cso").description("Siluzan \u5E73\u53F0 Skill \u5DE5\u5177\uFF1A\u521D\u59CB\u5316\u3001\u8D26\u53F7\u67E5\u8BE2\u3001\u4E0A\u4F20\u3001\u56FE\u6587/\u89C6\u9891\u53D1\u5E03").version(getCurrentVersion2());
|
|
6426
|
-
program.hook("preAction", () => {
|
|
6427
|
-
setSiluzanCliInvocation(redactCliArgvForSentry(process.argv));
|
|
6428
|
-
});
|
|
6429
6328
|
var configCmd = program.command("config").description("\u67E5\u770B\u6216\u8BBE\u7F6E Siluzan \u8BA4\u8BC1\u914D\u7F6E\uFF08~/.siluzan/config.json\uFF09");
|
|
6430
6329
|
configCmd.command("show").description("\u5C55\u793A\u5F53\u524D\u5DF2\u4FDD\u5B58\u7684\u914D\u7F6E\uFF08Token \u8131\u654F\u663E\u793A\uFF09").action(() => cmdConfigShow());
|
|
6431
6330
|
configCmd.command("set").description("\u4FDD\u5B58\u914D\u7F6E\u5230 ~/.siluzan/config.json\uFF0C\u540E\u7EED\u547D\u4EE4\u81EA\u52A8\u8BFB\u53D6").option("--api-key <key>", "API Key\uFF08\u63A8\u8350\uFF0C\u4E0E siluzan-tso \u5171\u7528\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E token\uFF09").option("-t, --token <token>", "\u7528\u6237 Auth Token\uFF08JWT\uFF09").action((opts) => {
|
|
@@ -6438,18 +6337,19 @@ program.command("login").description("\u5F15\u5BFC\u5B8C\u6210 Siluzan \u8D26\u5
|
|
|
6438
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) => {
|
|
6439
6338
|
await runUpdate({ force: opts.force, skipInit: opts.skipInit });
|
|
6440
6339
|
});
|
|
6441
|
-
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(
|
|
6442
6341
|
"-a, --ai <targets>",
|
|
6443
|
-
"\u76EE\u6807\u5E73\u53F0\uFF0C\u9017\u53F7\u5206\u9694\uFF1Acursor,claude,
|
|
6444
|
-
"
|
|
6342
|
+
"\u76EE\u6807\u5E73\u53F0\uFF0C\u9017\u53F7\u5206\u9694\uFF1Acursor,claude,agents,windsurf,gemini,codex,opencode,kilo,openclaw,workbuddy,all",
|
|
6343
|
+
"all"
|
|
6445
6344
|
).option(
|
|
6446
6345
|
"-d, --dir <path>",
|
|
6447
|
-
"\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"
|
|
6448
|
-
).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) => {
|
|
6449
6348
|
await runInit({
|
|
6450
6349
|
cwd: process.cwd(),
|
|
6451
6350
|
aiTargets: opts.ai,
|
|
6452
6351
|
dir: opts.dir,
|
|
6352
|
+
global: Boolean(opts.global),
|
|
6453
6353
|
force: Boolean(opts.force),
|
|
6454
6354
|
apiBaseUrl: DEFAULT_API_BASE
|
|
6455
6355
|
});
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -9,6 +9,27 @@ compatibility: Requires siluzan-cso-cli installed and authenticated via `siluzan
|
|
|
9
9
|
|
|
10
10
|
# siluzan-cso
|
|
11
11
|
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 可执行的操作范围
|
|
16
|
+
|
|
17
|
+
- **只读**:查询媒体账号列表、账号分组、运营报表、发布任务状态、人设列表、RAG 知识库检索、AI 内容规划详情
|
|
18
|
+
- **写入**(需用户确认):上传素材、提交发布任务、创建/更新账号分组、生成 AI 内容规划、站内信回复
|
|
19
|
+
- **本地文件操作**:`extract-cover` 在本地截取视频帧并输出图片文件;`init` 将 Skill 文件写入 AI 助手目录
|
|
20
|
+
|
|
21
|
+
---
|
|
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
|
+
|
|
12
33
|
## 能力范围
|
|
13
34
|
|
|
14
35
|
| 业务流程 | 手段 | 说明 |
|
|
@@ -37,10 +58,12 @@ compatibility: Requires siluzan-cso-cli installed and authenticated via `siluzan
|
|
|
37
58
|
| `siluzan-cso task list/detail/item` | 查看任务状态 / 处理失败 / 重试 | `references/task.md` |
|
|
38
59
|
| `siluzan-cso report fetch --media <平台>` | 运营报表(核心指标 / 视频排行 / 趋势) | `references/report.md` |
|
|
39
60
|
| `siluzan-cso planning ...` | AI 内容规划:生成、监控、详情、导出 | `references/planning.md` |
|
|
40
|
-
| —(网页端) | CSO
|
|
61
|
+
| —(网页端) | CSO web端全部页面 URL | `references/web-pages.md` |
|
|
41
62
|
|
|
42
63
|
---
|
|
43
64
|
|
|
65
|
+
|
|
66
|
+
|
|
44
67
|
## 常见业务场景 → 阅读哪个文件
|
|
45
68
|
|
|
46
69
|
| 用户在做什么 | 先阅读 |
|
|
@@ -95,14 +118,15 @@ account-group ──需要 mediaCustomerId──► list-accounts
|
|
|
95
118
|
- **先查账号再操作**:对具体账号做操作前,先用 `list-accounts --name <名称> --media-type <平台>` 确认账号存在且 Token 有效。
|
|
96
119
|
- **使用 `--json` 处理数据**:需要对返回结果做计算或筛选时,加 `--json` 再用 `node -e` 提取(`node -e "const d=require('fs').readFileSync('/dev/stdin','utf8'); ..."`)。
|
|
97
120
|
- **不猜账号 ID**:`entityId` ≠ `mediaCustomerId`,两者均须从 `list-accounts --json` 获取,不可假设。
|
|
98
|
-
-
|
|
121
|
+
- **命令透明性**:以简洁的方式向用户说明即将执行的操作意图(如「正在上传视频到素材库」「正在为您查询 YouTube 账号列表」),让用户了解操作进度。用户主动要求查看执行细节时,应如实提供完整命令。安装/登录/更新等一次性命令(见 `references/setup.md`)可直接展示给用户自行执行。
|
|
99
122
|
- **操作后必须验证**:完成发布、上传、分组等写操作后,需通过对应的查询命令确认结果。
|
|
100
123
|
|
|
101
|
-
###
|
|
102
|
-
|
|
103
|
-
- 输出的任何内容(计划、总结、报告)中,**严禁出现 CLI 命令**(setup.md 相关命令除外)。
|
|
104
|
-
- 每次执行前主动检查 CLI 版本,若需更新请先执行更新流程(详见 `references/setup.md`)。
|
|
124
|
+
### 必须遵守
|
|
105
125
|
|
|
126
|
+
- 主动更新(详情请读取 `references/setup.md`)。
|
|
127
|
+
- **破坏性操作必须用户确认**:涉及写入/修改/删除的操作(发布、上传、分组变更等),执行前必须明确告知用户操作内容并获得确认。
|
|
128
|
+
- **只读操作可自主执行**:查询类命令(`list-accounts`、`report fetch`、`task list`、`config show` 等)可直接执行,无需额外确认。
|
|
129
|
+
- 禁止提供虚假信息,比如web端连接就必须确认 `references/web-pages.md` 中存在才能提供给用户
|
|
106
130
|
---
|
|
107
131
|
|
|
108
132
|
## 常见 HTTP 错误处理
|
|
@@ -123,6 +147,6 @@ account-group ──需要 mediaCustomerId──► list-accounts
|
|
|
123
147
|
|
|
124
148
|
> 无对应 CLI 命令的模块,或需要引导用户在网页端查看数据时,查阅 `references/web-pages.md` 获取完整页面清单与链接。
|
|
125
149
|
|
|
126
|
-
URL 格式:`https://www.siluzan.com/v3/foreign_trade/cso/{页面}`
|
|
150
|
+
URL 格式:`https://www-ci.siluzan.com/v3/foreign_trade/cso/{页面}`
|
|
127
151
|
|
|
128
152
|
常用页面:`task`(任务管理)· `postVideo`(发布页)· `ManageAccounts`(账号管理)· `planning`(AI 内容规划)· `table`(绩效报表)· `Workdata`(作品数据)
|
package/dist/skill/_meta.json
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "siluzan-cso",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"publishedAt":
|
|
3
|
+
"version": "1.1.9-beta.3",
|
|
4
|
+
"publishedAt": 1776246656610,
|
|
5
|
+
"homepage": "https://www.siluzan.com",
|
|
6
|
+
"source": "https://dev.azure.com/jack4it/Sammamish/_git/siluzan-skill",
|
|
7
|
+
"requiredBinaries": [
|
|
8
|
+
"node",
|
|
9
|
+
"npm"
|
|
10
|
+
],
|
|
11
|
+
"optionalBinaries": [
|
|
12
|
+
"ffmpeg"
|
|
13
|
+
],
|
|
14
|
+
"requiredEnv": [],
|
|
15
|
+
"optionalEnv": [
|
|
16
|
+
"SILUZAN_AUTH_TOKEN"
|
|
17
|
+
],
|
|
18
|
+
"configPaths": [
|
|
19
|
+
"~/.siluzan/config.json"
|
|
20
|
+
]
|
|
5
21
|
}
|
|
@@ -199,7 +199,7 @@ siluzan-cso publish -c publish-config.json
|
|
|
199
199
|
|
|
200
200
|
> 查询发布状态、处理失败项 → 参见 `references/task.md`
|
|
201
201
|
|
|
202
|
-
前往 CSO 任务管理页面查看进度:`https://www.siluzan.com/v3/foreign_trade/cso/task`
|
|
202
|
+
前往 CSO 任务管理页面查看进度:`https://www-ci.siluzan.com/v3/foreign_trade/cso/task`
|
|
203
203
|
|
|
204
204
|
---
|
|
205
205
|
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
## 安装 CLI
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
|
-
npm install -g siluzan-cso-cli
|
|
6
|
+
npm install -g siluzan-cso-cli@beta
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
环境要求:Node.js
|
|
9
|
+
环境要求:Node.js 18+
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -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.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
|
|
47
|
+
API Key 获取入口:`https://cso-ci.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.siluzan.com
|
|
67
|
-
csoBaseUrl : https://cso.siluzan.com
|
|
82
|
+
apiBaseUrl : https://api-ci.siluzan.com
|
|
83
|
+
csoBaseUrl : https://cso-ci.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.siluzan.com/v3/foreign_trade/cso/{页面路径}`
|
|
4
|
+
> URL 格式:`https://www-ci.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.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` | 配置重点关注账号、数据备份 |
|
|
14
|
+
| 账号管理 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/ManageAccounts` | 绑定/授权/查看媒体账号列表、账号状态、Token 到期时间 |
|
|
15
|
+
| 账号分组 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/AccountGroup` | 新建分组、管理分组内账号 |
|
|
16
|
+
| 重点账号 | `https://www-ci.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.siluzan.com/v3/foreign_trade/cso/postVideo?contentType=1` | 矩阵发布视频、图文、草稿管理、话题组 contentType=1 是视频,contentType=2是图文 |
|
|
25
|
+
| 发布作品 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/postVideo?contentType=1` | 矩阵发布视频、图文、草稿管理、话题组 contentType=1 是视频,contentType=2是图文 |
|
|
26
26
|
|
|
27
|
-
| 发布日历 | `https://www.siluzan.com/v3/foreign_trade/cso/publishCalendar` | 日历视图规划发布任务、创建/编辑发布任务 |
|
|
28
|
-
| 营销日历 | `https://www.siluzan.com/v3/foreign_trade/cso/marketingCalendar` | 营销节点日历、跳转创建发布任务 |
|
|
27
|
+
| 发布日历 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/publishCalendar` | 日历视图规划发布任务、创建/编辑发布任务 |
|
|
28
|
+
| 营销日历 | `https://www-ci.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.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` | 搬家任务列表与执行状态 |
|
|
36
|
+
| 任务列表 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/task` | 发布任务列表、状态筛选、任务详情抽屉 |
|
|
37
|
+
| 视频管理 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/VideoMgr` | 已发布视频/图文列表、删除、重发、评论查看 |
|
|
38
|
+
| 视频搬家 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/relocation` | 将视频搬运到其他平台 |
|
|
39
|
+
| 搬家记录 | `https://www-ci.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.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` | 私信欢迎语、自动回复规则配置 |
|
|
47
|
+
| 私信管理 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/letter` | 按渠道/时间查看与处理私信(多平台 Tab) |
|
|
48
|
+
| 评论管理 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/comment` | 收到的评论列表、回复、账号组筛选 |
|
|
49
|
+
| 智能互动 | `https://www-ci.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.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`) |
|
|
57
|
+
| 作品数据 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/Workdata` | 作品维度统计、图表、明细(对应 CLI `report fetch`) |
|
|
58
|
+
| 账户数据 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/accountdata` | 账户维度汇总数据、趋势图表 |
|
|
59
|
+
| 绩效报表 | `https://www-ci.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.siluzan.com/v3/foreign_trade/cso/planning` | AI 内容规划列表、生成规划、企业维度筛选(对应 CLI `planning`) |
|
|
68
|
-
| 营销首页 | `https://www.siluzan.com/v3/foreign_trade/cso/ContentHome` | 工作台总览:账号数、视频数、最新评论与视频 |
|
|
67
|
+
| 内容规划 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/planning` | AI 内容规划列表、生成规划、企业维度筛选(对应 CLI `planning`) |
|
|
68
|
+
| 营销首页 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/ContentHome` | 工作台总览:账号数、视频数、最新评论与视频 |
|
|
69
69
|
|
|
70
|
-
| 话题组 | `https://www.siluzan.com/v3/foreign_trade/cso/TopicGroup` | 话题组维护、话题内容管理 |
|
|
70
|
+
| 话题组 | `https://www-ci.siluzan.com/v3/foreign_trade/cso/TopicGroup` | 话题组维护、话题内容管理 |
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
---
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "siluzan-cso-cli",
|
|
3
|
-
"version": "1.1.
|
|
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": {
|
|
@@ -24,13 +24,21 @@
|
|
|
24
24
|
"content-publishing",
|
|
25
25
|
"cli"
|
|
26
26
|
],
|
|
27
|
+
"homepage": "https://www.siluzan.com",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://dev.azure.com/jack4it/Sammamish/_git/siluzan-skill",
|
|
31
|
+
"directory": "cso-cli"
|
|
32
|
+
},
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://dev.azure.com/jack4it/Sammamish/_git/siluzan-skill/issues"
|
|
35
|
+
},
|
|
27
36
|
"license": "UNLICENSED",
|
|
28
37
|
"publishConfig": {
|
|
29
38
|
"access": "public"
|
|
30
39
|
},
|
|
31
40
|
"dependencies": {
|
|
32
41
|
"@azure/storage-blob": "^12.31.0",
|
|
33
|
-
"@sentry/node": "9",
|
|
34
42
|
"cli-table3": "^0.6.5",
|
|
35
43
|
"commander": "^12.1.0",
|
|
36
44
|
"image-size": "^2.0.2"
|
|
@@ -42,7 +50,7 @@
|
|
|
42
50
|
"siluzan-cli-common": "1.0.0"
|
|
43
51
|
},
|
|
44
52
|
"engines": {
|
|
45
|
-
"node": ">=
|
|
53
|
+
"node": ">=18"
|
|
46
54
|
},
|
|
47
55
|
"scripts": {
|
|
48
56
|
"postinstall": "node scripts/postinstall.mjs",
|