router-for-me/CLIProxyAPI · error

missing required field release-tag

Error message

missing required field release-tag

What it means

When a manifest's install type is "github-release", Validate() requires a non-empty, non-whitespace release-tag field. The tag is what the installer uses to locate the GitHub release, so a missing tag aborts validation before the plugin is even constructed.

Source

Thrown at internal/pluginstore/manifest.go:130

		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")
		}
		plugin := m.Plugin()
		plugin.Install = InstallPlan{Type: InstallTypeGitHubRelease}
		if errValidate := ValidatePlugin(plugin); errValidate != nil {
			return errValidate
		}
		releaseVersion, errVersion := ReleaseVersion(Release{TagName: releaseTag})
		if errVersion != nil {
			return errVersion
		}
		if releaseVersion != normalizeVersion(version) {
			return fmt.Errorf("release-tag %q resolves version %q, want %q", releaseTag, releaseVersion, normalizeVersion(version))
		}
		return nil
	default:
		return fmt.Errorf("unsupported install type %q", m.Install.Type)
	}
}

View on GitHub (pinned to 78f0c4079e)

Solutions

  1. Add release-tag: v1.2.3 (the actual GitHub release tag) to the manifest's top level
  2. Verify the YAML/JSON key is exactly release-tag and correctly nested/unmarshaled into Manifest.ReleaseTag
  3. Ensure the tag also resolves to the same version as the version field, or error 683 follows

Example fix

# before
install:
  type: github-release
version: 1.2.3
# release-tag missing -> missing required field release-tag

# after
install:
  type: github-release
release-tag: v1.2.3
version: 1.2.3
Defensive patterns

Strategy: validation

Validate before calling

if m.InstallType() == pluginstore.InstallTypeGitHubRelease && strings.TrimSpace(m.ReleaseTag) == "" {
    return errors.New("github-release manifest needs release-tag")
}
_ = m.Validate()

Type guard

func hasReleaseTag(m pluginstore.Manifest) bool { return strings.TrimSpace(m.ReleaseTag) != "" }

Try / catch

if err := m.Validate(); err != nil && strings.Contains(err.Error(), "missing required field release-tag") { /* set release-tag from git describe --tags, re-validate */ }

Prevention

When it happens

Trigger: Manifest with install.type: github-release but release-tag omitted, empty, or containing only spaces/whitespace.

Common situations: Converting a direct-install manifest to github-release and forgetting the tag; YAML indentation puts release-tag under the wrong key so it never unmarshals; CI templating leaves release-tag empty until the release job runs.

Related errors


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