We welcome contributions of new skills, agents, plugins, and documentation.
Plugins work in Claude Code and Cursor. Each plugin has identical manifests in .claude-plugin/ and .cursor-plugin/ so each tool discovers it natively.
| I want to... | Go here |
|---|---|
| Contribute a PatternFly skill (component dev, design tokens, migration, a11y) | PatternFly contributions |
| Contribute a UXD skill (internal team tooling) | UXD contributions |
| Report a bug or request a feature | Open an issue |
PatternFly skills live under plugins/patternfly/ and use the pf- prefix. You don't need to understand UXD tooling to contribute.
Quick start:
- Fork and clone this repo
- Create your skill:
make scaffold PLUGIN=pf-react SKILL=pf-my-skill - Edit the generated
SKILL.md— see CONTRIBUTING-SKILLS.md for the full guide - Test locally: invoke
/pf-react:pf-my-skillon a real scenario - Run
make validateto check consistency - Open a pull request
PF PRs are reviewed by PF maintainers (@rh-uxd/ai-helpers-maintainers). See GOVERNANCE.md for the review process.
Not sure what to build? Look for issues labeled good first issue + area/patternfly.
UXD skills live at plugins/uxd-workshop/ and use the uxd- prefix. UXD PRs are reviewed by UXD maintainers.
Quick start:
- Fork and clone this repo
- Check the skill's README for any setup requirements (API tokens, tool access)
- Create your skill:
make scaffold PLUGIN=uxd-workshop SKILL=uxd-my-skill - Test locally and open a PR
Plugins organize skills by domain. See the full plugin table for what each plugin does and example skills.
- PatternFly skills →
plugins/patternfly/<plugin>/— use thepf-prefix - UXD skills →
plugins/uxd-workshop/— use theuxd-prefix - Not sure where your skill belongs? Start in the workshop that matches your domain (
pf-workshoporuxd-workshop). Skills graduate to consumer plugins once validated.
Create a SKILL.md file in a directory under the appropriate plugin:
plugins/<plugin-name>/skills/<your-skill>/SKILL.md
Not sure where it belongs? Put it in the workshop that matches your domain:
- UXD skills →
uxd-workshop(useuxd-prefix) - PatternFly skills →
pf-workshop(usepf-prefix)
See CONTRIBUTING-SKILLS.md for a full walkthrough of skill structure and naming.
Open a pull request against main.
- Skills (
skills/your-skill/SKILL.md) — tasks that produce a result. Most contributions are skills. - Agents (
agents/your-agent.md) — domain knowledge the AI follows automatically.
See CONTRIBUTING-SKILLS.md for guidance on which to use.
When you have a cluster of related skills that serve a clear audience or workflow, it's time for a new plugin.
- You have 2+ skills that share a clear theme
- You can name the plugin in one or two words that describe what it helps people do
- The skills don't fit naturally into an existing plugin
If you can't name it clearly, it probably doesn't need to be its own plugin yet — keep the skills in the appropriate workshop.
- Create the directory structure:
plugins/<plugin-name>/
├── .claude-plugin/
│ └── plugin.json
├── .cursor-plugin/
│ └── plugin.json
├── skills/
└── agents/
- Write identical
plugin.jsonfiles for both.claude-plugin/and.cursor-plugin/:
{
"name": "<plugin-name>",
"description": "<what this plugin helps people do>",
"author": {
"name": "UXD Team"
},
"repository": "https://github.com/rh-uxd/ai-helpers"
}- Add the plugin to both marketplace configs (
.claude-plugin/marketplace.jsonand.cursor-plugin/marketplace.json). Exception: meta-plugins usingdependencies(likepatternfly) are Claude Code-only and only listed in the Claude marketplace. - Move the relevant skills from the workshop into the new plugin
- Open a pull request
There are three common approaches — you can mix them:
| Approach | Example plugins | Good for |
|---|---|---|
| Persona — who uses it | developer, designer, researcher |
Clear when skills map to one role |
| Workflow — what process it supports | sprint-ops, design-review |
Cross-role processes |
| Capability — what it does | accessibility, prototyping |
Skills used by multiple roles |
The test: can someone look at the plugin name and know whether their skill belongs there? If not, the boundary is wrong.
Plugin names must tell a user exactly what the plugin helps them do. A user browsing the marketplace should understand what they're installing without clicking through. See CONTRIBUTING-SKILLS.md for naming examples and guidelines.
flowchart TD
A[Idea] --> B[Create skill locally]
B --> C[Test on real scenarios]
C --> D[Submit PR to workshop]
D --> E[Workshop plugin]
E --> F{Graduation criteria met?}
F -->|Yes| G[Open graduation PR]
F -->|No| E
G --> H[Maintainer review + merge]
H --> I[Consumer plugin]
I -.->|Demotion| E
Skills start as local prototypes and graduate through a workshop to a consumer plugin. Each stage below covers a step in this lifecycle.
Skills start in a workshop plugin (uxd-workshop or pf-workshop). When a skill is validated and ready for a broader audience, it graduates to a consumer plugin.
A skill graduates when all of the following are true:
- In the workshop for ≥2 weeks with real usage
- Passes eval on representative inputs
- Passes the quality checklist
- Graduation PR approved by a maintainer
graph LR
A[Workshop skill] --> B[Usage + feedback]
B --> C{Eval passes?}
C -->|Yes| D[Open graduation PR]
C -->|No| B
D --> E[Maintainer review]
E --> F[Merge + CI updates PLUGINS.md]
- Create the consumer plugin directory and manifests (if it's the first skill in that plugin)
- Move the skill directory from
plugins/<workshop>/skills/<skill>/toplugins/<consumer-plugin>/skills/<skill>/ - Add the new plugin to both marketplace configs
- Run
bash scripts/generate-plugins-md.shto regenerate docs - Open a pull request
Skills can move back to a workshop if quality degrades, scope changes, or the consumer plugin is restructured. Same PR process in reverse.
- Add markdown files under
docs/following the existing directory structure - Update
docs/README.md(table of contents) to link to your new content
graph LR
A[Create branch] --> B[Write skill]
B --> C[Test locally]
C --> D[Open PR]
D --> E[Skillsaw + CodeRabbit]
E --> F[Human review]
F --> G[Merge to main]
G --> H[CI updates PLUGINS.md]
- Fork the repository
- Create a feature branch from
main - Add your skill, agent, or plugin changes
- Test locally — invoke the skill on a real scenario and verify the output
- Open a pull request against
main - Skillsaw lints content quality (advisory); CodeRabbit reviews structure and security
- A maintainer reviews for intent and quality
- On merge, CI regenerates
PLUGINS.mdand the README plugin table
Before opening your PR, verify:
- Skill name uses the correct prefix (
uxd-for UXD skills,pf-for PF skills) - Frontmatter has
nameanddescription(namematches the directory name) - Description follows the formula:
[Action verb] [what it does]. [Use when + triggers.] - Tool-agnostic — no Claude-specific or Cursor-specific references
- Under 500 lines (shorter is better)
- Tested locally on a real scenario
- If new plugin:
.claude-plugin/and.cursor-plugin/manifests are identical - Consumer-facing skills have an eval colocated at
skills/<skill-name>/eval/ -
make lintpasses locally (optional — CI runs it automatically)
New to AI skills? Start with the Choose Your Path section above — it routes you to the right guide for your domain.
Designer or researcher? The Quickstart guide covers everything you need — no developer tooling required.
Not sure what to build? Look for issues labeled good first issue, or see the skill ideas table for inspiration.
See FAQ.md for answers to common questions — especially if you're a PatternFly contributor new to this repo.
- Use kebab-case for directory and file names
- Include clear descriptions in all frontmatter
- Test your skills locally before submitting
- Keep documentation concise and AI-friendly
- Don't hardcode a
model:in agent frontmatter — it forces all users onto one model, overriding their preference - Consumer-facing skills are expected to have an eval — see CONTRIBUTING-SKILLS.md for details
PRs are reviewed by CodeRabbit (automated) and a human maintainer. See GOVERNANCE.md for the full review process.