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.
Files changed (3) hide show
  1. package/README.md +21 -5
  2. package/dist/cli.mjs +39 -13
  3. 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 [36 more](#supported-agents).
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 [Supported Agents](#supported-agents)<!-- agent-names:end --> |
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/global_skills/` |
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/global_skills"),
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.2";
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.topSource || "",
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.2",
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",