Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Publishing skills

Skills are guidance documents that teach AI assistants how to use your crate. When a user’s project depends on your crate, Symposium loads your skills automatically.

Writing a SKILL.md

A skill is a SKILL.md file with a few lines of YAML frontmatter followed by a markdown body:

---
name: widgetlib-basics
description: Basic guidance for widgetlib usage
crates: widgetlib
activation: always
---

Prefer using `Widget::builder()` over constructing widgets directly.
Always call `.validate()` before passing widgets to the runtime.

The frontmatter tells Symposium when to load the skill. The markdown body is what the AI assistant sees — write it as direct guidance about what to do, what to avoid, and which patterns work.

Publishing your skill

Currently publishing skills requires a PR to the symposium-dev/recommendations repository; once the system stabilizes more, we expect to allow you to embed skills directly in your crate with no central repository.

You can either upload the skill directly to the central repo or you can upload a plugin that points to skills in your own repository.

Uploading a single skill to the central repo

Add a directory for your crate containing a SKILL.md:

widgetlib/
  SKILL.md
  scripts/         # optional
  resources/       # optional

Uploading multiple skills to the central repo

If you have several skills, add a subdirectory for each one:

widgetlib/
  basics/
    SKILL.md
  advanced-patterns/
    SKILL.md
    scripts/       # optional
    resources/     # optional

Hosting skills in your own repository

If you’d rather keep skills in your crate’s repository, you can add a plugin manifest to the recommendations repo that points to them and symposium will download the skills directly from your repository to users:

widgetlib.toml     # create this

where widgetlib.toml looks someting like this:

name = "widgetlib"

[[skills]]
crates = ["widgetlib"]
source.git = "https://github.com/org/widgetlib/tree/main/symposium/skills"

See Creating a plugin for more on plugin manifests.

Frontmatter fields

FieldDescription
nameSkill identifier.
descriptionShort description shown in skill listings.
cratesWhich crate(s) this skill is about. Comma-separated: crates: serde, serde_json.
activationalways (inline the body) or optional (list but don’t inline). Defaults to optional.
compatibilityList of agents or editors this skill works with, if it doesn’t apply universally. See the compatibility field spec.

See the Skill definition reference for the full format, the Skill matching reference for version constraint syntax, and the agentskills.io quickstart for general guidance on writing effective skills.

Activation modes

  • always — the skill body is included inline whenever the crate matches. Use this for guidance that’s broadly relevant.
  • optional (the default) — the skill is listed with its metadata but the body isn’t inlined. Use this for targeted workflows, migration guides, or debugging aids that are only sometimes needed.

Testing your skills

From a project that depends on your crate:

symposium crate --list
symposium crate widgetlib