skills 1.7.2 → 1.7.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.
- package/README.md +51 -527
- package/dist/cli.mjs +131 -44
- package/docs/agents.md +135 -0
- package/docs/commands.md +343 -0
- package/docs/creating-skills.md +140 -0
- package/docs/troubleshooting.md +40 -0
- package/package.json +2 -1
package/dist/cli.mjs
CHANGED
|
@@ -1694,8 +1694,8 @@ const agents = {
|
|
|
1694
1694
|
fx: {
|
|
1695
1695
|
name: "fx",
|
|
1696
1696
|
displayName: "fx",
|
|
1697
|
-
skillsDir: ".
|
|
1698
|
-
globalSkillsDir: join(home, ".
|
|
1697
|
+
skillsDir: ".agents/skills",
|
|
1698
|
+
globalSkillsDir: join(home, ".agents/skills"),
|
|
1699
1699
|
detectInstalled: async () => {
|
|
1700
1700
|
return existsSync(join(home, ".fx"));
|
|
1701
1701
|
}
|
|
@@ -2318,14 +2318,15 @@ async function installSkillForAgent(skill, agentType, options = {}) {
|
|
|
2318
2318
|
mode: "copy"
|
|
2319
2319
|
};
|
|
2320
2320
|
}
|
|
2321
|
-
|
|
2321
|
+
const sourceIsCanonical = resolve(skill.path) === resolve(canonicalDir);
|
|
2322
|
+
if (!sourceIsCanonical && pathsOverlap(skill.path, canonicalDir)) return {
|
|
2322
2323
|
success: true,
|
|
2323
2324
|
path: canonicalDir,
|
|
2324
2325
|
canonicalPath: canonicalDir,
|
|
2325
2326
|
mode: installMode,
|
|
2326
2327
|
skipped: true
|
|
2327
2328
|
};
|
|
2328
|
-
if (installMode === "link") {
|
|
2329
|
+
if (!sourceIsCanonical) if (installMode === "link") {
|
|
2329
2330
|
if (!await createSymlink(skill.path, canonicalDir)) {
|
|
2330
2331
|
await cleanAndCreateDirectory(canonicalDir);
|
|
2331
2332
|
await copyDirectory(skill.path, canonicalDir, agentType);
|
|
@@ -4181,7 +4182,7 @@ async function tryBlobInstall(ownerRepo, options = {}) {
|
|
|
4181
4182
|
tree
|
|
4182
4183
|
};
|
|
4183
4184
|
}
|
|
4184
|
-
var version$1 = "1.7.
|
|
4185
|
+
var version$1 = "1.7.3";
|
|
4185
4186
|
const NOTION_API_VERSION = "2026-03-11";
|
|
4186
4187
|
const NTN_TIMEOUT_MS = 3e4;
|
|
4187
4188
|
const NTN_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
|
|
@@ -6323,6 +6324,9 @@ function matchesSkill(skill, patterns) {
|
|
|
6323
6324
|
return posix.matchesGlob(skill.packageName, packagePattern) && posix.matchesGlob(sanitizeName(skill.name), skillPattern);
|
|
6324
6325
|
});
|
|
6325
6326
|
}
|
|
6327
|
+
function allowedByFilters(skill, { include, exclude }) {
|
|
6328
|
+
return (!include?.length || matchesSkill(skill, include)) && !(exclude?.length && matchesSkill(skill, exclude));
|
|
6329
|
+
}
|
|
6326
6330
|
function shortenPath$1(fullPath, cwd) {
|
|
6327
6331
|
const home = homedir();
|
|
6328
6332
|
if (fullPath === home || fullPath.startsWith(home + sep)) return "~" + fullPath.slice(home.length);
|
|
@@ -6369,6 +6373,32 @@ function findInstalledPackage(from, name) {
|
|
|
6369
6373
|
if (dirname(dir) === dir) return void 0;
|
|
6370
6374
|
}
|
|
6371
6375
|
}
|
|
6376
|
+
function remoteAllowsSkill(request, name, options) {
|
|
6377
|
+
return request.declarers.some((packageName) => allowedByFilters({
|
|
6378
|
+
name,
|
|
6379
|
+
packageName
|
|
6380
|
+
}, options));
|
|
6381
|
+
}
|
|
6382
|
+
function filterRemoteRequests(requests, options) {
|
|
6383
|
+
return requests.flatMap((request) => {
|
|
6384
|
+
const declarers = request.declarers.filter((name) => (!options.include?.length || options.include.some((p) => posix.matchesGlob(name, p.split("#")[0]))) && !options.exclude?.some((p) => !p.includes("#") && posix.matchesGlob(name, p)));
|
|
6385
|
+
if (declarers.length === 0) return [];
|
|
6386
|
+
const filtered = {
|
|
6387
|
+
...request,
|
|
6388
|
+
via: declarers[0],
|
|
6389
|
+
declarers
|
|
6390
|
+
};
|
|
6391
|
+
if (request.skills.length === 0) return [filtered];
|
|
6392
|
+
const skills = request.skills.filter((name) => remoteAllowsSkill(filtered, name, options));
|
|
6393
|
+
return skills.length > 0 ? [{
|
|
6394
|
+
...filtered,
|
|
6395
|
+
skills
|
|
6396
|
+
}] : [];
|
|
6397
|
+
});
|
|
6398
|
+
}
|
|
6399
|
+
function requestsLockedSkill(request, name, entry) {
|
|
6400
|
+
return isFromRequest(entry, request) && (request.skills.length === 0 || request.skills.some((selected) => sanitizeName(selected) === sanitizeName(name) || selected === posix.basename(posix.dirname(entry.skillPath ?? ""))));
|
|
6401
|
+
}
|
|
6372
6402
|
const DEPENDENCY_FIELDS = [
|
|
6373
6403
|
"dependencies",
|
|
6374
6404
|
"devDependencies",
|
|
@@ -6472,9 +6502,13 @@ async function discoverNodeModuleSkills(cwd, recursive) {
|
|
|
6472
6502
|
subpath,
|
|
6473
6503
|
request.skills
|
|
6474
6504
|
]);
|
|
6475
|
-
|
|
6505
|
+
const existing = remote.get(key);
|
|
6506
|
+
if (existing) {
|
|
6507
|
+
if (!existing.declarers.includes(declarer.name)) existing.declarers.push(declarer.name);
|
|
6508
|
+
} else remote.set(key, {
|
|
6476
6509
|
...request,
|
|
6477
|
-
via: declarer.name
|
|
6510
|
+
via: declarer.name,
|
|
6511
|
+
declarers: [declarer.name]
|
|
6478
6512
|
});
|
|
6479
6513
|
}
|
|
6480
6514
|
for (const request of parsed.npm) {
|
|
@@ -6536,7 +6570,7 @@ async function pruneStaleSkills(cwd, keep, keepRemote, lock, dryRun) {
|
|
|
6536
6570
|
const explicit = /* @__PURE__ */ new Set();
|
|
6537
6571
|
for (const [key, entry] of Object.entries(lock.skills)) {
|
|
6538
6572
|
const remote = entry.sourceType !== "node_modules";
|
|
6539
|
-
if (installedBySync(entry) && !(remote && keepRemote(entry))) lockKeys.set(sanitizeName(key), key);
|
|
6573
|
+
if (installedBySync(entry) && !(remote && keepRemote(entry, key))) lockKeys.set(sanitizeName(key), key);
|
|
6540
6574
|
else explicit.add(sanitizeName(key));
|
|
6541
6575
|
}
|
|
6542
6576
|
const candidates = new Set(lockKeys.keys());
|
|
@@ -6648,7 +6682,7 @@ async function runSync(args, options = {}) {
|
|
|
6648
6682
|
}
|
|
6649
6683
|
}
|
|
6650
6684
|
console.log();
|
|
6651
|
-
if (!agentResult.isAgent) intro(import_picocolors.default.bgCyan(import_picocolors.default.black(" skills
|
|
6685
|
+
if (!agentResult.isAgent) intro(import_picocolors.default.bgCyan(import_picocolors.default.black(" skills sync ")));
|
|
6652
6686
|
if (agentResult.isAgent) log.info(import_picocolors.default.bgCyan(import_picocolors.default.black(import_picocolors.default.bold(` ${agentResult.agent.name} `))) + " Agent detected — installing non-interactively");
|
|
6653
6687
|
const spinner$2 = spinner();
|
|
6654
6688
|
spinner$2.start("Scanning node_modules for skills…");
|
|
@@ -6660,19 +6694,32 @@ async function runSync(args, options = {}) {
|
|
|
6660
6694
|
process.exitCode = 1;
|
|
6661
6695
|
return;
|
|
6662
6696
|
}
|
|
6663
|
-
const
|
|
6664
|
-
const
|
|
6697
|
+
const discoveredSkills = discovery.skills.filter((skill) => allowedByFilters(skill, options));
|
|
6698
|
+
const remote = filterRemoteRequests(discovery.remote, options);
|
|
6665
6699
|
spinner$2.stop(discoveredSkills.length === 0 ? import_picocolors.default.yellow("No skills found") : `Found ${import_picocolors.default.green(String(discoveredSkills.length))} skill${discoveredSkills.length > 1 ? "s" : ""} in node_modules`);
|
|
6666
6700
|
for (const warning of discovery.warnings) log.warn(warning);
|
|
6667
6701
|
const localLock = await readLocalLock(cwd);
|
|
6668
6702
|
if (options.cleanup !== false) {
|
|
6669
6703
|
const keep = new Set(discoveredSkills.map((skill) => sanitizeName(skill.name)));
|
|
6670
|
-
const keepRemote = (entry) => options.remote === false ||
|
|
6704
|
+
const keepRemote = (entry, name) => options.remote === false || remote.some((r) => requestsLockedSkill(r, name, entry) && remoteAllowsSkill(r, name, options));
|
|
6671
6705
|
const stale = await pruneStaleSkills(cwd, keep, keepRemote, localLock, options.dryRun ?? false);
|
|
6672
6706
|
for (const name of stale) log.info(`${options.dryRun ? "Would remove" : "Removed"} ${import_picocolors.default.cyan(name)} ${import_picocolors.default.dim("(no longer provided by a dependency)")}`);
|
|
6673
6707
|
}
|
|
6674
|
-
const remoteRequests = (options.remote === false ? [] :
|
|
6675
|
-
|
|
6708
|
+
const remoteRequests = (options.remote === false ? [] : remote).filter((request) => !isRemoteInstalled(request, localLock, cwd));
|
|
6709
|
+
const cachedRemoteSkills = [];
|
|
6710
|
+
if (options.remote !== false) {
|
|
6711
|
+
const shippedNames = new Set(discoveredSkills.map((skill) => sanitizeName(skill.name)));
|
|
6712
|
+
for (const [name, entry] of Object.entries(localLock.skills)) {
|
|
6713
|
+
if (shippedNames.has(sanitizeName(name))) continue;
|
|
6714
|
+
if (!remote.some((request) => !remoteRequests.includes(request) && requestsLockedSkill(request, name, entry) && remoteAllowsSkill(request, name, options))) continue;
|
|
6715
|
+
const skill = await parseSkillMd(join(getCanonicalPath(name, { cwd }), "SKILL.md"));
|
|
6716
|
+
if (skill) cachedRemoteSkills.push({
|
|
6717
|
+
skill,
|
|
6718
|
+
source: entry.source
|
|
6719
|
+
});
|
|
6720
|
+
}
|
|
6721
|
+
}
|
|
6722
|
+
if (discoveredSkills.length === 0 && remoteRequests.length === 0 && cachedRemoteSkills.length === 0) {
|
|
6676
6723
|
outro(import_picocolors.default.dim("Nothing to sync."));
|
|
6677
6724
|
return;
|
|
6678
6725
|
}
|
|
@@ -6716,7 +6763,19 @@ async function runSync(args, options = {}) {
|
|
|
6716
6763
|
}
|
|
6717
6764
|
const { install: toInstall, skipped } = await resolveConflicts(discoveredSkills, targetAgents, localLock.skills, cwd);
|
|
6718
6765
|
for (const { skill, reason } of skipped) log.warn(`Skipped ${import_picocolors.default.cyan(skill.name)} ${import_picocolors.default.dim(`from ${skill.packageName}`)}: ${reason}`);
|
|
6719
|
-
|
|
6766
|
+
const cachedToInstall = [];
|
|
6767
|
+
for (const cached of cachedRemoteSkills) {
|
|
6768
|
+
const { skill } = cached;
|
|
6769
|
+
const missing = targetAgents.filter((agent) => !existsSync(getInstallPath(skill.name, agent, { cwd })));
|
|
6770
|
+
if (missing.length === 0) continue;
|
|
6771
|
+
const reason = await blockedReason(skill.name, missing, localLock.skills[skill.name], cwd);
|
|
6772
|
+
if (reason) log.warn(`Skipped ${import_picocolors.default.cyan(skill.name)}: ${reason}`);
|
|
6773
|
+
else cachedToInstall.push({
|
|
6774
|
+
...cached,
|
|
6775
|
+
agents: missing
|
|
6776
|
+
});
|
|
6777
|
+
}
|
|
6778
|
+
if (toInstall.length === 0 && remoteRequests.length === 0 && cachedToInstall.length === 0) {
|
|
6720
6779
|
console.log();
|
|
6721
6780
|
outro(import_picocolors.default.yellow("Nothing to sync."));
|
|
6722
6781
|
return;
|
|
@@ -6729,6 +6788,7 @@ async function runSync(args, options = {}) {
|
|
|
6729
6788
|
summaryLines.push(` ${import_picocolors.default.dim(`${shortenPath$1(canonicalPath, cwd)} ${mode === "link" ? "→" : "copied from"} ${shortenPath$1(skill.path, cwd)}`)}`);
|
|
6730
6789
|
}
|
|
6731
6790
|
for (const request of remoteRequests) summaryLines.push(`${import_picocolors.default.cyan(getProjectLockSource(request.parsed))} ${import_picocolors.default.dim(`← ${request.via} (remote)`)}`);
|
|
6791
|
+
for (const { skill, source, agents: missing } of cachedToInstall) summaryLines.push(`${import_picocolors.default.cyan(skill.name)} ${import_picocolors.default.dim(`← ${source} (cached), link to ${missing.join(", ")}`)}`);
|
|
6732
6792
|
console.log();
|
|
6733
6793
|
note(summaryLines.join("\n"), "Sync Summary");
|
|
6734
6794
|
if (options.dryRun) {
|
|
@@ -6744,6 +6804,22 @@ async function runSync(args, options = {}) {
|
|
|
6744
6804
|
}
|
|
6745
6805
|
spinner$2.start("Syncing skills…");
|
|
6746
6806
|
const results = [];
|
|
6807
|
+
for (const { skill, source, agents: missing } of cachedToInstall) for (const agent of missing) {
|
|
6808
|
+
const result = await installSkillForAgent(skill, agent, {
|
|
6809
|
+
cwd,
|
|
6810
|
+
mode: "symlink",
|
|
6811
|
+
createMissingAgentRoot: true
|
|
6812
|
+
});
|
|
6813
|
+
results.push({
|
|
6814
|
+
skill: skill.name,
|
|
6815
|
+
packageName: source,
|
|
6816
|
+
agent: agents[agent].displayName,
|
|
6817
|
+
success: result.success,
|
|
6818
|
+
path: result.path,
|
|
6819
|
+
canonicalPath: result.canonicalPath,
|
|
6820
|
+
error: result.error
|
|
6821
|
+
});
|
|
6822
|
+
}
|
|
6747
6823
|
for (const skill of toInstall) for (const agent of targetAgents) {
|
|
6748
6824
|
const result = await installSkillForAgent(skill, agent, {
|
|
6749
6825
|
global: false,
|
|
@@ -6787,6 +6863,7 @@ async function runSync(args, options = {}) {
|
|
|
6787
6863
|
const selected = [];
|
|
6788
6864
|
for (const skill of skills) {
|
|
6789
6865
|
const name = sanitizeName(skill.name);
|
|
6866
|
+
if (!remoteAllowsSkill(request, name, options)) continue;
|
|
6790
6867
|
const reason = claimed.has(name) ? "another source in this sync provides it" : await blockedReason(name, targetAgents, lockEntryFor(name), cwd);
|
|
6791
6868
|
if (reason) {
|
|
6792
6869
|
log.warn(`Skipped ${import_picocolors.default.cyan(name)} from ${label}: ${reason}`);
|
|
@@ -6818,7 +6895,7 @@ async function runSync(args, options = {}) {
|
|
|
6818
6895
|
const resultLines = [];
|
|
6819
6896
|
for (const [skillName, skillResults] of bySkill) {
|
|
6820
6897
|
const firstResult = skillResults[0];
|
|
6821
|
-
const pkg =
|
|
6898
|
+
const pkg = firstResult.packageName;
|
|
6822
6899
|
if (firstResult.canonicalPath) {
|
|
6823
6900
|
const shortPath = shortenPath$1(firstResult.canonicalPath, cwd);
|
|
6824
6901
|
resultLines.push(`${import_picocolors.default.green("✓")} ${skillName} ${import_picocolors.default.dim(`← ${pkg}`)}`);
|
|
@@ -6830,13 +6907,14 @@ async function runSync(args, options = {}) {
|
|
|
6830
6907
|
note(resultLines.join("\n"), title);
|
|
6831
6908
|
}
|
|
6832
6909
|
if (failed.length > 0) {
|
|
6910
|
+
process.exitCode = 1;
|
|
6833
6911
|
console.log();
|
|
6834
6912
|
log.error(import_picocolors.default.red(`Failed to install ${failed.length}`));
|
|
6835
6913
|
for (const r of failed) log.message(` ${import_picocolors.default.red("✗")} ${r.skill} → ${r.agent}: ${import_picocolors.default.dim(r.error)}`);
|
|
6836
6914
|
}
|
|
6837
6915
|
track({
|
|
6838
6916
|
event: "experimental_sync",
|
|
6839
|
-
skillCount: String(toInstall.length),
|
|
6917
|
+
skillCount: String(toInstall.length + cachedToInstall.length),
|
|
6840
6918
|
successCount: String(successfulSkillNames.size),
|
|
6841
6919
|
agents: targetAgents.join(",")
|
|
6842
6920
|
});
|
|
@@ -8574,7 +8652,7 @@ function showBanner() {
|
|
|
8574
8652
|
console.log();
|
|
8575
8653
|
console.log(` ${DIM}$${RESET} ${TEXT}npx skills experimental_install${RESET} ${DIM}Restore from skills-lock.json${RESET}`);
|
|
8576
8654
|
console.log(` ${DIM}$${RESET} ${TEXT}npx skills init ${DIM}[name]${RESET} ${DIM}Create a new skill${RESET}`);
|
|
8577
|
-
console.log(` ${DIM}$${RESET} ${TEXT}npx skills
|
|
8655
|
+
console.log(` ${DIM}$${RESET} ${TEXT}npx skills sync${RESET} ${DIM}Sync skills from node_modules${RESET}`);
|
|
8578
8656
|
console.log();
|
|
8579
8657
|
console.log(`${DIM}try:${RESET} npx skills add vercel-labs/agent-skills`);
|
|
8580
8658
|
console.log();
|
|
@@ -8582,6 +8660,37 @@ function showBanner() {
|
|
|
8582
8660
|
console.log();
|
|
8583
8661
|
}
|
|
8584
8662
|
function showHelp() {
|
|
8663
|
+
const examples = [
|
|
8664
|
+
["skills add vercel-labs/agent-skills"],
|
|
8665
|
+
["skills use vercel-labs/agent-skills@vercel-optimize | claude"],
|
|
8666
|
+
["skills use vercel-labs/agent-skills --skill vercel-optimize --agent claude-code"],
|
|
8667
|
+
["skills add vercel-labs/agent-skills -g"],
|
|
8668
|
+
["skills add vercel-labs/agent-skills --agent claude-code cursor"],
|
|
8669
|
+
["skills add vercel-labs/agent-skills --skill pr-review commit"],
|
|
8670
|
+
["skills add vercel-labs/agent-skills --json -y", "JSON output"],
|
|
8671
|
+
["skills remove", "interactive remove"],
|
|
8672
|
+
["skills remove web-design", "remove by name"],
|
|
8673
|
+
["skills rm --global frontend-design"],
|
|
8674
|
+
["skills list", "list project skills"],
|
|
8675
|
+
["skills ls -g", "list global skills"],
|
|
8676
|
+
["skills ls -a claude-code", "filter by agent"],
|
|
8677
|
+
["skills ls --json", "JSON output"],
|
|
8678
|
+
["skills find", "interactive search"],
|
|
8679
|
+
["skills find typescript", "search by keyword"],
|
|
8680
|
+
["skills find react --owner vercel", "search within an owner"],
|
|
8681
|
+
["skills update"],
|
|
8682
|
+
["skills update my-skill", "update a single skill"],
|
|
8683
|
+
["skills update -g", "update global skills only"],
|
|
8684
|
+
["skills experimental_install", "restore from skills-lock.json"],
|
|
8685
|
+
["skills init my-skill"],
|
|
8686
|
+
["skills sync", "sync from node_modules"],
|
|
8687
|
+
["skills sync -y", "sync without prompts"]
|
|
8688
|
+
];
|
|
8689
|
+
const exampleWidth = Math.max(...examples.filter(([, description]) => description).map(([command]) => command.length));
|
|
8690
|
+
const formattedExamples = examples.map(([command, description]) => {
|
|
8691
|
+
const comment = description ? `${" ".repeat(exampleWidth - command.length + 2)}${DIM}# ${description}${RESET}` : "";
|
|
8692
|
+
return ` ${DIM}$${RESET} ${command}${comment}`;
|
|
8693
|
+
}).join("\n");
|
|
8585
8694
|
console.log(`
|
|
8586
8695
|
${BOLD}Usage:${RESET} skills <command> [options]
|
|
8587
8696
|
|
|
@@ -8611,7 +8720,7 @@ ${BOLD}Update Options:${RESET}
|
|
|
8611
8720
|
${BOLD}Project:${RESET}
|
|
8612
8721
|
experimental_install Restore skills from skills-lock.json
|
|
8613
8722
|
init [name] Initialize a skill (creates <name>/SKILL.md or ./SKILL.md)
|
|
8614
|
-
|
|
8723
|
+
sync Sync skills from node_modules into agent directories (alias: experimental_sync)
|
|
8615
8724
|
|
|
8616
8725
|
${BOLD}Add Options:${RESET}
|
|
8617
8726
|
-g, --global Install skill globally (user-level) instead of project-level
|
|
@@ -8638,7 +8747,7 @@ ${BOLD}Remove Options:${RESET}
|
|
|
8638
8747
|
-y, --yes Skip confirmation prompts
|
|
8639
8748
|
--all Remove every installed skill (-y implied). Do not combine with named skills.
|
|
8640
8749
|
|
|
8641
|
-
${BOLD}
|
|
8750
|
+
${BOLD}Sync Options:${RESET}
|
|
8642
8751
|
-a, --agent <agents> Specify agents to install to (use '*' for all agents)
|
|
8643
8752
|
-y, --yes Skip confirmation prompts
|
|
8644
8753
|
--copy Copy skills instead of linking them to node_modules
|
|
@@ -8659,30 +8768,7 @@ ${BOLD}Options:${RESET}
|
|
|
8659
8768
|
--version, -v Show version number
|
|
8660
8769
|
|
|
8661
8770
|
${BOLD}Examples:${RESET}
|
|
8662
|
-
|
|
8663
|
-
${DIM}$${RESET} skills use vercel-labs/agent-skills@vercel-optimize | claude
|
|
8664
|
-
${DIM}$${RESET} skills use vercel-labs/agent-skills --skill vercel-optimize --agent claude-code
|
|
8665
|
-
${DIM}$${RESET} skills add vercel-labs/agent-skills -g
|
|
8666
|
-
${DIM}$${RESET} skills add vercel-labs/agent-skills --agent claude-code cursor
|
|
8667
|
-
${DIM}$${RESET} skills add vercel-labs/agent-skills --skill pr-review commit
|
|
8668
|
-
${DIM}$${RESET} skills add vercel-labs/agent-skills --json -y ${DIM}# JSON output${RESET}
|
|
8669
|
-
${DIM}$${RESET} skills remove ${DIM}# interactive remove${RESET}
|
|
8670
|
-
${DIM}$${RESET} skills remove web-design ${DIM}# remove by name${RESET}
|
|
8671
|
-
${DIM}$${RESET} skills rm --global frontend-design
|
|
8672
|
-
${DIM}$${RESET} skills list ${DIM}# list project skills${RESET}
|
|
8673
|
-
${DIM}$${RESET} skills ls -g ${DIM}# list global skills${RESET}
|
|
8674
|
-
${DIM}$${RESET} skills ls -a claude-code ${DIM}# filter by agent${RESET}
|
|
8675
|
-
${DIM}$${RESET} skills ls --json ${DIM}# JSON output${RESET}
|
|
8676
|
-
${DIM}$${RESET} skills find ${DIM}# interactive search${RESET}
|
|
8677
|
-
${DIM}$${RESET} skills find typescript ${DIM}# search by keyword${RESET}
|
|
8678
|
-
${DIM}$${RESET} skills find react --owner vercel ${DIM}# search within an owner${RESET}
|
|
8679
|
-
${DIM}$${RESET} skills update
|
|
8680
|
-
${DIM}$${RESET} skills update my-skill ${DIM}# update a single skill${RESET}
|
|
8681
|
-
${DIM}$${RESET} skills update -g ${DIM}# update global skills only${RESET}
|
|
8682
|
-
${DIM}$${RESET} skills experimental_install ${DIM}# restore from skills-lock.json${RESET}
|
|
8683
|
-
${DIM}$${RESET} skills init my-skill
|
|
8684
|
-
${DIM}$${RESET} skills experimental_sync ${DIM}# sync from node_modules${RESET}
|
|
8685
|
-
${DIM}$${RESET} skills experimental_sync -y ${DIM}# sync without prompts${RESET}
|
|
8771
|
+
${formattedExamples}
|
|
8686
8772
|
|
|
8687
8773
|
Discover more skills at ${TEXT}https://skills.sh/${RESET}
|
|
8688
8774
|
`);
|
|
@@ -8823,6 +8909,7 @@ async function main() {
|
|
|
8823
8909
|
await removeCommand(skills, removeOptions);
|
|
8824
8910
|
break;
|
|
8825
8911
|
}
|
|
8912
|
+
case "sync":
|
|
8826
8913
|
case "experimental_sync": {
|
|
8827
8914
|
if (!inAgent) showLogo();
|
|
8828
8915
|
const { options: syncOptions } = parseSyncOptions(restArgs);
|
package/docs/agents.md
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Supported agents
|
|
2
|
+
|
|
3
|
+
[Back to the README](../README.md)
|
|
4
|
+
|
|
5
|
+
Skills can be installed to any of these agents:
|
|
6
|
+
|
|
7
|
+
<!-- supported-agents:start -->
|
|
8
|
+
| Agent | `--agent` | Project Path | Global Path |
|
|
9
|
+
|-------|-----------|--------------|-------------|
|
|
10
|
+
| AiderDesk | `aider-desk` | `.aider-desk/skills/` | `~/.aider-desk/skills/` |
|
|
11
|
+
| Amp, Replit, Universal | `amp`, `replit`, `universal` | `.agents/skills/` | `~/.config/agents/skills/` |
|
|
12
|
+
| Antigravity | `antigravity` | `.agents/skills/` | `~/.gemini/antigravity/skills/` |
|
|
13
|
+
| Antigravity CLI | `antigravity-cli` | `.agents/skills/` | `~/.gemini/antigravity-cli/skills/` |
|
|
14
|
+
| AstrBot | `astrbot` | `data/skills/` | `~/.astrbot/data/skills/` |
|
|
15
|
+
| Autohand Code CLI | `autohand-code` | `.autohand/skills/` | `~/.autohand/skills/` |
|
|
16
|
+
| Augment | `augment` | `.augment/skills/` | `~/.augment/skills/` |
|
|
17
|
+
| IBM Bob | `bob` | `.bob/skills/` | `~/.bob/skills/` |
|
|
18
|
+
| Claude Code | `claude-code` | `.claude/skills/` | `~/.claude/skills/` |
|
|
19
|
+
| OpenClaw | `openclaw` | `skills/` | `~/.openclaw/skills/` |
|
|
20
|
+
| Cline, Codex, Dexto, fx, Kimi Code CLI, Loaf, Pi, Sarvam Code, Warp, Zed | `cline`, `codex`, `dexto`, `fx`, `kimi-code-cli`, `loaf`, `pi`, `sarvam-code`, `warp`, `zed` | `.agents/skills/` | `~/.agents/skills/` |
|
|
21
|
+
| CodeArts Agent | `codearts-agent` | `.codeartsdoer/skills/` | `~/.codeartsdoer/skills/` |
|
|
22
|
+
| CodeBuddy | `codebuddy` | `.codebuddy/skills/` | `~/.codebuddy/skills/` |
|
|
23
|
+
| Codemaker | `codemaker` | `.codemaker/skills/` | `~/.codemaker/skills/` |
|
|
24
|
+
| Code Studio | `codestudio` | `.codestudio/skills/` | `~/.codestudio/skills/` |
|
|
25
|
+
| Command Code | `command-code` | `.commandcode/skills/` | `~/.commandcode/skills/` |
|
|
26
|
+
| Continue | `continue` | `.continue/skills/` | `~/.continue/skills/` |
|
|
27
|
+
| Cortex Code | `cortex` | `.cortex/skills/` | `~/.snowflake/cortex/skills/` |
|
|
28
|
+
| Crush | `crush` | `.crush/skills/` | `~/.config/crush/skills/` |
|
|
29
|
+
| Cursor | `cursor` | `.agents/skills/` | `~/.cursor/skills/` |
|
|
30
|
+
| Deep Agents | `deepagents` | `.agents/skills/` | `~/.deepagents/agent/skills/` |
|
|
31
|
+
| Devin for Terminal | `devin` | `.devin/skills/` | `~/.config/devin/skills/` |
|
|
32
|
+
| Droid | `droid` | `.agents/skills/` | `~/.factory/skills/` |
|
|
33
|
+
| Eve | `eve` | `agent/skills/` | N/A (project-only) |
|
|
34
|
+
| Firebender | `firebender` | `.agents/skills/` | `~/.firebender/skills/` |
|
|
35
|
+
| ForgeCode | `forgecode` | `.forge/skills/` | `~/.forge/skills/` |
|
|
36
|
+
| Gemini CLI | `gemini-cli` | `.agents/skills/` | `~/.gemini/skills/` |
|
|
37
|
+
| GitHub Copilot | `github-copilot` | `.agents/skills/` | `~/.copilot/skills/` |
|
|
38
|
+
| Goose | `goose` | `.goose/skills/` | `~/.config/goose/skills/` |
|
|
39
|
+
| Grok Build | `grok` | `.grok/skills/` | `~/.grok/skills/` |
|
|
40
|
+
| Hermes Agent | `hermes-agent` | `.hermes/skills/` | `~/.hermes/skills/` |
|
|
41
|
+
| inference.sh | `inference-sh` | `.inferencesh/skills/` | `~/.inferencesh/skills/` |
|
|
42
|
+
| Jazz | `jazz` | `.jazz/skills/` | `~/.jazz/skills/` |
|
|
43
|
+
| Junie | `junie` | `.junie/skills/` | `~/.junie/skills/` |
|
|
44
|
+
| iFlow CLI | `iflow-cli` | `.iflow/skills/` | `~/.iflow/skills/` |
|
|
45
|
+
| Kilo Code | `kilo` | `.agents/skills/` | `~/.kilo/skills/` |
|
|
46
|
+
| Kimchi | `kimchi` | `.kimchi/skills/` | `~/.config/kimchi/harness/skills/` |
|
|
47
|
+
| Kiro CLI | `kiro-cli` | `.kiro/skills/` | `~/.kiro/skills/` |
|
|
48
|
+
| Kode | `kode` | `.kode/skills/` | `~/.kode/skills/` |
|
|
49
|
+
| Lingma | `lingma` | `.lingma/skills/` | `~/.lingma/skills/` |
|
|
50
|
+
| MCPJam | `mcpjam` | `.mcpjam/skills/` | `~/.mcpjam/skills/` |
|
|
51
|
+
| MiniMax Code | `minimax-code` | `.minimax/skills/` | `~/.minimax/skills/` |
|
|
52
|
+
| Mistral Vibe | `mistral-vibe` | `.vibe/skills/` | `~/.vibe/skills/` |
|
|
53
|
+
| Moxby | `moxby` | `.moxby/skills/` | `~/.moxby/skills/` |
|
|
54
|
+
| Mux | `mux` | `.mux/skills/` | `~/.mux/skills/` |
|
|
55
|
+
| OpenCode | `opencode` | `.agents/skills/` | `~/.config/opencode/skills/` |
|
|
56
|
+
| OpenHands | `openhands` | `.openhands/skills/` | `~/.openhands/skills/` |
|
|
57
|
+
| Ona | `ona` | `.ona/skills/` | `~/.ona/skills/` |
|
|
58
|
+
| Posit Assistant | `posit-assistant` | `.posit/assistant/skills/` | `~/.posit/assistant/skills/` |
|
|
59
|
+
| Qoder | `qoder` | `.qoder/skills/` | `~/.qoder/skills/` |
|
|
60
|
+
| Qoder CN | `qoder-cn` | `.qoder/skills/` | `~/.qoder-cn/skills/` |
|
|
61
|
+
| Qwen Code | `qwen-code` | `.qwen/skills/` | `~/.qwen/skills/` |
|
|
62
|
+
| Reasonix | `reasonix` | `.reasonix/skills/` | `~/.reasonix/skills/` |
|
|
63
|
+
| Rovo Dev | `rovodev` | `.rovodev/skills/` | `~/.rovodev/skills/` |
|
|
64
|
+
| Roo Code | `roo` | `.roo/skills/` | `~/.roo/skills/` |
|
|
65
|
+
| Tabnine CLI | `tabnine-cli` | `.tabnine/agent/skills/` | `~/.tabnine/agent/skills/` |
|
|
66
|
+
| Terramind | `terramind` | `.terramind/skills/` | `~/.terramind/skills/` |
|
|
67
|
+
| Tinycloud | `tinycloud` | `.tinycloud/skills/` | `~/.tinycloud/skills/` |
|
|
68
|
+
| Trae | `trae` | `.trae/skills/` | `~/.trae/skills/` |
|
|
69
|
+
| Trae CN | `trae-cn` | `.trae/skills/` | `~/.trae-cn/skills/` |
|
|
70
|
+
| Windsurf | `windsurf` | `.windsurf/skills/` | `~/.codeium/windsurf/skills/` |
|
|
71
|
+
| ZCode | `zcode` | `.zcode/skills/` | `~/.zcode/skills/` |
|
|
72
|
+
| Zencoder, Zenflow | `zencoder`, `zenflow` | `.zencoder/skills/` | `~/.zencoder/skills/` |
|
|
73
|
+
| Neovate | `neovate` | `.neovate/skills/` | `~/.neovate/skills/` |
|
|
74
|
+
| Pochi | `pochi` | `.pochi/skills/` | `~/.pochi/skills/` |
|
|
75
|
+
| PromptScript | `promptscript` | `.agents/skills/` | N/A (project-only) |
|
|
76
|
+
| AdaL | `adal` | `.adal/skills/` | `~/.adal/skills/` |
|
|
77
|
+
<!-- supported-agents:end -->
|
|
78
|
+
|
|
79
|
+
> [!NOTE]
|
|
80
|
+
> **Kiro CLI users:** The default agent automatically loads skills from `.kiro/skills/` and `~/.kiro/skills/` — no
|
|
81
|
+
> configuration needed. If you use a **custom agent**, add skills to its `resources` in `.kiro/agents/<agent>.json`:
|
|
82
|
+
>
|
|
83
|
+
> ```json
|
|
84
|
+
> {
|
|
85
|
+
> "resources": ["skill://.kiro/skills/**/SKILL.md"]
|
|
86
|
+
> }
|
|
87
|
+
> ```
|
|
88
|
+
|
|
89
|
+
The CLI automatically detects which coding agents you have installed. If none are detected, you'll be prompted to select
|
|
90
|
+
which agents to install to.
|
|
91
|
+
|
|
92
|
+
## Compatibility
|
|
93
|
+
|
|
94
|
+
Skills are generally compatible across agents since they follow a
|
|
95
|
+
shared [Agent Skills specification](https://agentskills.io). However, some features may be agent-specific:
|
|
96
|
+
|
|
97
|
+
| Feature | OpenCode | OpenHands | Claude Code | Cline | CodeBuddy | Codex | Command Code | Kiro CLI | Cursor | Antigravity | Roo Code | Github Copilot | Amp | OpenClaw | Neovate | Pi | Qoder | Zencoder |
|
|
98
|
+
| --------------- | -------- | --------- | ----------- | ----- | --------- | ----- | ------------ | -------- | ------ | ----------- | -------- | -------------- | --- | -------- | ------- | --- | ----- | -------- |
|
|
99
|
+
| Basic skills | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
|
|
100
|
+
| `allowed-tools` | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No |
|
|
101
|
+
| `context: fork` | No | No | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No |
|
|
102
|
+
| Hooks | No | No | Yes | Yes | No | No | No | Yes | No | No | No | No | No | No | No | No | No | No |
|
|
103
|
+
|
|
104
|
+
## Related Links
|
|
105
|
+
|
|
106
|
+
- [Agent Skills Specification](https://agentskills.io)
|
|
107
|
+
- [Skills Directory](https://skills.sh)
|
|
108
|
+
- [Amp Skills Documentation](https://ampcode.com/manual#agent-skills)
|
|
109
|
+
- [Antigravity Skills Documentation](https://antigravity.google/docs/skills)
|
|
110
|
+
- [Factory AI / Droid Skills Documentation](https://docs.factory.ai/cli/configuration/skills)
|
|
111
|
+
- [Claude Code Skills Documentation](https://code.claude.com/docs/en/skills)
|
|
112
|
+
- [OpenClaw Skills Documentation](https://docs.openclaw.ai/tools/skills)
|
|
113
|
+
- [Cline Skills Documentation](https://docs.cline.bot/features/skills)
|
|
114
|
+
- [CodeBuddy Skills Documentation](https://www.codebuddy.ai/docs/ide/Features/Skills)
|
|
115
|
+
- [Codex Skills Documentation](https://developers.openai.com/codex/skills)
|
|
116
|
+
- [Command Code Skills Documentation](https://commandcode.ai/docs/skills)
|
|
117
|
+
- [Crush Skills Documentation](https://github.com/charmbracelet/crush?tab=readme-ov-file#agent-skills)
|
|
118
|
+
- [Cursor Skills Documentation](https://cursor.com/docs/context/skills)
|
|
119
|
+
- [Firebender Skills Documentation](https://docs.firebender.com/multi-agent/skills)
|
|
120
|
+
- [Gemini CLI Skills Documentation](https://geminicli.com/docs/cli/skills/)
|
|
121
|
+
- [GitHub Copilot Agent Skills](https://docs.github.com/en/copilot/concepts/agents/about-agent-skills)
|
|
122
|
+
- [iFlow CLI Skills Documentation](https://platform.iflow.cn/en/cli/examples/skill)
|
|
123
|
+
- [Kimi Code CLI Skills Documentation](https://moonshotai.github.io/kimi-code/en/customization/skills)
|
|
124
|
+
- [Kiro CLI Skills Documentation](https://kiro.dev/docs/cli/custom-agents/configuration-reference/#skill-resources)
|
|
125
|
+
- [Kode Skills Documentation](https://github.com/shareAI-lab/kode/blob/main/docs/skills.md)
|
|
126
|
+
- [OpenCode Skills Documentation](https://opencode.ai/docs/skills)
|
|
127
|
+
- [Qwen Code Skills Documentation](https://qwenlm.github.io/qwen-code-docs/en/users/features/skills/)
|
|
128
|
+
- [OpenHands Skills Documentation](https://docs.openhands.ai/modules/usage/how-to/using-skills)
|
|
129
|
+
- [Pi Skills Documentation](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/skills.md)
|
|
130
|
+
- [Posit Assistant Skills Documentation](https://assistant.posit.co/docs/features/skills/)
|
|
131
|
+
- [Qoder Skills Documentation](https://docs.qoder.com/cli/Skills)
|
|
132
|
+
- [Replit Skills Documentation](https://docs.replit.com/replitai/skills)
|
|
133
|
+
- [Roo Code Skills Documentation](https://docs.roocode.com/features/skills)
|
|
134
|
+
- [Trae Skills Documentation](https://docs.trae.ai/ide/skills)
|
|
135
|
+
- [Vercel Agent Skills Repository](https://github.com/vercel-labs/agent-skills)
|