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.
- package/README.md +11 -4
- package/bin/index.js +227 -104
- 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
|
-
- `
|
|
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` 里手工设置 `
|
|
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.
|
|
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.
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
1256
|
-
2. yingmi-cli remote-skill
|
|
1257
|
-
3. yingmi-cli remote-skill
|
|
1258
|
-
4.
|
|
1259
|
-
|
|
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("
|
|
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
|
|
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
|
|
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
|
|
1487
|
+
const REGISTRY_URL = "https://registry.npmmirror.com";
|
|
1362
1488
|
async function fetchLatestVersion() {
|
|
1363
1489
|
const response = await axios.get(
|
|
1364
|
-
`${REGISTRY_URL
|
|
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
|
-
|
|
1381
|
-
|
|
1382
|
-
"
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
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.
|
|
1559
|
+
console.error("\u6B63\u5728\u68C0\u67E5\u66F4\u65B0...");
|
|
1435
1560
|
const latestVersion = await fetchLatestVersion();
|
|
1436
1561
|
if (!isNewerVersion(latestVersion, version)) {
|
|
1437
|
-
console.
|
|
1562
|
+
console.error(`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C: ${version}`);
|
|
1438
1563
|
return;
|
|
1439
1564
|
}
|
|
1440
|
-
console.
|
|
1565
|
+
console.error(`\u53D1\u73B0\u65B0\u7248\u672C: ${version} -> ${latestVersion}`);
|
|
1441
1566
|
if (checkOnly) {
|
|
1442
|
-
console.
|
|
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.
|
|
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
|