Skip to content

Plugin fails to load on Claude Code: invalid skills field in plugin.json #51

@fessygaspard-cpu

Description

@fessygaspard-cpu

Summary

The plugin can be installed via the Claude Code marketplace but fails to load with a manifest validation error. All 8 slash commands are unreachable until the manifest is patched.

Repro

claude plugin marketplace add nicobailon/visual-explainer
claude plugin install visual-explainer@visual-explainer-marketplace
claude plugin list

Output:

❯ visual-explainer@visual-explainer-marketplace
  Version: 0.7.1
  Scope: user
  Status: ✘ failed to load
  Error: Path escapes plugin directory: ./ (skills)

Cause

.claude-plugin/plugin.json line 10:

"skills": ["./"]

Two distinct issues:

  1. The Claude Code plugin schema for skills expects a string path to a directory that contains skill subdirectories — not an array. Working plugins in the wild (e.g. likeahuman-workshop/guided-build) use "skills": "./skills/".
  2. Narrowing the value to ["."] returns a different error: skills: Invalid input. That confirms the type mismatch, not just a path-normalisation quirk.

Local workaround (so the issue isn't a hard blocker)

Removing the "skills" field entirely lets the plugin load and exposes all 8 slash commands. The SKILL.md auto-trigger behaviour is lost — commands must be invoked explicitly.

Proposed fix

Option A — drop "skills" if Claude Code parity for the auto-trigger isn't a priority. Commands remain the headline surface and they live at commands/ already. Minimal diff:

   "license": "MIT",
-  "skills": ["./"]
+  "license": "MIT"
 }

Option B — preserve auto-trigger by restructuring the plugin layout to Claude Code's convention while keeping Pi/Codex installs working:

.claude-plugin/plugin.json     # "skills": "./skills/"
commands/                      # unchanged, plugin-level slash commands
skills/
  visual-explainer/
    SKILL.md                   # moved from root
    references/                # moved from root
    scripts/                   # moved from root
    templates/                 # moved from root

The Pi and Codex install scripts in the README copy plugins/visual-explainer (i.e. the whole plugin dir) into their respective skill dirs, so this restructure is compatible with those targets — they just end up with skills/visual-explainer/SKILL.md nested one level deeper, which both runtimes already handle.

Environment

  • Claude Code latest (claude CLI from claude --version)
  • visual-explainer 0.7.1
  • macOS 15 (Darwin 25.4)

Happy to send a PR for Option A or B if useful.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions