ability-cli 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +5 -5
  2. package/dist/index.js +81 -25
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -79,7 +79,7 @@ ability-cli doctor
79
79
 
80
80
  | 选项 | 说明 |
81
81
  |------|------|
82
- | `--env <env>` | 环境:`test` / `prod`,选用配置文件中哪一套 `profiles`(主要影响 `baseUrl`) |
82
+ | `--env <env>` | 环境:`test` / `stg` / `prod`,选用配置文件中哪一套 `profiles`(主要影响 `baseUrl`) |
83
83
  | `--auth-token <token>` | 授权密钥 `sk-…`,写入请求头 `Authorization` |
84
84
  | `--base-url <url>` | 网关根地址(真实路径为 `{baseUrl}/ability-service/api/agent/v1/...`) |
85
85
  | `--device-id <id>` | 设备 ID,写入请求头 `zy-device-id`,并参与部分接口 query |
@@ -213,7 +213,7 @@ GET `/ability-service/api/agent/v1/ability/category`。
213
213
 
214
214
  #### `doctor`
215
215
 
216
- 检查配置文件路径、当前环境、解析后的 **`Authorization(sk)`** / **`zy-device-id`** / **`baseUrl`**,并请求 `{baseUrl}/time` 做网关连通性探测。
216
+ 检查配置文件路径、当前环境、解析后的 **`Authorization(sk)`** / **`zy-device-id`** / **`baseUrl`**。
217
217
 
218
218
  ---
219
219
 
@@ -223,7 +223,7 @@ GET `/ability-service/api/agent/v1/ability/category`。
223
223
 
224
224
  默认路径:**`~/.ability-cli/config.json`**。
225
225
 
226
- 首次运行若文件不存在,会使用内置默认:当前环境 **`prod`**,`test` / `prod` 各有一套 `baseUrl`;`profiles.*.authToken`(sk)、`defaults.deviceId` 等为空字符串。
226
+ 首次运行若文件不存在,会使用内置默认:当前环境 **`prod`**,`test` / `stg` / `prod` 各有一套 `baseUrl`;`profiles.*.authToken`(sk)、`defaults.deviceId` 等为空字符串。
227
227
 
228
228
  通过 `ability-cli config set` 写入后,会按 `env` 更新对应 `profiles[env]` 下的 `baseUrl`、`authToken`(sk)等;`defaults` 下可保存默认设备 ID 等。
229
229
 
@@ -231,7 +231,7 @@ GET `/ability-service/api/agent/v1/ability/category`。
231
231
 
232
232
  | 变量 | 作用 |
233
233
  |------|------|
234
- | `ABILITY_CLI_ENV` | 选用 `profiles` 的环境键(如 `test` / `prod`) |
234
+ | `ABILITY_CLI_ENV` | 选用 `profiles` 的环境键(如 `test` / `stg` / `prod`) |
235
235
  | `ABILITY_CLI_AUTH_TOKEN` | 授权密钥 `sk-…`,对应请求头 `Authorization` |
236
236
  | `ABILITY_CLI_DEVICE_ID` | 设备 ID,对应请求头 `zy-device-id`,并参与部分 query |
237
237
  | `ABILITY_CLI_BASE_URL` | 网关根地址 |
@@ -242,7 +242,7 @@ GET `/ability-service/api/agent/v1/ability/category`。
242
242
 
243
243
  对 **`authToken` / `deviceId` / `baseUrl`**:**子命令参数 > 全局参数 > 对应环境变量 > 配置文件**(子命令与全局选项先做对象合并,后者覆盖前者)。
244
244
 
245
- 当前激活的 **profile(test prod)** 由 **`ABILITY_CLI_ENV`(若设置)** 与配置文件中的 **`env`** 字段共同决定(环境变量优先)。
245
+ 当前激活的 **profile(test / stg / prod)** 由 **`ABILITY_CLI_ENV`(若设置)** 与配置文件中的 **`env`** 字段共同决定(环境变量优先)。
246
246
 
247
247
  ---
248
248
 
