{"record":{"id":"28a6a725bc591869","repo":"router-for-me/CLIProxyAPI","slug":"missing-required-field-release-tag","errorCode":null,"errorMessage":"missing required field release-tag","messagePattern":"missing required field release-tag","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/pluginstore/manifest.go","lineNumber":130,"sourceCode":"\t\tif m.SchemaVersion != 0 && m.SchemaVersion != SchemaVersionV2 {\n\t\t\treturn fmt.Errorf(\"unsupported schema-version %d\", m.SchemaVersion)\n\t\t}\n\t\tif errID := validateManifestPluginID(m.ID); errID != nil {\n\t\t\treturn errID\n\t\t}\n\t\tplan := NormalizeInstallPlan(m.Install)\n\t\tplan.Type = InstallTypeDirect\n\t\tif len(plan.Artifacts) > 0 {\n\t\t\tif errValidate := ValidateInstallPlan(plan); errValidate != nil {\n\t\t\t\treturn errValidate\n\t\t\t}\n\t\t\treturn validatePinnedArtifactURLs(plan.Artifacts)\n\t\t}\n\t\treturn validateManifestSourceURL(m.SourceURL)\n\tcase InstallTypeGitHubRelease:\n\t\treleaseTag := strings.TrimSpace(m.ReleaseTag)\n\t\tif releaseTag == \"\" {\n\t\t\treturn fmt.Errorf(\"missing required field release-tag\")\n\t\t}\n\t\tplugin := m.Plugin()\n\t\tplugin.Install = InstallPlan{Type: InstallTypeGitHubRelease}\n\t\tif errValidate := ValidatePlugin(plugin); errValidate != nil {\n\t\t\treturn errValidate\n\t\t}\n\t\treleaseVersion, errVersion := ReleaseVersion(Release{TagName: releaseTag})\n\t\tif errVersion != nil {\n\t\t\treturn errVersion\n\t\t}\n\t\tif releaseVersion != normalizeVersion(version) {\n\t\t\treturn fmt.Errorf(\"release-tag %q resolves version %q, want %q\", releaseTag, releaseVersion, normalizeVersion(version))\n\t\t}\n\t\treturn nil\n\tdefault:\n\t\treturn fmt.Errorf(\"unsupported install type %q\", m.Install.Type)\n\t}\n}","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/router-for-me/CLIProxyAPI/blob/78f0c4079e3e6273d65d03b5549cffc898703264/internal/pluginstore/manifest.go#L112-L148","documentation":"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.","triggerScenarios":"Manifest with install.type: github-release but release-tag omitted, empty, or containing only spaces/whitespace.","commonSituations":"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.","solutions":["Add release-tag: v1.2.3 (the actual GitHub release tag) to the manifest's top level","Verify the YAML/JSON key is exactly release-tag and correctly nested/unmarshaled into Manifest.ReleaseTag","Ensure the tag also resolves to the same version as the version field, or error 683 follows"],"exampleFix":"# before\ninstall:\n  type: github-release\nversion: 1.2.3\n# release-tag missing -> missing required field release-tag\n\n# after\ninstall:\n  type: github-release\nrelease-tag: v1.2.3\nversion: 1.2.3","handlingStrategy":"validation","validationCode":"if m.InstallType() == pluginstore.InstallTypeGitHubRelease && strings.TrimSpace(m.ReleaseTag) == \"\" {\n    return errors.New(\"github-release manifest needs release-tag\")\n}\n_ = m.Validate()","typeGuard":"func hasReleaseTag(m pluginstore.Manifest) bool { return strings.TrimSpace(m.ReleaseTag) != \"\" }","tryCatchPattern":"if err := m.Validate(); err != nil && strings.Contains(err.Error(), \"missing required field release-tag\") { /* set release-tag from git describe --tags, re-validate */ }","preventionTips":["Generate release-tag and version together in the release job","Assert required fields per install type in a manifest pre-flight helper"],"tags":["pluginstore","manifest","github-release","validation"],"backgroundTag":null,"analyzedSha":"78f0c4079e3e6273d65d03b5549cffc898703264","analyzedAt":"2026-08-15T12:26:37.444Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}