router-for-me/CLIProxyAPI · error
unsupported schema-version %d
Error message
unsupported schema-version %d
What it means
For manifests whose install type resolves to "direct", Validate() checks the optional schema-version field: it must be either 0 (unset) or SchemaVersionV2 (2). Any other integer means the manifest was written for a schema this build does not understand, so it is rejected before any install plan is processed.
Source
Thrown at internal/pluginstore/manifest.go:113
installType := strings.ToLower(strings.TrimSpace(m.Install.Type))
if installType == "" {
return InstallTypeGitHubRelease
}
return installType
}
func (m Manifest) Validate() error {
version := strings.TrimSpace(m.Version)
if version == "" {
return fmt.Errorf("missing required field version")
}
if !validPluginVersion(normalizeVersion(version)) {
return fmt.Errorf("invalid plugin version %q", m.Version)
}
switch m.InstallType() {
case InstallTypeDirect:
if m.SchemaVersion != 0 && m.SchemaVersion != SchemaVersionV2 {
return fmt.Errorf("unsupported schema-version %d", m.SchemaVersion)
}
if errID := validateManifestPluginID(m.ID); errID != nil {
return errID
}
plan := NormalizeInstallPlan(m.Install)
plan.Type = InstallTypeDirect
if len(plan.Artifacts) > 0 {
if errValidate := ValidateInstallPlan(plan); errValidate != nil {
return errValidate
}
return validatePinnedArtifactURLs(plan.Artifacts)
}
return validateManifestSourceURL(m.SourceURL)
case InstallTypeGitHubRelease:
releaseTag := strings.TrimSpace(m.ReleaseTag)
if releaseTag == "" {
return fmt.Errorf("missing required field release-tag")
}View on GitHub (pinned to 78f0c4079e)
Solutions
- Set schema-version: 2 in the manifest, or delete the field entirely (0/unset is accepted)
- Check the constant pluginstore.SchemaVersionV2 in the version of the code you run and align the manifest
- If you truly need an older schema, use a pluginstore build that supports it instead of editing this check
Example fix
// before
m := pluginstore.Manifest{Version: "1.0.0", SchemaVersion: 1}
err := m.Validate() // unsupported schema-version 1
// after
m := pluginstore.Manifest{Version: "1.0.0", SchemaVersion: 2}
err := m.Validate() // nil Defensive patterns
Strategy: validation
Validate before calling
if m.InstallType() == pluginstore.InstallTypeDirect {
if m.SchemaVersion != 0 && m.SchemaVersion != pluginstore.SchemaVersionV2 {
return fmt.Errorf("manifest schema-version %d unsupported; use 2 or omit", m.SchemaVersion)
}
}
_ = m.Validate() Type guard
func schemaVersionOK(sv int32) bool { return sv == 0 || sv == pluginstore.SchemaVersionV2 } Try / catch
if err := m.Validate(); err != nil && strings.Contains(err.Error(), "unsupported schema-version") { m.SchemaVersion = pluginstore.SchemaVersionV2; err = m.Validate() } Prevention
- Pin the pluginstore version your manifests target
- Default new manifests to schema-version: 2
- Add a schema-version enum check to manifest linting
When it happens
Trigger: Manifest with SchemaVersion set to 1 or 3 (or any non-zero, non-2 value) while install.type is "direct" (or empty, which defaults to direct); typically after hand-porting a manifest from an older/newer pluginstore format.
Common situations: Registry schema migration where manifests carry schema-version: 1 from an earlier format; typos like schema-version: 22; tools generating manifests against a different pluginstore major version.
Related errors
- unsupported install type %q
- missing required field version
- invalid plugin version %q
- missing required field release-tag
- missing required field id
AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15).
Data as JSON: /api/errors/39b04eb18d7a9b9f.
Report an issue: GitHub.