Skills

Skills are named markdown instruction packets the model loads on demand. You write the "how" of a task once (a review rubric, a house style, a checklist), and the agent pulls it into context only when it decides the task calls for it — so the playbook is reusable and the context window stays cheap.

Overview

WhatA folder ~/.evi/skills/<name>/ containing a SKILL.md file with optional frontmatter + a markdown body of instructions.
How the model uses itEvery skill's one-line index (name + description) is injected into the system prompt. The model calls the invoke_skill(name) tool to pull the full body when it judges the skill relevant.
Where~/.evi/skills/ (yours) and ~/.evi/plugins/<plugin>/skills/ (plugin-supplied, exposed as <plugin>:<skill>).
Toggle[tools] skills = true (the default).

Skills vs the neighbours:

Reach for a skill when you want the model to consistently apply a method ("review code like this", "summarise papers like this") without restating it every time, and without forcing it on turns where it doesn't apply.

How it works

evi/skills.py defines a read-only SkillStore:

SKILL.md format

---
name: code-review
description: Review a diff for correctness, style, and security issues.
---

# Body — the actual instructions the model follows once loaded
Step 1 …
Step 2 …

Setup

Files and paths

PathWhat
~/.evi/skills/<name>/SKILL.mdOne skill. <name> is the folder; frontmatter name overrides the id.
~/.evi/skills/<name>/…Optional skill-local assets (scripts, data) — eVi only reads SKILL.md.
~/.evi/plugins/<plugin>/skills/<skill>/SKILL.mdA plugin-supplied skill, surfaced as <plugin>:<skill>.

Config

# ~/.evi/config.toml
[tools]
skills = true      # default; set false to drop the skill index + invoke_skill tool

Installing the bundled examples

The repo ships two ready-to-use skills under examples/skills/:

# one skill
mkdir -p ~/.evi/skills/code-review
cp examples/skills/code-review/SKILL.md ~/.evi/skills/code-review/

# or all of them
cp -r examples/skills/* ~/.evi/skills/

Usage

Skills are model-driven — you don't type a skill (that's a slash command). There is a small CLI for managing them:

evi skill list                       # installed skills (yours + plugin skills)
evi skill show <name>                # print a skill's description, body, bundled files
evi skill import <dir-or-SKILL.md>   # copy a skill into ~/.evi/skills/
evi skill import <dir> --name foo --rewrite-paths --force
evi skill remove <name>              # delete a user skill (~/.evi/skills/<name>/)

remove only touches your own skills; a plugin skill (<plugin>:<skill>) is owned by its plugin — remove it with evi plugin remove <plugin>.

Once installed:

  1. Start a chat (evi chat, or the web/desktop app).
  2. The agent's system prompt now lists your skills.
  3. When a turn matches a skill, the model calls invoke_skill(<name>) and then follows the loaded instructions. You'll see the invoke_skill tool call in the transcript / tool activity. If the skill bundles companion files, their absolute paths are appended to the loaded text so the model can read them with its file tools.

To nudge it explicitly, just ask: "review this diff" with a code-review skill installed, or "use the summarize-paper skill on this PDF". To confirm what's available, ask the model to call list_skills, or look in ~/.evi/skills/.

Skills work identically in the CLI, web, and desktop frontends — they're a property of the agent, not the UI.

Examples

Example 1 — a house code-review rubric

~/.evi/skills/code-review/SKILL.md (the bundled example, abridged):

---
name: code-review
description: Review a diff for correctness, style, and security issues.
---

# Code review skill
When asked to review code, follow these steps in order:

## 1. Understand the change
- Read the diff in full before commenting.

## 2. Correctness pass (highest priority)
- Off-by-one errors, resource leaks, concurrency bugs, error handling,
  security smells (string-built SQL/shell, secrets in code).

## 3. Style pass (lower priority)
- Follow the project's existing conventions, not your favourites.

## Output format
**Summary:** <one sentence>
### Correctness
- <issue> (`path/to/file.ext:42`)

Then: evi chat → "review the staged diff" → the model loads the skill and produces output in your fixed format, every time.

Example 2 — a minimal skill from scratch

mkdir -p ~/.evi/skills/sql-explain
cat > ~/.evi/skills/sql-explain/SKILL.md <<'EOF'
---
name: sql-explain
description: Explain a SQL query in plain English and flag slow patterns.
---

# SQL explainer
1. Restate what the query returns in one sentence.
2. Walk the joins in execution order.
3. Flag full-table scans, N+1 patterns, and missing-index smells.
4. End with a one-line "Bottom line:" verdict.
EOF

(That's just an illustration — examples/skills/sql-explain/ ships it too.)

Example 3 — a plugin-supplied skill

A plugin that ships skills/threat-model/SKILL.md exposes it as plugin-name:threat-model in the index once installed (evi plugin add <dir-or-git-url>). See plugins.md.

Loading Claude skills

eVi's SKILL.md shape is the same one Claude Agent Skills use, so a Claude skill folder is essentially drop-in:

evi skill import path/to/claude-skill          # copies it into ~/.evi/skills/
evi skill import path/to/claude-skill --rewrite-paths   # also fix relative refs

What carries over and what doesn't:

Self-contained Claude skills (all instructions in SKILL.md) work with a plain evi skill import; skills that lean on companion files work best with --rewrite-paths (and the auto-appended file list as a backstop).

Notes / limits

Edit on GitHub ↗