The Claude Code plugin validator rejects the "agents" field entirely. Remove it from the manifest, schema, and tests. Update schema notes to document this as a known constraint alongside the hooks field. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.4 KiB
Plugin Manifest Schema Notes
This document captures undocumented but enforced constraints of the Claude Code plugin manifest validator.
These rules are based on real installation failures, validator behavior, and comparison with known working plugins. They exist to prevent silent breakage and repeated regressions.
If you edit .claude-plugin/plugin.json, read this first.
Summary (Read This First)
The Claude plugin manifest validator is strict and opinionated. It enforces rules that are not fully documented in public schema references.
The most common failure mode is:
The manifest looks reasonable, but the validator rejects it with vague errors like
agents: Invalid input
This document explains why.
Required Fields
version (MANDATORY)
The version field is required by the validator even if omitted from some examples.
If missing, installation may fail during marketplace install or CLI validation.
Example:
{
"version": "1.1.0"
}
Field Shape Rules
The following fields must always be arrays:
commandsskillshooks(if present)
Even if there is only one entry, strings are not accepted.
This applies consistently across all component path fields.
The agents Field: DO NOT ADD
WARNING: CRITICAL: Do NOT add an
"agents"field toplugin.json. The Claude Code plugin validator rejects it entirely.
Why This Matters
The agents field is not part of the Claude Code plugin manifest schema. Any form of it -- string path, array of paths, or array of directories -- causes a validation error:
agents: Invalid input
Agent .md files under agents/ are discovered automatically by convention (similar to hooks). They do not need to be declared in the manifest.
History
Previously this repo listed agents explicitly in plugin.json as an array of file paths. This passed the repo's own schema but failed Claude Code's actual validator, which does not recognize the field. Removed in #1459.
Path Resolution Rules
Commands and Skills
commandsandskillsaccept directory paths only when wrapped in arrays- Explicit file paths are safest and most future-proof
Validator Behavior Notes
claude plugin validateis stricter than some marketplace previews- Validation may pass locally but fail during install if paths are ambiguous
- Errors are often generic (
Invalid input) and do not indicate root cause - Cross-platform installs (especially Windows) are less forgiving of path assumptions
Assume the validator is hostile and literal.
The hooks Field: DO NOT ADD
WARNING: CRITICAL: Do NOT add a
"hooks"field toplugin.json. This is enforced by a regression test.
Why This Matters
Claude Code v2.1+ automatically loads hooks/hooks.json from any installed plugin by convention. If you also declare it in plugin.json, you get:
Duplicate hooks file detected: ./hooks/hooks.json resolves to already-loaded file.
The standard hooks/hooks.json is loaded automatically, so manifest.hooks should
only reference additional hook files.
The Flip-Flop History
This has caused repeated fix/revert cycles in this repo:
| Commit | Action | Trigger |
|---|---|---|
22ad036 |
ADD hooks | Users reported "hooks not loading" |
a7bc5f2 |
REMOVE hooks | Users reported "duplicate hooks error" (#52) |
779085e |
ADD hooks | Users reported "agents not loading" (#88) |
e3a1306 |
REMOVE hooks | Users reported "duplicate hooks error" (#103) |
Root cause: Claude Code CLI changed behavior between versions:
- Pre-v2.1: Required explicit
hooksdeclaration - v2.1+: Auto-loads by convention, errors on duplicate
Current Rule (Enforced by Test)
The test plugin.json does NOT have explicit hooks declaration in tests/hooks/hooks.test.js prevents this from being reintroduced.
If you're adding additional hook files (not hooks/hooks.json), those CAN be declared. But the standard hooks/hooks.json must NOT be declared.
Known Anti-Patterns
These look correct but are rejected:
- String values instead of arrays
- Adding
"agents"in any form - not a recognized manifest field, causesInvalid input - Missing
version - Relying on inferred paths
- Assuming marketplace behavior matches local validation
- Adding
"hooks": "./hooks/hooks.json"- auto-loaded by convention, causes duplicate error
Avoid cleverness. Be explicit.
Minimal Known-Good Example
{
"version": "1.1.0",
"commands": ["./commands/"],
"skills": ["./skills/"]
}
This structure has been validated against the Claude plugin validator.
Important: Notice there is NO "hooks" field and NO "agents" field. Both are loaded automatically by convention. Adding either explicitly causes errors.
Recommendation for Contributors
Before submitting changes that touch plugin.json:
- Ensure all component fields are arrays
- Include a
version - Do NOT add
agentsorhooksfields (both are auto-loaded by convention) - Run:
claude plugin validate .claude-plugin/plugin.json
If in doubt, choose verbosity over convenience.
Why This File Exists
This repository is widely forked and used as a reference implementation.
Documenting validator quirks here:
- Prevents repeated issues
- Reduces contributor frustration
- Preserves plugin stability as the ecosystem evolves
If the validator changes, update this document first.