skills 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +14 -9
  2. package/dist/cli.js +67 -16
  3. package/package.json +3 -3
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  The CLI for the open agent skills ecosystem.
4
4
 
5
5
  <!-- agent-list:start -->
6
- Supports **Opencode**, **Claude Code**, **Codex**, **Cursor**, and [23 more](#available-agents).
6
+ Supports **Opencode**, **Claude Code**, **Codex**, **Cursor**, and [25 more](#available-agents).
7
7
  <!-- agent-list:end -->
8
8
 
9
9
 
@@ -42,7 +42,7 @@ npx skills add ./my-local-skills
42
42
  | Option | Description |
43
43
  | ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
44
44
  | `-g, --global` | Install to user directory instead of project |
45
- | `-a, --agent <agents...>` | <!-- agent-names:start -->Target specific agents (e.g., `claude-code`, `codex`). See [Supported Agents](#supported-agents)<!-- agent-names:end --> |
45
+ | `-a, --agent <agents...>` | <!-- agent-names:start -->Target specific agents (e.g., `claude-code`, `codex`). See [Available Agents](#available-agents)<!-- agent-names:end --> |
46
46
  | `-s, --skill <skills...>` | Install specific skills by name |
47
47
  | `-l, --list` | List available skills without installing |
48
48
  | `-y, --yes` | Skip all confirmation prompts |
@@ -159,6 +159,7 @@ Skills can be installed to any of these agents:
159
159
  | Claude Code | `claude-code` | `.claude/skills/` | `~/.claude/skills/` |
160
160
  | Clawdbot | `clawdbot` | `skills/` | `~/.clawdbot/skills/` |
161
161
  | Cline | `cline` | `.cline/skills/` | `~/.cline/skills/` |
162
+ | CodeBuddy | `codebuddy` | `.codebuddy/skills/` | `~/.codebuddy/skills/` |
162
163
  | Codex | `codex` | `.codex/skills/` | `~/.codex/skills/` |
163
164
  | Command Code | `command-code` | `.commandcode/skills/` | `~/.commandcode/skills/` |
164
165
  | Continue | `continue` | `.continue/skills/` | `~/.continue/skills/` |
@@ -171,6 +172,7 @@ Skills can be installed to any of these agents:
171
172
  | Kilo Code | `kilo` | `.kilocode/skills/` | `~/.kilocode/skills/` |
172
173
  | Kiro CLI | `kiro-cli` | `.kiro/skills/` | `~/.kiro/skills/` |
173
174
  | MCPJam | `mcpjam` | `.mcpjam/skills/` | `~/.mcpjam/skills/` |
175
+ | Mux | `mux` | `.mux/skills/` | `~/.mux/skills/` |
174
176
  | OpenCode | `opencode` | `.opencode/skills/` | `~/.config/opencode/skills/` |
175
177
  | OpenHands | `openhands` | `.openhands/skills/` | `~/.openhands/skills/` |
176
178
  | Pi | `pi` | `.pi/skills/` | `~/.pi/agent/skills/` |
@@ -228,7 +230,6 @@ Describe the scenarios where this skill should be used.
228
230
  The CLI searches for skills in these locations within a repository:
229
231
 
230
232
  <!-- skill-discovery:start -->
231
-
232
233
  - Root directory (if it contains `SKILL.md`)
233
234
  - `skills/`
234
235
  - `skills/.curated/`
@@ -239,6 +240,7 @@ The CLI searches for skills in these locations within a repository:
239
240
  - `.claude/skills/`
240
241
  - `./skills/`
241
242
  - `.cline/skills/`
243
+ - `.codebuddy/skills/`
242
244
  - `.codex/skills/`
243
245
  - `.commandcode/skills/`
244
246
  - `.continue/skills/`
@@ -251,6 +253,7 @@ The CLI searches for skills in these locations within a repository:
251
253
  - `.kilocode/skills/`
252
254
  - `.kiro/skills/`
253
255
  - `.mcpjam/skills/`
256
+ - `.mux/skills/`
254
257
  - `.opencode/skills/`
255
258
  - `.openhands/skills/`
256
259
  - `.pi/skills/`
@@ -269,12 +272,12 @@ If no skills are found in standard locations, a recursive search is performed.
269
272
 
270
273
  Skills are generally compatible across agents since they follow a shared [Agent Skills specification](https://agentskills.io). However, some features may be agent-specific:
271
274
 
272
- | Feature | OpenCode | OpenHands | Claude Code | Cline | Codex | Command Code | Kiro CLI | Cursor | Antigravity | Roo Code | Github Copilot | Amp | Clawdbot | Neovate | Pi | Qoder | Zencoder |
273
- | --------------- | -------- | --------- | ----------- | ----- | ----- | ------------ | -------- | ------ | ----------- | -------- | -------------- | --- | -------- | ------- | --- | ----- | -------- |
274
- | Basic skills | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
275
- | `allowed-tools` | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No |
276
- | `context: fork` | No | No | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No |
277
- | Hooks | No | No | Yes | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No |
275
+ | Feature | OpenCode | OpenHands | Claude Code | Cline | CodeBuddy | Codex | Command Code | Kiro CLI | Cursor | Antigravity | Roo Code | Github Copilot | Amp | Clawdbot | Neovate | Pi | Qoder | Zencoder |
276
+ | --------------- | -------- | --------- | ----------- | ----- | --------- | ----- | ------------ | -------- | ------ | ----------- | -------- | -------------- | --- | -------- | ------- | --- | ----- | -------- |
277
+ | Basic skills | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
278
+ | `allowed-tools` | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | No |
279
+ | `context: fork` | No | No | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No | No |
280
+ | Hooks | No | No | Yes | Yes | No | No | No | No | No | No | No | No | No | No | No | No | No | No |
278
281
 
279
282
  ## Troubleshooting
280
283
 
@@ -312,9 +315,11 @@ Telemetry is automatically disabled in CI environments.
312
315
  - [Skills Directory](https://skills.sh)
313
316
  - [Amp Skills Documentation](https://ampcode.com/manual#agent-skills)
314
317
  - [Antigravity Skills Documentation](https://antigravity.google/docs/skills)
318
+ - [Factory AI / Droid Skills Documentation](https://docs.factory.ai/cli/configuration/skills)
315
319
  - [Claude Code Skills Documentation](https://code.claude.com/docs/en/skills)
316
320
  - [Clawdbot Skills Documentation](https://docs.clawd.bot/tools/skills)
317
321
  - [Cline Skills Documentation](https://docs.cline.bot/features/skills)
322
+ - [CodeBuddy Skills Documentation](https://www.codebuddy.ai/docs/ide/Features/Skills)
318
323
  - [Codex Skills Documentation](https://developers.openai.com/codex/skills)
319
324
  - [Command Code Skills Documentation](https://commandcode.ai/docs/skills)
320
325
  - [Crush Skills Documentation](https://github.com/charmbracelet/crush?tab=readme-ov-file#agent-skills)
package/dist/cli.js CHANGED
@@ -3,7 +3,7 @@
3
3
  // src/cli.ts
4
4
  import { spawnSync } from "child_process";
5
5
  import { writeFileSync, readFileSync, existsSync as existsSync3, mkdirSync, readdirSync, statSync } from "fs";
6
- import { basename as basename3, join as join6, dirname as dirname3 } from "path";
6
+ import { basename as basename3, join as join6, dirname as dirname4 } from "path";
7
7
  import { homedir as homedir5 } from "os";
8
8
  import { fileURLToPath } from "url";
9
9
 
@@ -268,6 +268,7 @@ async function discoverSkills(basePath, subpath) {
268
268
  join2(searchPath, ".agents/skills"),
269
269
  join2(searchPath, ".claude/skills"),
270
270
  join2(searchPath, ".cline/skills"),
271
+ join2(searchPath, ".codebuddy/skills"),
271
272
  join2(searchPath, ".codex/skills"),
272
273
  join2(searchPath, ".commandcode/skills"),
273
274
  join2(searchPath, ".continue/skills"),
@@ -276,6 +277,7 @@ async function discoverSkills(basePath, subpath) {
276
277
  join2(searchPath, ".goose/skills"),
277
278
  join2(searchPath, ".kilocode/skills"),
278
279
  join2(searchPath, ".kiro/skills"),
280
+ join2(searchPath, ".mux/skills"),
279
281
  join2(searchPath, ".neovate/skills"),
280
282
  join2(searchPath, ".opencode/skills"),
281
283
  join2(searchPath, ".openhands/skills"),
@@ -322,7 +324,7 @@ function getSkillDisplayName(skill) {
322
324
 
323
325
  // src/installer.ts
324
326
  import { mkdir, cp, access, readdir as readdir2, symlink, lstat, rm as rm2, readlink, writeFile } from "fs/promises";
325
- import { join as join4, basename as basename2, normalize as normalize2, resolve as resolve3, sep as sep2, relative } from "path";
327
+ import { join as join4, basename as basename2, normalize as normalize2, resolve as resolve3, sep as sep2, relative, dirname as dirname2 } from "path";
326
328
  import { homedir as homedir2, platform } from "os";
327
329
 
328
330
  // src/agents.ts
@@ -377,6 +379,15 @@ var agents = {
377
379
  return existsSync(join3(home, ".cline"));
378
380
  }
379
381
  },
382
+ codebuddy: {
383
+ name: "codebuddy",
384
+ displayName: "CodeBuddy",
385
+ skillsDir: ".codebuddy/skills",
386
+ globalSkillsDir: join3(home, ".codebuddy/skills"),
387
+ detectInstalled: async () => {
388
+ return existsSync(join3(process.cwd(), ".codebuddy")) || existsSync(join3(home, ".codebuddy"));
389
+ }
390
+ },
380
391
  codex: {
381
392
  name: "codex",
382
393
  displayName: "Codex",
@@ -485,6 +496,15 @@ var agents = {
485
496
  return existsSync(join3(home, ".mcpjam"));
486
497
  }
487
498
  },
499
+ mux: {
500
+ name: "mux",
501
+ displayName: "Mux",
502
+ skillsDir: ".mux/skills",
503
+ globalSkillsDir: join3(home, ".mux/skills"),
504
+ detectInstalled: async () => {
505
+ return existsSync(join3(home, ".mux"));
506
+ }
507
+ },
488
508
  opencode: {
489
509
  name: "opencode",
490
510
  displayName: "OpenCode",
@@ -610,13 +630,42 @@ function getCanonicalSkillsDir(global, cwd) {
610
630
  const baseDir = global ? homedir2() : cwd || process.cwd();
611
631
  return join4(baseDir, AGENTS_DIR, SKILLS_SUBDIR);
612
632
  }
633
+ function resolveSymlinkTarget(linkPath, linkTarget) {
634
+ return resolve3(dirname2(linkPath), linkTarget);
635
+ }
636
+ async function ensureDirectory(path) {
637
+ try {
638
+ const stats = await lstat(path);
639
+ if (stats.isSymbolicLink()) {
640
+ await rm2(path, { recursive: true, force: true });
641
+ }
642
+ } catch (err) {
643
+ if (err && typeof err === "object" && "code" in err) {
644
+ if (err.code !== "ENOENT") {
645
+ if (err.code === "ELOOP") {
646
+ await rm2(path, { recursive: true, force: true });
647
+ } else {
648
+ throw err;
649
+ }
650
+ }
651
+ } else if (err) {
652
+ throw err;
653
+ }
654
+ }
655
+ await mkdir(path, { recursive: true });
656
+ }
613
657
  async function createSymlink(target, linkPath) {
614
658
  try {
659
+ const resolvedTarget = resolve3(target);
660
+ const resolvedLinkPath = resolve3(linkPath);
661
+ if (resolvedTarget === resolvedLinkPath) {
662
+ return true;
663
+ }
615
664
  try {
616
665
  const stats = await lstat(linkPath);
617
666
  if (stats.isSymbolicLink()) {
618
667
  const existingTarget = await readlink(linkPath);
619
- if (resolve3(existingTarget) === resolve3(target)) {
668
+ if (resolveSymlinkTarget(linkPath, existingTarget) === resolvedTarget) {
620
669
  return true;
621
670
  }
622
671
  await rm2(linkPath);
@@ -631,7 +680,7 @@ async function createSymlink(target, linkPath) {
631
680
  }
632
681
  }
633
682
  }
634
- const linkDir = join4(linkPath, "..");
683
+ const linkDir = dirname2(linkPath);
635
684
  await mkdir(linkDir, { recursive: true });
636
685
  const relativePath = relative(linkDir, target);
637
686
  const symlinkType = platform() === "win32" ? "junction" : void 0;
@@ -678,7 +727,7 @@ async function installSkillForAgent(skill, agentType, options = {}) {
678
727
  mode: "copy"
679
728
  };
680
729
  }
681
- await mkdir(canonicalDir, { recursive: true });
730
+ await ensureDirectory(canonicalDir);
682
731
  await copyDirectory(skill.path, canonicalDir);
683
732
  const symlinkCreated = await createSymlink(canonicalDir, agentDir);
684
733
  if (!symlinkCreated) {
@@ -712,21 +761,24 @@ async function installSkillForAgent(skill, agentType, options = {}) {
712
761
  }
713
762
  }
714
763
  var EXCLUDE_FILES = /* @__PURE__ */ new Set(["README.md", "metadata.json"]);
715
- var isExcluded = (name) => {
764
+ var EXCLUDE_DIRS = /* @__PURE__ */ new Set([".git"]);
765
+ var isExcluded = (name, isDirectory = false) => {
716
766
  if (EXCLUDE_FILES.has(name)) return true;
717
767
  if (name.startsWith("_")) return true;
768
+ if (isDirectory && EXCLUDE_DIRS.has(name)) return true;
718
769
  return false;
719
770
  };
720
771
  async function copyDirectory(src, dest) {
721
772
  await mkdir(dest, { recursive: true });
722
773
  const entries = await readdir2(src, { withFileTypes: true });
723
774
  for (const entry of entries) {
724
- if (isExcluded(entry.name)) {
775
+ const isDir = entry.isDirectory();
776
+ if (isExcluded(entry.name, isDir)) {
725
777
  continue;
726
778
  }
727
779
  const srcPath = join4(src, entry.name);
728
780
  const destPath = join4(dest, entry.name);
729
- if (entry.isDirectory()) {
781
+ if (isDir) {
730
782
  await copyDirectory(srcPath, destPath);
731
783
  } else {
732
784
  await cp(srcPath, destPath);
@@ -794,7 +846,7 @@ async function installRemoteSkillForAgent(skill, agentType, options = {}) {
794
846
  mode: "copy"
795
847
  };
796
848
  }
797
- await mkdir(canonicalDir, { recursive: true });
849
+ await ensureDirectory(canonicalDir);
798
850
  const skillMdPath = join4(canonicalDir, "SKILL.md");
799
851
  await writeFile(skillMdPath, skill.content, "utf-8");
800
852
  const symlinkCreated = await createSymlink(canonicalDir, agentDir);
@@ -1066,7 +1118,7 @@ async function fetchMintlifySkill(url) {
1066
1118
 
1067
1119
  // src/skill-lock.ts
1068
1120
  import { readFile as readFile2, writeFile as writeFile2, mkdir as mkdir2 } from "fs/promises";
1069
- import { join as join5, dirname as dirname2 } from "path";
1121
+ import { join as join5, dirname as dirname3 } from "path";
1070
1122
  import { homedir as homedir3 } from "os";
1071
1123
  var AGENTS_DIR2 = ".agents";
1072
1124
  var LOCK_FILE = ".skill-lock.json";
@@ -1092,7 +1144,7 @@ async function readSkillLock() {
1092
1144
  }
1093
1145
  async function writeSkillLock(lock) {
1094
1146
  const lockPath = getSkillLockPath();
1095
- await mkdir2(dirname2(lockPath), { recursive: true });
1147
+ await mkdir2(dirname3(lockPath), { recursive: true });
1096
1148
  const content = JSON.stringify(lock, null, 2);
1097
1149
  await writeFile2(lockPath, content, "utf-8");
1098
1150
  }
@@ -1167,7 +1219,7 @@ async function dismissPrompt(promptKey) {
1167
1219
  // package.json
1168
1220
  var package_default = {
1169
1221
  name: "skills",
1170
- version: "1.1.2",
1222
+ version: "1.1.3",
1171
1223
  description: "The open agent skills ecosystem",
1172
1224
  type: "module",
1173
1225
  bin: {
@@ -1200,13 +1252,12 @@ var package_default = {
1200
1252
  "agent-skills",
1201
1253
  "skills",
1202
1254
  "ai-agents",
1203
- "ai",
1204
- "ecosystem",
1205
1255
  "amp",
1206
1256
  "antigravity",
1207
1257
  "claude-code",
1208
1258
  "clawdbot",
1209
1259
  "cline",
1260
+ "codebuddy",
1210
1261
  "codex",
1211
1262
  "command-code",
1212
1263
  "continue",
@@ -1219,6 +1270,7 @@ var package_default = {
1219
1270
  "kilo",
1220
1271
  "kiro-cli",
1221
1272
  "mcpjam",
1273
+ "mux",
1222
1274
  "opencode",
1223
1275
  "openhands",
1224
1276
  "pi",
@@ -1854,7 +1906,6 @@ async function runAdd(args, options = {}) {
1854
1906
  }
1855
1907
  if (options.all) {
1856
1908
  options.yes = true;
1857
- options.global = true;
1858
1909
  }
1859
1910
  console.log();
1860
1911
  p.intro(chalk.bgCyan.black(" skills "));
@@ -2577,7 +2628,7 @@ ${DIM} 2) npx skills add <owner/repo@skill>${RESET}`;
2577
2628
  }
2578
2629
 
2579
2630
  // src/cli.ts
2580
- var __dirname = dirname3(fileURLToPath(import.meta.url));
2631
+ var __dirname = dirname4(fileURLToPath(import.meta.url));
2581
2632
  function getVersion() {
2582
2633
  try {
2583
2634
  const pkgPath = join6(__dirname, "..", "package.json");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skills",
3
- "version": "1.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "The open agent skills ecosystem",
5
5
  "type": "module",
6
6
  "bin": {
@@ -33,13 +33,12 @@
33
33
  "agent-skills",
34
34
  "skills",
35
35
  "ai-agents",
36
- "ai",
37
- "ecosystem",
38
36
  "amp",
39
37
  "antigravity",
40
38
  "claude-code",
41
39
  "clawdbot",
42
40
  "cline",
41
+ "codebuddy",
43
42
  "codex",
44
43
  "command-code",
45
44
  "continue",
@@ -52,6 +51,7 @@
52
51
  "kilo",
53
52
  "kiro-cli",
54
53
  "mcpjam",
54
+ "mux",
55
55
  "opencode",
56
56
  "openhands",
57
57
  "pi",