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

  1. Re-query the plugin store listing for the plugin and copy an exact version string from its Versions array
  2. Retry without ?version to install the plugin's default (top-level) version
  3. Refresh the store source / clear its cache so the index picks up newly published versions
  4. 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

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


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