@mearl/client 2.16.3 → 2.16.4

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 CHANGED
@@ -143,6 +143,10 @@ mearl yuque --help
143
143
  mearl yuque --version
144
144
  ```
145
145
 
146
+ 当已注册插件与 Provider 使用同一名称时,`mearl <name> --help` 会先显示 Provider 的启动和生命周期说明,
147
+ 再自动追加插件注册的扩展命令;`mearl <name> <command> --help` 继续显示单个插件命令的详细帮助。
148
+ Provider 与插件仍可独立安装、更新和卸载,帮助聚合不会启动 Provider 或执行业务命令。
149
+
146
150
  目录默认使用 `scripts/main.mjs` 或 `scripts/main.py`;两者同时存在时使用 JavaScript 入口。JavaScript 入口默认导出 `register(app)`,Python 入口导出 `register(app)` 函数;两种入口都可声明简短的 `name` 和 `description`,并通过 `app.command(signature, handler, description?)`
147
151
  注册动作、`app.invoke(action, payload, options?)` 复用当前浏览器上下文,并用 `app.progress(message)` 报告可选进度。Python 的 `app.invoke` 是同步调用,handler 可以是普通函数或 `async def`。Python 插件要求 `python3 >= 3.9`,可用 `MEARL_PYTHON` 指定解释器路径;Mearl 不安装 Python 或执行 `pip install`。调用另一个插件时,payload 使用 `{ command, input }` envelope;嵌套调用继承宿主选项并拒绝循环依赖。CLI 默认只输出最终结果,传入
148
152
  `--verbose` 时才把进度写入 stderr。handler 返回文本或 JSON,宿主统一处理 `--output`、连接和错误。写命令在用户调用后直接执行,业务模块负责目标、状态、幂等和结果校验。
package/dist/cli.js CHANGED
@@ -192,7 +192,7 @@ function providerSchemaLines(name, schema, required, indent = 2) {
192
192
  }
193
193
  return lines;
194
194
  }
195
- function printProviderHelp(commandName, provider) {
195
+ function printProviderHelp(commandName, provider, extensionHelp) {
196
196
  const browserType = provider.browserType;
197
197
  const lines = [
198
198
  `${provider.providerId} — ${provider.name} v${provider.version}`,
@@ -230,8 +230,26 @@ function printProviderHelp(commandName, provider) {
230
230
  if (browserType.documentationUrl) {
231
231
  lines.push('', `文档:${browserType.documentationUrl}`);
232
232
  }
233
+ if (extensionHelp) {
234
+ lines.push('', '扩展命令:', extensionHelp, '', `运行 ${commandName} ${provider.providerId} <command> --help 查看命令参数。`);
235
+ }
233
236
  console.error(lines.join('\n'));
234
237
  }
238
+ async function sameNamePluginHelp(commandName, name) {
239
+ try {
240
+ if (!findPluginEntry(name))
241
+ return undefined;
242
+ const plugin = await loadRegisteredPlugin(name, {
243
+ async invoke() {
244
+ throw new Error('生成插件帮助时不能调用宿主能力');
245
+ },
246
+ });
247
+ return plugin.commandHelp(`${commandName} ${name}`);
248
+ }
249
+ catch (error) {
250
+ return ` (扩展命令帮助不可用:${error instanceof Error ? error.message : String(error)})`;
251
+ }
252
+ }
235
253
  function installedProvider(name) {
236
254
  if (!name)
237
255
  return undefined;
@@ -559,7 +577,8 @@ export async function runMearlCli(args, options = {}) {
559
577
  const provider = installedProvider(args[0]);
560
578
  if (provider &&
561
579
  (args.length === 1 || args.slice(1).every(arg => arg === '--help' || arg === '-h'))) {
562
- printProviderHelp(commandName, provider);
580
+ const extensionHelp = await sameNamePluginHelp(commandName, provider.providerId);
581
+ printProviderHelp(commandName, provider, extensionHelp);
563
582
  return 0;
564
583
  }
565
584
  if (args[0] &&
package/dist/plugin.d.ts CHANGED
@@ -26,6 +26,7 @@ export declare function loadPlugin(entry: string, context: Pick<PluginApp, 'invo
26
26
  name: string | undefined;
27
27
  description: string | undefined;
28
28
  version: string | undefined;
29
+ commandHelp(namespace: string): string;
29
30
  help(namespace: string, name?: string): string;
30
31
  run(positionals: string[], payload?: unknown, namedInput?: Record<string, unknown>): Promise<unknown>;
31
32
  }>;
@@ -33,6 +34,7 @@ export declare function loadRegisteredPlugin(name: string, context: PluginExecut
33
34
  name: string | undefined;
34
35
  description: string | undefined;
35
36
  version: string | undefined;
37
+ commandHelp(namespace: string): string;
36
38
  help(namespace: string, name?: string): string;
37
39
  run(positionals: string[], payload?: unknown, namedInput?: Record<string, unknown>): Promise<unknown>;
38
40
  }>;
package/dist/plugin.js CHANGED
@@ -131,6 +131,11 @@ export async function loadPlugin(entry, context, pluginName) {
131
131
  name,
132
132
  description,
133
133
  version: readPluginVersion(entry),
134
+ commandHelp(namespace) {
135
+ return [...commands.values()]
136
+ .map(({ command, signature }) => ` ${namespace} ${signature} ${command.description()}`)
137
+ .join('\n');
138
+ },
134
139
  help(namespace, name) {
135
140
  const selected = name ? [find(name)] : [...commands.values()];
136
141
  const example = selected[0].command;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mearl/client",
3
- "version": "2.16.3",
3
+ "version": "2.16.4",
4
4
  "description": "Unified Mearl SDK & CLI for local and remote browsers",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -59,8 +59,8 @@
59
59
  "commander": "^15.0.0",
60
60
  "fastest-levenshtein": "^1.0.16",
61
61
  "ws": "^8.18.0",
62
- "@mearl/cloud-types": "2.16.3",
63
- "@mearl/provider": "2.16.3"
62
+ "@mearl/cloud-types": "2.16.4",
63
+ "@mearl/provider": "2.16.4"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@types/node": "^24.9.1",