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:
Two distinct issues:
- 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/".
- 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.
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
Output:
Cause
.claude-plugin/plugin.jsonline 10:Two distinct issues:
skillsexpects 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/".["."]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. TheSKILL.mdauto-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 atcommands/already. Minimal diff:Option B — preserve auto-trigger by restructuring the plugin layout to Claude Code's convention while keeping Pi/Codex installs working:
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 withskills/visual-explainer/SKILL.mdnested one level deeper, which both runtimes already handle.Environment
claude --version)Happy to send a PR for Option A or B if useful.