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 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.24-beta.2),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-cso-cli`。
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
- ### 方式 B:直接设置(适合自动化场景)
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(async (opts) => {
7566
- await runLogin({ apiKey: opts.apiKey, token: opts.token });
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 });
@@ -56,7 +56,7 @@ Windows 注意:部分 Agent 客户端通过 PowerShell / cmd 代执行命令
56
56
 
57
57
  | 命令 | 作用 | 详细文档 |
58
58
  | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------- |
59
- | `siluzan-cso login` | 登录 / 配置凭据 | `references/setup.md` |
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` |
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "slug": "siluzan-cso",
3
- "version": "1.1.24-beta.2",
4
- "publishedAt": 1780292582274,
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.24-beta.2'
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.24-beta.2"
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-cso-cli",
3
- "version": "1.1.24-beta.2",
3
+ "version": "1.1.25-beta.1",
4
4
  "description": "Siluzan platform AI Skill CLI — multi-platform content publishing (video/image-text) for Cursor, Claude Code, and OpenClaw.",
5
5
  "keywords": [
6
6
  "ai-skill",