One folder of skills that every coding agent reads.

Claude Code, Codex, Kimi Code, Grok, and Cursor all learn from SKILL.md files, each from a folder of its own. Skillset keeps one folder you own and mirrors it into all of them. Add a skill once and every agent has it.

npm i -g skillset-cli
View on GitHub

Runs on macOS with Node 20 or newer. MIT licensed.

The store at ~/.skillset/skills mirrored into the skills folder of each agent ~/.skillset/skills/ no-eyebrows/SKILL.md ∞ pnpm-only/SKILL.md ∞ release-checklist/SKILL.md unslop/SKILL.md vercel-deploy/SKILL.md writing-rules/SKILL.md ∞ Claude Code ~/.claude/skills Codex ~/.codex/skills Kimi Code ~/.kimi-code/skills Grok CLI ~/.grok/skills Cursor ~/.cursor/skills Any other agent ~/.agents/skills
~/.skillset/skills/
  • no-eyebrows/SKILL.md ∞
  • pnpm-only/SKILL.md ∞
  • release-checklist/SKILL.md
  • unslop/SKILL.md
  • vercel-deploy/SKILL.md
  • writing-rules/SKILL.md ∞
  • Claude Code~/.claude/skills
  • Codex~/.codex/skills
  • Kimi Code~/.kimi-code/skills
  • Grok CLI~/.grok/skills
  • Cursor~/.cursor/skills
  • Any other agent~/.agents/skills
The store is the source of truth. Each connected agent holds a mirror of it. Edit a mirror copy by hand and the edit flows back. The ∞ marks a rule that is also always-on.

You own the files.

Plain Markdown in ~/.skillset/skills. Put it in git, or symlink it into a repo you already keep. Agents are mirrors, not owners.

Edits flow back.

Change a mirror copy by hand, or let an agent change it. Skillset promotes the edit to the store. It never overwrites you.

Agents can run it.

Every command works without a person at the keyboard. Claude Code can save a rule with sks add --stdin, and Codex follows it in its next session.

The format is shared. The folder is not.

A skill is a folder with a SKILL.md inside: a name, a one-line description, and a body of instructions. An agent reads the description at the start of a session and loads the body when a task matches it.

Five coding agents read that format. Each one reads it from its own folder. A rule you teach Claude Code on Monday is unknown to Codex on Tuesday, so you teach it again. Skillset is the folder they share.

Agent Reads skills from Always-on rules go to
Claude Code~/.claude/skills~/.claude/CLAUDE.md
Codex~/.codex/skills~/.codex/AGENTS.md
Kimi Code~/.kimi-code/skills~/.kimi-code/AGENTS.md
Grok CLI~/.grok/skills~/.grok/AGENTS.md
Cursor~/.cursor/skillsnone, its rules live in Settings
Any other agent~/.agents/skills~/.agents/AGENTS.md
Skillset writes every folder in this table from one store at ~/.skillset/skills.

Add a skill from a tweet, a repo, or a file.

sks add takes a tweet that links to a skill, a GitHub repo or URL, a skills.sh page, a local folder, or stdin. The skill lands in the store, passes sks check, and mirrors out before the command returns.

