Installing, sharing and pinning skills across a team
The skills CLI (npm skills 1.7.0) installs Agent Skills from a GitHub repository into Claude Code, Codex and Cursor with npx skills add, and records each project install in skills-lock.json. A team shares skills by committing the skill folders and that lockfile. Pin each source to a git tag or commit with owner/repo#ref; an unpinned lockfile restores the latest upstream version.
This page is for the developer who installs skills and the tech lead who has to keep eight people on the same set. The situation it fixes: a teammate’s agent writes tests first and yours does not, nobody knows which skills each machine loads, and last week’s npx skills update changed behaviour that nobody reviewed.
What a pinned, shared skill set gives your team
Section titled “What a pinned, shared skill set gives your team”- One install command that puts the same skills into Claude Code, Codex and Cursor, including the companion skills that some skills cannot run without.
- A pin that survives
npx skills update, and a CI check that fails when the committed skills drift from it. - A rule for when to use a plugin instead of a portable copy, and how to avoid getting every skill twice.
- The eight skills CLI 1.7.0 traps that install the wrong set or fail in ways that are easy to miss, each with its fix.
- Four copy-paste prompts: discovery, onboarding check, conflict audit and quarterly review.
If you are new to skills, read what Agent Skills are and when they beat an MCP server first.
How do you install a skill for Claude Code, Codex and Cursor at once?
Section titled “How do you install a skill for Claude Code, Codex and Cursor at once?”The CLI runs through npx, so there is nothing to install globally. Every command below was run against skills 1.7.0 (published 2026-09-17) on 2026-09-26.
Start by listing what a repository contains, without installing anything:
npx skills add mattpocock/skills --listThen install the skills you want, for the agents you use:
npx skills add mattpocock/skills --skill grill-me grilling setup-matt-pocock-skills -a claude-code -a codex -a cursorThis installs three skills, not one, on purpose. grill-me is a one-line delegate whose body is “Run a /grilling session”, so without grilling it points at nothing. setup-matt-pocock-skills configures the issue tracker and docs location the rest of the set expects. The grill-me guide walks through a full session.
What you should see on disk after that command:
skills-lock.json.agents/skills/grill-me/SKILL.md # the real files (Codex and Cursor read here).agents/skills/grilling/SKILL.md.agents/skills/setup-matt-pocock-skills/….claude/skills/grill-me -> ../../.agents/skills/grill-me # symlinks for Claude Code.claude/skills/grilling -> ../../.agents/skills/grillingThe CLI keeps one canonical copy in .agents/skills/ and symlinks it into .claude/skills/. Pass --copy if your team works on Windows checkouts where Git does not create symlinks.
Two routes, and they are not equivalent:
# Plugin route: namespaced, updates with the marketplaceclaude plugin install mattpocock-skills
# Portable route: files in the repo, pinned by younpx skills add mattpocock/skills --skill grill-me grilling setup-matt-pocock-skills -a claude-codeWith the plugin you invoke /mattpocock-skills:grill-me; with the portable copy you type /grill-me. Run /setup-matt-pocock-skills once per repository. To see what the plugin costs before you commit to it, run claude plugin details mattpocock-skills; it prints the projected always-on tokens.
npx skills add mattpocock/skills --skill grill-me grilling setup-matt-pocock-skills -a codexCodex reads project skills from .agents/skills/. Invoke a skill with a $ mention: $grill-me I want to add per-seat billing. Codex also has plugins (codex plugin add <plugin>@<marketplace>, verb add, not install, in codex-cli 0.157.1), covered on the plugins page.
npx skills add mattpocock/skills --skill grill-me grilling setup-matt-pocock-skills -a cursorThe CLI writes Cursor’s project skills to .agents/skills/ and global ones to ~/.cursor/skills/. Invoke with /grill-me in Agent chat. Cursor’s own documentation was unreachable when this page was checked, so confirm the result by asking Cursor’s agent which skills it can see (the onboarding prompt below does that).
Which skills CLI commands do you need day to day?
Section titled “Which skills CLI commands do you need day to day?”| Command | What it does |
|---|---|
npx skills add <owner/repo> --list | Lists the skills in a repository; installs nothing |
npx skills add <owner/repo> --skill a b -a claude-code | Installs named skills for named agents (project scope) |
npx skills add <owner/repo> -g … | Installs at user level (~/.claude/skills/, ~/.codex/skills/, ~/.cursor/skills/); not recorded in skills-lock.json |
npx skills add <owner/repo> --full-depth --list | Searches below a root SKILL.md; needed for collection repos |
npx skills use <owner/repo>@<skill> | claude | Tries a skill once without installing it |
npx skills find [query] | Searches the skills.sh index |
npx skills list (alias ls) | Lists project skills with their source; add -g for global |
npx skills update [names] -p -y | Updates project skills (-g for global) |
npx skills remove <name> (alias rm) | Removes the skill, its symlinks and its lockfile entry |
npx skills experimental_install | Restores the skills recorded in skills-lock.json |
GitHub’s CLI has its own preview route, gh skill install <repository> <skill>, with --agent, --scope and --pin flags (read from the cli/cli source, 2026-09-26; not run here). Pick one installer per repository so there is one source of truth.
How do you discover skills without trusting install counts?
Section titled “How do you discover skills without trusting install counts?”The find-skills meta skill runs npx skills find for you and proposes install commands:
npx skills add vercel-labs/skills --skill find-skills -a claude-code -a codex -a cursorAs of 2026-09-26, find-skills had 3,568,681 all-time installs on skills.sh, read from the third-party LinklyAI/best-skills scrape (SECONDARY; skills.sh itself was not reachable, so re-read it before you quote the number). Treat counts as attention, not quality: renamed skills keep their old counts, and copycat repositories named superpowers rank above unrelated skills. Install from the canonical owner.
How do you roll skills out to a team and keep them pinned?
Section titled “How do you roll skills out to a team and keep them pinned?”This is the team workflow. It treats skills like dependencies: pin, commit, verify in CI, update deliberately.
-
Install at project scope, pinned to a ref.
owner/repo#refaccepts a tag, branch or commit, and the CLI writes the ref intoskills-lock.json. Pin to a tag or commit SHA, because a branch ref moves on every update or restore:Terminal window npx skills add "mattpocock/skills#v1.2.3" --skill grill-me grilling setup-matt-pocock-skills -a claude-code -a codex -a cursorWithout
#ref, the lockfile records only the source and a content hash, andexperimental_installfetches whatever is on the default branch that day. The hash is recorded, not enforced. -
Read what you installed before you commit it. Skills run with the agent’s full permissions (the CLI prints this warning after every install). Review each
SKILL.mdand any bundled scripts in the pull request, or gate them with a scanner as described in skill supply-chain security. -
Commit the folders and the lockfile together.
Terminal window git add skills-lock.json .agents/skills/ .claude/skills/Commit
.claude/skills/as well. In 1.7.0,experimental_installrestores into.agents/skills/only and does not recreate the Claude Code symlinks, so a teammate who relies on restore alone gets nothing in Claude Code. -
Add a drift check to CI. It restores from the lockfile and fails if the committed skills differ from the pinned source, which catches hand edits and half-finished updates without anyone reading the skill text:
Terminal window npx -y skills@1.7.0 experimental_installgit diff --exit-code -- .agents/skills skills-lock.jsontest -z "$(git status --porcelain -- .agents/skills skills-lock.json)"The
git diffline catches edits and deletions; thegit statusline also fails on new untracked files, such as a script that an upstream change added.Pin the CLI version (
skills@1.7.0) in CI for the same reason you pin the skills. -
Update on purpose.
npx skills update -p -yrefreshes project skills but respects a pinned ref, so a tagged skill stays put. To move a pin, rerun step 1 with the new tag, then review the diff of eachSKILL.mdin the pull request like any dependency bump. -
Remove by skill name, and remove the whole group.
npx skills remove grill-medeletes the folder, the symlink and the lockfile entry. It does not know thatgrillingexisted only forgrill-me; remove companions explicitly, and never remove a skill another one delegates to.
Keep personal and experimental skills out of the repository. Install them with -g into your home directory, where they are not recorded in the project lockfile and do not change a teammate’s agent.
Should you install a plugin or a portable copy?
Section titled “Should you install a plugin or a portable copy?”| Question | Plugin (claude plugin install, codex plugin add) | Portable copy (npx skills add) |
|---|---|---|
| Needs hooks or a session-start bootstrap? | Yes: only the plugin carries them | No: files only |
| Must be identical in Claude Code, Codex and Cursor? | Per-agent marketplaces | One command, one folder |
| Must be pinned and reviewed in your repo? | Marketplace controls updates | Pin with #ref, diff in PRs |
| Invocation name in Claude Code | Namespaced, /plugin:skill | Bare, /skill |
The difference is not cosmetic. npx skills add obra/superpowers copies the skills but not the SessionStart bootstrap, so the Superpowers method does not fire on its own; install Superpowers as a plugin instead. Choose one route per skill set: Matt Pocock’s README warns that installing both the plugin and the skills.sh copy makes every skill appear twice. For a private catalogue, a team plugin marketplace is the plugin-side equivalent of this workflow.
How much context do installed skills cost?
Section titled “How much context do installed skills cost?”A skill has two costs. Its name and description sit in context in every session, so the agent can decide when to use it. Its body loads only when it fires. The Agent Skills specification caps description at 1,024 characters; the cheap skill uses a fraction of that and answers one question, “when should the agent use this?”.
Claude Code’s own projection, measured with claude plugin details on Claude Code 2.1.283 on 2026-09-26, shows the spread: the mattpocock-skills plugin (25 skills) adds about 1,609 always-on tokens per session, while the ECC plugin adds about 41,515. Superpowers’ subagent-driven-development skill costs about 11,800 tokens each time it fires. Measure before and after an install with /context in Claude Code; the context cost guide covers the other tools.
Two levers reduce the standing cost:
- Make hand-run skills user-invoked. A skill you only ever call by name (
/tdd,/diagnose, an audit) does not need to be offered to the model. In Claude Code,disable-model-invocation: truein the frontmatter keeps it from triggering automatically;grill-meships that way. - Install for your stack, not whole catalogues. A reasonable starting point is one discipline set (Superpowers or Pocock’s skills) plus the skills for the frameworks you actually ship. Add a task-specific skill, such as a security audit, for the task, then remove it.
Dr. Skill measures the effective set per agent, including machine-level skills and the cases where one skill shadows another, and reads session traces to show which skills ever fired.
How do you resolve conflicts between skills?
Section titled “How do you resolve conflicts between skills?”Conflicts are instructions that disagree: a React skill that prefers default exports against your project rule of named exports, or a skill written for React 17’s ReactDOM.render next to one that uses createRoot. No agent documents a precedence order between installed skills (checked Claude Code 2.1.283, codex-cli 0.157.1), so which one wins can change between sessions.
Fix them in this order:
-
Remove the less relevant skill. If two skills cover the same concern, keep the one that matches your stack and version.
-
Override in your own project skill. State the winner and name what it overrides, so the agent does not have to guess:
## OverridesThese rules take precedence over any installed framework skill:- Exports: always named exports, never default exports (overrides React skills that suggest defaults).- State: Zustand for global state; do not introduce Redux.- Errors: throw `AppError`, not bare `Error` (overrides general TypeScript skills). -
Fix the skill, not the prompt. When a pattern changes in the codebase, change the project skill in the same pull request. Writing your own project skill is covered in building custom skills.
How do you prove the skills are working without reading every output?
Section titled “How do you prove the skills are working without reading every output?”Installing a skill changes what the agent produces, so check the effect with gates, not by rereading diffs:
-
Drift check in CI (step 4 above) proves every machine and runner has the reviewed, pinned text.
-
A golden task per critical skill. Keep one small, fixed task per skill that matters, for example “add a failing test, then the fix” for a TDD skill, and run it headless after every pin bump. Check the result with the existing test, type and lint gates:
Terminal window claude -p "Add a failing test for parseDate rejecting 2026-02-30, then the fix"# or: codex exec "Add a failing test for parseDate rejecting 2026-02-30, then the fix"vp test # your own test commandFor Claude Code plugins,
claude plugin evalruns a plugin’s own eval cases against a no-plugin baseline. Designing these checks is covered in evals for coding agents. -
Review signals the tech lead owns. Fewer review comments about conventions the skills encode, and similar output when two developers ask for the same change. When those move the wrong way after an update, revert the pin.
The tech lead signs off on every pin change, the same way they sign off on a dependency bump.
Which skills CLI traps catch teams out?
Section titled “Which skills CLI traps catch teams out?”What else breaks when skills are shared?
Section titled “What else breaks when skills are shared?”A teammate’s agent behaves differently. Run the onboarding prompt on their machine. The usual causes are global skills in ~/.claude/skills/ or ~/.cursor/skills/ that the project does not know about, a plugin and a portable copy of the same set, or a restore that skipped .claude/skills/. Remove the duplicate route and rerun npx skills experimental_install.
The skills directory is ignored by Git. A broad .claude/ or .agents/ entry in .gitignore drops the skills from every commit. Ignore specific files instead, such as .claude/settings.local.json, and keep .claude/skills/ and .agents/skills/ tracked.
An update changed behaviour overnight. The skill was unpinned. Check out the previous skills-lock.json and skill folders from Git, then pin with #ref to the last tag that passed your golden task.
The agent ignores skills late in a long session. The descriptions are still loaded, but a crowded context makes the agent less likely to pick a skill. Invoke the skill by name, or start a fresh session for work that must follow the conventions strictly.
Skills make a prototype heavy. Production skills apply to throwaway code too. Say so in the prompt (“prototype: ignore the testing and documentation skills”), or keep the heavy skills user-invoked.
Credentials end up in a skill. Skills are committed and readable by everyone with repository access. Point to environment variables (process.env.STRIPE_SECRET_KEY) and never paste a key into a SKILL.md; the drift check and your secret scanner both see the file.