@heurist-network/skills 0.1.1 → 0.1.3

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 +1 -1
  2. package/dist/cli.js +195 -60
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -160,7 +160,7 @@ These features are unique to the Heurist marketplace and not present in other sk
160
160
 
161
161
  | Variable | Description |
162
162
  |----------|-------------|
163
- | `HEURIST_SKILLS_API` | Override marketplace API URL (default: `https://mesh.heurist.ai`) |
163
+ | `HEURIST_SKILLS_API` | Override marketplace API URL (default: `https://mesh.heurist.xyz`) |
164
164
 
165
165
  ## Lock File Compatibility
166
166
 
package/dist/cli.js CHANGED
@@ -75,7 +75,7 @@ var DEFAULT_API_URL;
75
75
  var init_api = __esm({
76
76
  "src/api.ts"() {
77
77
  "use strict";
78
- DEFAULT_API_URL = "https://mesh.heurist.ai";
78
+ DEFAULT_API_URL = "https://mesh.heurist.xyz";
79
79
  }
80
80
  });
81
81
 
@@ -588,25 +588,30 @@ async function addCommand(args) {
588
588
  slug = await interactiveSearch();
589
589
  if (!slug) return;
590
590
  }
591
- const spinner5 = p.spinner();
592
- spinner5.start(`Fetching skill info for ${pc.cyan(slug)}`);
591
+ const spinner6 = p.spinner();
592
+ spinner6.start(`Fetching skill info for ${pc.cyan(slug)}`);
593
593
  let detail;
594
594
  try {
595
595
  detail = await getSkill(slug);
596
596
  } catch (err) {
597
- spinner5.stop("Skill lookup failed.");
597
+ spinner6.stop("Skill lookup failed.");
598
598
  if (err instanceof Error && err.message.includes("API error 404")) {
599
599
  throw new Error(`Skill ${slug} not found.`);
600
600
  }
601
601
  throw err;
602
602
  }
