@bud-fe/skills 0.0.3 → 0.0.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.
@@ -1,5 +1,5 @@
1
- import path from "path";
2
1
  import os from "os";
2
+ import path from "path";
3
3
  const homeDirectory = os.homedir();
4
4
  const { env } = process;
5
5
  const xdgData = env.XDG_DATA_HOME || (homeDirectory ? path.join(homeDirectory, ".local", "share") : void 0);
package/dist/cli.mjs CHANGED
@@ -9,17 +9,17 @@ import "./_chunks/libs/esprima.mjs";
9
9
  import "./_chunks/libs/@kwsites/file-exists.mjs";
10
10
  import "./_chunks/libs/@kwsites/promise-deferred.mjs";
11
11
  import { t as esm_default } from "./_chunks/libs/simple-git.mjs";
12
- import { execSync, spawn, spawnSync } from "child_process";
12
+ import { execSync, spawnSync } from "child_process";
13
13
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
14
- import { basename, dirname, extname, isAbsolute, join, normalize, relative, resolve, sep } from "path";
15
14
  import { homedir, platform, tmpdir } from "os";
16
- import { createHash } from "crypto";
15
+ import { basename, dirname, extname, isAbsolute, join, normalize, relative, resolve, sep } from "path";
17
16
  import { fileURLToPath } from "url";
18
17
  import { access, cp, lstat, mkdir, mkdtemp, readFile, readdir, readlink, realpath, rm, stat, symlink, writeFile } from "fs/promises";
18
+ import { createHash } from "crypto";
19
19
  import * as readline from "readline";
20
20
  import { Writable } from "stream";
21
21
  var import_picocolors = /* @__PURE__ */ __toESM(require_picocolors(), 1);
22
- var version$1 = "0.0.3";
22
+ var version$1 = "0.0.4";
23
23
  const home = homedir();
24
24
  const configHome = xdgConfig ?? join(home, ".config");
25
25
  const codexHome = process.env.CODEX_HOME?.trim() || join(home, ".codex");
@@ -1297,6 +1297,72 @@ async function listInstalledSkills(options = {}) {
1297
1297
  } catch {}
1298
1298
  return Array.from(skillsMap.values());
1299
1299
  }
