yingmi-skill-cli 0.0.6 → 0.0.8

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 +11 -4
  2. package/bin/index.js +227 -104
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -52,6 +52,8 @@ yingmi-skill-cli mcp list
52
52
  yingmi-skill-cli mcp schema <toolName>
53
53
  yingmi-skill-cli mcp call <toolName> --input <json>
54
54
 
55
+ yingmi-skill-cli remote-skill scope set --skills <skill1,skill2,...>
56
+ yingmi-skill-cli remote-skill scope clear
55
57
  yingmi-skill-cli remote-skill list
56
58
  yingmi-skill-cli remote-skill enter <skillName>
57
59
  yingmi-skill-cli remote-skill exec --script <script>
@@ -113,6 +115,8 @@ yingmi-skill-cli mcp call getFundCampisiIndicator --input '{"fundCode":"000001",
113
115
  常用命令:
114
116
 
115
117
  ```bash
118
+ yingmi-skill-cli remote-skill scope set --skills fund-analyzer,market-brief
119
+ yingmi-skill-cli remote-skill scope clear
116
120
  yingmi-skill-cli remote-skill list
117
121
  yingmi-skill-cli remote-skill enter fund-analyzer
118
122
  yingmi-skill-cli remote-skill exec --script 'cat SKILL.md'
@@ -122,11 +126,14 @@ yingmi-skill-cli remote-skill exec --script-file ./scripts/run.sh
122
126
 
123
127
  行为约束:
124
128
 
129
+ - `scope set --skills <a,b,c>`:设置本地 scope 白名单,限制 `remote-skill` 默认可见的 skill 范围
130
+ - `scope clear`:清除本地 scope,恢复默认行为
125
131
  - `list`:调用远端 `/api/get-skills` 接口,使用本地 `apiKey` 作为请求头
126
- - `enter <skillName>`:每次都会重新调用远端 `/api/get-skill-by-name` 获取压缩包地址,下载并解压到 `~/.yingmi-skill-cli/skills/<skillName>` 后输出目录树,并把当前 skill 上下文写入本地配置
132
+ - `list` 在配置了 scope 且与远端列表存在交集时,只返回交集;如果 scope 未配置或交集为空,则返回远端全量,避免返回空数组
133
+ - `enter <skillName>`:会先基于当前可见 skill 列表做校验;通过后再调用远端 `/api/get-skill-by-name` 获取压缩包地址,下载并解压到 `~/.yingmi-skill-cli/skills/<skillName>` 后输出目录树,并把当前 skill 上下文写入本地配置
127
134
  - `exec --script/--script-file`:只能在最近一次成功 `enter` 后使用,建议先执行 `cat SKILL.md` 理解 skill 约定,再在当前 skill 目录执行入口脚本;执行结果输出状态、退出码、stdout 和 stderr,不额外回传本地工作目录路径
128
135
  - `remote-skill` 适合基金分析、组合诊断、财富规划、市场简报等场景任务;skill 内部可以继续调用多个 `mcp`
129
- - 远端服务地址默认读取 `https://stargate-staging.yingmi-inc.com/`,也可在 `~/.yingmi-skill-cli/config.json` 里手工设置 `remoteSkillServerBaseUrl`
136
+ - 远端服务地址默认读取 `https://stargate-staging.yingmi-inc.com/`,也可在 `~/.yingmi-skill-cli/config.json` 里手工设置 `stargateBaseUrl`
130
137
 
131
138
  ### `help`
132
139
 
@@ -159,7 +166,7 @@ yingmi-skill-cli upgrade --check-only
159
166
 
160
167
  约束:
161
168
 
162
- - `--check-only` 只检查版本,不执行安装
169
+ - `--check-only` 只检查版本,不执行安装;发现新版本时会在 stderr 输出可直接复制的 `npm install -g` 安装命令,并使用阿里云镜像
163
170
  - 真正执行升级前,应明确告知副作用
164
171
  - 非 TTY 场景下不能依赖确认交互
165
172
 
@@ -180,7 +187,7 @@ yingmi-skill-cli upgrade --check-only
180
187
  1. 先执行 `yingmi-skill-cli init setup`,让 CLI 进入可用状态。
181
188
  2. 如果要直接调用单个原子能力,先用 `yingmi-skill-cli mcp list` 浏览可用工具。
182
189
  3. 对于 `mcp`,继续用 `yingmi-skill-cli mcp schema <toolName>` 查看完整定义,再用 `yingmi-skill-cli mcp call <toolName>` 发起调用。
183
- 4. 如果要完成基金分析、组合诊断、财富规划等场景任务,先用 `yingmi-skill-cli remote-skill list` 发现 skill,再用 `yingmi-skill-cli remote-skill enter <skillName>` 进入上下文,随后优先执行 `yingmi-skill-cli remote-skill exec --script 'cat SKILL.md'` 阅读说明,再按 skill 约定执行脚本。
190
+ 4. 如果要完成基金分析、组合诊断、财富规划等场景任务,可先用 `yingmi-skill-cli remote-skill scope set --skills <a,b,c>` 收敛默认 skill 范围,再用 `yingmi-skill-cli remote-skill list` 发现 skill,随后执行 `yingmi-skill-cli remote-skill enter <skillName>` 进入上下文,优先执行 `yingmi-skill-cli remote-skill exec --script 'cat SKILL.md'` 阅读说明,再按 skill 约定执行脚本。
184
191
  5. 需要查看帮助或升级时,分别使用 `help` 和 `upgrade`。
185
192
 
186
193
  ## 当前代码组织
package/bin/index.js CHANGED
@@ -10,8 +10,8 @@ var axios = require('axios');
10
10
  var crypto = require('crypto');
11
11
  var child_process = require('child_process');
12
12
 
13
- var name = "yingmi-cli";
14
- var version = "0.0.6";
13
+ var name = "yingmi-skill-cli";
14
+ var version = "0.0.8";
15
15
 
