Distribute the framework as a Claude Code plugin - #62
Merged
Conversation
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.
There was a problem hiding this comment.
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.jsonto define theai-dev-teamplugin manifest. - Add
.claude-plugin/marketplace.jsonat the repo root to publish the plugin from./claude. - Fix
verify-landedfrontmatter 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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The framework installs by copying files with
install.sh. Three consequences:~/.claude/skills/— they do read project skills and repo-declared plugins. So a skill in~/.claudeis invisible to any cloud session and to anyone else who clones the repo.~/.claude/skillssymlinks here, so a straygit pullon this repo changes the running agent's capabilities. That happened during this work:maintracked 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. Itsskills/andcommands/are already exactly where a plugin expects them, so no files move:claude/.claude-plugin/plugin.json— the manifest.claude-plugin/marketplace.jsonat the repo root — the catalogue, pointing at./claudeversionis 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:
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 thatverify-landed's YAML frontmatter did not parse. Its description contained an unquotednothing: 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 ./claudereports 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.shis untouched and keeps working; retire it once a project has run on the plugin for a week.