1300
+ const LOCAL_LOCK_FILE = "skills-lock.json";
1301
+ const CURRENT_VERSION$1 = 1;
1302
+ function getLocalLockPath(cwd) {
1303
+ return join(cwd || process.cwd(), LOCAL_LOCK_FILE);
1304
+ }
1305
+ async function readLocalLock(cwd) {
1306
+ const lockPath = getLocalLockPath(cwd);
1307
+ try {
1308
+ const content = await readFile(lockPath, "utf-8");
1309
+ const parsed = JSON.parse(content);
1310
+ if (typeof parsed.version !== "number" || !parsed.skills) return createEmptyLocalLock();
1311
+ if (parsed.version < CURRENT_VERSION$1) return createEmptyLocalLock();
1312
+ return parsed;
1313
+ } catch {
1314
+ return createEmptyLocalLock();
1315
+ }
1316
+ }
1317
+ async function writeLocalLock(lock, cwd) {
1318
+ const lockPath = getLocalLockPath(cwd);
1319
+ const sortedSkills = {};
1320
+ for (const key of Object.keys(lock.skills).sort()) sortedSkills[key] = lock.skills[key];
1321
+ const sorted = {
1322
+ version: lock.version,
1323
+ skills: sortedSkills
1324
+ };
1325
+ await writeFile(lockPath, JSON.stringify(sorted, null, 2) + "\n", "utf-8");
1326
+ }
1327
+ async function computeSkillFolderHash(skillDir) {
1328
+ const files = [];
1329
+ await collectFiles(skillDir, skillDir, files);
1330
+ files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
1331
+ const hash = createHash("sha256");
1332
+ for (const file of files) {
1333
+ hash.update(file.relativePath);
1334
+ hash.update(file.content);
1335
+ }
1336
+ return hash.digest("hex");
1337
+ }
1338
+ async function collectFiles(baseDir, currentDir, results) {
1339
+ const entries = await readdir(currentDir, { withFileTypes: true });
1340
+ await Promise.all(entries.map(async (entry) => {
1341
+ const fullPath = join(currentDir, entry.name);
1342
+ if (entry.isDirectory()) {
1343
+ if (entry.name === ".git" || entry.name === "node_modules") return;
1344
+ await collectFiles(baseDir, fullPath, results);
1345
+ } else if (entry.isFile()) {
1346
+ const content = await readFile(fullPath);
1347
+ const relativePath = relative(baseDir, fullPath).split("\\").join("/");
1348
+ results.push({
1349
+ relativePath,
1350
+ content
1351
+ });
1352
+ }
1353
+ }));
1354
+ }
1355
+ async function addSkillToLocalLock(skillName, entry, cwd) {
1356
+ const lock = await readLocalLock(cwd);
1357
+ lock.skills[skillName] = entry;
1358
+ await writeLocalLock(lock, cwd);
1359
+ }
1360
+ function createEmptyLocalLock() {
1361
+ return {
1362
+ version: CURRENT_VERSION$1,
1363
+ skills: {}
1364
+ };
1365
+ }
1300
1366
  async function fetchMintlifySkill(url) {
1301
1367
  try {
1302
1368
  const response = await fetch(url, { signal: AbortSignal.timeout(3e4) });
@@ -1772,7 +1838,7 @@ registerProvider(mintlifyProvider);
1772
1838
  registerProvider(huggingFaceProvider);
1773
1839
  const AGENTS_DIR$1 = ".agents";
1774
1840
  const LOCK_FILE$1 = ".skill-lock.json";
1775
- const CURRENT_VERSION$1 = 3;
1841
+ const CURRENT_VERSION = 3;
1776
1842
  function getSkillLockPath$1() {
1777
1843
  return join(homedir(), AGENTS_DIR$1, LOCK_FILE$1);
1778
1844
  }
@@ -1782,7 +1848,7 @@ async function readSkillLock$1() {
1782
1848
  const content = await readFile(lockPath, "utf-8");
1783
1849
  const parsed = JSON.parse(content);
1784
1850
  if (typeof parsed.version !== "number" || !parsed.skills) return createEmptyLockFile();
1785
- if (parsed.version < CURRENT_VERSION$1) return createEmptyLockFile();
1851
+ if (parsed.version < CURRENT_VERSION) return createEmptyLockFile();
1786
1852
  return parsed;
1787
1853
  } catch (error) {
1788
1854
  return createEmptyLockFile();
@@ -1855,7 +1921,7 @@ async function getSkillFromLock(skillName) {
1855
1921
  }
1856
1922
  function createEmptyLockFile() {
1857
1923
  return {
1858
- version: CURRENT_VERSION$1,
1924
+ version: CURRENT_VERSION,
1859
1925
  skills: {},
1860
1926
  dismissed: {}
1861
1927
  };
@@ -1877,72 +1943,6 @@ async function saveSelectedAgents(agents) {
1877
1943
  lock.lastSelectedAgents = agents;
1878
1944
  await writeSkillLock(lock);
1879
1945
  }
1880
- const LOCAL_LOCK_FILE = "skills-lock.json";
1881
- const CURRENT_VERSION = 1;
1882
- function getLocalLockPath(cwd) {
1883
- return join(cwd || process.cwd(), LOCAL_LOCK_FILE);
1884
- }
1885
- async function readLocalLock(cwd) {
1886
- const lockPath = getLocalLockPath(cwd);
1887
- try {
1888
- const content = await readFile(lockPath, "utf-8");
1889
- const parsed = JSON.parse(content);
1890
- if (typeof parsed.version !== "number" || !parsed.skills) return createEmptyLocalLock();
1891
- if (parsed.version < CURRENT_VERSION) return createEmptyLocalLock();
1892
- return parsed;
1893
- } catch {
1894
- return createEmptyLocalLock();
1895
- }
1896
- }
1897
- async function writeLocalLock(lock, cwd) {
1898
- const lockPath = getLocalLockPath(cwd);
1899
- const sortedSkills = {};
1900
- for (const key of Object.keys(lock.skills).sort()) sortedSkills[key] = lock.skills[key];
1901
- const sorted = {
1902
- version: lock.version,
1903
- skills: sortedSkills
1904
- };
1905
- await writeFile(lockPath, JSON.stringify(sorted, null, 2) + "\n", "utf-8");
1906
- }
1907
- async function computeSkillFolderHash(skillDir) {
1908
- const files = [];
1909
- await collectFiles(skillDir, skillDir, files);
1910
- files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
1911
- const hash = createHash("sha256");
1912
- for (const file of files) {
1913
- hash.update(file.relativePath);
1914
- hash.update(file.content);
1915
- }
1916
- return hash.digest("hex");
1917
- }
1918
- async function collectFiles(baseDir, currentDir, results) {
1919
- const entries = await readdir(currentDir, { withFileTypes: true });
1920
- await Promise.all(entries.map(async (entry) => {
1921
- const fullPath = join(currentDir, entry.name);
1922
- if (entry.isDirectory()) {
1923
- if (entry.name === ".git" || entry.name === "node_modules") return;
1924
- await collectFiles(baseDir, fullPath, results);
1925
- } else if (entry.isFile()) {
1926
- const content = await readFile(fullPath);
1927
- const relativePath = relative(baseDir, fullPath).split("\\").join("/");
1928
- results.push({
1929
- relativePath,
1930
- content
1931
- });
1932
- }
1933
- }));
1934
- }
1935
- async function addSkillToLocalLock(skillName, entry, cwd) {
1936
- const lock = await readLocalLock(cwd);
1937
- lock.skills[skillName] = entry;
1938
- await writeLocalLock(lock, cwd);
1939
- }
1940
- function createEmptyLocalLock() {
1941
- return {
1942
- version: CURRENT_VERSION,
1943
- skills: {}
1944
- };
1945
- }
1946
1946
  function getOwnerRepo(parsed) {
1947
1947
  if (parsed.type === "local") return null;
1948
1948
  if (!parsed.url.startsWith("http://") && !parsed.url.startsWith("https://")) return null;
@@ -2075,8 +2075,7 @@ function parseSource(input) {
2075
2075
  url: input
2076
2076
  };
2077
2077
  if (input.match(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/i) && !input.includes("/") && !input.includes(":") && !input.startsWith(".")) return {
2078
- type: "github",
2079
- url: DEFAULT_REGISTRY_URL,
2078
+ ...parseSource(DEFAULT_REGISTRY_URL),
2080
2079
  subpath: DEFAULT_REGISTRY_SUBPATH,
2081
2080
  skillFilter: input
2082
2081
  };
@@ -3057,12 +3056,12 @@ async function runAdd(args, options = {}) {
3057
3056
  console.log(import_picocolors.default.bgRed(import_picocolors.default.white(import_picocolors.default.bold(" ERROR "))) + " " + import_picocolors.default.red("Missing required argument: source"));
3058
3057
  console.log();
3059
3058
  console.log(import_picocolors.default.dim(" Usage:"));
3060
- console.log(` ${import_picocolors.default.cyan("npx skills add")} ${import_picocolors.default.yellow("<source>")} ${import_picocolors.default.dim("[options]")}`);
3061
- console.log(` ${import_picocolors.default.cyan("npx skills add")} ${import_picocolors.default.yellow("[options]")} ${import_picocolors.default.dim("(uses default registry)")}`);
3059
+ console.log(` ${import_picocolors.default.cyan("npx @bud-fe/skills add")} ${import_picocolors.default.yellow("<source>")} ${import_picocolors.default.dim("[options]")}`);
3060
+ console.log(` ${import_picocolors.default.cyan("npx @bud-fe/skills add")} ${import_picocolors.default.yellow("[options]")} ${import_picocolors.default.dim("(uses default registry)")}`);
3062
3061
  console.log();
3063
3062
  console.log(import_picocolors.default.dim(" Example:"));
3064
- console.log(` ${import_picocolors.default.cyan("npx skills add")} ${import_picocolors.default.yellow("vercel-labs/agent-skills")}`);
3065
- console.log(` ${import_picocolors.default.cyan("npx skills add")} ${import_picocolors.default.yellow("--all")}`);
3063
+ console.log(` ${import_picocolors.default.cyan("npx @bud-fe/skills add")} ${import_picocolors.default.yellow("vercel-labs/agent-skills")}`);
3064
+ console.log(` ${import_picocolors.default.cyan("npx @bud-fe/skills add")} ${import_picocolors.default.yellow("--all")}`);
3066
3065
  console.log();
3067
3066
  process.exit(1);
3068
3067
  }
@@ -3482,12 +3481,12 @@ async function runAddCommand(args, options = {}) {
3482
3481
  console.log(import_picocolors.default.bgRed(import_picocolors.default.white(import_picocolors.default.bold(" ERROR "))) + " " + import_picocolors.default.red("Missing required argument: command"));
3483
3482
  console.log();
3484
3483
  console.log(import_picocolors.default.dim(" Usage:"));
3485
- console.log(` ${import_picocolors.default.cyan("npx skills add-c")} ${import_picocolors.default.yellow("<command>")} ${import_picocolors.default.dim("[options]")}`);
3486
- console.log(` ${import_picocolors.default.cyan("npx skills add-c")} ${import_picocolors.default.yellow("[options]")} ${import_picocolors.default.dim("(uses default registry)")}`);
3484
+ console.log(` ${import_picocolors.default.cyan("npx @bud-fe/skills add-c")} ${import_picocolors.default.yellow("<command>")} ${import_picocolors.default.dim("[options]")}`);
3485
+ console.log(` ${import_picocolors.default.cyan("npx @bud-fe/skills add-c")} ${import_picocolors.default.yellow("[options]")} ${import_picocolors.default.dim("(uses default registry)")}`);
3487
3486
  console.log();
3488
3487
  console.log(import_picocolors.default.dim(" Example:"));
3489
- console.log(` ${import_picocolors.default.cyan("npx skills add-c")} ${import_picocolors.default.yellow("my-command")}`);
3490
- console.log(` ${import_picocolors.default.cyan("npx skills add-c")} ${import_picocolors.default.yellow("--list")}`);
3488
+ console.log(` ${import_picocolors.default.cyan("npx @bud-fe/skills add-c")} ${import_picocolors.default.yellow("my-command")}`);
3489
+ console.log(` ${import_picocolors.default.cyan("npx @bud-fe/skills add-c")} ${import_picocolors.default.yellow("--list")}`);
3491
3490
  console.log();
3492
3491
  process.exit(1);
3493
3492
  }
@@ -3831,11 +3830,11 @@ async function promptForFindSkills(options, targetAgents) {
3831
3830
  });
3832
3831
  } catch {
3833
3832
  M.warn("Failed to install find-skills. You can try again with:");
3834
- M.message(import_picocolors.default.dim(" npx skills add vercel-labs/skills@find-skills -g -y --all"));
3833
+ M.message(import_picocolors.default.dim(" npx @bud-fe/skills add vercel-labs/skills@find-skills -g -y --all"));
3835
3834
  }
3836
3835
  } else {
3837
3836
  await dismissPrompt("findSkillsPrompt");
3838
- M.message(import_picocolors.default.dim("You can install it later with: npx skills add vercel-labs/skills@find-skills"));
3837
+ M.message(import_picocolors.default.dim("You can install it later with: npx @bud-fe/skills add vercel-labs/skills@find-skills"));
3839
3838
  }
3840
3839
  } catch {}
3841
3840
  }