~/.skillset
$ sks add https://x.com/juampitech/status/2090491139103064305
✓ added unslop
  from github.com/cursor/plugins@main/pstack/skills/unslop (via https://x.com/juampitech/status/2090491139103064305)
✓ synced 13 skill(s) → 6 mirror(s) (6 writes)
A tweet that links to a skillsks add https://x.com/juampitech/status/2090491139103064305
A skills.sh pagesks add https://skills.sh/cursor/plugins/unslop
A GitHub repo, one skill picked outsks add cursor/plugins --skill unslop
A local foldersks add ./my-skill
A file on stdinsks add --stdin < SKILL.md

Some rules must never miss.

A skill loads on demand. The agent reads its one-line description and pulls the body in when it decides the skill applies. That decision is cheap, and it can miss.

A rule like "never use eyebrow text" must hold every time. Mark it always-on and skillset writes its body into a block it owns inside each agent's global instructions file. The agent reads that file before your first message, every session. One command flips a skill between the two modes. Text outside the block is yours and stays untouched.

~/.skillset
$ sks always no-eyebrows
∞ no-eyebrows is now always-on; it goes into every agent's global instructions file
✓ updated no-eyebrows
∞ always-on: 3 rule(s) → Claude Code ~/.claude/CLAUDE.md
∞ always-on: 3 rule(s) → Codex ~/.codex/AGENTS.md
∞ always-on: 3 rule(s) → Kimi Code ~/.kimi-code/AGENTS.md
∞ always-on: 3 rule(s) → Grok CLI ~/.grok/AGENTS.md
∞ always-on: 3 rule(s) → Generic ~/.agents/AGENTS.md
✓ synced 13 skill(s) → 6 mirror(s) (6 writes)
~/.claude/CLAUDE.md
# Your own instructions

Everything above and below the block is yours. Skillset never touches it.

<!-- skillset:always:start -->
<!-- Managed by skillset. Do not edit this block. Change a rule with `sks edit <name>`; drop one with `sks always <name> --off`. -->

## Never use eyebrows
<!-- skill: no-eyebrows -->
An eyebrow, also called a kicker or overline, is a small label above a heading.
Do not add eyebrows to a user interface. Remove them when editing existing UI.

## pnpm only
<!-- skill: pnpm-only -->
Run `pnpm install`, `pnpm add`, and `pnpm run <script>`. Do not write `npm` or `yarn` commands.

## Writing rules
<!-- skill: writing-rules -->
Short words. Active voice. One idea per sentence. Cut every word you can.
<!-- skillset:always:end -->

Nothing gets lost.

A conflict keeps both versions.

If two mirrors diverge, the newest edit wins. Skillset archives the losing version under conflicts/ with a note on where it came from.

No deletion on a guess.

Skillset removes a mirror copy only when it holds a hash proving it wrote that copy. A skill you installed yourself is adopted or ignored, never removed.

Each change is a commit.

The store is a git repository. Each command that changes it commits, so any earlier version is one checkout away.

Nothing exotic.

Files, content hashes, a symlink, and a managed block between two comments. You can open all of it in a text editor.

A window onto the store.

The Mac app lists every skill. You edit the name, the description, and the body in place. New skill opens the builder. Describe a preference, a workflow, or a correction, and it proposes the smallest skills that pass sks check. Build it from the repo with pnpm app:install.

The Skillset Mac app. A sidebar lists thirteen skills. The detail pane shows the no-eyebrows skill with its description and body.

Every command that changes the store mirrors afterwards.

There is no sync command to forget.

sks initCreate the store, connect the agents it finds, import their skills, mirror back out.
sks add [source]Add a skill from a path, a GitHub repo or URL, a skills.sh page, a tweet, or stdin. --always makes it always-on.
sks always <skill>Make a skill always-on. --off returns it to on-demand.
sks build [idea]Split an idea into the smallest reusable skills, validate each, install what passes.
sks list / sks catalogList skills, flat or grouped by kind: Tool, Workflow, Judgement, Rule.
sks show <skill>Print one canonical SKILL.md. --json or --path for agents.
sks check [skill]Validate structure, trigger wording, context size, and always-on length.
sks edit <skill>Edit in $EDITOR, or replace from --stdin or --source.
sks rename <skill> <new>Rename a skill. The store folder and every mirror copy move with it.
sks remove <skill>Delete a skill and prune it from every mirror. --block stops it being adopted back.
sks statusConnected mirrors, their instructions files, and every skill's state.
sks connect / sks disconnectManage mirrors. Connecting imports the agent's existing skills first.
sks doctor [--repair]Store health, mirror drift, conflicts. --repair relinks a moved store and reconciles every mirror.

Install once. Teach every agent.

npm i -g skillset-cli

Then run sks init. It creates ~/.skillset, finds the coding agents you have, imports the skills they already hold, and mirrors the merged library back out.