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

  1. Set schema-version: 2 in the manifest, or delete the field entirely (0/unset is accepted)
  2. Check the constant pluginstore.SchemaVersionV2 in the version of the code you run and align the manifest
  3. 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

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


AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15). Data as JSON: /api/errors/39b04eb18d7a9b9f. Report an issue: GitHub.