Skip to content

bug: all 9 plugins declare skills: ["./SKILL.md"] (a file); must be a directory — marketplace fails validate #87

Description

@Kita-Toda

Every plugin in the marketplace declares "skills": ["./SKILL.md"], pointing at a file. Claude Code expects skills entries to be directories containing a SKILL.md. claude plugin validate fails on all nine plugins and therefore on the marketplace as a whole.

Found while investigating #85, but this is independent of it — #85 affects only requesthunt, this affects all nine.

Reproduce

claude plugin validate <marketplace-root>

Actual

✘ plugins[0] plugin.json → skills[0]: Path is a file; skills entries must be
  directories containing SKILL.md: ./SKILL.md
✘ plugins[1] … through plugins[8] — same error
✘ Validation failed

Per-plugin, e.g. claude plugin validate skills/domain-hunter:

✘ Found 1 error:
  ❯ skills[0]: Path is a file; skills entries must be directories containing SKILL.md: ./SKILL.md

Affected

All nine: requesthunt, domain-hunter, logo-creator, banner-creator, nanobanana, reddit, twitter, producthunt, seo-geo.

Comparison with other marketplaces

Every other marketplace I have installed points skills at a directory:

marketplace skills entry type
pbakaus/impeccable ./skills/, ./.claude/skills/ dir
forrestchang/andrej-karpathy-skills ./skills/karpathy-guidelines dir
paper-design/agent-plugins ./skills dir
ReScienceLab/opc-skills ./SKILL.md file

Verified fix

Each plugin root already is a directory containing SKILL.md, so pointing the entry at the directory is a one-token change. I tested both candidates against domain-hunter:

"skills": ["./"]   // ✔ Validation passed
// key omitted entirely — ✔ Validation passed

"skills": ["./"] keeps the declaration explicit and validates cleanly; dropping the key also validates, presumably relying on auto-discovery. Either resolves it across all nine.

Runtime impact — CONFIRMED BLOCKING

Update: confirmed via claude plugin details, no restart needed. All five plugins I installed load zero skills.

$ claude plugin details logo-creator@opc-skills
Component inventory
  Skills (0)

Identical Skills (0) for banner-creator, domain-hunter, seo-geo, and requesthunt.

Control — plugins from marketplaces that declare skills as a directory report their skills normally:

$ claude plugin details andrej-karpathy-skills@karpathy-skills
  Skills (1)  karpathy-guidelines
$ claude plugin details paper-desktop@paper
  Skills (2)  code-to-design, design-to-code

And patching a single installed manifest flips it, which confirms the cause and the fix in one step:

$ claude plugin details domain-hunter@opc-skills        # as shipped
  Skills (0)
# edit cached plugin.json: "skills": ["./SKILL.md"] -> ["./"]
$ claude plugin details domain-hunter@opc-skills        # patched
  Skills (1)  domain-hunter

So this is not cosmetic: every skill in the marketplace installs successfully and then silently exposes nothing. Users get a plugin that appears installed but does nothing, with no error surfaced (claude plugin list is quiet about it — the only listed error was the unrelated #85 one). Changing "./SKILL.md" to "./" in all nine plugin.json files fixes it.

Environment

  • marketplace at commit db8eff6
  • macOS 15 (Darwin 24.6.0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions