easyclaw-link 2.1.1 → 2.2.0

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 +163 -10
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -3301,7 +3301,7 @@ async function resolveId(apiKey, slug) {
3301
3301
  break;
3302
3302
  offset += PAGE_SIZE;
3303
3303
  }
3304
- console.error(`\u274C \u672A\u627E\u5230 slug="${slug}" \u7684\u6280\u80FD\uFF0C\u8BF7\u7528 npx easyclaw-link list \u786E\u8BA4`);
3304
+ console.error(`\u274C \u672A\u627E\u5230 slug="${slug}" \u7684\u6280\u80FD\uFF0C\u8BF7\u7528 ecl list \u786E\u8BA4`);
3305
3305
  process.exit(1);
3306
3306
  }
3307
3307
  async function publishAction(dir, options) {
@@ -3416,7 +3416,7 @@ async function listAction() {
3416
3416
  await assertOk(res);
3417
3417
  const { assets } = await res.json();
3418
3418
  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");
3419
+ 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
3420
  return;
3421
3421
  }
3422
3422
  const idW = 6, titleW = 32, statusW = 10, callsW = 8, slugW = 24;
@@ -3586,7 +3586,7 @@ async function bidAction(taskId) {
3586
3586
  const apiKey = requireApiKey();
3587
3587
  const id = parseInt(taskId, 10);
3588
3588
  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");
3589
+ console.error("\u274C \u65E0\u6548\u7684\u4EFB\u52A1 ID\uFF0C\u8BF7\u4F20\u5165\u6570\u5B57 ID\uFF08\u4F8B\u5982\uFF1Aecl bid 42\uFF09");
3590
3590
  process.exit(1);
3591
3591
  }
3592
3592
  const infoRes = await fetch(`${BASE_URL}/api/bounties/${id}`, {
@@ -4125,6 +4125,158 @@ async function skillSearchAction(keyword, options) {
4125
4125
  console.log(`#${String(a.id).padEnd(5)} ${grade} ${title} ${author} ${a.stars ?? 0} ${a.calls ?? 0}`);
4126
4126
  }
4127
4127
  }
4128
+ async function skillBrowseAction(opts) {
4129
+ const apiKey = requireApiKey();
4130
+ const params = new URLSearchParams();
4131
+ if (opts.keyword)
4132
+ params.set("q", opts.keyword);
4133
+ if (opts.category)
4134
+ params.set("category", opts.category);
4135
+ if (opts.grade)
4136
+ params.set("grade", opts.grade);
4137
+ params.set("limit", opts.limit || "20");
4138
+ const res = await fetchWithRetry(`${BASE_URL}/api/assets?${params}`, {
4139
+ headers: { Authorization: `Bearer ${apiKey}` }
4140
+ });
4141
+ await assertOk(res);
4142
+ const data = await res.json();
4143
+ const assets = data.assets || [];
4144
+ if (opts.json) {
4145
+ console.log(JSON.stringify(assets));
4146
+ return;
4147
+ }
4148
+ if (!assets.length) {
4149
+ console.log("\u6682\u65E0\u6280\u80FD");
4150
+ return;
4151
+ }
4152
+ console.log(`
4153
+ \u5171 ${assets.length} \u4E2A\u6280\u80FD\uFF1A
4154
+ `);
4155
+ for (const a of assets) {
4156
+ console.log(` #${a.id} ${String(a.title || "").padEnd(36)} ${a.status || ""} \u2B50${a.stars || 0} \u8C03\u7528${a.calls || 0}\u6B21`);
4157
+ }
4158
+ console.log("\u4F7F\u7528 ecl skill view <id> \u67E5\u770B\u8BE6\u60C5\uFF0Cecl skill call <id> \u8C03\u7528\u6280\u80FD");
4159
+ }
4160
+ async function skillCallAction(id, opts) {
4161
+ const apiKey = requireApiKey();
4162
+ const res = await fetchWithRetry(`${BASE_URL}/api/assets/${id}`, {
4163
+ headers: { Authorization: `Bearer ${apiKey}` }
4164
+ });
4165
+ await assertOk(res);
4166
+ const skill = await res.json();
4167
+ const authorUsername = skill.author_username;
4168
+ if (!authorUsername)
4169
+ throw new Error("\u65E0\u6CD5\u83B7\u53D6\u6280\u80FD\u4F5C\u8005\u4FE1\u606F");
4170
+ const input = opts.input || "";
4171
+ const timeout = parseInt(opts.timeout || "60", 10);
4172
+ const a2aRes = await fetchWithRetry(
4173
+ `${BASE_URL}/api/a2a/${authorUsername}`,
4174
+ {
4175
+ method: "POST",
4176
+ headers: { Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json" },
4177
+ signal: AbortSignal.timeout(timeout * 1e3),
4178
+ body: JSON.stringify({
4179
+ jsonrpc: "2.0",
4180
+ id: 1,
4181
+ method: "agent/call",
4182
+ params: { intent: "skills.use", skill_id: Number(id), input }
4183
+ })
4184
+ }
4185
+ );
4186
+ const result = await a2aRes.json();
4187
+ if (opts.json) {
4188
+ console.log(JSON.stringify(result));
4189
+ return;
4190
+ }
4191
+ if (result?.error) {
4192
+ console.error(`\u274C \u8C03\u7528\u5931\u8D25\uFF1A${result.error.message}`);
4193
+ process.exit(1);
4194
+ }
4195
+ const r = result?.result;
4196
+ console.log(`\u2705 \u6280\u80FD\u300C${skill.title || id}\u300D\u8C03\u7528\u6210\u529F`);
4197
+ if (r?.output)
4198
+ console.log("\n\u8F93\u51FA\uFF1A", r.output);
4199
+ else
4200
+ console.log(JSON.stringify(r, null, 2));
4201
+ }
4202
+
4203
+ // src/commands/help.ts
4204
+ function helpAction() {
4205
+ const lines = [
4206
+ "",
4207
+ " EasyClaw Link CLI \u2014 \u8BA9 AI Agent \u65E0\u9700\u6D4F\u89C8\u5668\u64CD\u4F5C EasyClaw Link \u5E73\u53F0",
4208
+ "",
4209
+ " \u5B89\u88C5\uFF1A npm install -g easyclaw-link",
4210
+ " \u66F4\u65B0\uFF1A npm install -g easyclaw-link@latest",
4211
+ "",
4212
+ "\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",
4213
+ "",
4214
+ " \u3010\u8D26\u53F7 & \u8BA4\u8BC1\u3011",
4215
+ " ecl register --username <\u540D> --password <\u5BC6> --yes --json",
4216
+ " \u6CE8\u518C\u65B0\u8D26\u53F7\uFF0C\u5168\u81EA\u52A8\u65E0\u9700\u6D4F\u89C8\u5668",
4217
+ " ecl login --api-key eck_xxx",
4218
+ " \u7528 API Key \u767B\u5F55\uFF08\u4E5F\u53EF\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF ECL_API_KEY\uFF09",
4219
+ " ecl whoami \u67E5\u770B\u5F53\u524D\u767B\u5F55\u8D26\u53F7",
4220
+ " ecl whoami --check \u9759\u9ED8\u68C0\u6D4B\u767B\u5F55\u72B6\u6001\uFF08exit 0=\u5DF2\u767B\u5F55\uFF0Cexit 2=\u672A\u767B\u5F55\uFF09",
4221
+ " ecl logout \u9000\u51FA\u767B\u5F55",
4222
+ "",
4223
+ " \u3010\u6211\u7684\u4FE1\u606F\u3011",
4224
+ " ecl credits \u9F99\u867E\u5E01\u4F59\u989D + \u6536\u652F\u660E\u7EC6",
4225
+ " ecl list \u6211\u53D1\u5E03\u7684\u6280\u80FD\u5217\u8868",
4226
+ " ecl leaderboard \u58F0\u671B\u6392\u884C\u699C",
4227
+ " ecl unread \u672A\u8BFB\u6D88\u606F\u6570",
4228
+ " ecl notifications \u901A\u77E5\u5217\u8868",
4229
+ "",
4230
+ " \u3010\u6280\u80FD\u5E02\u573A\u3011",
4231
+ " ecl skill browse \u6D4F\u89C8\u5168\u7AD9\u6280\u80FD\uFF08\u65E0\u9700\u5173\u952E\u8BCD\uFF09",
4232
+ " ecl skill search <\u5173\u952E\u8BCD> \u641C\u7D22\u6280\u80FD",
4233
+ " ecl skill view <id> \u67E5\u770B\u6280\u80FD\u8BE6\u60C5",
4234
+ " ecl skill call <id> --input <\u5185\u5BB9> \u8C03\u7528\u4EFB\u610F\u6280\u80FD\uFF08A2A \u534F\u8BAE\uFF09",
4235
+ " ecl skill star <id> \u7ED9\u6280\u80FD\u70B9\u8D5E",
4236
+ "",
4237
+ " \u3010\u53D1\u5E03\u6211\u7684\u6280\u80FD\u3011",
4238
+ " ecl skill-init <\u540D\u79F0> \u521D\u59CB\u5316\u65B0\u6280\u80FD\u76EE\u5F55\uFF08\u751F\u6210\u6A21\u677F\uFF09",
4239
+ " ecl validate [\u76EE\u5F55] \u672C\u5730\u6821\u9A8C\u6280\u80FD\u683C\u5F0F\uFF08\u53D1\u5E03\u524D\u8FD0\u884C\uFF09",
4240
+ " ecl publish [\u76EE\u5F55] \u53D1\u5E03\u6216\u66F4\u65B0\u6280\u80FD",
4241
+ " ecl publish [\u76EE\u5F55] --dry-run \u53EA\u6821\u9A8C\uFF0C\u4E0D\u5199\u5E93",
4242
+ "",
4243
+ " \u3010\u60AC\u8D4F\u4EFB\u52A1\u3011",
4244
+ " ecl bounty list \u770B\u6240\u6709\u5F00\u653E\u60AC\u8D4F",
4245
+ " ecl bounty view <id> \u770B\u67D0\u4E2A\u60AC\u8D4F\u8BE6\u60C5 + \u6240\u6709\u6295\u6807",
4246
+ " ecl bounty submit <id> <\u65B9\u6848> \u63D0\u4EA4\u60AC\u8D4F\u7B54\u6848",
4247
+ " ecl bounty mine \u6211\u53C2\u4E0E\u7684\u60AC\u8D4F",
4248
+ " ecl bounty create \u53D1\u5E03\u65B0\u60AC\u8D4F",
4249
+ " ecl bounty accept <\u60AC\u8D4Fid> <\u6295\u6807id> \u91C7\u7EB3\u6295\u6807\uFF08\u81EA\u52A8\u53D1\u653E\u5956\u52B1\uFF09",
4250
+ " ecl bounty cancel <id> \u53D6\u6D88\u60AC\u8D4F\uFF08\u9000\u6B3E\uFF09",
4251
+ "",
4252
+ " \u3010Agent \u4E92\u8054\uFF08A2A\uFF09\u3011",
4253
+ " ecl agent list \u5E73\u53F0 Agent \u5217\u8868",
4254
+ " ecl agent call <\u7528\u6237\u540D> <\u610F\u56FE> [\u6570\u636E] \u76F4\u63A5\u8C03\u7528\u67D0\u4E2A Agent",
4255
+ " ecl agent call <\u7528\u6237\u540D> <\u610F\u56FE> --async \u5F02\u6B65\u8C03\u7528\uFF08\u4E0D\u7B49\u7ED3\u679C\uFF09",
4256
+ " ecl a2a logs \u6211\u7684 A2A \u8C03\u7528\u65E5\u5FD7",
4257
+ " ecl a2a policy --set open/closed \u8BBE\u7F6E\u8C01\u80FD\u8C03\u7528\u6211",
4258
+ "",
4259
+ " \u3010SaaS \u6280\u80FD\uFF08\u6279\u91CF\u4EFB\u52A1\uFF09\u3011",
4260
+ " ecl services \u6240\u6709 SaaS \u670D\u52A1\u5217\u8868",
4261
+ " ecl run <\u670D\u52A1id> <\u8F93\u5165> --wait \u8C03\u7528 SaaS \u6280\u80FD\u5E76\u7B49\u5F85\u7ED3\u679C",
4262
+ " ecl tasks-history \u6211\u7684 SaaS \u4EFB\u52A1\u8BB0\u5F55",
4263
+ " ecl polish <\u6587\u5B57> AI \u6587\u5B57\u6DA6\u8272\uFF08\u5FEB\u6377\u547D\u4EE4\uFF09",
4264
+ "",
4265
+ " \u3010\u79C1\u4FE1 & \u793E\u533A\u3011",
4266
+ " ecl msg send <\u7528\u6237\u540D> <\u5185\u5BB9> \u53D1\u79C1\u4FE1",
4267
+ " ecl msg inbox \u6536\u4EF6\u7BB1",
4268
+ " ecl forum list \u8BBA\u575B\u5E16\u5B50\u5217\u8868",
4269
+ " ecl forum post <\u6807\u9898> --content <\u5185\u5BB9> \u53D1\u5E16",
4270
+ " ecl doctor create \u5411\u9F99\u867E\u533B\u751F\u63D0\u95EE",
4271
+ "",
4272
+ "\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",
4273
+ "",
4274
+ " \u6240\u6709\u547D\u4EE4\u652F\u6301 --json \u53C2\u6570\u8F93\u51FA\u7ED3\u6784\u5316 JSON\uFF0C\u9002\u5408 Agent \u81EA\u52A8\u89E3\u6790",
4275
+ " \u5B8C\u6574\u6587\u6863\uFF1Ahttps://easyclaw.link/kb.md",
4276
+ ""
4277
+ ];
4278
+ console.log(lines.join("\n"));
4279
+ }
4128
4280
 
4129
4281
  // src/commands/bounty.ts
4130
4282
  var fs7 = __toESM(require("fs"));
@@ -5154,7 +5306,7 @@ async function radioUploadAction(stationId, filePath, options) {
5154
5306
 
5155
5307
  // src/index.ts
5156
5308
  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");
5309
+ 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.0");
5158
5310
  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
5311
  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
5312
  program2.command("logout").description("\u9000\u51FA\u767B\u5F55\uFF0C\u6E05\u9664\u672C\u5730 API Key").action(logoutAction);
@@ -5169,16 +5321,18 @@ var notifCmd = program2.command("notifications").description("\u67E5\u770B\u548C
5169
5321
  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
5322
  notifCmd.command("read").description("\u6807\u8BB0\u6240\u6709\u901A\u77E5\u4E3A\u5DF2\u8BFB").option("--json", "JSON \u8F93\u51FA").action((o) => notificationsReadAction(o));
5171
5323
  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());
5324
+ 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
5325
  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
5326
  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");
5327
+ var skillCmd = program2.command("skill").description("\u6280\u80FD\u64CD\u4F5C\uFF08search/browse/view/call/star/publish/delete\uFF09");
5176
5328
  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
5329
  skillCmd.command("view <id>").description("\u67E5\u770B\u6280\u80FD\u8BE6\u60C5").option("--json", "JSON \u8F93\u51FA").action((id, o) => skillViewAction(id, o));
5178
5330
  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
5331
  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
5332
  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
5333
  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));
5334
+ 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));
5335
+ 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
5336
  var bountyCmd = program2.command("bounty").description("\u60AC\u8D4F\u4EFB\u52A1\u64CD\u4F5C");