package/dist/index.js CHANGED
@@ -17,6 +17,10 @@ var DEFAULT_CONFIG = {
17
17
  baseUrl: "https://biz-gw.zyqltest.com",
18
18
  authToken: ""
19
19
  },
20
+ stg: {
21
+ baseUrl: "https://biz-gw-in.zyql.com",
22
+ authToken: ""
23
+ },
20
24
  prod: {
21
25
  baseUrl: "https://biz-gw.zyql.com",
22
26
  authToken: ""
@@ -34,7 +38,33 @@ function loadConfig(configPath) {
34
38
  const p = configPath ?? getDefaultConfigPath();
35
39
  if (!fs.existsSync(p)) return structuredClone(DEFAULT_CONFIG);
36
40
  const raw = fs.readFileSync(p, "utf-8");
37
- return { ...structuredClone(DEFAULT_CONFIG), ...JSON.parse(raw) };
41
+ const parsed = JSON.parse(raw);
42
+ const defaults = parsed.defaults ?? {};
43
+ const profiles = parsed.profiles ?? {};
44
+ const mergedProfiles = {
45
+ ...structuredClone(DEFAULT_CONFIG).profiles
46
+ };
47
+ for (const [name, profile] of Object.entries(profiles)) {
48
+ const prev = mergedProfiles[name] ?? { baseUrl: "", authToken: "" };
49
+ const incoming = profile ?? {};
50
+ const normalized = { ...incoming };
51
+ if (typeof incoming.baseUrl === "undefined" || incoming.baseUrl.trim() === "") {
52
+ normalized.baseUrl = prev.baseUrl;
53
+ }
54
+ mergedProfiles[name] = {
55
+ ...prev,
56
+ ...normalized
57
+ };
58
+ }
59
+ return {
60
+ ...structuredClone(DEFAULT_CONFIG),
61
+ ...parsed,
62
+ defaults: {
63
+ ...structuredClone(DEFAULT_CONFIG).defaults,
64
+ ...defaults
65
+ },
66
+ profiles: mergedProfiles
67
+ };
38
68
  }
39
69
  function saveConfig(configPath, config) {
40
70
  const dir = path.dirname(configPath);
@@ -135,7 +165,7 @@ function mergeConfigSetOpts(program2, opts) {
135
165
  }
136
166
  function registerConfigCommand(program2) {
137
167
  const cfg = program2.command("config").description("\u7BA1\u7406 CLI \u914D\u7F6E");
138
- cfg.command("set").description("\u8BBE\u7F6E\u914D\u7F6E\u9879").option("--env <env>", "\u73AF\u5883 (test/prod)").option("--auth-token <token>", "Authorization token\uFF08sk\uFF09").option("--base-url <url>", "\u7F51\u5173\u5730\u5740").option("--device-id <id>", "\u9ED8\u8BA4\u8BBE\u5907ID").option("--timeout <ms>", "\u9ED8\u8BA4\u8C03\u7528\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09\uFF0C\u5199\u5165 defaults.timeout").action((opts) => {
168
+ cfg.command("set").description("\u8BBE\u7F6E\u914D\u7F6E\u9879").option("--env <env>", "\u73AF\u5883 (test/stg/prod)").option("--auth-token <token>", "Authorization token\uFF08sk\uFF09").option("--base-url <url>", "\u7F51\u5173\u5730\u5740").option("--device-id <id>", "\u9ED8\u8BA4\u8BBE\u5907ID").option("--timeout <ms>", "\u9ED8\u8BA4\u8C03\u7528\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09\uFF0C\u5199\u5165 defaults.timeout").action((opts) => {
139
169
  const m = mergeConfigSetOpts(program2, opts);
140
170
  const configPath = getDefaultConfigPath();
141
171
  const config = loadConfig(configPath);
@@ -278,13 +308,19 @@ function registerRawCommand(program2) {
278
308
  const res = await apiGet(ctx, agentPath.abilityList, params);
279
309
  handleApiResponse(res, opts.json, (data) => printAbilityTable(data));
280
310
  });
281
- raw.command("app-info").description("GET \u5E94\u7528\u4FE1\u606F").requiredOption("--package-name <pkg>", "\u5E94\u7528\u5305\u540D").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
311
+ raw.command("app-info").description("GET \u5E94\u7528\u4FE1\u606F").addHelpText(
312
+ "after",
313
+ "\n\u63D0\u793A\uFF1A\u9009\u9879\u8BF4\u660E\u4E2D\u4EE5\u300C\u3010\u5FC5\u586B\u3011\u300D\u5F00\u5934\u7684\u5FC5\u987B\u63D0\u4F9B\uFF0C\u5176\u4F59\u5747\u4E3A\u53EF\u9009\u3002\n"
314
+ ).requiredOption("--package-name <pkg>", "\u3010\u5FC5\u586B\u3011\u5E94\u7528\u5305\u540D").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
282
315
  const merged = { ...program2.opts(), ...opts };
283
316
  const ctx = buildAgentRequestContext(merged);
284
317
  const res = await apiGet(ctx, agentPath.appInfo, { packageName: opts.packageName });
285
318
  handleApiResponse(res, opts.json, (data) => printJson(data));
286
319
  });
287
- raw.command("ability-info").description("GET \u80FD\u529B\u8BE6\u60C5").requiredOption("--ability-id <id>", "\u80FD\u529BID").option("--device-id <id>", "\u8BBE\u5907 ID\uFF1B\u7AEF\u4FA7\u80FD\u529B\u5EFA\u8BAE\u586B\u5199").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
320
+ raw.command("ability-info").description("GET \u80FD\u529B\u8BE6\u60C5").addHelpText(
321
+ "after",
322
+ "\n\u63D0\u793A\uFF1A\u9009\u9879\u8BF4\u660E\u4E2D\u4EE5\u300C\u3010\u5FC5\u586B\u3011\u300D\u5F00\u5934\u7684\u5FC5\u987B\u63D0\u4F9B\uFF0C\u5176\u4F59\u5747\u4E3A\u53EF\u9009\u3002\n"
323
+ ).requiredOption("--ability-id <id>", "\u3010\u5FC5\u586B\u3011\u80FD\u529B ID").option("--device-id <id>", "\u8BBE\u5907 ID\uFF1B\u7AEF\u4FA7\u80FD\u529B\u5EFA\u8BAE\u586B\u5199").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
288
324
  const merged = { ...program2.opts(), ...opts };
289
325
  const ctx = buildAgentRequestContext(merged);
290
326
  const params = { abilityId: opts.abilityId };
@@ -292,7 +328,10 @@ function registerRawCommand(program2) {
292
328
  const res = await apiGet(ctx, agentPath.abilityInfo, params);
293
329
  handleApiResponse(res, opts.json, (data) => printJson(data));
294
330
  });
295
- raw.command("call").description("POST \u6267\u884C\u80FD\u529B\uFF08Agent API\uFF09").requiredOption("--file <path>", "\u8BF7\u6C42\u4F53 JSON \u6587\u4EF6\u8DEF\u5F84").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
331
+ raw.command("call").description("POST \u6267\u884C\u80FD\u529B\uFF08Agent API\uFF09").addHelpText(
332
+ "after",
333
+ "\n\u63D0\u793A\uFF1A\u9009\u9879\u8BF4\u660E\u4E2D\u4EE5\u300C\u3010\u5FC5\u586B\u3011\u300D\u5F00\u5934\u7684\u5FC5\u987B\u63D0\u4F9B\uFF0C\u5176\u4F59\u5747\u4E3A\u53EF\u9009\u3002\n"
334
+ ).requiredOption("--file <path>", "\u3010\u5FC5\u586B\u3011\u8BF7\u6C42\u4F53 JSON \u6587\u4EF6\u8DEF\u5F84").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
296
335
  const merged = { ...program2.opts(), ...opts };
297
336
  const ctx = buildAgentRequestContext(merged);
298
337
  const data = JSON.parse(fs2.readFileSync(opts.file, "utf-8"));
@@ -358,7 +397,10 @@ function generateTemplate(schema) {
358
397
  return result;
359
398
  }
360
399
  function registerInspectCommand(program2) {
361
- program2.command("inspect").description("\u67E5\u770B\u80FD\u529B\u8BE6\u60C5\u4E0E inputSchema").requiredOption("--ability-id <id>", "\u80FD\u529BID").option("--device-id <id>", "\u8BBE\u5907 ID\uFF1B\u7AEF\u4FA7\u80FD\u529B\u5EFA\u8BAE\u586B\u5199").option("--gen-template", "\u751F\u6210\u53C2\u6570\u6A21\u677F JSON").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
400
+ program2.command("inspect").description("\u67E5\u770B\u80FD\u529B\u8BE6\u60C5\u4E0E inputSchema").addHelpText(
401
+ "after",
402
+ "\n\u63D0\u793A\uFF1A\u9009\u9879\u8BF4\u660E\u4E2D\u4EE5\u300C\u3010\u5FC5\u586B\u3011\u300D\u5F00\u5934\u7684\u5FC5\u987B\u63D0\u4F9B\uFF0C\u5176\u4F59\u5747\u4E3A\u53EF\u9009\u3002\n"
403
+ ).requiredOption("--ability-id <id>", "\u3010\u5FC5\u586B\u3011\u80FD\u529B ID").option("--device-id <id>", "\u8BBE\u5907 ID\uFF1B\u7AEF\u4FA7\u80FD\u529B\u5EFA\u8BAE\u586B\u5199").option("--gen-template", "\u751F\u6210\u53C2\u6570\u6A21\u677F JSON").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
362
404
  const merged = { ...program2.opts(), ...opts };
363
405
  const ctx = buildAgentRequestContext(merged);
364
406
  const params = { abilityId: opts.abilityId };
@@ -377,8 +419,33 @@ function registerInspectCommand(program2) {
377
419
  // src/commands/exec.ts
378
420
  import { randomUUID } from "crypto";
379
421
  import fs3 from "fs";
422
+
423
+ // src/parse-cli-json.ts
424
+ function parseCliJsonString(raw, label) {
425
+ const s = raw.replace(/^\uFEFF/, "").trim();
426
+ if (!s) return {};
427
+ try {
428
+ return JSON.parse(s);
429
+ } catch (e) {
430
+ const msg = e instanceof Error ? e.message : String(e);
431
+ let hint = "";
432
+ if (/^\s*\{\s*'/.test(s)) {
433
+ hint = " JSON \u952E\u540D\u987B\u7528\u82F1\u6587\u53CC\u5F15\u53F7\uFF1B\u5F53\u524D\u5185\u5BB9\u5728 { \u540E\u51FA\u73B0\u4E86\u5355\u5F15\u53F7\u3002\u6700\u7A33\u59A5\uFF1A\u5C06 JSON \u5B58\u4E3A params.json\uFF08UTF-8\uFF09\uFF0C\u518D\u4F7F\u7528 --params params.json\u3002";
434
+ } else if (/[\u201c\u201d\u2018\u2019]/.test(s)) {
435
+ hint = ' \u68C0\u6D4B\u5230\u5F2F\u5F15\u53F7\uFF08\u201C \u201D \u2018 \u2019\uFF09\u3002\u8BF7\u6539\u4E3A ASCII \u53CC\u5F15\u53F7 " \u3002';
436
+ }
437
+ const preview = s.length > 160 ? `${s.slice(0, 160)}\u2026` : s;
438
+ throw new Error(`${label} \u89E3\u6790\u5931\u8D25\uFF1A${msg}.${hint}
439
+ \u5B9E\u9645\u6536\u5230\u7684\u5F00\u5934\uFF1A${JSON.stringify(preview.slice(0, 80))}`);
440
+ }
441
+ }
442
+
443
+ // src/commands/exec.ts
380
444
  function registerExecCommand(program2) {
381
- program2.command("exec").description("\u6267\u884C\u80FD\u529B").requiredOption("--ability-id <id>", "\u80FD\u529BID").option("--params <json>", "\u53C2\u6570 JSON \u5B57\u7B26\u4E32\u6216\u6587\u4EF6\u8DEF\u5F84").option("--device-id <id>", "\u8BBE\u5907ID").option("--message-id <id>", "messageId").option("--trace-id <id>", "traceId").option("--timeout <ms>", "\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09\uFF1B\u4E0D\u4F20\u5219\u7528\u914D\u7F6E\u6587\u4EF6 defaults.timeout\uFF0C\u9ED8\u8BA4 30000").option("--response-type <type>", "\u8FD4\u56DE\u503C\u5904\u7406\u65B9\u5F0F: NONE | MCP | CONVERT").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
445
+ program2.command("exec").description("\u6267\u884C\u80FD\u529B").addHelpText(
446
+ "after",
447
+ "\n\u63D0\u793A\uFF1A\u9009\u9879\u8BF4\u660E\u4E2D\u4EE5\u300C\u3010\u5FC5\u586B\u3011\u300D\u5F00\u5934\u7684\u5FC5\u987B\u63D0\u4F9B\uFF0C\u5176\u4F59\u5747\u4E3A\u53EF\u9009\u3002\n"
448
+ ).requiredOption("--ability-id <id>", "\u3010\u5FC5\u586B\u3011\u80FD\u529B ID").option("--params <json>", "\u53C2\u6570 JSON \u5B57\u7B26\u4E32\u6216\u6587\u4EF6\u8DEF\u5F84").option("--device-id <id>", "\u8BBE\u5907ID").option("--message-id <id>", "messageId").option("--trace-id <id>", "traceId").option("--timeout <ms>", "\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09\uFF1B\u4E0D\u4F20\u5219\u7528\u914D\u7F6E\u6587\u4EF6 defaults.timeout\uFF0C\u9ED8\u8BA4 30000").option("--response-type <type>", "\u8FD4\u56DE\u503C\u5904\u7406\u65B9\u5F0F: NONE | MCP | CONVERT").option("--json", "JSON \u8F93\u51FA").action(async (opts) => {
382
449
  const merged = { ...program2.opts(), ...opts };
383
450
  const ctx = buildAgentRequestContext(merged);
384
451
  const cliCfg = loadConfig();
@@ -386,9 +453,10 @@ function registerExecCommand(program2) {
386
453
  let params = {};
387
454
  if (opts.params) {
388
455
  if (fs3.existsSync(opts.params)) {
389
- params = JSON.parse(fs3.readFileSync(opts.params, "utf-8"));
456
+ const text = fs3.readFileSync(opts.params, "utf-8");
457
+ params = parseCliJsonString(text, "\u53C2\u6570\u6587\u4EF6");
390
458
  } else {
391
- params = JSON.parse(opts.params);
459
+ params = parseCliJsonString(opts.params, "--params");
392
460
  }
393
461
  }
394
462
  const body = {
@@ -455,16 +523,17 @@ function registerSignCommand(program2) {
455
523
  // src/commands/doctor.ts
456
524
  import chalk3 from "chalk";
457
525
  function registerDoctorCommand(program2) {
458
- program2.command("doctor").description("\u68C0\u67E5\u914D\u7F6E\u5B8C\u6574\u6027\u548C\u7F51\u5173\u8FDE\u901A\u6027").action(async () => {
526
+ program2.command("doctor").description("\u68C0\u67E5\u914D\u7F6E\u5B8C\u6574\u6027").action(async () => {
459
527
  const merged = program2.opts();
460
528
  const ctx = buildAgentRequestContext(merged);
461
529
  let ok = true;
462
530
  console.log(chalk3.bold.cyan("\n\u2500\u2500 CLI \u5065\u5EB7\u68C0\u67E5 \u2500\u2500\n"));
463
531
  const configPath = getDefaultConfigPath();
464
532
  const config = loadConfig();
533
+ const effectiveEnv = process.env.ABILITY_CLI_ENV ?? merged.env ?? config.env;
465
534
  const checks = [
466
535
  ["\u914D\u7F6E\u6587\u4EF6", configPath, true],
467
- ["\u5F53\u524D\u73AF\u5883", config.env, true],
536
+ ["\u5F53\u524D\u73AF\u5883", effectiveEnv, true],
468
537
  ["baseUrl", ctx.baseUrl || "(\u7A7A)", !!ctx.baseUrl],
469
538
  ["Authorization(sk)", ctx.authToken ? "******" : "(\u7A7A)", !!ctx.authToken],
470
539
  ["zy-device-id", ctx.deviceId || "(\u7A7A)", !!ctx.deviceId]
@@ -474,19 +543,6 @@ function registerDoctorCommand(program2) {
474
543
  console.log(` ${icon} ${chalk3.gray(label + ":")} ${val}`);
475
544
  if (!pass) ok = false;
476
545
  }
477
- try {
478
- const res = await fetch(`${ctx.baseUrl}/time`);
479
- const body = await res.json();
480
- if (body.code === 200) {
481
- console.log(` ${chalk3.green("\u2714")} ${chalk3.gray("\u7F51\u5173\u8FDE\u901A(/time):")} ${body.data}`);
482
- } else {
483
- console.log(` ${chalk3.red("\u2716")} ${chalk3.gray("\u7F51\u5173\u8FDE\u901A(/time):")} \u8FD4\u56DE code=${body.code}`);
484
- ok = false;
485
- }
486
- } catch (e) {
487
- console.log(` ${chalk3.red("\u2716")} ${chalk3.gray("\u7F51\u5173\u8FDE\u901A(/time):")} ${e.message}`);
488
- ok = false;
489
- }
490
546
  console.log();
491
547
  if (ok) {
492
548
  console.log(chalk3.green(" \u4E00\u5207\u6B63\u5E38\uFF0C\u53EF\u4EE5\u5F00\u59CB\u4F7F\u7528\uFF01"));
@@ -504,7 +560,7 @@ function readPackageVersion() {
504
560
  const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
505
561
  return pkg.version ?? "0.0.0";
506
562
  }
507
- program.name("ability-cli").description("\u539F\u5B50\u80FD\u529B\u5E73\u53F0 CLI \u5DE5\u5177").version(readPackageVersion()).option("--env <env>", "\u73AF\u5883 (test/prod)\uFF0C\u9009\u62E9 profiles \u4E2D\u54EA\u5957 baseUrl").option("--auth-token <token>", "Authorization\uFF08sk-\u2026\uFF09\uFF0C\u8986\u76D6\u73AF\u5883\u53D8\u91CF\u4E0E\u914D\u7F6E").option("--base-url <url>", "\u7F51\u5173\u6839\u5730\u5740\uFF0C\u8986\u76D6\u73AF\u5883\u53D8\u91CF\u4E0E\u914D\u7F6E").option("--device-id <id>", "\u8BBE\u5907 ID\uFF08zy-device-id \u8BF7\u6C42\u5934 / \u90E8\u5206 query\uFF09\uFF0C\u8986\u76D6\u73AF\u5883\u53D8\u91CF\u4E0E\u914D\u7F6E").option("-v, --verbose", "\u8BE6\u7EC6\u8F93\u51FA");
563
+ program.name("ability-cli").description("\u539F\u5B50\u80FD\u529B\u5E73\u53F0 CLI \u5DE5\u5177").version(readPackageVersion()).option("--env <env>", "\u73AF\u5883 (test/stg/prod)\uFF0C\u9009\u62E9 profiles \u4E2D\u54EA\u5957 baseUrl").option("--auth-token <token>", "Authorization\uFF08sk-\u2026\uFF09\uFF0C\u8986\u76D6\u73AF\u5883\u53D8\u91CF\u4E0E\u914D\u7F6E").option("--base-url <url>", "\u7F51\u5173\u6839\u5730\u5740\uFF0C\u8986\u76D6\u73AF\u5883\u53D8\u91CF\u4E0E\u914D\u7F6E").option("--device-id <id>", "\u8BBE\u5907 ID\uFF08zy-device-id \u8BF7\u6C42\u5934 / \u90E8\u5206 query\uFF09\uFF0C\u8986\u76D6\u73AF\u5883\u53D8\u91CF\u4E0E\u914D\u7F6E").option("-v, --verbose", "\u8BE6\u7EC6\u8F93\u51FA");
508
564
  registerConfigCommand(program);
509
565
  registerRawCommand(program);
510
566
  registerSearchCommand(program);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ability-cli",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "原子能力平台 CLI 工具",
5
5
  "repository": {
6
6
  "type": "git",