Repository navigation
Description
Summary
Add an optional skills field to each entry of libraries in plugins/<plugin>/catalog.yaml. It names the skills of the plugin that cover that library. It's passed through to catalog.json and bundle.catalog() (#5).
# plugins/rf-web/catalog.yaml
libraries:
- name: Browser
package: robotframework-browser
versions: ">=20,<21"
skills: [rf-browser]
- name: SeleniumLibrary
package: robotframework-seleniumlibrary
versions: ">=6.9,<7"
skills: [rf-selenium]Purpose
libraries[].package is already described as "used to detect the library in a project". Detecting a library is only half the job, though. A tool also has to know which skill to hand the agent, and the catalogue maps libraries to a plugin only. A plugin can ship several skills for different libraries:
| plugin | libraries | skills |
|---|---|---|
| rf-web | Browser, SeleniumLibrary | rf-browser, rf-selenium |
| rf-api | RequestsLibrary, RESTinstance | rf-requests, rf-restinstance |
So a project that uses only Browser can't be pointed at rf-browser alone. A tool has to name every skill of rf-web, or guess.
rf-mcp now uses the catalogue this way. On an agent's first tool call it lists the packages installed in the project and attaches the matching skills, and its hints link to skill sections. In its evaluation against this repository at 37562367, matching on the plugin level went wrong. A Browser project that also had RequestsLibrary installed got rf-requests, rf-restinstance and rf-browser, in that order, because rf-api sorts before rf-web. rf-mcp now guesses from the skill names (Browser → rf-browser, RequestsLibrary → rf-requests). That works for today's plugins, but it's a naming convention, not a contract. A skill such as rf-api-auth or a company plugin would break it.
The installer could use the field too. install --plugins installs whole plugins today, while a per-library list would let it install rf-browser without rf-selenium for a Browser-only project.
Proposed change
- Schema. In
schemas/catalog.schema.json, add tolibraries.items.properties(the items haveadditionalProperties: false, so the field is rejected today):"skills": { "description": "Skills of this plugin that cover the library. Omit when every skill of the plugin applies.", "type": "array", "items": {"type": "string", "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"}, "minItems": 1, "uniqueItems": true }
- Validation.
scripts/build-catalog.py --checkfails when a listed skill has noplugins/<plugin>/skills/<skill>/SKILL.md. - Data. Fill in the field for the current plugins:
- rf-web: Browser →
rf-browser, SeleniumLibrary →rf-selenium; - rf-api: RequestsLibrary →
rf-requests, RESTinstance →rf-restinstance; - rf-mobile: AppiumLibrary →
rf-appium; - rf-desktop: PlatynUI →
rf-platynui.
- rf-web: Browser →
- Output.
catalog.jsonin the installer bundle, and with itbundle.catalog()from Public Python API for the bundled catalogue and skill folders (for rf-mcp) #5, carries the field unchanged.docs/catalog.mdcan show it.
The field is optional, so existing catalogues and readers keep working. A reader that finds no skills treats every skill of the plugin as covering the library, which is what it has to assume today.
Acceptance criteria
- The schema accepts
libraries[].skillsand still rejects other unknown keys. -
build-catalog.py --checkreports a listed skill that doesn't exist, naming the plugin, the library and the skill. - The catalogues of rf-web, rf-api, rf-mobile and rf-desktop list the skills per library.
-
catalog.json, andbundle.catalog()once Public Python API for the bundled catalogue and skill folders (for rf-mcp) #5 lands, contain the field. -
CONTRIBUTING.md(or wherevercatalog.yamlis documented) explains the field.
Related: #5 (public API for the bundled catalogue).
Activity
manykarim commentedon Nov 13, 2026
Implemented in #8, as proposed:
Schema and check:
libraries[].skillsinschemas/catalog.schema.json(optional; unique kebab-case names, at least one; other unknown keys still rejected).build-catalog.py --checkfails on a listed skill without aSKILL.md, naming the plugin, the library and the skill.Data:
rf-browser, SeleniumLibrary →rf-selenium;rf-requests, RESTinstance →rf-restinstance;rf-appium;rf-platynui.A test checks that every library of each technology plugin names its skills and that together they cover all of the plugin's skills.
Output:
catalog.json,bundle.catalog()andbundle.fetch()snapshots carry the field unchanged, anddocs/catalog.mdshows it.CATALOG_FORMATstays1.Absent field: a library without
skillshas noskillskey, which means every skill of the plugin covers it. That's the fallback rf-mcp needs for community plugins.Docs: CONTRIBUTING.md and the plugin template explain the field.
For rf-mcp, picking the skills for a project's packages becomes:
Per-skill installs in the installer (
rf-browserwithoutrf-selenium) aren't part of this; that would be a separate change.Once #8 is merged, the next
robotframework-pluginsrelease (2026.11.0, together with #5) ships the field.Written with Claude Code (Anthropic) at the maintainer's request.
Merge pull request #8 from MarketSquare/change/catalog-library-skills…