Skip to content

feat(catalog): libraries name the skills that cover them - #8

Merged
manykarim merged 2 commits into
mainfrom
change/catalog-library-skills
Nov 13, 2026
Merged

manykarim merged 2 commits into
mainfrom
change/catalog-library-skills

Conversation

@manykarim

Copy link
Copy Markdown
Collaborator

Closes #7.

Summary

Each library in a plugin's catalog.yaml can now name the skills of that plugin that cover it. A tool that detects one library in a project can then pick its skill instead of every skill of the plugin.

# plugins/rf-web/catalog.yaml
libraries:
  - name: Browser
    package: robotframework-browser
    versions: ">=20,<21"
    skills: [rf-browser]
  • Schema: libraries[].skills is optional: unique kebab-case names, at least one. Other unknown keys of a library entry are still rejected, for example skill: in the singular.

  • Check: build-catalog.py fails when a listed skill has no plugins/<plugin>/skills/<skill>/SKILL.md, for example rf-api: library RequestsLibrary lists skill rf-requests-auth, but plugins/rf-api/skills/rf-requests-auth/SKILL.md doesn't exist. It checks removed plugins' manifests too.

  • Data:

    Plugin Library → skill
    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
  • Output: docs/catalog.md shows the skills next to each library. catalog.json, bundle.catalog() and bundle.fetch() snapshots (Public Python API for the bundled catalogue and skill folders (for rf-mcp) #5) carry the field unchanged, with no installer code change.

  • No format bump: CATALOG_FORMAT stays 1, because the field is new and optional. A library without skills gets no key, which means every skill of the plugin covers it.

  • Docs:

    • CONTRIBUTING.md: explains the field, and that it must change when a skill is added, renamed or removed;
    • the plugin template: shows it in a comment;
    • the installer README: lists it in the "Python API" table;
    • the installer changelog: a line under the unreleased 2026.11.0.

The OpenSpec change catalog-library-skills is in this PR. It adds a requirement to plugin-catalogue.

Test plan

  • tests/test_catalog.py, 45 passed. It covers:
    • accepted and rejected forms of the field (singular key, empty list, duplicates, wrong case);
    • a missing skill, both as a check problem and as a --check failure;
    • a removed plugin's stale skill;
    • the docs/catalog.md text, and that it goes stale when skills changes;
    • that every library of each technology plugin names its skills and together they cover all of its skills.
  • tests/installer, 276 passed:
    • bundle.catalog() carries skills;
    • a fetch() snapshot keeps skills on one library and adds no key to another.
  • pytest tests --ignore=tests/eval (832 passed), build-catalog.py --check, check-drift.sh, docs voice
  • check-template.sh: passes, apart from a hook test that fails locally on main too and passes in CI. While running it I found that the wheel test from feat(installer): public Python API for the bundled catalogue and skill folders #6 expected exactly the five plugins; it now allows extra ones, such as the template in CI.
  • CI on this PR

🤖 Generated with Claude Code

https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP

- schema: optional libraries[].skills (unique kebab-case names, at least one)
- build-catalog.py fails when a listed skill has no SKILL.md, naming the
  plugin, the library and the skill; docs/catalog.md shows the skills
- rf-web, rf-api, rf-mobile and rf-desktop name their skills per library
- passed through unchanged to catalog.json, bundle.catalog() and fetch()
- CONTRIBUTING, plugin template, installer README and changelog

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHEmzL3ErAhGQykKWDx2wP
@manykarim
manykarim merged commit 9eaea81 into main Nov 13, 2026
30 of 36 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

catalog.yaml: name the skills that cover each library (libraries[].skills)

1 participant