@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.
- package/dist/_chunks/libs/xdg-basedir.mjs +1 -1
- package/dist/cli.mjs +107 -108
- package/package.json +1 -1
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,
|
|
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 {
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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() });
|