Vectrum
Sign In
92 lines · 4.2 KB
# Skills

A skill is a directory of instructions the agent pulls in when it is relevant:

```
~/.agents/skills/commit-helper/SKILL.md      every repo
./.agents/skills/commit-helper/SKILL.md      this one, checked in
```

```markdown
---
name: commit-helper
description: Use when writing commit messages for this repo
---

Read the last twenty commits for tone before writing anything.
Conventions are in references/conventions.md.
```

The directory name is the skill's name, and a `name:` that disagrees with it is
a load error. Only the description reaches the model until the skill is
invoked, so it is what decides whether the skill fires at all; the body can be
as long as you like.

Two ways in, one way to load. The agent calls the `skill` tool when a
description matches what it is doing; you can force one with `/commit-helper
fix the flaky test`, which the model answers by making the same call. `/skills`
lists what was found, project shadowing personal on a name collision, grouped
by where each one came from:

```
skills: 3
  personal
    /commit-helper  Use when writing commit messages
  claude
    /pdf            Extract text and tables from PDFs
  claude:superpowers
    /brainstorming  Use when exploring an idea before writing a plan
```

One line each, truncated to the width. A description written for another
harness can be three sentences long, and this list is for recognising a skill
you already know about rather than for reading it.

Skill directories are readable by `read_file`, `glob` and `grep` even though
they sit outside the working root, so a skill can ship reference files and
point at them. They are not writable by anything: `edit_file`, `write_file` and
`bash` keep the working root as their only root. A skill is input, not a work
product.

Relative paths still anchor to the working root, so a skill pointing at its own
files is read with the directory the `skill` tool prints joined on. If the model
forgets, the "no such file" it gets back names the skill directories, which is
usually enough to recover on the next turn. A shadowed skill's directory is not
readable — only the skills actually in play widen anything.

Discovery happens at startup. The name-and-description listing goes in the
cached prompt prefix, so re-reading the directory each turn would cost a cache
miss on every turn for a file that never changes. Restart to pick up a new
skill. `-no-skills` turns the whole thing off; the eval runner never discovers
skills at all, so METRICS.md is unaffected by what is in your home directory.

## Claude Code's skills

Codey can also use the skills Claude Code already has on this machine — the
ones under `~/.claude/skills`, the ones its installed plugins ship, and a
project's `.claude/skills`. The setup wizard asks about them, and only when
there are some to offer, because a question about nothing is a question worth
not asking:

| `claude_skills` | What happens |
| --- | --- |
| `off` | they are left alone; Codey reads only its own roots. This is the default |
| `use` | they are read where they lie, on every start, so updating a plugin in Claude Code updates the skill here with nothing to re-run |
| `copy` | they are copied once into `~/.agents/skills`, where they are yours to edit and unaffected by the next plugin update |

Off is the default for the same reason `web_search` defaults to none: a skill
is a page of instructions the model will follow, and it should be loaded
because you said so rather than because a directory happened to exist in your
home directory.

Plugins come from `~/.claude/plugins/installed_plugins.json`, newest install
per plugin, so the stale versions left in the cache are not loaded three times
over. A skill of your own in `~/.agents/skills` wins when it shares a name with
one of Claude's — what you put there is a decision, what arrived with a plugin
is not — and `copy` never overwrites a skill already there. Frontmatter Codey
would otherwise reject is accommodated rather than skipped: a name with
capitals, underscores or spaces in it, or one that disagrees with its own
directory, is normalised into a slug instead of becoming a load error, because
these files were written for another harness and are not yours to fix.
`/skills` lists each one with where it came from — `claude`, or
`claude:superpowers` for a plugin's.