Reviewed: 2026-03-02 Reviewer: GPT-5.2 Pro (via Oracle) + Claude Opus 4.6 Scope: Full project review against Claude Code's plugin system for cross-harness viability
- Same core components (skills, commands, agents, rules, hooks, MCP, LSP)
- Same namespacing (
plugin-name:component-name) - Same scopes (user/project/local/managed)
- Same hook action types (command/prompt/agent)
- Same plugin root placeholder concept
- Plugin-level
settings.json— Claude Code supports asettings.jsonwith anagentkey. Open Plugin doesn't spec this at all. Add a settings component spec. outputStylesis a ghost — referenced in manifest schema but has no component spec. Cut it or spec it.- Marketplace registry semantics — Claude Code has submission pipeline; Open Plugin only has the interchange file format.
- Vendor-neutral
.plugin/vs reality — the installer still has to generate.claude-plugin/and translate${PLUGIN_ROOT}→${CLAUDE_PLUGIN_ROOT}. The "universal" layer requires translation glue. - Hooks define more events than Claude Code — extended events (file, shell, MCP lifecycle, UI) that most harnesses won't fire, creating a portability trap.
| Portability | Components |
|---|---|
| High (truly universal) | Plugin directory packaging, namespacing, skills/commands/agents/rules as markdown, marketplace.json index |
| Medium (protocol-dependent) | MCP servers, LSP servers |
| Low (harness-shaped) | Hooks (event existence, payload schema all tool-defined), installation UX, slash command UI |
Recommendation: Market it as "universal packaging + discovery + namespacing" with "optional automation surfaces where supported" — and encode that conditionality in the spec.
- Manifest component path fields — three forms (string/array/object) with no formal JSON schema, no normative resolution algorithm, no merge order rules
- Path safety — rules exist but enforcement details missing (symlinks post-install, absolute paths in configs, deep
${PLUGIN_ROOT}replacement) - Hook payloads are "tool-defined" — need at least a minimal stable JSON payload shape per event
- Name constraints inconsistent — plugin names allow periods, agent names are kebab-case only
- "Spec Version 1.0.0" feels premature — outputStyles unspecced, reference implementations don't cover major spec features
Good: Small, readable, low deps (zod + yaml), clear CLI.
Major gaps vs spec:
- Only looks for
.plugin/plugin.json— doesn't check vendor-prefixed dirs - Ignores manifest component path fields entirely (custom paths, inline configs)
discoverHooks()throws away event names (returns flat array)- README usage bug (
parseManifesttakes dir path but docs show file path) - No tests at all
Good: Valuable product idea, practical marketplace discovery fallback.
Critical issues:
- Command injection —
execSyncwith unsanitized user input (git clone, claude plugin commands). UsespawnSync/execFileSyncwith argument arrays. - Mutates local source directory — writes
.claude-plugin/and rewrites config placeholders in-place. Always stage/copy first. - Naive frontmatter parser — hand-rolled line parser breaks on multi-line YAML, arrays, quoted values with colons. Share the YAML parser from plugin-ref.
- Windows-incompatible —
whichfor detection, unix path assumptions.
- Stable plugin identity format — no canonical
marketplace:plugin-name@versionstring - Integrity/provenance — no checksums, no signing, marketplaces are "run arbitrary code from git"
- Permissions/capabilities declaration — plugins should declare "contains hooks", "starts MCP servers", etc.
- Compatibility metadata — required host capabilities, OS/runtime requirements
- Version resolution rules — what happens when marketplace and manifest versions disagree
- Make spec + reference implementations agree — spec claims features plugin-ref doesn't implement
- Cut or finish
outputStyles— don't ship v1.0 with a dangling surface - Define a capabilities model — host declares
supportedComponents, plugin declaresrequiresComponents - Make hooks minimally portable — define payload schemas or explicitly mark hooks as tool-specific
- Fix installer safety — command injection, source mutation, YAML parsing
Core (portable):
- Plugin directory + manifest
- Skills/commands/agents/rules discovery + namespacing
- Marketplace index format
${PLUGIN_ROOT}standard placeholder- Path safety / traversal rules
Optional modules:
- Hooks (with payload standardization or explicitly tool-defined)
- MCP servers
- LSP servers
- Overfitting to Claude Code — this is "Claude's plugin system, generalized." That's fine, but don't claim hooks are portable until payloads are standardized.
- Security reputation — "random git repo executes scripts" will kill adoption. Need integrity + warnings.
- "1.0.0" vs reality — calling it 1.0.0 while tooling doesn't implement major features creates distrust. Either tighten or downgrade to 0.x.
- Add
settingscomponent spec or explicitly exclude - Remove
outputStylesor write the missing spec - Add normative algorithms for path resolution,
${PLUGIN_ROOT}expansion, conflict resolution - Add host capabilities declaration
- Implement vendor manifest discovery + manifest-driven component discovery
- Preserve hook event names in parsed output
- Add conformance test suite (golden plugins + expected output)
- Replace
execSyncstring commands with argument-array process spawning - Always stage/copy before mutating source dirs
- Use real YAML frontmatter parsing (share with plugin-ref)
- Add
--dry-runand security warnings for hooks/MCP/LSP