Skills
Teach a workflow once; the agent loads it when a request matches
A skill is reusable workflow instructions the agent loads on demand — never speculatively. The index (name + description) lives in the tool description the model always sees; the full body loads only when a request matches; supporting files load only when the body actually references them. This progressive disclosure means a large skill library costs almost nothing in context until a specific skill is actually used.
Layers — project wins on name
~/.visvoai/skills/<name>/SKILL.md global
<project>/.visvoai/skills/<name>/SKILL.md project (may be checked in)
<project>/.visvoai/skills/<name>.md flat, single-file skill also worksFormat
Frontmatter between --- lines, then the body:
---
description: Draft release notes from the git log
args:
version: The version being released
---
1. Run `git log $version..HEAD --oneline`.
2. Group changes by type; see checklist.md for the house format.descriptionis required — it's the index line the model sees before loading anything else.argsis an optional block of named$placeholders the caller fills in;$ARGUMENTSexpands to all supplied args askey: valuelines. Substitution happens only in the main body read — supporting files are served verbatim, never templated.- Everything after frontmatter is the body: the instructions the agent follows with its own tools.
Supporting files load lazily
Files next to SKILL.md (.md, .py, .js, .ts, .json, .yaml,
.toml, .sh, …) are readable via the skill tool's resource argument,
but only fetched when a step in the body actually points at one — nothing
is loaded speculatively "in case it's needed."
A skill grants knowledge, never capability
The model reads the steps and executes them with its normal, gated tool
set — an edit_file call a skill's instructions trigger still hits the
same approval gate as any other edit. A skill cannot unlock a tool or
bypass a permission the agent wouldn't otherwise have.
Bring your own library
Already have a skills folder (a team's shared repo, Claude Code's skill directory)? Point at it and it loads as your own trusted skills — no per-file approval, because you configured it yourself:
# ~/.visvoai/config.toml
[skills]
extra_dirs = ["~/.claude/skills", "~/dotfiles/skills"]Trust
Project-defined skills carry the same threat model as project agents: a
repo-controlled skill body is a prompt that steers tool use on your
machine, so it needs one-time approval — a hash of the whole definition
(description + body + args + the names of its resource files) recorded in
~/.visvoai/projects/<project-id>/skill_trust.toml. Any edit re-prompts.
Global skills (yours) are implicitly trusted.
Two real examples, from simple to progressive-disclosure
Both ship in examples/
in the repo — copy either straight into ~/.visvoai/skills/.
Simple — one arg, one lazily-loaded reference file:
---
description: Draft release notes from the git log
args:
version: The version being released (the previous tag to diff from)
---
1. Run `git log $version..HEAD --oneline` to list the changes.
2. Group them: Features, Fixes, Internal. Drop chore/noise commits.
3. Write the notes in the house format — see format.md for the rules.
4. Save to RELEASE_NOTES.md and show me the result.Complex — classifies first, then loads only the one reference file the branch needs; the model never reads all three checklist files:
---
description: Review a pull request or diff with house rules, sized to the change
args:
target: What to review — a PR number, branch, or "working tree"
---
## Step 1 — Classify (no file reads yet)
Look at $target: run `git diff --stat` for it and classify the change:
Output: {size: "small" (<150 changed lines) | "large", risk: "low" | "touches
auth/db/money paths"}
## Step 2 — Load ONE rules file, per the classification
- small + low risk → read checklist-quick.md
- large OR risky → read checklist-deep.md
- if the diff touches SQL/migrations, ALSO read sql-rules.md (only then)
## Step 3 — Review
Read the diff hunk by hunk against the loaded checklist. For each finding:
file:line, severity (blocker/major/nit), one-line why, concrete fix.
## Step 4 — Report
Findings ordered by severity, then a verdict: approve / approve-with-nits /
request-changes. State what you did NOT review (paths, generated files).pr-review/ ships three checklists next to SKILL.md
(checklist-quick.md, checklist-deep.md, sql-rules.md) — a small diff
to a config file loads one ~4-line file; a large change touching a
migration loads two. Nothing is read speculatively.