Docs
Jan Agent
Skills

Skills

A skill is a written procedure the agent can load when it's relevant - how to cut a release, how to add a migration, how this project wants a new endpoint wired up.

The agent always sees each skill's name and one-line purpose. It reads the full text only when a task calls for it, so a large library of skills doesn't crowd the context window.

Where they live


<project>/.jan/agent/skills/
├── release/
│ └── SKILL.md # folder form, can bundle scripts alongside
└── add-migration.md # flat form

The folder form is what new and imported skills are written as, and it lets a skill ship helper scripts or templates next to its instructions. The format matches the wider SKILL.md ecosystem, so skills written elsewhere generally work here.

Writing one

A skill is markdown with a name and a description:


---
name: release
description: Cut and publish a release
---
# Cutting a release
1. Confirm `main` is green in CI.
2. Bump the version in `Cargo.toml` and `package.json` - they must match.
3. Update `CHANGELOG.md`; group by feat/fix/chore.
4. Tag `v<version>` and push the tag. CI does the rest.
Never publish from a dirty working tree.

Keep it concise. A skill competes for the same attention as everything else in the prompt.

You can write the file yourself, or ask the agent to:


Write a skill for how we cut releases, based on what you see in CHANGELOG.md and the CI config

Who can invoke a skill

A skill has two invocation sides, and frontmatter closes either one:

  • User-invoked - you type /release (or /skill:release) in the console, or pick it from the slash popup.
  • Model-invoked - the agent sees the skill's description in its catalog and can fire it on its own by loading it with skill_read.

By default both sides are open. user-invocable: false hides a skill from you; disable-model-invocation: true hides it from the agent. See Skill Invocation for the full mechanics, the trade-offs, and when to use which.

Skills can also be installed as plugins - whole skill collections cloned from a git repo or picked from a marketplace, invocable under <plugin>:<skill> names.

Tools

ToolApproval
skill_listNo
skill_readNo
skill_writeYes

Controlling which are active


[skills]
enabled = [] # empty means all skills are enabled
inject = "always" # always | relevance

enabled is a whitelist. inject decides how they reach the model: always puts every skill's name and purpose in the system prompt, relevance selects per task.

Skills are shared with Jan Desktop - the same project files, through the same directory. A skill written in one shows up in the other.

Skills, AGENT.md, and memory

Three places that shape behaviour, easily confused:

ScopeLoaded
AGENT.mdRules for everything the agent does hereAlways
SkillsA specific procedureOn demand, when relevant
MemoryFacts the agent learnedRecalled as needed

Rule of thumb: if it applies to every task, it belongs in AGENT.md. If it applies to one kind of task, make it a skill.