router-for-me/CLIProxyAPI · error
plugin_manifest_invalid
plugin_manifest_invalid
Error message
direct plugin version %q not found
What it means
Returned by pluginStoreDirectManifest (plugin_store.go:385) with code plugin_manifest_invalid when installing a direct-type plugin whose requested version (after stripping an optional 'v' prefix via normalizePluginStoreRequestedVersion) matches neither the plugin's top-level Version nor any entry in its Versions list. The store's plugin index simply does not know that version.
Source
Thrown at internal/api/handlers/management/plugin_store.go:385
if version == "" {
version = normalizePluginStoreRequestedVersion(plugin.Version)
}
if normalizePluginStoreRequestedVersion(plugin.Version) == version {
plugin.Version = version
return pluginstore.ManifestFromPlugin(source, plugin)
}
for _, candidate := range plugin.Versions {
if normalizePluginStoreRequestedVersion(candidate.Version) != version {
continue
}
plugin.Version = version
plugin.Install = candidate.Install
if strings.TrimSpace(plugin.Install.Type) == "" {
plugin.Install.Type = pluginstore.InstallTypeDirect
}
return pluginstore.ManifestFromPlugin(source, plugin)
}
return pluginstore.Manifest{}, fmt.Errorf("direct plugin version %q not found", version)
}
func installPluginStoreGitHubRelease(ctx context.Context, client pluginstore.Client, plugin pluginstore.Plugin, requestedVersion string, options pluginstore.InstallOptions) (pluginstore.InstallResult, error) {
version := normalizePluginStoreRequestedVersion(requestedVersion)
if version == "" {
return client.Install(ctx, plugin, options)
}
tags := pluginStoreReleaseTagCandidates(requestedVersion)
errs := make([]error, 0, len(tags))
for _, tag := range tags {
result, errInstall := client.InstallVersion(ctx, plugin, tag, version, options)
if errInstall == nil {
return result, nil
}
errs = append(errs, fmt.Errorf("%s: %w", tag, errInstall))
}
return pluginstore.InstallResult{}, fmt.Errorf("install release by tag: %w", errors.Join(errs...))
}View on GitHub (pinned to 78f0c4079e)
Solutions
- Re-query the plugin store listing for the plugin and copy an exact version string from its Versions array
- Retry without ?version to install the plugin's default (top-level) version
- Refresh the store source / clear its cache so the index picks up newly published versions
- Check for typos and prefix conventions: '1.2.3' and 'v1.2.3' normalize to the same value, but '1.2.3-beta' does not match '1.2.3'
Example fix
# before curl -X POST -H "Authorization: Bearer $KEY" \ 'http://127.0.0.1:8000/management/plugin-store/install?plugin_id=foo&version=2.0.0' # after: use a version present in the index curl -H "Authorization: Bearer $KEY" \ 'http://127.0.0.1:8000/management/plugin-store/plugins?plugin_id=foo' # list versions first curl -X POST -H "Authorization: Bearer $KEY" \ 'http://127.0.0.1:8000/management/plugin-store/install?plugin_id=foo&version=1.4.2'
Defensive patterns
Strategy: validation
Validate before calling
// Before installing, confirm the requested version exists in the index.
known := false
norm := func(v string) string { v = strings.TrimSpace(v); return strings.TrimPrefix(strings.ToLower(v), "v") }
if norm(plugin.Version) == norm(requested) {
known = true
}
for _, c := range plugin.Versions {
if norm(c.Version) == norm(requested) {
known = true
break
}
}
if !known {
return fmt.Errorf("version %s not in index; refresh or omit version", requested)
} Prevention
- List available versions from the store before pinning an install
- Refresh the plugin-store index before installing freshly released versions
- Remember 'v1.2.3' and '1.2.3' are equivalent, but any other difference is a mismatch
When it happens
Trigger: POST to the management plugin install endpoint with ?version=2.0.0 when the plugin index only lists 1.x; requesting a version that exists upstream but the configured store source has not re-indexed yet; typos like version=v1,2,3.
Common situations: Stale plugin-store index (source cache not refreshed after a release); pinning to an old version that was removed from the index; using a fork/store URL that carries different version numbers than the official one.
Related errors
- plugin_install_failed
- plugin_manifest_failed
- invalid_request
- plugin store resolved auth token is empty
- plugin store resolved basic auth is incomplete
AI-assisted analysis of router-for-me/CLIProxyAPI@78f0c4079e (2026-08-15).
Data as JSON: /api/errors/064878b477fd0dc2.
Report an issue: GitHub.