# Extending Paver with skills

Some tasks need deeper domain knowledge, whether it's the right commands for a specific service, the correct sequence for an incident response, the quirks of a particular platform, or expertise about your specific workflows. Skills are how IBM® Paver carries that knowledge.

A skill is a domain-specific capability module. Out of the box, IBM provides built-in system skills that cover the core capabilities of the environment Paver runs in. You can then extend Paver by adding your own user skills that are tailored to your specific workflows, proprietary tools, and custom runbooks.

When you ask Paver to do something, it automatically loads the skills relevant to your request and uses them to give more accurate guidance, actions, and recommendations. You don't need to choose or activate a skill yourself because Paver selects them for you.

## What skills do

Each skill adds focused expertise in a specific area. A skill gives Paver three kinds of knowledge:

- **What to know**: The terminology, resource types, and service quirks of a domain
- **How to act**: The right commands, flags, and workflows for a specific domain
- **What to watch out for**: The common mistakes, ordering dependencies, and safety considerations that apply

For example, when you ask Paver to manage IAM policies, it loads the `iam-manager` skill. That skill knows how service IDs, access groups, and trusted profiles work, and it guides Paver's actions accordingly.

## How Paver selects skills

Paver reads the description that is attached to every available skill and uses it to decide which skills apply to your request. Only relevant skills are loaded, which keeps Paver focused and avoids diluting its reasoning with unrelated context.

If your request spans multiple domains, for example deploying an app to Kubernetes with Terraform, Paver loads multiple skills at once. You never have to ask Paver to use a particular skill by name. Just describe what you want to do.

## Skill tiers

Skills come from two sources:

| Tier       | Who manages it | Scope           |
| ---------- | -------------- | --------------- |
| **System** | IBM            | All Paver users |
| **User**   | You            | Just you        |

All skills are treated equally when Paver decides which ones to load for your request. Paver selects skills based on their descriptions, not on whether they are system or user skills. However, if a user skill has the same name as a system skill, your user skill replaces the system skill in your sessions only. To avoid replacing a system skill by accident, give your skill a unique name.

### What's the difference between system and user skills?

- System skills are provided and maintained by IBM for covering the core capabilities of the environment Paver operates in, such as interacting with platform services, managing infrastructure, and executing common operational tasks. They are available to all Paver users.
- User skills let you extend Paver beyond its baseline capabilities by adding expertise for your own proprietary tools, internal environments, and routine workflows. They apply only to your sessions.

## Creating skills

You can extend Paver's expertise by creating and uploading user skills that apply only to your sessions. Refer to the following requirements and recommendations for creating your user skills:

- Follow the open source [Agent Skills Specification](https://agentskills.io/specification) when you create your skill.
- Optionally include scripts, references, or assets subdirectories to enable the skill to execute code, load documentation as needed, or access-specific templates.
- Ensure the `SKILL.md` is ≤ 32 KB.                                                                    
- Files in your skill directory can't exceed a total of 50 MB. If your files exceed this limit, your skill won't be uploaded and you receive an error.
- Ensure that the `SKILL.md` file is in the root of your directory. This file is required.

### Writing your own skill

When you're writing your skill, you must include a `SKILL.md` file. You might also include other resources such as scripts, reference materials, templates, or other resources. A skill is a folder containing the following assets:

- `SKILL.md` (required): Instructions in Markdown with YAML front matter. Target fewer than 500 lines. 32 KB is the maximum file size limit.
- `scripts/` (optional): Executable code. Scripts run in the Paver sandbox, where they have access to Python, Node.js, and Bash.
- `references/` (optional): Documentation loaded as needed.
- `assets/` (optional): Templates, fonts, icons used in output.

```text
/skills/
|
|    skill_name/
|    |
|    |--- SKILL.md # Required - main skill file
|    |--- scripts/ # Optional - executable code
|         ├── process_data.py # Example
|         └── validate.sh # Example
|    |--- references/  # Optional - documentation
|         ├── api-guide.md # Example
|         └── examples/ # Example
|    |--- assets/  # Optional - templates, etc.
|         └── report-template.md # Example
```

The `SKILL.md` file contains the metadata and core instructions. The name and description of your skill are important because it is how Paver initially determines its relevancy for loading the skill based on the user request. The optional directories contain supporting resources that Paver can load as needed.

The YAML header in the `SKILL.md` file is what is loaded for Paver to evaluate and activate your skill based on the user request:

```text
---
name: your-skill-name
description: Describe what it does. Define when to use it when a user asks to [specific phrases].
---
```

Make sure that the name defined in the metadata of the `SKILL.md` file matches the directory name. The description includes what the skill does and when it should be triggered. The description should be 1024 characters or less and not include XML tags. The primary purpose of the description is to help Paver decide whether to load the skill based on the user request. The description does not define how to complete a task based on the loaded skill.

## Uploading skills

You can upload skills from a GitHub directory or from your local system.

> **Upload skills only from trusted sources**
>
> Skills can contain malicious content that could expose your data or cause unwanted actions. Make sure you trust
> the source, including public GitHub repositories, and review a skill before you upload it. When you upload a
> skill from GitHub, Paver downloads it one time. The skill isn't automatically updated when the GitHub source
> changes.

### From inside a chat

```text
/skills upload ./skills/my-custom-skill
```

### From the CLI

```text
paver skills upload ./skills/my-custom-skill
```

If you're not sure that the skill is uploaded or is available, you can list the skills in your session to verify:

```text
paver skills list
```

## Managing your skills

You can list, upload, and remove user skills wherever you're working with Paver:

- In the web UI, you can manage user skills from the **Skills** page.
- In an interactive chat session in the web UI or `paver chat`, you can use the `/skills` slash command.
- In the CLI, you can use the `skills` command.

Refer to the [IBM Paver CLI command reference](https://paver.ibm.com/docs/cli-reference.md) and [IBM Paver chat commands reference](https://paver.ibm.com/docs/tui-reference.md) for full usage information about the commands.
