A CLI that discovers agent skills shipped inside npm packages and creates symlinks for coding agents to consume.
Current skill distribution approaches (e.g. @vercel-labs/skills) have friction:
This project proposes a convention: ship skills inside npm packages. When you npm install a tool, its skills come bundled. Run skills-npm to symlink them for your agent.
Read the full proposal: PROPOSAL.md
Install as a dev dependency and run setup once:
npm i -D skills-npm
npx skills-npm setup
skills-npm setup wires the tool into your package.json prepare script, adds the ignore pattern to your .gitignore, and runs the first sync. After that, skills are re-symlinked for your agent automatically whenever you install dependencies.
setup merges into any existing prepare script (it appends with && and is a no-op if already wired), resulting in:
{
"private": true,
"scripts": {
"prepare": "skills-npm"
}
}
skills-npm symlinks the skills from node_modules to skills/npm-<package-name>-<skill-name> for your agent, and setup adds the following to your .gitignore:
**/skills/npm-*
[!NOTE]
Keepskills-npmas adevDependency. Thepreparescript runs oninstall(and beforepublish/pack), but never for people who install your published package, so it is safe to commit.
You can create a skills-npm.config.ts file in your project root to configure the behavior:
// skills-npm.config.ts
import { defineConfig } from 'skills-npm'
export default defineConfig({
// Source to discover skills from: 'node_modules' or 'package.json'
source: 'package.json',
// Target specific agents (defaults to all detected agents)
agents: ['cursor', 'windsurf'],
// Scan recursively for monorepo packages (default: false)
recursive: false,
// Whether to update .gitignore (default: true)
gitignore: true,
// Skip confirmation prompts (default: false)
yes: false,
// Dry run mode (default: false)
dryRun: false,
// Include specific packages or skills
include: [
// Include all skills from a package
'@some/package',
// Include all skills from packages matching a wildcard pattern
'@some/*',
// Include specific skills from packages matching a wildcard pattern
{ package: '@some/*', skills: ['integration'] },
// Include specific skills from a package
{ package: '@slidev/cli', skills: ['presenter-mode'] },
],
// Exclude specific packages or skills
exclude: [
// Exclude all skills from a package
'@some/package',
// Exclude all skills from packages matching a wildcard pattern
'@some/*',
// Exclude specific skills from packages matching a wildcard pattern
{ package: '@some/*', skills: ['integration'] },
// Exclude specific skills from a package
{ package: '@slidev/cli', skills: ['presenter-mode'] },
],
})
include and exclude support package wildcard patterns such as @some/*. These filters only apply to packages that were already discovered from node_modules or package.json.
| Option | Type | Default | Description |
|---|---|---|---|
cwd |
string |
Workspace root | Current working directory |
source |
'node_modules' | 'package.json' |
'package.json' |
Source to discover skills from |
agents |
string | string[] |
All detected | Target agents to install to |
recursive |
boolean |
false |
Scan recursively for monorepo packages |
gitignore |
boolean |
true |
Whether to update .gitignore |
yes |
boolean |
false |
Skip confirmation prompts |
dryRun |
boolean |
false |
Show what would be done without making changes |
include |
(string | { package: string, skills: string[] })[] |
undefined |
Packages or skills to include. Supports package wildcard patterns like @some/* |
exclude |
(string | { package: string, skills: string[] })[] |
[] |
Packages or skills to exclude. Supports package wildcard patterns like @some/* |
The
cwddefaults to the workspace root, which is detected by searching up forpnpm-workspace.yaml,lerna.json, or apackage.jsonwithworkspacesfield. Falls back to the nearestpackage.json.
skills-npm [options] # discover and symlink skills (run by the prepare hook)
skills-npm setup [options] # add the prepare script, then run the first sync (run once)
Options:
--cwd <cwd> Current working directory
-s, --source <source> Source to discover skills from (default: 'package.json')
-a, --agents Comma-separated list of agents to install to
-r, --recursive Scan recursively for monorepo packages
--yes Skip confirmation prompts
--dry-run Show what would be done without making changes
--force Force full reload, ignore cache
--no-cleanup Keep stale npm-* skills in agent directories
--no-gitignore Do not update .gitignore
-h, --help Display help
-v, --version Display version
When agents is not set, skills-npm auto-detects which coding agents you use and installs to those. Detection combines two signals:
~/.cursor, ~/.claude).PATH (e.g. claude, codex, gemini, cursor-agent). This catches agents that are installed but have not created their config directory yet.The command check is conservative: only agents with an unambiguous CLI name are probed, so generic names and GUI-only editors are matched by the directory check alone.
In an interactive terminal, the prompt lists all agents with the detected ones pre-selected, so you can add or remove any. Non-interactively (e.g. from the prepare hook), the detected set is used directly. Pass --agents (or set agents in the config) to bypass detection entirely.
Include a skills/ directory in your package:
my-tool/
├── package.json
├── dist/
└── skills/
└── my-skill/
└── SKILL.md
See PROPOSAL.md for detailed instructions.
Packages that ships their built-in skills:
[!NOTE]
PR are welcome to add more packages that ships their built-in skills.
MIT License © Anthony Fu