hdk-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.
package/bin/hdk.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+
3
+ 'use strict';
4
+
5
+ require('../dist/index.js');
@@ -0,0 +1,15 @@
1
+ /**
2
+ * config 命令
3
+ * 管理不同环境的 token 配置
4
+ *
5
+ * 用法:
6
+ * hd-cli config set [env] --token <token>
7
+ * hd-cli config list
8
+ * hd-cli config use <env>
9
+ * hd-cli config remove <env>
10
+ * hd-cli config current
11
+ * hd-cli config path
12
+ */
13
+ import { Command } from 'commander';
14
+ export declare function registerConfigCommand(program: Command): void;
15
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+F5D"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * config 命令
4
+ * 管理不同环境的 token 配置
5
+ *
6
+ * 用法:
7
+ * hd-cli config set [env] --token <token>
8
+ * hd-cli config list
9
+ * hd-cli config use <env>
10
+ * hd-cli config remove <env>
11
+ * hd-cli config current
12
+ * hd-cli config path
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.registerConfigCommand = registerConfigCommand;
16
+ const config_1 = require("../lib/config");
17
+ const output_1 = require("../lib/output");
18
+ function registerConfigCommand(program) {
19
+ const config = program
20
+ .command('config')
21
+ .description('管理环境配置和 Token');
22
+ // hd-cli config set [env] --token <token>
23
+ config
24
+ .command('set [env]')
25
+ .description('设置指定环境的 Token(不指定环境名则为 default)')
26
+ .requiredOption('--token <token>', 'API Token')
27
+ .action((env, opts) => {
28
+ const envName = env || 'default';
29
+ try {
30
+ (0, config_1.setToken)(envName, opts.token);
31
+ (0, output_1.outputSuccess)({ env: envName }, `Token 已设置到环境 "${envName}"`);
32
+ }
33
+ catch (err) {
34
+ (0, output_1.outputError)(`设置 Token 失败: ${err.message}`);
35
+ }
36
+ });
37
+ // hd-cli config list
38
+ config
39
+ .command('list')
40
+ .description('列出所有已配置的环境')
41
+ .action(() => {
42
+ const { envs, currentEnv } = (0, config_1.listEnvs)();
43
+ if (envs.length === 0) {
44
+ (0, output_1.outputSuccess)({ envs: [], current: null }, '暂无配置的环境,使用 `hd-cli config set` 添加');
45
+ return;
46
+ }
47
+ const envList = envs.map((e) => ({
48
+ name: e.name,
49
+ current: e.name === currentEnv ? '✓' : '',
50
+ updatedAt: e.updatedAt,
51
+ }));
52
+ (0, output_1.outputSuccess)({ envs: envList, current: currentEnv });
53
+ });
54
+ // hd-cli config use <env>
55
+ config
56
+ .command('use <env>')
57
+ .description('切换当前使用的环境')
58
+ .action((env) => {
59
+ const success = (0, config_1.switchEnv)(env);
60
+ if (success) {
61
+ (0, output_1.outputSuccess)({ env }, `已切换到环境 "${env}"`);
62
+ }
63
+ else {
64
+ (0, output_1.outputError)(`环境 "${env}" 不存在,请先使用 \`hd-cli config set ${env} --token <token>\` 创建`);
65
+ }
66
+ });
67
+ // hd-cli config remove <env>
68
+ config
69
+ .command('remove <env>')
70
+ .description('删除指定环境配置')
71
+ .action((env) => {
72
+ const success = (0, config_1.removeEnv)(env);
73
+ if (success) {
74
+ (0, output_1.outputSuccess)({ env }, `环境 "${env}" 已删除`);
75
+ }
76
+ else {
77
+ (0, output_1.outputError)(`环境 "${env}" 不存在`);
78
+ }
79
+ });
80
+ // hd-cli config current
81
+ config
82
+ .command('current')
83
+ .description('显示当前环境信息')
84
+ .action(() => {
85
+ const globalConfig = (0, config_1.loadConfig)();
86
+ const envConfig = (0, config_1.getEnvConfig)();
87
+ if (!envConfig) {
88
+ (0, output_1.outputError)('当前没有配置任何环境,请先使用 `hd-cli config set` 设置');
89
+ return;
90
+ }
91
+ (0, output_1.outputSuccess)({
92
+ env: globalConfig.currentEnv,
93
+ tokenSet: !!envConfig.token,
94
+ updatedAt: envConfig.updatedAt,
95
+ });
96
+ });
97
+ // hd-cli config path
98
+ config
99
+ .command('path')
100
+ .description('显示配置文件路径')
101
+ .action(() => {
102
+ (0, output_1.outputSuccess)({ path: (0, config_1.getConfigPath)() });
103
+ });
104
+ }
105
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * plan 命令
3
+ * 管理计划(RESTful API 独立命令模式)
4
+ *
5
+ * 用法:
6
+ * hdk plan list # 列出所有计划
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare function registerPlanCommand(program: Command): void;
10
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0C1D"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * plan 命令
4
+ * 管理计划(RESTful API 独立命令模式)
5
+ *
6
+ * 用法:
7
+ * hdk plan list # 列出所有计划
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.registerPlanCommand = registerPlanCommand;
11
+ const client_1 = require("../lib/client");
12
+ const config_1 = require("../lib/config");
13
+ const output_1 = require("../lib/output");
14
+ function registerPlanCommand(program) {
15
+ const plan = program
16
+ .command('plan')
17
+ .description('管理计划');
18
+ // ─── plan list ───────────────────────────────────────────
19
+ // GET /v1/plan/list
20
+ plan
21
+ .command('list')
22
+ .description('列出所有计划')
23
+ .option('-e, --env <env>', '指定环境')
24
+ .option('--status <status>', '按状态筛选')
25
+ .option('--page <page>', '页码', '1')
26
+ .option('--size <size>', '每页数量', '20')
27
+ .action(async (opts) => {
28
+ const token = (0, config_1.getToken)(opts.env);
29
+ if (!token) {
30
+ const hint = opts.env ? `环境 "${opts.env}"` : '当前环境';
31
+ (0, output_1.outputError)(`${hint}未设置 Token,请先运行:\n hdk config set ${opts.env || 'default'} --token <your-token>`);
32
+ return;
33
+ }
34
+ try {
35
+ const params = {
36
+ page: parseInt(opts.page, 10),
37
+ size: parseInt(opts.size, 10),
38
+ };
39
+ if (opts.status)
40
+ params.status = opts.status;
41
+ const result = await (0, client_1.get)('/v1/plan/list', params, { env: opts.env });
42
+ if (result.success) {
43
+ (0, output_1.outputSuccess)(result.data);
44
+ }
45
+ else {
46
+ (0, output_1.outputError)(result.message || '获取计划列表失败');
47
+ }
48
+ }
49
+ catch (err) {
50
+ (0, output_1.outputError)(err.message || '获取计划列表失败');
51
+ }
52
+ });
53
+ }
54
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAOH,kDA0CC;AA9CD,0CAAoC;AACpC,0CAAyC;AACzC,0CAA2D;AAE3D,SAAgB,mBAAmB,CAAC,OAAgB;IAClD,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,MAAM,CAAC,CAAC;IAEvB,4DAA4D;IAC5D,oBAAoB;IACpB,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,QAAQ,CAAC;SACrB,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC;SACjC,MAAM,CAAC,mBAAmB,EAAE,OAAO,CAAC;SACpC,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,CAAC;SAClC,MAAM,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC;SACrC,MAAM,CAAC,KAAK,EAAE,IAAS,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YACpD,IAAA,oBAAW,EACT,GAAG,IAAI,qCAAqC,IAAI,CAAC,GAAG,IAAI,SAAS,uBAAuB,CACzF,CAAC;YACF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAwB;gBAClC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;aAC9B,CAAC;YACF,IAAI,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAE7C,MAAM,MAAM,GAAG,MAAM,IAAA,YAAG,EAAC,eAAe,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAErE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAA,sBAAa,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAA,oBAAW,EAAC,MAAM,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAA,oBAAW,EAAC,GAAG,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * status 命令
3
+ * 验证当前环境的连接状态(检查 Token 有效性和 API 可达性)
4
+ *
5
+ * 用法:
6
+ * hdk status [-e <env>]
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare function registerStatusCommand(program: Command): void;
10
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD5D"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /**
3
+ * status 命令
4
+ * 验证当前环境的连接状态(检查 Token 有效性和 API 可达性)
5
+ *
6
+ * 用法:
7
+ * hdk status [-e <env>]
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.registerStatusCommand = registerStatusCommand;
11
+ const config_1 = require("../lib/config");
12
+ const client_1 = require("../lib/client");
13
+ const output_1 = require("../lib/output");
14
+ function registerStatusCommand(program) {
15
+ program
16
+ .command('status')
17
+ .description('检查当前环境的连接状态')
18
+ .option('-e, --env <env>', '指定检查的环境(不指定则使用当前环境)')
19
+ .action(async (opts) => {
20
+ const config = (0, config_1.loadConfig)();
21
+ const envName = opts.env || config.currentEnv;
22
+ const envConfig = (0, config_1.getEnvConfig)(envName);
23
+ if (!envConfig) {
24
+ (0, output_1.outputError)(`环境 "${envName}" 未配置,请先运行:\n hdk config set ${envName} --token <your-token>`);
25
+ return;
26
+ }
27
+ const token = (0, config_1.getToken)(envName);
28
+ if (!token) {
29
+ (0, output_1.outputError)(`环境 "${envName}" 未设置 Token`);
30
+ return;
31
+ }
32
+ try {
33
+ // 尝试调用 API 验证连接
34
+ const client = (0, client_1.createClient)({ env: envName, timeout: 10000 });
35
+ const response = await client.get('/api/health');
36
+ (0, output_1.outputSuccess)({
37
+ connected: true,
38
+ env: envName,
39
+ tokenValid: true,
40
+ serverStatus: response.data?.status || 'ok',
41
+ }, `环境 "${envName}" 连接正常`);
42
+ }
43
+ catch (err) {
44
+ // 区分网络错误和认证错误
45
+ if (err.message.includes('认证失败')) {
46
+ (0, output_1.outputSuccess)({
47
+ connected: true,
48
+ env: envName,
49
+ tokenValid: false,
50
+ }, `环境 "${envName}" API 可达,但 Token 无效`);
51
+ }
52
+ else {
53
+ (0, output_1.outputSuccess)({
54
+ connected: false,
55
+ env: envName,
56
+ error: err.message,
57
+ }, `环境 "${envName}" 连接失败: ${err.message}`);
58
+ }
59
+ }
60
+ });
61
+ }
62
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAOH,sDAmDC;AAvDD,0CAAmE;AACnE,0CAA6C;AAC7C,0CAA2D;AAE3D,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,aAAa,CAAC;SAC1B,MAAM,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAAsB,EAAE,EAAE;QACvC,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAA,qBAAY,EAAC,OAAO,CAAC,CAAC;QAExC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAA,oBAAW,EACT,OAAO,OAAO,iCAAiC,OAAO,uBAAuB,CAC9E,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAA,iBAAQ,EAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAA,oBAAW,EAAC,OAAO,OAAO,aAAa,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,gBAAgB;YAChB,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAEjD,IAAA,sBAAa,EAAC;gBACZ,SAAS,EAAE,IAAI;gBACf,GAAG,EAAE,OAAO;gBACZ,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI;aAC5C,EAAE,OAAO,OAAO,QAAQ,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,cAAc;YACd,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,IAAA,sBAAa,EAAC;oBACZ,SAAS,EAAE,IAAI;oBACf,GAAG,EAAE,OAAO;oBACZ,UAAU,EAAE,KAAK;iBAClB,EAAE,OAAO,OAAO,qBAAqB,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,IAAA,sBAAa,EAAC;oBACZ,SAAS,EAAE,KAAK;oBAChB,GAAG,EAAE,OAAO;oBACZ,KAAK,EAAE,GAAG,CAAC,OAAO;iBACnB,EAAE,OAAO,OAAO,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * hdk 主入口
3
+ * 注册所有命令、处理全局选项
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ /**
3
+ * hdk 主入口
4
+ * 注册所有命令、处理全局选项
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const output_1 = require("./lib/output");
9
+ const config_1 = require("./commands/config");
10
+ const status_1 = require("./commands/status");
11
+ const plan_1 = require("./commands/plan");
12
+ const packageJson = require('../package.json');
13
+ // 创建主程序
14
+ const program = new commander_1.Command();
15
+ program
16
+ .name('hdk')
17
+ .description('厚笃科技 CLI 工具 - 命令行操作与 AI Agent 集成')
18
+ .version(packageJson.version, '-v, --version')
19
+ .option('-f, --format <format>', '输出格式: json | table | text', 'json')
20
+ .option('-e, --env <env>', '指定环境(全局选项,所有子命令可用)')
21
+ .hook('preAction', (thisCommand) => {
22
+ // 在执行任何命令前设置输出格式
23
+ const opts = thisCommand.opts();
24
+ if (opts.format) {
25
+ (0, output_1.setOutputFormat)(opts.format);
26
+ }
27
+ });
28
+ // 注册所有命令
29
+ (0, config_1.registerConfigCommand)(program);
30
+ (0, status_1.registerStatusCommand)(program);
31
+ (0, plan_1.registerPlanCommand)(program);
32
+ // 解析命令行参数
33
+ program.parseAsync(process.argv).catch((err) => {
34
+ console.error(JSON.stringify({
35
+ status: 'error',
36
+ message: err.message || '未知错误',
37
+ }, null, 2));
38
+ process.exit(1);
39
+ });
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAEH,yCAAoC;AACpC,yCAA6D;AAC7D,8CAA0D;AAC1D,8CAA0D;AAC1D,0CAAsD;AAEtD,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAE/C,QAAQ;AACR,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,kCAAkC,CAAC;KAC/C,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC;KAC7C,MAAM,CAAC,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,CAAC;KACpE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;KAC/C,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACjC,iBAAiB;IACjB,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,IAAA,wBAAe,EAAC,IAAI,CAAC,MAAsB,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS;AACT,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,IAAA,8BAAqB,EAAC,OAAO,CAAC,CAAC;AAC/B,IAAA,0BAAmB,EAAC,OAAO,CAAC,CAAC;AAE7B,UAAU;AACV,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QAC3B,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM;KAC/B,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * API 客户端模块
3
+ * 负责向远程服务器发送带 token 鉴权的 HTTP 请求
4
+ * 每个业务命令直接调用对应的 RESTful API 接口
5
+ */
6
+ import { AxiosInstance } from 'axios';
7
+ export interface ApiResponse<T = any> {
8
+ success: boolean;
9
+ data?: T;
10
+ message?: string;
11
+ code?: number;
12
+ }
13
+ export interface RequestOptions {
14
+ /** 指定环境(不指定使用当前环境) */
15
+ env?: string;
16
+ /** 请求超时时间(毫秒) */
17
+ timeout?: number;
18
+ /** 额外请求头 */
19
+ headers?: Record<string, string>;
20
+ }
21
+ /**
22
+ * 创建带鉴权的 API 客户端
23
+ */
24
+ export declare function createClient(options?: RequestOptions): AxiosInstance;
25
+ export declare function get<T = any>(url: string, params?: Record<string, any>, options?: RequestOptions): Promise<ApiResponse<T>>;
26
+ /**
27
+ * 发送 POST 请求
28
+ */
29
+ export declare function post<T = any>(url: string, data?: any, options?: RequestOptions): Promise<ApiResponse<T>>;
30
+ /**
31
+ * 发送 PUT 请求
32
+ */
33
+ export declare function put<T = any>(url: string, data?: any, options?: RequestOptions): Promise<ApiResponse<T>>;
34
+ /**
35
+ * 发送 DELETE 请求
36
+ */
37
+ export declare function del<T = any>(url: string, options?: RequestOptions): Promise<ApiResponse<T>>;
38
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAc,EAAE,aAAa,EAA6C,MAAM,OAAO,CAAC;AAGxF,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,sBAAsB;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CA4CpE;AACD,wBAAsB,GAAG,CAAC,CAAC,GAAG,GAAG,EAC/B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAIzB;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,CAAC,GAAG,GAAG,EAChC,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EACV,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAIzB;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,CAAC,GAAG,GAAG,EAC/B,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,GAAG,EACV,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAIzB;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,CAAC,GAAG,GAAG,EAC/B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAIzB"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * API 客户端模块
4
+ * 负责向远程服务器发送带 token 鉴权的 HTTP 请求
5
+ * 每个业务命令直接调用对应的 RESTful API 接口
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.createClient = createClient;
12
+ exports.get = get;
13
+ exports.post = post;
14
+ exports.put = put;
15
+ exports.del = del;
16
+ const axios_1 = __importDefault(require("axios"));
17
+ const config_1 = require("./config");
18
+ /**
19
+ * 创建带鉴权的 API 客户端
20
+ */
21
+ function createClient(options) {
22
+ const token = (0, config_1.getToken)(options?.env);
23
+ const instance = axios_1.default.create({
24
+ baseURL: config_1.API_BASE,
25
+ timeout: options?.timeout || 30000,
26
+ headers: {
27
+ 'Content-Type': 'application/json',
28
+ ...(token ? { Authorization: `Bearer ${token}` } : {}),
29
+ ...(options?.headers || {}),
30
+ },
31
+ });
32
+ // 请求拦截器:添加通用信息
33
+ instance.interceptors.request.use((reqConfig) => {
34
+ // 可以在这里添加请求 ID、时间戳等
35
+ return reqConfig;
36
+ });
37
+ // 响应拦截器:统一错误处理
38
+ instance.interceptors.response.use((response) => response, (error) => {
39
+ if (error.response) {
40
+ const { status, data } = error.response;
41
+ if (status === 401) {
42
+ throw new Error('认证失败:Token 无效或已过期,请使用 `hd-cli config set` 重新设置 token');
43
+ }
44
+ if (status === 403) {
45
+ throw new Error('权限不足:当前 token 没有执行该操作的权限');
46
+ }
47
+ throw new Error(data?.message || `请求失败 (HTTP ${status})`);
48
+ }
49
+ if (error.code === 'ECONNREFUSED') {
50
+ throw new Error('连接被拒绝:无法连接到 API 服务器,请检查网络');
51
+ }
52
+ if (error.code === 'ETIMEDOUT') {
53
+ throw new Error('请求超时:API 服务器响应超时');
54
+ }
55
+ throw error;
56
+ });
57
+ return instance;
58
+ }
59
+ async function get(url, params, options) {
60
+ const client = createClient(options);
61
+ const response = await client.get(url, { params });
62
+ return response.data;
63
+ }
64
+ /**
65
+ * 发送 POST 请求
66
+ */
67
+ async function post(url, data, options) {
68
+ const client = createClient(options);
69
+ const response = await client.post(url, data);
70
+ return response.data;
71
+ }
72
+ /**
73
+ * 发送 PUT 请求
74
+ */
75
+ async function put(url, data, options) {
76
+ const client = createClient(options);
77
+ const response = await client.put(url, data);
78
+ return response.data;
79
+ }
80
+ /**
81
+ * 发送 DELETE 请求
82
+ */
83
+ async function del(url, options) {
84
+ const client = createClient(options);
85
+ const response = await client.delete(url);
86
+ return response.data;
87
+ }
88
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * 配置管理模块
3
+ * 管理不同环境的 token 配置
4
+ * 配置文件存储在用户主目录下的 .hd-cli/config.json
5
+ */
6
+ export declare const API_BASE = "https://api.bigdata.houdutech.cn";
7
+ /** 单个环境的配置 */
8
+ export interface EnvConfig {
9
+ /** 环境名称 */
10
+ name: string;
11
+ /** API Token */
12
+ token: string;
13
+ /** 创建时间 */
14
+ createdAt: string;
15
+ /** 最后更新时间 */
16
+ updatedAt: string;
17
+ }
18
+ /** 全局配置结构 */
19
+ export interface GlobalConfig {
20
+ /** 当前激活的环境 */
21
+ currentEnv: string;
22
+ /** 所有环境配置 */
23
+ envs: Record<string, EnvConfig>;
24
+ }
25
+ /**
26
+ * 读取配置文件
27
+ */
28
+ export declare function loadConfig(): GlobalConfig;
29
+ /**
30
+ * 保存配置文件(原子写入,防止损坏)
31
+ */
32
+ export declare function saveConfig(config: GlobalConfig): void;
33
+ /**
34
+ * 设置指定环境的 token
35
+ */
36
+ export declare function setToken(envName: string, token: string): void;
37
+ /**
38
+ * 获取指定环境的 token(不指定则返回当前环境的)
39
+ */
40
+ export declare function getToken(envName?: string): string | null;
41
+ /**
42
+ * 获取指定环境的完整配置
43
+ */
44
+ export declare function getEnvConfig(envName?: string): EnvConfig | null;
45
+ /**
46
+ * 切换当前环境
47
+ */
48
+ export declare function switchEnv(envName: string): boolean;
49
+ /**
50
+ * 删除指定环境配置
51
+ */
52
+ export declare function removeEnv(envName: string): boolean;
53
+ /**
54
+ * 列出所有环境
55
+ */
56
+ export declare function listEnvs(): {
57
+ envs: EnvConfig[];
58
+ currentEnv: string;
59
+ };
60
+ /**
61
+ * 获取配置文件路径
62
+ */
63
+ export declare function getConfigPath(): string;
64
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,eAAO,MAAM,QAAQ,qCAAqC,CAAC;AAE3D,cAAc;AACd,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,aAAa;AACb,MAAM,WAAW,YAAY;IAC3B,cAAc;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACjC;AAiBD;;GAEG;AACH,wBAAgB,UAAU,IAAI,YAAY,CA0BzC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAKrD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAsB7D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAI/D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQlD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAalD;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI;IAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAMpE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ /**
3
+ * 配置管理模块
4
+ * 管理不同环境的 token 配置
5
+ * 配置文件存储在用户主目录下的 .hd-cli/config.json
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.API_BASE = void 0;
42
+ exports.loadConfig = loadConfig;
43
+ exports.saveConfig = saveConfig;
44
+ exports.setToken = setToken;
45
+ exports.getToken = getToken;
46
+ exports.getEnvConfig = getEnvConfig;
47
+ exports.switchEnv = switchEnv;
48
+ exports.removeEnv = removeEnv;
49
+ exports.listEnvs = listEnvs;
50
+ exports.getConfigPath = getConfigPath;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const os = __importStar(require("os"));
54
+ // 配置文件目录
55
+ const CONFIG_DIR = path.join(os.homedir(), '.hd-cli');
56
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
57
+ // 内置 API 基础地址(不需要用户配置)
58
+ exports.API_BASE = 'https://api.bigdata.houdutech.cn';
59
+ /** 默认配置 */
60
+ const DEFAULT_CONFIG = {
61
+ currentEnv: 'default',
62
+ envs: {},
63
+ };
64
+ /**
65
+ * 确保配置目录存在
66
+ */
67
+ function ensureConfigDir() {
68
+ if (!fs.existsSync(CONFIG_DIR)) {
69
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
70
+ }
71
+ }
72
+ /**
73
+ * 读取配置文件
74
+ */
75
+ function loadConfig() {
76
+ ensureConfigDir();
77
+ if (!fs.existsSync(CONFIG_FILE)) {
78
+ return { ...DEFAULT_CONFIG };
79
+ }
80
+ try {
81
+ const raw = fs.readFileSync(CONFIG_FILE, 'utf-8');
82
+ const parsed = JSON.parse(raw);
83
+ // 兼容旧版格式(tenants/currentTenant → envs/currentEnv)
84
+ if (parsed.tenants && !parsed.envs) {
85
+ parsed.envs = parsed.tenants;
86
+ parsed.currentEnv = parsed.currentTenant || 'default';
87
+ delete parsed.tenants;
88
+ delete parsed.currentTenant;
89
+ }
90
+ // 兼容更老的格式(environments/currentEnv → envs/currentEnv)
91
+ if (parsed.environments && !parsed.envs) {
92
+ parsed.envs = parsed.environments;
93
+ parsed.currentEnv = parsed.currentEnv || 'default';
94
+ delete parsed.environments;
95
+ delete parsed.defaultApiBase;
96
+ }
97
+ return parsed;
98
+ }
99
+ catch {
100
+ return { ...DEFAULT_CONFIG };
101
+ }
102
+ }
103
+ /**
104
+ * 保存配置文件(原子写入,防止损坏)
105
+ */
106
+ function saveConfig(config) {
107
+ ensureConfigDir();
108
+ const tmpFile = CONFIG_FILE + '.tmp';
109
+ fs.writeFileSync(tmpFile, JSON.stringify(config, null, 2), 'utf-8');
110
+ fs.renameSync(tmpFile, CONFIG_FILE);
111
+ }
112
+ /**
113
+ * 设置指定环境的 token
114
+ */
115
+ function setToken(envName, token) {
116
+ const config = loadConfig();
117
+ const now = new Date().toISOString();
118
+ if (config.envs[envName]) {
119
+ config.envs[envName].token = token;
120
+ config.envs[envName].updatedAt = now;
121
+ }
122
+ else {
123
+ config.envs[envName] = {
124
+ name: envName,
125
+ token,
126
+ createdAt: now,
127
+ updatedAt: now,
128
+ };
129
+ }
130
+ // 如果是第一个环境,自动设为当前环境
131
+ if (Object.keys(config.envs).length === 1) {
132
+ config.currentEnv = envName;
133
+ }
134
+ saveConfig(config);
135
+ }
136
+ /**
137
+ * 获取指定环境的 token(不指定则返回当前环境的)
138
+ */
139
+ function getToken(envName) {
140
+ const config = loadConfig();
141
+ const env = envName || config.currentEnv;
142
+ return config.envs[env]?.token || null;
143
+ }
144
+ /**
145
+ * 获取指定环境的完整配置
146
+ */
147
+ function getEnvConfig(envName) {
148
+ const config = loadConfig();
149
+ const env = envName || config.currentEnv;
150
+ return config.envs[env] || null;
151
+ }
152
+ /**
153
+ * 切换当前环境
154
+ */
155
+ function switchEnv(envName) {
156
+ const config = loadConfig();
157
+ if (!config.envs[envName]) {
158
+ return false;
159
+ }
160
+ config.currentEnv = envName;
161
+ saveConfig(config);
162
+ return true;
163
+ }
164
+ /**
165
+ * 删除指定环境配置
166
+ */
167
+ function removeEnv(envName) {
168
+ const config = loadConfig();
169
+ if (!config.envs[envName]) {
170
+ return false;
171
+ }
172
+ delete config.envs[envName];
173
+ // 如果删除的是当前环境,切换到第一个可用的
174
+ if (config.currentEnv === envName) {
175
+ const envNames = Object.keys(config.envs);
176
+ config.currentEnv = envNames.length > 0 ? envNames[0] : 'default';
177
+ }
178
+ saveConfig(config);
179
+ return true;
180
+ }
181
+ /**
182
+ * 列出所有环境
183
+ */
184
+ function listEnvs() {
185
+ const config = loadConfig();
186
+ return {
187
+ envs: Object.values(config.envs),
188
+ currentEnv: config.currentEnv,
189
+ };
190
+ }
191
+ /**
192
+ * 获取配置文件路径
193
+ */
194
+ function getConfigPath() {
195
+ return CONFIG_FILE;
196
+ }
197
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 输出格式化模块
3
+ * 支持 JSON 和 table 格式输出
4
+ * 默认输出 JSON,方便 AI Agent 解析
5
+ */
6
+ export type OutputFormat = 'json' | 'table' | 'text';
7
+ /** 标准化的 CLI 输出结构 */
8
+ export interface CliOutput<T = any> {
9
+ status: 'success' | 'error';
10
+ message?: string;
11
+ data?: T;
12
+ [key: string]: any;
13
+ }
14
+ /**
15
+ * 设置全局输出格式
16
+ */
17
+ export declare function setOutputFormat(format: OutputFormat): void;
18
+ /**
19
+ * 获取当前输出格式
20
+ */
21
+ export declare function getOutputFormat(): OutputFormat;
22
+ /**
23
+ * 输出成功结果
24
+ */
25
+ export declare function outputSuccess<T = any>(data: T, message?: string): void;
26
+ /**
27
+ * 输出错误结果
28
+ */
29
+ export declare function outputError(message: string, code?: number): void;
30
+ /**
31
+ * 输出原始 JSON(用于 API 返回的结构化数据直接输出)
32
+ */
33
+ export declare function outputRaw(data: any): void;
34
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAErD,oBAAoB;AACpB,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,GAAG;IAChC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAKD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,CAE9C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAmCtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAchE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAiBzC"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * 输出格式化模块
4
+ * 支持 JSON 和 table 格式输出
5
+ * 默认输出 JSON,方便 AI Agent 解析
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.setOutputFormat = setOutputFormat;
12
+ exports.getOutputFormat = getOutputFormat;
13
+ exports.outputSuccess = outputSuccess;
14
+ exports.outputError = outputError;
15
+ exports.outputRaw = outputRaw;
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ /** 全局输出格式(由主入口设置) */
18
+ let globalFormat = 'json';
19
+ /**
20
+ * 设置全局输出格式
21
+ */
22
+ function setOutputFormat(format) {
23
+ globalFormat = format;
24
+ }
25
+ /**
26
+ * 获取当前输出格式
27
+ */
28
+ function getOutputFormat() {
29
+ return globalFormat;
30
+ }
31
+ /**
32
+ * 输出成功结果
33
+ */
34
+ function outputSuccess(data, message) {
35
+ const result = {
36
+ status: 'success',
37
+ ...(message ? { message } : {}),
38
+ ...(data !== undefined && data !== null ? { data } : {}),
39
+ };
40
+ if (globalFormat === 'json') {
41
+ console.log(JSON.stringify(result, null, 2));
42
+ }
43
+ else if (globalFormat === 'table') {
44
+ if (message) {
45
+ console.log(chalk_1.default.green('✓ ') + message);
46
+ }
47
+ if (data && typeof data === 'object') {
48
+ if (Array.isArray(data)) {
49
+ console.table(data);
50
+ }
51
+ else {
52
+ const entries = Object.entries(data);
53
+ entries.forEach(([key, value]) => {
54
+ if (Array.isArray(value)) {
55
+ console.log(` ${chalk_1.default.cyan(key)}:`);
56
+ console.table(value);
57
+ }
58
+ else if (typeof value === 'object' && value !== null) {
59
+ console.log(` ${chalk_1.default.cyan(key)}: ${JSON.stringify(value)}`);
60
+ }
61
+ else {
62
+ console.log(` ${chalk_1.default.cyan(key)}: ${value}`);
63
+ }
64
+ });
65
+ }
66
+ }
67
+ }
68
+ else {
69
+ // text 格式
70
+ if (message)
71
+ console.log(message);
72
+ if (data)
73
+ console.log(typeof data === 'string' ? data : JSON.stringify(data));
74
+ }
75
+ }
76
+ /**
77
+ * 输出错误结果
78
+ */
79
+ function outputError(message, code) {
80
+ const result = {
81
+ status: 'error',
82
+ message,
83
+ ...(code ? { code } : {}),
84
+ };
85
+ if (globalFormat === 'json') {
86
+ console.error(JSON.stringify(result, null, 2));
87
+ }
88
+ else {
89
+ console.error(chalk_1.default.red('✗ ') + message);
90
+ }
91
+ process.exit(1);
92
+ }
93
+ /**
94
+ * 输出原始 JSON(用于 API 返回的结构化数据直接输出)
95
+ */
96
+ function outputRaw(data) {
97
+ if (globalFormat === 'json') {
98
+ console.log(JSON.stringify(data, null, 2));
99
+ }
100
+ else if (globalFormat === 'table') {
101
+ if (Array.isArray(data)) {
102
+ console.table(data);
103
+ }
104
+ else if (typeof data === 'object') {
105
+ const entries = Object.entries(data);
106
+ entries.forEach(([key, value]) => {
107
+ console.log(` ${chalk_1.default.cyan(key)}: ${typeof value === 'object' ? JSON.stringify(value) : value}`);
108
+ });
109
+ }
110
+ else {
111
+ console.log(data);
112
+ }
113
+ }
114
+ else {
115
+ console.log(typeof data === 'string' ? data : JSON.stringify(data, null, 2));
116
+ }
117
+ }
118
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "hdk-cli",
3
+ "version": "1.0.0",
4
+ "description": "厚度科技 CLI 工具 - 命令行操作与 AI Agent 集成",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "hdk": "./bin/hdk.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "bundle": "esbuild src/index.ts --bundle --platform=node --outfile=dist/bundle.js --external:chalk",
13
+ "dev": "ts-node src/index.ts",
14
+ "start": "node dist/index.js",
15
+ "package": "npm run build && node scripts/package.js",
16
+ "package:win": "npm run build && node scripts/package.js --platform win",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "pkg": {
20
+ "assets": [
21
+ "dist/**/*"
22
+ ],
23
+ "outputPath": "release"
24
+ },
25
+ "keywords": [
26
+ "houdu",
27
+ "cli",
28
+ "data-platform"
29
+ ],
30
+ "author": "houdu",
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "axios": "^1.7.0",
34
+ "chalk": "^4.1.2",
35
+ "commander": "^12.1.0",
36
+ "conf": "^10.2.0",
37
+ "inquirer": "^8.2.6",
38
+ "ora": "^5.4.1"
39
+ },
40
+ "devDependencies": {
41
+ "@types/inquirer": "^9.0.7",
42
+ "@types/node": "^20.14.0",
43
+ "@yao-pkg/pkg": "^5.12.0",
44
+ "archiver": "^8.0.0",
45
+ "esbuild": "^0.21.0",
46
+ "ts-node": "^10.9.2",
47
+ "typescript": "^5.5.0"
48
+ },
49
+ "engines": {
50
+ "node": ">=16.0.0"
51
+ },
52
+ "files": [
53
+ "dist",
54
+ "bin"
55
+ ]
56
+ }