16
16
  function fail(message) {
17
17
  console.error(message);
@@ -52,15 +52,15 @@ function registerHelpCommand(program) {
52
52
  \u67E5\u770B\u6839\u547D\u4EE4\u3001\u6A21\u5757\u547D\u4EE4\u6216\u6307\u5B9A\u5B50\u547D\u4EE4\u7684\u5E2E\u52A9\u4FE1\u606F\u3002
53
53
 
54
54
  \u793A\u4F8B:
55
- yingmi-cli help
56
- yingmi-cli help init
57
- yingmi-cli help mcp
58
- yingmi-cli help mcp call
59
- yingmi-cli help remote-skill exec
55
+ yingmi-skill-cli help
56
+ yingmi-skill-cli help init
57
+ yingmi-skill-cli help mcp
58
+ yingmi-skill-cli help mcp call
59
+ yingmi-skill-cli help remote-skill exec
60
60
 
61
61
  \u8BF4\u660E:
62
62
  - help \u548C --help \u5171\u4EAB\u540C\u4E00\u5957\u547D\u4EE4\u5143\u6570\u636E
63
- - \u4E0D\u786E\u5B9A\u8BE5\u770B\u54EA\u4E2A\u6A21\u5757\u65F6\uFF0C\u5148\u6267\u884C yingmi-cli help
63
+ - \u4E0D\u786E\u5B9A\u8BE5\u770B\u54EA\u4E2A\u6A21\u5757\u65F6\uFF0C\u5148\u6267\u884C yingmi-skill-cli help
64
64
  - \u4E0D\u786E\u5B9A\u8BE5\u7528 mcp \u8FD8\u662F remote-skill \u65F6\uFF0C\u5148\u770B\u5B83\u662F\u5728\u8C03\u7528\u5355\u4E2A\u80FD\u529B\uFF0C\u8FD8\u662F\u5728\u5B8C\u6210\u91D1\u878D\u573A\u666F\u4EFB\u52A1
65
65
  - \u5DF2\u77E5\u76EE\u6807\u6A21\u5757\u65F6\uFF0C\u4F18\u5148\u67E5\u770B\u66F4\u5177\u4F53\u7684\u5B50\u547D\u4EE4\u5E2E\u52A9
66
66
  `
@@ -81,7 +81,7 @@ ${prefix}
81
81
  });
82
82
  }
83
83
 
84
- const CONFIG_DIR = path.join(os.homedir(), ".yingmi-cli");
84
+ const CONFIG_DIR = path.join(os.homedir(), ".yingmi-skill-cli");
85
85
  const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
86
86
  const SKILLS_DIR = path.join(CONFIG_DIR, "skills");
87
87
  const DEFAULT_QIEMAN_BASE_URL = "https://qieman.com";
@@ -100,7 +100,7 @@ function readConfig() {
100
100
  }
101
101
  const parsed = JSON.parse(content);
102
102
  if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
103
- throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u975E\u6CD5\uFF0C\u8BF7\u68C0\u67E5 ~/.yingmi-cli/config.json");
103
+ throw new Error("\u914D\u7F6E\u6587\u4EF6\u683C\u5F0F\u975E\u6CD5\uFF0C\u8BF7\u68C0\u67E5 ~/.yingmi-skill-cli/config.json");
104
104
  }
105
105
  return parsed;
106
106
  }
@@ -143,6 +143,23 @@ function setCurrentRemoteSkillSession(session) {
143
143
  };
144
144
  writeConfig(nextConfig);
145
145
  }
146
+ function getRemoteSkillScope() {
147
+ return readConfig().remoteSkillScope;
148
+ }
149
+ function setRemoteSkillScope(scope) {
150
+ const nextConfig = {
151
+ ...readConfig(),
152
+ remoteSkillScope: scope
153
+ };
154
+ writeConfig(nextConfig);
155
+ }
156
+ function clearRemoteSkillScope() {
157
+ const nextConfig = {
158
+ ...readConfig()
159
+ };
160
+ delete nextConfig.remoteSkillScope;
161
+ writeConfig(nextConfig);
162
+ }
146
163
  function maskSecret(value) {
147
164
  if (!value) {
148
165
  return "(\u672A\u8BBE\u7F6E)";
@@ -247,7 +264,7 @@ function runInitDoctorChecks() {
247
264
  name: "api-key",
248
265
  status: "warning",
249
266
  message: "\u5C1A\u672A\u914D\u7F6E apiKey",
250
- nextStep: "\u6267\u884C yingmi-cli init setup --api-key <your-api-key> \u6216\u9A8C\u8BC1\u7801\u521D\u59CB\u5316\u6D41\u7A0B"
267
+ nextStep: "\u6267\u884C yingmi-skill-cli init setup --api-key <your-api-key> \u6216\u9A8C\u8BC1\u7801\u521D\u59CB\u5316\u6D41\u7A0B"
251
268
  }
252
269
  );
253
270
  if (status.hasPendingSession && status.pendingPhone) {
@@ -255,7 +272,7 @@ function runInitDoctorChecks() {
255
272
  name: "pending-session",
256
273
  status: "warning",
257
274
  message: `\u5B58\u5728\u5F85\u5B8C\u6210\u7684\u9A8C\u8BC1\u7801\u767B\u5F55\u4E0A\u4E0B\u6587: ${status.pendingPhone}`,
258
- nextStep: "\u6267\u884C yingmi-cli init setup --verify-code <\u9A8C\u8BC1\u7801> \u5B8C\u6210\u521D\u59CB\u5316"
275
+ nextStep: "\u6267\u884C yingmi-skill-cli init setup --verify-code <\u9A8C\u8BC1\u7801> \u5B8C\u6210\u521D\u59CB\u5316"
259
276
  });
260
277
  } else {
261
278
  checks.push({
@@ -269,7 +286,7 @@ function runInitDoctorChecks() {
269
286
  name: "config-read",
270
287
  status: "warning",
271
288
  message: `\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25: ${getErrorMessage(error)}`,
272
- nextStep: "\u68C0\u67E5 ~/.yingmi-cli/config.json \u683C\u5F0F\uFF0C\u5FC5\u8981\u65F6\u4FEE\u590D\u540E\u91CD\u8BD5"
289
+ nextStep: "\u68C0\u67E5 ~/.yingmi-skill-cli/config.json \u683C\u5F0F\uFF0C\u5FC5\u8981\u65F6\u4FEE\u590D\u540E\u91CD\u8BD5"
273
290
  });
274
291
  }
275
292
  return {
@@ -287,9 +304,9 @@ function getPendingSetupResult() {
287
304
  configFile: getConfigFilePath(),
288
305
  availableActions: ["--api-key <value>", "--phone <value>", "--verify-code <value>"],
289
306
  nextSteps: [
290
- "yingmi-cli init setup --api-key <your-api-key>",
291
- "yingmi-cli init setup --phone <your-phone>",
292
- "yingmi-cli init setup --verify-code <\u9A8C\u8BC1\u7801>"
307
+ "yingmi-skill-cli init setup --api-key <your-api-key>",
308
+ "yingmi-skill-cli init setup --phone <your-phone>",
309
+ "yingmi-skill-cli init setup --verify-code <\u9A8C\u8BC1\u7801>"
293
310
  ]
294
311
  };
295
312
  }
@@ -339,7 +356,7 @@ const API_KEY_APPLICATION_PAYLOAD = {
339
356
  function createRequestId() {
340
357
  const hexTimestamp = Date.now().toString(16).toUpperCase();
341
358
  const randomSuffix = crypto.randomBytes(8).toString("hex").toUpperCase();
342
- return `yingmi-cli.${hexTimestamp}${randomSuffix}`;
359
+ return `yingmi-skill-cli.${hexTimestamp}${randomSuffix}`;
343
360
  }
344
361
  function getHeaders(xSign, accessToken) {
345
362
  return {
@@ -379,7 +396,7 @@ async function prepareSmsSetup(phone) {
379
396
  configFile: getConfigFilePath(),
380
397
  pendingPhone: maskPhone(phone),
381
398
  cooldownSeconds: response.data.nextInSec ?? null,
382
- nextStep: "yingmi-cli init setup --verify-code <\u9A8C\u8BC1\u7801>"
399
+ nextStep: "yingmi-skill-cli init setup --verify-code <\u9A8C\u8BC1\u7801>"
383
400
  };
384
401
  }
385
402
 
@@ -409,10 +426,14 @@ async function confirmSmsSetup(verifyCode) {
409
426
  validateVerifyCode(verifyCode);
410
427
  const session = getApiKeyApplySession();
411
428
  if (!session) {
412
- throw new Error("\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u767B\u5F55\u4E0A\u4E0B\u6587\uFF0C\u8BF7\u5148\u6267\u884C: yingmi-cli init setup --phone <\u624B\u673A\u53F7>");
429
+ throw new Error(
430
+ "\u672A\u627E\u5230\u9A8C\u8BC1\u7801\u767B\u5F55\u4E0A\u4E0B\u6587\uFF0C\u8BF7\u5148\u6267\u884C: yingmi-skill-cli init setup --phone <\u624B\u673A\u53F7>"
431
+ );
413
432
  }
414
433
  if (!session.accessToken && !session.prepareToken) {
415
- throw new Error("\u7533\u8BF7\u4E0A\u4E0B\u6587\u7F3A\u5C11\u767B\u5F55 token\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C: yingmi-cli init setup --phone <\u624B\u673A\u53F7>");
434
+ throw new Error(
435
+ "\u7533\u8BF7\u4E0A\u4E0B\u6587\u7F3A\u5C11\u767B\u5F55 token\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C: yingmi-skill-cli init setup --phone <\u624B\u673A\u53F7>"
436
+ );
416
437
  }
417
438
  try {
418
439
  const qiemanPmdjBaseUrl = getQiemanPmdjBaseUrl();
@@ -483,7 +504,7 @@ async function confirmSmsSetup(verifyCode) {
483
504
  await refreshSessionXSignOnInvalidVerifyCode(session);
484
505
  } catch (refreshError) {
485
506
  throw new Error(
486
- `\u9A8C\u8BC1\u7801\u6821\u9A8C\u5931\u8D25\uFF0C\u5237\u65B0 x-sign \u4E5F\u5931\u8D25\u4E86: ${getErrorMessage(refreshError)}\u3002\u8BF7\u91CD\u65B0\u6267\u884C: yingmi-cli init setup --phone <\u624B\u673A\u53F7>`
507
+ `\u9A8C\u8BC1\u7801\u6821\u9A8C\u5931\u8D25\uFF0C\u5237\u65B0 x-sign \u4E5F\u5931\u8D25\u4E86: ${getErrorMessage(refreshError)}\u3002\u8BF7\u91CD\u65B0\u6267\u884C: yingmi-skill-cli init setup --phone <\u624B\u673A\u53F7>`
487
508
  );
488
509
  }
489
510
  }
@@ -541,7 +562,7 @@ function registerDoctorCommand(initCommand) {
541
562
  \u8BCA\u65AD\u672C\u5730\u914D\u7F6E\u3001\u8FD0\u884C\u73AF\u5883\u548C\u521D\u59CB\u5316\u72B6\u6001\uFF0C\u5E2E\u52A9\u5B9A\u4F4D\u4E0D\u53EF\u7528\u539F\u56E0\u3002
542
563
 
543
564
  \u793A\u4F8B:
544
- yingmi-cli init doctor
565
+ yingmi-skill-cli init doctor
545
566
 
546
567
  \u8BF4\u660E:
547
568
  - \u9002\u5408\u5728 init status \u8F93\u51FA\u5F02\u5E38\u65F6\u4F7F\u7528
@@ -562,10 +583,10 @@ function registerSetupCommand(initCommand) {
562
583
  3. \u5EFA\u8BAE\u4F18\u5148\u4F7F\u7528\u957F\u53C2\u6570\u540D\uFF0C\u4FBF\u4E8E\u811A\u672C\u548C Agent \u8C03\u7528
563
584
 
564
585
  \u793A\u4F8B:
565
- yingmi-cli init setup
566
- yingmi-cli init setup --api-key <value>
567
- yingmi-cli init setup --phone <\u624B\u673A\u53F7>
568
- yingmi-cli init setup --verify-code <\u9A8C\u8BC1\u7801>
586
+ yingmi-skill-cli init setup
587
+ yingmi-skill-cli init setup --api-key <value>
588
+ yingmi-skill-cli init setup --phone <\u624B\u673A\u53F7>
589
+ yingmi-skill-cli init setup --verify-code <\u9A8C\u8BC1\u7801>
569
590
  `
570
591
  ).action(async (options) => {
571
592
  try {
@@ -585,11 +606,11 @@ function registerStatusCommand(initCommand) {
585
606
  \u8F93\u51FA\u5F53\u524D\u521D\u59CB\u5316\u72B6\u6001\u6458\u8981\uFF0C\u4FBF\u4E8E\u786E\u8BA4 CLI \u662F\u5426\u5DF2\u53EF\u7528\u3002
586
607
 
587
608
  \u793A\u4F8B:
588
- yingmi-cli init status
609
+ yingmi-skill-cli init status
589
610
 
590
611
  \u4E0B\u4E00\u6B65:
591
- 1. \u5982\u679C\u5C1A\u672A\u5B8C\u6210\u521D\u59CB\u5316\uFF0C\u6267\u884C yingmi-cli init setup
592
- 2. \u5982\u679C\u72B6\u6001\u5F02\u5E38\uFF0C\u6267\u884C yingmi-cli init doctor
612
+ 1. \u5982\u679C\u5C1A\u672A\u5B8C\u6210\u521D\u59CB\u5316\uFF0C\u6267\u884C yingmi-skill-cli init setup
613
+ 2. \u5982\u679C\u72B6\u6001\u5F02\u5E38\uFF0C\u6267\u884C yingmi-skill-cli init doctor
593
614
  `
594
615
  ).action(() => {
595
616
  console.log(JSON.stringify(getInitStatusSummary(), null, 2));
@@ -604,9 +625,9 @@ function registerInitCommand(program) {
604
625
  \u8BA9 CLI \u8FDB\u5165\u53EF\u7528\u72B6\u6001\uFF0C\u5E76\u68C0\u67E5\u5F53\u524D\u672C\u5730\u914D\u7F6E\u548C\u8FD0\u884C\u73AF\u5883\u3002
605
626
 
606
627
  \u63A8\u8350\u987A\u5E8F:
607
- 1. yingmi-cli init setup
608
- 2. yingmi-cli init status
609
- 3. \u9047\u5230\u95EE\u9898\u65F6\u6267\u884C yingmi-cli init doctor
628
+ 1. yingmi-skill-cli init setup
629
+ 2. yingmi-skill-cli init status
630
+ 3. \u9047\u5230\u95EE\u9898\u65F6\u6267\u884C yingmi-skill-cli init doctor
610
631
 
611
632
  \u8BF4\u660E:
612
633
  - setup \u7528\u4E8E\u9996\u6B21\u521D\u59CB\u5316\u6216\u8865\u5168 API Key
@@ -652,7 +673,9 @@ function readJsonInput(input, inputFile) {
652
673
  function requireApiKey() {
653
674
  const { apiKey } = readConfig();
654
675
  if (!apiKey) {
655
- fail("\u672A\u5B8C\u6210\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u6267\u884C: yingmi-cli init setup --phone <\u624B\u673A\u53F7> \u5B8C\u6210\u624B\u673A\u53F7\u9A8C\u8BC1\u7801\u521D\u59CB\u5316");
676
+ fail(
677
+ "\u672A\u5B8C\u6210\u521D\u59CB\u5316\uFF0C\u8BF7\u5148\u6267\u884C: yingmi-skill-cli init setup --phone <\u624B\u673A\u53F7> \u5B8C\u6210\u624B\u673A\u53F7\u9A8C\u8BC1\u7801\u521D\u59CB\u5316"
678
+ );
656
679
  }
657
680
  return apiKey;
658
681
  }
@@ -902,15 +925,15 @@ function registerCallCommand(mcpCommand) {
902
925
  "after",
903
926
  `
904
927
  \u8F93\u5165\u89C4\u5219:
905
- 1. \u5148\u6267\u884C yingmi-cli mcp schema <toolName> \u786E\u8BA4\u5B57\u6BB5\u540D\u548C requestBody
928
+ 1. \u5148\u6267\u884C yingmi-skill-cli mcp schema <toolName> \u786E\u8BA4\u5B57\u6BB5\u540D\u548C requestBody
906
929
  2. path/query/header \u53C2\u6570\u53EF\u76F4\u63A5\u653E\u5728 JSON \u9876\u5C42\uFF0C\u4E5F\u53EF\u5206\u522B\u653E\u8FDB path/query/header
907
930
  3. body \u53EF\u663E\u5F0F\u653E\u5728 body \u5B57\u6BB5\uFF1B\u5982\u679C\u5DE5\u5177\u53EA\u6709 requestBody \u4E14\u6CA1\u6709\u5176\u5B83\u53C2\u6570\uFF0C\u4E5F\u53EF\u76F4\u63A5\u4F20 body \u5BF9\u8C61
908
931
  4. mcp call \u9002\u5408\u5355\u6B21\u539F\u5B50\u80FD\u529B\u8C03\u7528\uFF0C\u4E0D\u9002\u5408\u76F4\u63A5\u627F\u8F7D\u5B8C\u6574\u91D1\u878D\u573A\u666F\u5DE5\u4F5C\u6D41
909
932
 
910
933
  \u793A\u4F8B:
911
- yingmi-cli mcp call GetCurrentTime
912
- yingmi-cli mcp call GuessFundCode --input '{"fundNameOrCode":"\u6613\u65B9\u8FBE\u84DD\u7B79\u7CBE\u9009"}'
913
- yingmi-cli mcp call <toolName> --input '{"query":{"pageNum":1},"body":{"keyword":"\u65B0\u80FD\u6E90"}}'
934
+ yingmi-skill-cli mcp call GetCurrentTime
935
+ yingmi-skill-cli mcp call GuessFundCode --input '{"fundNameOrCode":"\u6613\u65B9\u8FBE\u84DD\u7B79\u7CBE\u9009"}'
936
+ yingmi-skill-cli mcp call <toolName> --input '{"query":{"pageNum":1},"body":{"keyword":"\u65B0\u80FD\u6E90"}}'
914
937
  `
915
938
  ).action(async (toolName, options) => {
916
939
  const apiKey = requireApiKey();
@@ -972,8 +995,8 @@ function registerListCommand(mcpCommand) {
972
995
 
973
996
  \u4E0B\u4E00\u6B65:
974
997
  1. \u4ECE\u8F93\u51FA\u91CC\u6311\u4E00\u4E2A toolName
975
- 2. \u6267\u884C yingmi-cli mcp schema <toolName> \u67E5\u770B\u53C2\u6570\u548C\u54CD\u5E94\u7ED3\u6784
976
- 3. \u5982\u679C\u76EE\u6807\u5176\u5B9E\u662F\u57FA\u91D1\u5206\u6790\u3001\u7EC4\u5408\u8BCA\u65AD\u6216\u8D22\u5BCC\u89C4\u5212\u7B49\u5B8C\u6574\u573A\u666F\uFF0C\u6539\u770B yingmi-cli remote-skill list
998
+ 2. \u6267\u884C yingmi-skill-cli mcp schema <toolName> \u67E5\u770B\u53C2\u6570\u548C\u54CD\u5E94\u7ED3\u6784
999
+ 3. \u5982\u679C\u76EE\u6807\u5176\u5B9E\u662F\u57FA\u91D1\u5206\u6790\u3001\u7EC4\u5408\u8BCA\u65AD\u6216\u8D22\u5BCC\u89C4\u5212\u7B49\u5B8C\u6574\u573A\u666F\uFF0C\u6539\u770B yingmi-skill-cli remote-skill list
977
1000
  `
978
1001
  ).action(async () => {
979
1002
  const apiKey = requireApiKey();
@@ -1003,11 +1026,11 @@ function registerSchemaCommand(mcpCommand) {
1003
1026
  0. schema \u9002\u5408\u5728\u4F60\u5DF2\u7ECF\u786E\u5B9A\u8981\u8C03\u7528\u67D0\u4E2A\u539F\u5B50\u80FD\u529B\u65F6\u4F7F\u7528
1004
1027
  1. \u5148\u770B parameters\uFF0C\u786E\u8BA4 path/query/header \u7684\u5B57\u6BB5\u540D
1005
1028
  2. \u518D\u770B requestBody\uFF0C\u786E\u8BA4 body \u662F\u5426\u5FC5\u586B
1006
- 3. \u6700\u540E\u6267\u884C yingmi-cli mcp call <toolName> --input '<json>'
1029
+ 3. \u6700\u540E\u6267\u884C yingmi-skill-cli mcp call <toolName> --input '<json>'
1007
1030
 
1008
1031
  \u793A\u4F8B:
1009
- yingmi-cli mcp schema GetCurrentTime
1010
- yingmi-cli mcp schema GuessFundCode
1032
+ yingmi-skill-cli mcp schema GetCurrentTime
1033
+ yingmi-skill-cli mcp schema GuessFundCode
1011
1034
  `
1012
1035
  ).action(async (toolName) => {
1013
1036
  const apiKey = requireApiKey();
@@ -1043,9 +1066,9 @@ function registerMcpCommand(program) {
1043
1066
  \u6D4F\u89C8 MCP \u5DE5\u5177\u6458\u8981\uFF0C\u67E5\u770B\u5DE5\u5177 schema\uFF0C\u5E76\u53D1\u8D77\u5355\u6B21\u539F\u5B50\u80FD\u529B\u8C03\u7528\u3002
1044
1067
 
1045
1068
  \u63A8\u8350\u987A\u5E8F:
1046
- 1. yingmi-cli mcp list
1047
- 2. yingmi-cli mcp schema <toolName>
1048
- 3. yingmi-cli mcp call <toolName> --input '<json>'
1069
+ 1. yingmi-skill-cli mcp list
1070
+ 2. yingmi-skill-cli mcp schema <toolName>
1071
+ 3. yingmi-skill-cli mcp call <toolName> --input '<json>'
1049
1072
 
1050
1073
  \u8BF4\u660E:
1051
1074
  - mcp \u9002\u5408\u5DF2\u77E5\u8981\u8C03\u7528\u54EA\u4E2A\u80FD\u529B\u3001\u5E76\u4E14\u80FD\u660E\u786E\u6784\u9020 JSON \u8F93\u5165\u7684\u573A\u666F
@@ -1054,8 +1077,8 @@ function registerMcpCommand(program) {
1054
1077
  - \u5982\u679C\u76EE\u6807\u662F\u5B8C\u6210\u57FA\u91D1\u5206\u6790\u3001\u7EC4\u5408\u8BCA\u65AD\u6216\u8D22\u5BCC\u89C4\u5212\u7B49\u573A\u666F\u4EFB\u52A1\uFF0C\u4F18\u5148\u67E5\u770B remote-skill
1055
1078
 
1056
1079
  \u6700\u5C0F\u6210\u529F\u793A\u4F8B:
1057
- yingmi-cli mcp schema GetCurrentTime
1058
- yingmi-cli mcp call GetCurrentTime
1080
+ yingmi-skill-cli mcp schema GetCurrentTime
1081
+ yingmi-skill-cli mcp call GetCurrentTime
1059
1082
  `
1060
1083
  );
1061
1084
  registerListCommand(mcpCommand);
@@ -1204,6 +1227,29 @@ async function prepareRemoteSkillContext(skillName, apiKey) {
1204
1227
  };
1205
1228
  }
1206
1229
 
1230
+ function parseRemoteSkillScopeInput(input) {
1231
+ const normalizedSkills = (input ?? "").split(",").map((skillName) => skillName.trim()).filter(Boolean);
1232
+ const deduplicatedSkills = Array.from(new Set(normalizedSkills));
1233
+ deduplicatedSkills.forEach((skillName) => {
1234
+ validateRemoteSkillName(skillName);
1235
+ });
1236
+ if (deduplicatedSkills.length === 0) {
1237
+ throw new Error(
1238
+ "--skills \u53C2\u6570\u975E\u6CD5\uFF0C\u8BF7\u63D0\u4F9B\u9017\u53F7\u5206\u9694\u7684 skill \u540D\u79F0\uFF0C\u4F8B\u5982 --skills fund-analyzer,market-brief"
1239
+ );
1240
+ }
1241
+ return deduplicatedSkills;
1242
+ }
1243
+ function applyRemoteSkillScope(remoteSkills, configuredScope) {
1244
+ const scopeSkills = configuredScope?.skills ?? [];
1245
+ if (scopeSkills.length === 0) {
1246
+ return remoteSkills;
1247
+ }
1248
+ const visibleSkillNames = new Set(scopeSkills);
1249
+ const filteredSkills = remoteSkills.filter((skill) => visibleSkillNames.has(skill.name));
1250
+ return filteredSkills.length > 0 ? filteredSkills : remoteSkills;
1251
+ }
1252
+
1207
1253
  function formatWorkingDirectoryTree(rootDir) {
1208
1254
  const lines = ["."];
1209
1255
  const walk = (currentDir, prefix) => {
@@ -1244,6 +1290,10 @@ function readScriptInput(options) {
1244
1290
  throw new Error("\u8BFB\u53D6\u811A\u672C\u6587\u4EF6\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5\u8DEF\u5F84\u662F\u5426\u5B58\u5728\u4E14\u5F53\u524D\u7528\u6237\u6709\u8BFB\u53D6\u6743\u9650");
1245
1291
  }
1246
1292
  }
1293
+ async function resolveVisibleRemoteSkills(apiKey) {
1294
+ const remoteSkills = await fetchRemoteSkillSummaries(apiKey);
1295
+ return applyRemoteSkillScope(remoteSkills, getRemoteSkillScope());
1296
+ }
1247
1297
  function registerRemoteSkillCommand(program) {
1248
1298
  const remoteSkillCommand = program.command("remote-skill").description("\u67E5\u770B\u91D1\u878D\u573A\u666F skill\u3001\u8FDB\u5165\u4E0A\u4E0B\u6587\uFF0C\u5E76\u5728\u8BE5\u76EE\u5F55\u6267\u884C\u7EA6\u5B9A\u811A\u672C").addHelpText(
1249
1299
  "after",
@@ -1252,11 +1302,12 @@ function registerRemoteSkillCommand(program) {
1252
1302
  \u53D1\u73B0\u8FDC\u7AEF\u91D1\u878D\u573A\u666F skill\uFF0C\u8FDB\u5165\u67D0\u4E2A skill \u7684\u5DE5\u4F5C\u4E0A\u4E0B\u6587\uFF0C\u5E76\u6309 skill \u7EA6\u5B9A\u6267\u884C\u811A\u672C\u3002
1253
1303
 
1254
1304
  \u63A8\u8350\u987A\u5E8F:
1255
- 1. yingmi-cli remote-skill list
1256
- 2. yingmi-cli remote-skill enter <skillName>
1257
- 3. yingmi-cli remote-skill exec --script 'cat SKILL.md'
1258
- 4. \u6309 skill \u8BF4\u660E\u6267\u884C\u5B9E\u9645\u811A\u672C\uFF0C\u4F8B\u5982:
1259
- yingmi-cli remote-skill exec --script 'python main.py'
1305
+ 1. \u5982\u53EA\u60F3\u56F4\u7ED5\u56FA\u5B9A skill \u5DE5\u4F5C\uFF0C\u5148\u6267\u884C yingmi-skill-cli remote-skill scope set --skills <a,b,c>
1306
+ 2. yingmi-skill-cli remote-skill list
1307
+ 3. yingmi-skill-cli remote-skill enter <skillName>
1308
+ 4. yingmi-skill-cli remote-skill exec --script 'cat SKILL.md'
1309
+ 5. \u6309 skill \u8BF4\u660E\u6267\u884C\u5B9E\u9645\u811A\u672C\uFF0C\u4F8B\u5982:
1310
+ yingmi-skill-cli remote-skill exec --script 'python main.py'
1260
1311
 
1261
1312
  \u6CE8\u610F:
1262
1313
  - remote-skill \u7528\u4E8E\u5B8C\u6210\u57FA\u91D1\u5206\u6790\u3001\u7EC4\u5408\u8BCA\u65AD\u3001\u8D22\u5BCC\u89C4\u5212\u3001\u5E02\u573A\u7B80\u62A5\u7B49\u573A\u666F\u4EFB\u52A1
@@ -1265,18 +1316,87 @@ function registerRemoteSkillCommand(program) {
1265
1316
  - \u5EFA\u8BAE\u4F18\u5148\u9605\u8BFB skill \u5185\u7684 SKILL.md\uFF0C\u518D\u6267\u884C\u7EA6\u5B9A\u5165\u53E3
1266
1317
  `
1267
1318
  );
1268
- remoteSkillCommand.command("list").description("\u5C55\u793A\u5F53\u524D\u652F\u6301\u7684\u91D1\u878D\u573A\u666F skill \u6458\u8981").addHelpText(
1319
+ const scopeCommand = remoteSkillCommand.command("scope").description("\u8BBE\u7F6E\u6216\u6E05\u9664\u5F53\u524D remote-skill \u7684\u672C\u5730\u53EF\u89C1\u8303\u56F4").addHelpText(
1269
1320
  "after",
1270
1321
  `
1322
+ \u7528\u9014:
1323
+ \u901A\u8FC7\u672C\u5730 scope \u9650\u5236 remote-skill \u9ED8\u8BA4\u53EF\u89C1\u7684 skill \u8303\u56F4\u3002
1324
+
1325
+ \u793A\u4F8B:
1326
+ yingmi-skill-cli remote-skill scope set --skills fund-analyzer,market-brief
1327
+ yingmi-skill-cli remote-skill scope clear
1328
+ `
1329
+ );
1330
+ scopeCommand.command("set").description("\u8BBE\u7F6E\u5F53\u524D remote-skill \u7684\u672C\u5730 scope \u767D\u540D\u5355").requiredOption("--skills <skillNames>", "\u9017\u53F7\u5206\u9694\u7684 skill \u540D\u79F0\u5217\u8868").addHelpText(
1331
+ "after",
1332
+ `
1333
+ \u8BF4\u660E:
1334
+ - --skills \u4F7F\u7528\u9017\u53F7\u5206\u9694\u591A\u4E2A skill \u540D\u79F0
1335
+ - \u4F1A\u81EA\u52A8\u53BB\u91CD\u5E76\u6821\u9A8C skill \u540D\u79F0\u683C\u5F0F
1336
+ - scope \u4E0E\u8FDC\u7AEF\u5217\u8868\u65E0\u4EA4\u96C6\u65F6\uFF0Clist \u548C enter \u4F1A\u81EA\u52A8\u56DE\u9000\u5230\u8FDC\u7AEF\u5168\u91CF
1337
+
1338
+ \u793A\u4F8B:
1339
+ yingmi-skill-cli remote-skill scope set --skills fund-analyzer,market-brief
1340
+ `
1341
+ ).action((options) => {
1342
+ try {
1343
+ const skills = parseRemoteSkillScopeInput(options.skills);
1344
+ setRemoteSkillScope({
1345
+ skills,
1346
+ updatedAt: Date.now()
1347
+ });
1348
+ console.log(
1349
+ JSON.stringify(
1350
+ {
1351
+ enabled: true,
1352
+ skills
1353
+ },
1354
+ null,
1355
+ 2
1356
+ )
1357
+ );
1358
+ } catch (error) {
1359
+ fail(error.message);
1360
+ }
1361
+ });
1362
+ scopeCommand.command("clear").description("\u6E05\u9664\u5F53\u524D remote-skill \u7684\u672C\u5730 scope").addHelpText(
1363
+ "after",
1364
+ `
1365
+ \u8BF4\u660E:
1366
+ \u6E05\u9664\u540E\uFF0Cremote-skill list \u548C remote-skill enter \u4F1A\u6062\u590D\u4E3A\u9ED8\u8BA4\u884C\u4E3A\u3002
1367
+ `
1368
+ ).action(() => {
1369
+ try {
1370
+ clearRemoteSkillScope();
1371
+ console.log(
1372
+ JSON.stringify(
1373
+ {
1374
+ enabled: false
1375
+ },
1376
+ null,
1377
+ 2
1378
+ )
1379
+ );
1380
+ } catch (error) {
1381
+ fail(error.message);
1382
+ }
1383
+ });
1384
+ remoteSkillCommand.command("list").description("\u5C55\u793A\u5F53\u524D\u53EF\u7528\u7684\u91D1\u878D\u573A\u666F skill \u6458\u8981").addHelpText(
1385
+ "after",
1386
+ `
1387
+ \u8BF4\u660E:
1388
+ \u5982\u679C\u5DF2\u8BBE\u7F6E remote-skill scope\uFF0C\u4F18\u5148\u8FD4\u56DE scope \u5185\u4ECD\u7136\u53EF\u7528\u7684 skill\uFF1B
1389
+ \u5F53 scope \u4E0E\u8FDC\u7AEF\u5217\u8868\u6CA1\u6709\u4EA4\u96C6\u65F6\uFF0C\u4F1A\u81EA\u52A8\u56DE\u9000\u4E3A\u8FDC\u7AEF\u5168\u91CF\uFF0C\u907F\u514D\u8FD4\u56DE\u7A7A\u6570\u7EC4\u3002
1390
+
1271
1391
  \u4E0B\u4E00\u6B65:
1272
1392
  1. \u4ECE\u8F93\u51FA\u91CC\u6311\u4E00\u4E2A\u6700\u8D34\u8FD1\u5F53\u524D\u91D1\u878D\u573A\u666F\u4EFB\u52A1\u7684 skillName
1273
- 2. \u6267\u884C yingmi-cli remote-skill enter <skillName>
1274
- 3. \u518D\u6267\u884C yingmi-cli remote-skill exec --script 'cat SKILL.md'
1393
+ 2. \u6267\u884C yingmi-skill-cli remote-skill enter <skillName>
1394
+ 3. \u518D\u6267\u884C yingmi-skill-cli remote-skill exec --script 'cat SKILL.md'
1275
1395
  `
1276
1396
  ).action(async () => {
1277
1397
  try {
1278
1398
  const apiKey = requireApiKey();
1279
- const skills = await fetchRemoteSkillSummaries(apiKey);
1399
+ const skills = await resolveVisibleRemoteSkills(apiKey);
1280
1400
  console.log(JSON.stringify(skills, null, 2));
1281
1401
  } catch (error) {
1282
1402
  fail(error.message);
@@ -1290,18 +1410,24 @@ function registerRemoteSkillCommand(program) {
1290
1410
  \u8FDB\u5165 skill \u9002\u5408\u4F60\u5DF2\u7ECF\u786E\u5B9A\u8981\u5B8C\u6210\u67D0\u4E2A\u91D1\u878D\u573A\u666F\u4EFB\u52A1\uFF0C\u800C\u4E0D\u662F\u53EA\u8C03\u7528\u5355\u4E2A mcp\u3002
1291
1411
 
1292
1412
  \u793A\u4F8B:
1293
- yingmi-cli remote-skill enter fund-analyst
1413
+ yingmi-skill-cli remote-skill enter fund-analyst
1294
1414
 
1295
1415
  \u4E0B\u4E00\u6B65:
1296
- 1. yingmi-cli remote-skill exec --script 'cat SKILL.md'
1416
+ 1. yingmi-skill-cli remote-skill exec --script 'cat SKILL.md'
1297
1417
  2. \u6309 skill \u6587\u6863\u8BF4\u660E\u6267\u884C\u5165\u53E3\u811A\u672C
1298
1418
  `
1299
1419
  ).action(async (skillName) => {
1300
1420
  try {
1301
1421
  const apiKey = requireApiKey();
1302
- const context = await prepareRemoteSkillContext(skillName, apiKey);
1422
+ const normalizedSkillName = validateRemoteSkillName(skillName);
1423
+ const visibleSkills = await resolveVisibleRemoteSkills(apiKey);
1424
+ if (!visibleSkills.some((skill) => skill.name === normalizedSkillName)) {
1425
+ fail(`\u672A\u627E\u5230 skill: ${normalizedSkillName}
1426
+ \u8BF7\u5148\u6267\u884C remote-skill list \u67E5\u770B\u5F53\u524D\u53EF\u7528 skill`);
1427
+ }
1428
+ const context = await prepareRemoteSkillContext(normalizedSkillName, apiKey);
1303
1429
  setCurrentRemoteSkillSession({
1304
- skillName,
1430
+ skillName: normalizedSkillName,
1305
1431
  workingDirectory: context.workingDirectory
1306
1432
  });
1307
1433
  console.log(formatWorkingDirectoryTree(context.workingDirectory));
@@ -1319,9 +1445,9 @@ function registerRemoteSkillCommand(program) {
1319
1445
  4. \u5BF9\u4E8E Python skill\uFF0C\u4F18\u5148\u4F7F\u7528 python \u547D\u4EE4\u6267\u884C\u5165\u53E3\u811A\u672C
1320
1446
 
1321
1447
  \u793A\u4F8B:
1322
- yingmi-cli remote-skill exec --script 'cat SKILL.md'
1323
- yingmi-cli remote-skill exec --script 'python main.py'
1324
- yingmi-cli remote-skill exec --script-file ./scripts/run.sh
1448
+ yingmi-skill-cli remote-skill exec --script 'cat SKILL.md'
1449
+ yingmi-skill-cli remote-skill exec --script 'python main.py'
1450
+ yingmi-skill-cli remote-skill exec --script-file ./scripts/run.sh
1325
1451
  `
1326
1452
  ).action(async (options) => {
1327
1453
  try {
@@ -1358,10 +1484,10 @@ function registerRemoteSkillCommand(program) {
1358
1484
  });
1359
1485
  }
1360
1486
 
1361
- const REGISTRY_URL$1 = "https://registry.npmmirror.com";
1487
+ const REGISTRY_URL = "https://registry.npmmirror.com";
1362
1488
  async function fetchLatestVersion() {
1363
1489
  const response = await axios.get(
1364
- `${REGISTRY_URL$1}/${encodeURIComponent(name)}`,
1490
+ `${REGISTRY_URL}/${encodeURIComponent(name)}`,
1365
1491
  {
1366
1492
  timeout: 1e4
1367
1493
  }
@@ -1373,26 +1499,26 @@ async function fetchLatestVersion() {
1373
1499
  return latestVersion;
1374
1500
  }
1375
1501
 
1502
+ const UPGRADE_REGISTRY_URL = "https://registry.npmmirror.com";
1503
+ const UPGRADE_INSTALL_ARGS = [
1504
+ "install",
1505
+ "-g",
1506
+ `${name}@latest`,
1507
+ `--registry=${UPGRADE_REGISTRY_URL}`,
1508
+ "--prefer-online"
1509
+ ];
1510
+ const UPGRADE_INSTALL_HINT_COMMAND = `npm ${UPGRADE_INSTALL_ARGS.join(" ")}`;
1511
+
1376
1512
  async function installLatestVersion() {
1377
1513
  const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
1378
1514
  await new Promise((resolve, reject) => {
1379
- const child = child_process.spawn(
1380
- npmCommand,
1381
- [
1382
- "install",
1383
- "-g",
1384
- `${name}@latest`,
1385
- "--registry=https://registry.npmmirror.com",
1386
- "--prefer-online"
1387
- ],
1388
- {
1389
- env: {
1390
- ...process.env,
1391
- PUPPETEER_SKIP_DOWNLOAD: "true"
1392
- },
1393
- stdio: "inherit"
1394
- }
1395
- );
1515
+ const child = child_process.spawn(npmCommand, [...UPGRADE_INSTALL_ARGS], {
1516
+ env: {
1517
+ ...process.env,
1518
+ PUPPETEER_SKIP_DOWNLOAD: "true"
1519
+ },
1520
+ stdio: "inherit"
1521
+ });
1396
1522
  child.on("error", reject);
1397
1523
  child.on("exit", (code) => {
1398
1524
  if (code === 0) {
@@ -1429,23 +1555,20 @@ function isNewerVersion(latestVersion, currentVersion) {
1429
1555
  return false;
1430
1556
  }
1431
1557
 
1432
- const REGISTRY_URL = "https://registry.npmmirror.com";
1433
1558
  async function checkAndUpdate(checkOnly = false) {
1434
- console.log("\u6B63\u5728\u68C0\u67E5\u66F4\u65B0...");
1559
+ console.error("\u6B63\u5728\u68C0\u67E5\u66F4\u65B0...");
1435
1560
  const latestVersion = await fetchLatestVersion();
1436
1561
  if (!isNewerVersion(latestVersion, version)) {
1437
- console.log(`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C: ${version}`);
1562
+ console.error(`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C: ${version}`);
1438
1563
  return;
1439
1564
  }
1440
- console.log(`\u53D1\u73B0\u65B0\u7248\u672C: ${version} -> ${latestVersion}`);
1565
+ console.error(`\u53D1\u73B0\u65B0\u7248\u672C: ${version} -> ${latestVersion}`);
1441
1566
  if (checkOnly) {
1442
- console.log(
1443
- `\u53EF\u6267\u884C PUPPETEER_SKIP_DOWNLOAD=true npm install -g ${name}@latest --registry=${REGISTRY_URL} --prefer-online \u8FDB\u884C\u5347\u7EA7`
1444
- );
1567
+ console.error(`\u53EF\u6267\u884C ${UPGRADE_INSTALL_HINT_COMMAND} \u8FDB\u884C\u5347\u7EA7`);
1445
1568
  return;
1446
1569
  }
1447
1570
  await installLatestVersion();
1448
- console.log(`\u5347\u7EA7\u5B8C\u6210\uFF0C\u5F53\u524D\u6700\u65B0\u7248\u672C: ${latestVersion}`);
1571
+ console.error(`\u5347\u7EA7\u5B8C\u6210\uFF0C\u5F53\u524D\u6700\u65B0\u7248\u672C: ${latestVersion}`);
1449
1572
  }
1450
1573
 
1451
1574
  function registerUpgradeCommand(program) {
@@ -1456,11 +1579,11 @@ function registerUpgradeCommand(program) {
1456
1579
  \u68C0\u67E5 CLI \u662F\u5426\u6709\u65B0\u7248\u672C\uFF0C\u5E76\u5728\u9700\u8981\u65F6\u6267\u884C\u5347\u7EA7\u3002
1457
1580
 
1458
1581
  \u793A\u4F8B:
1459
- yingmi-cli upgrade --check-only
1460
- yingmi-cli upgrade
1582
+ yingmi-skill-cli upgrade --check-only
1583
+ yingmi-skill-cli upgrade
1461
1584
 
1462
1585
  \u8BF4\u660E:
1463
- - --check-only \u53EA\u68C0\u67E5\u7248\u672C\uFF0C\u4E0D\u6267\u884C\u5B89\u88C5
1586
+ - --check-only \u53EA\u68C0\u67E5\u7248\u672C\uFF0C\u4E0D\u6267\u884C\u5B89\u88C5\uFF1B\u53D1\u73B0\u65B0\u7248\u672C\u65F6\u4F1A\u8F93\u51FA\u53EF\u590D\u5236\u7684 npm \u5B89\u88C5\u547D\u4EE4
1464
1587
  - \u771F\u6B63\u5347\u7EA7\u524D\u5E94\u660E\u786E\u4E86\u89E3\u526F\u4F5C\u7528
1465
1588
  - \u975E\u4EA4\u4E92\u73AF\u5883\u4E0B\u4E0D\u5E94\u4F9D\u8D56\u786E\u8BA4\u8F93\u5165
1466
1589
  `
@@ -1478,7 +1601,7 @@ function registerUpgradeCommand(program) {
1478
1601
 
1479
1602
  function createProgram() {
1480
1603
  const program = new commander.Command();
1481
- program.name("yingmi-cli").version(version);
1604
+ program.name("yingmi-skill-cli").version(version);
1482
1605
  registerInitCommand(program);
1483
1606
  registerMcpCommand(program);
1484
1607
  registerRemoteSkillCommand(program);
@@ -1489,18 +1612,18 @@ function createProgram() {
1489
1612
  "after",
1490
1613
  `
1491
1614
  \u5E38\u89C1\u4EFB\u52A1:
1492
- \u9996\u6B21\u914D\u7F6E CLI yingmi-cli help init
1493
- \u76F4\u63A5\u8C03\u7528\u539F\u5B50\u91D1\u878D\u80FD\u529B yingmi-cli help mcp
1494
- \u5B8C\u6210\u57FA\u91D1\u6216\u8D22\u5BCC\u573A\u666F\u4EFB\u52A1 yingmi-cli help remote-skill
1495
- \u67E5\u770B\u67D0\u4E2A\u547D\u4EE4\u7684\u8BE6\u7EC6\u5E2E\u52A9 yingmi-cli help <command...>
1496
- \u68C0\u67E5\u6216\u5347\u7EA7\u7248\u672C yingmi-cli help upgrade
1615
+ \u9996\u6B21\u914D\u7F6E CLI yingmi-skill-cli help init
1616
+ \u76F4\u63A5\u8C03\u7528\u539F\u5B50\u91D1\u878D\u80FD\u529B yingmi-skill-cli help mcp
1617
+ \u5B8C\u6210\u57FA\u91D1\u6216\u8D22\u5BCC\u573A\u666F\u4EFB\u52A1 yingmi-skill-cli help remote-skill
1618
+ \u67E5\u770B\u67D0\u4E2A\u547D\u4EE4\u7684\u8BE6\u7EC6\u5E2E\u52A9 yingmi-skill-cli help <command...>
1619
+ \u68C0\u67E5\u6216\u5347\u7EA7\u7248\u672C yingmi-skill-cli help upgrade
1497
1620
 
1498
1621
  \u5FEB\u901F\u5F00\u59CB:
1499
- 1. yingmi-cli init setup
1500
- 2. \u5982\u679C\u8981\u76F4\u63A5\u8C03\u7528\u5355\u4E2A\u80FD\u529B\uFF0C\u6267\u884C yingmi-cli mcp list
1501
- 3. \u5982\u679C\u8981\u5B8C\u6210\u91D1\u878D\u573A\u666F\u4EFB\u52A1\uFF0C\u6267\u884C yingmi-cli remote-skill list
1502
- 4. \u5BF9\u4E8E mcp\uFF0C\u7EE7\u7EED\u6267\u884C yingmi-cli mcp schema <toolName>
1503
- 5. \u5BF9\u4E8E mcp\uFF0C\u6267\u884C yingmi-cli mcp call <toolName> --input '<json>'
1622
+ 1. yingmi-skill-cli init setup
1623
+ 2. \u5982\u679C\u8981\u76F4\u63A5\u8C03\u7528\u5355\u4E2A\u80FD\u529B\uFF0C\u6267\u884C yingmi-skill-cli mcp list
1624
+ 3. \u5982\u679C\u8981\u5B8C\u6210\u91D1\u878D\u573A\u666F\u4EFB\u52A1\uFF0C\u6267\u884C yingmi-skill-cli remote-skill list
1625
+ 4. \u5BF9\u4E8E mcp\uFF0C\u7EE7\u7EED\u6267\u884C yingmi-skill-cli mcp schema <toolName>
1626
+ 5. \u5BF9\u4E8E mcp\uFF0C\u6267\u884C yingmi-skill-cli mcp call <toolName> --input '<json>'
1504
1627
 
1505
1628
  \u534F\u8BAE\u63D0\u793A:
1506
1629
  - \u7ED3\u6784\u5316\u7ED3\u679C\u8F93\u51FA\u5230 stdout
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yingmi-skill-cli",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "author": "yingmi",
5
5
  "license": "MIT",
6
6
  "files": [
@@ -36,4 +36,4 @@
36
36
  "chalk": "^4",
37
37
  "commander": "*"
38
38
  }
39
- }
39
+ }