sino-bc-cli 1.0.0

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.
Files changed (60) hide show
  1. package/README.md +311 -0
  2. package/dist/SKILL.md +466 -0
  3. package/dist/commands/bc-mcp.command.d.ts +53 -0
  4. package/dist/commands/bc-mcp.command.js +208 -0
  5. package/dist/commands/bc-mcp.command.js.map +1 -0
  6. package/dist/commands/homepage.command.d.ts +19 -0
  7. package/dist/commands/homepage.command.js +96 -0
  8. package/dist/commands/homepage.command.js.map +1 -0
  9. package/dist/commands/index.d.ts +10 -0
  10. package/dist/commands/index.js +23 -0
  11. package/dist/commands/index.js.map +1 -0
  12. package/dist/commands/nexus-swagger.command.d.ts +19 -0
  13. package/dist/commands/nexus-swagger.command.js +95 -0
  14. package/dist/commands/nexus-swagger.command.js.map +1 -0
  15. package/dist/constants/api-doc.d.ts +6 -0
  16. package/dist/constants/api-doc.js +80 -0
  17. package/dist/constants/api-doc.js.map +1 -0
  18. package/dist/constants/gateway.d.ts +31 -0
  19. package/dist/constants/gateway.js +109 -0
  20. package/dist/constants/gateway.js.map +1 -0
  21. package/dist/constants/index.d.ts +38 -0
  22. package/dist/constants/index.js +52 -0
  23. package/dist/constants/index.js.map +1 -0
  24. package/dist/core/cli-app.d.ts +51 -0
  25. package/dist/core/cli-app.js +281 -0
  26. package/dist/core/cli-app.js.map +1 -0
  27. package/dist/core/command-registry.d.ts +71 -0
  28. package/dist/core/command-registry.js +195 -0
  29. package/dist/core/command-registry.js.map +1 -0
  30. package/dist/core/index.d.ts +2 -0
  31. package/dist/core/index.js +9 -0
  32. package/dist/core/index.js.map +1 -0
  33. package/dist/index.d.ts +12 -0
  34. package/dist/index.js +34 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/types/index.d.ts +120 -0
  37. package/dist/types/index.js +46 -0
  38. package/dist/types/index.js.map +1 -0
  39. package/dist/utils/browser.d.ts +36 -0
  40. package/dist/utils/browser.js +143 -0
  41. package/dist/utils/browser.js.map +1 -0
  42. package/dist/utils/common.d.ts +97 -0
  43. package/dist/utils/common.js +198 -0
  44. package/dist/utils/common.js.map +1 -0
  45. package/dist/utils/crypto.d.ts +53 -0
  46. package/dist/utils/crypto.js +153 -0
  47. package/dist/utils/crypto.js.map +1 -0
  48. package/dist/utils/http.d.ts +58 -0
  49. package/dist/utils/http.js +187 -0
  50. package/dist/utils/http.js.map +1 -0
  51. package/dist/utils/index.d.ts +6 -0
  52. package/dist/utils/index.js +16 -0
  53. package/dist/utils/index.js.map +1 -0
  54. package/dist/utils/logger.d.ts +56 -0
  55. package/dist/utils/logger.js +161 -0
  56. package/dist/utils/logger.js.map +1 -0
  57. package/dist/utils/prompt.d.ts +18 -0
  58. package/dist/utils/prompt.js +77 -0
  59. package/dist/utils/prompt.js.map +1 -0
  60. package/package.json +63 -0
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.HttpUtils = void 0;
40
+ const axios_1 = __importDefault(require("axios"));
41
+ const _ = __importStar(require("lodash"));
42
+ const dayjs_1 = __importDefault(require("dayjs"));
43
+ const logger_1 = require("./logger");
44
+ const constants_1 = require("../constants");
45
+ /**
46
+ * HTTP 请求工具类
47
+ * 封装 axios,提供统一的 HTTP 请求接口,包含请求拦截、响应拦截、错误处理
48
+ * 具备超时设置、自动重试、日志记录等功能
49
+ */
50
+ class HttpUtils {
51
+ /** axios 实例 */
52
+ static instance;
53
+ /**
54
+ * 获取 axios 实例(单例模式)
55
+ */
56
+ static getInstance() {
57
+ if (!this.instance) {
58
+ this.instance = axios_1.default.create({
59
+ timeout: constants_1.DEFAULT_CONFIG.timeout,
60
+ headers: {
61
+ 'Content-Type': 'application/json',
62
+ 'User-Agent': `${constants_1.CLI_CONFIG.name}/${constants_1.CLI_CONFIG.version}`,
63
+ },
64
+ });
65
+ // 请求拦截器
66
+ this.instance.interceptors.request.use((config) => {
67
+ const startTime = (0, dayjs_1.default)().valueOf();
68
+ // 在 config 中存储开始时间,供响应拦截器计算耗时
69
+ const extendedConfig = config;
70
+ extendedConfig._startTime = startTime;
71
+ const method = String(config.method || 'GET');
72
+ logger_1.logger.debug(`发起 HTTP 请求: ${_.toUpper(method)} ${config.url}`);
73
+ return config;
74
+ }, (error) => {
75
+ logger_1.logger.error('HTTP 请求拦截器错误:', error);
76
+ return Promise.reject(error);
77
+ });
78
+ // 响应拦截器
79
+ this.instance.interceptors.response.use((response) => {
80
+ const extendedConfig = response.config;
81
+ const startTime = extendedConfig._startTime || 0;
82
+ const duration = startTime ? (0, dayjs_1.default)().valueOf() - startTime : 0;
83
+ const method = String(response.config.method || 'GET');
84
+ logger_1.logger.debug(`HTTP 请求成功: ${_.toUpper(method)} ${response.config.url} - ` +
85
+ `状态码: ${response.status} - 耗时: ${duration}ms`);
86
+ return response;
87
+ }, (error) => {
88
+ const extendedConfig = error.config;
89
+ const startTime = extendedConfig?._startTime || 0;
90
+ const duration = startTime ? (0, dayjs_1.default)().valueOf() - startTime : 0;
91
+ const method = String(extendedConfig?.method || 'GET');
92
+ const url = String(extendedConfig?.url || '');
93
+ if (error.response) {
94
+ // 服务器返回错误响应
95
+ logger_1.logger.error(`HTTP 请求失败: ${_.toUpper(method)} ${url} - ` +
96
+ `状态码: ${error.response.status} - 耗时: ${duration}ms`);
97
+ }
98
+ else if (error.request) {
99
+ // 请求已发出但未收到响应
100
+ logger_1.logger.error(`HTTP 请求无响应: ${_.toUpper(method)} ${url} - ` +
101
+ `超时或网络错误 - 耗时: ${duration}ms`);
102
+ }
103
+ else {
104
+ // 请求配置错误
105
+ logger_1.logger.error(`HTTP 请求配置错误: ${error.message}`);
106
+ }
107
+ return Promise.reject(error);
108
+ });
109
+ }
110
+ return this.instance;
111
+ }
112
+ /**
113
+ * 发送 GET 请求
114
+ * @param url 请求 URL
115
+ * @param config 请求配置
116
+ * @returns Promise<T> 响应数据
117
+ */
118
+ static async get(url, config) {
119
+ const response = await this.getInstance().get(url, config);
120
+ return response.data;
121
+ }
122
+ /**
123
+ * 发送 POST 请求
124
+ * @param url 请求 URL
125
+ * @param data 请求数据
126
+ * @param config 请求配置
127
+ * @returns Promise<T> 响应数据
128
+ */
129
+ static async post(url, data, config) {
130
+ const response = await this.getInstance().post(url, data, config);
131
+ return response.data;
132
+ }
133
+ /**
134
+ * 发送 PUT 请求
135
+ * @param url 请求 URL
136
+ * @param data 请求数据
137
+ * @param config 请求配置
138
+ * @returns Promise<T> 响应数据
139
+ */
140
+ static async put(url, data, config) {
141
+ const response = await this.getInstance().put(url, data, config);
142
+ return response.data;
143
+ }
144
+ /**
145
+ * 发送 DELETE 请求
146
+ * @param url 请求 URL
147
+ * @param config 请求配置
148
+ * @returns Promise<T> 响应数据
149
+ */
150
+ static async delete(url, config) {
151
+ const response = await this.getInstance().delete(url, config);
152
+ return response.data;
153
+ }
154
+ /**
155
+ * 带重试机制的 GET 请求
156
+ * @param url 请求 URL
157
+ * @param maxRetries 最大重试次数,默认 3 次
158
+ * @param retryDelay 重试间隔(毫秒),默认 1000ms
159
+ * @param config 请求配置
160
+ * @returns Promise<T> 响应数据
161
+ */
162
+ static async getWithRetry(url, maxRetries = 3, retryDelay = 1000, config) {
163
+ let lastError;
164
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
165
+ try {
166
+ return await this.get(url, config);
167
+ }
168
+ catch (error) {
169
+ lastError = error;
170
+ if (attempt < maxRetries) {
171
+ logger_1.logger.warn(`HTTP 请求第 ${attempt} 次失败,${retryDelay}ms 后进行第 ${attempt + 1} 次重试...`);
172
+ await this.sleep(retryDelay);
173
+ }
174
+ }
175
+ }
176
+ throw lastError;
177
+ }
178
+ /**
179
+ * 延时函数
180
+ * @param ms 延时毫秒数
181
+ */
182
+ static sleep(ms) {
183
+ return new Promise((resolve) => setTimeout(resolve, ms));
184
+ }
185
+ }
186
+ exports.HttpUtils = HttpUtils;
187
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/utils/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { logger } from './logger';
2
+ export { BrowserUtils } from './browser';
3
+ export { CryptoUtils } from './crypto';
4
+ export { HttpUtils } from './http';
5
+ export { CommonUtils } from './common';
6
+ export { PromptUtils } from './prompt';
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PromptUtils = exports.CommonUtils = exports.HttpUtils = exports.CryptoUtils = exports.BrowserUtils = exports.logger = void 0;
4
+ var logger_1 = require("./logger");
5
+ Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
6
+ var browser_1 = require("./browser");
7
+ Object.defineProperty(exports, "BrowserUtils", { enumerable: true, get: function () { return browser_1.BrowserUtils; } });
8
+ var crypto_1 = require("./crypto");
9
+ Object.defineProperty(exports, "CryptoUtils", { enumerable: true, get: function () { return crypto_1.CryptoUtils; } });
10
+ var http_1 = require("./http");
11
+ Object.defineProperty(exports, "HttpUtils", { enumerable: true, get: function () { return http_1.HttpUtils; } });
12
+ var common_1 = require("./common");
13
+ Object.defineProperty(exports, "CommonUtils", { enumerable: true, get: function () { return common_1.CommonUtils; } });
14
+ var prompt_1 = require("./prompt");
15
+ Object.defineProperty(exports, "PromptUtils", { enumerable: true, get: function () { return prompt_1.PromptUtils; } });
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAAzB,gGAAA,MAAM,OAAA;AACf,qCAAyC;AAAhC,uGAAA,YAAY,OAAA;AACrB,mCAAuC;AAA9B,qGAAA,WAAW,OAAA;AACpB,+BAAmC;AAA1B,iGAAA,SAAS,OAAA;AAClB,mCAAuC;AAA9B,qGAAA,WAAW,OAAA;AACpB,mCAAuC;AAA9B,qGAAA,WAAW,OAAA"}
@@ -0,0 +1,56 @@
1
+ import { LogLevel } from '../types';
2
+ /**
3
+ * 日志工具类
4
+ * 提供统一的日志输出接口,支持不同级别和颜色输出
5
+ * 使用 chalk 实现彩色输出,dayjs 格式化时间戳,lodash 进行对象处理
6
+ */
7
+ declare class Logger {
8
+ /** 当前日志输出级别 */
9
+ private currentLevel;
10
+ /** 日志级别权重映射,用于级别过滤 */
11
+ private readonly levelWeights;
12
+ /**
13
+ * 设置日志输出级别
14
+ * @param level 目标日志级别
15
+ */
16
+ setLevel(level: LogLevel): void;
17
+ /**
18
+ * 内部日志输出核心方法
19
+ * @param level 日志级别
20
+ * @param messages 日志消息列表
21
+ */
22
+ private log;
23
+ /**
24
+ * 格式化日志消息,处理对象类型的格式化输出
25
+ * 使用 lodash 进行对象判断和序列化
26
+ * @param messages 消息列表
27
+ */
28
+ private formatMessages;
29
+ /**
30
+ * 输出调试级别日志
31
+ */
32
+ debug(...messages: unknown[]): void;
33
+ /**
34
+ * 输出信息级别日志
35
+ */
36
+ info(...messages: unknown[]): void;
37
+ /**
38
+ * 输出警告级别日志
39
+ */
40
+ warn(...messages: unknown[]): void;
41
+ /**
42
+ * 输出错误级别日志
43
+ */
44
+ error(...messages: unknown[]): void;
45
+ /**
46
+ * 输出成功信息(绿色高亮)
47
+ */
48
+ success(...messages: unknown[]): void;
49
+ /**
50
+ * 输出提示信息(蓝色高亮)
51
+ */
52
+ tip(...messages: unknown[]): void;
53
+ }
54
+ /** 导出日志单例实例 */
55
+ export declare const logger: Logger;
56
+ export {};
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.logger = void 0;
40
+ const _ = __importStar(require("lodash"));
41
+ const dayjs_1 = __importDefault(require("dayjs"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const types_1 = require("../types");
44
+ /**
45
+ * 日志工具类
46
+ * 提供统一的日志输出接口,支持不同级别和颜色输出
47
+ * 使用 chalk 实现彩色输出,dayjs 格式化时间戳,lodash 进行对象处理
48
+ */
49
+ class Logger {
50
+ /** 当前日志输出级别 */
51
+ currentLevel = types_1.LogLevel.INFO;
52
+ /** 日志级别权重映射,用于级别过滤 */
53
+ levelWeights = {
54
+ [types_1.LogLevel.DEBUG]: 0,
55
+ [types_1.LogLevel.INFO]: 1,
56
+ [types_1.LogLevel.WARN]: 2,
57
+ [types_1.LogLevel.ERROR]: 3,
58
+ };
59
+ /**
60
+ * 设置日志输出级别
61
+ * @param level 目标日志级别
62
+ */
63
+ setLevel(level) {
64
+ this.currentLevel = level;
65
+ }
66
+ /**
67
+ * 内部日志输出核心方法
68
+ * @param level 日志级别
69
+ * @param messages 日志消息列表
70
+ */
71
+ log(level, ...messages) {
72
+ // 使用 lodash 判断当前级别是否应该输出
73
+ if (this.levelWeights[level] < this.levelWeights[this.currentLevel]) {
74
+ return;
75
+ }
76
+ // 使用 dayjs 格式化时间戳
77
+ const timestamp = (0, dayjs_1.default)().format('YYYY-MM-DD HH:mm:ss');
78
+ // 级别标识
79
+ const levelTag = `[${_.toUpper(level)}]`;
80
+ // 根据级别选择不同的颜色输出
81
+ let output;
82
+ switch (level) {
83
+ case types_1.LogLevel.DEBUG:
84
+ output = chalk_1.default.gray(`${timestamp} ${chalk_1.default.cyan(levelTag)} ${this.formatMessages(messages)}`);
85
+ break;
86
+ case types_1.LogLevel.INFO:
87
+ output = chalk_1.default.white(`${timestamp} ${chalk_1.default.green(levelTag)} ${this.formatMessages(messages)}`);
88
+ break;
89
+ case types_1.LogLevel.WARN:
90
+ output = chalk_1.default.yellow(`${timestamp} ${chalk_1.default.yellow(levelTag)} ${this.formatMessages(messages)}`);
91
+ break;
92
+ case types_1.LogLevel.ERROR:
93
+ output = chalk_1.default.red(`${timestamp} ${chalk_1.default.red(levelTag)} ${this.formatMessages(messages)}`);
94
+ break;
95
+ default:
96
+ output = `${timestamp} ${levelTag} ${this.formatMessages(messages)}`;
97
+ }
98
+ // 统一输出到对应流
99
+ const stream = level === types_1.LogLevel.ERROR ? process.stderr : process.stdout;
100
+ stream.write(output + '\n');
101
+ }
102
+ /**
103
+ * 格式化日志消息,处理对象类型的格式化输出
104
+ * 使用 lodash 进行对象判断和序列化
105
+ * @param messages 消息列表
106
+ */
107
+ formatMessages(messages) {
108
+ return _.map(messages, (msg) => {
109
+ if (_.isObject(msg) || _.isArray(msg)) {
110
+ try {
111
+ return JSON.stringify(msg, null, 2);
112
+ }
113
+ catch {
114
+ return String(msg);
115
+ }
116
+ }
117
+ return String(msg);
118
+ }).join(' ');
119
+ }
120
+ /**
121
+ * 输出调试级别日志
122
+ */
123
+ debug(...messages) {
124
+ this.log(types_1.LogLevel.DEBUG, ...messages);
125
+ }
126
+ /**
127
+ * 输出信息级别日志
128
+ */
129
+ info(...messages) {
130
+ this.log(types_1.LogLevel.INFO, ...messages);
131
+ }
132
+ /**
133
+ * 输出警告级别日志
134
+ */
135
+ warn(...messages) {
136
+ this.log(types_1.LogLevel.WARN, ...messages);
137
+ }
138
+ /**
139
+ * 输出错误级别日志
140
+ */
141
+ error(...messages) {
142
+ this.log(types_1.LogLevel.ERROR, ...messages);
143
+ }
144
+ /**
145
+ * 输出成功信息(绿色高亮)
146
+ */
147
+ success(...messages) {
148
+ const formatted = this.formatMessages(messages);
149
+ process.stdout.write(chalk_1.default.green('✓ ') + chalk_1.default.whiteBright(formatted) + '\n');
150
+ }
151
+ /**
152
+ * 输出提示信息(蓝色高亮)
153
+ */
154
+ tip(...messages) {
155
+ const formatted = this.formatMessages(messages);
156
+ process.stdout.write(chalk_1.default.blue('ℹ ') + chalk_1.default.whiteBright(formatted) + '\n');
157
+ }
158
+ }
159
+ /** 导出日志单例实例 */
160
+ exports.logger = new Logger();
161
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 终端交互工具
3
+ * 封装 readline,提供问答与序号选择
4
+ */
5
+ export declare class PromptUtils {
6
+ /**
7
+ * 向终端提问并读取一行输入
8
+ * @param promptText 提示文案
9
+ */
10
+ static question(promptText: string): Promise<string>;
11
+ /**
12
+ * 按序号选择列表项(1-based 输入,返回 0-based 下标)
13
+ * 输入非法时循环提示,直到得到合法序号
14
+ * @param count 选项数量
15
+ * @param promptText 提示文案
16
+ */
17
+ static selectIndex(count: number, promptText?: string): Promise<number>;
18
+ }
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PromptUtils = void 0;
37
+ const readline = __importStar(require("node:readline/promises"));
38
+ const node_process_1 = require("node:process");
39
+ const _ = __importStar(require("lodash"));
40
+ const logger_1 = require("./logger");
41
+ /**
42
+ * 终端交互工具
43
+ * 封装 readline,提供问答与序号选择
44
+ */
45
+ class PromptUtils {
46
+ /**
47
+ * 向终端提问并读取一行输入
48
+ * @param promptText 提示文案
49
+ */
50
+ static async question(promptText) {
51
+ const rl = readline.createInterface({ input: node_process_1.stdin, output: node_process_1.stdout });
52
+ try {
53
+ return await rl.question(promptText);
54
+ }
55
+ finally {
56
+ rl.close();
57
+ }
58
+ }
59
+ /**
60
+ * 按序号选择列表项(1-based 输入,返回 0-based 下标)
61
+ * 输入非法时循环提示,直到得到合法序号
62
+ * @param count 选项数量
63
+ * @param promptText 提示文案
64
+ */
65
+ static async selectIndex(count, promptText = '请输入序号') {
66
+ while (true) {
67
+ const raw = _.trim(await this.question(`${promptText} (1-${count}): `));
68
+ const index = _.toInteger(raw);
69
+ if (_.inRange(index, 1, count + 1)) {
70
+ return index - 1;
71
+ }
72
+ logger_1.logger.warn(`无效序号,请输入 1-${count} 之间的数字`);
73
+ }
74
+ }
75
+ }
76
+ exports.PromptUtils = PromptUtils;
77
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iEAAmD;AACnD,+CAA6C;AAC7C,0CAA4B;AAC5B,qCAAkC;AAElC;;;GAGG;AACH,MAAa,WAAW;IACtB;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAkB;QAC7C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,oBAAK,EAAE,MAAM,EAAE,qBAAM,EAAE,CAAC,CAAC;QACtE,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;gBAAS,CAAC;YACT,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,KAAK,CAAC,WAAW,CAC7B,KAAa,EACb,aAAqB,OAAO;QAE5B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,UAAU,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC;YACxE,MAAM,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBACnC,OAAO,KAAK,GAAG,CAAC,CAAC;YACnB,CAAC;YACD,eAAM,CAAC,IAAI,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;CACF;AAjCD,kCAiCC"}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "sino-bc-cli",
3
+ "version": "1.0.0",
4
+ "description": "BeyondClick CLI - 命令行工具集合,提供快捷访问 BeyondClick 平台的命令行接口",
5
+ "bin": {
6
+ "sino-bc-cli": "dist/index.js"
7
+ },
8
+ "main": "dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "files": [
11
+ "dist/",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public",
17
+ "registry": "https://registry.npmjs.org/"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc && node --experimental-strip-types scripts/copy-skill.ts",
21
+ "dev": "ts-node src/index.ts",
22
+ "start": "node dist/index.js",
23
+ "clean": "rimraf dist",
24
+ "rebuild": "npm run clean && npm run build",
25
+ "prepublishOnly": "npm run rebuild",
26
+ "prepack": "npm run build",
27
+ "release:patch": "npm version patch && npm publish",
28
+ "release:minor": "npm version minor && npm publish",
29
+ "release:major": "npm version major && npm publish",
30
+ "publish:local": "node --experimental-strip-types scripts/publish.ts",
31
+ "publish:local:dry": "node --experimental-strip-types scripts/publish.ts --dry-run"
32
+ },
33
+ "engines": {
34
+ "node": ">=24.0.0"
35
+ },
36
+ "keywords": [
37
+ "beyondclick",
38
+ "cli",
39
+ "command-line",
40
+ "sino-bc-cli",
41
+ "sso",
42
+ "homepage"
43
+ ],
44
+ "author": "BeyondClick",
45
+ "license": "MIT",
46
+ "dependencies": {
47
+ "axios": "^1.7.0",
48
+ "chalk": "^4.1.2",
49
+ "commander": "^12.1.0",
50
+ "crypto-js": "^4.2.0",
51
+ "dayjs": "^1.11.11",
52
+ "lodash": "^4.17.21",
53
+ "open": "^8.4.2"
54
+ },
55
+ "devDependencies": {
56
+ "@types/crypto-js": "^4.2.2",
57
+ "@types/lodash": "^4.17.5",
58
+ "@types/node": "^22.0.0",
59
+ "rimraf": "^5.0.7",
60
+ "ts-node": "^10.9.2",
61
+ "typescript": "^5.5.0"
62
+ }
63
+ }