Skip to content

fix: install errors for code-formatter, git-workflow, sliplane - #6

Merged
etopro merged 1 commit into
mainfrom
fix/install-paths-foreign-plugins
May 2, 2026
Merged

etopro merged 1 commit into
mainfrom
fix/install-paths-foreign-plugins

Conversation

@axisrow

@axisrow axisrow commented Apr 30, 2026

Copy link
Copy Markdown
Collaborator

Summary

Three local plugins in this marketplace fail to install with Claude Code 2.1.x. This PR applies the same two-part fix that landed for claude-tools in #5 / commit f5a246e to the remaining three.

Without these changes, /plugin install <name>@etopro-plugins fails for code-formatter, git-workflow, and sliplane. Verified by reproducing the failure and confirming the fix in an isolated \$HOME.

Issue 1 — marketplace.json source paths don't resolve

Claude Code 2.1.123 does not prepend metadata.pluginRoot to source paths that already start with ./. With pluginRoot: "./plugins" and "source": "./code-formatter", the installer looks for <marketplace>/code-formatter instead of <marketplace>/plugins/code-formatter and aborts:

Failed to install: Source path does not exist:
.../etopro-plugins/code-formatter

Switching to the explicit full path ./plugins/<name> works regardless of pluginRoot and matches the convention used by every other observable marketplace (claude-code-plugins, openai-codex, axisrow-plugins). pluginRoot itself is left in place — it is harmless and not the root cause.

Issue 2 — plugin.json schema rejects relative paths without ./

claude plugin validate rejects commands / skills arrays whose entries lack a ./ prefix:

✘ Found 1 error:
  ❯ commands: Invalid input

The plugins reference uses the ./ form. Adding the prefix lets the manifest pass validation.

While editing plugins/sliplane/.claude-plugin/plugin.json, I also dropped its category field — claude plugin validate warns that the field belongs in marketplace.json and is ignored in plugin.json.

Files changed

  • .claude-plugin/marketplace.json — three source paths (one per plugin).
  • plugins/code-formatter/.claude-plugin/plugin.json — ./ prefix on commands entries.
  • plugins/git-workflow/.claude-plugin/plugin.json — ./ prefix on skills entry.
  • plugins/sliplane/.claude-plugin/plugin.json — ./ prefix on skills entry, drop category.

URL-source plugins (dokku-manage, skill-email-otp, yandex-direct, cycle-review) are not affected by either issue and are not touched.

Test plan

  • claude plugin validate plugins/<name> passes for all three plugins.
  • claude plugin validate . (marketplace) passes.
  • In a clean \$HOME, claude plugin marketplace add <repo> then claude plugin install <name>@etopro-plugins succeeds for all three; entries appear in installed_plugins.json.
  • CI validate.yml green on this PR.

🤖 Generated with Claude Code

The same two issues that affected claude-tools (commit f5a246e) also
affect the three remaining local plugins. Verified empirically with
`claude plugin install` in an isolated $HOME — without these fixes,
all three fail to install on Claude Code 2.1.x.

Issue 1 — marketplace.json source paths

Claude Code 2.1.123 does not prepend `metadata.pluginRoot` to source
paths that already start with `./`. With `pluginRoot: "./plugins"`
and `"source": "./code-formatter"`, the installer looks for
`<marketplace>/code-formatter` instead of `<marketplace>/plugins/code-formatter`
and aborts with "Source path does not exist". Switching to the
explicit full path `./plugins/<name>` works regardless of pluginRoot
and matches the convention used by claude-code-plugins, openai-codex,
and axisrow-plugins. `pluginRoot` itself is left in place — it is
harmless and not the root cause.

Issue 2 — plugin.json schema

`claude plugin validate` rejects `commands`/`skills` arrays whose
entries lack a `./` prefix with "commands: Invalid input" /
"skills: Invalid input". The reference docs use the `./` form:
https://code.claude.com/docs/en/plugins-reference

Also drop `category` from `plugins/sliplane/.claude-plugin/plugin.json`
— validate warns that this field belongs in marketplace.json and is
ignored in plugin.json.

Verification

For each of code-formatter, git-workflow, sliplane:
- `claude plugin validate <plugin>` → Validation passed
- `claude plugin install <plugin>@etopro-plugins` in clean $HOME →
  Successfully installed

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
@etopro
etopro merged commit a63c28e into main May 2, 2026
1 check 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.

2 participants