Contribute to LeanCode AI plugins
The canonical contributor reference for leancodepl/ai-plugins. The repo's CONTRIBUTING.md is a thin pointer at this file. Read top-to-bottom for the full picture, or jump to the relevant path.
How to respond
- Ask what kind of change the user wants:
- Tweak an existing plugin (improve a skill or reference, fix a typo, sharpen wording).
- Add a new plugin (a new focused capability).
- Add a skill or reference to an existing plugin.
- Walk through the matching path below. Print exact commands. Do not run
git,gh, or any state-changing command on the contributor's behalf unless they explicitly ask. - After the PR is pushed, point the user at
gh pr checks <pr-number>to follow CI verdicts. CI is the source of truth.
Reading the current state
Before answering questions about what plugins or clients exist, read the source of truth:
- Plugins:
.claude-plugin/marketplace.jsonat the repo root. - Supported clients: the "Supported clients" section of the root
README.md.
Do not enumerate plugins or clients from memory.
Where to work
All contribution work happens inside a local clone of leancodepl/ai-plugins, not in a consumer project. If the contributor does not have the clone yet:
gh repo clone leancodepl/ai-plugins
cd ai-plugins
If gh is not installed, point them at https://cli.github.com/ or, for a fully GUI flow, https://desktop.github.com/.
Plugin shape
This repo ships Claude Code plugins. Every plugin lives under plugins/<plugin-name>/:
plugins/<plugin-name>/
skills/
<plugin-name>-usage/
SKILL.md # routing entry point, always present
references/ # optional reference material the skill loads on demand
<topic>.md
<other-skill>/
SKILL.md
.claude-plugin/plugin.json
README.md
CHANGELOG.md
.mcp.json # only if the plugin drives an MCP server
Notes:
.claude-plugin/plugin.jsonis the manifest. It carriesname,displayName,description,version, and pointsskillsat./skills/. It has noruleskey — Claude Code does not recognize one.- Every plugin ships
skills/<plugin-name>-usage/SKILL.mdas its routing entry point. The skillname:in frontmatter must exactly match the folder name. - Skill names are unique across the whole marketplace. If your slug could collide, prefix it with the plugin name.
- Everything ships as a skill. Use a workflow skill for a step-by-step action, and
references/*.mdalongside aSKILL.mdfor convention-style guidance the model should apply. Mark skills that should never auto-fire on inferred intent withdisable-model-invocation: true. - Reference files are edited directly —
SKILL.mdlists them under a "Reach for these references" section so Claude knows when to load each. They load only when referenced, so detailed material costs nothing until needed. - Setup and configuration docs have one canonical home: the plugin
README.md. Anything a user has to do to make the plugin work (env vars, dependencies, post-install steps, sample directories, MCP servers, etc.) lives there in full. Other surfaces —<plugin>-usage/SKILL.md, other skills, top-level README bullets — reference the plugin README rather than restating the setup. The single exception is a skill that needs to print setup inline at runtime (because the user is not on GitHub at that moment); when you keep an inline copy for that reason, say so in the skill so the next contributor does not assume the duplication is accidental. This rule prevents drift betweenREADME.md, the usage SKILL, and any workhorse SKILL that all happen to mention the same env var.
Skill conventions
- Each skill is a folder
skills/<slug>/containing a singleSKILL.md. - Frontmatter
name:must equal the folder name. descriptionshould include "Use when …" with concrete trigger terms.- Add
argument-hint: "<args>"when the skill takes arguments. - Add
disable-model-invocation: truewhen the skill should never auto-fire on inferred intent. - Skill names must be unique across the whole marketplace.
Reference-material conventions
- Convention-style guidance lives in
skills/<plugin-name>-usage/references/*.mdas plain markdown (no frontmatter). - List each reference file in the owning
SKILL.mdunder a "Reach for these references" section, with a one-line note on what it covers, so Claude knows when to load it. - A workhorse skill in the same plugin can cite a usage skill's reference with a relative path (e.g.
../<plugin-name>-usage/references/<topic>.md).
Path 1 — tweak an existing plugin
- Open
plugins/<plugin-name>/and find the file to change. - Edit it. Keep the change focused — one PR per concern.
- Bump the plugin's
versionin.claude-plugin/plugin.json. PATCH for wording / docs, MINOR for new behavior, MAJOR for renames or removals. See "Versioning" below for what Claude Code does with the bump. - Add a bullet to
plugins/<plugin-name>/CHANGELOG.mdunder a new top entry matching the new version. - Update
plugins/<plugin-name>/README.mdif the change affects what the plugin lists. - Branch, commit, push, open a PR — see "Open the PR" below.
Path 2 — add a skill or reference to an existing plugin
Same as Path 1, plus:
- New skill →
plugins/<plugin-name>/skills/<skill-slug>/SKILL.mdwith frontmattername: <skill-slug>and adescriptionthat includes "Use when …" with concrete trigger terms. Adddisable-model-invocation: trueif it should not auto-fire. Also append the skill's plugin-relative path (e.g."./skills/<skill-slug>") to the plugin'sskillsarray in.claude-plugin/marketplace.json. - New reference →
plugins/<plugin-name>/skills/<plugin-name>-usage/references/<topic>.md(plain markdown), and list it under "Reach for these references" in thatSKILL.md. - Mention the new asset in
plugins/<plugin-name>/README.md.
Path 3 — add a new plugin
Pick a kebab-case name with a prefix that reflects scope:
flutter-<scope>for a Flutter capability (the bulk of this marketplace).lean-<scope>for a meta or repo-wide plugin with no natural domain (matcheslean-core).
Do not ship a bare slug. The prefix is what makes the marketplace listing predictable — users remember prefixes plus autocomplete, not full slugs.
Create
plugins/<plugin-name>/with at minimum:skills/<plugin-name>-usage/SKILL.md.claude-plugin/plugin.jsonREADME.mdCHANGELOG.mdwith a0.1.0entry
Copy manifest shape from a sibling plugin. Set
version: "0.1.0".Register the plugin in
.claude-plugin/marketplace.json— append toplugins[]withname,source,description, and askillsarray listing every skill's plugin-relative path (e.g."./skills/<plugin-name>-usage").Add the plugin to the human-readable overview in the root
README.mdunder the matching group.Branch, commit, push, open a PR.
Versioning
Per-plugin semver in .claude-plugin/plugin.json.
- PATCH — wording, doc only.
- MINOR — new skill, new reference, new behavior; expanded scope; additive change.
- MAJOR — rename, removal, or reversal of existing guidance.
Keep plugin.json to fields in the official Claude Code plugin manifest schema — CI runs claude plugin validate . --strict, which fails on unrecognized fields.
What Claude Code does with the version
plugin.json.version is the cache key for /plugin update. Bumping it is load-bearing. If you ship changes without bumping, users running /plugin update see "already at the latest version" and never get your change. Bump it on every release. (See https://code.claude.com/docs/en/plugins-reference.md, "Version management".)
marketplace.json.metadata.version is decorative — no documented refresh or update behavior. Bump by convention when plugins are added/removed/renamed if you want, but nothing depends on it.
Users get updates by running /plugin update (or auto-update if enabled) — no reinstall needed on a normal version bump.
Open the PR
git checkout -b <short-slug>
git add -A
git commit -m "<plugin-name>: <what changed>"
git push -u origin HEAD
gh pr create --repo leancodepl/ai-plugins \
--title "<plugin-name>: <what changed>" \
--body "<one paragraph: what and why; mention any breaking changes>"
If gh is not installed, push the branch and open the PR via the GitHub web UI. The PR description should answer: what changed, why, and which plugins it touches.
CI is the safety net
Every PR runs on GitHub Actions:
- Structure — manifest fields, marketplace registration, file shape (
go run ./cmd/validate-plugins). - Lint — Go formatters/linters for repo tooling.
Contributors do not need to install Go locally — CI runs it. Watch the verdicts with:
gh pr checks <pr-number>
A green PR means the shape is correct. Review focuses on guidance quality, not boilerplate.
What NOT to do
- Do not bundle changes across multiple plugins in a single PR. One plugin per PR keeps review tight.
- Do not ship a Claude Code-visible change without bumping
plugin.json.version— see "Versioning" above. - Do not invent guidance that is not grounded in real usage. If you cannot point at a concrete reason for a skill or reference claim, leave it out.
- Do not enumerate plugins or clients from memory — read the source of truth.