Skip to content

feat: add plugin marketplace and skills install#1

Merged
petems merged 3 commits into
masterfrom
feat/add-plugin-marketplace-skills-install
May 15, 2026
Merged

feat: add plugin marketplace and skills install#1
petems merged 3 commits into
masterfrom
feat/add-plugin-marketplace-skills-install

Conversation

@petems
Copy link
Copy Markdown
Owner

@petems petems commented May 15, 2026

Summary

  • Makes the skill installable through the two ecosystem-standard mechanisms — Claude Code plugin marketplace and the npx skills add CLI — instead of the manual copy-into-~/.claude/skills/ workflow the README previously documented.
  • Locks the install contract in with pytest schema/frontmatter tests and a dedicated skill-validate.yml workflow so future edits to SKILL.md, marketplace.json, or plugin.json can't silently break installation.

What changed

  • .claude-plugin/marketplace.json + .claude-plugin/plugin.json at the repo root. Plugin source is "./" so the whole repo is the plugin and the existing skills/unsloppify/ is auto-discovered.
  • tests/test_skill_metadata.py (8 tests): SKILL.md frontmatter parse + allowed-keys check (name, description, license, allowed-tools, metadata — anything else makes the Claude app reject the skill), marketplace and plugin schema, name cross-check, plugin.jsonpyproject.toml version sync, skill-dir/name match.
  • .github/workflows/skill-validate.yml: three jobs — metadata-tests (pytest), skill-install-smoke (npx skills add ./ --agent codex into an isolated $HOME, verify SKILL.md lands at ~/.codex/skills/unsloppify/SKILL.md), and claude-plugin-validate (npx @anthropic-ai/claude-code plugin validate ., continue-on-error until the npm package name is confirmed).
  • README install section now shows both /plugin marketplace add petems/unsloppify and npx skills add petems/unsloppify.
  • .claude-plugin/ added to the sdist include list in pyproject.toml.

Why codex for the smoke test

Claude Code users will install via the plugin marketplace path (covered by claude-plugin-validate). Targeting codex with npx skills add broadens coverage by proving the skill's frontmatter + layout works with non-Claude agents too.

Test plan

  • pytest tests/test_skill_metadata.py -v — 8 passed locally
  • Full suite (pytest) — 40 passed locally
  • mypy src tests/test_skill_metadata.py clean
  • ruff check tests/test_skill_metadata.py clean
  • Both JSON manifests parse; workflow YAML parses
  • CI: skill-validate.yml / metadata-tests green on PR
  • CI: skill-validate.yml / skill-install-smoke green — confirms the codex install path lands at ~/.codex/skills/unsloppify/SKILL.md (if the path differs the assertion will fail loudly and we adjust)
  • CI: skill-validate.yml / claude-plugin-validate (informational, continue-on-error)
  • CI: existing ci.yml still green
  • Manual: in a real Claude Code session, /plugin marketplace add petems/unsloppify followed by /plugin install unsloppify@unsloppify succeeds and /unsloppify:unsloppify is invocable

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Skill published to the Claude Code marketplace and made installable via the skills CLI.
  • Documentation

    • README updated with distinct marketplace and CLI installation instructions.
  • Tests

    • Added validation tests for skill/plugin metadata, naming, and version consistency.
  • Chores

    • Added CI workflow to validate metadata and installation; included plugin metadata in source distributions.

Review Change Stack

* Add .claude-plugin/marketplace.json and plugin.json so the skill is
  installable via `/plugin marketplace add petems/unsloppify` and
  `/plugin install unsloppify@unsloppify`
* Surface `npx skills add petems/unsloppify` as a second install path
  (works with Claude Code, Codex, Cursor) via the existing
  skills/unsloppify/ layout
* Add tests/test_skill_metadata.py validating SKILL.md frontmatter
  (allowed-keys set, required name + description), marketplace + plugin
  manifest schema, name cross-check, and plugin.json/pyproject.toml
  version sync
* Add .github/workflows/skill-validate.yml with three jobs: pytest
  metadata tests, npx skills add codex-target smoke install, and the
  canonical `claude plugin validate` (continue-on-error)
* Update README install section to surface both install paths
* Include .claude-plugin/ in the sdist build

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 15, 2026

📝 Walkthrough

Walkthrough

The PR adds Claude Code plugin manifests and a marketplace entry for "unsloppify", introduces pytest metadata validation for SKILL.md and plugin manifests with cross-file checks (name and version sync, directory matching), adds a GitHub Actions workflow to run tests, smoke-install, and plugin validation, and updates README and sdist packaging to include plugin artifacts.

Changes

Claude Code Plugin Setup and Validation