603
603
  if (detail.verification_status !== "verified") {
604
- spinner5.stop(
604
+ spinner6.stop(
605
605
  `Skill ${pc.red(slug)} is ${pc.yellow(detail.verification_status)} and cannot be installed.`
606
606
  );
607
607
  throw new Error("Only verified skills can be installed.");
608
608
  }
609
- spinner5.stop(`Found: ${pc.cyan(detail.name)} \u2014 ${detail.description}`);
609
+ spinner6.stop(`Found: ${pc.cyan(detail.name)} \u2014 ${detail.description}`);
610
+ if (detail.external_api_dependencies.length > 0) {
611
+ p.log.info(
612
+ `External APIs: ${pc.dim(detail.external_api_dependencies.join(", "))}`
613
+ );
614
+ }
610
615
  const warnings = getCapabilityWarnings(detail.capabilities);
611
616
  if (warnings.length > 0) {
612
617
  p.log.warn(
@@ -653,12 +658,12 @@ async function addCommand(args) {
653
658
  if (existing) {
654
659
  await cleanupLockEntry(existing);
655
660
  }
656
- spinner5.start(`Downloading ${pc.cyan(slug)}`);
661
+ spinner6.start(`Downloading ${pc.cyan(slug)}`);
657
662
  const download = await downloadSkill(slug);
658
- spinner5.stop(
663
+ spinner6.stop(
659
664
  `Downloaded ${pc.green(download.filename)} (${formatBytes(download.content.length)})`
660
665
  );
661
- spinner5.start(`Installing to ${scope} scope`);
666
+ spinner6.start(`Installing to ${scope} scope`);
662
667
  const installResult = await installDownloadedSkill({
663
668
  scope,
664
669
  slug,
@@ -667,7 +672,7 @@ async function addCommand(args) {
667
672
  agents: targetAgents,
668
673
  mode: installMode
669
674
  });
670
- spinner5.stop(`Installed to ${pc.dim(installResult.canonicalPath)}`);
675
+ spinner6.stop(`Installed to ${pc.dim(installResult.canonicalPath)}`);
671
676
  upsertLockEntry(scope, {
672
677
  slug,
673
678
  name: detail.name,
@@ -852,10 +857,10 @@ async function interactiveSearch() {
852
857
  placeholder: "e.g. defi, swap, analytics"
853
858
  });
854
859
  if (typeof searchTerm === "symbol" || !searchTerm) return void 0;
855
- const spinner5 = p.spinner();
856
- spinner5.start("Searching marketplace...");
860
+ const spinner6 = p.spinner();
861
+ spinner6.start("Searching marketplace...");
857
862
  const result = await listSkills({ search: searchTerm, limit: 20 });
858
- spinner5.stop(`Found ${result.skills.length} skill(s).`);
863
+ spinner6.stop(`Found ${result.skills.length} skill(s).`);
859
864
  if (result.skills.length === 0) {
860
865
  p.log.warn("No skills found matching that query.");
861
866
  return void 0;
@@ -1113,7 +1118,7 @@ import * as p3 from "@clack/prompts";
1113
1118
  import pc3 from "picocolors";
1114
1119
  async function listCommand(args) {
1115
1120
  const options = parseListOptions(args);
1116
- if (options.showRemote) {
1121
+ if (options.showRemote || options.search || options.category) {
1117
1122
  await listRemote(options);
1118
1123
  return;
1119
1124
  }
@@ -1194,14 +1199,14 @@ async function listLocal(scope, agentFilter) {
1194
1199
  }
1195
1200
  }
1196
1201
  async function listRemote(options) {
1197
- const spinner5 = p3.spinner();
1198
- spinner5.start("Fetching skills from marketplace...");
1202
+ const spinner6 = p3.spinner();
1203
+ spinner6.start("Fetching skills from marketplace...");
1199
1204
  const result = await listSkills({
1200
1205
  category: options.category || void 0,
1201
1206
  search: options.search || void 0,
1202
1207
  limit: 50
1203
1208
  });
1204
- spinner5.stop(`Showing ${result.skills.length} verified skill(s).`);
1209
+ spinner6.stop(`Showing ${result.skills.length} verified skill(s).`);
1205
1210
  if (result.skills.length === 0) {
1206
1211
  p3.log.warn("No skills found.");
1207
1212
  return;
@@ -1212,7 +1217,8 @@ async function listRemote(options) {
1212
1217
  const status = installed.has(skill.slug) ? pc3.green(" [installed]") : "";
1213
1218
  const category = skill.category ? pc3.dim(` [${skill.category}]`) : "";
1214
1219
  const risk = skill.risk_tier ? pc3.dim(` risk:${skill.risk_tier}`) : "";
1215
- console.log(` ${pc3.cyan(skill.slug)}${category}${risk}${status}`);
1220
+ const externalApis = skill.external_api_dependencies.length > 0 ? pc3.dim(` apis:${skill.external_api_dependencies.join(", ")}`) : "";
1221
+ console.log(` ${pc3.cyan(skill.slug)}${category}${risk}${externalApis}${status}`);
1216
1222
  console.log(` ${skill.description}`);
1217
1223
  const warnings = [];
1218
1224
  if (skill.capabilities.requires_private_keys) warnings.push("private-keys");
@@ -1303,20 +1309,20 @@ async function infoCommand(args) {
1303
1309
  p4.log.error("Usage: heurist-skills info <slug>");
1304
1310
  return;
1305
1311
  }
1306
- const spinner5 = p4.spinner();
1307
- spinner5.start(`Fetching info for ${pc4.cyan(slug)}`);
1312
+ const spinner6 = p4.spinner();
1313
+ spinner6.start(`Fetching info for ${pc4.cyan(slug)}`);
1308
1314
  let detail;
1309
1315
  try {
1310
1316
  detail = await getSkill(slug);
1311
1317
  } catch (err) {
1312
1318
  if (err instanceof Error && err.message.includes("API error 404")) {
1313
- spinner5.stop(`Skill ${pc4.red(slug)} not found.`);
1319
+ spinner6.stop(`Skill ${pc4.red(slug)} not found.`);
1314
1320
  throw new Error(`Skill ${slug} not found.`);
1315
1321
  }
1316
- spinner5.stop(`Failed to fetch info for ${pc4.cyan(slug)}.`);
1322
+ spinner6.stop(`Failed to fetch info for ${pc4.cyan(slug)}.`);
1317
1323
  throw err;
1318
1324
  }
1319
- spinner5.stop(`${pc4.bold(detail.slug)}`);
1325
+ spinner6.stop(`${pc4.bold(detail.slug)}`);
1320
1326
  console.log();
1321
1327
  console.log(` ${pc4.bold("Name:")} ${detail.name}`);
1322
1328
  console.log(` ${pc4.bold("Slug:")} ${detail.slug}`);
@@ -1325,6 +1331,9 @@ async function infoCommand(args) {
1325
1331
  console.log(` ${pc4.bold("Risk Tier:")} ${detail.risk_tier || "\u2014"}`);
1326
1332
  console.log(` ${pc4.bold("Status:")} ${detail.verification_status}`);
1327
1333
  console.log(` ${pc4.bold("Source:")} ${detail.source_url || "\u2014"}`);
1334
+ if (detail.external_api_dependencies.length > 0) {
1335
+ console.log(` ${pc4.bold("External APIs:")} ${detail.external_api_dependencies.join(", ")}`);
1336
+ }
1328
1337
  if (detail.author?.display_name) {
1329
1338
  console.log(` ${pc4.bold("Author:")} ${detail.author.display_name}`);
1330
1339
  }
@@ -1399,8 +1408,8 @@ async function checkUpdatesCommand(_args) {
1399
1408
  p5.log.info("No skills installed. Nothing to check.");
1400
1409
  return;
1401
1410
  }
1402
- const spinner5 = p5.spinner();
1403
- spinner5.start(
1411
+ const spinner6 = p5.spinner();
1412
+ spinner6.start(
1404
1413
  `Checking updates for ${installed.length} installed skill(s)...`
1405
1414
  );
1406
1415
  const uniqueInstalled = Array.from(
@@ -1420,10 +1429,10 @@ async function checkUpdatesCommand(_args) {
1420
1429
  return approvedSha && approvedSha !== entry.sha256;
1421
1430
  });
1422
1431
  if (outdated.length === 0) {
1423
- spinner5.stop(pc5.green("All skills are up to date."));
1432
+ spinner6.stop(pc5.green("All skills are up to date."));
1424
1433
  return;
1425
1434
  }
1426
- spinner5.stop(pc5.yellow(`${outdated.length} update(s) available:`));
1435
+ spinner6.stop(pc5.yellow(`${outdated.length} update(s) available:`));
1427
1436
  console.log();
1428
1437
  for (const entry of outdated) {
1429
1438
  const approvedSha = updatesBySlug.get(entry.slug) || "unknown";
@@ -1444,45 +1453,165 @@ var init_check_updates = __esm({
1444
1453
  }
1445
1454
  });
1446
1455
 
1447
- // src/cli.ts
1448
- import "dotenv/config";
1456
+ // src/commands/update.ts
1457
+ var update_exports = {};
1458
+ __export(update_exports, {
1459
+ updateCommand: () => updateCommand
1460
+ });
1449
1461
  import * as p6 from "@clack/prompts";
1450
1462
  import pc6 from "picocolors";
1463
+ async function updateCommand(_args) {
1464
+ const installed = getInstalledEntries("all");
1465
+ if (installed.length === 0) {
1466
+ p6.log.info("No skills installed. Nothing to update.");
1467
+ return;
1468
+ }
1469
+ const spinner6 = p6.spinner();
1470
+ spinner6.start(
1471
+ `Checking updates for ${installed.length} installed skill(s)...`
1472
+ );
1473
+ const uniqueInstalled = Array.from(
1474
+ new Map(
1475
+ installed.map((entry) => [
1476
+ `${entry.slug}:${entry.sha256}`,
1477
+ { slug: entry.slug, sha256: entry.sha256 }
1478
+ ])
1479
+ ).values()
1480
+ );
1481
+ let updates;
1482
+ try {
1483
+ updates = await checkUpdates(uniqueInstalled);
1484
+ } catch (err) {
1485
+ spinner6.stop("Failed to check for updates.");
1486
+ throw err;
1487
+ }
1488
+ const updatesBySlug = new Map(
1489
+ updates.map((update) => [update.slug, update.approved_sha256])
1490
+ );
1491
+ const outdated = installed.filter((entry) => {
1492
+ const approvedSha = updatesBySlug.get(entry.slug);
1493
+ return approvedSha && approvedSha !== entry.sha256;
1494
+ });
1495
+ if (outdated.length === 0) {
1496
+ spinner6.stop(pc6.green("All skills are up to date."));
1497
+ return;
1498
+ }
1499
+ spinner6.stop(pc6.yellow(`${outdated.length} update(s) available:`));
1500
+ console.log();
1501
+ for (const entry of outdated) {
1502
+ const approvedSha = updatesBySlug.get(entry.slug) || "unknown";
1503
+ console.log(` ${pc6.cyan(entry.slug)} ${pc6.dim(`[${entry.scope}]`)}`);
1504
+ console.log(` current: ${pc6.dim(entry.sha256.slice(0, 16))}...`);
1505
+ console.log(` latest: ${pc6.dim(approvedSha.slice(0, 16))}...`);
1506
+ console.log();
1507
+ }
1508
+ let successCount = 0;
1509
+ let failCount = 0;
1510
+ for (const entry of outdated) {
1511
+ const targetAgents = Object.keys(entry.agent_installs);
1512
+ const scope = entry.scope;
1513
+ const installMode = entry.install_method;
1514
+ p6.log.info(`Updating ${pc6.cyan(entry.slug)}...`);
1515
+ try {
1516
+ await cleanupEntry(entry);
1517
+ const download = await downloadSkill(entry.slug);
1518
+ const installResult = await installDownloadedSkill({
1519
+ scope,
1520
+ slug: entry.slug,
1521
+ content: download.content,
1522
+ isZip: download.isZip,
1523
+ agents: targetAgents,
1524
+ mode: installMode
1525
+ });
1526
+ upsertLockEntry(scope, {
1527
+ slug: entry.slug,
1528
+ name: entry.name,
1529
+ sha256: download.sha256,
1530
+ installed_at: entry.installed_at,
1531
+ is_zip: download.isZip,
1532
+ install_method: installMode,
1533
+ canonical_path: installResult.canonicalPath,
1534
+ agent_installs: installResult.agentInstalls
1535
+ });
1536
+ p6.log.success(`${pc6.green("\u2713")} ${pc6.bold(entry.slug)} updated.`);
1537
+ successCount++;
1538
+ } catch (err) {
1539
+ p6.log.error(
1540
+ `Failed to update ${entry.slug}: ${err.message}`
1541
+ );
1542
+ failCount++;
1543
+ }
1544
+ }
1545
+ console.log();
1546
+ if (successCount > 0) {
1547
+ p6.log.success(`Updated ${successCount} skill(s).`);
1548
+ }
1549
+ if (failCount > 0) {
1550
+ p6.log.warn(`Failed to update ${failCount} skill(s).`);
1551
+ }
1552
+ }
1553
+ async function cleanupEntry(entry) {
1554
+ const paths = /* @__PURE__ */ new Set();
1555
+ paths.add(entry.canonical_path);
1556
+ for (const install of Object.values(entry.agent_installs)) {
1557
+ if (install?.path) {
1558
+ paths.add(install.path);
1559
+ }
1560
+ }
1561
+ for (const path of paths) {
1562
+ await removePathIfExists(path);
1563
+ }
1564
+ }
1565
+ var init_update = __esm({
1566
+ "src/commands/update.ts"() {
1567
+ "use strict";
1568
+ init_api();
1569
+ init_agents();
1570
+ init_installer();
1571
+ init_lock();
1572
+ }
1573
+ });
1574
+
1575
+ // src/cli.ts
1576
+ import "dotenv/config";
1577
+ import * as p7 from "@clack/prompts";
1578
+ import pc7 from "picocolors";
1451
1579
  var VERSION = "0.1.0";
1452
1580
  var LOGO = `
1453
- ${pc6.cyan("\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1454
- ${pc6.cyan("\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1455
- ${pc6.cyan("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")}
1456
- ${pc6.cyan("\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551")}
1457
- ${pc6.cyan("\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551")}
1458
- ${pc6.cyan("\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")}
1459
- ${pc6.dim(` skills v${VERSION}`)}
1581
+ ${pc7.cyan("\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")}
1582
+ ${pc7.cyan("\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D")}
1583
+ ${pc7.cyan("\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551")}
1584
+ ${pc7.cyan("\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D \u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551\u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551")}
1585
+ ${pc7.cyan("\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551")}
1586
+ ${pc7.cyan("\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D")}
1587
+ ${pc7.dim(` skills v${VERSION}`)}
1460
1588
  `;
1461
1589
  function printHelp() {
1462
1590
  console.log(LOGO);
1463
- console.log(`${pc6.bold("Usage:")} heurist-skills <command> [options]`);
1591
+ console.log(`${pc7.bold("Usage:")} heurist-skills <command> [options]`);
1464
1592
  console.log();
1465
- console.log(`${pc6.bold("Commands:")}`);
1466
- console.log(` ${pc6.cyan("add")} <slug> Install a skill from the marketplace (aliases: install)`);
1467
- console.log(` ${pc6.cyan("remove")} <slug> Uninstall a skill (aliases: rm, uninstall)`);
1468
- console.log(` ${pc6.cyan("list")} List project-installed skills (aliases: ls)`);
1469
- console.log(` ${pc6.cyan("list")} --global List global-installed skills`);
1470
- console.log(` ${pc6.cyan("find")} [query] Search the skill marketplace (aliases: search, f)`);
1471
- console.log(` ${pc6.cyan("info")} <slug> Show detailed skill info (aliases: show)`);
1472
- console.log(` ${pc6.cyan("check")} Check for available updates (aliases: check-updates, update-check)`);
1473
- console.log(` ${pc6.cyan("help")} Show this help`);
1593
+ console.log(`${pc7.bold("Commands:")}`);
1594
+ console.log(` ${pc7.cyan("add")} <slug> Install a skill from the marketplace (aliases: install)`);
1595
+ console.log(` ${pc7.cyan("remove")} <slug> Uninstall a skill (aliases: rm, uninstall)`);
1596
+ console.log(` ${pc7.cyan("list")} List project-installed skills (aliases: ls)`);
1597
+ console.log(` ${pc7.cyan("list")} --global List global-installed skills`);
1598
+ console.log(` ${pc7.cyan("find")} [query] Search the skill marketplace (aliases: search, f)`);
1599
+ console.log(` ${pc7.cyan("info")} <slug> Show detailed skill info (aliases: show)`);
1600
+ console.log(` ${pc7.cyan("check")} Check for available updates (aliases: check-updates, update-check)`);
1601
+ console.log(` ${pc7.cyan("update")} Update all installed skills (aliases: upgrade)`);
1602
+ console.log(` ${pc7.cyan("help")} Show this help`);
1474
1603
  console.log();
1475
- console.log(`${pc6.bold("Options:")}`);
1476
- console.log(` ${pc6.dim("-g, --global")} Use the global scope (~/.agents/skills/)`);
1477
- console.log(` ${pc6.dim("-a, --agent <agent>")} Target or filter specific agents`);
1478
- console.log(` ${pc6.dim("--copy")} Copy files instead of symlinking`);
1479
- console.log(` ${pc6.dim("-y, --yes")} Skip confirmation prompts`);
1480
- console.log(` ${pc6.dim("--category, -c")} Filter by category (use with find/list --remote)`);
1481
- console.log(` ${pc6.dim("--search, -s")} Filter by search term (use with list --remote)`);
1604
+ console.log(`${pc7.bold("Options:")}`);
1605
+ console.log(` ${pc7.dim("-g, --global")} Use the global scope (~/.agents/skills/)`);
1606
+ console.log(` ${pc7.dim("-a, --agent <agent>")} Target or filter specific agents`);
1607
+ console.log(` ${pc7.dim("--copy")} Copy files instead of symlinking`);
1608
+ console.log(` ${pc7.dim("-y, --yes")} Skip confirmation prompts`);
1609
+ console.log(` ${pc7.dim("--category, -c")} Filter by category (use with find/list --remote)`);
1610
+ console.log(` ${pc7.dim("--search, -s")} Filter by search term (use with list --remote)`);
1482
1611
  console.log();
1483
- console.log(`${pc6.bold("Environment:")}`);
1484
- console.log(` ${pc6.dim("HEURIST_SKILLS_API")} Override marketplace API URL`);
1485
- console.log(` ${pc6.dim("(default: https://mesh.heurist.ai)")}`);
1612
+ console.log(`${pc7.bold("Environment:")}`);
1613
+ console.log(` ${pc7.dim("HEURIST_SKILLS_API")} Override marketplace API URL`);
1614
+ console.log(` ${pc7.dim("(default: https://mesh.heurist.xyz)")}`);
1486
1615
  console.log();
1487
1616
  }
1488
1617
  async function main() {
@@ -1497,7 +1626,7 @@ async function main() {
1497
1626
  console.log(VERSION);
1498
1627
  return;
1499
1628
  }
1500
- p6.intro(pc6.cyan("heurist-skills"));
1629
+ p7.intro(pc7.cyan("heurist-skills"));
1501
1630
  try {
1502
1631
  switch (command) {
1503
1632
  case "add":
@@ -1539,16 +1668,22 @@ async function main() {
1539
1668
  await checkUpdatesCommand2(commandArgs);
1540
1669
  break;
1541
1670
  }
1671
+ case "update":
1672
+ case "upgrade": {
1673
+ const { updateCommand: updateCommand2 } = await Promise.resolve().then(() => (init_update(), update_exports));
1674
+ await updateCommand2(commandArgs);
1675
+ break;
1676
+ }
1542
1677
  default:
1543
- p6.log.error(`Unknown command: ${pc6.red(command)}`);
1678
+ p7.log.error(`Unknown command: ${pc7.red(command)}`);
1544
1679
  console.log();
1545
1680
  printHelp();
1546
1681
  process.exit(1);
1547
1682
  }
1548
1683
  } catch (err) {
1549
- p6.log.error(err.message);
1684
+ p7.log.error(err.message);
1550
1685
  process.exit(1);
1551
1686
  }
1552
- p6.outro(pc6.dim("Done."));
1687
+ p7.outro(pc7.dim("Done."));
1553
1688
  }
1554
1689
  main();
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@heurist-network/skills",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "CLI tool for browsing, installing, and managing Heurist Mesh skills from the skill marketplace registry.",
5
5
  "type": "module",
6
6
  "bin": {
7
- "heurist-skills": "./bin/cli.mjs"
7
+ "heurist-skills": "bin/cli.mjs"
8
8
  },
9
9
  "files": [
10
10
  "dist",