blob: 7776f451e7649ace7ff735f62c6d7a6c2b2a4b26 [file] [view]
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
- [Authoring a trusted skill source](#authoring-a-trusted-skill-source)
- [Step 1 — Lay out the repo in the two-tree shape](#step-1--lay-out-the-repo-in-the-two-tree-shape)
- [Step 2 — Author each skill in the Magpie shape](#step-2--author-each-skill-in-the-magpie-shape)
- [Step 3 — Keep the eval binding resolvable](#step-3--keep-the-eval-binding-resolvable)
- [Step 4 — Pick your organization identity](#step-4--pick-your-organization-identity)
- [Step 5 — Choose a distribution method + verification anchor](#step-5--choose-a-distribution-method--verification-anchor)
- [Step 6 — Write your source descriptor](#step-6--write-your-source-descriptor)
- [Step 7 — Get listed for discovery (optional, recommended)](#step-7--get-listed-for-discovery-optional-recommended)
- [Step 8 — Validate before you publish](#step-8--validate-before-you-publish)
- [Step 9 — Tell adopters how to pull it](#step-9--tell-adopters-how-to-pull-it)
- [Step 10 — Maintain the source](#step-10--maintain-the-source)
- [See also](#see-also)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
<!-- SPDX-License-Identifier: Apache-2.0
https://www.apache.org/licenses/LICENSE-2.0 -->
# Authoring a trusted skill source
A step-by-step guide for a **third-party repository or organization** that
wants Apache Magpie adopters to be able to pull *its* skills. It is the
source-repo counterpart of [`README.md`](README.md), which describes the
same feature from the *adopter's* side.
**Mental model.** Your repo becomes a **trusted skill source**. Adopters do
not copy your files. They add your [source
descriptor](README.md#source-descriptor) to their trust list, commit a
**pin** (method + URL + ref + a verification anchor), and run
`/magpie-setup skill-sources`
([`skills/setup/skill-sources.md`](../../skills/setup/skill-sources.md)),
which fetches a **verified, gitignored snapshot** of your repo and symlinks
your skills in so they run exactly like in-tree Magpie skills. Your job is
to lay the repo out the way Magpie expects and to publish a descriptor plus
a verifiable release. Per
[`PRINCIPLES.md` §13](../../PRINCIPLES.md#13-snapshot-plus-override-never-vendored-copies)
nothing installs until an adopter vouches for you — being listed is
discovery, never installation.
## Step 1 — Lay out the repo in the two-tree shape
Magpie binds a skill to its eval suite by path, so keep the two roots it
uses itself:
```text
skills/<skill-name>/SKILL.md # the skill body (+ any helper files)
tools/skill-evals/evals/<skill-name>/ # that skill's eval suite
tools/<tool>/tests/ # unit tests, if a skill ships a tool
```
These are the defaults. If you must use different roots, declare them in the
descriptor's `layout:` block (Step 5) — but keeping the defaults is the
low-friction path.
## Step 2 — Author each skill in the Magpie shape
Every `SKILL.md` must carry these **required** frontmatter keys — the
[skill validator](../../tools/skill-and-tool-validator/) enforces them:
```yaml
---
name: <skill-name>
description: <what it does / when to invoke it>
license: Apache-2.0 # only Apache-2.0 is accepted
capability: capability:<triage | resolve | …>
---
```
Optional keys: `when_to_use`, `mode`, `status` (and `organization` /
`source`, which the framework fills in). Follow the framework authoring
conventions in [`docs/extending.md`](../extending.md) and
[`AGENTS.md`](../../AGENTS.md) — injection guards, the placeholder
convention, no ASF-only coupling. **Skill directory names must be globally
unique:** each becomes a `magpie-<name>` symlink in the adopter, so it must
not collide with a framework skill or another source's skill.
## Step 3 — Keep the eval binding resolvable
Each eval step's `fixtures/step-config.json` uses a repo-relative
`skill_md:` path. As long as `skills/` and `tools/skill-evals/evals/` stay
sibling trees, the binding resolves after a fetch — the fetch pulls **both**
trees plus any tool `tests/` a skill depends on. See the
[layout contract](README.md#layout-contract--skills-evals-tests).
## Step 4 — Pick your organization identity
The descriptor's `organization:` must name a directory under
`organizations/` **in `apache/magpie`**. Two paths:
- **`organization: independent`** — the catch-all. Works out of the box,
no change to Magpie.
- **Register your org** — open a PR to `apache/magpie` adding
`organizations/<your-org>/organization.md` (mirror
[`organizations/_template/`](../../organizations/_template/organization.md)),
optionally with a `skill-sources.md` that curates your sources. Choose
this if you want org-level branding and to vouch for your own sources at
the org layer. See [`organizations/README.md`](../../organizations/README.md).
## Step 5 — Choose a distribution method + verification anchor
| Method | What adopters pin | Use when |
|---|---|---|
| **`git-tag`** *(recommended)* | `ref: <tag>` + `commit: <SHA>` | Normal releases. Cut an **immutable** tag — never move a published tag; a moved tag fails the adopter's re-fetch guard as a supply-chain signal. |
| **`svn-zip`** | `ref: <version>` + `sha512: <hash>` | You publish a released archive (optionally GPG-signed against a `KEYS` file). |
| **`git-branch`** | `ref: <branch>` (no anchor) | WIP / preview only — no frozen anchor, tip-tracking. |
The fetch reuses the framework
[install recipes](../setup/install-recipes.md) verbatim, so these are the
same three methods and anchors the framework snapshot uses for itself.
## Step 6 — Write your source descriptor
This is the block an adopter (or your org's `skill-sources.md`) carries.
Required keys: `id`, `organization`, `name`, `method`, `url`, `ref`,
`provides`.
```yaml
- id: acme-security-skills # unique, kebab-case — the handle pointers reference
organization: independent # or your registered org
name: "Acme Security Skills"
maintainer: "Acme Sec Team / @acme-handle"
method: git-tag
url: https://github.com/acme/magpie-skills
ref: v1.0.0
commit: <SHA the tag resolves to> # git-tag anchor (or sha512: <hash> for svn-zip)
layout: # omit when you use the defaults
skills_root: skills
evals_root: tools/skill-evals/evals
provides:
- skill: acme-secret-scan # one skill…
- family: acme-audit-* # …or a whole prefix-family
```
Full field reference: [`README.md` §
Source descriptor](README.md#source-descriptor).
## Step 7 — Get listed for discovery (optional, recommended)
Open a PR to `apache/magpie` adding:
- a row to [`registry.md`](registry.md) — the discovery index; and/or
- your descriptor to `organizations/<your-org>/skill-sources.md` — org
curation.
**Listing is discovery only — it never triggers an install.** The adopter's
`<project-config>/skill-sources.md` trust list is always the gate.
## Step 8 — Validate before you publish
Run Magpie's own validator against your repo so your skills and descriptor
pass the same checks an adopter's CI runs:
```bash
git clone --depth=1 https://github.com/apache/magpie /tmp/magpie
# from your source repo root:
uv run --project /tmp/magpie/tools/skill-and-tool-validator skill-and-tool-validate
```
It checks `SKILL.md` frontmatter / naming / injection guards, descriptor
shape (required keys, a supported `method`, a known `organization`), and
flags any skill directory missing an eval suite.
## Step 9 — Tell adopters how to pull it
An adopter adds your descriptor to `<project-config>/skill-sources.md` — by
`id` alone if your org curates it, or in full otherwise — commits the pin,
and runs:
```text
/magpie-setup skill-sources
```
That fetches + verifies your source into `.apache-magpie-sources/<id>/` and
symlinks the skills you `provide`. The adopter side is documented in
[`README.md` § How a trusted skill is
installed](README.md#how-a-trusted-skill-is-installed).
## Step 10 — Maintain the source
- **New release** → cut a **new** tag and publish its `commit` (or the new
`sha512`). Adopters bump their pin deliberately; the bump shows up in
their PR diff, exactly like a framework-lock bump.
- **Keep the two-tree layout stable** so eval bindings keep resolving after
a fetch.
- **Additions to `provides`** reach adopters on their next
`/magpie-setup upgrade`, which re-fetches per the committed pin and
refreshes the symlinks.
## See also
- [`README.md`](README.md) — the feature from the adopter's side (formats, trust model, security model).
- [`registry.md`](registry.md) — the discovery index of known sources.
- [`RFC-AI-0006`](../rfcs/RFC-AI-0006.md) — the design, trust, and threat model.
- [`skills/setup/skill-sources.md`](../../skills/setup/skill-sources.md) — the `/magpie-setup skill-sources` fetch/pin/symlink flow.
- [`docs/extending.md`](../extending.md) — the full extension model (what / where / who).