sino-bc-cli 1.1.0 → 1.3.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 +39 -28
- package/dist/SKILL.md +46 -21
- package/dist/api-doc/README.md +80 -0
- package/dist/api-doc/biz-line-query.md +212 -0
- package/dist/api-doc/biz-line-strategy.md +313 -0
- package/dist/api-doc/icenter-mcp-strategy-dimension-facebook-ad-list.md +162 -0
- package/dist/api-doc/icenter-mcp-strategy-metrics-facebook-ad-list.md +197 -0
- package/dist/api-doc/icenter-mcp-version-query.md +69 -0
- package/dist/commands/api-endpoint.command.d.ts +58 -0
- package/dist/commands/api-endpoint.command.js +212 -0
- package/dist/commands/api-endpoint.command.js.map +1 -0
- package/dist/commands/api-list.command.d.ts +39 -0
- package/dist/commands/api-list.command.js +179 -0
- package/dist/commands/api-list.command.js.map +1 -0
- package/dist/commands/bc-api.command.d.ts +20 -0
- package/dist/commands/bc-api.command.js +30 -0
- package/dist/commands/bc-api.command.js.map +1 -0
- package/dist/commands/ic-api.command.d.ts +8 -42
- package/dist/commands/ic-api.command.js +7 -186
- package/dist/commands/ic-api.command.js.map +1 -1
- package/dist/commands/index.d.ts +3 -2
- package/dist/commands/index.js +11 -9
- package/dist/commands/index.js.map +1 -1
- package/dist/constants/api-catalog.d.ts +34 -0
- package/dist/constants/api-catalog.js +118 -0
- package/dist/constants/api-catalog.js.map +1 -0
- package/dist/constants/api-doc.d.ts +2 -0
- package/dist/constants/api-doc.js +6 -1
- package/dist/constants/api-doc.js.map +1 -1
- package/dist/constants/biz-line-api-doc.d.ts +19 -0
- package/dist/constants/biz-line-api-doc.js +353 -0
- package/dist/constants/biz-line-api-doc.js.map +1 -0
- package/dist/constants/gateway.d.ts +4 -0
- package/dist/constants/gateway.js +5 -1
- package/dist/constants/gateway.js.map +1 -1
- package/dist/constants/index.d.ts +7 -14
- package/dist/constants/index.js +16 -13
- package/dist/constants/index.js.map +1 -1
- package/dist/core/cli-app.js +5 -5
- package/dist/core/cli-app.js.map +1 -1
- package/dist/core/command-registry.d.ts +2 -2
- package/dist/core/command-registry.js +2 -2
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/browser.d.ts +16 -0
- package/dist/utils/browser.js +79 -0
- package/dist/utils/browser.js.map +1 -1
- package/dist/utils/http.js +1 -0
- package/dist/utils/http.js.map +1 -1
- package/package.json +2 -3
- package/dist/commands/homepage.command.d.ts +0 -19
- package/dist/commands/homepage.command.js +0 -96
- package/dist/commands/homepage.command.js.map +0 -1
- package/dist/commands/nexus-swagger.command.d.ts +0 -19
- package/dist/commands/nexus-swagger.command.js +0 -95
- package/dist/commands/nexus-swagger.command.js.map +0 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# 查询git最新提交版本
|
|
2
|
+
|
|
3
|
+
- **name**:`icenter-mcp-version-query`
|
|
4
|
+
- **displayName**:查询git最新提交版本
|
|
5
|
+
- **Tool ID**:`4168bfbf86f6471bb35c6bcff0d12d06`
|
|
6
|
+
- **请求方法**:`GET`
|
|
7
|
+
- **集成类型**:REST
|
|
8
|
+
- **超时**:20000 ms
|
|
9
|
+
- **状态**:Online / Public / enabled
|
|
10
|
+
|
|
11
|
+
## 接口地址
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
https://o-test-tc-sino-icenter.meetsocial.com/icenter/version
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- **baseUrl**:`https://o-test-tc-sino-icenter.meetsocial.com`
|
|
18
|
+
- **path**:`/icenter/version`
|
|
19
|
+
|
|
20
|
+
## 说明
|
|
21
|
+
|
|
22
|
+
查询 iCenter 服务 git 最新提交版本。无请求参数、无请求体。
|
|
23
|
+
|
|
24
|
+
## 请求头
|
|
25
|
+
|
|
26
|
+
无必填 Header。`inputSchema` 为空 object。
|
|
27
|
+
|
|
28
|
+
## 请求参数
|
|
29
|
+
|
|
30
|
+
无。
|
|
31
|
+
|
|
32
|
+
## 请求示例
|
|
33
|
+
|
|
34
|
+
```http
|
|
35
|
+
GET /icenter/version HTTP/1.1
|
|
36
|
+
Host: o-test-tc-sino-icenter.meetsocial.com
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 响应说明
|
|
40
|
+
|
|
41
|
+
响应 `Content-Type` 为 `text/plain`,正文为 JSON。上游未声明 `outputSchema`,以下为实测返回。
|
|
42
|
+
|
|
43
|
+
| 字段 | 类型 | 说明 |
|
|
44
|
+
| --- | --- | --- |
|
|
45
|
+
| git.branch | string | 当前分支或对应提交 |
|
|
46
|
+
| git.build.time | string | 构建时间 |
|
|
47
|
+
| git.build.version | string | 构建版本号 |
|
|
48
|
+
| git.commit.id.abbrev | string | 短 commit id |
|
|
49
|
+
| git.commit.id.full | string | 完整 commit id |
|
|
50
|
+
| git.commit.message.short | string | 提交说明(短) |
|
|
51
|
+
| git.commit.time | string | 提交时间 |
|
|
52
|
+
| git.commit.user.name | string | 提交人 |
|
|
53
|
+
| git.total.commit.count | string | 提交总数 |
|
|
54
|
+
|
|
55
|
+
## 成功响应示例(实测)
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"git.branch": "35766a833e29865f49e4370ad19f34ca32bb02da",
|
|
60
|
+
"git.build.time": "2026-09-04T06:48:35+0000",
|
|
61
|
+
"git.build.version": "1.2.6",
|
|
62
|
+
"git.commit.id.abbrev": "35766a8",
|
|
63
|
+
"git.commit.id.full": "35766a833e29865f49e4370ad19f34ca32bb02da",
|
|
64
|
+
"git.commit.message.short": "策略生成0.5",
|
|
65
|
+
"git.commit.time": "2026-09-04T06:37:40+0000",
|
|
66
|
+
"git.commit.user.name": "cheng.wang",
|
|
67
|
+
"git.total.commit.count": "5"
|
|
68
|
+
}
|
|
69
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { IApiDocEndpoint, ICommand, EnvName } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* 接口调用类命令基类
|
|
4
|
+
* 统一封装「解析环境与 API Key → 交互选择接口 → 按网关地址发起调用 → 打印响应」流程
|
|
5
|
+
* 子类只需提供命令名、描述与可调用接口清单
|
|
6
|
+
*/
|
|
7
|
+
export declare abstract class BaseApiEndpointCommand implements ICommand {
|
|
8
|
+
/** 命令名称 */
|
|
9
|
+
abstract readonly name: string;
|
|
10
|
+
/** 命令描述 */
|
|
11
|
+
abstract readonly description: string;
|
|
12
|
+
/** 命令使用示例 */
|
|
13
|
+
abstract readonly usage: string;
|
|
14
|
+
/** 可调用接口清单 */
|
|
15
|
+
protected abstract readonly endpoints: IApiDocEndpoint[];
|
|
16
|
+
/** 接口清单来源说明,展示在选择列表标题处 */
|
|
17
|
+
protected abstract readonly docSource: string;
|
|
18
|
+
/**
|
|
19
|
+
* 命令执行函数
|
|
20
|
+
* @param args 位置参数:[ENV] [API_KEY]
|
|
21
|
+
* @param options 解析后的选项,支持 --env / --api-key
|
|
22
|
+
*/
|
|
23
|
+
execute(args: string[], options?: Record<string, unknown>): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 解析环境参数,优先级:--env > 位置参数中的合法 ENV > 默认 prod
|
|
26
|
+
*/
|
|
27
|
+
protected resolveEnv(args: string[], options?: Record<string, unknown>): EnvName;
|
|
28
|
+
/**
|
|
29
|
+
* 解析 API Key,优先级:--api-key > 非 ENV 的位置参数 > 默认值
|
|
30
|
+
*/
|
|
31
|
+
protected resolveApiKey(args: string[], options?: Record<string, unknown>): string;
|
|
32
|
+
/**
|
|
33
|
+
* 从 options 中按候选 key 取第一个有效值
|
|
34
|
+
*/
|
|
35
|
+
protected pickOption(options: Record<string, unknown> | undefined, keys: string[]): unknown;
|
|
36
|
+
/**
|
|
37
|
+
* 打印接口清单并让用户选择
|
|
38
|
+
* 接口带 group 时按分组分节展示,序号仍为全局连续编号
|
|
39
|
+
*/
|
|
40
|
+
protected selectApi(): Promise<IApiDocEndpoint>;
|
|
41
|
+
/**
|
|
42
|
+
* 打印即将发起的请求概要
|
|
43
|
+
*/
|
|
44
|
+
protected printRequestPreview(api: IApiDocEndpoint, url: string, apiKey: string): void;
|
|
45
|
+
/**
|
|
46
|
+
* 按接口方法发起请求并打印响应
|
|
47
|
+
*/
|
|
48
|
+
protected callApi(api: IApiDocEndpoint, url: string, apiKey: string): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* 将响应格式化为可读 JSON 文本
|
|
51
|
+
* 部分接口可能返回 text/plain,需兜底解析
|
|
52
|
+
*/
|
|
53
|
+
protected formatResponse(data: unknown): string;
|
|
54
|
+
/**
|
|
55
|
+
* 统一处理 HTTP 失败:优先打印服务端响应体
|
|
56
|
+
*/
|
|
57
|
+
protected handleRequestError(error: unknown): never;
|
|
58
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
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.BaseApiEndpointCommand = void 0;
|
|
40
|
+
const _ = __importStar(require("lodash"));
|
|
41
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
42
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
43
|
+
const axios_1 = require("axios");
|
|
44
|
+
const types_1 = require("../types");
|
|
45
|
+
const utils_1 = require("../utils");
|
|
46
|
+
const constants_1 = require("../constants");
|
|
47
|
+
/**
|
|
48
|
+
* 接口调用类命令基类
|
|
49
|
+
* 统一封装「解析环境与 API Key → 交互选择接口 → 按网关地址发起调用 → 打印响应」流程
|
|
50
|
+
* 子类只需提供命令名、描述与可调用接口清单
|
|
51
|
+
*/
|
|
52
|
+
class BaseApiEndpointCommand {
|
|
53
|
+
/**
|
|
54
|
+
* 命令执行函数
|
|
55
|
+
* @param args 位置参数:[ENV] [API_KEY]
|
|
56
|
+
* @param options 解析后的选项,支持 --env / --api-key
|
|
57
|
+
*/
|
|
58
|
+
async execute(args, options) {
|
|
59
|
+
utils_1.logger.debug(`[${this.name}] 命令执行开始,参数: ${JSON.stringify(args)}`);
|
|
60
|
+
const startTime = (0, dayjs_1.default)();
|
|
61
|
+
const env = this.resolveEnv(args, options);
|
|
62
|
+
const apiKey = this.resolveApiKey(args, options);
|
|
63
|
+
const gateway = (0, constants_1.getGatewayConfig)(env);
|
|
64
|
+
utils_1.logger.info(`[${utils_1.CommonUtils.formatDate(startTime)}] 当前环境: ${gateway.label} (${env}),网关: ${gateway.baseUrl}`);
|
|
65
|
+
const api = await this.selectApi();
|
|
66
|
+
const url = (0, constants_1.joinGatewayUrl)(env, api.path);
|
|
67
|
+
this.printRequestPreview(api, url, apiKey);
|
|
68
|
+
await this.callApi(api, url, apiKey);
|
|
69
|
+
const durationSec = _.round((0, dayjs_1.default)().diff(startTime) / 1000, 2);
|
|
70
|
+
utils_1.logger.debug(`[${this.name}] 命令执行完成,耗时: ${durationSec} 秒`);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 解析环境参数,优先级:--env > 位置参数中的合法 ENV > 默认 prod
|
|
74
|
+
*/
|
|
75
|
+
resolveEnv(args, options) {
|
|
76
|
+
const optionValue = this.pickOption(options, ['env', 'ENV']);
|
|
77
|
+
if ((0, constants_1.isEnvName)(optionValue)) {
|
|
78
|
+
return optionValue;
|
|
79
|
+
}
|
|
80
|
+
if (!_.isNil(optionValue) && optionValue !== true) {
|
|
81
|
+
throw new Error(`无效的 ENV: ${String(optionValue)},仅支持 test / pre / prod`);
|
|
82
|
+
}
|
|
83
|
+
const argEnv = _.find(args, (item) => (0, constants_1.isEnvName)(_.toLower(_.trim(item))));
|
|
84
|
+
if (!_.isNil(argEnv)) {
|
|
85
|
+
return _.toLower(_.trim(argEnv));
|
|
86
|
+
}
|
|
87
|
+
return types_1.EnvName.PROD;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 解析 API Key,优先级:--api-key > 非 ENV 的位置参数 > 默认值
|
|
91
|
+
*/
|
|
92
|
+
resolveApiKey(args, options) {
|
|
93
|
+
const optionValue = this.pickOption(options, ['api-key', 'apiKey', 'API_KEY']);
|
|
94
|
+
if (_.isString(optionValue) && !_.isEmpty(_.trim(optionValue))) {
|
|
95
|
+
return _.trim(optionValue);
|
|
96
|
+
}
|
|
97
|
+
const argKey = _.find(args, (item) => !(0, constants_1.isEnvName)(_.toLower(_.trim(item))));
|
|
98
|
+
if (!_.isNil(argKey) && !_.isEmpty(_.trim(argKey))) {
|
|
99
|
+
return _.trim(argKey);
|
|
100
|
+
}
|
|
101
|
+
return constants_1.DEFAULT_API_KEY;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* 从 options 中按候选 key 取第一个有效值
|
|
105
|
+
*/
|
|
106
|
+
pickOption(options, keys) {
|
|
107
|
+
if (_.isNil(options)) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
const matchedKey = _.find(keys, (key) => !_.isUndefined(options[key]));
|
|
111
|
+
return _.isNil(matchedKey) ? undefined : options[matchedKey];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 打印接口清单并让用户选择
|
|
115
|
+
* 接口带 group 时按分组分节展示,序号仍为全局连续编号
|
|
116
|
+
*/
|
|
117
|
+
async selectApi() {
|
|
118
|
+
process.stdout.write('\n');
|
|
119
|
+
process.stdout.write(chalk_1.default.bold('📦 可调用接口') + chalk_1.default.gray(`(来源: ${this.docSource})`) + '\n\n');
|
|
120
|
+
// 按 group 分组展示;无 group 的接口归入一个匿名分组
|
|
121
|
+
const grouped = _.groupBy(this.endpoints, (api) => api.group ?? '');
|
|
122
|
+
let serialNo = 0;
|
|
123
|
+
_.forEach(grouped, (apis, group) => {
|
|
124
|
+
if (!_.isEmpty(group)) {
|
|
125
|
+
process.stdout.write(chalk_1.default.bold.blueBright(` ── ${group} (${apis.length}) ──`) + '\n\n');
|
|
126
|
+
}
|
|
127
|
+
_.forEach(apis, (api) => {
|
|
128
|
+
serialNo += 1;
|
|
129
|
+
const serial = chalk_1.default.greenBright(` ${serialNo}.`);
|
|
130
|
+
const title = chalk_1.default.whiteBright(` ${api.displayName}`);
|
|
131
|
+
const meta = chalk_1.default.gray(` ${api.method} ${api.path}`);
|
|
132
|
+
const desc = chalk_1.default.white(` ${api.description}`);
|
|
133
|
+
process.stdout.write(`${serial}${title}\n${meta}\n${desc}\n\n`);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
// 分组仅影响展示顺序,需按同样顺序取回选中项
|
|
137
|
+
const ordered = _.flatMap(grouped, (apis) => apis);
|
|
138
|
+
const selectedIndex = await utils_1.PromptUtils.selectIndex(ordered.length);
|
|
139
|
+
return ordered[selectedIndex];
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 打印即将发起的请求概要
|
|
143
|
+
*/
|
|
144
|
+
printRequestPreview(api, url, apiKey) {
|
|
145
|
+
utils_1.logger.info(`已选择: ${api.displayName} (${api.name})`);
|
|
146
|
+
utils_1.logger.info(`请求方法: ${api.method}`);
|
|
147
|
+
utils_1.logger.info(`请求地址: ${url}`);
|
|
148
|
+
utils_1.logger.debug(`Authorization: Bearer ${apiKey}`);
|
|
149
|
+
utils_1.logger.debug(`${constants_1.GATEWAY_TYPE_HEADER}: ${constants_1.GATEWAY_TYPE_VALUE}`);
|
|
150
|
+
utils_1.logger.tip('已注入请求头 Authorization: Bearer ***');
|
|
151
|
+
utils_1.logger.tip(`已注入请求头 ${constants_1.GATEWAY_TYPE_HEADER}: ${constants_1.GATEWAY_TYPE_VALUE}`);
|
|
152
|
+
if (!_.isNil(api.defaultBody)) {
|
|
153
|
+
utils_1.logger.info('请求体(文档默认示例):');
|
|
154
|
+
utils_1.logger.info(api.defaultBody);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
utils_1.logger.info('该接口无请求体');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* 按接口方法发起请求并打印响应
|
|
162
|
+
*/
|
|
163
|
+
async callApi(api, url, apiKey) {
|
|
164
|
+
const config = {
|
|
165
|
+
timeout: api.timeout,
|
|
166
|
+
headers: {
|
|
167
|
+
Authorization: `Bearer ${apiKey}`,
|
|
168
|
+
'Content-Type': 'application/json',
|
|
169
|
+
[constants_1.GATEWAY_TYPE_HEADER]: constants_1.GATEWAY_TYPE_VALUE,
|
|
170
|
+
},
|
|
171
|
+
};
|
|
172
|
+
try {
|
|
173
|
+
utils_1.logger.info('正在发起请求...');
|
|
174
|
+
const data = api.method === 'GET'
|
|
175
|
+
? await utils_1.HttpUtils.get(url, config)
|
|
176
|
+
: await utils_1.HttpUtils.post(url, api.defaultBody, config);
|
|
177
|
+
utils_1.logger.success('接口调用成功,响应如下:');
|
|
178
|
+
process.stdout.write(this.formatResponse(data) + '\n');
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
this.handleRequestError(error);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 将响应格式化为可读 JSON 文本
|
|
186
|
+
* 部分接口可能返回 text/plain,需兜底解析
|
|
187
|
+
*/
|
|
188
|
+
formatResponse(data) {
|
|
189
|
+
if (_.isString(data)) {
|
|
190
|
+
try {
|
|
191
|
+
return JSON.stringify(JSON.parse(data), null, 2);
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return data;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return JSON.stringify(data, null, 2);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* 统一处理 HTTP 失败:优先打印服务端响应体
|
|
201
|
+
*/
|
|
202
|
+
handleRequestError(error) {
|
|
203
|
+
if (error instanceof axios_1.AxiosError && !_.isNil(error.response)) {
|
|
204
|
+
utils_1.logger.error(`接口调用失败,HTTP 状态码: ${error.response.status}`);
|
|
205
|
+
process.stdout.write(this.formatResponse(error.response.data) + '\n');
|
|
206
|
+
throw new Error(`接口调用失败: HTTP ${error.response.status}`);
|
|
207
|
+
}
|
|
208
|
+
throw error instanceof Error ? error : new Error(String(error));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.BaseApiEndpointCommand = BaseApiEndpointCommand;
|
|
212
|
+
//# sourceMappingURL=api-endpoint.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-endpoint.command.js","sourceRoot":"","sources":["../../src/commands/api-endpoint.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ICommand } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* 列出全部可调用接口,并支持点击 / 输入序号打开本地接口文档
|
|
4
|
+
* 命令名称: /api-list
|
|
5
|
+
*/
|
|
6
|
+
export declare class ApiListCommand implements ICommand {
|
|
7
|
+
/** 命令名称 */
|
|
8
|
+
readonly name: string;
|
|
9
|
+
/** 命令描述 */
|
|
10
|
+
readonly description: string;
|
|
11
|
+
/** 命令使用示例 */
|
|
12
|
+
readonly usage: string;
|
|
13
|
+
/**
|
|
14
|
+
* 命令执行函数
|
|
15
|
+
* @param args 可选:序号(1-based)或接口 name,传入则直接打开对应文档
|
|
16
|
+
*/
|
|
17
|
+
execute(args: string[]): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* 按分组打印可点击的接口清单
|
|
20
|
+
* 接口名使用 OSC 8 超链接指向本地 markdown,文档路径可被 Cursor / VS Code Ctrl+单击
|
|
21
|
+
*/
|
|
22
|
+
private printCatalog;
|
|
23
|
+
/**
|
|
24
|
+
* 交互终端下允许输入序号打开文档;非 TTY(如 Agent 调用)只打印清单
|
|
25
|
+
*/
|
|
26
|
+
private maybeSelectAndOpen;
|
|
27
|
+
/**
|
|
28
|
+
* 按序号或接口 name / 展示名查找
|
|
29
|
+
*/
|
|
30
|
+
private findItem;
|
|
31
|
+
/**
|
|
32
|
+
* 打开接口对应的本地 markdown 文档,优先跳到标题行
|
|
33
|
+
*/
|
|
34
|
+
private openDoc;
|
|
35
|
+
/**
|
|
36
|
+
* OSC 8 终端超链接:支持 Cursor / VS Code / Windows Terminal 等 Ctrl+单击
|
|
37
|
+
*/
|
|
38
|
+
private terminalLink;
|
|
39
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
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.ApiListCommand = void 0;
|
|
40
|
+
const _ = __importStar(require("lodash"));
|
|
41
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
42
|
+
const fs_1 = require("fs");
|
|
43
|
+
const path_1 = require("path");
|
|
44
|
+
const utils_1 = require("../utils");
|
|
45
|
+
const constants_1 = require("../constants");
|
|
46
|
+
/**
|
|
47
|
+
* 列出全部可调用接口,并支持点击 / 输入序号打开本地接口文档
|
|
48
|
+
* 命令名称: /api-list
|
|
49
|
+
*/
|
|
50
|
+
class ApiListCommand {
|
|
51
|
+
/** 命令名称 */
|
|
52
|
+
name = constants_1.COMMAND_NAMES.API_LIST;
|
|
53
|
+
/** 命令描述 */
|
|
54
|
+
description = '列出全部可调用接口;Ctrl+单击或输入序号打开对应接口文档';
|
|
55
|
+
/** 命令使用示例 */
|
|
56
|
+
usage = `
|
|
57
|
+
/${constants_1.COMMAND_NAMES.API_LIST}
|
|
58
|
+
/${constants_1.COMMAND_NAMES.API_LIST} 3
|
|
59
|
+
/${constants_1.COMMAND_NAMES.API_LIST} biz-line-open-list
|
|
60
|
+
sino-bc-cli /${constants_1.COMMAND_NAMES.API_LIST}
|
|
61
|
+
`;
|
|
62
|
+
/**
|
|
63
|
+
* 命令执行函数
|
|
64
|
+
* @param args 可选:序号(1-based)或接口 name,传入则直接打开对应文档
|
|
65
|
+
*/
|
|
66
|
+
async execute(args) {
|
|
67
|
+
utils_1.logger.debug(`[${this.name}] 命令执行开始,参数: ${JSON.stringify(args)}`);
|
|
68
|
+
const catalog = (0, constants_1.getApiCatalog)();
|
|
69
|
+
const apiDocDir = (0, constants_1.resolveApiDocDir)();
|
|
70
|
+
if (_.isNil(apiDocDir)) {
|
|
71
|
+
throw new Error('未找到 api-doc 目录,请先执行 npm run build,或确认安装包含 dist/api-doc');
|
|
72
|
+
}
|
|
73
|
+
this.printCatalog(catalog, apiDocDir);
|
|
74
|
+
const selector = _.trim(_.head(args) ?? '');
|
|
75
|
+
if (!_.isEmpty(selector)) {
|
|
76
|
+
const item = this.findItem(catalog, selector);
|
|
77
|
+
if (_.isNil(item)) {
|
|
78
|
+
throw new Error(`未找到接口: ${selector},请输入 1-${catalog.length} 的序号或接口 name`);
|
|
79
|
+
}
|
|
80
|
+
await this.openDoc(item, apiDocDir);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
await this.maybeSelectAndOpen(catalog, apiDocDir);
|
|
84
|
+
utils_1.logger.debug(`[${this.name}] 命令执行完成`);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 按分组打印可点击的接口清单
|
|
88
|
+
* 接口名使用 OSC 8 超链接指向本地 markdown,文档路径可被 Cursor / VS Code Ctrl+单击
|
|
89
|
+
*/
|
|
90
|
+
printCatalog(catalog, apiDocDir) {
|
|
91
|
+
process.stdout.write('\n');
|
|
92
|
+
process.stdout.write(chalk_1.default.bold('📦 可调用接口') +
|
|
93
|
+
chalk_1.default.gray(` 共 ${catalog.length} 个`) +
|
|
94
|
+
'\n\n');
|
|
95
|
+
const grouped = _.groupBy(catalog, (item) => item.endpoint.group ?? '');
|
|
96
|
+
let serialNo = 0;
|
|
97
|
+
_.forEach(grouped, (items, group) => {
|
|
98
|
+
if (!_.isEmpty(group)) {
|
|
99
|
+
const command = (0, constants_1.getGroupCommand)(group);
|
|
100
|
+
process.stdout.write(chalk_1.default.bold.blueBright(` ── ${group} (/${command} · ${items.length}) ──`) + '\n\n');
|
|
101
|
+
}
|
|
102
|
+
_.forEach(items, (item) => {
|
|
103
|
+
serialNo += 1;
|
|
104
|
+
const docPath = (0, path_1.join)(apiDocDir, item.docFile);
|
|
105
|
+
const line = (0, constants_1.findDocHeadingLine)(docPath, item.endpoint.displayName);
|
|
106
|
+
const fileUrl = (0, constants_1.toFileUrl)(docPath);
|
|
107
|
+
const titleText = process.stdout.isTTY
|
|
108
|
+
? this.terminalLink(item.endpoint.displayName, fileUrl)
|
|
109
|
+
: `[${item.endpoint.displayName}](${fileUrl})`;
|
|
110
|
+
const pathHint = (0, fs_1.existsSync)(docPath)
|
|
111
|
+
? !_.isNil(line)
|
|
112
|
+
? `${docPath}:${line}`
|
|
113
|
+
: docPath
|
|
114
|
+
: chalk_1.default.red(`${item.docFile}(文档缺失)`);
|
|
115
|
+
process.stdout.write(`${chalk_1.default.greenBright(` ${serialNo}.`)} ${chalk_1.default.whiteBright(titleText)}\n` +
|
|
116
|
+
chalk_1.default.gray(` ${item.endpoint.method} ${item.endpoint.path}`) +
|
|
117
|
+
'\n' +
|
|
118
|
+
chalk_1.default.white(` ${item.endpoint.description}`) +
|
|
119
|
+
'\n' +
|
|
120
|
+
chalk_1.default.gray(` 📄 ${pathHint}`) +
|
|
121
|
+
'\n\n');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
utils_1.logger.tip('Cursor / VS Code 终端中 Ctrl+单击接口名或文档路径即可打开;也可输入序号,或执行 sino-bc-cli /api-list <序号|name>');
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 交互终端下允许输入序号打开文档;非 TTY(如 Agent 调用)只打印清单
|
|
128
|
+
*/
|
|
129
|
+
async maybeSelectAndOpen(catalog, apiDocDir) {
|
|
130
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
process.stdout.write('\n');
|
|
134
|
+
const raw = _.trim(await utils_1.PromptUtils.question(`请输入序号打开文档 (1-${catalog.length}),直接回车退出: `));
|
|
135
|
+
if (_.isEmpty(raw)) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const item = this.findItem(catalog, raw);
|
|
139
|
+
if (_.isNil(item)) {
|
|
140
|
+
utils_1.logger.warn(`无效序号或 name,请输入 1-${catalog.length} 之间的数字`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
await this.openDoc(item, apiDocDir);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 按序号或接口 name / 展示名查找
|
|
147
|
+
*/
|
|
148
|
+
findItem(catalog, selector) {
|
|
149
|
+
const index = _.toInteger(selector);
|
|
150
|
+
if (/^\d+$/.test(selector) && _.inRange(index, 1, catalog.length + 1)) {
|
|
151
|
+
return catalog[index - 1];
|
|
152
|
+
}
|
|
153
|
+
const byName = _.find(catalog, (item) => item.endpoint.name === selector);
|
|
154
|
+
if (!_.isNil(byName)) {
|
|
155
|
+
return byName;
|
|
156
|
+
}
|
|
157
|
+
return _.find(catalog, (item) => item.endpoint.displayName === selector);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* 打开接口对应的本地 markdown 文档,优先跳到标题行
|
|
161
|
+
*/
|
|
162
|
+
async openDoc(item, apiDocDir) {
|
|
163
|
+
const docPath = (0, path_1.join)(apiDocDir, item.docFile);
|
|
164
|
+
const line = (0, constants_1.findDocHeadingLine)(docPath, item.endpoint.displayName);
|
|
165
|
+
utils_1.logger.info(`打开文档: ${item.endpoint.displayName} (${item.endpoint.name})`);
|
|
166
|
+
const opened = await utils_1.BrowserUtils.openFile(docPath, line);
|
|
167
|
+
if (!opened) {
|
|
168
|
+
throw new Error(`打开接口文档失败: ${docPath}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* OSC 8 终端超链接:支持 Cursor / VS Code / Windows Terminal 等 Ctrl+单击
|
|
173
|
+
*/
|
|
174
|
+
terminalLink(text, url) {
|
|
175
|
+
return `\u001b]8;;${url}\u0007${text}\u001b]8;;\u0007`;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.ApiListCommand = ApiListCommand;
|
|
179
|
+
//# sourceMappingURL=api-list.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-list.command.js","sourceRoot":"","sources":["../../src/commands/api-list.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { IApiDocEndpoint } from '../types';
|
|
2
|
+
import { BaseApiEndpointCommand } from './api-endpoint.command';
|
|
3
|
+
/**
|
|
4
|
+
* 调用 sino-opti-hive 业务线接口命令
|
|
5
|
+
* 命令名称: /bc-api
|
|
6
|
+
* 功能: 交互选择「业务线查询 / 业务线策略」接口,向对应接口地址发起调用
|
|
7
|
+
* 所有路径统一带 /sino-opti-hive 网关路由前缀
|
|
8
|
+
*/
|
|
9
|
+
export declare class BcApiCommand extends BaseApiEndpointCommand {
|
|
10
|
+
/** 命令名称 */
|
|
11
|
+
readonly name: string;
|
|
12
|
+
/** 命令描述 */
|
|
13
|
+
readonly description: string;
|
|
14
|
+
/** 命令使用示例 */
|
|
15
|
+
readonly usage: string;
|
|
16
|
+
/** 可调用接口清单 */
|
|
17
|
+
protected readonly endpoints: IApiDocEndpoint[];
|
|
18
|
+
/** 接口清单来源说明 */
|
|
19
|
+
protected readonly docSource: string;
|
|
20
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BcApiCommand = void 0;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
const api_endpoint_command_1 = require("./api-endpoint.command");
|
|
6
|
+
/**
|
|
7
|
+
* 调用 sino-opti-hive 业务线接口命令
|
|
8
|
+
* 命令名称: /bc-api
|
|
9
|
+
* 功能: 交互选择「业务线查询 / 业务线策略」接口,向对应接口地址发起调用
|
|
10
|
+
* 所有路径统一带 /sino-opti-hive 网关路由前缀
|
|
11
|
+
*/
|
|
12
|
+
class BcApiCommand extends api_endpoint_command_1.BaseApiEndpointCommand {
|
|
13
|
+
/** 命令名称 */
|
|
14
|
+
name = constants_1.COMMAND_NAMES.BC_API;
|
|
15
|
+
/** 命令描述 */
|
|
16
|
+
description = '交互选择并调用业务线查询 / 业务线策略接口(请求体默认使用文档示例)';
|
|
17
|
+
/** 命令使用示例 */
|
|
18
|
+
usage = `
|
|
19
|
+
/${constants_1.COMMAND_NAMES.BC_API}
|
|
20
|
+
/${constants_1.COMMAND_NAMES.BC_API} test
|
|
21
|
+
/${constants_1.COMMAND_NAMES.BC_API} prod sk-your-api-key
|
|
22
|
+
sino-bc-cli /${constants_1.COMMAND_NAMES.BC_API} --env=pre --api-key=sk-xxx
|
|
23
|
+
`;
|
|
24
|
+
/** 可调用接口清单 */
|
|
25
|
+
endpoints = constants_1.BIZ_LINE_APIS;
|
|
26
|
+
/** 接口清单来源说明 */
|
|
27
|
+
docSource = 'src/api-doc/biz-line-*.md';
|
|
28
|
+
}
|
|
29
|
+
exports.BcApiCommand = BcApiCommand;
|
|
30
|
+
//# sourceMappingURL=bc-api.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bc-api.command.js","sourceRoot":"","sources":["../../src/commands/bc-api.command.ts"],"names":[],"mappings":";;;AACA,4CAA4D;AAC5D,iEAAgE;AAEhE;;;;;GAKG;AACH,MAAa,YAAa,SAAQ,6CAAsB;IACtD,WAAW;IACK,IAAI,GAAW,yBAAa,CAAC,MAAM,CAAC;IAEpD,WAAW;IACK,WAAW,GAAW,qCAAqC,CAAC;IAE5E,aAAa;IACG,KAAK,GAAW;OAC3B,yBAAa,CAAC,MAAM;OACpB,yBAAa,CAAC,MAAM;OACpB,yBAAa,CAAC,MAAM;mBACR,yBAAa,CAAC,MAAM;GACpC,CAAC;IAEF,cAAc;IACK,SAAS,GAAsB,yBAAa,CAAC;IAEhE,eAAe;IACI,SAAS,GAAW,2BAA2B,CAAC;CACpE;AApBD,oCAoBC"}
|