feat: add plugin marketplace and skills install#1
Conversation
* 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>
📝 WalkthroughWalkthroughThe 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. ChangesClaude Code Plugin Setup and Validation
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
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
📒 Files selected for processing (6)
.claude-plugin/marketplace.json.claude-plugin/plugin.json.github/workflows/skill-validate.ymlREADME.mdpyproject.tomltests/test_skill_metadata.py
* 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>
There was a problem hiding this comment.
♻️ Duplicate comments (1)
.github/workflows/skill-validate.yml (1)
65-77:⚠️ Potential issue | 🟠 Major | ⚡ Quick winMake 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
📒 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>
Summary
npx skills addCLI — instead of the manual copy-into-~/.claude/skills/workflow the README previously documented.skill-validate.ymlworkflow so future edits toSKILL.md,marketplace.json, orplugin.jsoncan't silently break installation.What changed
.claude-plugin/marketplace.json+.claude-plugin/plugin.jsonat the repo root. Plugin source is"./"so the whole repo is the plugin and the existingskills/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.json↔pyproject.tomlversion sync, skill-dir/name match..github/workflows/skill-validate.yml: three jobs —metadata-tests(pytest),skill-install-smoke(npx skills add ./ --agent codexinto an isolated$HOME, verify SKILL.md lands at~/.codex/skills/unsloppify/SKILL.md), andclaude-plugin-validate(npx @anthropic-ai/claude-code plugin validate .,continue-on-erroruntil the npm package name is confirmed)./plugin marketplace add petems/unsloppifyandnpx skills add petems/unsloppify..claude-plugin/added to the sdist include list inpyproject.toml.Why codex for the smoke test
Claude Code users will install via the plugin marketplace path (covered by
claude-plugin-validate). Targetingcodexwithnpx skills addbroadens 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 locallypytest) — 40 passed locallymypy src tests/test_skill_metadata.pycleanruff check tests/test_skill_metadata.pycleanskill-validate.yml / metadata-testsgreen on PRskill-validate.yml / skill-install-smokegreen — confirms the codex install path lands at~/.codex/skills/unsloppify/SKILL.md(if the path differs the assertion will fail loudly and we adjust)skill-validate.yml / claude-plugin-validate(informational,continue-on-error)ci.ymlstill green/plugin marketplace add petems/unsloppifyfollowed by/plugin install unsloppify@unsloppifysucceeds and/unsloppify:unsloppifyis invocable🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Documentation
Tests
Chores