skilllib 1.11.1 → 1.11.3

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.
package/README.md CHANGED
@@ -90,14 +90,14 @@ On first run, skilllib asks two things:
90
90
  Then a good first session looks like this:
91
91
 
92
92
  1. **You land in Places, on the repo you're in.** `enter` opens its skills; `enter` again opens a skill's issues and actions.
93
- 2. **Open Health** to see everything worth fixing, in every repo and in your global skills. **✦ Fix N issues automatically…** does the safe ones; the rest are your call, one skill at a time.
93
+ 2. **Open Health** to see everything worth fixing, in every repo and in your global skills: what `skilllib doctor` reports. **✦ Fix N issues automatically…** does the safe ones; the rest are your call, one at a time.
94
94
  3. **Add skills** to a repo with **+ Add a skill…**, the top row of its list.
95
95
 
96
96
  ---
97
97
 
98
98
  ## Use it from your agents
99
99
 
100
- `skilllib agent-skill install` puts a small `skilllib` skill in `~/.claude/skills` (Claude Code, Cursor and Grok read it there), with a link in `~/.agents/skills` (Codex and Zed). This is the one skill that should be global, because it's about every repo. Upgrading skilllib keeps it up to date, and `skilllib agent-skill remove` takes it out. Agents use it from their next session.
100
+ `skilllib agent-skill install` puts a small `skilllib` skill where your agents look: `~/.claude/skills` when one of them reads it (Claude Code, and Cursor and Grok too), and `~/.agents/skills` (a link, or the real copy) for Codex and Zed. This is the one skill that should be global, because it's about every repo. Upgrading skilllib keeps it up to date, and `skilllib agent-skill remove` takes it out. Agents use it from their next session.
101
101
 
102
102
  Then ask in plain words. A few examples, with what the agent runs:
103
103
 
@@ -125,8 +125,8 @@ Three panes: **Places** on the left, a **list** on the right, and the **details*
125
125
  | **Your skills** | Your library: master copies, versioned. Nothing here loads anywhere until you add it to a repo. |
126
126
  | **Global** | Everything your agents load in *every* repo: yours, plus vendor skills (plugins, claude.ai, Cursor built-ins). |
127
127
  | **Plugins** | Every plugin installed, on or off: what it brings, where it's installed, and how much its skills get used. Turn it on or off, update it, uninstall it, or replace it with library skills. |
128
- | **Health** | Every skill with something to fix, in every repo and in Global, with its fixes. |
129
- | **Projects** | Every repo found in your project folders. `◆` marks the one you're in; `✕` `⚠` `·` its worst issue. |
128
+ | **Health** | What `skilllib doctor` reports, in every repo and in Global, each with its fix or choices. |
129
+ | **Projects** | Every repo found in your project folders. `◆` marks the one you're in; `✕` `⚠` its worst issue. |
130
130
  | **Settings** | Your agents and the skilllib skill for them, your project folders, hidden repos, and backups. |
131
131
  | **Help** | The keys and symbols. |
132
132
 
@@ -162,15 +162,19 @@ What skilllib flags:
162
162
 
163
163
  | Issue | Fixes |
164
164
  |---|---|
