{"record":{"id":"dea503d77574cac9","repo":"router-for-me/CLIProxyAPI","slug":"release-asset-checksums-txt-not-found","errorCode":null,"errorMessage":"release asset checksums.txt not found","messagePattern":"release asset checksums\\.txt not found","errorType":"http","errorClass":null,"httpStatus":502,"severity":"error","filePath":"internal/pluginstore/github.go","lineNumber":322,"sourceCode":"}\n\nfunc SelectReleaseAssets(release Release, id, version, goos, goarch string) (ReleaseAsset, ReleaseAsset, error) {\n\tarchiveName := ArchiveName(id, version, goos, goarch)\n\tvar archiveAsset ReleaseAsset\n\tvar checksumAsset ReleaseAsset\n\tfor _, asset := range release.Assets {\n\t\tswitch strings.TrimSpace(asset.Name) {\n\t\tcase archiveName:\n\t\t\tarchiveAsset = asset\n\t\tcase \"checksums.txt\":\n\t\t\tchecksumAsset = asset\n\t\t}\n\t}\n\tif strings.TrimSpace(archiveAsset.Name) == \"\" {\n\t\treturn ReleaseAsset{}, ReleaseAsset{}, fmt.Errorf(\"release asset %s not found\", archiveName)\n\t}\n\tif strings.TrimSpace(checksumAsset.Name) == \"\" {\n\t\treturn ReleaseAsset{}, ReleaseAsset{}, fmt.Errorf(\"release asset checksums.txt not found\")\n\t}\n\treturn archiveAsset, checksumAsset, nil\n}\n\nfunc ArchiveName(id, version, goos, goarch string) string {\n\treturn fmt.Sprintf(\n\t\t\"%s_%s_%s_%s.zip\",\n\t\tstrings.TrimSpace(id),\n\t\tstrings.TrimSpace(version),\n\t\tstrings.TrimSpace(goos),\n\t\tstrings.TrimSpace(goarch),\n\t)\n}\n","sourceCodeStart":304,"sourceCodeEnd":336,"githubUrl":"https://github.com/router-for-me/CLIProxyAPI/blob/78f0c4079e3e6273d65d03b5549cffc898703264/internal/pluginstore/github.go#L304-L336","documentation":"The GitHub release contains the platform archive but no asset named exactly 'checksums.txt'. The installer requires a checksums.txt sibling asset to verify the archive before extraction, so its absence aborts the install. This is a release-publishing defect, not a client configuration issue.","triggerScenarios":"SelectReleaseAssets / installRelease runs on a release where the checksums.txt asset was not uploaded, renamed (e.g. 'checksum.txt', 'SHA256SUMS'), or is still uploading (draft release in progress).","commonSituations":"Plugin maintainer's release workflow changed or forgot to attach checksums.txt; asset named differently in a forked plugin; installing from an in-progress/draft release.","solutions":["Check the release page and confirm an asset named exactly 'checksums.txt' exists","If it is named differently, fix the plugin's release workflow to upload checksums.txt","Wait for the release publish to complete before installing","As a last resort for trusted internal use, publish your own fork/release including checksums.txt"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"hasChecksum := false\nfor _, a := range release.Assets {\n    if strings.TrimSpace(a.Name) == \"checksums.txt\" { hasChecksum = true; break }\n}\nif !hasChecksum { return errors.New(\"release missing checksums.txt; refuse install\") }","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"checksums.txt not found\") {\n    // report upstream publishing defect; do not bypass verification\n}","preventionTips":["Automate a release-asset audit in CI: archive per platform + checksums.txt","Never skip checksum verification to work around this error","Track plugin releases you depend on so publishing regressions are caught early"],"tags":["release-assets","checksum","release-workflow","go"],"backgroundTag":null,"analyzedSha":"78f0c4079e3e6273d65d03b5549cffc898703264","analyzedAt":"2026-08-15T12:26:37.444Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}