Layer / File(s) Summary
Plugin manifest files
.claude-plugin/marketplace.json, .claude-plugin/plugin.json
Marketplace and plugin manifests define "unsloppify" plugin identity, version, author contact details, project URLs, license (MIT), keywords, and local source ./.
Metadata validation tests
tests/test_skill_metadata.py
Test suite validates SKILL.md frontmatter structure (required name in kebab-case and description), enforces allowed frontmatter keys, validates .claude-plugin/marketplace.json fields (name, owner.name, non-empty plugins with local source), validates .claude-plugin/plugin.json fields (name, description, version matching semver-like regex), and enforces cross-file consistency: plugin listed in marketplace, plugin version equals pyproject.toml project.version, skill directory name equals frontmatter name, and runtime Python >= 3.11.
CI validation workflow
.github/workflows/skill-validate.yml
Workflow runs on push to master and all pull requests with three jobs: metadata-tests (Python 3.13 via uv, uv sync --extra dev, pytest tests/test_skill_metadata.py -v), skill-install-smoke (isolated FAKE_HOME, npx --yes skills add ./ --global --agent codex --skill '*' --yes, verifies installed SKILL.md and skill listed), and claude-plugin-validate (runs npx --yes @anthropic-ai/claude-code plugin validate . under Node 22).
Documentation and packaging
README.md, pyproject.toml
README installation section expanded to show two explicit install paths (plugin marketplace command and skills CLI agent command); pyproject.toml sdist include list now contains .claude-plugin/.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 A tiny rabbit taps the keys,
Manifests tucked beneath the trees,
Tests hop in a tidy line,
Actions hum, the checks align,
Packaging hugs the plugin—fine! 🎉

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'feat: add plugin marketplace and skills install' directly and clearly summarizes the main changes: introducing plugin marketplace integration and enabling skills installation support.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/add-plugin-marketplace-skills-install

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/skill-validate.yml:
- Around line 64-77: Remove the permissive CI flag so validator failures fail
the job: delete or set continue-on-error to false for the job that runs the
Claude Code plugin validator (the job containing the "Run the Claude Code plugin
validator" step which runs `npx --yes `@anthropic-ai/claude-code` plugin validate
.`), ensuring the workflow's continue-on-error: true entry is removed/disabled
so manifest/validator regressions block merges.

In `@tests/test_skill_metadata.py`:
- Around line 105-109: The test currently only checks that "source" exists and
conditionally validates its string form; change it to require that
plugins[].source is a string unconditionally by asserting
isinstance(entry["source"], str) (e.g., in tests/test_skill_metadata.py where
entry is used) and then keep the startswith("./") assertion for local paths —
this ensures non-string sources fail fast before calling
entry["source"].startswith.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 4d17786d-cd52-4c36-be9d-5ad8e4f0d93c

📥 Commits

Reviewing files that changed from the base of the PR and between 409f717 and 15c48e9.

📒 Files selected for processing (6)
  • .claude-plugin/marketplace.json
  • .claude-plugin/plugin.json
  • .github/workflows/skill-validate.yml
  • README.md
  • pyproject.toml
  • tests/test_skill_metadata.py

Comment thread .github/workflows/skill-validate.yml Outdated
Comment thread tests/test_skill_metadata.py Outdated
* Replace --all with --global --skill '*' so --agent codex is honored
* Verify ~/.agents/skills/unsloppify/SKILL.md (codex is a universal agent)
* Use skills list --global to surface globally-installed skill

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
.github/workflows/skill-validate.yml (1)

65-77: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Make the canonical plugin validator blocking.

Line 65 (continue-on-error: true) allows validator regressions to merge silently, and the explanatory note on Lines 75-77 bakes that behavior in.

Suggested fix
   claude-plugin-validate:
     name: claude plugin validate (canonical validator)
     runs-on: ubuntu-latest
-    continue-on-error: true
     steps:
       - uses: actions/checkout@v6
       - uses: actions/setup-node@v5
         with:
           node-version: "22"
       - name: Run the Claude Code plugin validator
         run: |
           set -euxo pipefail
           # Validates marketplace.json, plugin.json, and skill frontmatter using
-          # the canonical CLI. Job is marked continue-on-error in case the npm
-          # package name shifts; the metadata-tests job is the load-bearing
-          # check.
+          # the canonical CLI.
           npx --yes `@anthropic-ai/claude-code` plugin validate .
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/skill-validate.yml around lines 65 - 77, The workflow
currently silences failures by setting continue-on-error: true for the "Run the
Claude Code plugin validator" job; change that so the canonical plugin validator
is blocking by removing or setting continue-on-error to false for that job (the
step named "Run the Claude Code plugin validator") and ensure the explanatory
comment about marking the job non-blocking is updated/removed so regressions
will fail the workflow.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In @.github/workflows/skill-validate.yml:
- Around line 65-77: The workflow currently silences failures by setting
continue-on-error: true for the "Run the Claude Code plugin validator" job;
change that so the canonical plugin validator is blocking by removing or setting
continue-on-error to false for that job (the step named "Run the Claude Code
plugin validator") and ensure the explanatory comment about marking the job
non-blocking is updated/removed so regressions will fail the workflow.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 190081b8-10a2-4e2e-ab67-edd63ea5067d

📥 Commits

Reviewing files that changed from the base of the PR and between 15c48e9 and 1e4cb2a.

📒 Files selected for processing (1)
  • .github/workflows/skill-validate.yml

* skill-validate.yml: drop continue-on-error on canonical validator
  so manifest regressions fail the job instead of silently passing
* test_skill_metadata.py: require plugins[].source to be a non-empty
  string before checking the ./ prefix

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@petems petems merged commit ac6cc2f into master May 15, 2026
8 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.

1 participant