165
- | **Loaded twice** (also global, or also in a plugin) | Keep the repo's copy and stop loading it globally, or keep it global. Your call: stopping a global skill changes every repo, so the fix names the repos that used it |
166
- | **Same name as a plugin skill** | Remove the repo's copy, or turn the plugin off in this repo only (`.claude/settings.local.json`, a local-only file git ignores). Cursor ignores repo settings, so once the repo turns the plugin off, only replacing the plugin helps there |
167
- | **Folder missing** · **Not in your library** | Restore it · copy it back into your library |
168
- | **Update to vN** · **Edited here** | Update · save the edits as a new version, or discard them |
169
- | ***Agent* can't see it** | Link it for every agent (links only; nothing is copied or moved) |
170
- | **Differs from library** · **Not tracked** · **Only in this repo** | Update your library from it, or replace it · track it · import it |
171
- | **Unused 30 days** | Remove it from the repo |
172
- | **Broken link** · **Not reviewed** (global) | Remove the link · move it to repos, keep it global on purpose, or delete it |
173
- | ***Agent* can't see it** (global) | Link it into that agent's global folder, e.g. a Codex skill in `~/.agents/skills` or `~/.codex/skills` gets a link in `~/.claude/skills` |
165
+ | **Repo and global copies** (a repo copy of a skill that also loads globally) | Stop loading it globally. Your call: that changes every repo. If you keep it global on purpose, remove the repo copies skilllib installed instead |
166
+ | **Also in a plugin** | Remove the plugin or turn it off, or turn it off in this repo only (`.claude/settings.local.json`, a local-only file git ignores), or remove your copy from this repo. Cursor ignores repo settings, so once the repo turns the plugin off, only turning the plugin off or removing it helps there |
167
+ | **Folder missing** · **No longer in your library** | Sync the project · copy it back into your library |
168
+ | **Out of date** · **Edited here** | Update every out-of-date skill in the repo (or one, from its *Update to vN* action) · save the edits as a new version, or discard them |
169
+ | **Not every agent can use it** | Add the links (links only; nothing is copied or moved). If git tracks a folder a link would go in, you choose whether git sees it |
170
+ | **Differs from your library** · **Not tracked** · **Not in your library** · **From npx skills** | Update your library from it, or replace it with your library's (the team's committed copy is only copied) · track it · import it · import it |
171
+ | **Unused 30 days** | Remove the ones skilllib installed from the repo |
172
+ | **Broken link** (in a repo) | Remove it (your call when git tracks the link). Next to a real copy it's an extra link instead: tidy points it at the copy |
173
+ | **Pinned version not in your library** | Install your newest (the folder is missing and your library has no copy of what skilllib.json pins) |
174
+ | **Broken link** · **Not reviewed** (global) | Remove the link · move it to repos, keep it global on purpose, or delete it (the row's actions) |
175
+ | **Not every agent can use it** (global) | Link it into that agent's global folder, e.g. a Codex skill in `~/.agents/skills` or `~/.codex/skills` gets a link in `~/.claude/skills` |
176
+
177
+ These are the issues `skilllib doctor` reports, with the same fixes and choices.
174
178
 
175
179
  ### Adding and removing skills
176
180
 
@@ -179,7 +183,7 @@ What skilllib flags:
179
183
  - Claude Code, with or without Cursor or Grok: `.claude/skills/<name>`.
180
184
  - Cursor, Codex, Zed or Grok without Claude Code: `.agents/skills/<name>`.
181
185
  - Claude Code plus Codex or Zed: the copy goes in `.agents/skills`, with a link in `.claude/skills`. Claude Code only reads `.claude/skills`, and Codex and Zed don't read it.
182
- - **Remove from repo** deletes that copy and its links; your library keeps it. An untracked copy goes to Settings › Backups instead. If you edited a tracked skill here, skilllib asks first, and the edits go to Settings › Backups.
186
+ - **Remove from repo** deletes that copy and its links; your library keeps it. In the app, an untracked copy goes to Settings › Backups instead (`skilllib remove` only removes skills skilllib manages). If you edited a tracked skill here, skilllib asks first, and the edits go to Settings › Backups.
183
187
  - **The repo's own skills are never deleted by skilllib.** You can copy them into your library, or link them so every agent sees them.
184
188
  - **Git-tracked folders:** if the repo commits the folder a link would go into (common for `.agents/skills`), skilllib asks once and remembers your answer. If you say no, it tells you which agents can't see the skill there. A skill whose copy git doesn't share (not committed, and not in a folder the repo commits) never gets a link in a committed folder: teammates would get a broken link.
185
189
 
@@ -210,7 +214,7 @@ Edit a skill once in **Your skills** (Enter → *Edit SKILL.md*). Every repo tha
210
214
  - **Keep it global on purpose**: skilllib stops warning about it (also `skilllib global keep <name>`). The mark only records your decision; to undo it, pick **Stop marking it as global on purpose**.
211
215
  - **Delete it**: it goes to Settings › Backups.
212
216
 
213
- When some of your agents can't see a global skill, the flag says so (**Not reviewed · Claude Code can't see it**). This happens, for example, with a Codex skill in `~/.agents/skills` or `~/.codex/skills`, which Claude Code doesn't read. Then a fourth choice appears: **Link it for Claude Code** adds a link in `~/.claude/skills`, and nothing is copied or moved. Moving it to repos works for every agent too. For a skill you keep global on purpose, the link is the ★ fix.
217
+ When some of your agents can't see a global skill, that's a separate issue, **Not every agent can use it**. This happens, for example, with a Codex skill in `~/.agents/skills` or `~/.codex/skills`, which Claude Code doesn't read. Its choice, **Link it for Claude Code**, adds a link in `~/.claude/skills`, and nothing is copied or moved. Moving it to repos works for every agent too. For a skill you keep global on purpose, the link is the ★ fix.
214
218
 
215
219
  Vendor skills (claude.ai, Cursor built-ins) are managed at their source: claude.ai's settings, or Cursor. A plugin's skills offer **Open *plugin* in Plugins**.
216
220
 
