Skip to content

Distribute the framework as a Claude Code plugin - #62

Merged
olehsvyrydov merged 1 commit into
mainfrom
feat/plugin-marketplace
Jul 30, 2026
Merged

Distribute the framework as a Claude Code plugin#62
olehsvyrydov merged 1 commit into
mainfrom
feat/plugin-marketplace

Conversation

@olehsvyrydov

Copy link
Copy Markdown
Owner

Problem

The framework installs by copying files with install.sh. Three consequences:

  • No versioning and no update path. A project gets whatever was copied when it was set up, and there is no way to know it is stale.
  • Personal skills do not travel. Cloud sessions, Cowork and routines do not read ~/.claude/skills/ — they do read project skills and repo-declared plugins. So a skill in ~/.claude is invisible to any cloud session and to anyone else who clones the repo.
  • Symlinked installs make the working tree live configuration. ~/.claude/skills symlinks here, so a stray git pull on this repo changes the running agent's capabilities. That happened during this work: main tracked a stale remote, a pull rewound the tree, and every skill vanished from the session mid-task.

What changed

The existing claude/ directory becomes the plugin root. Its skills/ and commands/ are already exactly where a plugin expects them, so no files move:

  • claude/.claude-plugin/plugin.json — the manifest
  • .claude-plugin/marketplace.json at the repo root — the catalogue, pointing at ./claude

version is deliberately omitted so the git commit SHA becomes the version. Every push is an update, which is right for an internal framework under active development; an explicit version would mean users only get changes when someone remembers to bump it.

Consuming projects then declare it once:

// <project>/.claude/settings.json
{
  "extraKnownMarketplaces": {
    "aidevteam": { "source": { "source": "github", "repo": "olehsvyrydov/AI-development-team" } }
  },
  "enabledPlugins": { "ai-dev-team@aidevteam": true }
}

Anyone who clones and trusts the folder is prompted to install; cloud sessions pick it up too.

A real defect this found

claude plugin validate — a check the loose .claude/skills/ layout never had — found that verify-landed's YAML frontmatter did not parse. Its description contained an unquoted nothing: an edit, and a bare YAML scalar cannot contain : .

The skill therefore loaded with empty metadata: no description, so it would never have auto-triggered. It looked correct in the file, passed review, and shipped. Nothing else would have caught it — the compiler does not read YAML, there are no tests, and reading it tells you nothing.

That the skill about proving a change landed had not itself landed is the joke, but the point is serious: the validator is a reason to adopt the plugin format independently of distribution.

Fixed by re-wording to an em-dash and quoting the string. Every other skill parses; claude plugin validate ./claude reports no errors.

Tests

claude plugin validate ./claude — no errors. Both manifests parse as JSON. All 35 skills' frontmatter parses as YAML (checked with a script, not by eye, since by eye is exactly what missed it).

install.sh is untouched and keeps working; retire it once a project has run on the plugin for a week.

The framework installed by copying files with install.sh: no versioning, no
update path, and personal skills never reach cloud sessions or a teammate who
clones a repo. As a plugin it is versioned, updatable, and a project can declare
it in .claude/settings.json so anyone who clones and trusts the folder gets it.

The existing claude/ directory becomes the plugin root — its skills/ and
commands/ are already where a plugin expects them, so nothing moves. The
marketplace catalogue sits at the repo root pointing at ./claude.

Version is deliberately omitted so the git SHA is the version: every push is an
update, which suits a framework under active development.

Also fixes a real defect the plugin validator found. verify-landed's description
contained an unquoted colon-space ('nothing: an edit'), so its YAML frontmatter
failed to parse and the skill loaded with EMPTY METADATA — no description, so it
would never auto-trigger. It looked correct, passed review, and shipped. The
skill about proving a change landed had not landed. Quoted and re-worded; all
other skills parse.
Copilot AI review requested due to automatic review settings July 30, 2026 16:27

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR converts the repository’s existing claude/ directory into a Claude Code plugin root by adding the required plugin manifest and a repo-level marketplace catalog entry, enabling consuming projects (and cloud sessions) to install/update the framework via plugins rather than copied files. It also fixes a YAML frontmatter parsing issue in the verify-landed skill so its metadata is correctly recognized by plugin validation.

Changes:

  • Add claude/.claude-plugin/plugin.json to define the ai-dev-team plugin manifest.
  • Add .claude-plugin/marketplace.json at the repo root to publish the plugin from ./claude.
  • Fix verify-landed frontmatter by quoting/rewording the description so YAML parses correctly.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
claude/skills/verify-landed/SKILL.md Quotes and rewords the frontmatter description to avoid YAML parse errors and restore metadata loading.
claude/.claude-plugin/plugin.json Introduces the plugin manifest for the claude/ plugin root.
.claude-plugin/marketplace.json Adds a local marketplace catalog entry pointing to the plugin at ./claude.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@olehsvyrydov
olehsvyrydov merged commit 35c35b6 into main Jul 30, 2026
1 check passed
@olehsvyrydov
olehsvyrydov deleted the feat/plugin-marketplace branch July 30, 2026 19:03
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.

2 participants