@@ -4019,7 +4018,7 @@ function formatNonInteractiveResults(mode, defaultResults, apiResults) {
4019
4018
  const hasDefault = mode === "default" && defaultResults.length > 0;
4020
4019
  const hasApi = mode === "global" && apiResults.length > 0;
4021
4020
  if (hasDefault) {
4022
- lines.push(`${DIM$2}Install with${RESET$2} npx skills add <name>${DIM$2} (From default registry)${RESET$2}`);
4021
+ lines.push(`${DIM$2}Install with${RESET$2} npx @bud-fe/skills add <name>${DIM$2} (From default registry)${RESET$2}`);
4023
4022
  lines.push("");
4024
4023
  for (const skill of defaultResults) {
4025
4024
  lines.push(`${TEXT$1}${skill.name}${RESET$2}`);
@@ -4028,7 +4027,7 @@ function formatNonInteractiveResults(mode, defaultResults, apiResults) {
4028
4027
  }
4029
4028
  }
4030
4029
  if (hasApi) {
4031
- lines.push(`${DIM$2}Install with${RESET$2} npx skills add <owner/repo@skill>${DIM$2} (From https://skills.sh)${RESET$2}`);
4030
+ lines.push(`${DIM$2}Install with${RESET$2} npx @bud-fe/skills add <owner/repo@skill>${DIM$2} (From https://skills.sh)${RESET$2}`);
4032
4031
  lines.push("");
4033
4032
  for (const skill of apiResults.slice(0, 6)) {
4034
4033
  const pkg = skill.source || skill.slug;
@@ -4213,9 +4212,9 @@ async function runFind(args) {
4213
4212
  const { mode, query } = parseFindArgs(args);
4214
4213
  const isNonInteractive = !process.stdin.isTTY;
4215
4214
  const agentTip = `${DIM$2}Tip: if running in a coding agent, follow these steps:${RESET$2}
4216
- ${DIM$2} 1) npx skills find [query]${RESET$2}
4217
- ${DIM$2} 2) npx skills find -g [query]${RESET$2}
4218
- ${DIM$2} 3) npx skills add <owner/repo@skill>${RESET$2}`;
4215
+ ${DIM$2} 1) npx @bud-fe/skills find [query]${RESET$2}
4216
+ ${DIM$2} 2) npx @bud-fe/skills find -g [query]${RESET$2}
4217
+ ${DIM$2} 3) npx @bud-fe/skills add <owner/repo@skill>${RESET$2}`;
4219
4218
  if (query) {
4220
4219
  const { defaultResults, apiResults } = await searchSkillsByMode(query, mode);
4221
4220
  const totalResults = defaultResults.length + apiResults.length;
@@ -4562,7 +4561,7 @@ async function runInstallFromLock(args) {
4562
4561
  const skillEntries = Object.entries(lock.skills);
4563
4562
  if (skillEntries.length === 0) {
4564
4563
  M.warn("No project skills found in skills-lock.json");
4565
- M.info(`Add project-level skills with ${import_picocolors.default.cyan("npx skills add <package>")} (without ${import_picocolors.default.cyan("-g")})`);
4564
+ M.info(`Add project-level skills with ${import_picocolors.default.cyan("npx @bud-fe/skills add <package>")} (without ${import_picocolors.default.cyan("-g")})`);
4566
4565
  return;
4567
4566
  }
4568
4567
  const universalAgentNames = getUniversalAgents();
@@ -5038,20 +5037,20 @@ function showBanner() {
5038
5037
  console.log();
5039
5038
  console.log(`${DIM}The open agent skills ecosystem${RESET}`);
5040
5039
  console.log();
5041
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills add ${DIM}<package>${RESET} ${DIM}Add a new skill${RESET}`);
5042
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills add-c ${DIM}<command>${RESET} ${DIM}Install a command${RESET}`);
5043
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills remove${RESET} ${DIM}Remove installed skills${RESET}`);
5044
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills list${RESET} ${DIM}List installed skills${RESET}`);
5045
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills find ${DIM}[query] [-g]${RESET} ${DIM}Search skills (default registry or global)${RESET}`);
5040
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills add ${DIM}<package>${RESET} ${DIM}Add a new skill${RESET}`);
5041
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills add-c ${DIM}<command>${RESET} ${DIM}Install a command${RESET}`);
5042
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills remove${RESET} ${DIM}Remove installed skills${RESET}`);
5043
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills list${RESET} ${DIM}List installed skills${RESET}`);
5044
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills find ${DIM}[query] [-g]${RESET} ${DIM}Search skills (default registry or global)${RESET}`);
5046
5045
  console.log();
5047
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills check${RESET} ${DIM}Check for updates${RESET}`);
5048
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills update${RESET} ${DIM}Update all skills${RESET}`);
5046
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills check${RESET} ${DIM}Check for updates${RESET}`);
5047
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills update${RESET} ${DIM}Update all skills${RESET}`);
5049
5048
  console.log();
5050
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills experimental_install${RESET} ${DIM}Restore from skills-lock.json${RESET}`);
5051
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills init ${DIM}[name]${RESET} ${DIM}Create a new skill${RESET}`);
5052
- console.log(` ${DIM}$${RESET} ${TEXT}npx skills experimental_sync${RESET} ${DIM}Sync skills from node_modules${RESET}`);
5049
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills experimental_install${RESET} ${DIM}Restore from skills-lock.json${RESET}`);
5050
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills init ${DIM}[name]${RESET} ${DIM}Create a new skill${RESET}`);
5051
+ console.log(` ${DIM}$${RESET} ${TEXT}npx @bud-fe/skills experimental_sync${RESET} ${DIM}Sync skills from node_modules${RESET}`);
5053
5052
  console.log();
5054
- console.log(`${DIM}try:${RESET} npx skills add vercel-labs/agent-skills`);
5053
+ console.log(`${DIM}try:${RESET} npx @bud-fe/skills add vercel-labs/agent-skills`);
5055
5054
  console.log();
5056
5055
  console.log(`Discover more skills at ${TEXT}https://skills.sh/${RESET}`);
