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,195 @@
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.commandRegistry = exports.CommandRegistry = void 0;
37
+ const _ = __importStar(require("lodash"));
38
+ const utils_1 = require("../utils");
39
+ const constants_1 = require("../constants");
40
+ /**
41
+ * 命令注册器类
42
+ * 负责注册、查找和执行 CLI 命令
43
+ * 采用注册中心模式,实现命令的低耦合管理,方便后续扩展新命令
44
+ */
45
+ class CommandRegistry {
46
+ /** 命令存储 Map,key 为命令名称,value 为命令实例 */
47
+ commands = new Map();
48
+ /**
49
+ * 注册一个命令到注册中心
50
+ * 命令名称不区分大小写,会统一转为小写存储
51
+ * @param command 命令实例
52
+ * @returns 是否注册成功
53
+ */
54
+ register(command) {
55
+ // 参数合法性校验
56
+ if (_.isNil(command)) {
57
+ utils_1.logger.error('注册命令失败: 命令实例不能为空');
58
+ return false;
59
+ }
60
+ if (_.isEmpty(command.name)) {
61
+ utils_1.logger.error('注册命令失败: 命令名称不能为空');
62
+ return false;
63
+ }
64
+ if (_.isNil(command.execute) || !_.isFunction(command.execute)) {
65
+ utils_1.logger.error(`注册命令失败: 命令 [${command.name}] 缺少 execute 方法`);
66
+ return false;
67
+ }
68
+ // 命令名称统一转小写,确保不区分大小写
69
+ const commandName = _.toLower(command.name);
70
+ // 检查命令名称是否重复
71
+ if (this.commands.has(commandName)) {
72
+ utils_1.logger.warn(`命令 [${commandName}] 已存在,将覆盖原有注册`);
73
+ }
74
+ // 注册命令
75
+ this.commands.set(commandName, command);
76
+ utils_1.logger.debug(`成功注册命令: ${commandName}`);
77
+ return true;
78
+ }
79
+ /**
80
+ * 批量注册多个命令
81
+ * @param commands 命令实例数组
82
+ * @returns 成功注册的命令数量
83
+ */
84
+ registerAll(commands) {
85
+ let successCount = 0;
86
+ _.forEach(commands, (cmd) => {
87
+ if (this.register(cmd)) {
88
+ successCount++;
89
+ }
90
+ });
91
+ utils_1.logger.debug(`批量注册完成,成功 ${successCount}/${commands.length} 个命令`);
92
+ return successCount;
93
+ }
94
+ /**
95
+ * 根据名称查找命令
96
+ * @param name 命令名称(不区分大小写)
97
+ * @returns 命令实例,未找到返回 undefined
98
+ */
99
+ find(name) {
100
+ if (_.isEmpty(name)) {
101
+ return undefined;
102
+ }
103
+ return this.commands.get(_.toLower(name));
104
+ }
105
+ /**
106
+ * 检查指定名称的命令是否存在
107
+ * @param name 命令名称
108
+ * @returns 是否存在
109
+ */
110
+ has(name) {
111
+ return !_.isNil(this.find(name));
112
+ }
113
+ /**
114
+ * 获取所有已注册的命令列表
115
+ * @returns 命令实例数组
116
+ */
117
+ getAllCommands() {
118
+ return Array.from(this.commands.values());
119
+ }
120
+ /**
121
+ * 获取所有已注册的命令名称列表
122
+ * @returns 命令名称数组
123
+ */
124
+ getAllCommandNames() {
125
+ return Array.from(this.commands.keys());
126
+ }
127
+ /**
128
+ * 执行指定名称的命令
129
+ * 自动解析命令名称(支持带斜杠前缀,如 /homepage)
130
+ * @param name 命令名称或带斜杠的命令(如 /homepage 或 homepage)
131
+ * @param args 命令参数
132
+ * @param options 命令选项
133
+ * @returns Promise<boolean> 是否执行成功
134
+ */
135
+ async execute(name, args = [], options = {}) {
136
+ // 去除命令名称可能的斜杠前缀,并转小写
137
+ const cleanName = _.toLower(_.trimStart(name, '/'));
138
+ // 查找命令
139
+ const command = this.find(cleanName);
140
+ if (_.isNil(command)) {
141
+ utils_1.logger.error(`未找到命令: /${cleanName}`);
142
+ utils_1.logger.tip(`使用 "${constants_1.CLI_CONFIG.name} help" 查看所有可用命令`);
143
+ return false;
144
+ }
145
+ utils_1.logger.debug(`执行命令: /${cleanName}, 参数: ${JSON.stringify(args)}`);
146
+ try {
147
+ // 执行命令,兼容同步和异步返回
148
+ const result = command.execute(args, options);
149
+ if (result instanceof Promise) {
150
+ await result;
151
+ }
152
+ return true;
153
+ }
154
+ catch (error) {
155
+ utils_1.logger.error(`执行命令 /${cleanName} 时发生错误:`, error instanceof Error ? error.message : String(error));
156
+ if (error instanceof Error && !_.isEmpty(error.stack)) {
157
+ utils_1.logger.debug('错误堆栈:', error.stack);
158
+ }
159
+ return false;
160
+ }
161
+ }
162
+ /**
163
+ * 注销一个命令
164
+ * @param name 命令名称
165
+ * @returns 是否成功注销
166
+ */
167
+ unregister(name) {
168
+ const cleanName = _.toLower(_.trimStart(name, '/'));
169
+ if (!this.commands.has(cleanName)) {
170
+ utils_1.logger.warn(`无法注销命令 [${cleanName}]: 命令不存在`);
171
+ return false;
172
+ }
173
+ this.commands.delete(cleanName);
174
+ utils_1.logger.debug(`已注销命令: ${cleanName}`);
175
+ return true;
176
+ }
177
+ /**
178
+ * 清空所有已注册的命令
179
+ */
180
+ clear() {
181
+ this.commands.clear();
182
+ utils_1.logger.debug('已清空所有命令注册');
183
+ }
184
+ /**
185
+ * 获取已注册命令数量
186
+ * @returns 命令数量
187
+ */
188
+ size() {
189
+ return this.commands.size;
190
+ }
191
+ }
192
+ exports.CommandRegistry = CommandRegistry;
193
+ /** 导出全局命令注册器单例 */
194
+ exports.commandRegistry = new CommandRegistry();
195
+ //# sourceMappingURL=command-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-registry.js","sourceRoot":"","sources":["../../src/core/command-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { CommandRegistry, commandRegistry } from './command-registry';
2
+ export { CLIApplication } from './cli-app';
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CLIApplication = exports.commandRegistry = exports.CommandRegistry = void 0;
4
+ var command_registry_1 = require("./command-registry");
5
+ Object.defineProperty(exports, "CommandRegistry", { enumerable: true, get: function () { return command_registry_1.CommandRegistry; } });
6
+ Object.defineProperty(exports, "commandRegistry", { enumerable: true, get: function () { return command_registry_1.commandRegistry; } });
7
+ var cli_app_1 = require("./cli-app");
8
+ Object.defineProperty(exports, "CLIApplication", { enumerable: true, get: function () { return cli_app_1.CLIApplication; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAAA,uDAAsE;AAA7D,mHAAA,eAAe,OAAA;AAAE,mHAAA,eAAe,OAAA;AACzC,qCAA2C;AAAlC,yGAAA,cAAc,OAAA"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * BeyondClick CLI 工具 - 入口文件
4
+ *
5
+ * 本文件是整个 CLI 应用的启动入口,主要职责:
6
+ * 1. 创建 CLIApplication 实例
7
+ * 2. 调用 run 方法启动应用
8
+ * 3. 处理退出码,确保进程正确退出
9
+ *
10
+ * 在 package.json 中通过 bin 字段将本文件关联到 sino-bc-cli 命令
11
+ */
12
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * BeyondClick CLI 工具 - 入口文件
5
+ *
6
+ * 本文件是整个 CLI 应用的启动入口,主要职责:
7
+ * 1. 创建 CLIApplication 实例
8
+ * 2. 调用 run 方法启动应用
9
+ * 3. 处理退出码,确保进程正确退出
10
+ *
11
+ * 在 package.json 中通过 bin 字段将本文件关联到 sino-bc-cli 命令
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ const cli_app_1 = require("./core/cli-app");
15
+ /**
16
+ * 主函数:启动 CLI 应用
17
+ * 使用立即执行异步函数模式,确保可以使用 async/await
18
+ */
19
+ (async function main() {
20
+ // 创建 CLI 应用实例
21
+ const app = new cli_app_1.CLIApplication();
22
+ // 启动应用并获取退出码
23
+ const exitCode = await app.run(process.argv);
24
+ // 以正确的退出码退出进程
25
+ // 0 表示成功,非 0 表示执行失败
26
+ process.exit(exitCode);
27
+ })().catch((error) => {
28
+ // 最外层异常兜底,确保进程不会因未捕获异常异常终止
29
+ // 注意:正常情况下 CLIApplication.run 内部已经做了异常处理
30
+ // 这里是为了防止极端情况下的未捕获 Promise rejection
31
+ console.error('[FATAL] CLI 启动失败:', error);
32
+ process.exit(1);
33
+ });
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;GASG;;AAEH,4CAAgD;AAEhD;;;GAGG;AACH,CAAC,KAAK,UAAU,IAAI;IAClB,cAAc;IACd,MAAM,GAAG,GAAG,IAAI,wBAAc,EAAE,CAAC;IAEjC,aAAa;IACb,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C,cAAc;IACd,oBAAoB;IACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACnB,2BAA2B;IAC3B,yCAAyC;IACzC,qCAAqC;IACrC,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * CLI 命令接口定义
3
+ * 所有命令都必须实现此接口,确保命令注册器的统一管理
4
+ */
5
+ export interface ICommand {
6
+ /** 命令名称(不含斜杠) */
7
+ name: string;
8
+ /** 命令描述,用于帮助信息展示 */
9
+ description: string;
10
+ /** 命令使用示例 */
11
+ usage?: string;
12
+ /** 命令选项配置 */
13
+ options?: ICommandOption[];
14
+ /**
15
+ * 命令执行函数
16
+ * @param args 命令行参数
17
+ * @param options 解析后的选项
18
+ */
19
+ execute(args: string[], options?: Record<string, unknown>): Promise<void> | void;
20
+ }
21
+ /**
22
+ * 命令选项接口定义
23
+ */
24
+ export interface ICommandOption {
25
+ /** 选项名称(短格式,如 -p) */
26
+ short?: string;
27
+ /** 选项名称(长格式,如 --port) */
28
+ long: string;
29
+ /** 选项描述 */
30
+ description: string;
31
+ /** 是否需要参数值 */
32
+ required?: boolean;
33
+ /** 默认值 */
34
+ defaultValue?: unknown;
35
+ }
36
+ /**
37
+ * CLI 配置接口
38
+ */
39
+ export interface ICLIConfig {
40
+ /** CLI 名称 */
41
+ name: string;
42
+ /** CLI 版本号 */
43
+ version: string;
44
+ /** CLI 描述 */
45
+ description: string;
46
+ }
47
+ /**
48
+ * 运行环境枚举
49
+ */
50
+ export declare enum EnvName {
51
+ /** 测试环境 */
52
+ TEST = "test",
53
+ /** 预发环境 */
54
+ PRE = "pre",
55
+ /** 生产环境 */
56
+ PROD = "prod"
57
+ }
58
+ /**
59
+ * 单个环境的网关配置
60
+ */
61
+ export interface IGatewayConfig {
62
+ /** 环境标识 */
63
+ env: EnvName;
64
+ /** 环境中文说明 */
65
+ label: string;
66
+ /** 网关地址(后续填写) */
67
+ baseUrl: string;
68
+ }
69
+ /**
70
+ * HTTP 请求方法
71
+ */
72
+ export type HttpMethod = 'GET' | 'POST';
73
+ /**
74
+ * api-doc 中单个可调用接口的描述
75
+ * 与 src/api-doc 文档保持一一对应
76
+ */
77
+ export interface IApiDocEndpoint {
78
+ /** 接口 name,与文档一致 */
79
+ name: string;
80
+ /** 展示名 */
81
+ displayName: string;
82
+ /** 接口说明 */
83
+ description: string;
84
+ /** HTTP 方法 */
85
+ method: HttpMethod;
86
+ /** 相对路径 */
87
+ path: string;
88
+ /** 文档请求示例中的默认请求体;GET 无请求体时为空 */
89
+ defaultBody?: Record<string, unknown>;
90
+ /** 超时毫秒数 */
91
+ timeout: number;
92
+ }
93
+ /**
94
+ * 日志级别枚举
95
+ */
96
+ export declare enum LogLevel {
97
+ /** 调试级别 */
98
+ DEBUG = "debug",
99
+ /** 信息级别 */
100
+ INFO = "info",
101
+ /** 警告级别 */
102
+ WARN = "warn",
103
+ /** 错误级别 */
104
+ ERROR = "error"
105
+ }
106
+ /**
107
+ * 浏览器类型枚举
108
+ */
109
+ export declare enum BrowserType {
110
+ /** 使用系统默认浏览器 */
111
+ DEFAULT = "default",
112
+ /** Chrome 浏览器 */
113
+ CHROME = "chrome",
114
+ /** Firefox 浏览器 */
115
+ FIREFOX = "firefox",
116
+ /** Edge 浏览器 */
117
+ EDGE = "edge",
118
+ /** Safari 浏览器 */
119
+ SAFARI = "safari"
120
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BrowserType = exports.LogLevel = exports.EnvName = void 0;
4
+ /**
5
+ * 运行环境枚举
6
+ */
7
+ var EnvName;
8
+ (function (EnvName) {
9
+ /** 测试环境 */
10
+ EnvName["TEST"] = "test";
11
+ /** 预发环境 */
12
+ EnvName["PRE"] = "pre";
13
+ /** 生产环境 */
14
+ EnvName["PROD"] = "prod";
15
+ })(EnvName || (exports.EnvName = EnvName = {}));
16
+ /**
17
+ * 日志级别枚举
18
+ */
19
+ var LogLevel;
20
+ (function (LogLevel) {
21
+ /** 调试级别 */
22
+ LogLevel["DEBUG"] = "debug";
23
+ /** 信息级别 */
24
+ LogLevel["INFO"] = "info";
25
+ /** 警告级别 */
26
+ LogLevel["WARN"] = "warn";
27
+ /** 错误级别 */
28
+ LogLevel["ERROR"] = "error";
29
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
30
+ /**
31
+ * 浏览器类型枚举
32
+ */
33
+ var BrowserType;
34
+ (function (BrowserType) {
35
+ /** 使用系统默认浏览器 */
36
+ BrowserType["DEFAULT"] = "default";
37
+ /** Chrome 浏览器 */
38
+ BrowserType["CHROME"] = "chrome";
39
+ /** Firefox 浏览器 */
40
+ BrowserType["FIREFOX"] = "firefox";
41
+ /** Edge 浏览器 */
42
+ BrowserType["EDGE"] = "edge";
43
+ /** Safari 浏览器 */
44
+ BrowserType["SAFARI"] = "safari";
45
+ })(BrowserType || (exports.BrowserType = BrowserType = {}));
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAiDA;;GAEG;AACH,IAAY,OAOX;AAPD,WAAY,OAAO;IACjB,WAAW;IACX,wBAAa,CAAA;IACb,WAAW;IACX,sBAAW,CAAA;IACX,WAAW;IACX,wBAAa,CAAA;AACf,CAAC,EAPW,OAAO,uBAAP,OAAO,QAOlB;AAwCD;;GAEG;AACH,IAAY,QASX;AATD,WAAY,QAAQ;IAClB,WAAW;IACX,2BAAe,CAAA;IACf,WAAW;IACX,yBAAa,CAAA;IACb,WAAW;IACX,yBAAa,CAAA;IACb,WAAW;IACX,2BAAe,CAAA;AACjB,CAAC,EATW,QAAQ,wBAAR,QAAQ,QASnB;AAED;;GAEG;AACH,IAAY,WAWX;AAXD,WAAY,WAAW;IACrB,gBAAgB;IAChB,kCAAmB,CAAA;IACnB,iBAAiB;IACjB,gCAAiB,CAAA;IACjB,kBAAkB;IAClB,kCAAmB,CAAA;IACnB,eAAe;IACf,4BAAa,CAAA;IACb,iBAAiB;IACjB,gCAAiB,CAAA;AACnB,CAAC,EAXW,WAAW,2BAAX,WAAW,QAWtB"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * 浏览器工具类
3
+ * 封装跨平台的浏览器打开操作,解决 Windows 和 macOS 兼容性问题
4
+ * 使用 Node.js 原生 child_process 模块,避免第三方依赖的兼容性风险
5
+ */
6
+ export declare class BrowserUtils {
7
+ /**
8
+ * 使用系统默认浏览器打开指定 URL
9
+ * 跨平台兼容:Windows 使用 start,macOS 使用 open,Linux 使用 xdg-open
10
+ * @param url 要打开的网址
11
+ * @returns Promise<boolean> 是否打开成功
12
+ */
13
+ static openUrl(url: string): Promise<boolean>;
14
+ /**
15
+ * 验证 URL 格式是否合法
16
+ * 使用 lodash 和正则表达式进行校验
17
+ * @param url 待验证的 URL
18
+ * @returns 是否为合法 URL
19
+ */
20
+ private static isValidUrl;
21
+ /**
22
+ * 对 Windows cmd 命令中的特殊字符进行转义
23
+ * 解决 URL 中包含 & 等特殊字符时 cmd 解析错误的问题
24
+ * @param input 输入字符串
25
+ * @returns 转义后的字符串
26
+ */
27
+ private static escapeForCmd;
28
+ /**
29
+ * 执行 shell 命令的 Promise 封装
30
+ * 使用 child_process.exec 并包装为 Promise,便于 async/await 调用
31
+ * @param command 要执行的命令
32
+ * @param timeout 超时时间(毫秒),默认 30 秒
33
+ * @returns Promise<void>
34
+ */
35
+ private static execCommand;
36
+ }
@@ -0,0 +1,143 @@
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.BrowserUtils = void 0;
37
+ const _ = __importStar(require("lodash"));
38
+ const child_process = __importStar(require("child_process"));
39
+ const logger_1 = require("./logger");
40
+ /**
41
+ * 浏览器工具类
42
+ * 封装跨平台的浏览器打开操作,解决 Windows 和 macOS 兼容性问题
43
+ * 使用 Node.js 原生 child_process 模块,避免第三方依赖的兼容性风险
44
+ */
45
+ class BrowserUtils {
46
+ /**
47
+ * 使用系统默认浏览器打开指定 URL
48
+ * 跨平台兼容:Windows 使用 start,macOS 使用 open,Linux 使用 xdg-open
49
+ * @param url 要打开的网址
50
+ * @returns Promise<boolean> 是否打开成功
51
+ */
52
+ static async openUrl(url) {
53
+ // 验证 URL 格式
54
+ if (_.isEmpty(url) || !this.isValidUrl(url)) {
55
+ logger_1.logger.error(`无效的 URL 地址: ${url}`);
56
+ return false;
57
+ }
58
+ logger_1.logger.debug(`准备打开 URL: ${url}`);
59
+ logger_1.logger.tip(`正在使用默认浏览器打开: ${url}`);
60
+ try {
61
+ // 根据操作系统平台选择打开命令
62
+ const platform = process.platform;
63
+ let command;
64
+ switch (platform) {
65
+ // Windows 平台
66
+ case 'win32':
67
+ // 使用 cmd /c start "" "url" 格式,兼容含特殊字符的 URL
68
+ command = `cmd /c start "" "${this.escapeForCmd(url)}"`;
69
+ break;
70
+ // macOS 平台
71
+ case 'darwin':
72
+ command = `open "${url}"`;
73
+ break;
74
+ // Linux 及其他类 Unix 平台
75
+ default:
76
+ command = `xdg-open "${url}"`;
77
+ }
78
+ logger_1.logger.debug(`执行打开命令: ${command}`);
79
+ // 执行命令并等待完成
80
+ await this.execCommand(command);
81
+ logger_1.logger.success(`已成功在默认浏览器中打开: ${url}`);
82
+ return true;
83
+ }
84
+ catch (error) {
85
+ logger_1.logger.error('打开浏览器失败:', error instanceof Error ? error.message : String(error));
86
+ // 失败时给出手动访问提示
87
+ logger_1.logger.tip(`您可以手动在浏览器中访问此地址: ${url}`);
88
+ return false;
89
+ }
90
+ }
91
+ /**
92
+ * 验证 URL 格式是否合法
93
+ * 使用 lodash 和正则表达式进行校验
94
+ * @param url 待验证的 URL
95
+ * @returns 是否为合法 URL
96
+ */
97
+ static isValidUrl(url) {
98
+ if (_.isEmpty(url)) {
99
+ return false;
100
+ }
101
+ // 支持 http 和 https 协议
102
+ const urlPattern = /^https?:\/\/[^\s/$.?#].[^\s]*$/i;
103
+ return urlPattern.test(url);
104
+ }
105
+ /**
106
+ * 对 Windows cmd 命令中的特殊字符进行转义
107
+ * 解决 URL 中包含 & 等特殊字符时 cmd 解析错误的问题
108
+ * @param input 输入字符串
109
+ * @returns 转义后的字符串
110
+ */
111
+ static escapeForCmd(input) {
112
+ // Windows cmd 中需要转义的字符:&、|、^、<、>
113
+ return _.replace(input, /[&|^<>]/g, (match) => `^${match}`);
114
+ }
115
+ /**
116
+ * 执行 shell 命令的 Promise 封装
117
+ * 使用 child_process.exec 并包装为 Promise,便于 async/await 调用
118
+ * @param command 要执行的命令
119
+ * @param timeout 超时时间(毫秒),默认 30 秒
120
+ * @returns Promise<void>
121
+ */
122
+ static execCommand(command, timeout = 30000) {
123
+ return new Promise((resolve, reject) => {
124
+ child_process.exec(command, { timeout, windowsHide: true }, (error, _stdout, stderr) => {
125
+ if (error) {
126
+ // 某些平台上即使浏览器已成功打开,exec 也可能返回非零状态
127
+ // 只要没有 stderr 输出,就认为打开成功
128
+ if (_.isEmpty(stderr)) {
129
+ resolve();
130
+ }
131
+ else {
132
+ reject(error);
133
+ }
134
+ }
135
+ else {
136
+ resolve();
137
+ }
138
+ });
139
+ });
140
+ }
141
+ }
142
+ exports.BrowserUtils = BrowserUtils;
143
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"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"}