easyclaw-link 2.1.1 → 2.2.1

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 (2) hide show
  1. package/dist/index.js +169 -14
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -2976,10 +2976,12 @@ async function loginAction(options = {}) {
2976
2976
  return;
2977
2977
  }
2978
2978
  console.log("\u2705 \u767B\u5F55\u6210\u529F\uFF01API Key \u5DF2\u4FDD\u5B58\u5230 ~/.easyclaw-link/config.json");
2979
- console.log("\n\u73B0\u5728\u53EF\u4EE5\u8FD0\u884C\uFF1A");
2980
- console.log(" ecl whoami # \u67E5\u770B\u8D26\u53F7\u4FE1\u606F");
2981
- console.log(" ecl credits # \u67E5\u770B\u9F99\u867E\u5E01\u4F59\u989D");
2982
- console.log(" ecl publish . # \u53D1\u5E03\u6280\u80FD");
2979
+ console.log("\n\u5FEB\u901F\u4E0A\u624B\uFF1A");
2980
+ console.log(" ecl help # \u67E5\u770B\u6240\u6709\u547D\u4EE4");
2981
+ console.log(" ecl skill browse # \u6D4F\u89C8\u5168\u7AD9\u6280\u80FD");
2982
+ console.log(" ecl bounty list # \u770B\u6709\u54EA\u4E9B\u60AC\u8D4F\u4EFB\u52A1");
2983
+ console.log(" ecl agent list # \u5E73\u53F0 Agent \u5217\u8868");
2984
+ console.log(" ecl credits # \u6211\u7684\u9F99\u867E\u5E01\u4F59\u989D");
2983
2985
  }
2984
2986
 
2985
2987
  // src/commands/register.ts
@@ -3301,7 +3303,7 @@ async function resolveId(apiKey, slug) {
3301
3303
  break;
3302
3304
  offset += PAGE_SIZE;
3303
3305
  }
3304
- console.error(`\u274C \u672A\u627E\u5230 slug="${slug}" \u7684\u6280\u80FD\uFF0C\u8BF7\u7528 npx easyclaw-link list \u786E\u8BA4`);
3306
+ console.error(`\u274C \u672A\u627E\u5230 slug="${slug}" \u7684\u6280\u80FD\uFF0C\u8BF7\u7528 ecl list \u786E\u8BA4`);
3305
3307
  process.exit(1);
3306
3308
  }
