Skip to content

Skills

A skill is a folder with a SKILL.md file: instructions for one kind of task. The model sees only the skill’s name and description until a task matches, so a skill costs a few lines of context until it is used. You can also run a skill yourself with /name.

Save this as ~/.tatu/skills/release-notes/SKILL.md:

---
name: release-notes
description: Draft release notes from the git log. Use when asked for release notes or a changelog entry.
---
Find the latest tag with `git describe --tags --abbrev=0`.
List the commits since it with `git log --oneline <tag>..HEAD`.
Group them under Added, Fixed and Changed, and keep each line to one sentence.
Show the result and do not write any file unless asked.

Start Tatu and type /release-notes, or just ask “write the release notes for this version” and the model loads the skill by itself.

Folder Applies to
~/.tatu/skills/<name>/SKILL.md every project (skills/ inside TATU_HOME, if you set it)
.tatu/skills/<name>/SKILL.md in a project that project only

A folder that holds a SKILL.md is a skill, and Tatu does not look inside it for other skills. Folders without one are searched up to four levels down, so you can group skills in subfolders. Folders that start with a dot, and node_modules, are skipped. Symbolic links to folders are followed.

Tatu reads the folders when it starts. Put other files the skill needs (a template, a checklist) in the same folder and mention them in the SKILL.md by relative path. Tatu tells the model that paths in a skill are relative to the skill’s folder.

The front matter sits between two lines of --- at the top of the file.

Field What it does
name the command name. Without it, the folder’s name. Use lowercase letters, digits and single hyphens, up to 64 characters; Tatu warns at startup about anything else.
description required. What the skill does and when to use it: the model reads this to decide. Up to 1024 characters; Tatu warns about a longer one. A skill without a description is ignored, with a note.
disable-model-invocation true keeps the skill out of the model’s list, so only you can run it with /name. Default false.
user-invocable false creates no /name command, so only the model uses the skill. Default true.

Write each field on one line, as key: value; a long description can be a block that starts with > or |. Do not put a comment after a value: it becomes part of the value. Any other field is ignored.

Write the description for the model. “Use when adding behavior or fixing a bug” tells it more than “testing helper”.

At startup Tatu adds a list to the system prompt with the name, description and file location of each skill that the model may use. When the task matches a description, the model reads the SKILL.md with its read tool and follows it. A skill with disable-model-invocation: true is not in the list.

/release-notes sends the skill’s text to the model right away. Arguments after the name go with it:

  • If the text uses $1, $@, ${1:-fallback} or ${@:2}, your arguments are put in there. These work as in prompt templates.
  • If it uses none, your arguments are added after the skill.

The conversation shows the line you typed, with the kind at the end:

› /release-notes since v1.2 (skill)

Press Ctrl+O to see the text the model got. Tatu sends the skill as written. It only fills in arguments, and it does not run any command inside it.

  • A project’s skill replaces a global skill with the same name. A note at startup says so.
  • Two skills with the same name in the same place: the first one is kept and the other is ignored, with a note.
  • A name that is already a built-in command is never replaced. The skill is ignored, with a note.
  • A skill and a prompt template with the same name in the same place: the skill wins.

A SKILL.md body is cut at 32 KiB, with a note at startup. A file that is not text, or whose front matter is not closed with a second ---, is ignored with a note.