5057
5056
  console.log();
@@ -5215,8 +5214,8 @@ Describe when this skill should be used.
5215
5214
  console.log(` 2. Update the ${TEXT}name${RESET} and ${TEXT}description${RESET} in the frontmatter`);
5216
5215
  console.log();
5217
5216
  console.log(`${DIM}Publishing:${RESET}`);
5218
- console.log(` ${DIM}GitHub:${RESET} Push to a repo, then ${TEXT}npx skills add <owner>/<repo>${RESET}`);
5219
- console.log(` ${DIM}URL:${RESET} Host the file, then ${TEXT}npx skills add https://example.com/${displayPath}${RESET}`);
5217
+ console.log(` ${DIM}GitHub:${RESET} Push to a repo, then ${TEXT}npx @bud-fe/skills add <owner>/<repo>${RESET}`);
5218
+ console.log(` ${DIM}URL:${RESET} Host the file, then ${TEXT}npx @bud-fe/skills add https://example.com/${displayPath}${RESET}`);
5220
5219
  console.log();
5221
5220
  console.log(`Browse existing skills for inspiration at ${TEXT}https://skills.sh/${RESET}`);
5222
5221
  console.log();
@@ -5254,14 +5253,14 @@ async function runCheck(args = []) {
5254
5253
  const lock = readSkillLock();
5255
5254
  if (Object.keys(lock.skills).length === 0) {
5256
5255
  console.log(`${DIM}No skills tracked in lock file.${RESET}`);
5257
- console.log(`${DIM}Install skills with${RESET} ${TEXT}npx skills add <package>${RESET}`);
5256
+ console.log(`${DIM}Install skills with${RESET} ${TEXT}npx @bud-fe/skills add <package>${RESET}`);
5258
5257
  return;
5259
5258
  }
5260
5259
  const result = await detectSkillUpdates(lock, { githubToken: getGitHubToken() });
5261
5260
  const totalSkills = result.checkedCount;
5262
5261
  if (totalSkills === 0) {
5263
5262
  console.log(`${DIM}No skills with update metadata to check.${RESET}`);
5264
- if (result.skippedMissingMetadata > 0) console.log(`${DIM}${result.skippedMissingMetadata} skill(s) are missing hash metadata (run${RESET} ${TEXT}npx skills add <source> -g${RESET} ${DIM}to reinstall and track updates).${RESET}`);
5263
+ if (result.skippedMissingMetadata > 0) console.log(`${DIM}${result.skippedMissingMetadata} skill(s) are missing hash metadata (run${RESET} ${TEXT}npx @bud-fe/skills add <source> -g${RESET} ${DIM}to reinstall and track updates).${RESET}`);
5265
5264
  return;
5266
5265
  }
5267
5266
  console.log(`${DIM}Checking ${totalSkills} skill(s) for updates...${RESET}`);
@@ -5277,7 +5276,7 @@ async function runCheck(args = []) {
5277
5276
  console.log(` ${DIM}source: ${update.source}${RESET}`);
5278
5277
  }
5279
5278
  console.log();
5280
- console.log(`${DIM}Run${RESET} ${TEXT}npx skills update${RESET} ${DIM}to update all skills${RESET}`);
5279
+ console.log(`${DIM}Run${RESET} ${TEXT}npx @bud-fe/skills update${RESET} ${DIM}to update all skills${RESET}`);
5281
5280
  }
5282
5281
  if (errors.length > 0) {
5283
5282
  console.log();
@@ -5300,7 +5299,7 @@ async function runUpdate() {
5300
5299
  const lock = readSkillLock();
5301
5300
  if (Object.keys(lock.skills).length === 0) {
5302
5301
  console.log(`${DIM}No skills tracked in lock file.${RESET}`);
5303
- console.log(`${DIM}Install skills with${RESET} ${TEXT}npx skills add <package>${RESET}`);
5302
+ console.log(`${DIM}Install skills with${RESET} ${TEXT}npx @bud-fe/skills add <package>${RESET}`);
5304
5303
  return;
5305
5304
  }
5306
5305
  const result = await detectSkillUpdates(lock, { githubToken: getGitHubToken() });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bud-fe/skills",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "The open agent skills ecosystem",
5
5
  "type": "module",
6
6
  "bin": {