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.
- package/README.md +14 -9
- package/dist/cli.js +67 -16
- 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 [
|
|
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 [
|
|
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
|
|
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 (
|
|
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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
|
|
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
|
|
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(
|
|
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.
|
|
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 =
|
|
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.
|
|
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",
|