You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Until now there was no way to take a skill back out of a project: an
operator could install, push, and pull, but removing a skill meant
hand-deleting the folder and editing `.skills.toml` by hand. `remove`
closes that gap. It lists every removable skill — installed via skillctl,
created locally, or an orphaned manifest entry whose folder is already
gone — distinguishes the three kinds in the picker, and deletes the
chosen folders while dropping their `.skills.toml` entries. It is
project-only and never touches the library or git.
Minor bump rather than patch because it adds a command. The feature went
through the standard pre-release audit pass (FS-safety, untrusted-input,
logic); the deletion path re-checks for a symlink immediately before
unlinking so a swapped folder can't redirect the recursive delete outside
the project, and `--skill` fails closed on unknown or ambiguous names.
`skillctl detect` walks the current directory for `SKILL.md` files, drops anything already declared in `.skills.toml`, copies the leftovers into the library cache under `<target>/<skill-folder-name>`, single-commits with a `add skill(s): …` message, pushes, and appends the new entries to `.skills.toml`.
192
195
196
+
### `skillctl remove` — remove skills from the current project
197
+
198
+
```sh
199
+
skillctl remove --skill <name> [--skill <name> …]
200
+
skillctl remove --all
201
+
```
202
+
203
+
| Flag | Purpose | Required in non-interactive |
204
+
|---|---|---|
205
+
| `--skill <name>` | Remove a specific skill by name (repeatable). Mutually exclusive with `--all`. Errors if the name is unknown or ambiguous (two skills share it). | Yes, unless `--all` |
206
+
| `--all` | Remove every removable skill found in the project. Mutually exclusive with `--skill`. | Yes, unless `--skill` |
207
+
208
+
`skillctl remove` is **project-only** — it never touches the library or git. It walks the current directory for skill folders (respecting `.gitignore`, skipping `node_modules`/`target`) and cross-references `.skills.toml`, presenting three kinds of removable skill:
209
+
210
+
- **installed via skillctl** — folder present *and* tracked in `.skills.toml`. Removing it deletes the folder and drops the entry.
211
+
- **created locally, not tracked** — folder present but absent from `.skills.toml`. Removing it deletes the folder only.
212
+
- **orphan** — a `.skills.toml` entry whose folder is already gone. Removing it drops the stale entry only (nothing to delete on disk).
213
+
214
+
In each `results[]` item, `removed_folder` and `removed_entry` report which of the two actions actually happened. `.skills.toml` is only rewritten when at least one tracked entry is dropped. In an interactive TTY, a confirmation prompt is shown before anything is deleted; in non-interactive/`--json` mode the explicit `--skill`/`--all` flags are the authorisation. A symlinked destination is never followed — it is treated as "no folder on disk" so removal can only ever drop its manifest entry, never delete through the link.
215
+
193
216
## Skill identity
194
217
195
218
A "skill" is any folder containing a file literally named `SKILL.md`. The skill's `name` comes from the YAML frontmatter `name:` field at the top of `SKILL.md`; if absent, the folder name is used. All `--skill <name>` flags match against this resolved name.
@@ -212,7 +235,7 @@ Errors always go to stderr regardless of mode.
212
235
213
236
## Interactive prompt (multi-select with live filter)
214
237
215
-
When a multi-select prompt opens (in `add`, `push`, `pull`, `detect` without flags or `--all` and a TTY), the prompt has a live filter:
238
+
When a multi-select prompt opens (in `add`, `push`, `pull`, `detect`, `remove` without flags or `--all` and a TTY), the prompt has a live filter:
216
239
217
240
- **Type any character** — appends to the filter; the list filters in real time on the skill name (substring, case-insensitive).
### Remove every skill from a project (folders + manifest entries)
345
+
346
+
```sh
347
+
skillctl remove --all
348
+
```
349
+
315
350
## Failure modes worth checking before invoking
316
351
317
352
1.**No library configured.** Calls fail with `no library configured — run skillctl init <github-url> first`. Run `skillctl init` (or check for an existing library URL via inspecting `~/.config/skills-cli/config.toml` on Linux or the equivalent under `~/Library/Application Support/dev.umanio-agency.skills-cli/` on macOS).
Copy file name to clipboardExpand all lines: CHANGELOG.md
+13Lines changed: 13 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,6 +6,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
7
7
## [Unreleased]
8
8
9
+
## [0.2.0] - 2026-05-27
10
+
11
+
### Added
12
+
13
+
-**`skillctl remove`** — remove skills from the current project. Lists every removable skill (installed via skillctl, created locally, or an orphaned `.skills.toml` entry whose folder is already gone), with each kind distinguished in the selection list, and lets you pick by interactive multi-select, by name (`--skill <name>`, repeatable), or all at once (`--all`). Deletes the selected skill folders and drops their `.skills.toml` entries; `.skills.toml` is only rewritten when a tracked entry actually changes. The command is project-only — it never touches the library or git.
14
+
15
+
### Security
16
+
17
+
- The removal path refuses to follow a symlink: the destination's type is re-checked immediately before deletion, so a folder swapped for a symlink cannot redirect the recursive delete outside the project (closes a TOCTOU window surfaced by the pre-release audit). A symlinked destination is treated as "no folder on disk" — only its manifest entry can be dropped, never deleted through.
18
+
-`--skill <name>` fails closed: an unknown name errors, and a name shared by two skills errors as ambiguous rather than silently deleting the wrong folder. The project root, `.git`, and `.skills.toml` can never be selected for deletion.
19
+
20
+
`skillctl remove` was reviewed before release with the project's standard multi-agent security audit pass (FS-safety / untrusted-input / logic dimensions). 5 new unit tests; `cargo test`: 158 pass; clippy clean; `cargo audit` clean.
0 commit comments