skills 1.3.2 → 1.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -5
- package/dist/cli.mjs +39 -13
- package/package.json +1 -2
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 [35 more](#available-agents).
|
|
7
7
|
<!-- agent-list:end -->
|
|
8
8
|
|
|
9
9
|
## Install a Skill
|
|
@@ -39,7 +39,7 @@ npx skills add ./my-local-skills
|
|
|
39
39
|
| Option | Description |
|
|
40
40
|
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
41
41
|
| `-g, --global` | Install to user directory instead of project |
|
|
42
|
-
| `-a, --agent <agents...>` | <!-- agent-names:start -->Target specific agents (e.g., `claude-code`, `codex`). See [
|
|
42
|
+
| `-a, --agent <agents...>` | <!-- agent-names:start -->Target specific agents (e.g., `claude-code`, `codex`). See [Available Agents](#available-agents)<!-- agent-names:end --> |
|
|
43
43
|
| `-s, --skill <skills...>` | Install specific skills by name (use `'*'` for all skills) |
|
|
44
44
|
| `-l, --list` | List available skills without installing |
|
|
45
45
|
| `-y, --yes` | Skip all confirmation prompts |
|
|
@@ -209,7 +209,7 @@ Skills can be installed to any of these agents:
|
|
|
209
209
|
| Agent | `--agent` | Project Path | Global Path |
|
|
210
210
|
|-------|-----------|--------------|-------------|
|
|
211
211
|
| Amp, Kimi Code CLI | `amp`, `kimi-cli` | `.agents/skills/` | `~/.config/agents/skills/` |
|
|
212
|
-
| Antigravity | `antigravity` | `.agent/skills/` | `~/.gemini/antigravity/
|
|
212
|
+
| Antigravity | `antigravity` | `.agent/skills/` | `~/.gemini/antigravity/skills/` |
|
|
213
213
|
| Augment | `augment` | `.augment/rules/` | `~/.augment/rules/` |
|
|
214
214
|
| Claude Code | `claude-code` | `.claude/skills/` | `~/.claude/skills/` |
|
|
215
215
|
| OpenClaw | `openclaw` | `skills/` | `~/.moltbot/skills/` |
|
|
@@ -233,7 +233,6 @@ Skills can be installed to any of these agents:
|
|
|
233
233
|
| Mistral Vibe | `mistral-vibe` | `.vibe/skills/` | `~/.vibe/skills/` |
|
|
234
234
|
| Mux | `mux` | `.mux/skills/` | `~/.mux/skills/` |
|
|
235
235
|
| OpenCode | `opencode` | `.opencode/skills/` | `~/.config/opencode/skills/` |
|
|
236
|
-
| OpenClaude IDE | `openclaude` | `.openclaude/skills/` | `~/.openclaude/skills/` |
|
|
237
236
|
| OpenHands | `openhands` | `.openhands/skills/` | `~/.openhands/skills/` |
|
|
238
237
|
| Pi | `pi` | `.pi/skills/` | `~/.pi/agent/skills/` |
|
|
239
238
|
| Qoder | `qoder` | `.qoder/skills/` | `~/.qoder/skills/` |
|
|
@@ -341,7 +340,6 @@ The CLI searches for skills in these locations within a repository:
|
|
|
341
340
|
- `.vibe/skills/`
|
|
342
341
|
- `.mux/skills/`
|
|
343
342
|
- `.opencode/skills/`
|
|
344
|
-
- `.openclaude/skills/`
|
|
345
343
|
- `.openhands/skills/`
|
|
346
344
|
- `.pi/skills/`
|
|
347
345
|
- `.qoder/skills/`
|
|
@@ -355,6 +353,24 @@ The CLI searches for skills in these locations within a repository:
|
|
|
355
353
|
- `.adal/skills/`
|
|
356
354
|
<!-- skill-discovery:end -->
|
|
357
355
|
|
|
356
|
+
### Plugin Manifest Discovery
|
|
357
|
+
|
|
358
|
+
If `.claude-plugin/marketplace.json` or `.claude-plugin/plugin.json` exists, skills declared in those files are also discovered:
|
|
359
|
+
|
|
360
|
+
```json
|
|
361
|
+
// .claude-plugin/marketplace.json
|
|
362
|
+
{
|
|
363
|
+
"metadata": { "pluginRoot": "./plugins" },
|
|
364
|
+
"plugins": [{
|
|
365
|
+
"name": "my-plugin",
|
|
366
|
+
"source": "my-plugin",
|
|
367
|
+
"skills": ["./skills/review", "./skills/test"]
|
|
368
|
+
}]
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
This enables compatibility with the [Claude Code plugin marketplace](https://code.claude.com/docs/en/plugin-marketplaces) ecosystem.
|
|
373
|
+
|
|
358
374
|
If no skills are found in standard locations, a recursive search is performed.
|
|
359
375
|
|
|
360
376
|
## Compatibility
|
package/dist/cli.mjs
CHANGED
|
@@ -364,6 +364,41 @@ async function cleanupTempDir(dir) {
|
|
|
364
364
|
});
|
|
365
365
|
}
|
|
366
366
|
var import_gray_matter = /* @__PURE__ */ __toESM(require_gray_matter(), 1);
|
|
367
|
+
function isContainedIn(targetPath, basePath) {
|
|
368
|
+
const normalizedBase = normalize(resolve(basePath));
|
|
369
|
+
const normalizedTarget = normalize(resolve(targetPath));
|
|
370
|
+
return normalizedTarget.startsWith(normalizedBase + sep) || normalizedTarget === normalizedBase;
|
|
371
|
+
}
|
|
372
|
+
function isValidRelativePath(path) {
|
|
373
|
+
return path.startsWith("./");
|
|
374
|
+
}
|
|
375
|
+
async function getPluginSkillPaths(basePath) {
|
|
376
|
+
const searchDirs = [];
|
|
377
|
+
const addPluginSkillPaths = (pluginBase, skills) => {
|
|
378
|
+
if (!isContainedIn(pluginBase, basePath)) return;
|
|
379
|
+
if (skills && skills.length > 0) for (const skillPath of skills) {
|
|
380
|
+
if (!isValidRelativePath(skillPath)) continue;
|
|
381
|
+
const skillDir = dirname(join(pluginBase, skillPath));
|
|
382
|
+
if (isContainedIn(skillDir, basePath)) searchDirs.push(skillDir);
|
|
383
|
+
}
|
|
384
|
+
searchDirs.push(join(pluginBase, "skills"));
|
|
385
|
+
};
|
|
386
|
+
try {
|
|
387
|
+
const content = await readFile(join(basePath, ".claude-plugin/marketplace.json"), "utf-8");
|
|
388
|
+
const manifest = JSON.parse(content);
|
|
389
|
+
const pluginRoot = manifest.metadata?.pluginRoot;
|
|
390
|
+
if (pluginRoot === void 0 || isValidRelativePath(pluginRoot)) for (const plugin of manifest.plugins ?? []) {
|
|
391
|
+
if (typeof plugin.source !== "string" && plugin.source !== void 0) continue;
|
|
392
|
+
if (plugin.source !== void 0 && !isValidRelativePath(plugin.source)) continue;
|
|
393
|
+
addPluginSkillPaths(join(basePath, pluginRoot ?? "", plugin.source ?? ""), plugin.skills);
|
|
394
|
+
}
|
|
395
|
+
} catch {}
|
|
396
|
+
try {
|
|
397
|
+
const content = await readFile(join(basePath, ".claude-plugin/plugin.json"), "utf-8");
|
|
398
|
+
addPluginSkillPaths(basePath, JSON.parse(content).skills);
|
|
399
|
+
} catch {}
|
|
400
|
+
return searchDirs;
|
|
401
|
+
}
|
|
367
402
|
const SKIP_DIRS = [
|
|
368
403
|
"node_modules",
|
|
369
404
|
".git",
|
|
@@ -445,7 +480,6 @@ async function discoverSkills(basePath, subpath, options) {
|
|
|
445
480
|
join(searchPath, ".kiro/skills"),
|
|
446
481
|
join(searchPath, ".mux/skills"),
|
|
447
482
|
join(searchPath, ".neovate/skills"),
|
|
448
|
-
join(searchPath, ".openclaude/skills"),
|
|
449
483
|
join(searchPath, ".opencode/skills"),
|
|
450
484
|
join(searchPath, ".openhands/skills"),
|
|
451
485
|
join(searchPath, ".pi/skills"),
|
|
@@ -455,6 +489,7 @@ async function discoverSkills(basePath, subpath, options) {
|
|
|
455
489
|
join(searchPath, ".windsurf/skills"),
|
|
456
490
|
join(searchPath, ".zencoder/skills")
|
|
457
491
|
];
|
|
492
|
+
prioritySearchDirs.push(...await getPluginSkillPaths(searchPath));
|
|
458
493
|
for (const dir of prioritySearchDirs) try {
|
|
459
494
|
const entries = await readdir(dir, { withFileTypes: true });
|
|
460
495
|
for (const entry of entries) if (entry.isDirectory()) {
|
|
@@ -509,7 +544,7 @@ const agents = {
|
|
|
509
544
|
name: "antigravity",
|
|
510
545
|
displayName: "Antigravity",
|
|
511
546
|
skillsDir: ".agent/skills",
|
|
512
|
-
globalSkillsDir: join(home, ".gemini/antigravity/
|
|
547
|
+
globalSkillsDir: join(home, ".gemini/antigravity/skills"),
|
|
513
548
|
detectInstalled: async () => {
|
|
514
549
|
return existsSync(join(process.cwd(), ".agent")) || existsSync(join(home, ".gemini/antigravity"));
|
|
515
550
|
}
|
|
@@ -730,15 +765,6 @@ const agents = {
|
|
|
730
765
|
return existsSync(join(configHome, "opencode")) || existsSync(join(claudeHome, "skills"));
|
|
731
766
|
}
|
|
732
767
|
},
|
|
733
|
-
openclaude: {
|
|
734
|
-
name: "openclaude",
|
|
735
|
-
displayName: "OpenClaude IDE",
|
|
736
|
-
skillsDir: ".openclaude/skills",
|
|
737
|
-
globalSkillsDir: join(home, ".openclaude/skills"),
|
|
738
|
-
detectInstalled: async () => {
|
|
739
|
-
return existsSync(join(home, ".openclaude")) || existsSync(join(process.cwd(), ".openclaude"));
|
|
740
|
-
}
|
|
741
|
-
},
|
|
742
768
|
openhands: {
|
|
743
769
|
name: "openhands",
|
|
744
770
|
displayName: "OpenHands",
|
|
@@ -1674,7 +1700,7 @@ async function saveSelectedAgents(agents) {
|
|
|
1674
1700
|
lock.lastSelectedAgents = agents;
|
|
1675
1701
|
await writeSkillLock(lock);
|
|
1676
1702
|
}
|
|
1677
|
-
var version$1 = "1.3.
|
|
1703
|
+
var version$1 = "1.3.4";
|
|
1678
1704
|
const isCancelled = (value) => typeof value === "symbol";
|
|
1679
1705
|
async function isSourcePrivate(source) {
|
|
1680
1706
|
const ownerRepo = parseOwnerRepo(source);
|
|
@@ -2902,7 +2928,7 @@ async function searchSkillsAPI(query) {
|
|
|
2902
2928
|
return (await res.json()).skills.map((skill) => ({
|
|
2903
2929
|
name: skill.name,
|
|
2904
2930
|
slug: skill.id,
|
|
2905
|
-
source: skill.
|
|
2931
|
+
source: skill.source || "",
|
|
2906
2932
|
installs: skill.installs
|
|
2907
2933
|
}));
|
|
2908
2934
|
} catch {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skills",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.4",
|
|
4
4
|
"description": "The open agent skills ecosystem",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -62,7 +62,6 @@
|
|
|
62
62
|
"mistral-vibe",
|
|
63
63
|
"mux",
|
|
64
64
|
"opencode",
|
|
65
|
-
"openclaude",
|
|
66
65
|
"openhands",
|
|
67
66
|
"pi",
|
|
68
67
|
"qoder",
|