skf-cli
v0.1.1
Published
Fuzzy-find AI-agent skills (Claude Code, Codex, OpenCode, Pi) by name or description.
Maintainers
Readme
skf — fuzzy skill finder
Find that AI-agent skill you know exists but can't remember the name of.
Most skills are manually invoked (disable-model-invocation: true), and the
built-in slash menus only fuzzy-match skill names — not their descriptions.
So if you remember what a skill does but not its exact name, you're stuck.
skf fuzzy-searches across name + description of every SKILL.md it can
find, previews the match, and prints (and copies) the invocation token so you
can paste it straight into your agent.
It is read-only — it never touches a SKILL.md, so manual invocation keeps
working exactly as before.
Agent-agnostic
SKILL.md is a shared convention. skf scans the skill directories of multiple
agents and dedups by name (newest version wins):
| Agent | Scanned roots |
|-------------|-------------------------------------------------|
| Claude Code | ~/.claude (incl. plugins/cache) |
| Codex | ~/.codex |
| OpenCode | ~/.config/opencode, ~/.opencode |
| Pi | ~/.pi, ~/.config/pi |
| Project | <git-root>/{.claude,.codex,.opencode,.pi,.skills} |
| Custom | anything in $SKF_PATHS |
Roots are scanned in priority order: custom → project → global.
Install
npm i -g skf-cli # installs the `skf` commandFrom source (development):
git clone https://github.com/jmonloop/skf.git
cd skf
npm link # symlinks the `skf` command to this checkoutRequires Node ≥ 16 and fzf (interactive mode only). Clipboard copy is
optional and auto-detected: pbcopy / xclip / xsel / wl-copy / clip.exe.
Usage
skf # interactive picker: type to filter name+description
skf opsctrl # picker pre-seeded with a query
skf -p "local test" # print mode (no UI): list "/name — desc" matches
skf -p # print mode: list every skill
skf -h # help- Interactive:
ENTERprints/<name>and copies it to the clipboard. Paste it into your agent. - Print mode needs no TTY, so inside a Claude Code / agent TUI you can run
! skf -p authand the matches land right in the conversation.
Config
| Env var | Default | Purpose |
|--------------|---------|----------------------------------------------------|
| SKF_PATHS | — | Colon-separated extra roots to scan (highest priority). |
| SKF_PREFIX | / | Invocation prefix printed/copied (set "" for none, or e.g. @). |
SKF_PATHS="$HOME/work/.claude:/opt/shared/skills" skf
SKF_PREFIX="" skf -p deploy # print bare skill namesHow it works
- Collect every
SKILL.mdunder the configured roots (pruningnode_modulesand.git), newest version first. - Parse YAML frontmatter
name+description(handles folded/literal block scalars), dedup by name. - Interactive mode fuzzy-searches name+description with
fzf(with file preview); print mode (-p) ranks precise substring matches, name hits first. Either way, emit the token and copy it to the clipboard.
License
MIT
