For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt, and this page is available as Markdown at /creating-skills-and-plugins/create-a-skill.md.

Create a skill

Info

Takeaway A skill is a folder with a SKILL.md, packaged as a minimal plugin so you can version and share it. Scaffold one with tessl skill new, write a clear SKILL.md, and validate it with tessl skill lint and tessl review.

A skill teaches an agent how to do one thing: a workflow, a convention, a piece of specialized knowledge. It is agent-agnostic, so the skill you write here works across every agent Tessl supports, adapted to each on install. This page covers scaffolding a skill, writing it, and checking it is well formed. Improving how well it performs is a separate step, covered in Improving your skills, and sharing it is covered in Publish and update.

Info

Your agent can do all of this for you. Install Tessl's plugin creator with tessl install tessl/plugin-creator, or use Tessl Agent, which ships with those skills built in.

Prerequisites

  • The Tessl CLI installed (see Installation).
  • A logged-in session (tessl login), or a TESSL_TOKEN in the environment.
  • A workspace to attribute your work to. Examples use engteam as a stand-in; run tessl workspace list to see yours and use one of those instead.

Scaffold the skill

tessl skill new creates a new skill and its .tessl-plugin/plugin.json manifest. Run it with no flags for an interactive wizard:

tessl skill new

Or pass flags to scaffold it directly:

tessl skill new --name database-migration-helper --description "When you need to create and manage database migrations" --workspace engteam --path ./database-migration-helper
FlagPurpose
--nameSkill name, lowercase with hyphens.
--descriptionWhen the skill should trigger. This is what an agent reads to decide whether to load the skill, so make it specific.
--workspaceWorkspace for the skill. Defaults to local.
--pathDirectory to create the skill in.
--installInstall it into the current project immediately, so you can test it as you write.
--publicMake it public. Private by default.

Import an existing skill

If you already have a SKILL.md, tessl skill import generates the .tessl-plugin/plugin.json around it so it becomes an installable skill:

tessl skill import ./database-migration-helper --workspace engteam

Pass --public to make it public, or --force to overwrite an existing manifest.

Warning

skill import handles one skill. It writes .tessl-plugin/plugin.json inside the skill folder with "skills": ["."], so that folder becomes the plugin root, and its evals/ go there too.

If your repository has several skills, do not run skill import for each one. That makes one plugin per skill. Create one plugin at the repository root instead, and point its skills field at the folder that holds the skills:

my-repo/
├── .tessl-plugin/
│   └── plugin.json
├── skills/
│   ├── database-migration-helper/
│   │   └── SKILL.md
│   └── seed-data-helper/
│       └── SKILL.md
└── evals/
{
  "name": "engteam/my-repo",
  "version": "0.1.0",
  "description": "Database workflows for our services",
  "private": true,
  "skills": "./skills/"
}

When the skills sit in ./skills/, you can leave out the skills field: Tessl finds them by convention. To list specific skill folders, give an array, for example "skills": ["./skills/database-migration-helper", "./skills/seed-data-helper"]. See Configuration files for the field reference.

Write the SKILL.md

A skill follows the Agent Skills specification. The file is named SKILL.md: YAML frontmatter, then a Markdown body.

---
name: database-migration-helper
description: When you need to create and manage database migrations.
---

# Database migration helper

When creating a new migration:

1. Always include both `up` and `down` migrations.
2. Use a transaction where the engine supports it.
3. Test the migration on a copy of production data first.

## Example: adding a column

    -- Up
    ALTER TABLE users ADD COLUMN email_verified BOOLEAN DEFAULT FALSE;

    -- Down
    ALTER TABLE users DROP COLUMN email_verified;

## Best practices

- Never modify a migration that has already run in production.
- Keep migrations small and focused.

Two parts do the work:

  • description (frontmatter) is how an agent discovers the skill. State what it does and when to use it. A vague description is the most common reason a skill never fires.
  • The body is the instructions the agent follows once loaded. Keep it concise and actionable; push long reference material into a references/ folder beside the SKILL.md.

Understand the package structure

tessl skill new creates a Tessl package: your skill plus a manifest that makes it installable.

database-migration-helper/
├── .tessl-plugin/plugin.json
└── skills/database-migration-helper/SKILL.md

The manifest holds the package metadata:

{
  "name": "engteam/database-migration-helper",
  "version": "1.0.0",
  "description": "Create and manage database migrations",
  "private": true
}
FieldMeaning
nameworkspace/name. Its identity on the registry.
versionSemantic version (semver). Bump it on each release.
descriptionShort summary shown on the registry.
privatetrue keeps it to your workspace; public is irreversible once published.
skillsPath, or array of paths, to your skill directories. Defaults to ./skills if omitted.

You rarely edit this by hand, except to bump version. The full reference is in Configuration files.

Validate

Lint checks the structure and frontmatter against the Agent Skills specification:

tessl skill lint ./database-migration-helper

Fix any errors it reports before moving on. Then, for a scored review of how well the skill is written, run tessl review and read the result:

tessl review run ./database-migration-helper --workspace engteam

Reviewing and improving are covered in full in Check a skill's quality using review.

Next