Every plugins/*/plugin.json had "author": "Rootiest" as a bare string, but Claude Code's plugin/marketplace schemas require an object ({"name": "..."}). This broke every plugin install with author: Invalid input: expected object, received string — reproduced installing mirror-it to user scope.
.claude-plugin/marketplace.json entries only carried name/source, dropping each plugin's description/author even though they exist on the plugin's own metadata — so the Discover UI showed a blank "Plugin details" pane before install.
Added a validate_author() check to scripts/generate_plugins.py's --check gate so a future plugin can't reintroduce a string-typed author.
python3 scripts/generate_plugins.py regenerated dist/claude-code/** and .claude-plugin/marketplace.json; diffed to confirm author is now an object and description/author appear on marketplace entries
All touched JSON files validated with json.load; generate_plugins.py compiles clean
Re-run /plugin install flow in Claude Code against this branch to confirm mirror-it installs without the manifest error and Discover shows its description
## Summary
- Every `plugins/*/plugin.json` had `"author": "Rootiest"` as a bare string, but Claude Code's plugin/marketplace schemas require an object (`{"name": "..."}`). This broke every plugin install with `author: Invalid input: expected object, received string` — reproduced installing `mirror-it` to user scope.
- `.claude-plugin/marketplace.json` entries only carried `name`/`source`, dropping each plugin's `description`/`author` even though they exist on the plugin's own metadata — so the Discover UI showed a blank "Plugin details" pane before install.
- Added a `validate_author()` check to `scripts/generate_plugins.py`'s `--check` gate so a future plugin can't reintroduce a string-typed `author`.
## Test plan
- [x] `python3 scripts/generate_plugins.py --check` passes (14 plugins, 2 targets)
- [x] `python3 scripts/generate_plugins.py` regenerated `dist/claude-code/**` and `.claude-plugin/marketplace.json`; diffed to confirm `author` is now an object and `description`/`author` appear on marketplace entries
- [x] All touched JSON files validated with `json.load`; `generate_plugins.py` compiles clean
- [x] Re-run `/plugin` install flow in Claude Code against this branch to confirm `mirror-it` installs without the manifest error and Discover shows its description
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Claude Code's plugin/marketplace schemas require author to be an object
({"name": ...}), not a bare string — installing any plugin from this
marketplace failed validation ("author: Invalid input: expected object,
received string"). Convert every plugins/*/plugin.json author field
accordingly, and add a build-time check so this can't regress.
Also propagate each plugin's description/author into the generated
marketplace.json entries (not just its own nested plugin.json), matching
Anthropic's official marketplace shape, so the Discover UI shows a
description before install instead of a blank "Plugin details" pane.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
plugins/*/plugin.jsonhad"author": "Rootiest"as a bare string, but Claude Code's plugin/marketplace schemas require an object ({"name": "..."}). This broke every plugin install withauthor: Invalid input: expected object, received string— reproduced installingmirror-itto user scope..claude-plugin/marketplace.jsonentries only carriedname/source, dropping each plugin'sdescription/authoreven though they exist on the plugin's own metadata — so the Discover UI showed a blank "Plugin details" pane before install.validate_author()check toscripts/generate_plugins.py's--checkgate so a future plugin can't reintroduce a string-typedauthor.Test plan
python3 scripts/generate_plugins.py --checkpasses (14 plugins, 2 targets)python3 scripts/generate_plugins.pyregenerateddist/claude-code/**and.claude-plugin/marketplace.json; diffed to confirmauthoris now an object anddescription/authorappear on marketplace entriesjson.load;generate_plugins.pycompiles clean/plugininstall flow in Claude Code against this branch to confirmmirror-itinstalls without the manifest error and Discover shows its description🤖 Generated with Claude Code
Claude Code's plugin/marketplace schemas require author to be an object ({"name": ...}), not a bare string — installing any plugin from this marketplace failed validation ("author: Invalid input: expected object, received string"). Convert every plugins/*/plugin.json author field accordingly, and add a build-time check so this can't regress. Also propagate each plugin's description/author into the generated marketplace.json entries (not just its own nested plugin.json), matching Anthropic's official marketplace shape, so the Discover UI shows a description before install instead of a blank "Plugin details" pane.