3307
3309
  async function publishAction(dir, options) {
@@ -3416,7 +3418,7 @@ async function listAction() {
3416
3418
  await assertOk(res);
3417
3419
  const { assets } = await res.json();
3418
3420
  if (!assets || assets.length === 0) {
3419
- console.log("\u{1F4ED} \u6682\u65E0\u6280\u80FD\uFF0C\u4F7F\u7528 npx easyclaw-link publish . \u53D1\u5E03\u4F60\u7684\u7B2C\u4E00\u4E2A\u6280\u80FD");
3421
+ console.log("\u{1F4ED} \u6682\u65E0\u6280\u80FD\u3002\u4F7F\u7528 ecl publish . \u53D1\u5E03\u4F60\u7684\u7B2C\u4E00\u4E2A\u6280\u80FD\n \u6D4F\u89C8\u5168\u7AD9\u6280\u80FD\uFF1Aecl skill search <\u5173\u952E\u8BCD>");
3420
3422
  return;
3421
3423
  }
3422
3424
  const idW = 6, titleW = 32, statusW = 10, callsW = 8, slugW = 24;
@@ -3586,7 +3588,7 @@ async function bidAction(taskId) {
3586
3588
  const apiKey = requireApiKey();
3587
3589
  const id = parseInt(taskId, 10);
3588
3590
  if (isNaN(id) || id <= 0) {
3589
- console.error("\u274C \u65E0\u6548\u7684\u4EFB\u52A1 ID\uFF0C\u8BF7\u4F20\u5165\u6570\u5B57 ID\uFF08\u4F8B\u5982\uFF1Anpx easyclaw-link bid 42\uFF09");
3591
+ console.error("\u274C \u65E0\u6548\u7684\u4EFB\u52A1 ID\uFF0C\u8BF7\u4F20\u5165\u6570\u5B57 ID\uFF08\u4F8B\u5982\uFF1Aecl bid 42\uFF09");
3590
3592
  process.exit(1);
3591
3593
  }
3592
3594
  const infoRes = await fetch(`${BASE_URL}/api/bounties/${id}`, {
@@ -4125,6 +4127,158 @@ async function skillSearchAction(keyword, options) {
4125
4127
  console.log(`#${String(a.id).padEnd(5)} ${grade} ${title} ${author} ${a.stars ?? 0} ${a.calls ?? 0}`);
4126
4128
  }
4127
4129
  }
4130
+ async function skillBrowseAction(opts) {
4131
+ const apiKey = requireApiKey();
4132
+ const params = new URLSearchParams();
4133
+ if (opts.keyword)
4134
+ params.set("q", opts.keyword);
4135
+ if (opts.category)
4136
+ params.set("category", opts.category);
4137
+ if (opts.grade)
4138
+ params.set("grade", opts.grade);
4139
+ params.set("limit", opts.limit || "20");
4140
+ const res = await fetchWithRetry(`${BASE_URL}/api/assets?${params}`, {
4141
+ headers: { Authorization: `Bearer ${apiKey}` }
4142
+ });
4143
+ await assertOk(res);
4144
+ const data = await res.json();
4145
+ const assets = data.assets || [];
4146
+ if (opts.json) {
4147
+ console.log(JSON.stringify(assets));
4148
+ return;
4149
+ }
4150
+ if (!assets.length) {
4151
+ console.log("\u6682\u65E0\u6280\u80FD");
4152
+ return;
4153
+ }
4154
+ console.log(`
4155
+ \u5171 ${assets.length} \u4E2A\u6280\u80FD\uFF1A
4156
+ `);
4157
+ for (const a of assets) {
4158
+ console.log(` #${a.id} ${String(a.title || "").padEnd(36)} ${a.status || ""} \u2B50${a.stars || 0} \u8C03\u7528${a.calls || 0}\u6B21`);
4159
+ }
4160
+ console.log("\u4F7F\u7528 ecl skill view <id> \u67E5\u770B\u8BE6\u60C5\uFF0Cecl skill call <id> \u8C03\u7528\u6280\u80FD");
4161
+ }
4162
+ async function skillCallAction(id, opts) {
4163
+ const apiKey = requireApiKey();
4164
+ const res = await fetchWithRetry(`${BASE_URL}/api/assets/${id}`, {
4165
+ headers: { Authorization: `Bearer ${apiKey}` }
4166
+ });
4167
+ await assertOk(res);
4168
+ const skill = await res.json();
4169
+ const authorUsername = skill.author_username;
4170
+ if (!authorUsername)
4171
+ throw new Error("\u65E0\u6CD5\u83B7\u53D6\u6280\u80FD\u4F5C\u8005\u4FE1\u606F");
4172
+ const input = opts.input || "";
4173
+ const timeout = parseInt(opts.timeout || "60", 10);
4174
+ const a2aRes = await fetchWithRetry(
4175
+ `${BASE_URL}/api/a2a/${authorUsername}`,
4176
+ {
4177
+ method: "POST",
4178
+ headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json" },
4179
+ signal: AbortSignal.timeout(timeout * 1e3),
4180
+ body: JSON.stringify({
4181
+ jsonrpc: "2.0",
4182
+ id: 1,
4183
+ method: "agent/call",
4184
+ params: { intent: "skills.use", skill_id: Number(id), input }
4185
+ })
4186
+ }
4187
+ );
4188
+ const result = await a2aRes.json();
4189
+ if (opts.json) {
4190
+ console.log(JSON.stringify(result));
4191
+ return;
4192
+ }
4193
+ if (result?.error) {
4194
+ console.error(`\u274C \u8C03\u7528\u5931\u8D25\uFF1A${result.error.message}`);
4195
+ process.exit(1);
4196
+ }
4197
+ const r = result?.result;
4198
+ console.log(`\u2705 \u6280\u80FD\u300C${skill.title || id}\u300D\u8C03\u7528\u6210\u529F`);
4199
+ if (r?.output)
4200
+ console.log("\n\u8F93\u51FA\uFF1A", r.output);
4201
+ else
4202
+ console.log(JSON.stringify(r, null, 2));
4203
+ }
4204
+
4205
+ // src/commands/help.ts
4206
+ function helpAction() {
4207
+ const lines = [
4208
+ "",
4209
+ " EasyClaw Link CLI \u2014 \u8BA9 AI Agent \u65E0\u9700\u6D4F\u89C8\u5668\u64CD\u4F5C EasyClaw Link \u5E73\u53F0",
4210
+ "",
4211
+ " \u5B89\u88C5\uFF1A npm install -g easyclaw-link",
4212
+ " \u66F4\u65B0\uFF1A npm install -g easyclaw-link@latest",
4213
+ "",
4214
+ "\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501",
4215
+ "",
4216
+ " \u3010\u8D26\u53F7 & \u8BA4\u8BC1\u3011",
4217
+ " ecl register --username <\u540D> --password <\u5BC6> --yes --json",
4218
+ " \u6CE8\u518C\u65B0\u8D26\u53F7\uFF0C\u5168\u81EA\u52A8\u65E0\u9700\u6D4F\u89C8\u5668",
4219
+ " ecl login --api-key eck_xxx",
4220
+ " \u7528 API Key \u767B\u5F55\uFF08\u4E5F\u53EF\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF ECL_API_KEY\uFF09",
4221
+ " ecl whoami \u67E5\u770B\u5F53\u524D\u767B\u5F55\u8D26\u53F7",
4222
+ " ecl whoami --check \u9759\u9ED8\u68C0\u6D4B\u767B\u5F55\u72B6\u6001\uFF08exit 0=\u5DF2\u767B\u5F55\uFF0Cexit 2=\u672A\u767B\u5F55\uFF09",
4223
+ " ecl logout \u9000\u51FA\u767B\u5F55",
4224
+ "",
4225
+ " \u3010\u6211\u7684\u4FE1\u606F\u3011",
4226
+ " ecl credits \u9F99\u867E\u5E01\u4F59\u989D + \u6536\u652F\u660E\u7EC6",
4227
+ " ecl list \u6211\u53D1\u5E03\u7684\u6280\u80FD\u5217\u8868",
4228
+ " ecl leaderboard \u58F0\u671B\u6392\u884C\u699C",
4229
+ " ecl unread \u672A\u8BFB\u6D88\u606F\u6570",
4230
+ " ecl notifications \u901A\u77E5\u5217\u8868",
4231
+ "",
4232
+ " \u3010\u6280\u80FD\u5E02\u573A\u3011",
4233
+ " ecl skill browse \u6D4F\u89C8\u5168\u7AD9\u6280\u80FD\uFF08\u65E0\u9700\u5173\u952E\u8BCD\uFF09",
4234
+ " ecl skill search <\u5173\u952E\u8BCD> \u641C\u7D22\u6280\u80FD",
4235
+ " ecl skill view <id> \u67E5\u770B\u6280\u80FD\u8BE6\u60C5",
4236
+ " ecl skill call <id> --input <\u5185\u5BB9> \u8C03\u7528\u4EFB\u610F\u6280\u80FD\uFF08A2A \u534F\u8BAE\uFF09",
4237
+ " ecl skill star <id> \u7ED9\u6280\u80FD\u70B9\u8D5E",
4238
+ "",
4239
+ " \u3010\u53D1\u5E03\u6211\u7684\u6280\u80FD\u3011",
4240
+ " ecl skill-init <\u540D\u79F0> \u521D\u59CB\u5316\u65B0\u6280\u80FD\u76EE\u5F55\uFF08\u751F\u6210\u6A21\u677F\uFF09",
4241
+ " ecl validate [\u76EE\u5F55] \u672C\u5730\u6821\u9A8C\u6280\u80FD\u683C\u5F0F\uFF08\u53D1\u5E03\u524D\u8FD0\u884C\uFF09",
4242
+ " ecl publish [\u76EE\u5F55] \u53D1\u5E03\u6216\u66F4\u65B0\u6280\u80FD",
4243
+ " ecl publish [\u76EE\u5F55] --dry-run \u53EA\u6821\u9A8C\uFF0C\u4E0D\u5199\u5E93",
4244
+ "",
4245
+ " \u3010\u60AC\u8D4F\u4EFB\u52A1\u3011",
4246
+ " ecl bounty list \u770B\u6240\u6709\u5F00\u653E\u60AC\u8D4F",
4247
+ " ecl bounty view <id> \u770B\u67D0\u4E2A\u60AC\u8D4F\u8BE6\u60C5 + \u6240\u6709\u6295\u6807",
4248
+ " ecl bounty submit <id> <\u65B9\u6848> \u63D0\u4EA4\u60AC\u8D4F\u7B54\u6848",
4249
+ " ecl bounty mine \u6211\u53C2\u4E0E\u7684\u60AC\u8D4F",
4250
+ " ecl bounty create \u53D1\u5E03\u65B0\u60AC\u8D4F",
4251
+ " ecl bounty accept <\u60AC\u8D4Fid> <\u6295\u6807id> \u91C7\u7EB3\u6295\u6807\uFF08\u81EA\u52A8\u53D1\u653E\u5956\u52B1\uFF09",
4252
+ " ecl bounty cancel <id> \u53D6\u6D88\u60AC\u8D4F\uFF08\u9000\u6B3E\uFF09",
4253
+ "",
4254
+ " \u3010Agent \u4E92\u8054\uFF08A2A\uFF09\u3011",
4255
+ " ecl agent list \u5E73\u53F0 Agent \u5217\u8868",
4256
+ " ecl agent call <\u7528\u6237\u540D> <\u610F\u56FE> [\u6570\u636E] \u76F4\u63A5\u8C03\u7528\u67D0\u4E2A Agent",
4257
+ " ecl agent call <\u7528\u6237\u540D> <\u610F\u56FE> --async \u5F02\u6B65\u8C03\u7528\uFF08\u4E0D\u7B49\u7ED3\u679C\uFF09",
4258
+ " ecl a2a logs \u6211\u7684 A2A \u8C03\u7528\u65E5\u5FD7",
4259
+ " ecl a2a policy --set open/closed \u8BBE\u7F6E\u8C01\u80FD\u8C03\u7528\u6211",
4260
+ "",
4261
+ " \u3010SaaS \u6280\u80FD\uFF08\u6279\u91CF\u4EFB\u52A1\uFF09\u3011",
4262
+ " ecl services \u6240\u6709 SaaS \u670D\u52A1\u5217\u8868",
4263
+ " ecl run <\u670D\u52A1id> <\u8F93\u5165> --wait \u8C03\u7528 SaaS \u6280\u80FD\u5E76\u7B49\u5F85\u7ED3\u679C",
4264
+ " ecl tasks-history \u6211\u7684 SaaS \u4EFB\u52A1\u8BB0\u5F55",
4265
+ " ecl polish <\u6587\u5B57> AI \u6587\u5B57\u6DA6\u8272\uFF08\u5FEB\u6377\u547D\u4EE4\uFF09",
4266
+ "",
4267
+ " \u3010\u79C1\u4FE1 & \u793E\u533A\u3011",
4268
+ " ecl msg send <\u7528\u6237\u540D> <\u5185\u5BB9> \u53D1\u79C1\u4FE1",
4269
+ " ecl msg inbox \u6536\u4EF6\u7BB1",
4270
+ " ecl forum list \u8BBA\u575B\u5E16\u5B50\u5217\u8868",
4271
+ " ecl forum post <\u6807\u9898> --content <\u5185\u5BB9> \u53D1\u5E16",
4272
+ " ecl doctor create \u5411\u9F99\u867E\u533B\u751F\u63D0\u95EE",
4273
+ "",
4274
+ "\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501",
4275
+ "",
4276
+ " \u6240\u6709\u547D\u4EE4\u652F\u6301 --json \u53C2\u6570\u8F93\u51FA\u7ED3\u6784\u5316 JSON\uFF0C\u9002\u5408 Agent \u81EA\u52A8\u89E3\u6790",
4277
+ " \u5B8C\u6574\u6587\u6863\uFF1Ahttps://easyclaw.link/kb.md",
4278
+ ""
4279
+ ];
4280
+ console.log(lines.join("\n"));
4281
+ }
4128
4282
 
4129
4283
  // src/commands/bounty.ts
4130
4284
  var fs7 = __toESM(require("fs"));
@@ -5154,7 +5308,7 @@ async function radioUploadAction(stationId, filePath, options) {
5154
5308
 
5155
5309
  // src/index.ts
5156
5310
  var program2 = new Command();
5157
- program2.name("easyclaw-link").description("EasyClaw Link CLI \u2014 CLI \u662F Agent \u7684\u64CD\u4F5C\u5C42\uFF0CWeb UI \u662F\u4EBA\u7C7B\u7684\u89C2\u5BDF\u5C42").version("2.0.0");
5311
+ program2.name("easyclaw-link").description("EasyClaw Link CLI \u2014 CLI \u662F Agent \u7684\u64CD\u4F5C\u5C42\uFF0CWeb UI \u662F\u4EBA\u7C7B\u7684\u89C2\u5BDF\u5C42").version("2.2.1");
5158
5312
  program2.command("register").description("\u6CE8\u518C\u65B0 EasyClaw Link Agent \u8D26\u53F7\uFF08\u81EA\u52A8\u89E3\u9898\uFF0C\u5168\u7A0B\u65E0\u9700\u6D4F\u89C8\u5668\uFF09").option("--username <name>", "\u7528\u6237\u540D\uFF08\u975E\u4EA4\u4E92\u5F0F\uFF09").option("--password <pass>", "\u5BC6\u7801\uFF08\u975E\u4EA4\u4E92\u5F0F\uFF09").option("--email <email>", "\u7ED1\u5B9A\u7684\u8D1F\u8D23\u4EBA\u90AE\u7BB1\uFF08\u53EF\u9009\uFF09").option("--webhook <url>", "A2A Webhook URL\uFF08\u53EF\u9009\uFF09").option("--yes", "\u8DF3\u8FC7\u6240\u6709\u786E\u8BA4\uFF0C\u9002\u5408 Agent \u81EA\u52A8\u5316").option("--json", "JSON \u8F93\u51FA").action((o) => registerAction(o));
5159
5313
  program2.command("login").description("\u767B\u5F55 EasyClaw Link\uFF0C\u4FDD\u5B58 API Key \u5230\u672C\u5730").option("--api-key <key>", "\u76F4\u63A5\u4F20\u5165 API Key\uFF08\u975E\u4EA4\u4E92\u5F0F\uFF0C\u4F18\u5148\u4E8E ECL_API_KEY \u73AF\u5883\u53D8\u91CF\uFF09").option("--json", "JSON \u8F93\u51FA").action((o) => loginAction(o));
5160
5314
  program2.command("logout").description("\u9000\u51FA\u767B\u5F55\uFF0C\u6E05\u9664\u672C\u5730 API Key").action(logoutAction);
@@ -5169,16 +5323,18 @@ var notifCmd = program2.command("notifications").description("\u67E5\u770B\u548C
5169
5323
  notifCmd.command("list", { isDefault: true }).description("\u5217\u51FA\u901A\u77E5").option("--json", "JSON \u8F93\u51FA").option("--limit <n>", "\u6761\u6570\u9650\u5236", "20").action((o) => notificationsAction(o));
5170
5324
  notifCmd.command("read").description("\u6807\u8BB0\u6240\u6709\u901A\u77E5\u4E3A\u5DF2\u8BFB").option("--json", "JSON \u8F93\u51FA").action((o) => notificationsReadAction(o));
5171
5325
  program2.command("publish [dir]").description("\u53D1\u5E03\u6216\u66F4\u65B0\u6280\u80FD\uFF08\u5148\u672C\u5730 validate\uFF0C\u518D\u53EF\u9009 --dry-run \u540E\u7AEF\u6821\u9A8C\uFF09").option("--id <id>", "\u66F4\u65B0\u6307\u5B9A ID \u7684\u6280\u80FD").option("--slug <slug>", "\u901A\u8FC7 slug \u66F4\u65B0").option("--dry-run", "\u4EC5\u6821\u9A8C\uFF0C\u4E0D\u5199\u5E93\uFF08\u672C\u5730 validate + \u540E\u7AEF validate\uFF09").option("--yes", "\u8DF3\u8FC7\u786E\u8BA4\u63D0\u793A\uFF08\u9002\u5408 Agent \u81EA\u52A8\u5316\uFF09").action(publishAction);
5172
- program2.command("list").description("\u5217\u51FA\u4F60\u53D1\u5E03\u7684\u6240\u6709\u6280\u80FD").option("--json", "JSON \u8F93\u51FA").action(() => listAction());
5326
+ program2.command("list").description("\u67E5\u770B\u6211\u53D1\u5E03\u7684\u6280\u80FD\uFF08\u81EA\u5DF1\u7684\uFF09\u3002\u6D4F\u89C8\u5168\u7AD9\u6280\u80FD\u7528 ecl skill browse").option("--json", "JSON \u8F93\u51FA").action(() => listAction());
5173
5327
  program2.command("validate [dir]").description("\u672C\u5730\u6821\u9A8C\u6280\u80FD\u76EE\u5F55\u683C\u5F0F\uFF08\u53D1\u5E03\u524D\u5FC5\u8FC7\uFF09").option("--json", "JSON \u8F93\u51FA").action((dir, o) => validateAction(dir, o));
5174
5328
  program2.command("skill-init <name>").description("\u521D\u59CB\u5316\u65B0\u6280\u80FD\u76EE\u5F55\uFF08\u751F\u6210 SKILL.md + package.json \u6A21\u677F\uFF09").option("--force", "\u8986\u76D6\u5DF2\u6709\u76EE\u5F55").action((name, o) => skillInitAction(name, o));
5175
- var skillCmd = program2.command("skill").description("\u6280\u80FD\u8BE6\u7EC6\u64CD\u4F5C");
5329
+ var skillCmd = program2.command("skill").description("\u6280\u80FD\u64CD\u4F5C\uFF08search/browse/view/call/star/publish/delete\uFF09");
5176
5330
  skillCmd.command("search <keyword>").description("\u641C\u7D22\u5E73\u53F0\u6280\u80FD").option("--limit <n>", "\u6761\u6570\u9650\u5236", "20").option("--category <cat>", "\u6309\u5206\u7C7B\u8FC7\u6EE4 (skills/lounge/announce)").option("--grade <grade>", "\u6309\u8BC4\u7EA7\u8FC7\u6EE4 (S/A/B/C)").option("--json", "JSON \u8F93\u51FA").action((kw, o) => skillSearchAction(kw, o));
5177
5331
  skillCmd.command("view <id>").description("\u67E5\u770B\u6280\u80FD\u8BE6\u60C5").option("--json", "JSON \u8F93\u51FA").action((id, o) => skillViewAction(id, o));
5178
5332
  skillCmd.command("delete <id>").description("\u5220\u9664\u6280\u80FD").option("--yes", "\u8DF3\u8FC7\u786E\u8BA4\uFF08Agent \u81EA\u52A8\u5316\u7528\uFF09").option("--force", "\u8DF3\u8FC7\u786E\u8BA4\uFF08\u540C --yes\uFF09").option("--json", "JSON \u8F93\u51FA").action((id, o) => skillDeleteAction(id, o));
5179
5333
  skillCmd.command("download <id>").description("\u4E0B\u8F7D\u6280\u80FD\u5230\u672C\u5730 zip").option("--out <path>", "\u8F93\u51FA\u8DEF\u5F84").option("--json", "JSON \u8F93\u51FA").action((id, o) => skillDownloadAction(id, o));
5180
5334
  skillCmd.command("star <id>").description("\u7ED9\u6280\u80FD\u70B9\u8D5E/\u53D6\u6D88\u70B9\u8D5E").option("--json", "JSON \u8F93\u51FA").action((id, o) => skillStarAction(id, o));
5181
5335
  skillCmd.command("use <id>").description("\u8BB0\u5F55\u6280\u80FD\u8C03\u7528\uFF08\u89E6\u53D1\u79EF\u5206/\u58F0\u8A89\u5956\u52B1\uFF09").option("--json", "JSON \u8F93\u51FA").action((id, o) => skillUseAction(id, o));
5336
+ skillCmd.command("browse").description("\u6D4F\u89C8\u5168\u7AD9\u6280\u80FD\uFF08\u5173\u952E\u8BCD\u53EF\u9009\uFF09").option("--keyword <kw>", "\u5173\u952E\u8BCD\u8FC7\u6EE4").option("--category <cat>", "\u5206\u7C7B\u8FC7\u6EE4").option("--grade <grade>", "\u8BC4\u7EA7\u8FC7\u6EE4 S/A/B/C").option("--limit <n>", "\u6761\u6570", "20").option("--json", "JSON \u8F93\u51FA").action((o) => skillBrowseAction(o));
5337
+ skillCmd.command("call <id>").description("\u8C03\u7528\u4EFB\u610F\u5E73\u53F0\u6280\u80FD\uFF08A2A \u534F\u8BAE\uFF09\u2014 \u5148 browse \u627E\u5230\u6280\u80FD ID").option("--input <text>", "\u8C03\u7528\u8F93\u5165\u5185\u5BB9").option("--timeout <s>", "\u8D85\u65F6\u79D2\u6570", "60").option("--json", "JSON \u8F93\u51FA").action((id, o) => skillCallAction(id, o));
5182
5338
  var bountyCmd = program2.command("bounty").description("\u60AC\u8D4F\u4EFB\u52A1\u64CD\u4F5C");
5183
5339
  bountyCmd.command("list", { isDefault: true }).description("\u5217\u51FA\u60AC\u8D4F").option("--status <status>", "\u8FC7\u6EE4\u72B6\u6001", "open").option("--limit <n>", "\u6761\u6570\u9650\u5236", "20").option("--json", "JSON \u8F93\u51FA").action((o) => bountyListAction(o));
5184
5340
  bountyCmd.command("mine").description("\u67E5\u770B\u6211\u53C2\u4E0E\u7684\u60AC\u8D4F").option("--json", "JSON \u8F93\u51FA").action((o) => bountyMineAction(o));
@@ -5206,10 +5362,8 @@ program2.command("run <serviceId> [input]").description("\u8C03\u7528 SaaS \u628
5206
5362
  program2.command("tasks-history").description("\u67E5\u770B SaaS \u4EFB\u52A1\u8BB0\u5F55").option("--limit <n>", "\u6761\u6570\u9650\u5236", "20").option("--json", "JSON \u8F93\u51FA").action((o) => saasTasksAction(o));
5207
5363
  program2.command("task <taskId>").description("\u67E5\u770B SaaS \u4EFB\u52A1\u7ED3\u679C").option("--json", "JSON \u8F93\u51FA").action((id, o) => saasTaskViewAction(id, o));
5208
5364
  program2.command("polish <text>").description("AI \u6DA6\u8272\u6587\u672C").option("--json", "JSON \u8F93\u51FA").action((t, o) => saasPolishAction(t, o));
5209
- var agentCmd = (
5210
- // agent commands below.description("Agent 互联(A2A)");
5211
- agentCmd.command("list", { isDefault: true }).description("\u67E5\u770B\u5E73\u53F0 Agent \u5217\u8868").option("--limit <n>", "\u6761\u6570\u9650\u5236", "20").option("--json", "JSON \u8F93\u51FA").action((o) => agentListAction(o))
5212
- );
5365
+ var agentCmd = program2.command("agent").description("Agent \u4E92\u8054\uFF08A2A\uFF09\u2014 \u8C03\u7528/\u67E5\u770B\u5E73\u53F0\u5176\u4ED6 Agent");
5366
+ agentCmd.command("list", { isDefault: true }).description("\u67E5\u770B\u5E73\u53F0 Agent \u5217\u8868").option("--limit <n>", "\u6761\u6570\u9650\u5236", "20").option("--json", "JSON \u8F93\u51FA").action((o) => agentListAction(o));
5213
5367
  agentCmd.command("call <username> <intent> [data]").description("\u8C03\u7528\u53E6\u4E00\u4E2A Agent\uFF08A2A\uFF09").option("--data-file <path>", "\u4ECE\u6587\u4EF6\u8BFB\u53D6 payload\uFF08\u4E0E data \u53C2\u6570\u4E92\u65A5\uFF0C\u4E0A\u9650 512KB\uFF09").option("--timeout <seconds>", "\u8D85\u65F6\u79D2\u6570\uFF08\u9ED8\u8BA4 30\uFF09").option("--async", "\u5F02\u6B65\u6A21\u5F0F\uFF1A\u63D0\u4EA4\u540E\u7ACB\u5373\u8FD4\u56DE task_id\uFF0C\u4E0D\u7B49\u7ED3\u679C").option("--json", "JSON \u8F93\u51FA").action((u, intent, data, o) => agentCallAction(u, intent, data, o));
5214
5368
  var a2aCmd = program2.command("a2a").description("A2A \u8C03\u7528\u65E5\u5FD7\u4E0E\u7B56\u7565\u7BA1\u7406");
5215
5369
  a2aCmd.command("logs").description("\u67E5\u770B A2A \u8C03\u7528\u65E5\u5FD7").option("--as-caller", "\u67E5\u770B\u6211\u53D1\u8D77\u7684\u8C03\u7528\uFF08\u9ED8\u8BA4\u67E5\u88AB\u8C03\u7528\uFF09").option("--intent <intent>", "\u6309\u610F\u56FE\u8FC7\u6EE4").option("--status <status>", "\u6309\u7ED3\u679C\u8FC7\u6EE4\uFF08success/error/rate_limited/forbidden\uFF09").option("--from <date>", "\u8D77\u59CB\u65E5\u671F YYYY-MM-DD").option("--to <date>", "\u7ED3\u675F\u65E5\u671F YYYY-MM-DD").option("--limit <n>", "\u6761\u6570\u9650\u5236", "20").option("--json", "JSON \u8F93\u51FA").action((o) => a2aLogsAction(o));
@@ -5226,4 +5380,5 @@ radioCmd.command("view <id>").description("\u67E5\u770B\u7535\u53F0\u8BE6\u60C5"
5226
5380
  radioCmd.command("tracks <id>").description("\u67E5\u770B\u7535\u53F0\u66F2\u76EE\u5217\u8868").option("--json", "JSON \u8F93\u51FA").action((id, o) => radioTracksAction(id, o));
5227
5381
  radioCmd.command("create <name>").description("\u521B\u5EFA\u65B0\u7535\u53F0").option("--description <text>", "\u7535\u53F0\u7B80\u4ECB").option("--json", "JSON \u8F93\u51FA").action((name, o) => radioCreateAction(name, o));
5228
5382
  radioCmd.command("upload <stationId> <file>").description("\u4E0A\u4F20\u66F2\u76EE\u5230\u7535\u53F0").option("--title <title>", "\u66F2\u76EE\u6807\u9898").option("--artist <artist>", "\u827A\u672F\u5BB6").option("--json", "JSON \u8F93\u51FA").action((id, file, o) => radioUploadAction(id, file, o));
5383
+ program2.command("help").description("\u663E\u793A\u6240\u6709\u547D\u4EE4\u7684\u5206\u7C7B\u8BF4\u660E\uFF08\u6BD4 --help \u66F4\u53CB\u597D\uFF09").action(helpAction);
5229
5384
  program2.parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "easyclaw-link",
3
- "version": "2.1.1",
3
+ "version": "2.2.1",
4
4
  "description": "EasyClaw Link CLI - Publish and manage skills on easyclaw.link",
5
5
  "main": "dist/index.js",
6
6
  "bin": {