@@ -226,7 +230,7 @@ Plugins are a big part of what agents load (one plugin can bring dozens of skill
226
230
  | Brings | Its skills, and `+N` for the other kinds of things it brings: commands, agents, hooks, MCP servers |
227
231
  | On | `on` · `off` · `?` for Cursor, which keeps that in its own database |
228
232
  | Uses | Claude Code uses of its skills (`plugin:skill`), last 30 days. Your own skill by the same name is counted apart; two installs of one plugin share a count |
229
- | Issue | **Repeats N of yours** (a skill in your library or global folders) · **Unused 30 days** · **Update to vN** |
233
+ | Issue | **Repeats N of yours** (a skill in your library or global folders) · **Unused 30 days** (on, ships skills, none used) · **Update available** (its marketplace has a newer version or commit) |
230
234
 
231
235
  Every plugin issue is *your call*: turning plugins on or off, or updating them, changes code that runs in your sessions, so **Fix automatically** never does it.
232
236
 
@@ -257,26 +261,26 @@ It's in every skill's actions, in a repo's **⋯** menu (all its skills), and at
257
261
 
258
262
  ### Duplicates
259
263
 
260
- The same skill often reaches your agents more than once: a copy in `.claude/skills` *and* in `.agents/skills`, a global copy *and* a repo copy, a plugin *and* your skill. skilllib keeps **one real copy per skill, plus only the links your agents need**. **Health** lists each case on the skill it's about, with its fix. From the command line, `skilllib doctor` lists them and `skilllib tidy` fixes the folder ones.
264
+ The same skill often reaches your agents more than once: a copy in `.claude/skills` *and* in `.agents/skills`, a global copy *and* a repo copy, a plugin *and* your skill. skilllib keeps **one real copy per skill, plus only the links your agents need**. **Health** lists each case with its fix, and the skill's row in a repo or Global shows it too. From the command line, `skilllib doctor` lists them and `skilllib tidy` fixes the folder ones.
261
265
 
262
266
  | What it finds | What it does |
263
267
  |---|---|
264
268
  | Identical copies in several folders | Keeps one and turns the others into links. In a repo, it keeps the committed copy. Globally, it keeps the one in `~/.agents/skills`. |
265
269
  | Links no agent you use needs | Removes them. It keeps links that `skilllib.json` records, because teammates may use other agents. |
266
270
  | **Copies that differ** | Shows which agent runs which copy (e.g. Claude Code and Cursor run `.claude`, Codex runs `.agents`), and lets you pick the one to keep. It's your call, so **Fix all** never does it. |
267
- | A Claude Code plugin with the same skill | Your skill wins. skilllib copies all the plugin's skills into Your skills, then removes the plugin or turns it off (`claude plugin uninstall` / `disable`). If the plugin also brings MCP servers, hooks, agents or commands, turning it off is the default. When the overlap is in one repo, you can instead turn the plugin off only there (in its `.claude/settings.local.json`, which skilllib makes git ignore; without the `claude` command, skilllib writes the file itself), or remove your copy from that repo. If the repo commits its copy, it's the team's: skilllib never offers to remove it. A plugin that a repo's own `.claude/settings.json` turns on counts only in that repo. Cursor ignores repo settings: after a repo turns the plugin off, Cursor still lists both there, and only turning the plugin off or removing it changes that. |
271
+ | A Claude Code plugin with the same skill | Your skill wins. skilllib copies all the plugin's skills into Your skills, then removes the plugin or turns it off (`claude plugin uninstall` / `disable`). If the plugin also brings MCP servers, hooks, agents or commands, turning it off is the default. When the overlap is in one repo, you can instead turn the plugin off only there (in its `.claude/settings.local.json`: Claude Code makes git ignore it when it writes it; without the `claude` command, skilllib writes the file itself and makes git ignore it), or remove your copy from that repo. If the repo commits its copy, it's the team's: skilllib never offers to remove it. A plugin that a repo's own `.claude/settings.json` turns on counts only in that repo. Cursor ignores repo settings: after a repo turns the plugin off, Cursor still lists both there, and only turning the plugin off or removing it changes that. |
268
272
  | A Cursor plugin with the same skill | Reported only. Turn the plugin off in Cursor. |
269
273
  | A repo copy of a skill you keep global | The repo copy is the extra one: remove it, or stop loading the skill globally after all. Claude Code runs the global copy anyway. |
270
274
  | A repo's own skill that also loads globally | Stop loading it globally. The repo's copy is the team's, so skilllib never offers to remove it. |
271
275
 
272
276
  - **It never moves a real copy.** `skilllib.json` is shared, so a move for your agents could break a teammate's.
273
- - **It never adds links.** That's `skilllib link`, or a skill's *can't see it* fix.
277
+ - **It never adds links.** That's `skilllib link`, or the *Not every agent can use it* issue's fix.
274
278
  - **It leaves committed files alone** unless you say so: Health asks first, and `skilllib tidy` needs `--allow-git`.
275
279
  - **Cursor lists a skill once** even when it reaches it through several folders (tested September 2026). It runs the copy from the first of `.cursor`, `.claude`, `.codex`, `.grok`, `.agents` (seen in its app bundle, October 2026). It lists a plugin's copy and your copy separately.
276
280
 
277
281
  ### Backups
278
282
 
279
- skilllib never really deletes anything you can't get back. What it removes goes to Settings › Backups, and `enter` puts it back where it came from:
283
+ skilllib never really deletes anything you can't get back. What it removes goes to Settings › Backups (`skilllib restore`), and `enter` puts the folder back where it came from. A skill removed from a repo comes back as a folder; doctor then offers to track it again:
280
284
  - removed library skills and untracked copies go to `~/.skilllib/trash`
281
285
  - removed global skills go to `~/.skilllib/global-backup`
282
286
  - copies replaced by a link go to `~/.skilllib/tidy-backup`
@@ -380,7 +384,7 @@ skilllib link [--all] make every skill here usable by all your agents
380
384
  skilllib tidy [--all|--global] one real copy per skill, plus only the links your agents need
381
385
 
382
386
  skilllib list | show <name> your library
383
- skilllib import <dir>... add skill folders to your library (--global: all your global skills)
387
+ skilllib import <dir>... add skill folders to your library (--global: all your global skills); a repo that tracks that copy pins the new version
384
388
  skilllib global [keep|unkeep] your global skills; mark the ones you keep global on purpose
385
389
  skilllib global move <name> --to <repo> load a global skill only in those repos
386
390
  skilllib new <name> [desc] create a skill
@@ -388,7 +392,9 @@ skilllib new <name> [desc] create a skill
388
392
  skilllib usage [--days N] which skills Claude Code used
389
393
  skilllib doctor [--fix] find (and fix) problems
390
394
  skilllib apply <id> [choice] apply one problem's fix, or the choice you pick (ids from status or doctor --json)
391
- skilllib restore [name] put back something skilllib moved out
395
+ skilllib restore [name] put back something skilllib moved out (copies moved together come back together)
396
+ skilllib unhide <path> show a hidden project again
397
+ skilllib ui open the app (only in a terminal)
392
398
  skilllib agent-skill [install|remove] teach your agents to use skilllib
393
399
  skilllib --version
394
400
  ```
@@ -397,7 +403,7 @@ The repo commands (`status`, `add`, `remove`, `sync`, `outdated`, `update`, `lin
397
403
 
398
404
  Flags: `--force` (overwrite local edits, backed up to `~/.skilllib/edit-backup`), `--allow-tracked` (link into git-tracked folders; skills git doesn't share are still left out), `--days N`, `--json`. For `tidy`: `--dry-run` (preview), `--allow-git` (also change committed files), `<name> --keep <folder>` (the copy that wins when copies differ).
399
405
 
400
- A command exits 1 when it couldn't do all you asked: a skill skipped (not in the library, or local edits in the way), links git-tracked folders blocked, an unknown `tidy` name or `--keep` folder. What it did do is still done, and listed.
406
+ A command exits 1 when it couldn't do all you asked: a skill skipped (not in the library, or local edits in the way), links git-tracked folders blocked, an unknown `tidy` name or `--keep` folder, or (with `--all`, and `projects`) a repo left out because its `skilllib.json` can't be read. What it did do is still done, and listed. An unknown or misspelled flag is an error too, so a typo never runs silently. With `--json`, a failure prints `{"error": "…"}` on stdout as well as the message on stderr.
401
407
 
402
408
  **`--json`** prints one line of JSON on stdout, for scripts and agents. Messages and warnings go to stderr. It works with `status`, `list`, `show`, `projects`, `outdated`, `usage`, `doctor`, `apply`, `add`, `remove`, `sync`, `update`, `import`, `global move` and `agent-skill`. The output is shaped to keep agents fast and cheap:
403
409
 
@@ -410,8 +416,8 @@ A command exits 1 when it couldn't do all you asked: a skill skipped (not in the
410
416
  - the repo's top-level files
411
417
 
412
418
  Skills that share every attribute are grouped, and attributes at their usual value are left out.
413
- - **`list --json`**: inside a repo, the library skills the repo already has (names only), and the others with the first sentence of their description.
414
- - **`add`, `remove`, `sync` and `update`** list each change and the folders it wrote to, so there's nothing left to check.
419
+ - **`list --json`**: inside a repo, the library skills the repo already has (names only), and the others with a short description (its first sentence, or the start of it).
420
+ - **`add`, `remove`, `sync` and `update`** list each change, and (except `remove`) the folders it wrote to, so there's nothing left to check.
415
421
 
416
422
  The `skilllib` skill runs `status` and `list` as it loads (in Claude Code), so an agent usually answers "which skills can you use here?" in one step.
417
423