siluzan-cso-cli 1.1.24-beta.2 → 1.1.25-beta.1
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 +12 -3
- package/dist/index.js +71 -2
- package/dist/skill/SKILL.md +1 -1
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/scripts/install.ps1 +1 -1
- package/dist/skill/scripts/install.sh +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -54,7 +54,7 @@ siluzan-cso init -d /path/to/skills # 写入自定义目录
|
|
|
54
54
|
siluzan-cso init --force # 强制覆盖已存在文件
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
> **注意**:当前为测试版(1.1.
|
|
57
|
+
> **注意**:当前为测试版(1.1.25-beta.1),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
|
|
58
58
|
|
|
59
59
|
| 助手 | 建议 `--ai` |
|
|
60
60
|
| ----------------------- | ------------------------------------ |
|
|
@@ -72,7 +72,16 @@ siluzan-cso init --force # 强制覆盖已存在文件
|
|
|
72
72
|
|
|
73
73
|
**若用户已安装 `siluzan-tso` 并完成登录,无需重复操作,直接跳到第 4 步。**
|
|
74
74
|
|
|
75
|
-
### 方式 A
|
|
75
|
+
### 方式 A:手机号 + 验证码(对话式 AI 推荐)
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
siluzan-cso send-login-code --phone <手机号>
|
|
79
|
+
siluzan-cso login --phone <手机号> --code <6位验证码>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
第 1 步只发送验证码并立即返回;第 2 步用验证码自动创建 API Key 并保存到 `~/.siluzan/config.json`。
|
|
83
|
+
|
|
84
|
+
### 方式 B:交互式登录
|
|
76
85
|
|
|
77
86
|
```bash
|
|
78
87
|
siluzan-cso login
|
|
@@ -84,7 +93,7 @@ siluzan-cso login
|
|
|
84
93
|
siluzan-cso login --api-key <YOUR_API_KEY>
|
|
85
94
|
```
|
|
86
95
|
|
|
87
|
-
### 方式
|
|
96
|
+
### 方式 C:直接设置(适合自动化场景)
|
|
88
97
|
|
|
89
98
|
```bash
|
|
90
99
|
siluzan-cso config set --api-key <你的ApiKey>
|
package/dist/index.js
CHANGED
|
@@ -2708,6 +2708,35 @@ function normalizeChinaPhone(input) {
|
|
|
2708
2708
|
function isValidChinaPhone(input) {
|
|
2709
2709
|
return /^\+861\d{10}$/.test(normalizeChinaPhone(input));
|
|
2710
2710
|
}
|
|
2711
|
+
async function sendPhoneLoginCode(opts) {
|
|
2712
|
+
const phone = normalizeChinaPhone(opts.phone);
|
|
2713
|
+
const url = `${opts.ssoBaseUrl}/Account/SendVaildCode?Phone=${encodeURIComponent(
|
|
2714
|
+
phone
|
|
2715
|
+
)}&RandStr=&Iicket=`;
|
|
2716
|
+
if (opts.verbose) {
|
|
2717
|
+
process.stderr.write(`[phone-login] GET ${url}
|
|
2718
|
+
`);
|
|
2719
|
+
}
|
|
2720
|
+
const res = await rawRequest(url, {
|
|
2721
|
+
method: "GET",
|
|
2722
|
+
headers: {
|
|
2723
|
+
Accept: "application/json",
|
|
2724
|
+
"Accept-Language": "zh-CN"
|
|
2725
|
+
}
|
|
2726
|
+
});
|
|
2727
|
+
if (res.status < 200 || res.status >= 300) {
|
|
2728
|
+
return { ok: false, message: `HTTP ${res.status}` };
|
|
2729
|
+
}
|
|
2730
|
+
let body;
|
|
2731
|
+
try {
|
|
2732
|
+
body = JSON.parse(res.text);
|
|
2733
|
+
} catch {
|
|
2734
|
+
return { ok: false, message: `\u54CD\u5E94\u975E JSON\uFF1A${res.text.slice(0, 120)}` };
|
|
2735
|
+
}
|
|
2736
|
+
const state = (body.State ?? body.state ?? "").toLowerCase();
|
|
2737
|
+
const message = body.Message ?? body.message ?? "";
|
|
2738
|
+
return { ok: state === "ok", message };
|
|
2739
|
+
}
|
|
2711
2740
|
async function loginByPhoneCode(opts) {
|
|
2712
2741
|
const phone = normalizeChinaPhone(opts.phone);
|
|
2713
2742
|
const url = `${opts.ssoBaseUrl}/Account/LoginByMiniCode?phone=${encodeURIComponent(
|
|
@@ -3097,6 +3126,31 @@ function resolveSsoCsoBase() {
|
|
|
3097
3126
|
const csoBaseUrl = process.env.SILUZAN_CSO_BASE ?? DEFAULT_CSO_BASE ?? deriveCsoApiBaseUrl(apiBase);
|
|
3098
3127
|
return { ssoBaseUrl, csoBaseUrl };
|
|
3099
3128
|
}
|
|
3129
|
+
async function runSendLoginCode(opts) {
|
|
3130
|
+
const phone = validateAndNormalizePhone(opts.phone);
|
|
3131
|
+
const { ssoBaseUrl } = resolveSsoCsoBase();
|
|
3132
|
+
console.log("\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550");
|
|
3133
|
+
console.log(" Siluzan CSO \u53D1\u9001\u767B\u5F55\u77ED\u4FE1\u9A8C\u8BC1\u7801");
|
|
3134
|
+
console.log("\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n");
|
|
3135
|
+
console.log(` \u624B\u673A\u53F7 : ${phone}`);
|
|
3136
|
+
console.log(` SSO : ${ssoBaseUrl}
|
|
3137
|
+
`);
|
|
3138
|
+
console.log("\u2192 \u6B63\u5728\u5411\u624B\u673A\u53D1\u9001\u9A8C\u8BC1\u7801...");
|
|
3139
|
+
const r = await sendPhoneLoginCode({ ssoBaseUrl, phone, verbose: opts.verbose });
|
|
3140
|
+
if (!r.ok) {
|
|
3141
|
+
console.error(`
|
|
3142
|
+
\u274C \u77ED\u4FE1\u9A8C\u8BC1\u7801\u53D1\u9001\u5931\u8D25\uFF1A${r.message || "(\u540E\u7AEF\u672A\u8FD4\u56DE\u539F\u56E0)"}
|
|
3143
|
+
`);
|
|
3144
|
+
process.exit(1);
|
|
3145
|
+
}
|
|
3146
|
+
console.log(`\u2713 \u9A8C\u8BC1\u7801\u5DF2\u53D1\u9001\uFF0810 \u5206\u949F\u5185\u6709\u6548\uFF09\u3002
|
|
3147
|
+
`);
|
|
3148
|
+
console.log("\u4E0B\u4E00\u6B65\uFF1A\u62FF\u5230 6 \u4F4D\u9A8C\u8BC1\u7801\u540E\uFF0C\u8FD0\u884C\u4E0B\u9762\u7684\u547D\u4EE4\u5B8C\u6210\u767B\u5F55\uFF1A\n");
|
|
3149
|
+
console.log(` siluzan-cso login --phone ${phone} --code <6\u4F4D\u9A8C\u8BC1\u7801>
|
|
3150
|
+
`);
|
|
3151
|
+
console.log("\u53EF\u9009\u53C2\u6570\uFF1A--name / --valid-days / --expires-at / --services");
|
|
3152
|
+
console.log("\uFF08\u9ED8\u8BA4\u521B\u5EFA 90 \u5929\u6709\u6548\u3001\u52FE\u9009 CSO + CUT \u670D\u52A1\u7684 API Key\uFF09\n");
|
|
3153
|
+
}
|
|
3100
3154
|
async function runPhoneLogin(opts) {
|
|
3101
3155
|
const phone = validateAndNormalizePhone(opts.phone);
|
|
3102
3156
|
const code = opts.code?.trim() ?? "";
|
|
@@ -7562,8 +7616,23 @@ function registerCsoCommands(program2) {
|
|
|
7562
7616
|
cmdConfigSet({ apiKey: opts.apiKey, token: opts.token });
|
|
7563
7617
|
});
|
|
7564
7618
|
configCmd.command("clear").description("\u6E05\u7A7A\u5DF2\u4FDD\u5B58\u7684 Token").action(() => cmdConfigClear());
|
|
7565
|
-
program2.command("login").description("\u5F15\u5BFC\u5B8C\u6210 Siluzan \u8D26\u53F7\u767B\u5F55\uFF0C\u4FDD\u5B58 API Key \u5230\u672C\u5730").option("--api-key <key>", "\u76F4\u63A5\u4FDD\u5B58 API Key\uFF08\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u6D41\u7A0B\uFF0C\u4E0E siluzan-tso \u5171\u7528\uFF09").addOption(new Option("--token <token>", "\u76F4\u63A5\u4FDD\u5B58 JWT Token").hideHelp()).action(
|
|
7566
|
-
|
|
7619
|
+
program2.command("login").description("\u5F15\u5BFC\u5B8C\u6210 Siluzan \u8D26\u53F7\u767B\u5F55\uFF0C\u4FDD\u5B58 API Key \u5230\u672C\u5730").option("--api-key <key>", "\u76F4\u63A5\u4FDD\u5B58 API Key\uFF08\u8DF3\u8FC7\u4EA4\u4E92\u5F0F\u6D41\u7A0B\uFF0C\u4E0E siluzan-tso \u5171\u7528\uFF09").option("--phone <phone>", "\u624B\u673A\u53F7\u767B\u5F55\uFF1A\u4E2D\u56FD\u5927\u9646\u624B\u673A\u53F7\uFF0C\u53EF\u5E26\u6216\u4E0D\u5E26 +86\uFF08\u9700\u914D\u5408 --code\uFF09").option("--code <code>", "\u77ED\u4FE1\u9A8C\u8BC1\u7801\uFF08\u5148\u8FD0\u884C send-login-code \u83B7\u53D6\uFF09").option("--name <name>", "\u624B\u673A\u53F7\u767B\u5F55\u65F6\u81EA\u52A8\u521B\u5EFA\u7684 API Key \u540D\u79F0").option("--valid-days <days>", "\u624B\u673A\u53F7\u767B\u5F55\u65F6\u521B\u5EFA API Key \u7684\u6709\u6548\u671F\u5929\u6570", parseInt).option("--expires-at <iso>", "\u624B\u673A\u53F7\u767B\u5F55\u65F6\u521B\u5EFA API Key \u7684\u7EDD\u5BF9\u8FC7\u671F\u65F6\u95F4\uFF08ISO 8601\uFF09").option("--services <services>", "\u624B\u673A\u53F7\u767B\u5F55\u65F6 API Key \u53EF\u8BBF\u95EE\u670D\u52A1\uFF0C\u9017\u53F7\u5206\u9694\uFF1ACSO,TSO,CUT").option("--verbose", "\u8F93\u51FA\u767B\u5F55\u76F8\u5173 HTTP \u8BF7\u6C42 URL\uFF08\u6392\u9519\u7528\uFF09", false).addOption(new Option("--token <token>", "\u76F4\u63A5\u4FDD\u5B58 JWT Token").hideHelp()).action(
|
|
7620
|
+
async (opts) => {
|
|
7621
|
+
await runLogin({
|
|
7622
|
+
apiKey: opts.apiKey,
|
|
7623
|
+
token: opts.token,
|
|
7624
|
+
phone: opts.phone,
|
|
7625
|
+
code: opts.code,
|
|
7626
|
+
name: opts.name,
|
|
7627
|
+
validDays: opts.validDays,
|
|
7628
|
+
expiresAt: opts.expiresAt,
|
|
7629
|
+
services: opts.services,
|
|
7630
|
+
verbose: opts.verbose
|
|
7631
|
+
});
|
|
7632
|
+
}
|
|
7633
|
+
);
|
|
7634
|
+
program2.command("send-login-code").description("\u53D1\u9001\u624B\u673A\u53F7\u767B\u5F55\u77ED\u4FE1\u9A8C\u8BC1\u7801\uFF08\u4E24\u6BB5\u5F0F\u767B\u5F55\u7B2C 1 \u6B65\uFF09").requiredOption("--phone <phone>", "\u4E2D\u56FD\u5927\u9646\u624B\u673A\u53F7\uFF0C\u53EF\u5E26\u6216\u4E0D\u5E26 +86").option("--verbose", "\u8F93\u51FA\u767B\u5F55\u76F8\u5173 HTTP \u8BF7\u6C42 URL\uFF08\u6392\u9519\u7528\uFF09", false).action(async (opts) => {
|
|
7635
|
+
await runSendLoginCode({ phone: opts.phone, verbose: opts.verbose });
|
|
7567
7636
|
});
|
|
7568
7637
|
program2.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) => {
|
|
7569
7638
|
await runUpdate({ force: opts.force, skipInit: opts.skipInit });
|
package/dist/skill/SKILL.md
CHANGED
|
@@ -56,7 +56,7 @@ Windows 注意:部分 Agent 客户端通过 PowerShell / cmd 代执行命令
|
|
|
56
56
|
|
|
57
57
|
| 命令 | 作用 | 详细文档 |
|
|
58
58
|
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------- |
|
|
59
|
-
| `siluzan-cso login`
|
|
59
|
+
| `siluzan-cso login` / `siluzan-cso send-login-code` | 登录 / 配置凭据;手机号 + 验证码两段式登录 | `references/setup.md` |
|
|
60
60
|
| `siluzan-cso config show/set/clear` | 查看 / 修改 / 清空本地配置 | `references/setup.md` |
|
|
61
61
|
| `siluzan-cso init` | Skill 文件初始化(写入 AI 助手目录) | `references/setup.md` |
|
|
62
62
|
| `siluzan-cso update` | 更新 CLI 版本并刷新 Skill 文件 | `references/setup.md` |
|
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.25-beta.1",
|
|
4
|
+
"publishedAt": 1780484778399,
|
|
5
5
|
"homepage": "https://www.siluzan.com",
|
|
6
6
|
"source": "https://dev.azure.com/jack4it/Sammamish/_git/siluzan-skill",
|
|
7
7
|
"requiredBinaries": [
|
|
@@ -9,7 +9,7 @@ $ErrorActionPreference = 'Stop'
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
$PKG_NAME = 'siluzan-cso-cli'
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
$PKG_VERSION = '1.1.
|
|
12
|
+
$PKG_VERSION = '1.1.25-beta.1'
|
|
13
13
|
$CLI_BIN = 'siluzan-cso'
|
|
14
14
|
$SKILL_LABEL = 'Siluzan CSO'
|
|
15
15
|
$INSTALL_CMD = 'npm install -g siluzan-cso-cli@beta'
|
|
@@ -9,7 +9,7 @@ set -euo pipefail
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
readonly PKG_NAME="siluzan-cso-cli"
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
readonly PKG_VERSION="1.1.
|
|
12
|
+
readonly PKG_VERSION="1.1.25-beta.1"
|
|
13
13
|
readonly CLI_BIN="siluzan-cso"
|
|
14
14
|
readonly SKILL_LABEL="Siluzan CSO"
|
|
15
15
|
readonly INSTALL_CMD="npm install -g siluzan-cso-cli@beta"
|
package/package.json
CHANGED