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/dist/cli.mjs CHANGED
@@ -1694,8 +1694,8 @@ const agents = {
1694
1694
  fx: {
1695
1695
  name: "fx",
1696
1696
  displayName: "fx",
1697
- skillsDir: ".fx/skills",
1698
- globalSkillsDir: join(home, ".fx/skills"),
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
- if (pathsOverlap(skill.path, canonicalDir)) return {
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.2";
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
- if (!remote.has(key)) remote.set(key, {
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 experimental_sync ")));
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 { include, exclude } = options;
6664
- const discoveredSkills = discovery.skills.filter((skill) => (!include?.length || matchesSkill(skill, include)) && !(exclude?.length && matchesSkill(skill, exclude)));
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 || discovery.remote.some((r) => isFromRequest(entry, r));
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 ? [] : discovery.remote).filter((request) => !isRemoteInstalled(request, localLock, cwd));
6675
- if (discoveredSkills.length === 0 && remoteRequests.length === 0) {
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
- if (toInstall.length === 0 && remoteRequests.length === 0) {
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 = toInstall.find((s) => s.name === skillName)?.packageName;
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 experimental_sync${RESET} ${DIM}Sync skills from node_modules${RESET}`);
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
- experimental_sync Sync skills from node_modules into agent directories
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}Experimental Sync Options:${RESET}
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
- ${DIM}$${RESET} skills add vercel-labs/agent-skills
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)