sino-bc-cli 1.3.2 → 1.4.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.
- package/README.md +60 -14
- package/dist/SKILL.md +32 -14
- package/dist/api-doc/README.md +23 -5
- package/dist/api-doc/biz-line-query.md +2 -0
- package/dist/api-doc/biz-line-strategy.md +2 -0
- package/dist/api-doc/icenter-mcp-strategy-dimension-facebook-ad-list.md +13 -5
- package/dist/api-doc/icenter-mcp-strategy-dimension-google-ad-list.md +170 -0
- package/dist/api-doc/icenter-mcp-strategy-dimension-tiktok-ad-list.md +172 -0
- package/dist/api-doc/icenter-mcp-strategy-metrics-facebook-ad-list.md +11 -6
- package/dist/api-doc/icenter-mcp-strategy-metrics-google-ad-list.md +201 -0
- package/dist/api-doc/icenter-mcp-strategy-metrics-tiktok-ad-list.md +204 -0
- package/dist/api-doc/icenter-mcp-version-query.md +5 -3
- package/dist/index.js +1 -33
- package/package.json +6 -3
- package/dist/commands/api-endpoint.command.d.ts +0 -58
- package/dist/commands/api-endpoint.command.js +0 -212
- package/dist/commands/api-endpoint.command.js.map +0 -1
- package/dist/commands/api-list.command.d.ts +0 -39
- package/dist/commands/api-list.command.js +0 -179
- package/dist/commands/api-list.command.js.map +0 -1
- package/dist/commands/bc-api.command.d.ts +0 -20
- package/dist/commands/bc-api.command.js +0 -30
- package/dist/commands/bc-api.command.js.map +0 -1
- package/dist/commands/ic-api.command.d.ts +0 -20
- package/dist/commands/ic-api.command.js +0 -30
- package/dist/commands/ic-api.command.js.map +0 -1
- package/dist/commands/index.d.ts +0 -12
- package/dist/commands/index.js +0 -29
- package/dist/commands/index.js.map +0 -1
- package/dist/commands/init.command.d.ts +0 -30
- package/dist/commands/init.command.js +0 -130
- package/dist/commands/init.command.js.map +0 -1
- package/dist/constants/api-catalog.d.ts +0 -34
- package/dist/constants/api-catalog.js +0 -118
- package/dist/constants/api-catalog.js.map +0 -1
- package/dist/constants/api-doc.d.ts +0 -13
- package/dist/constants/api-doc.js +0 -97
- package/dist/constants/api-doc.js.map +0 -1
- package/dist/constants/biz-line-api-doc.d.ts +0 -19
- package/dist/constants/biz-line-api-doc.js +0 -353
- package/dist/constants/biz-line-api-doc.js.map +0 -1
- package/dist/constants/gateway.d.ts +0 -35
- package/dist/constants/gateway.js +0 -113
- package/dist/constants/gateway.js.map +0 -1
- package/dist/constants/index.d.ts +0 -32
- package/dist/constants/index.js +0 -84
- package/dist/constants/index.js.map +0 -1
- package/dist/core/cli-app.d.ts +0 -51
- package/dist/core/cli-app.js +0 -283
- package/dist/core/cli-app.js.map +0 -1
- package/dist/core/command-registry.d.ts +0 -71
- package/dist/core/command-registry.js +0 -195
- package/dist/core/command-registry.js.map +0 -1
- package/dist/core/index.d.ts +0 -2
- package/dist/core/index.js +0 -9
- package/dist/core/index.js.map +0 -1
- package/dist/index.d.ts +0 -12
- package/dist/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -122
- package/dist/types/index.js +0 -46
- package/dist/types/index.js.map +0 -1
- package/dist/utils/browser.d.ts +0 -52
- package/dist/utils/browser.js +0 -222
- package/dist/utils/browser.js.map +0 -1
- package/dist/utils/common.d.ts +0 -97
- package/dist/utils/common.js +0 -198
- package/dist/utils/common.js.map +0 -1
- package/dist/utils/crypto.d.ts +0 -53
- package/dist/utils/crypto.js +0 -153
- package/dist/utils/crypto.js.map +0 -1
- package/dist/utils/http.d.ts +0 -58
- package/dist/utils/http.js +0 -188
- package/dist/utils/http.js.map +0 -1
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/index.js +0 -22
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -56
- package/dist/utils/logger.js +0 -161
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/prompt.d.ts +0 -18
- package/dist/utils/prompt.js +0 -77
- package/dist/utils/prompt.js.map +0 -1
- package/dist/utils/skill-install.d.ts +0 -74
- package/dist/utils/skill-install.js +0 -131
- package/dist/utils/skill-install.js.map +0 -1
|
@@ -1,195 +0,0 @@
|
|
|
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
|
-
* 自动解析命令名称(支持带斜杠前缀,如 /ic-api)
|
|
130
|
-
* @param name 命令名称或带斜杠的命令(如 /ic-api 或 ic-api)
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-registry.js","sourceRoot":"","sources":["../../src/core/command-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
DELETED
package/dist/core/index.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
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
|
package/dist/core/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/index.d.ts
DELETED
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/types/index.d.ts
DELETED
|
@@ -1,122 +0,0 @@
|
|
|
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
|
-
/** 所属分组(对应接口文档的标签),用于选择列表分节展示;不填则不分组 */
|
|
85
|
-
group?: string;
|
|
86
|
-
/** HTTP 方法 */
|
|
87
|
-
method: HttpMethod;
|
|
88
|
-
/** 相对路径 */
|
|
89
|
-
path: string;
|
|
90
|
-
/** 文档请求示例中的默认请求体;GET 无请求体时为空 */
|
|
91
|
-
defaultBody?: Record<string, unknown>;
|
|
92
|
-
/** 超时毫秒数 */
|
|
93
|
-
timeout: number;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* 日志级别枚举
|
|
97
|
-
*/
|
|
98
|
-
export declare enum LogLevel {
|
|
99
|
-
/** 调试级别 */
|
|
100
|
-
DEBUG = "debug",
|
|
101
|
-
/** 信息级别 */
|
|
102
|
-
INFO = "info",
|
|
103
|
-
/** 警告级别 */
|
|
104
|
-
WARN = "warn",
|
|
105
|
-
/** 错误级别 */
|
|
106
|
-
ERROR = "error"
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* 浏览器类型枚举
|
|
110
|
-
*/
|
|
111
|
-
export declare enum BrowserType {
|
|
112
|
-
/** 使用系统默认浏览器 */
|
|
113
|
-
DEFAULT = "default",
|
|
114
|
-
/** Chrome 浏览器 */
|
|
115
|
-
CHROME = "chrome",
|
|
116
|
-
/** Firefox 浏览器 */
|
|
117
|
-
FIREFOX = "firefox",
|
|
118
|
-
/** Edge 浏览器 */
|
|
119
|
-
EDGE = "edge",
|
|
120
|
-
/** Safari 浏览器 */
|
|
121
|
-
SAFARI = "safari"
|
|
122
|
-
}
|
package/dist/types/index.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
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
|
package/dist/types/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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;AA0CD;;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"}
|
package/dist/utils/browser.d.ts
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
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
|
-
* 使用系统默认程序打开本地文件
|
|
16
|
-
* 优先尝试 Cursor / VS Code(带行号跳转),失败再回退系统关联程序
|
|
17
|
-
* @param filePath 本地绝对路径
|
|
18
|
-
* @param line 可选的 1-based 行号,用于打开 markdown 标题处
|
|
19
|
-
* @returns 是否打开成功
|
|
20
|
-
*/
|
|
21
|
-
static openFile(filePath: string, line?: number): Promise<boolean>;
|
|
22
|
-
/**
|
|
23
|
-
* 探测可执行文件是否在 PATH 中
|
|
24
|
-
*/
|
|
25
|
-
private static hasCommand;
|
|
26
|
-
/**
|
|
27
|
-
* 分离进程启动编辑器,不阻塞 CLI
|
|
28
|
-
*/
|
|
29
|
-
private static spawnDetached;
|
|
30
|
-
/**
|
|
31
|
-
* 验证 URL 格式是否合法
|
|
32
|
-
* 使用 lodash 和正则表达式进行校验
|
|
33
|
-
* @param url 待验证的 URL
|
|
34
|
-
* @returns 是否为合法 URL
|
|
35
|
-
*/
|
|
36
|
-
private static isValidUrl;
|
|
37
|
-
/**
|
|
38
|
-
* 对 Windows cmd 命令中的特殊字符进行转义
|
|
39
|
-
* 解决 URL 中包含 & 等特殊字符时 cmd 解析错误的问题
|
|
40
|
-
* @param input 输入字符串
|
|
41
|
-
* @returns 转义后的字符串
|
|
42
|
-
*/
|
|
43
|
-
private static escapeForCmd;
|
|
44
|
-
/**
|
|
45
|
-
* 执行 shell 命令的 Promise 封装
|
|
46
|
-
* 使用 child_process.exec 并包装为 Promise,便于 async/await 调用
|
|
47
|
-
* @param command 要执行的命令
|
|
48
|
-
* @param timeout 超时时间(毫秒),默认 30 秒
|
|
49
|
-
* @returns Promise<void>
|
|
50
|
-
*/
|
|
51
|
-
private static execCommand;
|
|
52
|
-
}
|
package/dist/utils/browser.js
DELETED
|
@@ -1,222 +0,0 @@
|
|
|
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 fs_1 = require("fs");
|
|
40
|
-
const logger_1 = require("./logger");
|
|
41
|
-
/**
|
|
42
|
-
* 浏览器工具类
|
|
43
|
-
* 封装跨平台的浏览器打开操作,解决 Windows 和 macOS 兼容性问题
|
|
44
|
-
* 使用 Node.js 原生 child_process 模块,避免第三方依赖的兼容性风险
|
|
45
|
-
*/
|
|
46
|
-
class BrowserUtils {
|
|
47
|
-
/**
|
|
48
|
-
* 使用系统默认浏览器打开指定 URL
|
|
49
|
-
* 跨平台兼容:Windows 使用 start,macOS 使用 open,Linux 使用 xdg-open
|
|
50
|
-
* @param url 要打开的网址
|
|
51
|
-
* @returns Promise<boolean> 是否打开成功
|
|
52
|
-
*/
|
|
53
|
-
static async openUrl(url) {
|
|
54
|
-
// 验证 URL 格式
|
|
55
|
-
if (_.isEmpty(url) || !this.isValidUrl(url)) {
|
|
56
|
-
logger_1.logger.error(`无效的 URL 地址: ${url}`);
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
logger_1.logger.debug(`准备打开 URL: ${url}`);
|
|
60
|
-
logger_1.logger.tip(`正在使用默认浏览器打开: ${url}`);
|
|
61
|
-
try {
|
|
62
|
-
// 根据操作系统平台选择打开命令
|
|
63
|
-
const platform = process.platform;
|
|
64
|
-
let command;
|
|
65
|
-
switch (platform) {
|
|
66
|
-
// Windows 平台
|
|
67
|
-
case 'win32':
|
|
68
|
-
// 使用 cmd /c start "" "url" 格式,兼容含特殊字符的 URL
|
|
69
|
-
command = `cmd /c start "" "${this.escapeForCmd(url)}"`;
|
|
70
|
-
break;
|
|
71
|
-
// macOS 平台
|
|
72
|
-
case 'darwin':
|
|
73
|
-
command = `open "${url}"`;
|
|
74
|
-
break;
|
|
75
|
-
// Linux 及其他类 Unix 平台
|
|
76
|
-
default:
|
|
77
|
-
command = `xdg-open "${url}"`;
|
|
78
|
-
}
|
|
79
|
-
logger_1.logger.debug(`执行打开命令: ${command}`);
|
|
80
|
-
// 执行命令并等待完成
|
|
81
|
-
await this.execCommand(command);
|
|
82
|
-
logger_1.logger.success(`已成功在默认浏览器中打开: ${url}`);
|
|
83
|
-
return true;
|
|
84
|
-
}
|
|
85
|
-
catch (error) {
|
|
86
|
-
logger_1.logger.error('打开浏览器失败:', error instanceof Error ? error.message : String(error));
|
|
87
|
-
// 失败时给出手动访问提示
|
|
88
|
-
logger_1.logger.tip(`您可以手动在浏览器中访问此地址: ${url}`);
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* 使用系统默认程序打开本地文件
|
|
94
|
-
* 优先尝试 Cursor / VS Code(带行号跳转),失败再回退系统关联程序
|
|
95
|
-
* @param filePath 本地绝对路径
|
|
96
|
-
* @param line 可选的 1-based 行号,用于打开 markdown 标题处
|
|
97
|
-
* @returns 是否打开成功
|
|
98
|
-
*/
|
|
99
|
-
static async openFile(filePath, line) {
|
|
100
|
-
if (_.isEmpty(filePath) || !(0, fs_1.existsSync)(filePath)) {
|
|
101
|
-
logger_1.logger.error(`文件不存在: ${filePath}`);
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
const gotoTarget = !_.isNil(line) ? `${filePath}:${line}` : filePath;
|
|
105
|
-
logger_1.logger.debug(`准备打开本地文件: ${gotoTarget}`);
|
|
106
|
-
logger_1.logger.tip(`正在打开接口文档: ${filePath}`);
|
|
107
|
-
// 先探测 CLI 是否存在,再分离进程打开,避免 cursor/code 占用当前终端
|
|
108
|
-
if (await this.hasCommand('cursor') && this.spawnDetached('cursor', ['--goto', gotoTarget])) {
|
|
109
|
-
logger_1.logger.success(`已在 Cursor 中打开: ${gotoTarget}`);
|
|
110
|
-
return true;
|
|
111
|
-
}
|
|
112
|
-
if (await this.hasCommand('code') && this.spawnDetached('code', ['--goto', gotoTarget])) {
|
|
113
|
-
logger_1.logger.success(`已在 VS Code 中打开: ${gotoTarget}`);
|
|
114
|
-
return true;
|
|
115
|
-
}
|
|
116
|
-
try {
|
|
117
|
-
const platform = process.platform;
|
|
118
|
-
let command;
|
|
119
|
-
switch (platform) {
|
|
120
|
-
case 'win32':
|
|
121
|
-
command = `cmd /c start "" "${this.escapeForCmd(filePath)}"`;
|
|
122
|
-
break;
|
|
123
|
-
case 'darwin':
|
|
124
|
-
command = `open "${filePath}"`;
|
|
125
|
-
break;
|
|
126
|
-
default:
|
|
127
|
-
command = `xdg-open "${filePath}"`;
|
|
128
|
-
}
|
|
129
|
-
logger_1.logger.debug(`执行打开命令: ${command}`);
|
|
130
|
-
await this.execCommand(command);
|
|
131
|
-
logger_1.logger.success(`已使用系统默认程序打开: ${filePath}`);
|
|
132
|
-
return true;
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
logger_1.logger.error('打开文件失败:', error instanceof Error ? error.message : String(error));
|
|
136
|
-
logger_1.logger.tip(`您可以手动打开此文件: ${filePath}`);
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* 探测可执行文件是否在 PATH 中
|
|
142
|
-
*/
|
|
143
|
-
static hasCommand(bin) {
|
|
144
|
-
const probe = process.platform === 'win32' ? `where ${bin}` : `command -v ${bin}`;
|
|
145
|
-
return new Promise((resolve) => {
|
|
146
|
-
child_process.exec(probe, { timeout: 3000, windowsHide: true }, (error, stdout) => {
|
|
147
|
-
resolve(_.isNil(error) && !_.isEmpty(_.trim(stdout)));
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* 分离进程启动编辑器,不阻塞 CLI
|
|
153
|
-
*/
|
|
154
|
-
static spawnDetached(bin, args) {
|
|
155
|
-
try {
|
|
156
|
-
const child = child_process.spawn(bin, args, {
|
|
157
|
-
detached: true,
|
|
158
|
-
stdio: 'ignore',
|
|
159
|
-
windowsHide: true,
|
|
160
|
-
shell: process.platform === 'win32',
|
|
161
|
-
});
|
|
162
|
-
child.on('error', () => undefined);
|
|
163
|
-
child.unref();
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
catch {
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* 验证 URL 格式是否合法
|
|
172
|
-
* 使用 lodash 和正则表达式进行校验
|
|
173
|
-
* @param url 待验证的 URL
|
|
174
|
-
* @returns 是否为合法 URL
|
|
175
|
-
*/
|
|
176
|
-
static isValidUrl(url) {
|
|
177
|
-
if (_.isEmpty(url)) {
|
|
178
|
-
return false;
|
|
179
|
-
}
|
|
180
|
-
// 支持 http 和 https 协议
|
|
181
|
-
const urlPattern = /^https?:\/\/[^\s/$.?#].[^\s]*$/i;
|
|
182
|
-
return urlPattern.test(url);
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* 对 Windows cmd 命令中的特殊字符进行转义
|
|
186
|
-
* 解决 URL 中包含 & 等特殊字符时 cmd 解析错误的问题
|
|
187
|
-
* @param input 输入字符串
|
|
188
|
-
* @returns 转义后的字符串
|
|
189
|
-
*/
|
|
190
|
-
static escapeForCmd(input) {
|
|
191
|
-
// Windows cmd 中需要转义的字符:&、|、^、<、>
|
|
192
|
-
return _.replace(input, /[&|^<>]/g, (match) => `^${match}`);
|
|
193
|
-
}
|
|
194
|
-
/**
|
|
195
|
-
* 执行 shell 命令的 Promise 封装
|
|
196
|
-
* 使用 child_process.exec 并包装为 Promise,便于 async/await 调用
|
|
197
|
-
* @param command 要执行的命令
|
|
198
|
-
* @param timeout 超时时间(毫秒),默认 30 秒
|
|
199
|
-
* @returns Promise<void>
|
|
200
|
-
*/
|
|
201
|
-
static execCommand(command, timeout = 30000) {
|
|
202
|
-
return new Promise((resolve, reject) => {
|
|
203
|
-
child_process.exec(command, { timeout, windowsHide: true }, (error, _stdout, stderr) => {
|
|
204
|
-
if (error) {
|
|
205
|
-
// 某些平台上即使浏览器已成功打开,exec 也可能返回非零状态
|
|
206
|
-
// 只要没有 stderr 输出,就认为打开成功
|
|
207
|
-
if (_.isEmpty(stderr)) {
|
|
208
|
-
resolve();
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
reject(error);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
resolve();
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
exports.BrowserUtils = BrowserUtils;
|
|
222
|
-
//# sourceMappingURL=browser.js.map
|