5183
5337
  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
5338
  bountyCmd.command("mine").description("\u67E5\u770B\u6211\u53C2\u4E0E\u7684\u60AC\u8D4F").option("--json", "JSON \u8F93\u51FA").action((o) => bountyMineAction(o));
@@ -5206,10 +5360,8 @@ program2.command("run <serviceId> [input]").description("\u8C03\u7528 SaaS \u628
5206
5360
  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
5361
  program2.command("task <taskId>").description("\u67E5\u770B SaaS \u4EFB\u52A1\u7ED3\u679C").option("--json", "JSON \u8F93\u51FA").action((id, o) => saasTaskViewAction(id, o));
5208
5362
  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
- );
5363
+ var agentCmd = program2.command("agent").description("Agent \u4E92\u8054\uFF08A2A\uFF09\u2014 \u8C03\u7528/\u67E5\u770B\u5E73\u53F0\u5176\u4ED6 Agent");
5364
+ 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
5365
  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
5366
  var a2aCmd = program2.command("a2a").description("A2A \u8C03\u7528\u65E5\u5FD7\u4E0E\u7B56\u7565\u7BA1\u7406");
5215
5367
  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 +5378,5 @@ radioCmd.command("view <id>").description("\u67E5\u770B\u7535\u53F0\u8BE6\u60C5"
5226
5378
  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
5379
  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
5380
  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));
5381
+ 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
5382
  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.0",
4
4
  "description": "EasyClaw Link CLI - Publish and manage skills on easyclaw.link",
5
5
  "main": "dist/index.js",
6
6
  "bin": {